From 170adfd00c09c4fb285f5d09d586e6f713b714e8 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Sat, 27 Apr 2019 22:32:39 +0200 Subject: [PATCH] Save geometry, tabbar and playlist on exit only, fix loading tabs in correct order --- src/core/mainwindow.cpp | 53 ++++-------- src/core/mainwindow.h | 4 - src/playlist/playlistview.cpp | 26 ++---- src/playlist/playlistview.h | 5 +- src/widgets/fancytabwidget.cpp | 146 ++++++++++++++++++++++----------- src/widgets/fancytabwidget.h | 19 +++-- 6 files changed, 135 insertions(+), 118 deletions(-) diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index cd5361cec..7d6cf0f5c 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -255,22 +255,22 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co StyleHelper::setBaseColor(palette().color(QPalette::Highlight).darker()); // Add tabs to the fancy tab widget - ui_->tabs->addTab(context_view_, IconLoader::Load("strawberry"), tr("Context")); - ui_->tabs->addTab(collection_view_, IconLoader::Load("vinyl"), tr("Collection")); - ui_->tabs->addTab(file_view_, IconLoader::Load("document-open"), tr("Files")); - ui_->tabs->addTab(playlist_list_, IconLoader::Load("view-media-playlist"), tr("Playlists")); - ui_->tabs->addTab(queue_view_, IconLoader::Load("footsteps"), tr("Queue")); + ui_->tabs->AddTab(context_view_, "context", IconLoader::Load("strawberry"), tr("Context")); + ui_->tabs->AddTab(collection_view_, "collection", IconLoader::Load("vinyl"), tr("Collection")); + ui_->tabs->AddTab(file_view_, "files", IconLoader::Load("document-open"), tr("Files")); + ui_->tabs->AddTab(playlist_list_, "playlists", IconLoader::Load("view-media-playlist"), tr("Playlists")); + ui_->tabs->AddTab(queue_view_, "queue", IconLoader::Load("footsteps"), tr("Queue")); #ifndef Q_OS_WIN - ui_->tabs->addTab(device_view_, IconLoader::Load("device"), tr("Devices")); + ui_->tabs->AddTab(device_view_, "devices", IconLoader::Load("device"), tr("Devices")); #endif #ifdef HAVE_TIDAL - ui_->tabs->addTab(tidal_search_view_, IconLoader::Load("tidal"), tr("Tidal")); + ui_->tabs->AddTab(tidal_search_view_, "tidal", IconLoader::Load("tidal"), tr("Tidal")); #endif // Add the playing widget to the fancy tab widget ui_->tabs->addBottomWidget(ui_->widget_playing); //ui_->tabs->SetBackgroundPixmap(QPixmap(":/pictures/strawberry-background.png")); - ui_->tabs->loadSettings(kSettingsGroup); + ui_->tabs->Load(kSettingsGroup); track_position_timer_->setInterval(kTrackPositionUpdateTimeMs); connect(track_position_timer_, SIGNAL(timeout()), SLOT(UpdateTrackPosition())); @@ -656,9 +656,7 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co #endif // Fancy tabs - connect(ui_->tabs, SIGNAL(ModeChanged(FancyTabWidget::Mode)), SLOT(SaveTabMode())); connect(ui_->tabs, SIGNAL(CurrentChanged(int)), SLOT(TabSwitched())); - connect(ui_->tabs, SIGNAL(CurrentChanged(int)), SLOT(SaveGeometry())); // Context connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), context_view_, SLOT(SongChanged(Song))); @@ -744,6 +742,7 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co FancyTabWidget::Mode tab_mode = FancyTabWidget::Mode(tab_mode_int); if (tab_mode == FancyTabWidget::Mode_None) tab_mode = default_mode; ui_->tabs->SetMode(tab_mode); + file_view_->SetPath(settings_.value("file_path", QDir::homePath()).toString()); TabSwitched(); @@ -808,7 +807,6 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co } MainWindow::~MainWindow() { - SaveGeometry(); delete ui_; } @@ -857,9 +855,9 @@ void MainWindow::ReloadSettings() { bool enable_tidal = settings.value("enabled", false).toBool(); settings.endGroup(); if (enable_tidal) - ui_->tabs->addTab(tidal_search_view_, IconLoader::Load("tidal"), tr("Tidal")); + ui_->tabs->EnableTab(tidal_search_view_); else - ui_->tabs->delTab("Tidal"); + ui_->tabs->DisableTab(tidal_search_view_); #endif } @@ -1004,16 +1002,6 @@ void MainWindow::TrackSkipped(PlaylistItemPtr item) { } -void MainWindow::changeEvent(QEvent *event) { - if (!initialised_) return; - SaveGeometry(); -} - -void MainWindow::resizeEvent(QResizeEvent *event) { - if (!initialised_) return; - SaveGeometry(); -} - void MainWindow::TabSwitched() { if (playing_widget_ && ui_->tabs->tabBar()->tabData(ui_->tabs->currentIndex()).toString().toLower() != "context") { @@ -1023,11 +1011,6 @@ void MainWindow::TabSwitched() { ui_->widget_playing->SetDisabled(); } - if (!initialised_) return; - - settings_.setValue("current_tab", ui_->tabs->currentIndex()); - ui_->tabs->saveSettings(kSettingsGroup); - } void MainWindow::SaveGeometry() { @@ -1039,16 +1022,9 @@ void MainWindow::SaveGeometry() { if (was_maximized_) settings_.remove("geometry"); else settings_.setValue("geometry", saveGeometry()); settings_.setValue("splitter_state", ui_->splitter->saveState()); - ui_->tabs->saveSettings(kSettingsGroup); } -void MainWindow::SaveTabMode() { - if (!initialised_) return; - settings_.setValue("tab_mode", ui_->tabs->mode()); - ui_->tabs->saveSettings(kSettingsGroup); -} - void MainWindow::SavePlaybackStatus() { QSettings settings; @@ -2223,6 +2199,9 @@ void MainWindow::Exit() { SaveGeometry(); SavePlaybackStatus(); + ui_->tabs->SaveSettings(kSettingsGroup); + ui_->playlist->view()->SaveSettings(); + ui_->playlist->view()->SaveGeometry(); app_->scrobbler()->WriteCache(); if (app_->player()->engine()->is_fadeout_enabled()) { @@ -2311,10 +2290,6 @@ void MainWindow::HandleNotificationPreview(OSD::Behaviour type, QString line1, Q } -void MainWindow::FocusCollectionTab() { - ui_->tabs->setCurrentWidget(collection_view_); -} - void MainWindow::ShowConsole() { Console *console = new Console(app_, this); console->show(); diff --git a/src/core/mainwindow.h b/src/core/mainwindow.h index daa5a865b..109998dab 100644 --- a/src/core/mainwindow.h +++ b/src/core/mainwindow.h @@ -115,8 +115,6 @@ class MainWindow : public QMainWindow, public PlatformInterface { protected: void keyPressEvent(QKeyEvent *event); - void changeEvent(QEvent *event); - void resizeEvent(QResizeEvent *event); void closeEvent(QCloseEvent *event); #ifdef Q_OS_WIN @@ -232,7 +230,6 @@ signals: void TabSwitched(); void SaveGeometry(); - void SaveTabMode(); void SavePlaybackStatus(); void LoadPlaybackStatus(); void ResumePlayback(); @@ -242,7 +239,6 @@ signals: void Exit(); void HandleNotificationPreview(OSD::Behaviour type, QString line1, QString line2); - void FocusCollectionTab(); void ShowConsole(); diff --git a/src/playlist/playlistview.cpp b/src/playlist/playlistview.cpp index 828256ca1..16f253187 100644 --- a/src/playlist/playlistview.cpp +++ b/src/playlist/playlistview.cpp @@ -143,7 +143,6 @@ PlaylistView::PlaylistView(QWidget *parent) background_initialized_(false), setting_initial_header_layout_(false), read_only_settings_(true), - header_loaded_(false), previous_background_image_opacity_(0.0), fade_animation_(new QTimeLine(1000, this)), force_background_redraw_(false), @@ -171,11 +170,6 @@ PlaylistView::PlaylistView(QWidget *parent) setStyle(style_); setMouseTracking(true); - connect(header_, SIGNAL(sectionResized(int,int,int)), SLOT(SaveGeometry())); - connect(header_, SIGNAL(sectionMoved(int,int,int)), SLOT(SaveGeometry())); - connect(header_, SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), SLOT(SaveGeometry())); - connect(header_, SIGNAL(SectionVisibilityChanged(int,bool)), SLOT(SaveGeometry())); - connect(header_, SIGNAL(sectionResized(int,int,int)), SLOT(InvalidateCachedCurrentPixmap())); connect(header_, SIGNAL(sectionMoved(int,int,int)), SLOT(InvalidateCachedCurrentPixmap())); connect(header_, SIGNAL(SectionVisibilityChanged(int,bool)), SLOT(InvalidateCachedCurrentPixmap())); @@ -205,7 +199,6 @@ PlaylistView::PlaylistView(QWidget *parent) } PlaylistView::~PlaylistView() { - SaveGeometry(); delete style_; } @@ -294,10 +287,11 @@ void PlaylistView::setModel(QAbstractItemModel *m) { void PlaylistView::LoadGeometry() { - QSettings settings; - settings.beginGroup(Playlist::kSettingsGroup); + QSettings s; + s.beginGroup(Playlist::kSettingsGroup); + QByteArray state(s.value("state").toByteArray()); + s.endGroup(); - QByteArray state(settings.value("state").toByteArray()); if (!header_->RestoreState(state)) { // Maybe we're upgrading from a version that persisted the state with QHeaderView. if (!header_->restoreState(state)) { @@ -340,8 +334,6 @@ void PlaylistView::LoadGeometry() { header_->ShowSection(Playlist::Column_Title); } - header_loaded_ = true; - } void PlaylistView::SaveGeometry() { @@ -1117,7 +1109,6 @@ void PlaylistView::StretchChanged(bool stretch) { if (!initialized_) return; setHorizontalScrollBarPolicy(stretch ? Qt::ScrollBarAlwaysOff : Qt::ScrollBarAsNeeded); - SaveGeometry(); } @@ -1298,15 +1289,14 @@ void PlaylistView::ResetColumns() { read_only_settings_ = true; setting_initial_header_layout_ = true; - QSettings settings; - settings.beginGroup(Playlist::kSettingsGroup); - settings.remove("state"); - settings.endGroup(); + QSettings s; + s.beginGroup(Playlist::kSettingsGroup); + s.remove("state"); + s.endGroup(); ReloadSettings(); LoadGeometry(); ReloadSettings(); read_only_settings_ = false; - SaveGeometry(); SetPlaylist(playlist_); } diff --git a/src/playlist/playlistview.h b/src/playlist/playlistview.h index 6ec6282b8..d3c0f6796 100644 --- a/src/playlist/playlistview.h +++ b/src/playlist/playlistview.h @@ -113,9 +113,11 @@ class PlaylistView : public QTreeView { void setModel(QAbstractItemModel *model); void ResetColumns(); + void SaveGeometry(); public slots: void ReloadSettings(); + void SaveSettings(); void StopGlowing(); void StartGlowing(); void JumpToCurrentlyPlayingTrack(); @@ -164,14 +166,12 @@ class PlaylistView : public QTreeView { private slots: void LoadGeometry(); - void SaveGeometry(); void GlowIntensityChanged(); void InhibitAutoscrollTimeout(); void MaybeAutoscroll(); void InvalidateCachedCurrentPixmap(); void PlaylistDestroyed(); - void SaveSettings(); void StretchChanged(bool stretch); void FadePreviousBackgroundImage(qreal value); @@ -217,7 +217,6 @@ class PlaylistView : public QTreeView { bool background_initialized_; bool setting_initial_header_layout_; bool read_only_settings_; - bool header_loaded_; QImage background_image_; QImage current_song_cover_art_; diff --git a/src/widgets/fancytabwidget.cpp b/src/widgets/fancytabwidget.cpp index bdee7d9b3..1bb346780 100644 --- a/src/widgets/fancytabwidget.cpp +++ b/src/widgets/fancytabwidget.cpp @@ -25,6 +25,7 @@ #include +#include #include #include #include @@ -283,18 +284,62 @@ class FancyTabBar: public QTabBar { }; +class TabData : public QObject { + + public: + TabData(QWidget *widget_view, const QString name, const QIcon icon, const QString label, const bool enabled, QWidget *parent) : + QObject(parent), + widget_view_(widget_view), + name_(name), icon_(icon), + label_(label), + page_(new QWidget()), + enabled_(enabled) { + // In order to achieve the same effect as the "Bottom Widget" of the old Nokia based FancyTabWidget a VBoxLayout is used on each page + QVBoxLayout *layout = new QVBoxLayout(page_); + layout->setSpacing(0); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(widget_view_); + page_->setLayout(layout); + } + ~TabData() { + //delete page_; + } + + QWidget *widget_view() { return widget_view_; } + QString name() { return name_; } + QIcon icon() { return icon_; } + QString label() { return label_; } + QWidget *page() { return page_; } + bool enabled() { return enabled_; } + + void set_enabled(bool enabled) { enabled_ = enabled; } + + private: + QWidget *widget_view_; + QString name_; + QIcon icon_; + QString label_; + QWidget *page_; + bool enabled_; + +}; + +FancyTabWidget::~FancyTabWidget() {} + // Spacers are just disabled pages void FancyTabWidget::addSpacer() { QWidget *spacer = new QWidget(this); - const int index = addTab(spacer, QIcon(), QString()); + const int index = insertTab(count(), spacer, QIcon(), QString()); setTabEnabled(index, false); } void FancyTabWidget::setBackgroundPixmap(const QPixmap& pixmap) { + background_pixmap_ = pixmap; update(); + } void FancyTabWidget::setCurrentIndex(int index) { @@ -332,80 +377,85 @@ FancyTabWidget::FancyTabWidget(QWidget* parent) : QTabWidget(parent), } -void FancyTabWidget::loadSettings(const char *kSettingsGroup) { +void FancyTabWidget::Load(const QString &kSettingsGroup) { - QSettings settings; - settings.beginGroup(kSettingsGroup); - - for (int i = 0 ; i < count() ; i++) { - QString k = "tab_" + tabBar()->tabData(i).toString().toLower(); - int index = settings.value(k, i).toInt(); - if (index >= 0) { - tabBar()->moveTab(i, index); - } + QSettings s; + s.beginGroup(kSettingsGroup); + QMap tabs; + for (TabData *tab : tabs_) { + const int idx = s.value("tab_" + tab->name(), tabs_.count()).toInt(); + tabs.insert(idx, tab); } + s.endGroup(); - settings.endGroup(); + QMap ::iterator i; + for (i = tabs.begin() ; i != tabs.end() ; ++i) { + TabData *tab = i.value(); + const int actualIndex = insertTab(i.key(), tab->page(), tab->icon(), tab->label()); + tabBar()->setTabData(actualIndex, QVariant(tab->name())); + tab->set_enabled(true); + } } -void FancyTabWidget::saveSettings(const char *kSettingsGroup) { +int FancyTabWidget::insertTab(int index, QWidget *page, const QIcon &icon, const QString &label) { + return QTabWidget::insertTab(index, page, icon, label); +} - QSettings settings; - settings.beginGroup(kSettingsGroup); +void FancyTabWidget::SaveSettings(const QString &kSettingsGroup) { + + QSettings s; + s.beginGroup(kSettingsGroup); + + s.setValue("tab_mode", mode_); + s.setValue("current_tab", currentIndex()); for (int i = 0 ; i < count() ; i++) { QString k = "tab_" + tabBar()->tabData(i).toString().toLower(); - settings.setValue(k, i); + s.setValue(k, i); } - settings.endGroup(); + s.endGroup(); } -void FancyTabWidget::addBottomWidget(QWidget* widget_view) { +void FancyTabWidget::addBottomWidget(QWidget *widget_view) { bottom_widget_ = widget_view; } -int FancyTabWidget::addTab(QWidget *widget_view, const QIcon &icon, const QString &label) { - return insertTab(count(), widget_view, icon, label); -} +void FancyTabWidget::AddTab(QWidget *widget_view, const QString &name, const QIcon &icon, const QString &label) { -int FancyTabWidget::insertTab(int index, QWidget *widget_view, const QIcon &icon, const QString &label) { - - QWidget *page(nullptr); - if (tabs_.contains(label)) page = tabs_.value(label); - else { - page = new QWidget(this); - // In order to achieve the same effect as the "Bottom Widget" of the old Nokia based FancyTabWidget a VBoxLayout is used on each page - QVBoxLayout *layout = new QVBoxLayout(this); - layout->setSpacing(0); - layout->setContentsMargins(0, 0, 0, 0); - layout->addWidget(widget_view); - page->setLayout(layout); - tabs_.insert(label, page); - } - - for (int i = 0 ; i < count() ; i++) { - QString l = tabBar()->tabData(i).toString(); - if (l == label) return i; - } - - const int actualIndex = QTabWidget::insertTab(index, page, icon, label); - tabBar()->setTabData(actualIndex, QVariant(label)); - return actualIndex; + TabData *tab = new TabData(widget_view, name, icon, label, false, this); + tabs_.insert(widget_view, tab); } -void FancyTabWidget::delTab(const QString &label) { +bool FancyTabWidget::EnableTab(QWidget *widget_view) { + + if (!tabs_.contains(widget_view)) return false; + TabData *tab = tabs_.value(widget_view); + if (tab->enabled()) return true; + const int actualIndex = QTabWidget::insertTab(count(), tab->page(), tab->icon(), tab->label()); + tabBar()->setTabData(actualIndex, QVariant(tab->name())); + tab->set_enabled(true); + + return true; + +} + +bool FancyTabWidget::DisableTab(QWidget *widget_view) { + + if (!tabs_.contains(widget_view)) return false; + TabData *tab = tabs_.value(widget_view); for (int i = 0 ; i < count() ; i++) { - QString l = tabBar()->tabData(i).toString(); - if (l == label) { + if (tabBar()->tabData(i).toString() == tab->name()) { removeTab(i); - break; + tab->set_enabled(false); + return true; } } + return false; } diff --git a/src/widgets/fancytabwidget.h b/src/widgets/fancytabwidget.h index 3c4d8d0dd..c6d440530 100644 --- a/src/widgets/fancytabwidget.h +++ b/src/widgets/fancytabwidget.h @@ -30,28 +30,35 @@ #include #include #include +#include +#include #include #include #include +class TabData; + namespace Core { namespace Internal { class FancyTabWidget : public QTabWidget { Q_OBJECT + ~FancyTabWidget(); + public: FancyTabWidget(QWidget* parent = 0); - int addTab(QWidget *widget_view, const QIcon &icon, const QString &label); - void delTab(const QString &label); - int insertTab(int index, QWidget *widget_view, const QIcon &icon, const QString &label); + void AddTab(QWidget *widget_view, const QString &name, const QIcon &icon, const QString &label); + bool EnableTab(QWidget *widget_view); + bool DisableTab(QWidget *widget_view); + int insertTab(int index, QWidget *page, const QIcon &icon, const QString &label); void addBottomWidget(QWidget* widget_view); void setBackgroundPixmap(const QPixmap& pixmap); void addSpacer(); - void loadSettings(const char *); - void saveSettings(const char *); + void Load(const QString &kSettingsGroup); + void SaveSettings(const QString &kSettingsGroup); // Values are persisted - only add to the end enum Mode { @@ -95,7 +102,7 @@ class FancyTabWidget : public QTabWidget { Mode mode_; QWidget *bottom_widget_; - QHash tabs_; + QMap tabs_; };