src/UserInterface/Views/WeeklyViewWidget.h \
src/UserInterface/Views/MeetingInfoDialog.h \
src/UserInterface/Views/SettingsView.h \
- src/UserInterface/WindowManager.h
+ src/UserInterface/WindowManager.h \
+ src/UserInterface/Views/ViewBase.h
- SOURCES += src/UserInterface/Utils/ProgressBar.cpp \
+ SOURCES += src/IO/DeviceControl/OperationModeToggler.cpp \
+ src/UserInterface/Utils/ProgressBar.cpp \
src/Domain/Room.cpp \
src/Domain/Meeting.cpp \
src/Domain/Configuration/ConnectionSettings.cpp \
{
qDebug() << "Engine::ErrorHandler, aCode: " << aCode;
// inform UI about the problem
- if( aCode >= 100 && aCode <= 110 )
+ if( aCode >= 100 && aCode <= 150 )
qDebug() << "CommunicationManager signaled an error:" << aCode;
- // iWindowManager->error( ErrorMapper::codeToString( aCode, aAddInfo ) );
- iWindowManager->closeProgressBar();
- iWindowManager->error( ErrorMapper::codeToString( aCode, aAddInfo ) );
++ // iWindowManager->closeProgressBar();
++ // iWindowManager->error( ErrorMapper::codeToString( aCode, aAddInfo ) );
}
void Engine::currentRoomChanged( Room *aCurrentRoom )
{
case PasswordDialog::Correct :
{
- iWindowManager->showProgressBar( "Changing current operation mode.", true );
- connect( iWindowManager, SIGNAL( progressBarCancelled() ), this, SLOT( progressBarCancelled() ) );
- connect( iDevice, SIGNAL( changingMode( const QString & ) ),
- iWindowManager, SLOT( updateProgressBar( const QString & ) ) );
+// iWindowManager->showProgressBar( "Changing current operation mode." );
+// connect( iWindowManager, SIGNAL( progressBarCancelled() ), this, SLOT( progressBarCancelled() ) );
+// connect( iDevice, SIGNAL( changingMode( const QString & ) ),
+// iWindowManager, SLOT( updateProgressBar( const QString & ) ) );
++ // TODO : Connect the signal directory to progress bar dialog which should be instance in engine
++// connect( iDevice, SIGNAL( changingMode( const QString & ) ),
++// iWindowManager, SLOT( updateProgressBar( const QString & ) ) );
+ connect( iDevice, SIGNAL( changingModeFailed() ), this, SLOT( progressBarCancelled() ) );
iDevice->changeMode( true );
break;
}
iDevice->changeMode( false );
}
+void Engine::initUserInterface()
+{
+ qDebug() << "[Engine::initUserInterface] <Invoked>";
+ // Initialize the window manager and connect what ever signals can be connected
+ iWindowManager = new WindowManager;
+ connect( iWindowManager, SIGNAL( eventDetected() ), this, SLOT( handleViewEvent() ) );
+ connect( iWindowManager, SIGNAL( previousViewRestored() ), this, SLOT( previousViewRestored() ) );
+ connect( iWindowManager, SIGNAL( dialogActivated() ), this, SLOT( dialogActivated() ) );
+ connect( iWindowManager, SIGNAL( dialogDeactivated() ), this, SLOT( dialogDeactivated() ) );
+
+ // Initialize the weekly view and connect what ever signals can be connected at this stage
+ iWeeklyView = new WeeklyViewWidget(QDateTime::currentDateTime(), iConfiguration);
+ connect( iWeeklyView, SIGNAL( settingsButtonClicked() ), this, SLOT( settingsViewRequested() ) );
+ connect( iWeeklyView, SIGNAL( currentRoomChange( Room * ) ) , this, SLOT( currentRoomChange( Room * ) ) );
+ connect( iWeeklyView, SIGNAL( meetingActivated( Meeting * ) ), this, SLOT( fetchMeetingDetails( Meeting * ) ) ) ;
+ connect( iWeeklyView, SIGNAL( shownWeekChanged( QDate ) ) , this, SLOT( shownWeekChanged( QDate ) ) );
+
+ // Initialize the settings view
+ iSettingsView = new SettingsView;
+ connect( iSettingsView, SIGNAL( okClicked() ) , this, SLOT( settingsOkClicked() ) );
+
+ // Initialize the room status indicator
+ iRoomStatusIndicator = new RoomStatusIndicatorWidget( defaultRoom(), Room::FreeStatus, QTime::currentTime(), iConfiguration->displaySettings()->dateFormat() );
+
+ // Create password dialog
+ iPasswordDialog = new PasswordDialog( iConfiguration->adminPassword(), tr("No Text Set"), tr("Title") );
+ connect( iPasswordDialog, SIGNAL( passwordEntered( PasswordDialog::PasswordStatus ) ), this, SLOT( passwordEntered( PasswordDialog::PasswordStatus ) ) );
+
+ // Show the UI
+ iWindowManager->setWindowState( Qt::WindowMaximized );
+ iWindowManager->show();
+ iWindowManager->showView( iWeeklyView );
+
+ qDebug() << "[Engine::initUserInterface] <Finished>";
+}
+
+void Engine::settingsViewRequested()
+{
+ if ( iSettingsView != 0 )
+ {
+ iWindowManager->showView( static_cast<ViewBase *>( iSettingsView ) );
+ // Room status indicator will not be shown when settings view is active
+ iIdleTimeCounter->stop();
+ }
+}
+
+void Engine::handleViewEvent()
+{
+ qDebug() << "[Engine::handleViewEvent] <Invoked>";
+ if ( iIdleTimeCounter != 0 )
+ {
+ // Restart the idle time counter when view event is received
+ iIdleTimeCounter->stop();
+ iIdleTimeCounter->start();
+ }
+}
+
+void Engine::initConfiguration()
+{
+ iConfiguration = Configuration::instance();
+ if ( iConfiguration == 0 )
+ {
+ QTimer::singleShot( 0, this, SLOT( closeApplication() ) );
+ }
+}
+
+void Engine::idleTimerTimeout()
+{
+ if ( iRoomStatusIndicator != 0 )
+ {
+ iWindowManager->showView( static_cast<ViewBase *>( iRoomStatusIndicator ) );
+ }
+}
+
+void Engine::settingsOkClicked()
+{
+ if ( iWeeklyView != 0 )
+ {
+ iWindowManager->showView( iWeeklyView );
+ // Start the idle time counter when we return to the main view
+ iIdleTimeCounter->start();
+ }
+}
+
+void Engine::connectSignals()
+{
+ // Handle weekly view signal connections
+ connect( iClock, SIGNAL( tick( QDateTime ) ), iWeeklyView, SLOT( setCurrentDateTime( QDateTime ) ) );
+}
+
+void Engine::initCommunication()
+{
+ // initialize communication
+ iCommunication = new CommunicationManager( *(iConfiguration->connectionSettings()) );
+ connect( iCommunication, SIGNAL( error( int, CommunicationManager::CommunicationType ) ),
+ this, SLOT( errorHandler( int ) ) );
+ connect( iCommunication, SIGNAL( meetingsFetched( const QList<Meeting*>& ) ),
+ this, SLOT( meetingsFetched( const QList<Meeting*>& ) ) );
+ connect( iCommunication, SIGNAL( meetingDetailsFetched( Meeting& ) ),
+ this, SLOT( meetingDetailsFetched( Meeting& ) ) );
+}
+
+void Engine::initDevice()
+{
+ // create device manager
+ iDevice = new DeviceManager( iConfiguration->startupSettings() );
+ connect( iDevice, SIGNAL( error( int, const QString& ) ), this, SLOT( errorHandler( int, const QString& ) ) );
+ connect( iDevice, SIGNAL( changeModeOrdered( DeviceManager::OperationMode ) ),
+ this, SLOT( changeModeOrdered( DeviceManager::OperationMode ) ) );
+ iDevice->initDeviceManager();
+}
+
+void Engine::dialogActivated()
+{
+ if ( iIdleTimeCounter != 0 )
+ {
+ iIdleTimeCounter->stop();
+ }
+}
+
+void Engine::dialogDeactivated()
+{
+ if ( iIdleTimeCounter != 0 )
+ {
+ iIdleTimeCounter->start();
+ }
+}
+
+void Engine::previousViewRestored()
+{
+ if ( iIdleTimeCounter != 0 )
+ {
+ iIdleTimeCounter->start();
+ }
- }
++}
++
+ void Engine::fetchMeetingDetailsCancelled()
+ {
+ iCommunication->cancelFetchMeetingDetails();
+ iWindowManager->closeProgressBar();
+ }
class Configuration;
class CommunicationManager;
class Meeting;
- // class DeviceManager;
-class DeviceManager;
+class WeeklyViewWidget;
+class SettingsView;
+class RoomStatusIndicatorWidget;
+class PasswordDialog;
+class MeetingInfoDialog;
//! BusinessLogic class. Contains all the business logic of the application.
/*!
* Slot. Receives the cancel event of the progress bar.
*/
void progressBarCancelled();
+ //! Slot for receiving the cancel event of the progress bar.
+ /*!
+ * Receives the cancel event of the progress bar when meeting details requested.
+ */
+ void fetchMeetingDetailsCancelled();
+ void handleViewEvent();
+ void previousViewRestored();
+ void settingsViewRequested();
+
+ void idleTimerTimeout();
+
+ void settingsOkClicked();
+
+ //! Slot for dialog activation signal.
+ /*!
+ * This slot is used to inform that dialog is activated. It stops
+ * the idle time counter so screensaver is not activated while the
+ * dialog is displayed.
+ */
+ void dialogActivated();
+ //! Slot for dialog deactivation signal.
+ /*!
+ * This slot is used to inform that dialog is deactivated. It restarts
+ * the idle time counter so that the screensaver is being activated again
+ * as needed.
+ */
+ void dialogDeactivated();
+
private:
//! Provides the index of the Meeting instance which is at the specified time.
/*!
#include <QtDebug>
- const int IDLE_TIME_MULTIPLIER = 60000; // Multiplies milliseconds to minutes
-
-WindowManager::WindowManager( Configuration *aConfiguration ) :
- QObject(),
+WindowManager::WindowManager( QWidget *aParent ) :
+ QWidget( aParent ),
iApplicationName( tr( "Qt Meetings" ) ),
- iFullScreen( false ),
- iConfiguration( aConfiguration ),
- iWeeklyView( 0 ),
- iRoomStatusView( 0 ),
- iMeetingInfo( 0 ),
- iProgressBar( 0 ),
- iPasswordDialog( 0 )
+ iCurrentView( 0 )
{
- iWeeklyView = new WeeklyViewWidget( QDateTime::currentDateTime(), aConfiguration );
- iWeeklyView->setWindowTitle( iApplicationName );
- connect( iWeeklyView, SIGNAL( observedEventDetected() ), this, SIGNAL( observedEventDetected() ) );
- connect( iWeeklyView, SIGNAL( meetingActivated( Meeting * ) ), this, SIGNAL( meetingActivated( Meeting * ) ) );
- connect( iWeeklyView, SIGNAL( currentRoomChanged( Room * ) ), this, SIGNAL( currentRoomChanged( Room * ) ) );
- connect( iWeeklyView, SIGNAL( shownWeekChanged( QDate ) ), this, SIGNAL( shownWeekChanged( QDate ) ) );
-
- showWeeklyView();
-
+ this->setWindowTitle( iApplicationName );
}
WindowManager::~WindowManager()
}
}
- // closing/deleting meeting info dialog
- if ( iMeetingInfo != 0 )
- {
- iMeetingInfo->hide();
- }
}
-void WindowManager::showWeeklyView()
+bool WindowManager::event(QEvent *event)
{
- qDebug() << "WindowManager::showWeeklyView";
- if ( iRoomStatusView != 0 && iRoomStatusView->isVisible() )
+ if ( event->type() == QEvent::Resize )
{
- iRoomStatusView->hide();
+ if ( iCurrentView != 0 )
+ {
+ iCurrentView->setFixedSize( this->size() );
+ emit viewResized( this->size() );
+ }
}
-
- iWeeklyView->show();
-}
-
-void WindowManager::fullScreen()
-{
- if ( iRoomStatusView != 0 )
- iRoomStatusView->setWindowState( Qt::WindowFullScreen );
- if ( iWeeklyView != 0 )
- iWeeklyView->setWindowState( Qt::WindowFullScreen );
- iFullScreen = true;
-}
-
-void WindowManager::insertMeeting( Meeting *aMeeting )
-{
- iWeeklyView->insertMeeting( aMeeting );
-}
-
-void WindowManager::deleteMeeting( Meeting *aMeeting )
-{
- iWeeklyView->deleteMeeting( aMeeting );
-}
-
-void WindowManager::showMeetingInfo( Meeting *aMeeting )
-{
- iMeetingInfo = new MeetingInfoDialog( aMeeting );
- // Display modal dialog
- iMeetingInfo->exec();
-
- delete iMeetingInfo;
- iMeetingInfo = 0;
-}
-
-void WindowManager::showSettingsView()
-{
- // TODO : give the Torspo for the person who was responsible to write this method
-}
-
-WeeklyViewWidget * WindowManager::weeklyView()
-{
- return iWeeklyView;
+
+ return QWidget::event( event );
}
+ void WindowManager::error( const QString &aErrorMessage )
+ {
+ qDebug() << "WindowManager::showErrorPopup";
+
+ PopUpMessageBox::error( 0, aErrorMessage );
+ }
+
-void WindowManager::showPasswordDialog( QByteArray aAdminPassword, const QString &aMessage )
-{
- iPasswordDialog = new PasswordDialog( aAdminPassword, aMessage );
- connect( iPasswordDialog, SIGNAL( passwordEntered( PasswordDialog::PasswordStatus ) ),
- this, SIGNAL( passwordEntered( PasswordDialog::PasswordStatus ) ) );
- iPasswordDialog->show();
-
- //TODO connect connect( iWeeklyView, SIGNAL( observedEventDetected() ), this, SIGNAL( observedEventDetected() ) );
-}
-
-void WindowManager::closePasswordDialog()
-{
- iPasswordDialog->close();
- delete iPasswordDialog;
- iPasswordDialog = 0;
-}
-
-void WindowManager::showProgressBar( const QString &aText, bool aCancellable )
-{
- qDebug() << "WindowManager::showProgressBar( const QString & )";
- if( iProgressBar == 0 ) {
- iProgressBar = new ProgressBar( aText, aCancellable );
- iProgressBar->setFixedSize( 600, 125 );
- iProgressBar->show();
- connect( iProgressBar, SIGNAL( cancel() ), this, SIGNAL( progressBarCancelled() ) );
- }
-
- //TODO connect connect( iWeeklyView, SIGNAL( observedEventDetected() ), this, SIGNAL( observedEventDetected() ) );
-}
-
-void WindowManager::closeProgressBar()
-{
- qDebug() << "WindowManager::closeProgressBar()";
- if( iProgressBar )
- {
- iProgressBar->close();
- delete iProgressBar;
- iProgressBar = 0;
- }
-}
-
-void WindowManager::updateProgressBar( const QString &aMessage )
+void WindowManager::setFullscreen()
{
- qDebug() << "WindowManager::updateProgressBar( const QString & )";
- if( iProgressBar != 0 )
- iProgressBar->update( aMessage );
+ this->setWindowState( Qt::WindowFullScreen );
+ // Resize event handles the rest.
}
++<<<<<<< HEAD:src/UserInterface/WindowManager.h
+#ifndef WINDOWMANAGER_H_\r
+#define WINDOWMANAGER_H_\r
+\r
+#include <QWidget>\r
+#include <QStack>\r
+\r
+// Forward declarations\r
+class ViewBase;\r
+class QEvent;\r
+class QSize;\r
+class QDialog;\r
+\r
+//! UserInterface class. Manages displayed views.\r
+/*!\r
+ * UserInterface class. WindowManager class is responsible for displaying views that inherit the\r
+ * ViewBase class. It also handles dialog showing. Depending on the views type the WindowManager\r
+ * can track the views events and restore previous view if the current on is ObservedView. This\r
+ * is a handy mechanism for screensaver etc.\r
+ */\r
+class WindowManager : public QWidget\r
+{\r
+ Q_OBJECT\r
+\r
+public:\r
+ //! Constructor.\r
+ /*!\r
+ * Constructor of WindowManager.\r
+ */\r
+ WindowManager( QWidget *aParent = 0 );\r
+ //! Destructor.\r
+ virtual ~WindowManager();\r
+ \r
+ virtual bool event(QEvent *event);\r
+\r
+signals:\r
+ //! Request current status of the room.\r
+ /*!\r
+ * Signal is emitted when there is need to check current status of room aRoom.\r
+ * \param aRoom Meetingroom which status is requested.\r
+ */\r
+ void eventDetected();\r
+ \r
+ //! The view size is changed.\r
+ /*!\r
+ * This signal is emitted when the window managers view changes,\r
+ * i.e. it received resized QEvent.\r
+ * \param The new view size.\r
+ */\r
+ void viewResized(const QSize &);\r
+ \r
+ //! Previous view is restored.\r
+ /*!\r
+ * This signal is emitted when previously stored view is\r
+ * restored. This happens when view with type ViewMode::ObservedView\r
+ * is shown and it receives an event that initiates the view\r
+ * restoring chain.\r
+ */\r
+ void previousViewRestored();\r
+ \r
+ void dialogActivated();\r
+ void dialogDeactivated();\r
+\r
+public slots:\r
+ //! Shows the view.\r
+ /*!\r
+ * Show view that inherits ViewBase class. If the views parent is not\r
+ * the WindowManager it will changed within this method. Depeding on the\r
+ * views type the currently active view might be stored and restored\r
+ * when specific event occurs in the view to be displayed.\r
+ */\r
+ void showView( ViewBase *view );\r
+ \r
+ //! Shows modal dialog.\r
+ /*!\r
+ * Shows modal dialog. Emits dialogActivated() signal prior calling\r
+ * QDialog's exec() method and emits dialogDeactivated signal when\r
+ * the exec() method returns.\r
+ */\r
+ void showDialog( QDialog *dialog );\r
+ \r
+ //! View event is detected.\r
+ /*!\r
+ * WindowManager connects this slot to ViewBase classes eventDetected()\r
+ * signal and either emits eventDetected() signal if the current views\r
+ * type is ViewMode::NormalView or restores possible previous view\r
+ * if the current views type is ViewMode::ObservedView.\r
+ */\r
+ void viewEventDetected();\r
+ \r
+ void setFullscreen();\r
+\r
+private:\r
+ //! Name of the application.\r
+ QString iApplicationName;\r
+ \r
+ //! Currently active view.\r
+ ViewBase *iCurrentView;\r
+ \r
+ //! Stack of views previously displayed.\r
+ QStack<ViewBase *> iViewList;\r
+\r
+};\r
+\r
+#endif /*WINDOWMANAGER_H_*/\r
++=======
+ #ifndef WINDOWMANAGER_H_
+ #define WINDOWMANAGER_H_
+
+ #include <QObject>
+ #include <QTime>
+ #include "Room.h"
+ #include "Meeting.h"
+ #include "PasswordDialog.h"
+ #include "DeviceManager.h"
+
+ class QTimer;
+ class RoomStatusIndicatorWidget;
+ class WeeklyViewWidget;
+ class Engine;
+ class MeetingInfoDialog;
+ class SettingsView;
+ class ProgressBar;
+ class Configuration;
+
+ //! UserInterface class. Behaves as a proxy between the user interface and application's business logic.
+ /*!
+ * UserInterface class. Controls the whole user interface, starting with displaying the appropriate
+ * views. It behaves as a proxy between the user interface and application's business logic, it connects
+ * the specified components together and forwards the data to the correct place. It also manages the correct
+ * appearance of current views on the screen.
+ */
+ class WindowManager : public QObject
+ {
+ Q_OBJECT
+
+ public:
+ //! Constructor.
+ /*!
+ * Constructor of WindowManager.
+ * \param aConfiguration The pointer to configuration.
+ */
+ WindowManager( Configuration *aConfiguration );
+ //! Destructor.
+ virtual ~WindowManager();
+ /*!
+ * Displays an error message
+ * \param aErrorMessage Message to be displayd
+ */
+ void error( const QString &aErrorMessage );
+ //! Updates the rooms status.
+ /*!
+ * Forwards the signal of changed status to current view.
+ * \param aRoom Room which status is changed.
+ * \param aStatus Current status of room.
+ * \param aTime Time when status is changed.
+ */
+ void roomStatusChanged( Room *aRoom, Room::Status aStatus, QTime aTime );
+ //! Shows the password dialog.
+ /*!
+ * Shows the password dialog.
+ * \param aAdminPassword The correct password.
+ * \param aMessage The message to be shown in the password dialog.
+ */
+ void showPasswordDialog( QByteArray aAdminPassword, const QString &aMessage );
+ //! Closes the password dialog.
+ /*!
+ * Closes the password dialog.
+ */
+ void closePasswordDialog();
+ //! Displays the weekly view.
+ /*!
+ * Displays the weekly view.
+ */
+ void showWeeklyView();
+ //! Displays the meeting info dialog.
+ /*!
+ * Displays the meeting info dialog.
+ * \param aMeeting Meeting to be displayd
+ */
+ void showMeetingInfo( Meeting *aMeeting );
+ //! Returns the pointer to the weekly view.
+ /*!
+ * Returns the pointer to the weekly view.
+ */
+ WeeklyViewWidget * weeklyView();
+ //! Switches the views to full screen.
+ /*!
+ * Switches the views to full screen.
+ */
+ void fullScreen();
+ //! Shows the progress bar.
+ /*!
+ * Starts showing the progress bar.
+ * \param aText The text to be shown in progress bar.
+ * \param aCancellable Is the Cancel button visible. By default not visible.
+ */
+ void showProgressBar( const QString &aText, bool aCancellable = false );
+ //! Closes the progress bar.
+ /*!
+ * Closes the progress bar.
+ */
+ void closeProgressBar();
+
+ void insertMeeting( Meeting *aMeeting );
+
+ void deleteMeeting( Meeting *aMeeting );
+
+ signals:
+ //! Request current status of the room.
+ /*!
+ * Signal is emitted when there is need to check current status of room aRoom.
+ * \param aRoom Meetingroom which status is requested.
+ */
+ void roomStatusInfoNeeded( Room *aRoom );
+ //! Indicate that some user event has happened.
+ /*!
+ * Signal is emitted if some user event has happened.
+ */
+ void observedEventDetected();
+ //! Meeting activated.
+ /*!
+ * Signal is emitted when a meeting is clicked by the user.
+ * \param aMeeting actived meeting.
+ */
+ void meetingActivated( Meeting *aMeeting );
+ //! Signals if the shown week has been changed.
+ /*!
+ * Signal. Emitted if the shown week has been changed.
+ * \param aDate The first date of the shown week.
+ */
+ void shownWeekChanged( QDate aDate );
+ //! Signals change of the meeting room.
+ /*!
+ * Signal is emitted when meeting room is changed.
+ * \param aRoom Selected meeting room.
+ */
+ void currentRoomChanged( Room *aRoom );
+ //! Signals when the password dialog buttons are clicked.
+ /*!
+ * Signal is emitted when the password dialog buttons are clicked.
+ * \param aPasswordStatus The status of the password.
+ */
+ void passwordEntered( PasswordDialog::PasswordStatus aPasswordStatus );
+ //! Signals when the cancel button in the progress bar is clicked.
+ /*!
+ * Signal is emitted when the cancel button in the progress bar is clicked.
+ */
+ void progressBarCancelled();
+
+ public slots:
+ //! Slot for displaying the screensaver (room status view).
+ /*!
+ * Slot. Displays the screensaver.
+ */
+ void showRoomStatus();
+ //! Slot for updating the time.
+ /*!
+ * Slot. Forwards the signal of changed time to current view.
+ * \param aCurrentDateTime Current date and time.
+ */
+ void distributeDateTimeInfo( QDateTime aCurrentDateTime );
+
+ void updateProgressBar( const QString &aMessage );
+
+ private slots:
+ //! Displays the settings view
+ void showSettingsView();
+
+ private:
+ //! Name of the application.
+ QString iApplicationName;
+ //! Defines whether the views should be shown as full screen
+ bool iFullScreen;
+ //! Pointer to the configuration.
+ Configuration *iConfiguration;
+ //! Pointer to the weekly view.
+ WeeklyViewWidget *iWeeklyView;
+ //! Pointer to the screensaver (room status view).
+ RoomStatusIndicatorWidget *iRoomStatusView;
+ //! Pointer to the meeting info dialog
+ MeetingInfoDialog *iMeetingInfo;
+ //! Pointer to the settings view
+ SettingsView *iSettingsView;
+ //! Pointer to the progress bar
+ ProgressBar *iProgressBar;
+ //! Pointer to the password dialog.
+ PasswordDialog *iPasswordDialog;
+
+ };
+
+ #endif /*WINDOWMANAGER_H_*/
++>>>>>>> deb6aee06a80416a24a64c2ac6349a2341acdc39:src/UserInterface/WindowManager.h