Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/widgets/kernel/qwhatsthis.cpp |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /**************************************************************************** | - | ||||||||||||||||||||||||
2 | ** | - | ||||||||||||||||||||||||
3 | ** Copyright (C) 2016 The Qt Company Ltd. | - | ||||||||||||||||||||||||
4 | ** Contact: https://www.qt.io/licensing/ | - | ||||||||||||||||||||||||
5 | ** | - | ||||||||||||||||||||||||
6 | ** This file is part of the QtWidgets module of the Qt Toolkit. | - | ||||||||||||||||||||||||
7 | ** | - | ||||||||||||||||||||||||
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - | ||||||||||||||||||||||||
9 | ** Commercial License Usage | - | ||||||||||||||||||||||||
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||||||||||||||||||||
11 | ** accordance with the commercial license agreement provided with the | - | ||||||||||||||||||||||||
12 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||||||||||||||||||||
13 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||||||||||||||||||||
14 | ** and conditions see https://www.qt.io/terms-conditions. For further | - | ||||||||||||||||||||||||
15 | ** information use the contact form at https://www.qt.io/contact-us. | - | ||||||||||||||||||||||||
16 | ** | - | ||||||||||||||||||||||||
17 | ** GNU Lesser General Public License Usage | - | ||||||||||||||||||||||||
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||||||||||||||||||||
19 | ** General Public License version 3 as published by the Free Software | - | ||||||||||||||||||||||||
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the | - | ||||||||||||||||||||||||
21 | ** packaging of this file. Please review the following information to | - | ||||||||||||||||||||||||
22 | ** ensure the GNU Lesser General Public License version 3 requirements | - | ||||||||||||||||||||||||
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. | - | ||||||||||||||||||||||||
24 | ** | - | ||||||||||||||||||||||||
25 | ** GNU General Public License Usage | - | ||||||||||||||||||||||||
26 | ** Alternatively, this file may be used under the terms of the GNU | - | ||||||||||||||||||||||||
27 | ** General Public License version 2.0 or (at your option) the GNU General | - | ||||||||||||||||||||||||
28 | ** Public license version 3 or any later version approved by the KDE Free | - | ||||||||||||||||||||||||
29 | ** Qt Foundation. The licenses are as published by the Free Software | - | ||||||||||||||||||||||||
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 | - | ||||||||||||||||||||||||
31 | ** included in the packaging of this file. Please review the following | - | ||||||||||||||||||||||||
32 | ** information to ensure the GNU General Public License requirements will | - | ||||||||||||||||||||||||
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and | - | ||||||||||||||||||||||||
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. | - | ||||||||||||||||||||||||
35 | ** | - | ||||||||||||||||||||||||
36 | ** $QT_END_LICENSE$ | - | ||||||||||||||||||||||||
37 | ** | - | ||||||||||||||||||||||||
38 | ****************************************************************************/ | - | ||||||||||||||||||||||||
39 | - | |||||||||||||||||||||||||
40 | #include "qwhatsthis.h" | - | ||||||||||||||||||||||||
41 | #ifndef QT_NO_WHATSTHIS | - | ||||||||||||||||||||||||
42 | #include "qpointer.h" | - | ||||||||||||||||||||||||
43 | #include "qapplication.h" | - | ||||||||||||||||||||||||
44 | #include <private/qguiapplication_p.h> | - | ||||||||||||||||||||||||
45 | #include "qdesktopwidget.h" | - | ||||||||||||||||||||||||
46 | #include "qevent.h" | - | ||||||||||||||||||||||||
47 | #include "qpixmap.h" | - | ||||||||||||||||||||||||
48 | #include "qscreen.h" | - | ||||||||||||||||||||||||
49 | #include "qpainter.h" | - | ||||||||||||||||||||||||
50 | #include "qtimer.h" | - | ||||||||||||||||||||||||
51 | #include "qaction.h" | - | ||||||||||||||||||||||||
52 | #include "qcursor.h" | - | ||||||||||||||||||||||||
53 | #include "qbitmap.h" | - | ||||||||||||||||||||||||
54 | #include "qtextdocument.h" | - | ||||||||||||||||||||||||
55 | #include <qpa/qplatformtheme.h> | - | ||||||||||||||||||||||||
56 | #include "private/qtextdocumentlayout_p.h" | - | ||||||||||||||||||||||||
57 | #include "qtoolbutton.h" | - | ||||||||||||||||||||||||
58 | #include "qdebug.h" | - | ||||||||||||||||||||||||
59 | #ifndef QT_NO_ACCESSIBILITY | - | ||||||||||||||||||||||||
60 | #include "qaccessible.h" | - | ||||||||||||||||||||||||
61 | #endif | - | ||||||||||||||||||||||||
62 | - | |||||||||||||||||||||||||
63 | QT_BEGIN_NAMESPACE | - | ||||||||||||||||||||||||
64 | - | |||||||||||||||||||||||||
65 | /*! | - | ||||||||||||||||||||||||
66 | \class QWhatsThis | - | ||||||||||||||||||||||||
67 | \brief The QWhatsThis class provides a simple description of any | - | ||||||||||||||||||||||||
68 | widget, i.e. answering the question "What's This?". | - | ||||||||||||||||||||||||
69 | - | |||||||||||||||||||||||||
70 | \ingroup helpsystem | - | ||||||||||||||||||||||||
71 | \inmodule QtWidgets | - | ||||||||||||||||||||||||
72 | - | |||||||||||||||||||||||||
73 | "What's This?" help is part of an application's online help | - | ||||||||||||||||||||||||
74 | system, and provides users with information about the | - | ||||||||||||||||||||||||
75 | functionality and usage of a particular widget. "What's This?" | - | ||||||||||||||||||||||||
76 | help texts are typically longer and more detailed than | - | ||||||||||||||||||||||||
77 | \l{QToolTip}{tooltips}, but generally provide less information | - | ||||||||||||||||||||||||
78 | than that supplied by separate help windows. | - | ||||||||||||||||||||||||
79 | - | |||||||||||||||||||||||||
80 | QWhatsThis provides a single window with an explanatory text that | - | ||||||||||||||||||||||||
81 | pops up when the user asks "What's This?". The default way for | - | ||||||||||||||||||||||||
82 | users to ask the question is to move the focus to the relevant | - | ||||||||||||||||||||||||
83 | widget and press Shift+F1. The help text appears immediately; it | - | ||||||||||||||||||||||||
84 | goes away as soon as the user does something else. | - | ||||||||||||||||||||||||
85 | (Note that if there is a shortcut for Shift+F1, this mechanism | - | ||||||||||||||||||||||||
86 | will not work.) Some dialogs provide a "?" button that users can | - | ||||||||||||||||||||||||
87 | click to enter "What's This?" mode; they then click the relevant | - | ||||||||||||||||||||||||
88 | widget to pop up the "What's This?" window. It is also possible to | - | ||||||||||||||||||||||||
89 | provide a a menu option or toolbar button to switch into "What's | - | ||||||||||||||||||||||||
90 | This?" mode. | - | ||||||||||||||||||||||||
91 | - | |||||||||||||||||||||||||
92 | To add "What's This?" text to a widget or an action, you simply | - | ||||||||||||||||||||||||
93 | call QWidget::setWhatsThis() or QAction::setWhatsThis(). | - | ||||||||||||||||||||||||
94 | - | |||||||||||||||||||||||||
95 | The text can be either rich text or plain text. If you specify a | - | ||||||||||||||||||||||||
96 | rich text formatted string, it will be rendered using the default | - | ||||||||||||||||||||||||
97 | stylesheet, making it possible to embed images in the displayed | - | ||||||||||||||||||||||||
98 | text. To be as fast as possible, the default stylesheet uses a | - | ||||||||||||||||||||||||
99 | simple method to determine whether the text can be rendered as | - | ||||||||||||||||||||||||
100 | plain text. See Qt::mightBeRichText() for details. | - | ||||||||||||||||||||||||
101 | - | |||||||||||||||||||||||||
102 | \snippet whatsthis/whatsthis.cpp 0 | - | ||||||||||||||||||||||||
103 | - | |||||||||||||||||||||||||
104 | An alternative way to enter "What's This?" mode is to call | - | ||||||||||||||||||||||||
105 | createAction(), and add the returned QAction to either a menu or | - | ||||||||||||||||||||||||
106 | a tool bar. By invoking this context help action (in the picture | - | ||||||||||||||||||||||||
107 | below, the button with the arrow and question mark icon) the user | - | ||||||||||||||||||||||||
108 | switches into "What's This?" mode. If they now click on a widget | - | ||||||||||||||||||||||||
109 | the appropriate help text is shown. The mode is left when help is | - | ||||||||||||||||||||||||
110 | given or when the user presses Esc. | - | ||||||||||||||||||||||||
111 | - | |||||||||||||||||||||||||
112 | \image whatsthis.png | - | ||||||||||||||||||||||||
113 | - | |||||||||||||||||||||||||
114 | You can enter "What's This?" mode programmatically with | - | ||||||||||||||||||||||||
115 | enterWhatsThisMode(), check the mode with inWhatsThisMode(), and | - | ||||||||||||||||||||||||
116 | return to normal mode with leaveWhatsThisMode(). | - | ||||||||||||||||||||||||
117 | - | |||||||||||||||||||||||||
118 | If you want to control the "What's This?" behavior of a widget | - | ||||||||||||||||||||||||
119 | manually see Qt::WA_CustomWhatsThis. | - | ||||||||||||||||||||||||
120 | - | |||||||||||||||||||||||||
121 | It is also possible to show different help texts for different | - | ||||||||||||||||||||||||
122 | regions of a widget, by using a QHelpEvent of type | - | ||||||||||||||||||||||||
123 | QEvent::WhatsThis. Intercept the help event in your widget's | - | ||||||||||||||||||||||||
124 | QWidget::event() function and call QWhatsThis::showText() with the | - | ||||||||||||||||||||||||
125 | text you want to display for the position specified in | - | ||||||||||||||||||||||||
126 | QHelpEvent::pos(). If the text is rich text and the user clicks | - | ||||||||||||||||||||||||
127 | on a link, the widget also receives a QWhatsThisClickedEvent with | - | ||||||||||||||||||||||||
128 | the link's reference as QWhatsThisClickedEvent::href(). If a | - | ||||||||||||||||||||||||
129 | QWhatsThisClickedEvent is handled (i.e. QWidget::event() returns | - | ||||||||||||||||||||||||
130 | true), the help window remains visible. Call | - | ||||||||||||||||||||||||
131 | QWhatsThis::hideText() to hide it explicitly. | - | ||||||||||||||||||||||||
132 | - | |||||||||||||||||||||||||
133 | \sa QToolTip | - | ||||||||||||||||||||||||
134 | */ | - | ||||||||||||||||||||||||
135 | - | |||||||||||||||||||||||||
136 | Q_CORE_EXPORT void qDeleteInEventHandler(QObject *o); | - | ||||||||||||||||||||||||
137 | - | |||||||||||||||||||||||||
138 | class QWhatsThat : public QWidget | - | ||||||||||||||||||||||||
139 | { | - | ||||||||||||||||||||||||
140 | Q_OBJECT | - | ||||||||||||||||||||||||
141 | - | |||||||||||||||||||||||||
142 | public: | - | ||||||||||||||||||||||||
143 | QWhatsThat(const QString& txt, QWidget* parent, QWidget *showTextFor); | - | ||||||||||||||||||||||||
144 | ~QWhatsThat() ; | - | ||||||||||||||||||||||||
145 | - | |||||||||||||||||||||||||
146 | static QWhatsThat *instance; | - | ||||||||||||||||||||||||
147 | - | |||||||||||||||||||||||||
148 | protected: | - | ||||||||||||||||||||||||
149 | void showEvent(QShowEvent *e) Q_DECL_OVERRIDE; | - | ||||||||||||||||||||||||
150 | void mousePressEvent(QMouseEvent*) Q_DECL_OVERRIDE; | - | ||||||||||||||||||||||||
151 | void mouseReleaseEvent(QMouseEvent*) Q_DECL_OVERRIDE; | - | ||||||||||||||||||||||||
152 | void mouseMoveEvent(QMouseEvent*) Q_DECL_OVERRIDE; | - | ||||||||||||||||||||||||
153 | void keyPressEvent(QKeyEvent*) Q_DECL_OVERRIDE; | - | ||||||||||||||||||||||||
154 | void paintEvent(QPaintEvent*) Q_DECL_OVERRIDE; | - | ||||||||||||||||||||||||
155 | - | |||||||||||||||||||||||||
156 | private: | - | ||||||||||||||||||||||||
157 | QPointer<QWidget>widget; | - | ||||||||||||||||||||||||
158 | bool pressed; | - | ||||||||||||||||||||||||
159 | QString text; | - | ||||||||||||||||||||||||
160 | QTextDocument* doc; | - | ||||||||||||||||||||||||
161 | QString anchor; | - | ||||||||||||||||||||||||
162 | QPixmap background; | - | ||||||||||||||||||||||||
163 | }; | - | ||||||||||||||||||||||||
164 | - | |||||||||||||||||||||||||
165 | QWhatsThat *QWhatsThat::instance = 0; | - | ||||||||||||||||||||||||
166 | - | |||||||||||||||||||||||||
167 | // shadowWidth not const, for XP drop-shadow-fu turns it to 0 | - | ||||||||||||||||||||||||
168 | static int shadowWidth = 6; // also used as '5' and '6' and even '8' below | - | ||||||||||||||||||||||||
169 | static const int vMargin = 8; | - | ||||||||||||||||||||||||
170 | static const int hMargin = 12; | - | ||||||||||||||||||||||||
171 | - | |||||||||||||||||||||||||
172 | static inline bool dropShadow() | - | ||||||||||||||||||||||||
173 | { | - | ||||||||||||||||||||||||
174 | if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
| 0 | ||||||||||||||||||||||||
175 | return theme->themeHint(QPlatformTheme::DropShadow).toBool(); never executed: return theme->themeHint(QPlatformTheme::DropShadow).toBool(); | 0 | ||||||||||||||||||||||||
176 | return false; never executed: return false; | 0 | ||||||||||||||||||||||||
177 | } | - | ||||||||||||||||||||||||
178 | - | |||||||||||||||||||||||||
179 | QWhatsThat::QWhatsThat(const QString& txt, QWidget* parent, QWidget *showTextFor) | - | ||||||||||||||||||||||||
180 | : QWidget(parent, Qt::Popup), | - | ||||||||||||||||||||||||
181 | widget(showTextFor), pressed(false), text(txt) | - | ||||||||||||||||||||||||
182 | { | - | ||||||||||||||||||||||||
183 | delete instance; | - | ||||||||||||||||||||||||
184 | instance = this; | - | ||||||||||||||||||||||||
185 | setAttribute(Qt::WA_DeleteOnClose, true); | - | ||||||||||||||||||||||||
186 | setAttribute(Qt::WA_NoSystemBackground, true); | - | ||||||||||||||||||||||||
187 | if (parent)
| 0 | ||||||||||||||||||||||||
188 | setPalette(parent->palette()); never executed: setPalette(parent->palette()); | 0 | ||||||||||||||||||||||||
189 | setMouseTracking(true); | - | ||||||||||||||||||||||||
190 | setFocusPolicy(Qt::StrongFocus); | - | ||||||||||||||||||||||||
191 | #ifndef QT_NO_CURSOR | - | ||||||||||||||||||||||||
192 | setCursor(Qt::ArrowCursor); | - | ||||||||||||||||||||||||
193 | #endif | - | ||||||||||||||||||||||||
194 | QRect r; | - | ||||||||||||||||||||||||
195 | doc = 0; | - | ||||||||||||||||||||||||
196 | ensurePolished(); // Ensures style sheet font before size calc | - | ||||||||||||||||||||||||
197 | if (Qt::mightBeRichText(text)) {
| 0 | ||||||||||||||||||||||||
198 | doc = new QTextDocument(); | - | ||||||||||||||||||||||||
199 | doc->setUndoRedoEnabled(false); | - | ||||||||||||||||||||||||
200 | doc->setDefaultFont(QApplication::font(this)); | - | ||||||||||||||||||||||||
201 | #ifdef QT_NO_TEXTHTMLPARSER | - | ||||||||||||||||||||||||
202 | doc->setPlainText(text); | - | ||||||||||||||||||||||||
203 | #else | - | ||||||||||||||||||||||||
204 | doc->setHtml(text); | - | ||||||||||||||||||||||||
205 | #endif | - | ||||||||||||||||||||||||
206 | doc->setUndoRedoEnabled(false); | - | ||||||||||||||||||||||||
207 | doc->adjustSize(); | - | ||||||||||||||||||||||||
208 | r.setTop(0); | - | ||||||||||||||||||||||||
209 | r.setLeft(0); | - | ||||||||||||||||||||||||
210 | r.setSize(doc->size().toSize()); | - | ||||||||||||||||||||||||
211 | } never executed: end of block | 0 | ||||||||||||||||||||||||
212 | else | - | ||||||||||||||||||||||||
213 | { | - | ||||||||||||||||||||||||
214 | int sw = QApplication::desktop()->width() / 3; | - | ||||||||||||||||||||||||
215 | if (sw < 200)
| 0 | ||||||||||||||||||||||||
216 | sw = 200; never executed: sw = 200; | 0 | ||||||||||||||||||||||||
217 | else if (sw > 300)
| 0 | ||||||||||||||||||||||||
218 | sw = 300; never executed: sw = 300; | 0 | ||||||||||||||||||||||||
219 | - | |||||||||||||||||||||||||
220 | r = fontMetrics().boundingRect(0, 0, sw, 1000, | - | ||||||||||||||||||||||||
221 | Qt::AlignLeft + Qt::AlignTop | - | ||||||||||||||||||||||||
222 | + Qt::TextWordWrap + Qt::TextExpandTabs, | - | ||||||||||||||||||||||||
223 | text); | - | ||||||||||||||||||||||||
224 | } never executed: end of block | 0 | ||||||||||||||||||||||||
225 | shadowWidth = dropShadow() ? 0 : 6;
| 0 | ||||||||||||||||||||||||
226 | resize(r.width() + 2*hMargin + shadowWidth, r.height() + 2*vMargin + shadowWidth); | - | ||||||||||||||||||||||||
227 | } never executed: end of block | 0 | ||||||||||||||||||||||||
228 | - | |||||||||||||||||||||||||
229 | QWhatsThat::~QWhatsThat() | - | ||||||||||||||||||||||||
230 | { | - | ||||||||||||||||||||||||
231 | instance = 0; | - | ||||||||||||||||||||||||
232 | if (doc)
| 0 | ||||||||||||||||||||||||
233 | delete doc; never executed: delete doc; | 0 | ||||||||||||||||||||||||
234 | } never executed: end of block | 0 | ||||||||||||||||||||||||
235 | - | |||||||||||||||||||||||||
236 | void QWhatsThat::showEvent(QShowEvent *) | - | ||||||||||||||||||||||||
237 | { | - | ||||||||||||||||||||||||
238 | background = QGuiApplication::primaryScreen()->grabWindow(QApplication::desktop()->internalWinId(), | - | ||||||||||||||||||||||||
239 | x(), y(), width(), height()); | - | ||||||||||||||||||||||||
240 | } never executed: end of block | 0 | ||||||||||||||||||||||||
241 | - | |||||||||||||||||||||||||
242 | void QWhatsThat::mousePressEvent(QMouseEvent* e) | - | ||||||||||||||||||||||||
243 | { | - | ||||||||||||||||||||||||
244 | pressed = true; | - | ||||||||||||||||||||||||
245 | if (e->button() == Qt::LeftButton && rect().contains(e->pos())) {
| 0 | ||||||||||||||||||||||||
246 | if (doc)
| 0 | ||||||||||||||||||||||||
247 | anchor = doc->documentLayout()->anchorAt(e->pos() - QPoint(hMargin, vMargin)); never executed: anchor = doc->documentLayout()->anchorAt(e->pos() - QPoint(hMargin, vMargin)); | 0 | ||||||||||||||||||||||||
248 | return; never executed: return; | 0 | ||||||||||||||||||||||||
249 | } | - | ||||||||||||||||||||||||
250 | close(); | - | ||||||||||||||||||||||||
251 | } never executed: end of block | 0 | ||||||||||||||||||||||||
252 | - | |||||||||||||||||||||||||
253 | void QWhatsThat::mouseReleaseEvent(QMouseEvent* e) | - | ||||||||||||||||||||||||
254 | { | - | ||||||||||||||||||||||||
255 | if (!pressed)
| 0 | ||||||||||||||||||||||||
256 | return; never executed: return; | 0 | ||||||||||||||||||||||||
257 | if (widget && e->button() == Qt::LeftButton && doc && rect().contains(e->pos())) {
| 0 | ||||||||||||||||||||||||
258 | QString a = doc->documentLayout()->anchorAt(e->pos() - QPoint(hMargin, vMargin)); | - | ||||||||||||||||||||||||
259 | QString href; | - | ||||||||||||||||||||||||
260 | if (anchor == a)
| 0 | ||||||||||||||||||||||||
261 | href = a; never executed: href = a; | 0 | ||||||||||||||||||||||||
262 | anchor.clear(); | - | ||||||||||||||||||||||||
263 | if (!href.isEmpty()) {
| 0 | ||||||||||||||||||||||||
264 | QWhatsThisClickedEvent e(href); | - | ||||||||||||||||||||||||
265 | if (QApplication::sendEvent(widget, &e))
| 0 | ||||||||||||||||||||||||
266 | return; never executed: return; | 0 | ||||||||||||||||||||||||
267 | } never executed: end of block | 0 | ||||||||||||||||||||||||
268 | } never executed: end of block | 0 | ||||||||||||||||||||||||
269 | close(); | - | ||||||||||||||||||||||||
270 | } never executed: end of block | 0 | ||||||||||||||||||||||||
271 | - | |||||||||||||||||||||||||
272 | void QWhatsThat::mouseMoveEvent(QMouseEvent* e) | - | ||||||||||||||||||||||||
273 | { | - | ||||||||||||||||||||||||
274 | #ifdef QT_NO_CURSOR | - | ||||||||||||||||||||||||
275 | Q_UNUSED(e); | - | ||||||||||||||||||||||||
276 | #else | - | ||||||||||||||||||||||||
277 | if (!doc)
| 0 | ||||||||||||||||||||||||
278 | return; never executed: return; | 0 | ||||||||||||||||||||||||
279 | QString a = doc->documentLayout()->anchorAt(e->pos() - QPoint(hMargin, vMargin)); | - | ||||||||||||||||||||||||
280 | if (!a.isEmpty())
| 0 | ||||||||||||||||||||||||
281 | setCursor(Qt::PointingHandCursor); never executed: setCursor(Qt::PointingHandCursor); | 0 | ||||||||||||||||||||||||
282 | else | - | ||||||||||||||||||||||||
283 | setCursor(Qt::ArrowCursor); never executed: setCursor(Qt::ArrowCursor); | 0 | ||||||||||||||||||||||||
284 | #endif | - | ||||||||||||||||||||||||
285 | } | - | ||||||||||||||||||||||||
286 | - | |||||||||||||||||||||||||
287 | void QWhatsThat::keyPressEvent(QKeyEvent*) | - | ||||||||||||||||||||||||
288 | { | - | ||||||||||||||||||||||||
289 | close(); | - | ||||||||||||||||||||||||
290 | } never executed: end of block | 0 | ||||||||||||||||||||||||
291 | - | |||||||||||||||||||||||||
292 | void QWhatsThat::paintEvent(QPaintEvent*) | - | ||||||||||||||||||||||||
293 | { | - | ||||||||||||||||||||||||
294 | const bool drawShadow = dropShadow(); | - | ||||||||||||||||||||||||
295 | - | |||||||||||||||||||||||||
296 | QRect r = rect(); | - | ||||||||||||||||||||||||
297 | r.adjust(0, 0, -1, -1); | - | ||||||||||||||||||||||||
298 | if (drawShadow)
| 0 | ||||||||||||||||||||||||
299 | r.adjust(0, 0, -shadowWidth, -shadowWidth); never executed: r.adjust(0, 0, -shadowWidth, -shadowWidth); | 0 | ||||||||||||||||||||||||
300 | QPainter p(this); | - | ||||||||||||||||||||||||
301 | p.drawPixmap(0, 0, background); | - | ||||||||||||||||||||||||
302 | p.setPen(QPen(palette().toolTipText(), 0)); | - | ||||||||||||||||||||||||
303 | p.setBrush(palette().toolTipBase()); | - | ||||||||||||||||||||||||
304 | p.drawRect(r); | - | ||||||||||||||||||||||||
305 | int w = r.width(); | - | ||||||||||||||||||||||||
306 | int h = r.height(); | - | ||||||||||||||||||||||||
307 | p.setPen(palette().brush(QPalette::Dark).color()); | - | ||||||||||||||||||||||||
308 | p.drawRect(1, 1, w-2, h-2); | - | ||||||||||||||||||||||||
309 | if (drawShadow) {
| 0 | ||||||||||||||||||||||||
310 | p.setPen(palette().shadow().color()); | - | ||||||||||||||||||||||||
311 | p.drawPoint(w + 5, 6); | - | ||||||||||||||||||||||||
312 | p.drawLine(w + 3, 6, w + 5, 8); | - | ||||||||||||||||||||||||
313 | p.drawLine(w + 1, 6, w + 5, 10); | - | ||||||||||||||||||||||||
314 | int i; | - | ||||||||||||||||||||||||
315 | for(i=7; i < h; i += 2)
| 0 | ||||||||||||||||||||||||
316 | p.drawLine(w, i, w + 5, i + 5); never executed: p.drawLine(w, i, w + 5, i + 5); | 0 | ||||||||||||||||||||||||
317 | for(i = w - i + h; i > 6; i -= 2)
| 0 | ||||||||||||||||||||||||
318 | p.drawLine(i, h, i + 5, h + 5); never executed: p.drawLine(i, h, i + 5, h + 5); | 0 | ||||||||||||||||||||||||
319 | for(; i > 0 ; i -= 2)
| 0 | ||||||||||||||||||||||||
320 | p.drawLine(6, h + 6 - i, i + 5, h + 5); never executed: p.drawLine(6, h + 6 - i, i + 5, h + 5); | 0 | ||||||||||||||||||||||||
321 | } never executed: end of block | 0 | ||||||||||||||||||||||||
322 | r.adjust(0, 0, 1, 1); | - | ||||||||||||||||||||||||
323 | p.setPen(palette().toolTipText().color()); | - | ||||||||||||||||||||||||
324 | r.adjust(hMargin, vMargin, -hMargin, -vMargin); | - | ||||||||||||||||||||||||
325 | - | |||||||||||||||||||||||||
326 | if (doc) {
| 0 | ||||||||||||||||||||||||
327 | p.translate(r.x(), r.y()); | - | ||||||||||||||||||||||||
328 | QRect rect = r; | - | ||||||||||||||||||||||||
329 | rect.translate(-r.x(), -r.y()); | - | ||||||||||||||||||||||||
330 | p.setClipRect(rect); | - | ||||||||||||||||||||||||
331 | QAbstractTextDocumentLayout::PaintContext context; | - | ||||||||||||||||||||||||
332 | context.palette.setBrush(QPalette::Text, context.palette.toolTipText()); | - | ||||||||||||||||||||||||
333 | doc->documentLayout()->draw(&p, context); | - | ||||||||||||||||||||||||
334 | } never executed: end of block | 0 | ||||||||||||||||||||||||
335 | else | - | ||||||||||||||||||||||||
336 | { | - | ||||||||||||||||||||||||
337 | p.drawText(r, Qt::AlignLeft + Qt::AlignTop + Qt::TextWordWrap + Qt::TextExpandTabs, text); | - | ||||||||||||||||||||||||
338 | } never executed: end of block | 0 | ||||||||||||||||||||||||
339 | } | - | ||||||||||||||||||||||||
340 | - | |||||||||||||||||||||||||
341 | static const char * const button_image[] = { | - | ||||||||||||||||||||||||
342 | "16 16 3 1", | - | ||||||||||||||||||||||||
343 | " c None", | - | ||||||||||||||||||||||||
344 | "o c #000000", | - | ||||||||||||||||||||||||
345 | "a c #000080", | - | ||||||||||||||||||||||||
346 | "o aaaaa ", | - | ||||||||||||||||||||||||
347 | "oo aaa aaa ", | - | ||||||||||||||||||||||||
348 | "ooo aaa aaa", | - | ||||||||||||||||||||||||
349 | "oooo aa aa", | - | ||||||||||||||||||||||||
350 | "ooooo aa aa", | - | ||||||||||||||||||||||||
351 | "oooooo a aaa", | - | ||||||||||||||||||||||||
352 | "ooooooo aaa ", | - | ||||||||||||||||||||||||
353 | "oooooooo aaa ", | - | ||||||||||||||||||||||||
354 | "ooooooooo aaa ", | - | ||||||||||||||||||||||||
355 | "ooooo aaa ", | - | ||||||||||||||||||||||||
356 | "oo ooo ", | - | ||||||||||||||||||||||||
357 | "o ooo aaa ", | - | ||||||||||||||||||||||||
358 | " ooo aaa ", | - | ||||||||||||||||||||||||
359 | " ooo ", | - | ||||||||||||||||||||||||
360 | " ooo ", | - | ||||||||||||||||||||||||
361 | " ooo "}; | - | ||||||||||||||||||||||||
362 | - | |||||||||||||||||||||||||
363 | class QWhatsThisPrivate : public QObject | - | ||||||||||||||||||||||||
364 | { | - | ||||||||||||||||||||||||
365 | public: | - | ||||||||||||||||||||||||
366 | QWhatsThisPrivate(); | - | ||||||||||||||||||||||||
367 | ~QWhatsThisPrivate(); | - | ||||||||||||||||||||||||
368 | static QWhatsThisPrivate *instance; | - | ||||||||||||||||||||||||
369 | bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE; | - | ||||||||||||||||||||||||
370 | QPointer<QAction> action; | - | ||||||||||||||||||||||||
371 | static void say(QWidget *, const QString &, int x = 0, int y = 0); | - | ||||||||||||||||||||||||
372 | static void notifyToplevels(QEvent *e); | - | ||||||||||||||||||||||||
373 | bool leaveOnMouseRelease; | - | ||||||||||||||||||||||||
374 | }; | - | ||||||||||||||||||||||||
375 | - | |||||||||||||||||||||||||
376 | void QWhatsThisPrivate::notifyToplevels(QEvent *e) | - | ||||||||||||||||||||||||
377 | { | - | ||||||||||||||||||||||||
378 | const QWidgetList toplevels = QApplication::topLevelWidgets(); | - | ||||||||||||||||||||||||
379 | for (auto *w : toplevels) | - | ||||||||||||||||||||||||
380 | QApplication::sendEvent(w, e); never executed: QApplication::sendEvent(w, e); | 0 | ||||||||||||||||||||||||
381 | } never executed: end of block | 0 | ||||||||||||||||||||||||
382 | - | |||||||||||||||||||||||||
383 | QWhatsThisPrivate *QWhatsThisPrivate::instance = 0; | - | ||||||||||||||||||||||||
384 | - | |||||||||||||||||||||||||
385 | QWhatsThisPrivate::QWhatsThisPrivate() | - | ||||||||||||||||||||||||
386 | : leaveOnMouseRelease(false) | - | ||||||||||||||||||||||||
387 | { | - | ||||||||||||||||||||||||
388 | instance = this; | - | ||||||||||||||||||||||||
389 | qApp->installEventFilter(this); | - | ||||||||||||||||||||||||
390 | - | |||||||||||||||||||||||||
391 | QPoint pos = QCursor::pos(); | - | ||||||||||||||||||||||||
392 | if (QWidget *w = QApplication::widgetAt(pos)) {
| 0 | ||||||||||||||||||||||||
393 | QHelpEvent e(QEvent::QueryWhatsThis, w->mapFromGlobal(pos), pos); | - | ||||||||||||||||||||||||
394 | bool sentEvent = QApplication::sendEvent(w, &e); | - | ||||||||||||||||||||||||
395 | #ifdef QT_NO_CURSOR | - | ||||||||||||||||||||||||
396 | Q_UNUSED(sentEvent); | - | ||||||||||||||||||||||||
397 | #else | - | ||||||||||||||||||||||||
398 | QApplication::setOverrideCursor((!sentEvent || !e.isAccepted())? | - | ||||||||||||||||||||||||
399 | Qt::ForbiddenCursor:Qt::WhatsThisCursor); | - | ||||||||||||||||||||||||
400 | } else { never executed: end of block | 0 | ||||||||||||||||||||||||
401 | QApplication::setOverrideCursor(Qt::WhatsThisCursor); | - | ||||||||||||||||||||||||
402 | #endif | - | ||||||||||||||||||||||||
403 | } never executed: end of block | 0 | ||||||||||||||||||||||||
404 | #ifndef QT_NO_ACCESSIBILITY | - | ||||||||||||||||||||||||
405 | QAccessibleEvent event(this, QAccessible::ContextHelpStart); | - | ||||||||||||||||||||||||
406 | QAccessible::updateAccessibility(&event); | - | ||||||||||||||||||||||||
407 | #endif | - | ||||||||||||||||||||||||
408 | } never executed: end of block | 0 | ||||||||||||||||||||||||
409 | - | |||||||||||||||||||||||||
410 | QWhatsThisPrivate::~QWhatsThisPrivate() | - | ||||||||||||||||||||||||
411 | { | - | ||||||||||||||||||||||||
412 | if (action)
| 0 | ||||||||||||||||||||||||
413 | action->setChecked(false); never executed: action->setChecked(false); | 0 | ||||||||||||||||||||||||
414 | #ifndef QT_NO_CURSOR | - | ||||||||||||||||||||||||
415 | QApplication::restoreOverrideCursor(); | - | ||||||||||||||||||||||||
416 | #endif | - | ||||||||||||||||||||||||
417 | #ifndef QT_NO_ACCESSIBILITY | - | ||||||||||||||||||||||||
418 | QAccessibleEvent event(this, QAccessible::ContextHelpEnd); | - | ||||||||||||||||||||||||
419 | QAccessible::updateAccessibility(&event); | - | ||||||||||||||||||||||||
420 | #endif | - | ||||||||||||||||||||||||
421 | instance = 0; | - | ||||||||||||||||||||||||
422 | } never executed: end of block | 0 | ||||||||||||||||||||||||
423 | - | |||||||||||||||||||||||||
424 | bool QWhatsThisPrivate::eventFilter(QObject *o, QEvent *e) | - | ||||||||||||||||||||||||
425 | { | - | ||||||||||||||||||||||||
426 | if (!o->isWidgetType())
| 0 | ||||||||||||||||||||||||
427 | return false; never executed: return false; | 0 | ||||||||||||||||||||||||
428 | QWidget * w = static_cast<QWidget *>(o); | - | ||||||||||||||||||||||||
429 | bool customWhatsThis = w->testAttribute(Qt::WA_CustomWhatsThis); | - | ||||||||||||||||||||||||
430 | switch (e->type()) { | - | ||||||||||||||||||||||||
431 | case QEvent::MouseButtonPress: never executed: case QEvent::MouseButtonPress: | 0 | ||||||||||||||||||||||||
432 | { | - | ||||||||||||||||||||||||
433 | QMouseEvent *me = static_cast<QMouseEvent*>(e); | - | ||||||||||||||||||||||||
434 | if (me->button() == Qt::RightButton || customWhatsThis)
| 0 | ||||||||||||||||||||||||
435 | return false; never executed: return false; | 0 | ||||||||||||||||||||||||
436 | QHelpEvent e(QEvent::WhatsThis, me->pos(), me->globalPos()); | - | ||||||||||||||||||||||||
437 | if (!QApplication::sendEvent(w, &e) || !e.isAccepted())
| 0 | ||||||||||||||||||||||||
438 | leaveOnMouseRelease = true; never executed: leaveOnMouseRelease = true; | 0 | ||||||||||||||||||||||||
439 | - | |||||||||||||||||||||||||
440 | } break; never executed: break; | 0 | ||||||||||||||||||||||||
441 | - | |||||||||||||||||||||||||
442 | case QEvent::MouseMove: never executed: case QEvent::MouseMove: | 0 | ||||||||||||||||||||||||
443 | { | - | ||||||||||||||||||||||||
444 | QMouseEvent *me = static_cast<QMouseEvent*>(e); | - | ||||||||||||||||||||||||
445 | QHelpEvent e(QEvent::QueryWhatsThis, me->pos(), me->globalPos()); | - | ||||||||||||||||||||||||
446 | bool sentEvent = QApplication::sendEvent(w, &e); | - | ||||||||||||||||||||||||
447 | #ifdef QT_NO_CURSOR | - | ||||||||||||||||||||||||
448 | Q_UNUSED(sentEvent); | - | ||||||||||||||||||||||||
449 | #else | - | ||||||||||||||||||||||||
450 | QApplication::changeOverrideCursor((!sentEvent || !e.isAccepted())? | - | ||||||||||||||||||||||||
451 | Qt::ForbiddenCursor:Qt::WhatsThisCursor); | - | ||||||||||||||||||||||||
452 | #endif | - | ||||||||||||||||||||||||
453 | } | - | ||||||||||||||||||||||||
454 | // fall through | - | ||||||||||||||||||||||||
455 | case QEvent::MouseButtonRelease: code before this statement never executed: case QEvent::MouseButtonRelease: never executed: case QEvent::MouseButtonRelease: | 0 | ||||||||||||||||||||||||
456 | case QEvent::MouseButtonDblClick: never executed: case QEvent::MouseButtonDblClick: | 0 | ||||||||||||||||||||||||
457 | if (leaveOnMouseRelease && e->type() == QEvent::MouseButtonRelease)
| 0 | ||||||||||||||||||||||||
458 | QWhatsThis::leaveWhatsThisMode(); never executed: QWhatsThis::leaveWhatsThisMode(); | 0 | ||||||||||||||||||||||||
459 | if (static_cast<QMouseEvent*>(e)->button() == Qt::RightButton || customWhatsThis)
| 0 | ||||||||||||||||||||||||
460 | return false; // ignore RMB release never executed: return false; | 0 | ||||||||||||||||||||||||
461 | break; never executed: break; | 0 | ||||||||||||||||||||||||
462 | case QEvent::KeyPress: never executed: case QEvent::KeyPress: | 0 | ||||||||||||||||||||||||
463 | { | - | ||||||||||||||||||||||||
464 | QKeyEvent* kev = (QKeyEvent*)e; | - | ||||||||||||||||||||||||
465 | - | |||||||||||||||||||||||||
466 | if (kev->matches(QKeySequence::Cancel)) {
| 0 | ||||||||||||||||||||||||
467 | QWhatsThis::leaveWhatsThisMode(); | - | ||||||||||||||||||||||||
468 | return true; never executed: return true; | 0 | ||||||||||||||||||||||||
469 | } else if (customWhatsThis) {
| 0 | ||||||||||||||||||||||||
470 | return false; never executed: return false; | 0 | ||||||||||||||||||||||||
471 | } else if (kev->key() == Qt::Key_Menu ||
| 0 | ||||||||||||||||||||||||
472 | (kev->key() == Qt::Key_F10 &&
| 0 | ||||||||||||||||||||||||
473 | kev->modifiers() == Qt::ShiftModifier)) {
| 0 | ||||||||||||||||||||||||
474 | // we don't react to these keys, they are used for context menus | - | ||||||||||||||||||||||||
475 | return false; never executed: return false; | 0 | ||||||||||||||||||||||||
476 | } else if (kev->key() != Qt::Key_Shift && kev->key() != Qt::Key_Alt // not a modifier key
| 0 | ||||||||||||||||||||||||
477 | && kev->key() != Qt::Key_Control && kev->key() != Qt::Key_Meta) {
| 0 | ||||||||||||||||||||||||
478 | QWhatsThis::leaveWhatsThisMode(); | - | ||||||||||||||||||||||||
479 | } never executed: end of block | 0 | ||||||||||||||||||||||||
480 | } break; never executed: break; | 0 | ||||||||||||||||||||||||
481 | default: never executed: default: | 0 | ||||||||||||||||||||||||
482 | return false; never executed: return false; | 0 | ||||||||||||||||||||||||
483 | } | - | ||||||||||||||||||||||||
484 | return true; never executed: return true; | 0 | ||||||||||||||||||||||||
485 | } | - | ||||||||||||||||||||||||
486 | - | |||||||||||||||||||||||||
487 | class QWhatsThisAction: public QAction | - | ||||||||||||||||||||||||
488 | { | - | ||||||||||||||||||||||||
489 | Q_OBJECT | - | ||||||||||||||||||||||||
490 | - | |||||||||||||||||||||||||
491 | public: | - | ||||||||||||||||||||||||
492 | explicit QWhatsThisAction(QObject* parent = 0); | - | ||||||||||||||||||||||||
493 | - | |||||||||||||||||||||||||
494 | private slots: | - | ||||||||||||||||||||||||
495 | void actionTriggered(); | - | ||||||||||||||||||||||||
496 | }; | - | ||||||||||||||||||||||||
497 | - | |||||||||||||||||||||||||
498 | QWhatsThisAction::QWhatsThisAction(QObject *parent) : QAction(tr("What's This?"), parent) | - | ||||||||||||||||||||||||
499 | { | - | ||||||||||||||||||||||||
500 | #ifndef QT_NO_IMAGEFORMAT_XPM | - | ||||||||||||||||||||||||
501 | QPixmap p(button_image); | - | ||||||||||||||||||||||||
502 | setIcon(p); | - | ||||||||||||||||||||||||
503 | #endif | - | ||||||||||||||||||||||||
504 | setCheckable(true); | - | ||||||||||||||||||||||||
505 | connect(this, SIGNAL(triggered()), this, SLOT(actionTriggered())); | - | ||||||||||||||||||||||||
506 | #ifndef QT_NO_SHORTCUT | - | ||||||||||||||||||||||||
507 | setShortcut(Qt::ShiftModifier + Qt::Key_F1); | - | ||||||||||||||||||||||||
508 | #endif | - | ||||||||||||||||||||||||
509 | } never executed: end of block | 0 | ||||||||||||||||||||||||
510 | - | |||||||||||||||||||||||||
511 | void QWhatsThisAction::actionTriggered() | - | ||||||||||||||||||||||||
512 | { | - | ||||||||||||||||||||||||
513 | if (isChecked()) {
| 0 | ||||||||||||||||||||||||
514 | QWhatsThis::enterWhatsThisMode(); | - | ||||||||||||||||||||||||
515 | QWhatsThisPrivate::instance->action = this; | - | ||||||||||||||||||||||||
516 | } never executed: end of block | 0 | ||||||||||||||||||||||||
517 | } never executed: end of block | 0 | ||||||||||||||||||||||||
518 | - | |||||||||||||||||||||||||
519 | /*! | - | ||||||||||||||||||||||||
520 | This function switches the user interface into "What's This?" | - | ||||||||||||||||||||||||
521 | mode. The user interface can be switched back into normal mode by | - | ||||||||||||||||||||||||
522 | the user (e.g. by them clicking or pressing Esc), or | - | ||||||||||||||||||||||||
523 | programmatically by calling leaveWhatsThisMode(). | - | ||||||||||||||||||||||||
524 | - | |||||||||||||||||||||||||
525 | When entering "What's This?" mode, a QEvent of type | - | ||||||||||||||||||||||||
526 | Qt::EnterWhatsThisMode is sent to all toplevel widgets. | - | ||||||||||||||||||||||||
527 | - | |||||||||||||||||||||||||
528 | \sa inWhatsThisMode(), leaveWhatsThisMode() | - | ||||||||||||||||||||||||
529 | */ | - | ||||||||||||||||||||||||
530 | void QWhatsThis::enterWhatsThisMode() | - | ||||||||||||||||||||||||
531 | { | - | ||||||||||||||||||||||||
532 | if (QWhatsThisPrivate::instance)
| 0 | ||||||||||||||||||||||||
533 | return; never executed: return; | 0 | ||||||||||||||||||||||||
534 | (void) new QWhatsThisPrivate; | - | ||||||||||||||||||||||||
535 | QEvent e(QEvent::EnterWhatsThisMode); | - | ||||||||||||||||||||||||
536 | QWhatsThisPrivate::notifyToplevels(&e); | - | ||||||||||||||||||||||||
537 | } never executed: end of block | 0 | ||||||||||||||||||||||||
538 | - | |||||||||||||||||||||||||
539 | /*! | - | ||||||||||||||||||||||||
540 | Returns \c true if the user interface is in "What's This?" mode; | - | ||||||||||||||||||||||||
541 | otherwise returns \c false. | - | ||||||||||||||||||||||||
542 | - | |||||||||||||||||||||||||
543 | \sa enterWhatsThisMode() | - | ||||||||||||||||||||||||
544 | */ | - | ||||||||||||||||||||||||
545 | bool QWhatsThis::inWhatsThisMode() | - | ||||||||||||||||||||||||
546 | { | - | ||||||||||||||||||||||||
547 | return (QWhatsThisPrivate::instance != 0); never executed: return (QWhatsThisPrivate::instance != 0); | 0 | ||||||||||||||||||||||||
548 | } | - | ||||||||||||||||||||||||
549 | - | |||||||||||||||||||||||||
550 | /*! | - | ||||||||||||||||||||||||
551 | If the user interface is in "What's This?" mode, this function | - | ||||||||||||||||||||||||
552 | switches back to normal mode; otherwise it does nothing. | - | ||||||||||||||||||||||||
553 | - | |||||||||||||||||||||||||
554 | When leaving "What's This?" mode, a QEvent of type | - | ||||||||||||||||||||||||
555 | Qt::LeaveWhatsThisMode is sent to all toplevel widgets. | - | ||||||||||||||||||||||||
556 | - | |||||||||||||||||||||||||
557 | \sa enterWhatsThisMode(), inWhatsThisMode() | - | ||||||||||||||||||||||||
558 | */ | - | ||||||||||||||||||||||||
559 | void QWhatsThis::leaveWhatsThisMode() | - | ||||||||||||||||||||||||
560 | { | - | ||||||||||||||||||||||||
561 | delete QWhatsThisPrivate::instance; | - | ||||||||||||||||||||||||
562 | QEvent e(QEvent::LeaveWhatsThisMode); | - | ||||||||||||||||||||||||
563 | QWhatsThisPrivate::notifyToplevels(&e); | - | ||||||||||||||||||||||||
564 | } never executed: end of block | 0 | ||||||||||||||||||||||||
565 | - | |||||||||||||||||||||||||
566 | void QWhatsThisPrivate::say(QWidget * widget, const QString &text, int x, int y) | - | ||||||||||||||||||||||||
567 | { | - | ||||||||||||||||||||||||
568 | if (text.size() == 0)
| 0 | ||||||||||||||||||||||||
569 | return; never executed: return; | 0 | ||||||||||||||||||||||||
570 | // make a fresh widget, and set it up | - | ||||||||||||||||||||||||
571 | QWhatsThat *whatsThat = new QWhatsThat( | - | ||||||||||||||||||||||||
572 | text, | - | ||||||||||||||||||||||||
573 | #if defined(Q_DEAD_CODE_FROM_QT4_X11) && !defined(QT_NO_CURSOR) | - | ||||||||||||||||||||||||
574 | QApplication::desktop()->screen(widget ? widget->x11Info().screen() : QCursor::x11Screen()), | - | ||||||||||||||||||||||||
575 | #else | - | ||||||||||||||||||||||||
576 | 0, | - | ||||||||||||||||||||||||
577 | #endif | - | ||||||||||||||||||||||||
578 | widget | - | ||||||||||||||||||||||||
579 | ); | - | ||||||||||||||||||||||||
580 | - | |||||||||||||||||||||||||
581 | - | |||||||||||||||||||||||||
582 | // okay, now to find a suitable location | - | ||||||||||||||||||||||||
583 | - | |||||||||||||||||||||||||
584 | int scr = (widget ?
| 0 | ||||||||||||||||||||||||
585 | QApplication::desktop()->screenNumber(widget) : | - | ||||||||||||||||||||||||
586 | #if defined(Q_DEAD_CODE_FROM_QT4_X11) && !defined(QT_NO_CURSOR) | - | ||||||||||||||||||||||||
587 | QCursor::x11Screen() | - | ||||||||||||||||||||||||
588 | #else | - | ||||||||||||||||||||||||
589 | QApplication::desktop()->screenNumber(QPoint(x,y)) | - | ||||||||||||||||||||||||
590 | #endif // Q_DEAD_CODE_FROM_QT4_X11 | - | ||||||||||||||||||||||||
591 | ); | - | ||||||||||||||||||||||||
592 | QRect screen = QApplication::desktop()->screenGeometry(scr); | - | ||||||||||||||||||||||||
593 | - | |||||||||||||||||||||||||
594 | int w = whatsThat->width(); | - | ||||||||||||||||||||||||
595 | int h = whatsThat->height(); | - | ||||||||||||||||||||||||
596 | int sx = screen.x(); | - | ||||||||||||||||||||||||
597 | int sy = screen.y(); | - | ||||||||||||||||||||||||
598 | - | |||||||||||||||||||||||||
599 | // first try locating the widget immediately above/below, | - | ||||||||||||||||||||||||
600 | // with nice alignment if possible. | - | ||||||||||||||||||||||||
601 | QPoint pos; | - | ||||||||||||||||||||||||
602 | if (widget)
| 0 | ||||||||||||||||||||||||
603 | pos = widget->mapToGlobal(QPoint(0,0)); never executed: pos = widget->mapToGlobal(QPoint(0,0)); | 0 | ||||||||||||||||||||||||
604 | - | |||||||||||||||||||||||||
605 | if (widget && w > widget->width() + 16)
| 0 | ||||||||||||||||||||||||
606 | x = pos.x() + widget->width()/2 - w/2; never executed: x = pos.x() + widget->width()/2 - w/2; | 0 | ||||||||||||||||||||||||
607 | else | - | ||||||||||||||||||||||||
608 | x = x - w/2; never executed: x = x - w/2; | 0 | ||||||||||||||||||||||||
609 | - | |||||||||||||||||||||||||
610 | // squeeze it in if that would result in part of what's this | - | ||||||||||||||||||||||||
611 | // being only partially visible | - | ||||||||||||||||||||||||
612 | if (x + w + shadowWidth > sx+screen.width())
| 0 | ||||||||||||||||||||||||
613 | x = (widget? (qMin(screen.width(), never executed: x = (widget? (qMin(screen.width(), pos.x() + widget->width()) ) : screen.width()) - w;
| 0 | ||||||||||||||||||||||||
614 | pos.x() + widget->width()) never executed: x = (widget? (qMin(screen.width(), pos.x() + widget->width()) ) : screen.width()) - w; | 0 | ||||||||||||||||||||||||
615 | ) : screen.width()) never executed: x = (widget? (qMin(screen.width(), pos.x() + widget->width()) ) : screen.width()) - w; | 0 | ||||||||||||||||||||||||
616 | - w; never executed: x = (widget? (qMin(screen.width(), pos.x() + widget->width()) ) : screen.width()) - w; | 0 | ||||||||||||||||||||||||
617 | - | |||||||||||||||||||||||||
618 | if (x < sx)
| 0 | ||||||||||||||||||||||||
619 | x = sx; never executed: x = sx; | 0 | ||||||||||||||||||||||||
620 | - | |||||||||||||||||||||||||
621 | if (widget && h > widget->height() + 16) {
| 0 | ||||||||||||||||||||||||
622 | y = pos.y() + widget->height() + 2; // below, two pixels spacing | - | ||||||||||||||||||||||||
623 | // what's this is above or below, wherever there's most space | - | ||||||||||||||||||||||||
624 | if (y + h + 10 > sy+screen.height())
| 0 | ||||||||||||||||||||||||
625 | y = pos.y() + 2 - shadowWidth - h; // above, overlap never executed: y = pos.y() + 2 - shadowWidth - h; | 0 | ||||||||||||||||||||||||
626 | } never executed: end of block | 0 | ||||||||||||||||||||||||
627 | y = y + 2; | - | ||||||||||||||||||||||||
628 | - | |||||||||||||||||||||||||
629 | // squeeze it in if that would result in part of what's this | - | ||||||||||||||||||||||||
630 | // being only partially visible | - | ||||||||||||||||||||||||
631 | if (y + h + shadowWidth > sy+screen.height())
| 0 | ||||||||||||||||||||||||
632 | y = (widget ? (qMin(screen.height(), never executed: y = (widget ? (qMin(screen.height(), pos.y() + widget->height()) ) : screen.height()) - h;
| 0 | ||||||||||||||||||||||||
633 | pos.y() + widget->height()) never executed: y = (widget ? (qMin(screen.height(), pos.y() + widget->height()) ) : screen.height()) - h; | 0 | ||||||||||||||||||||||||
634 | ) : screen.height()) never executed: y = (widget ? (qMin(screen.height(), pos.y() + widget->height()) ) : screen.height()) - h; | 0 | ||||||||||||||||||||||||
635 | - h; never executed: y = (widget ? (qMin(screen.height(), pos.y() + widget->height()) ) : screen.height()) - h; | 0 | ||||||||||||||||||||||||
636 | if (y < sy)
| 0 | ||||||||||||||||||||||||
637 | y = sy; never executed: y = sy; | 0 | ||||||||||||||||||||||||
638 | - | |||||||||||||||||||||||||
639 | whatsThat->move(x, y); | - | ||||||||||||||||||||||||
640 | whatsThat->show(); | - | ||||||||||||||||||||||||
641 | whatsThat->grabKeyboard(); | - | ||||||||||||||||||||||||
642 | } never executed: end of block | 0 | ||||||||||||||||||||||||
643 | - | |||||||||||||||||||||||||
644 | /*! | - | ||||||||||||||||||||||||
645 | Shows \a text as a "What's This?" window, at global position \a | - | ||||||||||||||||||||||||
646 | pos. The optional widget argument, \a w, is used to determine the | - | ||||||||||||||||||||||||
647 | appropriate screen on multi-head systems. | - | ||||||||||||||||||||||||
648 | - | |||||||||||||||||||||||||
649 | \sa hideText() | - | ||||||||||||||||||||||||
650 | */ | - | ||||||||||||||||||||||||
651 | void QWhatsThis::showText(const QPoint &pos, const QString &text, QWidget *w) | - | ||||||||||||||||||||||||
652 | { | - | ||||||||||||||||||||||||
653 | leaveWhatsThisMode(); | - | ||||||||||||||||||||||||
654 | QWhatsThisPrivate::say(w, text, pos.x(), pos.y()); | - | ||||||||||||||||||||||||
655 | } never executed: end of block | 0 | ||||||||||||||||||||||||
656 | - | |||||||||||||||||||||||||
657 | /*! | - | ||||||||||||||||||||||||
658 | If a "What's This?" window is showing, this destroys it. | - | ||||||||||||||||||||||||
659 | - | |||||||||||||||||||||||||
660 | \sa showText() | - | ||||||||||||||||||||||||
661 | */ | - | ||||||||||||||||||||||||
662 | void QWhatsThis::hideText() | - | ||||||||||||||||||||||||
663 | { | - | ||||||||||||||||||||||||
664 | qDeleteInEventHandler(QWhatsThat::instance); | - | ||||||||||||||||||||||||
665 | } never executed: end of block | 0 | ||||||||||||||||||||||||
666 | - | |||||||||||||||||||||||||
667 | /*! | - | ||||||||||||||||||||||||
668 | Returns a ready-made QAction, used to invoke "What's This?" context | - | ||||||||||||||||||||||||
669 | help, with the given \a parent. | - | ||||||||||||||||||||||||
670 | - | |||||||||||||||||||||||||
671 | The returned QAction provides a convenient way to let users enter | - | ||||||||||||||||||||||||
672 | "What's This?" mode. | - | ||||||||||||||||||||||||
673 | */ | - | ||||||||||||||||||||||||
674 | QAction *QWhatsThis::createAction(QObject *parent) | - | ||||||||||||||||||||||||
675 | { | - | ||||||||||||||||||||||||
676 | return new QWhatsThisAction(parent); never executed: return new QWhatsThisAction(parent); | 0 | ||||||||||||||||||||||||
677 | } | - | ||||||||||||||||||||||||
678 | - | |||||||||||||||||||||||||
679 | QT_END_NAMESPACE | - | ||||||||||||||||||||||||
680 | - | |||||||||||||||||||||||||
681 | #include "qwhatsthis.moc" | - | ||||||||||||||||||||||||
682 | - | |||||||||||||||||||||||||
683 | #endif // QT_NO_WHATSTHIS | - | ||||||||||||||||||||||||
Source code | Switch to Preprocessed file |