mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-13 16:18:42 +00:00
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:
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);*/
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -86,7 +86,6 @@ class LTMSidebar : public QWidget
|
||||
|
||||
// gui components
|
||||
void setSummary(DateRange);
|
||||
void splitterMoved(int, int);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@@ -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*/)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user