VirtualBox

source: vbox/trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineMenuBar.cpp@ 34158

Last change on this file since 34158 was 34158, checked in by vboxsync, 14 years ago

FE/Qt4: make menu handling work in newer Qt versions

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.2 KB
Line 
1/* $Id: UIMachineMenuBar.cpp 34158 2010-11-18 09:56:36Z vboxsync $ */
2/** @file
3 *
4 * VBox frontends: Qt GUI ("VirtualBox"):
5 * UIMachineMenuBar class implementation
6 */
7
8/*
9 * Copyright (C) 2010 Oracle Corporation
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License (GPL) as published by the Free Software
15 * Foundation, in version 2 as it comes in the "COPYING" file of the
16 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18 */
19
20/* Local includes */
21#include "UIMachineMenuBar.h"
22#include "UISession.h"
23#include "UIActionsPool.h"
24#include "VBoxGlobal.h"
25#include "VBoxProblemReporter.h"
26#include "UIExtraDataEventHandler.h"
27
28/* Global includes */
29#include <QMenuBar>
30
31/* Helper QMenu reimplementation which allows
32 * to highlight first menu item for popped up menu: */
33class UIMenu : public QMenu
34{
35 Q_OBJECT;
36
37public:
38
39 UIMenu() : QMenu(0) {}
40
41private slots:
42
43 void sltSelectFirstAction()
44 {
45#ifdef Q_WS_WIN
46 activateWindow();
47#endif
48 QMenu::focusNextChild();
49 }
50};
51
52UIMachineMenuBar::UIMachineMenuBar()
53 /* On the Mac we add some items only the first time, cause otherwise they
54 * will be merged more than once to the application menu by Qt. */
55 : m_fIsFirstTime(true)
56{
57}
58
59QMenu* UIMachineMenuBar::createMenu(UIActionsPool *pActionsPool, UIMainMenuType fOptions /* = UIMainMenuType_All */)
60{
61 /* Create empty menu: */
62 QMenu *pMenu = new UIMenu;
63
64 /* Fill menu with prepared items: */
65 foreach (QMenu *pSubMenu, prepareSubMenus(pActionsPool, fOptions))
66 pMenu->addMenu(pSubMenu);
67
68 /* Return filled menu: */
69 return pMenu;
70}
71
72QMenuBar* UIMachineMenuBar::createMenuBar(UIActionsPool *pActionsPool, UIMainMenuType fOptions /* = UIMainMenuType_All */)
73{
74 /* Create empty menubar: */
75 QMenuBar *pMenuBar = new QMenuBar;
76
77 /* Fill menubar with prepared items: */
78 foreach (QMenu *pSubMenu, prepareSubMenus(pActionsPool, fOptions))
79 pMenuBar->addMenu(pSubMenu);
80
81 /* Return filled menubar: */
82 return pMenuBar;
83}
84
85QList<QMenu*> UIMachineMenuBar::prepareSubMenus(UIActionsPool *pActionsPool, UIMainMenuType fOptions /* = UIMainMenuType_All */)
86{
87 /* Create empty submenu list: */
88 QList<QMenu*> preparedSubMenus;
89
90 /* Machine submenu: */
91 if (fOptions & UIMainMenuType_Machine)
92 {
93 QMenu *pMenuMachine = pActionsPool->action(UIActionIndex_Menu_Machine)->menu();
94 prepareMenuMachine(pMenuMachine, pActionsPool);
95 preparedSubMenus << pMenuMachine;
96 }
97
98 /* View submenu: */
99 if (fOptions & UIMainMenuType_View)
100 {
101 QMenu *pMenuView = pActionsPool->action(UIActionIndex_Menu_View)->menu();
102 preparedSubMenus << pMenuView;
103 }
104
105 /* Devices submenu: */
106 if (fOptions & UIMainMenuType_Devices)
107 {
108 QMenu *pMenuDevices = pActionsPool->action(UIActionIndex_Menu_Devices)->menu();
109 prepareMenuDevices(pMenuDevices, pActionsPool);
110 preparedSubMenus << pMenuDevices;
111 }
112
113#ifdef VBOX_WITH_DEBUGGER_GUI
114 /* Debug submenu: */
115 if (fOptions & UIMainMenuType_Debug)
116 {
117 CMachine machine; /** @todo we should try get the machine here. But we'll
118 * probably be fine with the cached values. */
119 if (vboxGlobal().isDebuggerEnabled(machine))
120 {
121 QMenu *pMenuDebug = pActionsPool->action(UIActionIndex_Menu_Debug)->menu();
122 prepareMenuDebug(pMenuDebug, pActionsPool);
123 preparedSubMenus << pMenuDebug;
124 }
125 }
126#endif
127
128 /* Help submenu: */
129 if (fOptions & UIMainMenuType_Help)
130 {
131 QMenu *pMenuHelp = pActionsPool->action(UIActionIndex_Menu_Help)->menu();
132 prepareMenuHelp(pMenuHelp, pActionsPool);
133 preparedSubMenus << pMenuHelp;
134 }
135
136 /* Return a list of prepared submenus: */
137 return preparedSubMenus;
138}
139
140void UIMachineMenuBar::prepareMenuMachine(QMenu *pMenu, UIActionsPool *pActionsPool)
141{
142 /* Do not prepare if ready: */
143 if (!pMenu->isEmpty())
144 return;
145
146 /* Machine submenu: */
147 pMenu->addAction(pActionsPool->action(UIActionIndex_Toggle_Fullscreen));
148 pMenu->addAction(pActionsPool->action(UIActionIndex_Toggle_Seamless));
149 pMenu->addAction(pActionsPool->action(UIActionIndex_Toggle_Scale));
150 pMenu->addAction(pActionsPool->action(UIActionIndex_Toggle_GuestAutoresize));
151 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_AdjustWindow));
152 pMenu->addSeparator();
153 pMenu->addAction(pActionsPool->action(UIActionIndex_Toggle_MouseIntegration));
154 pMenu->addSeparator();
155 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_TypeCAD));
156#ifdef Q_WS_X11
157 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_TypeCABS));
158#endif
159 pMenu->addSeparator();
160 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_TakeSnapshot));
161 pMenu->addSeparator();
162 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_InformationDialog));
163 pMenu->addSeparator();
164 pMenu->addAction(pActionsPool->action(UIActionIndex_Toggle_Pause));
165 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_Reset));
166 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_Shutdown));
167#ifndef Q_WS_MAC
168 pMenu->addSeparator();
169#endif /* !Q_WS_MAC */
170 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_Close));
171}
172
173void UIMachineMenuBar::prepareMenuDevices(QMenu *pMenu, UIActionsPool *pActionsPool)
174{
175 /* Do not prepare if ready: */
176 if (!pMenu->isEmpty())
177 return;
178
179 /* Devices submenu: */
180 pMenu->addMenu(pActionsPool->action(UIActionIndex_Menu_OpticalDevices)->menu());
181 pMenu->addMenu(pActionsPool->action(UIActionIndex_Menu_FloppyDevices)->menu());
182 pMenu->addMenu(pActionsPool->action(UIActionIndex_Menu_USBDevices)->menu());
183 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_NetworkAdaptersDialog));
184 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_SharedFoldersDialog));
185 pMenu->addSeparator();
186 pMenu->addAction(pActionsPool->action(UIActionIndex_Toggle_VRDEServer));
187 pMenu->addSeparator();
188 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_InstallGuestTools));
189}
190
191#ifdef VBOX_WITH_DEBUGGER_GUI
192void UIMachineMenuBar::prepareMenuDebug(QMenu *pMenu, UIActionsPool *pActionsPool)
193{
194 /* Do not prepare if ready: */
195 if (!pMenu->isEmpty())
196 return;
197
198 /* Debug submenu: */
199 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_Statistics));
200 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_CommandLine));
201 pMenu->addAction(pActionsPool->action(UIActionIndex_Toggle_Logging));
202}
203#endif /* VBOX_WITH_DEBUGGER_GUI */
204
205void UIMachineMenuBar::prepareMenuHelp(QMenu *pMenu, UIActionsPool *pActionsPool)
206{
207 /* Do not prepare if ready: */
208 if (!pMenu->isEmpty())
209 return;
210
211 /* Help submenu: */
212 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_Help));
213 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_Web));
214 pMenu->addSeparator();
215 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_ResetWarnings));
216 pMenu->addSeparator();
217
218#ifdef VBOX_WITH_REGISTRATION
219 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_Register));
220#endif
221
222#if defined(Q_WS_MAC) && (QT_VERSION < 0x040700)
223 if (m_fIsFirstTime)
224# endif
225 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_Update));
226#ifndef Q_WS_MAC
227 pMenu->addSeparator();
228#endif /* !Q_WS_MAC */
229#if defined(Q_WS_MAC) && (QT_VERSION < 0x040700)
230 if (m_fIsFirstTime)
231# endif
232 pMenu->addAction(pActionsPool->action(UIActionIndex_Simple_About));
233
234
235#if defined(Q_WS_MAC) && (QT_VERSION < 0x040700)
236 /* Because this connections are done to VBoxGlobal, they are needed once only.
237 * Otherwise we will get the slots called more than once. */
238 if (m_fIsFirstTime)
239 {
240#endif
241 VBoxGlobal::connect(pActionsPool->action(UIActionIndex_Simple_About), SIGNAL(triggered()),
242 &vboxProblem(), SLOT(showHelpAboutDialog()));
243 VBoxGlobal::connect(pActionsPool->action(UIActionIndex_Simple_Update), SIGNAL(triggered()),
244 &vboxGlobal(), SLOT(showUpdateDialog()));
245#if defined(Q_WS_MAC) && (QT_VERSION < 0x040700)
246 }
247#endif
248
249 VBoxGlobal::connect(pActionsPool->action(UIActionIndex_Simple_Help), SIGNAL(triggered()),
250 &vboxProblem(), SLOT(showHelpHelpDialog()));
251 VBoxGlobal::connect(pActionsPool->action(UIActionIndex_Simple_Web), SIGNAL(triggered()),
252 &vboxProblem(), SLOT(showHelpWebDialog()));
253 VBoxGlobal::connect(pActionsPool->action(UIActionIndex_Simple_ResetWarnings), SIGNAL(triggered()),
254 &vboxProblem(), SLOT(resetSuppressedMessages()));
255#ifdef VBOX_WITH_REGISTRATION
256 VBoxGlobal::connect(pActionsPool->action(UIActionIndex_Simple_Register), SIGNAL(triggered()),
257 &vboxGlobal(), SLOT(showRegistrationDialog()));
258 VBoxGlobal::connect(gEDataEvents, SIGNAL(sigCanShowRegistrationDlg(bool)),
259 pActionsPool->action(UIActionIndex_Simple_Register), SLOT(setEnabled(bool)));
260#endif /* VBOX_WITH_REGISTRATION */
261
262 m_fIsFirstTime = false;
263}
264
265#include "UIMachineMenuBar.moc"
266
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use