Skip to content
This repository was archived by the owner on Oct 10, 2022. It is now read-only.

Commit 4e45221

Browse files
authored
Correctly save and restore window size, docks position and toolbars (#90)
* Fix toolbars and docks save/restore between sessions * Correctly restore window size * Fix compilation on ubuntu 16.04
1 parent 15e5248 commit 4e45221

8 files changed

Lines changed: 199 additions & 52 deletions

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ __pycache__
99
.kdev4*
1010
.directory
1111
CMakeLists.txt.user
12+
compile_commands.json
13+

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ enable_testing()
33
project(PlanetaryImager)
44
set(CMAKE_CXX_STANDARD 14)
55
set(CMAKE_CXX_STANDARD_REQUIRED ON)
6+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
67

78
set(MAJOR_VERSION 0)
89
set(MINOR_VERSION 7)

src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
set(PlanetaryImager_GUI_SRCS planetaryimager_mainwindow.cpp planetaryimager_mainwindow.ui resources/resources.qrc)
1+
set(PlanetaryImager_GUI_SRCS planetaryimager_mainwindow.cpp mainwindowwidgets.cpp planetaryimager_mainwindow.ui resources/resources.qrc)
22
set(PlanetaryImager_SRCS planetaryimager_main.cpp ${PlanetaryImager_GUI_SRCS})
33

44

src/mainwindowwidgets.cpp

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* Copyright (C) 2019 Marco Gulino <marco@gulinux.net>
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*
17+
*/
18+
19+
20+
#include "mainwindowwidgets.h"
21+
#include "commons/configuration.h"
22+
#include <QMainWindow>
23+
#include <QList>
24+
#include <QDockWidget>
25+
#include <QAction>
26+
#include <QMenu>
27+
#include <QDebug>
28+
#include <QVariantMap>
29+
#include <QVariantList>
30+
#include <QJsonDocument>
31+
#include <QToolBar>
32+
#include <algorithm>
33+
34+
using namespace std;
35+
36+
DPTR_IMPL(MainWindowWidgets) {
37+
QMainWindow *main_window;
38+
QMenu *window_menu;
39+
Configuration &configuration;
40+
bool is_first_run;
41+
42+
QAction *docks_separator;
43+
QAction *toolbars_separator;
44+
QList<QDockWidget*> docks;
45+
QList<QToolBar*> toolbars;
46+
void add_menu_action(const char *text, function<void()> lambda_function);
47+
};
48+
49+
void MainWindowWidgets::Private::add_menu_action(const char *text, function<void()> lambda_function) {
50+
auto action = window_menu->addAction(QObject::tr(text));
51+
QObject::connect(action, &QAction::triggered, main_window, lambda_function);
52+
}
53+
54+
MainWindowWidgets::MainWindowWidgets(QMainWindow *main_window, QMenu *windowMenu, Configuration &configuration) : dptr(main_window, windowMenu, configuration, !configuration.widgets_setup_first_run()) {
55+
configuration.set_widgets_setup_first_run(true);
56+
windowMenu->addSection(QObject::tr("Panels"));
57+
d->docks_separator = windowMenu->addSeparator();
58+
d->add_menu_action("Show All", [this]{
59+
for(auto dock: d->docks) {
60+
dock->show();
61+
}
62+
});
63+
d->add_menu_action("Hide All", [this] {
64+
for(auto dock: d->docks) {
65+
dock->hide();
66+
}
67+
});
68+
69+
windowMenu->addSection(QObject::tr("Toolbars"));
70+
d->toolbars_separator = windowMenu->addSeparator();
71+
d->add_menu_action("Show All", [this]{
72+
for(auto toolbar: d->toolbars) {
73+
toolbar->show();
74+
}
75+
});
76+
d->add_menu_action("Hide All", [this] {
77+
for(auto toolbar: d->toolbars) {
78+
toolbar->hide();
79+
}
80+
});
81+
82+
}
83+
84+
MainWindowWidgets::~MainWindowWidgets() {
85+
}
86+
87+
88+
void MainWindowWidgets::save() {
89+
d->configuration.set_dock_status(d->main_window->saveState());
90+
}
91+
92+
void MainWindowWidgets::load() {
93+
d->main_window->restoreState(d->configuration.dock_status());
94+
for(auto dock: d->docks) {
95+
d->main_window->restoreDockWidget(dock);
96+
}
97+
}
98+
99+
void MainWindowWidgets::add_dock(QDockWidget *widget) {
100+
if(d->is_first_run && !d->docks.isEmpty()) {
101+
d->main_window->tabifyDockWidget(d->docks.first(), widget);
102+
}
103+
104+
d->window_menu->insertAction(d->docks_separator, widget->toggleViewAction());
105+
d->docks.push_back({widget});
106+
}
107+
108+
void MainWindowWidgets::add_toolbar(QToolBar *toolbar, bool add_to_main_window) {
109+
d->toolbars.push_back(toolbar);
110+
if(add_to_main_window) {
111+
d->main_window->addToolBar(toolbar);
112+
}
113+
d->window_menu->insertAction(d->toolbars_separator, toolbar->toggleViewAction());
114+
}

src/mainwindowwidgets.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright (C) 2019 Marco Gulino <marco@gulinux.net>
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*
17+
*/
18+
19+
#include "dptr.h"
20+
#include "commons/fwd.h"
21+
22+
FWD_PTR(MainWindowWidgets)
23+
FWD(QMainWindow)
24+
FWD(QDockWidget)
25+
FWD(QToolBar)
26+
FWD(QMenu)
27+
FWD(Configuration)
28+
29+
class MainWindowWidgets {
30+
public:
31+
MainWindowWidgets(QMainWindow *main_window, QMenu *windowMenu, Configuration &configuration);
32+
~MainWindowWidgets();
33+
void add_dock(QDockWidget *widget);
34+
void add_toolbar(QToolBar *toolbar, bool add_to_main_window = false);
35+
void save();
36+
void load();
37+
private:
38+
DPTR
39+
};

src/planetaryimager_mainwindow.cpp

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include <QGraphicsScene>
4848
#include <QFileInfo>
4949
#include <QDesktopServices>
50+
#include <QDesktopWidget>
5051

5152
#include "widgets/editroidialog.h"
5253

@@ -64,6 +65,7 @@
6465

6566
#include "planetaryimager.h"
6667
#include "drivers/driver.h"
68+
#include "mainwindowwidgets.h"
6769

6870
using namespace GuLinux;
6971
using namespace std;
@@ -75,12 +77,13 @@ Q_DECLARE_METATYPE(cv::Mat)
7577
DPTR_IMPL(PlanetaryImagerMainWindow) {
7678
PlanetaryImagerPtr planetaryImager;
7779
FilesystemBrowserPtr filesystemBrowser;
80+
MainWindowWidgetsPtr main_window_widgets;
7881

7982
static PlanetaryImagerMainWindow *q;
8083
unique_ptr<Ui::PlanetaryImagerMainWindow> ui;
8184
Imager *imager = nullptr;
8285
void rescan_devices();
83-
void saveState();
86+
void saveWindowGeometry();
8487

8588
StatusBarInfoWidget *statusbar_info_widget;
8689
shared_ptr<DisplayImage> displayImage;
@@ -113,17 +116,15 @@ PlanetaryImagerMainWindow *PlanetaryImagerMainWindow::Private::q = nullptr;
113116
PlanetaryImagerMainWindow::~PlanetaryImagerMainWindow()
114117
{
115118
LOG_F_SCOPE
116-
d->saveState();
117119
if(d->imager) {
118120
d->imager->destroy();
119121
}
120122
d->displayImage->quit();
121123
d->planetaryImager->quit();
122124
}
123125

124-
void PlanetaryImagerMainWindow::Private::saveState()
126+
void PlanetaryImagerMainWindow::Private::saveWindowGeometry()
125127
{
126-
planetaryImager->configuration().set_dock_status(q->saveState());
127128
planetaryImager->configuration().set_main_window_geometry(q->saveGeometry());
128129
}
129130

@@ -142,6 +143,9 @@ PlanetaryImagerMainWindow::PlanetaryImagerMainWindow(
142143
d->ui.reset(new Ui::PlanetaryImagerMainWindow);
143144

144145
d->ui->setupUi(this);
146+
d->main_window_widgets = make_shared<MainWindowWidgets>(this, d->ui->menuWindow, planetaryImager->configuration());
147+
148+
restoreGeometry(d->planetaryImager->configuration().main_window_geometry());
145149
setWindowIcon(QIcon::fromTheme("planetary_imager"));
146150
d->ui->recording->setWidget(d->recording_panel = new RecordingPanel{d->planetaryImager->configuration(), filesystemBrowser});
147151
d->configurationDialog = new ConfigurationDialog(d->planetaryImager->configuration(), this);
@@ -184,38 +188,28 @@ PlanetaryImagerMainWindow::PlanetaryImagerMainWindow(
184188
d->image_widget->actions()[ZoomableImage::Actions::ZoomRealSize]->setShortcut({Qt::CTRL + Qt::Key_Backspace});
185189
d->image_widget->actions()[ZoomableImage::Actions::ZoomRealSize]->setIcon(QIcon{":/resources/real_size.png"});
186190
d->image_widget->toolbar()->setWindowTitle("Image Control");
187-
addToolBar(d->image_widget->toolbar());
188-
QToolBar *helpToolBar = new QToolBar;
189-
helpToolBar->setWindowTitle(tr("Help"));
191+
d->image_widget->toolbar()->setObjectName("imageToolbar");
192+
193+
d->main_window_widgets->add_toolbar(d->ui->imageManipulation);
194+
d->main_window_widgets->add_toolbar(d->ui->ROIToolbar);
195+
d->main_window_widgets->add_toolbar(d->image_widget->toolbar(), true);
196+
QToolBar *helpToolBar = new QToolBar(tr("Help"));
190197
auto whatsThis = QWhatsThis::createAction();
191198
whatsThis->setIcon(QIcon{":/resources/help.png"});
192199
helpToolBar->addAction(whatsThis);
193-
addToolBar(helpToolBar);
200+
helpToolBar->setObjectName("help");
201+
d->main_window_widgets->add_toolbar(helpToolBar, true);
202+
194203
d->image_widget->toolbar()->setFloatable(true);
195204
d->image_widget->toolbar()->setMovable(true);
196205

197-
restoreGeometry(d->planetaryImager->configuration().main_window_geometry());
198-
restoreState(d->planetaryImager->configuration().dock_status());
199206
connect(d->ui->actionAbout, &QAction::triggered, bind(&QMessageBox::about, this, tr("About"),
200207
tr("%1 version %2.\nFast imaging capture software for planetary imaging").arg(qApp->applicationDisplayName())
201208
.arg(qApp->applicationVersion())));
202209
connect(d->ui->actionAbout_Qt, &QAction::triggered, &QApplication::aboutQt);
203210
connect(d->ui->action_devices_rescan, &QAction::triggered, bind(&Private::rescan_devices, d.get()));
204211
connect(d->ui->actionShow_settings, &QAction::triggered, bind(&QDialog::show, d->configurationDialog));
205212

206-
auto dockWidgetToggleVisibility = [=](QDockWidget *widget, bool visible){ widget->setVisible(visible); };
207-
auto dockWidgetVisibleCheck = [=](QAction *action, QDockWidget *widget) { action->setChecked(widget->isVisible()); };
208-
QList<QDockWidget*> dock_widgets;
209-
auto setupDockWidget = [&](QAction *action, QDockWidget *widget){
210-
dockWidgetVisibleCheck(action, widget);
211-
connect(action, &QAction::triggered, bind(dockWidgetToggleVisibility, widget, _1));
212-
connect(widget, &QDockWidget::visibilityChanged, bind(dockWidgetVisibleCheck, action, widget));
213-
connect(widget, &QDockWidget::dockLocationChanged, bind(&Private::saveState, d.get()));
214-
connect(widget, &QDockWidget::topLevelChanged, bind(&Private::saveState, d.get()));
215-
connect(widget, &QDockWidget::visibilityChanged, bind(&Private::saveState, d.get()));
216-
dock_widgets.push_back(widget);
217-
};
218-
219213
connect(d->configurationDialog, &QDialog::accepted, this, bind(&DisplayImage::read_settings, d->displayImage), Qt::DirectConnection);
220214
connect(d->configurationDialog, &QDialog::accepted, this, bind(&Histogram::read_settings, d->histogram), Qt::DirectConnection);
221215
connect(d->configurationDialog, &QDialog::accepted, this,
@@ -236,16 +230,14 @@ PlanetaryImagerMainWindow::PlanetaryImagerMainWindow(
236230
QTimer::singleShot(5000, bind(&DisplayImage::setRecording, d->displayImage, false));
237231
QTimer::singleShot(5000, bind(&Histogram::setRecording, d->histogram, false));
238232
}, Qt::QueuedConnection);
239-
setupDockWidget(d->ui->actionChip_Info, d->ui->chipInfoWidget);
240-
setupDockWidget(d->ui->actionCamera_Settings, d->ui->camera_settings);
241-
setupDockWidget(d->ui->actionRecording, d->ui->recording);
242-
setupDockWidget(d->ui->actionHistogram, d->ui->histogram);
243-
if(! d->planetaryImager->configuration().widgets_setup_first_run() ) {
244-
tabifyDockWidget(d->ui->chipInfoWidget, d->ui->camera_settings);
245-
tabifyDockWidget(d->ui->chipInfoWidget, d->ui->histogram);
246-
tabifyDockWidget(d->ui->chipInfoWidget, d->ui->recording);
247-
d->planetaryImager->configuration().set_widgets_setup_first_run(true);
248-
}
233+
234+
d->main_window_widgets->add_dock(d->ui->chipInfoWidget);
235+
d->main_window_widgets->add_dock(d->ui->camera_settings);
236+
d->main_window_widgets->add_dock(d->ui->recording);
237+
d->main_window_widgets->add_dock(d->ui->histogram);
238+
239+
d->main_window_widgets->load();
240+
249241
qDebug() << "file " << logFilePath << "exists: " << QFile::exists(logFilePath);
250242
d->ui->actionOpen_log_file_folder->setMenuRole(QAction::ApplicationSpecificRole);
251243
d->ui->actionOpen_log_file_folder->setVisible( ! logFilePath.isEmpty() && QFile::exists(logFilePath));
@@ -269,8 +261,6 @@ PlanetaryImagerMainWindow::PlanetaryImagerMainWindow(
269261
#endif
270262
});
271263

272-
connect(d->ui->actionHide_all, &QAction::triggered, [=]{ for_each(begin(dock_widgets), end(dock_widgets), bind(&QWidget::hide, _1) ); });
273-
connect(d->ui->actionShow_all, &QAction::triggered, [=]{ for_each(begin(dock_widgets), end(dock_widgets), bind(&QWidget::show, _1) ); });
274264
connect(MessagesLogger::instance(), &MessagesLogger::message, this, bind(&PlanetaryImagerMainWindow::notify, this, _1, _2, _3, _4), Qt::QueuedConnection);
275265
connect(d->displayImage.get(), &DisplayImage::gotImage, this, bind(&ZoomableImage::setImage, d->image_widget, _1), Qt::QueuedConnection);
276266

@@ -332,8 +322,15 @@ PlanetaryImagerMainWindow::PlanetaryImagerMainWindow(
332322
d->rescan_devices();
333323
}
334324

325+
void PlanetaryImagerMainWindow::showEvent(QShowEvent *event)
326+
{
327+
QMainWindow::showEvent(event);
328+
}
329+
335330
void PlanetaryImagerMainWindow::closeEvent(QCloseEvent* event)
336331
{
332+
d->main_window_widgets->save();
333+
d->saveWindowGeometry();
337334
QMainWindow::closeEvent(event);
338335
emit quit();
339336
}

src/planetaryimager_mainwindow.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public slots:
5757
void notify(const QDateTime &when, MessagesLogger::Type notification_type, const QString &title, const QString &message);
5858
protected:
5959
void closeEvent(QCloseEvent *event) override;
60+
void showEvent(QShowEvent *event) override;
6061
signals:
6162
void quit();
6263
void imagerChanged();

src/planetaryimager_mainwindow.ui

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<x>0</x>
2727
<y>0</y>
2828
<width>997</width>
29-
<height>30</height>
29+
<height>27</height>
3030
</rect>
3131
</property>
3232
<widget class="QMenu" name="menuDevice">
@@ -46,18 +46,6 @@
4646
<addaction name="menu_device_load"/>
4747
<addaction name="actionDisconnect"/>
4848
</widget>
49-
<widget class="QMenu" name="menuPanels">
50-
<property name="title">
51-
<string>Pa&amp;nels</string>
52-
</property>
53-
<addaction name="separator"/>
54-
<addaction name="actionChip_Info"/>
55-
<addaction name="actionCamera_Settings"/>
56-
<addaction name="actionRecording"/>
57-
<addaction name="actionHistogram"/>
58-
<addaction name="actionHide_all"/>
59-
<addaction name="actionShow_all"/>
60-
</widget>
6149
<widget class="QMenu" name="menuView">
6250
<property name="title">
6351
<string>V&amp;iew</string>
@@ -84,11 +72,16 @@
8472
<addaction name="actionAbout_Qt"/>
8573
<addaction name="actionQuit"/>
8674
</widget>
75+
<widget class="QMenu" name="menuWindow">
76+
<property name="title">
77+
<string>Window</string>
78+
</property>
79+
</widget>
80+
<addaction name="menuPlanetary_Imager"/>
8781
<addaction name="menuDevice"/>
88-
<addaction name="menuPanels"/>
8982
<addaction name="menuView"/>
9083
<addaction name="menuROI"/>
91-
<addaction name="menuPlanetary_Imager"/>
84+
<addaction name="menuWindow"/>
9285
</widget>
9386
<widget class="QStatusBar" name="statusbar"/>
9487
<widget class="QDockWidget" name="chipInfoWidget">
@@ -134,7 +127,7 @@
134127
<x>0</x>
135128
<y>0</y>
136129
<width>80</width>
137-
<height>162</height>
130+
<height>165</height>
138131
</rect>
139132
</property>
140133
</widget>

0 commit comments

Comments
 (0)