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.
This commit is contained in:
Mark Liversedge
2013-03-02 22:52:41 +00:00
parent 25121f515f
commit dbd21d35e4
10 changed files with 57 additions and 53 deletions

View File

@@ -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());
}

View File

@@ -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);

View File

@@ -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; i<splitter->count(); 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; i<splitter->count(); 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);*/
}

View File

@@ -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;
};

View File

@@ -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());
}

View File

@@ -86,7 +86,6 @@ class LTMSidebar : public QWidget
// gui components
void setSummary(DateRange);
void splitterMoved(int, int);
private:

View File

@@ -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*/)
{

View File

@@ -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();

View File

@@ -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"

View File

@@ -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