From f5c31ad353b394300cbd8b5b00c2f545ffa6fb96 Mon Sep 17 00:00:00 2001 From: Michael Carpenter Date: Wed, 20 Nov 2013 19:22:41 -0500 Subject: [PATCH] New "Open Windows" menu, showing currently open windows by title. --- core/src/aboutview.cpp | 1 + core/src/aboutview.h | 2 + core/src/emsinfoview.cpp | 1 + core/src/emsinfoview.h | 2 + core/src/emsstatus.cpp | 1 + core/src/emsstatus.h | 2 + core/src/flagview.cpp | 1 + core/src/flagview.h | 2 + core/src/gaugeview.cpp | 1 + core/src/gaugeview.h | 3 ++ core/src/interrogateprogressview.cpp | 6 +++ core/src/interrogateprogressview.h | 3 ++ core/src/interrogateprogressview.ui | 2 +- core/src/mainwindow.cpp | 66 +++++++++++++++++++++++++++- core/src/mainwindow.h | 5 +++ core/src/mainwindow.ui | 9 +++- core/src/packetstatusview.cpp | 7 +++ core/src/packetstatusview.h | 4 ++ core/src/parameterview.cpp | 7 +++ core/src/parameterview.h | 4 ++ core/src/tableview.cpp | 1 + core/src/tableview.h | 3 ++ 22 files changed, 129 insertions(+), 4 deletions(-) diff --git a/core/src/aboutview.cpp b/core/src/aboutview.cpp index f244db6..327b69f 100644 --- a/core/src/aboutview.cpp +++ b/core/src/aboutview.cpp @@ -51,4 +51,5 @@ void AboutView::closeEvent(QCloseEvent *event) { event->ignore(); ((QMdiSubWindow*)this->parent())->hide(); + emit windowHiding((QMdiSubWindow*)this->parent()); } diff --git a/core/src/aboutview.h b/core/src/aboutview.h index a17163f..daf4496 100644 --- a/core/src/aboutview.h +++ b/core/src/aboutview.h @@ -43,6 +43,8 @@ class AboutView : public QWidget QString m_commit; QString m_hash; Ui::AboutView ui; +signals: + void windowHiding(QWidget *parent); }; #endif // ABOUTVIEW_H diff --git a/core/src/emsinfoview.cpp b/core/src/emsinfoview.cpp index 6d71dad..6e470d0 100644 --- a/core/src/emsinfoview.cpp +++ b/core/src/emsinfoview.cpp @@ -173,6 +173,7 @@ void EmsInfoView::closeEvent(QCloseEvent *event) { event->ignore(); ((QMdiSubWindow*)this->parent())->hide(); + emit windowHiding((QMdiSubWindow*)this->parent()); } void EmsInfoView::locationIdInfo(unsigned short locationid,QString title,MemoryLocationInfo info) { diff --git a/core/src/emsinfoview.h b/core/src/emsinfoview.h index bf9cfb2..46533a4 100644 --- a/core/src/emsinfoview.h +++ b/core/src/emsinfoview.h @@ -24,6 +24,7 @@ #include #include +#include #include "memorylocationinfo.h" #include "datatype.h" #include "ui_emsinfo.h" @@ -52,6 +53,7 @@ public slots: signals: void displayLocationId(int locid, bool isram,DataType type); void checkSync(); + void windowHiding(QMdiSubWindow *parent); }; #endif // EMSINFO_H diff --git a/core/src/emsstatus.cpp b/core/src/emsstatus.cpp index a68c9f7..6eed202 100644 --- a/core/src/emsstatus.cpp +++ b/core/src/emsstatus.cpp @@ -37,6 +37,7 @@ void EmsStatus::closeEvent(QCloseEvent *event) { event->ignore(); this->hide(); + emit windowHiding((QMdiSubWindow*)this->parent()); } EmsStatus::~EmsStatus() { diff --git a/core/src/emsstatus.h b/core/src/emsstatus.h index e25a084..f2e5243 100644 --- a/core/src/emsstatus.h +++ b/core/src/emsstatus.h @@ -24,6 +24,7 @@ #include #include +#include #include "ui_emsstatus.h" class EmsStatus : public QDockWidget @@ -40,6 +41,7 @@ class EmsStatus : public QDockWidget signals: void hardResetRequest(); void softResetRequest(); + void windowHiding(QMdiSubWindow *parent); private: Ui::EmsStatus ui; }; diff --git a/core/src/flagview.cpp b/core/src/flagview.cpp index e03022b..457731a 100644 --- a/core/src/flagview.cpp +++ b/core/src/flagview.cpp @@ -41,6 +41,7 @@ void FlagView::closeEvent(QCloseEvent *event) { event->ignore(); ((QMdiSubWindow*)this->parent())->hide(); + emit windowHiding((QMdiSubWindow*)this->parent()); } void FlagView::passData(QVariantMap data) { diff --git a/core/src/flagview.h b/core/src/flagview.h index 5e41f1b..ab9a0fb 100644 --- a/core/src/flagview.h +++ b/core/src/flagview.h @@ -40,6 +40,8 @@ class FlagView : public QWidget void closeEvent(QCloseEvent *event); private: Ui::DataFlags ui; +signals: + void windowHiding(QMdiSubWindow *parent); }; #endif // DATAFLAGS_H diff --git a/core/src/gaugeview.cpp b/core/src/gaugeview.cpp index 66d7fd9..e62195b 100644 --- a/core/src/gaugeview.cpp +++ b/core/src/gaugeview.cpp @@ -41,6 +41,7 @@ void GaugeView::closeEvent(QCloseEvent *event) { event->ignore(); ((QMdiSubWindow*)this->parent())->hide(); + emit windowHiding((QMdiSubWindow*)this->parent()); } void GaugeView::passData(QVariantMap data) { diff --git a/core/src/gaugeview.h b/core/src/gaugeview.h index f330923..cc979bd 100644 --- a/core/src/gaugeview.h +++ b/core/src/gaugeview.h @@ -24,6 +24,7 @@ #include #include +#include #include "ui_datagauges.h" #include "gaugewidget.h" #include "datapacketdecoder.h" @@ -49,6 +50,8 @@ class GaugeView : public QWidget void closeEvent(QCloseEvent *event); private slots: void guiUpdateTimerTick(); +signals: + void windowHiding(QMdiSubWindow *parent); }; #endif // GAUGEVIEW_H diff --git a/core/src/interrogateprogressview.cpp b/core/src/interrogateprogressview.cpp index adc17d5..36e215a 100644 --- a/core/src/interrogateprogressview.cpp +++ b/core/src/interrogateprogressview.cpp @@ -34,6 +34,12 @@ void InterrogateProgressView::closeEvent(QCloseEvent *event) { event->ignore(); ((QMdiSubWindow*)this->parent())->hide(); + emit windowHiding((QMdiSubWindow*)this->parent()); +} +void InterrogateProgressView::hideEvent(QHideEvent *event) +{ + Q_UNUSED(event) + emit windowHiding((QMdiSubWindow*)this->parent()); } void InterrogateProgressView::reset() { diff --git a/core/src/interrogateprogressview.h b/core/src/interrogateprogressview.h index 3437824..87666c7 100644 --- a/core/src/interrogateprogressview.h +++ b/core/src/interrogateprogressview.h @@ -24,6 +24,7 @@ #include #include +#include #include "ui_interrogateprogressview.h" #include "overviewprogressitemdelegate.h" class InterrogateProgressView : public QWidget @@ -45,6 +46,7 @@ class InterrogateProgressView : public QWidget int progress() { return ui.progressBar->value(); } protected: void closeEvent(QCloseEvent *event); + void hideEvent(QHideEvent *event); private: Ui::InterrogateProgressView ui; QMap m_typeToOverviewListMap; @@ -52,6 +54,7 @@ private slots: void cancelClickedSlot(); signals: void cancelClicked(); + void windowHiding(QMdiSubWindow *parent); }; #endif // INTERROGATEPROGRESSVIEW_H diff --git a/core/src/interrogateprogressview.ui b/core/src/interrogateprogressview.ui index b747215..b00792c 100644 --- a/core/src/interrogateprogressview.ui +++ b/core/src/interrogateprogressview.ui @@ -11,7 +11,7 @@ - Form + Interrogation Progress diff --git a/core/src/mainwindow.cpp b/core/src/mainwindow.cpp index 9bfc534..ba6fb0f 100644 --- a/core/src/mainwindow.cpp +++ b/core/src/mainwindow.cpp @@ -190,6 +190,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) connect(ui.actionParameter_View,SIGNAL(triggered()),this,SLOT(menu_windows_ParameterViewClicked())); ui.actionInterrogation_Progress->setEnabled(false); + emsInfo=0; dataTables=0; dataFlags=0; @@ -321,7 +322,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) //ui.menuWizards - + connect(ui.mdiArea,SIGNAL(subWindowActivated(QMdiSubWindow*)),this,SLOT(subMdiWindowActivated(QMdiSubWindow*))); } void MainWindow::menu_windows_interrogateProgressViewClicked() @@ -1107,6 +1108,7 @@ void MainWindow::createView(unsigned short locid,DataType type) view->setData(locid,data); QMdiSubWindow *win = ui.mdiArea->addSubWindow(view); + connect(win,SIGNAL(destroyed(QObject*)),this,SLOT(rawDataViewDestroyed(QObject*))); win->setWindowTitle("Ram Location 0x" + QString::number(locid,16).toUpper()); win->setGeometry(0,0,((view->width() < this->width()-160) ? view->width() : this->width()-160),((view->height() < this->height()-100) ? view->height() : this->height()-100)); m_rawDataView[locid] = view; @@ -1163,8 +1165,14 @@ void MainWindow::rawDataViewDestroyed(QObject *object) QMdiSubWindow *win = qobject_cast(object->parent()); if (!win) { - return; + win = qobject_cast(object); + if (!win) + { + return; + } } + ui.menuOpen_Windows->removeAction(m_mdiSubWindowToActionMap[win]); + m_mdiSubWindowToActionMap.remove(win); win->hide(); ui.mdiArea->removeSubWindow(win); return; @@ -1561,6 +1569,7 @@ void MainWindow::emsCommsConnected() progressView = new InterrogateProgressView(); connect(progressView,SIGNAL(destroyed(QObject*)),this,SLOT(interrogateProgressViewDestroyed(QObject*))); interrogateProgressMdiWindow = ui.mdiArea->addSubWindow(progressView); + interrogateProgressMdiWindow->setWindowTitle(progressView->windowTitle()); interrogateProgressMdiWindow->setGeometry(progressView->geometry()); connect(progressView,SIGNAL(cancelClicked()),this,SLOT(interrogateProgressViewCancelClicked())); progressView->setMaximum(0); @@ -1950,6 +1959,59 @@ void MainWindow::logPayloadReceived(QByteArray header,QByteArray payload) Q_UNUSED(payload) pidcount++; } +void MainWindow::windowHidden(QMdiSubWindow* window) +{ + if (window && m_mdiSubWindowToActionMap.contains(window)) + { + ui.menuOpen_Windows->removeAction(m_mdiSubWindowToActionMap[window]); + m_mdiSubWindowToActionMap.remove(window); + } +} +void MainWindow::windowDestroyed(QObject *window) +{ + if (window && m_mdiSubWindowToActionMap.contains((QMdiSubWindow*)window)) + { + ui.menuOpen_Windows->removeAction(m_mdiSubWindowToActionMap[(QMdiSubWindow*)window]); + m_mdiSubWindowToActionMap.remove((QMdiSubWindow*)window); + } +} + +void MainWindow::bringToFrontAndShow() +{ + for (QMap::const_iterator i=m_mdiSubWindowToActionMap.constBegin();i!=m_mdiSubWindowToActionMap.constEnd();i++) + { + if (i.value() == sender()) + { + i.key()->show(); + QApplication::postEvent(i.key(), new QEvent(QEvent::Show)); + QApplication::postEvent(i.key(), new QEvent(QEvent::WindowActivate)); + } + + } +} + +void MainWindow::subMdiWindowActivated(QMdiSubWindow* window) +{ + if (window && !m_mdiSubWindowToActionMap.contains(window)) + { + if (window->isVisible()) + { + //connect(window,SIGNAL(windowStateChanged(Qt::WindowStates,Qt::WindowStates)) + QAction *action = ui.menuOpen_Windows->addAction(window->windowTitle()); + connect(action,SIGNAL(triggered()),this,SLOT(bringToFrontAndShow())); + connect(window->widget(),SIGNAL(windowHiding(QMdiSubWindow*)),this,SLOT(windowHidden(QMdiSubWindow*))); + connect(window,SIGNAL(destroyed(QObject*)),this,SLOT(windowDestroyed(QObject*))); + m_mdiSubWindowToActionMap[window] = action; + } + //connect(action,SIGNAL(triggered(bool)),window,SLOT(setVisible(bool))); + //connect(action,SIGNAL(triggered()),this,SLOT(bringToFrontAndShow())); + QLOG_DEBUG() << "Window Activated New:" << window->windowTitle(); + } + else if (window) + { + QLOG_DEBUG() << "Window Activated Old:" << window->windowTitle(); + } +} MainWindow::~MainWindow() { diff --git a/core/src/mainwindow.h b/core/src/mainwindow.h index 3ea119f..bc66c98 100644 --- a/core/src/mainwindow.h +++ b/core/src/mainwindow.h @@ -164,7 +164,11 @@ class MainWindow : public QMainWindow //EmsData *emsData; //EmsData *checkEmsData; int m_currentEcuClock; + QMap m_mdiSubWindowToActionMap; private slots: + void windowHidden(QMdiSubWindow* window); + void bringToFrontAndShow(); + void windowDestroyed(QObject *window); void interrogationData(QMap datamap); void emsCommsSilence(); void emsCommsSilenceBroken(); @@ -232,6 +236,7 @@ private slots: void interrogateTaskSucceed(int sequence); void interrogateTaskFail(int sequence); void locationIdList(QList idlist); + void subMdiWindowActivated(QMdiSubWindow* window); }; diff --git a/core/src/mainwindow.ui b/core/src/mainwindow.ui index b7ccaf3..7307ccb 100644 --- a/core/src/mainwindow.ui +++ b/core/src/mainwindow.ui @@ -44,7 +44,7 @@ 0 0 1525 - 27 + 29 @@ -79,6 +79,7 @@ + @@ -91,9 +92,15 @@ Wizards + + + Open Windows + + + diff --git a/core/src/packetstatusview.cpp b/core/src/packetstatusview.cpp index 0230beb..97e45f6 100644 --- a/core/src/packetstatusview.cpp +++ b/core/src/packetstatusview.cpp @@ -131,7 +131,14 @@ void PacketStatusView::closeEvent(QCloseEvent *event) { event->ignore(); ((QMdiSubWindow*)this->parent())->hide(); + emit windowHiding((QMdiSubWindow*)this->parent()); } +void PacketStatusView::hideEvent(QHideEvent *event) +{ + Q_UNUSED(event) + emit windowHiding((QMdiSubWindow*)this->parent()); +} + PacketStatusView::~PacketStatusView() { } diff --git a/core/src/packetstatusview.h b/core/src/packetstatusview.h index 4001068..659bbee 100644 --- a/core/src/packetstatusview.h +++ b/core/src/packetstatusview.h @@ -23,6 +23,7 @@ #define PACKETSTATUSVIEW_H #include +#include #include "ui_packetstatusview.h" class PacketStatusView : public QWidget { @@ -39,8 +40,11 @@ public slots: void passDecoderFailure(QByteArray packet); protected: void closeEvent(QCloseEvent *event); + void hideEvent(QHideEvent *event); private: Ui::PacketStatusView ui; +signals: + void windowHiding(QMdiSubWindow *parent); }; #endif // PACKETSTATUSVIEW_H diff --git a/core/src/parameterview.cpp b/core/src/parameterview.cpp index 750a725..0c66eff 100644 --- a/core/src/parameterview.cpp +++ b/core/src/parameterview.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "QsLog.h" @@ -24,6 +25,12 @@ void ParameterView::addConfig(QString name,ConfigData *data) Q_UNUSED(data) } +void ParameterView::closeEvent(QCloseEvent *event) +{ + event->ignore(); + ((QMdiSubWindow*)this->parent())->hide(); + emit windowHiding((QMdiSubWindow*)this->parent()); +} void ParameterView::currentItemChanged(QTreeWidgetItem *current,QTreeWidgetItem *prev) { diff --git a/core/src/parameterview.h b/core/src/parameterview.h index 150bb89..292629d 100644 --- a/core/src/parameterview.h +++ b/core/src/parameterview.h @@ -2,6 +2,7 @@ #define PARAMETERVIEW_H #include +#include #include "ui_parameterview.h" #include "configblock.h" #include "parameterwidget.h" @@ -30,8 +31,11 @@ class ParameterView : public QWidget MenuSetup m_metaMenu; QList m_memoryConfigBlockList; Ui::Form ui; +protected: + void closeEvent(QCloseEvent *event); signals: void saveSingleData(unsigned short locationid,QByteArray data, unsigned short offset, unsigned short size); + void windowHiding(QMdiSubWindow *parent); public slots: void currentItemChanged(QTreeWidgetItem *current,QTreeWidgetItem *prev); void itemSelectionChanged(); diff --git a/core/src/tableview.cpp b/core/src/tableview.cpp index b9c63f9..6ca966d 100644 --- a/core/src/tableview.cpp +++ b/core/src/tableview.cpp @@ -38,6 +38,7 @@ void TableView::closeEvent(QCloseEvent *event) { event->ignore(); ((QMdiSubWindow*)this->parent())->hide(); + emit windowHiding((QMdiSubWindow*)this->parent()); } void TableView::passDecoder(DataPacketDecoder *decoder) { diff --git a/core/src/tableview.h b/core/src/tableview.h index ef1b9c6..6d84608 100644 --- a/core/src/tableview.h +++ b/core/src/tableview.h @@ -25,6 +25,7 @@ #include #include #include +#include #include "ui_datatables.h" #include "datapacketdecoder.h" class TableView : public QWidget @@ -46,6 +47,8 @@ class TableView : public QWidget void closeEvent(QCloseEvent *event); private slots: void guiUpdateTimerTick(); +signals: + void windowHiding(QMdiSubWindow *parent); }; #endif // DATATABLES_H