From dbd21d35e4e628be13e054120d27099fe45d1b13 Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Sat, 2 Mar 2013 22:52:41 +0000 Subject: [PATCH] UI Nits: Sidebar remember their state Rather than relying on the parent to maintain the splitter sizes and states, the GcSplitter remembers its own state and sizing. This includes remembering if the children have been hidden via the icon bar at the bottom of the splitter. --- src/GcCalendar.cpp | 16 ++------------- src/GcCalendar.h | 3 --- src/GcSideBarItem.cpp | 45 +++++++++++++++++++++++++++++++++++++++++-- src/GcSideBarItem.h | 11 +++++++++-- src/LTMSidebar.cpp | 14 +------------- src/LTMSidebar.h | 1 - src/MainWindow.cpp | 14 +------------- src/MainWindow.h | 1 - src/Settings.h | 4 ---- src/TrainTool.cpp | 1 + 10 files changed, 57 insertions(+), 53 deletions(-) diff --git a/src/GcCalendar.cpp b/src/GcCalendar.cpp index f0f8a4b50..bbe6d12cb 100644 --- a/src/GcCalendar.cpp +++ b/src/GcCalendar.cpp @@ -37,7 +37,6 @@ GcCalendar::GcCalendar(MainWindow *main) : main(main) // Splitter - cal at top, summary at bottom splitter = new GcSplitter(Qt::Vertical); mainLayout->addWidget(splitter); - connect(splitter,SIGNAL(splitterMoved(int,int)), this, SLOT(splitterMoved(int,int))); // calendar calendarItem = new GcSplitterItem(tr("Calendar"), iconFromPNG(":images/sidebar/calendar.png"), this); @@ -62,6 +61,8 @@ GcCalendar::GcCalendar(MainWindow *main) : main(main) splitter->addWidget(calendarItem); splitter->addWidget(summaryItem); + splitter->prepare(main->cyclist, "diary"); + black.setColor(QPalette::WindowText, Qt::gray); white.setColor(QPalette::WindowText, Qt::white); grey.setColor(QPalette::WindowText, Qt::gray); @@ -272,13 +273,6 @@ GcCalendar::GcCalendar(MainWindow *main) : main(main) slayout->addWidget(summary); slayout->addStretch(); - // restore splitter - QVariant splitterSizes = appsettings->cvalue(main->cyclist, GC_SETTINGS_CALSPLITTER_SIZES); - if (splitterSizes != QVariant()) { - splitter->restoreState(splitterSizes.toByteArray()); - splitter->setOpaqueResize(true); // redraw when released, snappier UI - } - // summary mode changed connect(summarySelect, SIGNAL(currentIndexChanged(int)), this, SLOT(refresh())); @@ -708,9 +702,3 @@ GcCalendar::setSummary() } } - -void -GcCalendar::splitterMoved(int /*pos*/, int /*index*/) -{ - appsettings->setCValue(main->cyclist, GC_SETTINGS_CALSPLITTER_SIZES, splitter->saveState()); -} diff --git a/src/GcCalendar.h b/src/GcCalendar.h index 38b40bcca..0d8e76e27 100644 --- a/src/GcCalendar.h +++ b/src/GcCalendar.h @@ -85,9 +85,6 @@ class GcCalendar : public QWidget // not a GcWindow - belongs on sidebar bool event(QEvent *e); void setSummary(); // set the summary at the bottom - // summary metrics aggregator -- refactor later - void splitterMoved(int pos, int index); - signals: void dateRangeChanged(DateRange); diff --git a/src/GcSideBarItem.cpp b/src/GcSideBarItem.cpp index fe50522c9..476c50b61 100644 --- a/src/GcSideBarItem.cpp +++ b/src/GcSideBarItem.cpp @@ -55,6 +55,46 @@ GcSplitter::GcSplitter(Qt::Orientation orientation, QWidget *parent) : QWidget(p connect(splitter,SIGNAL(splitterMoved(int,int)), this, SLOT(subSplitterMoved(int,int))); } +void +GcSplitter::prepare(QString cyclist, QString name) +{ + this->name = name; + this->cyclist = cyclist; + + // get saved state + QString statesetting = QString("splitter/%1/sizes").arg(name); + QVariant sizes = appsettings->cvalue(cyclist, statesetting); + if (sizes != QVariant()) { + splitter->restoreState(sizes.toByteArray()); + splitter->setOpaqueResize(true); // redraw when released, snappier UI + } + + // should we hide / show each widget? + for(int i=0; icount(); i++) { + QString hidesetting = QString("splitter/%1/hide/%2").arg(name).arg(i); + QVariant hidden = appsettings->cvalue(cyclist, hidesetting); + if (i && hidden != QVariant()) { + if (hidden.toBool() == true) { + splitter->widget(i)->hide(); + } + } + } +} + +void +GcSplitter::saveSettings() +{ + // get saved state + QString statesetting = QString("splitter/%1/sizes").arg(name); + appsettings->setCValue(cyclist, statesetting, splitter->saveState()); + + // should we hide / show each widget? + for(int i=0; icount(); i++) { + QString hidesetting = QString("splitter/%1/hide/%2").arg(name).arg(i); + appsettings->setCValue(cyclist, hidesetting, QVariant(splitter->widget(i)->isHidden())); + } +} + void GcSplitter::setOpaqueResize(bool opaque) { @@ -88,6 +128,7 @@ GcSplitter::restoreState(const QByteArray &state) void GcSplitter::subSplitterMoved(int pos, int index) { + saveSettings(); emit splitterMoved(pos, index); } @@ -103,7 +144,7 @@ GcSplitter::insertWidget(int index, QWidget *widget) splitter->insertWidget(index, widget); } -GcSubSplitter::GcSubSplitter(Qt::Orientation orientation, GcSplitterControl *control, QWidget *parent) : QSplitter(orientation, parent), control(control) +GcSubSplitter::GcSubSplitter(Qt::Orientation orientation, GcSplitterControl *control, GcSplitter *parent) : QSplitter(orientation, parent), control(control), gcSplitter (parent) { _insertedWidget = NULL; @@ -144,6 +185,7 @@ GcSubSplitter::createHandle() control->addAction(_item->controlAction); connect(_item->controlAction, SIGNAL(triggered(void)), _item, SLOT(selectHandle(void))); + connect(_item->controlAction, SIGNAL(triggered(void)), gcSplitter, SLOT(saveSettings())); return _item->splitterHandle; } } @@ -341,7 +383,6 @@ GcSplitterControl::selectAction() { this->setVisible(!this->isVisible()); - /*this->setBaseSize(width(), parentWidget()->height()); this->setMaximumSize(QWIDGETSIZE_MAX,QWIDGETSIZE_MAX);*/ } diff --git a/src/GcSideBarItem.h b/src/GcSideBarItem.h index 02b0e0475..06e7fbdbd 100644 --- a/src/GcSideBarItem.h +++ b/src/GcSideBarItem.h @@ -45,15 +45,21 @@ public: QByteArray saveState() const; bool restoreState(const QByteArray &state); -Q_SIGNALS: + void prepare(QString cyclist, QString name); // get ready for first show, you're now configured + // I'm gonna call you "name" -- which is used to + // save and restore state + +signals: void splitterMoved(int pos, int index); public slots: void subSplitterMoved(int pos, int index); + void saveSettings(); private: GcSubSplitter *splitter; GcSplitterControl *control; + QString cyclist, name; }; class GcSubSplitter : public QSplitter @@ -61,7 +67,7 @@ class GcSubSplitter : public QSplitter Q_OBJECT public: - GcSubSplitter(Qt::Orientation orientation, GcSplitterControl *control, QWidget *parent = 0); + GcSubSplitter(Qt::Orientation orientation, GcSplitterControl *control, GcSplitter *parent); void addWidget(QWidget *widget); void insertWidget(int index, QWidget *widget); @@ -74,6 +80,7 @@ private: QWidget * _insertedWidget; GcSplitterControl *control; + GcSplitter *gcSplitter; }; diff --git a/src/LTMSidebar.cpp b/src/LTMSidebar.cpp index f6d574b76..7225ca3e1 100644 --- a/src/LTMSidebar.cpp +++ b/src/LTMSidebar.cpp @@ -117,7 +117,6 @@ LTMSidebar::LTMSidebar(MainWindow *parent, const QDir &home) : QWidget(parent), splitter = new GcSplitter(Qt::Vertical); splitter->addWidget(seasonsWidget); splitter->addWidget(eventsWidget); - connect(splitter,SIGNAL(splitterMoved(int,int)), this, SLOT(splitterMoved(int,int))); GcSplitterItem *summaryWidget = new GcSplitterItem(tr("Summary"), iconFromPNG(":images/sidebar/dashboard.png"), this); @@ -136,12 +135,7 @@ LTMSidebar::LTMSidebar(MainWindow *parent, const QDir &home) : QWidget(parent), mainLayout->addWidget(splitter); - // restore splitter - QVariant splitterSizes = appsettings->cvalue(main->cyclist, GC_SETTINGS_LTMSPLITTER_SIZES); - if (splitterSizes != QVariant()) { - splitter->restoreState(splitterSizes.toByteArray()); - splitter->setOpaqueResize(true); // redraw when released, snappier UI - } + splitter->prepare(main->cyclist, "LTM"); // our date ranges connect(dateRangeTree,SIGNAL(itemSelectionChanged()), this, SLOT(dateRangeTreeWidgetSelectionChanged())); @@ -717,9 +711,3 @@ LTMSidebar::setSummary(DateRange dateRange) } } - -void -LTMSidebar::splitterMoved(int, int) -{ - appsettings->setCValue(main->cyclist, GC_SETTINGS_LTMSPLITTER_SIZES, splitter->saveState()); -} diff --git a/src/LTMSidebar.h b/src/LTMSidebar.h index 07275cfe0..ef5128c3b 100644 --- a/src/LTMSidebar.h +++ b/src/LTMSidebar.h @@ -86,7 +86,6 @@ class LTMSidebar : public QWidget // gui components void setSummary(DateRange); - void splitterMoved(int, int); private: diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index d3c92b7d4..cb60109e0 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -667,12 +667,7 @@ MainWindow::MainWindow(const QDir &home) : analSidebar = new GcSplitter(Qt::Vertical); analSidebar->addWidget(analItem); analSidebar->addWidget(intervalItem); - - QVariant analSplitterSizes = appsettings->cvalue(cyclist, GC_SETTINGS_INTERVALSPLITTER_SIZES); - if (analSplitterSizes != QVariant()) { - analSidebar->restoreState(analSplitterSizes.toByteArray()); - analSidebar->setOpaqueResize(true); // redraw when released, snappier UI - } + analSidebar->prepare(cyclist, "analysis"); QTreeWidgetItem *last = NULL; QStringListIterator i(RideFileFactory::instance().listRideFiles(home)); @@ -994,7 +989,6 @@ MainWindow::MainWindow(const QDir &home) : connect(intervalWidget,SIGNAL(itemSelectionChanged()), this, SLOT(intervalTreeWidgetSelectionChanged())); connect(intervalWidget,SIGNAL(itemChanged(QTreeWidgetItem *,int)), this, SLOT(intervalEdited(QTreeWidgetItem*, int))); connect(splitter,SIGNAL(splitterMoved(int,int)), this, SLOT(splitterMoved(int,int))); - connect(analSidebar,SIGNAL(splitterMoved(int,int)), this, SLOT(analSidebarMoved(int,int))); connect(this, SIGNAL(rideDirty()), this, SLOT(enableSaveButton())); connect(this, SIGNAL(rideClean()), this, SLOT(enableSaveButton())); @@ -1386,12 +1380,6 @@ MainWindow::resizeEvent(QResizeEvent*) #endif } -void -MainWindow::analSidebarMoved(int /* pos */, int /*index*/) -{ - appsettings->setCValue(cyclist, GC_SETTINGS_INTERVALSPLITTER_SIZES, analSidebar->saveState()); -} - void MainWindow::splitterMoved(int pos, int /*index*/) { diff --git a/src/MainWindow.h b/src/MainWindow.h index a5bfcb72b..37fc8d0cc 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -277,7 +277,6 @@ class MainWindow : public QMainWindow void rideTreeWidgetSelectionChanged(); void intervalTreeWidgetSelectionChanged(); void splitterMoved(int, int); - void analSidebarMoved(int, int); void newCyclist(); void openCyclist(); void downloadRide(); diff --git a/src/Settings.h b/src/Settings.h index 0c5d05a2e..b0186a9e3 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -29,11 +29,7 @@ #define GC_SETTINGS_MAIN_X "mainwindow/x" #define GC_SETTINGS_MAIN_Y "mainwindow/y" #define GC_SETTINGS_MAIN_GEOM "mainwindow/geometry" -#define GC_SETTINGS_CALSPLITTER_SIZES "mainwindow/calSideBarSizes" -#define GC_SETTINGS_LTMSPLITTER_SIZES "mainwindow/ltmSideBarSizes" -#define GC_SETTINGS_INTERVALSPLITTER_SIZES "mainwindow/analSideBarSizes" #define GC_SETTINGS_SPLITTER_SIZES "mainwindow/splitterSizes" -#define GC_SETTINGS_SUMMARYSPLITTER_SIZES "mainwindow/summarysplittersizes" #define GC_SETTINGS_CALENDAR_SIZES "mainwindow/calendarSizes" #define GC_TABS_TO_HIDE "mainwindow/tabsToHide" #define GC_ELEVATION_HYSTERESIS "elevationHysteresis" diff --git a/src/TrainTool.cpp b/src/TrainTool.cpp index 27339a3d9..4ddffec93 100644 --- a/src/TrainTool.cpp +++ b/src/TrainTool.cpp @@ -296,6 +296,7 @@ TrainTool::TrainTool(MainWindow *parent, const QDir &home) : GcWindow(parent), h mediaItem->addWidget(mediaTree); trainSplitter->addWidget(mediaItem); #endif + trainSplitter->prepare(main->cyclist, "train"); #ifdef Q_OS_MAC // get rid of annoying focus rectangle for sidebar components