VirtualBox

source: vbox/trunk/src/VBox/Frontends/VirtualBox/include/VBoxUtils.h@ 6715

Last change on this file since 6715 was 6715, checked in by vboxsync, 17 years ago

Mac OS X: Changed overlay icon in the bottom right of the dock icon from
the state icons to the 3D VirtualBox logo. If the vm is in pause state the
current pause image is displayed in the screen. Pause/Restore/Save states
are now indicated by an overlay image in the center of the dock icon.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.1 KB
Line 
1/** @file
2 *
3 * VBox frontends: Qt GUI ("VirtualBox"):
4 * Declarations of utility classes and functions
5 */
6
7/*
8 * Copyright (C) 2006-2007 innotek GmbH
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19#ifndef __VBoxUtils_h__
20#define __VBoxUtils_h__
21
22#include <qobject.h>
23#include <qevent.h>
24#include <qlistview.h>
25#include <qtextedit.h>
26#include <qlabel.h>
27#include <qlayout.h>
28
29/**
30 * Simple ListView filter to disable unselecting all items by clicking in the
31 * unused area of the list (which is actually very annoying for the Single
32 * selection mode).
33 */
34class QIListViewSelectionPreserver : protected QObject
35{
36public:
37
38 QIListViewSelectionPreserver (QObject *parent, QListView *alv)
39 : QObject (parent), lv (alv)
40 {
41 lv->viewport()->installEventFilter (this);
42 }
43
44protected:
45
46 bool eventFilter (QObject * /* o */, QEvent *e)
47 {
48 if (e->type() == QEvent::MouseButtonPress ||
49 e->type() == QEvent::MouseButtonRelease ||
50 e->type() == QEvent::MouseButtonDblClick)
51 {
52 QMouseEvent *me = (QMouseEvent *) e;
53 if (!lv->itemAt (me->pos()))
54 return true;
55 }
56
57 return false;
58 }
59
60private:
61
62 QListView *lv;
63};
64
65/**
66 * Simple class that filters out presses and releases of the given key
67 * directed to a widget (the widget acts like if it would never handle
68 * this key).
69 */
70class QIKeyFilter : protected QObject
71{
72public:
73
74 QIKeyFilter (QObject *aParent, Key aKey) : QObject (aParent), mKey (aKey) {}
75
76 void watchOn (QObject *o) { o->installEventFilter (this); }
77
78protected:
79
80 bool eventFilter (QObject * /*o*/, QEvent *e)
81 {
82 if (e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease)
83 {
84 QKeyEvent *ke = (QKeyEvent *) e;
85 if (ke->key() == mKey ||
86 (mKey == Qt::Key_Enter && ke->key() == Qt::Key_Return))
87 {
88 ke->ignore();
89 return false;
90 }
91 }
92
93 return false;
94 }
95
96 Key mKey;
97};
98
99/**
100 * Simple class that filters out all key presses and releases
101 * got while the Alt key is pressed. For some very strange reason,
102 * QLineEdit accepts those combinations that are not used as accelerators,
103 * and inserts the corresponding characters to the entry field.
104 */
105class QIAltKeyFilter : protected QObject
106{
107public:
108
109 QIAltKeyFilter (QObject *aParent) : QObject (aParent) {}
110
111 void watchOn (QObject *o) { o->installEventFilter (this); }
112
113protected:
114
115 bool eventFilter (QObject * /*o*/, QEvent *e)
116 {
117 if (e->type() == QEvent::KeyPress || e->type() == QEvent::KeyRelease)
118 {
119 QKeyEvent *ke = (QKeyEvent *) e;
120 if (ke->state() & Qt::AltButton)
121 return true;
122 }
123 return false;
124 }
125};
126
127/**
128 * Watches the given widget and makes sure the minimum widget size set by the layout
129 * manager does never get smaller than the previous minimum size set by the
130 * layout manager. This way, widgets with dynamic contents (i.e. text on some
131 * toggle buttons) will be able only to grow, never shrink, to avoid flicker
132 * during alternate contents updates (Pause -> Resume -> Pause -> ...).
133 *
134 * @todo not finished
135 */
136class QIConstraintKeeper : public QObject
137{
138 Q_OBJECT
139
140public:
141
142 QIConstraintKeeper (QWidget *aParent) : QObject (aParent)
143 {
144 aParent->setMinimumSize (aParent->size());
145 aParent->installEventFilter (this);
146 }
147
148private:
149
150 bool eventFilter (QObject *aObject, QEvent *aEvent)
151 {
152 if (aObject == parent() && aEvent->type() == QEvent::Resize)
153 {
154 QResizeEvent *ev = static_cast<QResizeEvent*> (aEvent);
155 QSize oldSize = ev->oldSize();
156 QSize newSize = ev->size();
157 int maxWidth = newSize.width() > oldSize.width() ?
158 newSize.width() : oldSize.width();
159 int maxHeight = newSize.height() > oldSize.height() ?
160 newSize.height() : oldSize.height();
161 if (maxWidth > oldSize.width() || maxHeight > oldSize.height())
162 ((QWidget*)parent())->setMinimumSize (maxWidth, maxHeight);
163 }
164 return QObject::eventFilter (aObject, aEvent);
165 }
166};
167
168
169/**
170 * Simple QTextEdit subclass to return its minimumSizeHint() as sizeHint()
171 * for getting more compact layout.
172 */
173class QITextEdit : public QTextEdit
174{
175 Q_OBJECT
176
177public:
178
179 QITextEdit (QWidget *aParent)
180 : QTextEdit (aParent) {}
181
182 QSize sizeHint() const
183 {
184 return minimumSizeHint();
185 }
186
187 QSize minimumSizeHint() const
188 {
189 return QSize (width(), heightForWidth (width()));
190 }
191};
192
193
194/**
195 * Simple QLabel subclass to re-query and return its sizeHint()
196 * before the widget to be shown for getting more compact layout.
197 */
198class QILabel : public QLabel
199{
200 Q_OBJECT
201
202public:
203
204 QILabel (QWidget *aParent, const char *aName)
205 : QLabel (aParent, aName), mShowed (false)
206 {
207 /* setup default size policy and alignment */
208 setSizePolicy (QSizePolicy ((QSizePolicy::SizeType)1,
209 (QSizePolicy::SizeType)0,
210 0, 0,
211 sizePolicy().hasHeightForWidth()));
212 setAlignment (int (QLabel::WordBreak | QLabel::AlignTop));
213 /* install show-parent-widget watcher */
214 aParent->topLevelWidget()->installEventFilter (this);
215 }
216
217 QSize sizeHint() const
218 {
219 return mShowed ?
220 QSize (width(), heightForWidth (width())) : QLabel::sizeHint();
221 }
222
223private:
224
225 bool eventFilter (QObject *aObject, QEvent *aEvent)
226 {
227 switch (aEvent->type())
228 {
229 case QEvent::Show:
230 {
231 mShowed = true;
232 if (parent() && ((QWidget*)parent())->layout())
233 ((QWidget*)parent())->layout()->activate();
234 break;
235 }
236 default:
237 break;
238 }
239 return QLabel::eventFilter (aObject, aEvent);
240 }
241
242 bool mShowed;
243};
244
245
246#ifdef Q_WS_MAC
247# undef PAGE_SIZE
248# undef PAGE_SHIFT
249# include <Carbon/Carbon.h>
250class QImage;
251class QPixmap;
252class VBoxFrameBuffer;
253CGImageRef DarwinQImageToCGImage (const QImage *aImage);
254CGImageRef DarwinQPixmapToCGImage (const QPixmap *aPixmap);
255CGImageRef DarwinQPixmapFromMimeSourceToCGImage (const char *aSource);
256CGImageRef DarwinCreateDockBadge (const char *aSource);
257CGImageRef DarwinCreateDockPreview (CGImageRef aVMImage, CGImageRef aOverlayImage, CGImageRef aStateImage = NULL);
258CGImageRef DarwinCreateDockPreview (VBoxFrameBuffer *aFrameBuffer, CGImageRef aOverlayImage);
259OSStatus DarwinRegionHandler (EventHandlerCallRef aInHandlerCallRef, EventRef aInEvent, void *aInUserData);
260#endif /* Q_WS_MAC */
261
262#endif // __VBoxUtils_h__
263
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette