Save geometry, tabbar and playlist on exit only, fix loading tabs in

correct order
This commit is contained in:
Jonas Kvinge
2019-04-27 22:32:39 +02:00
parent d0135a5ff7
commit 170adfd00c
6 changed files with 135 additions and 118 deletions

View File

@@ -255,22 +255,22 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co
StyleHelper::setBaseColor(palette().color(QPalette::Highlight).darker()); StyleHelper::setBaseColor(palette().color(QPalette::Highlight).darker());
// Add tabs to the fancy tab widget // Add tabs to the fancy tab widget
ui_->tabs->addTab(context_view_, IconLoader::Load("strawberry"), tr("Context")); ui_->tabs->AddTab(context_view_, "context", IconLoader::Load("strawberry"), tr("Context"));
ui_->tabs->addTab(collection_view_, IconLoader::Load("vinyl"), tr("Collection")); ui_->tabs->AddTab(collection_view_, "collection", IconLoader::Load("vinyl"), tr("Collection"));
ui_->tabs->addTab(file_view_, IconLoader::Load("document-open"), tr("Files")); ui_->tabs->AddTab(file_view_, "files", IconLoader::Load("document-open"), tr("Files"));
ui_->tabs->addTab(playlist_list_, IconLoader::Load("view-media-playlist"), tr("Playlists")); ui_->tabs->AddTab(playlist_list_, "playlists", IconLoader::Load("view-media-playlist"), tr("Playlists"));
ui_->tabs->addTab(queue_view_, IconLoader::Load("footsteps"), tr("Queue")); ui_->tabs->AddTab(queue_view_, "queue", IconLoader::Load("footsteps"), tr("Queue"));
#ifndef Q_OS_WIN #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 #endif
#ifdef HAVE_TIDAL #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 #endif
// Add the playing widget to the fancy tab widget // Add the playing widget to the fancy tab widget
ui_->tabs->addBottomWidget(ui_->widget_playing); ui_->tabs->addBottomWidget(ui_->widget_playing);
//ui_->tabs->SetBackgroundPixmap(QPixmap(":/pictures/strawberry-background.png")); //ui_->tabs->SetBackgroundPixmap(QPixmap(":/pictures/strawberry-background.png"));
ui_->tabs->loadSettings(kSettingsGroup); ui_->tabs->Load(kSettingsGroup);
track_position_timer_->setInterval(kTrackPositionUpdateTimeMs); track_position_timer_->setInterval(kTrackPositionUpdateTimeMs);
connect(track_position_timer_, SIGNAL(timeout()), SLOT(UpdateTrackPosition())); connect(track_position_timer_, SIGNAL(timeout()), SLOT(UpdateTrackPosition()));
@@ -656,9 +656,7 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co
#endif #endif
// Fancy tabs // 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(TabSwitched()));
connect(ui_->tabs, SIGNAL(CurrentChanged(int)), SLOT(SaveGeometry()));
// Context // Context
connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), context_view_, SLOT(SongChanged(Song))); 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); FancyTabWidget::Mode tab_mode = FancyTabWidget::Mode(tab_mode_int);
if (tab_mode == FancyTabWidget::Mode_None) tab_mode = default_mode; if (tab_mode == FancyTabWidget::Mode_None) tab_mode = default_mode;
ui_->tabs->SetMode(tab_mode); ui_->tabs->SetMode(tab_mode);
file_view_->SetPath(settings_.value("file_path", QDir::homePath()).toString()); file_view_->SetPath(settings_.value("file_path", QDir::homePath()).toString());
TabSwitched(); TabSwitched();
@@ -808,7 +807,6 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co
} }
MainWindow::~MainWindow() { MainWindow::~MainWindow() {
SaveGeometry();
delete ui_; delete ui_;
} }
@@ -857,9 +855,9 @@ void MainWindow::ReloadSettings() {
bool enable_tidal = settings.value("enabled", false).toBool(); bool enable_tidal = settings.value("enabled", false).toBool();
settings.endGroup(); settings.endGroup();
if (enable_tidal) if (enable_tidal)
ui_->tabs->addTab(tidal_search_view_, IconLoader::Load("tidal"), tr("Tidal")); ui_->tabs->EnableTab(tidal_search_view_);
else else
ui_->tabs->delTab("Tidal"); ui_->tabs->DisableTab(tidal_search_view_);
#endif #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() { void MainWindow::TabSwitched() {
if (playing_widget_ && ui_->tabs->tabBar()->tabData(ui_->tabs->currentIndex()).toString().toLower() != "context") { if (playing_widget_ && ui_->tabs->tabBar()->tabData(ui_->tabs->currentIndex()).toString().toLower() != "context") {
@@ -1023,11 +1011,6 @@ void MainWindow::TabSwitched() {
ui_->widget_playing->SetDisabled(); ui_->widget_playing->SetDisabled();
} }
if (!initialised_) return;
settings_.setValue("current_tab", ui_->tabs->currentIndex());
ui_->tabs->saveSettings(kSettingsGroup);
} }
void MainWindow::SaveGeometry() { void MainWindow::SaveGeometry() {
@@ -1039,16 +1022,9 @@ void MainWindow::SaveGeometry() {
if (was_maximized_) settings_.remove("geometry"); if (was_maximized_) settings_.remove("geometry");
else settings_.setValue("geometry", saveGeometry()); else settings_.setValue("geometry", saveGeometry());
settings_.setValue("splitter_state", ui_->splitter->saveState()); 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() { void MainWindow::SavePlaybackStatus() {
QSettings settings; QSettings settings;
@@ -2223,6 +2199,9 @@ void MainWindow::Exit() {
SaveGeometry(); SaveGeometry();
SavePlaybackStatus(); SavePlaybackStatus();
ui_->tabs->SaveSettings(kSettingsGroup);
ui_->playlist->view()->SaveSettings();
ui_->playlist->view()->SaveGeometry();
app_->scrobbler()->WriteCache(); app_->scrobbler()->WriteCache();
if (app_->player()->engine()->is_fadeout_enabled()) { 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() { void MainWindow::ShowConsole() {
Console *console = new Console(app_, this); Console *console = new Console(app_, this);
console->show(); console->show();

View File

@@ -115,8 +115,6 @@ class MainWindow : public QMainWindow, public PlatformInterface {
protected: protected:
void keyPressEvent(QKeyEvent *event); void keyPressEvent(QKeyEvent *event);
void changeEvent(QEvent *event);
void resizeEvent(QResizeEvent *event);
void closeEvent(QCloseEvent *event); void closeEvent(QCloseEvent *event);
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@@ -232,7 +230,6 @@ signals:
void TabSwitched(); void TabSwitched();
void SaveGeometry(); void SaveGeometry();
void SaveTabMode();
void SavePlaybackStatus(); void SavePlaybackStatus();
void LoadPlaybackStatus(); void LoadPlaybackStatus();
void ResumePlayback(); void ResumePlayback();
@@ -242,7 +239,6 @@ signals:
void Exit(); void Exit();
void HandleNotificationPreview(OSD::Behaviour type, QString line1, QString line2); void HandleNotificationPreview(OSD::Behaviour type, QString line1, QString line2);
void FocusCollectionTab();
void ShowConsole(); void ShowConsole();

View File

@@ -143,7 +143,6 @@ PlaylistView::PlaylistView(QWidget *parent)
background_initialized_(false), background_initialized_(false),
setting_initial_header_layout_(false), setting_initial_header_layout_(false),
read_only_settings_(true), read_only_settings_(true),
header_loaded_(false),
previous_background_image_opacity_(0.0), previous_background_image_opacity_(0.0),
fade_animation_(new QTimeLine(1000, this)), fade_animation_(new QTimeLine(1000, this)),
force_background_redraw_(false), force_background_redraw_(false),
@@ -171,11 +170,6 @@ PlaylistView::PlaylistView(QWidget *parent)
setStyle(style_); setStyle(style_);
setMouseTracking(true); 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(sectionResized(int,int,int)), SLOT(InvalidateCachedCurrentPixmap()));
connect(header_, SIGNAL(sectionMoved(int,int,int)), SLOT(InvalidateCachedCurrentPixmap())); connect(header_, SIGNAL(sectionMoved(int,int,int)), SLOT(InvalidateCachedCurrentPixmap()));
connect(header_, SIGNAL(SectionVisibilityChanged(int,bool)), SLOT(InvalidateCachedCurrentPixmap())); connect(header_, SIGNAL(SectionVisibilityChanged(int,bool)), SLOT(InvalidateCachedCurrentPixmap()));
@@ -205,7 +199,6 @@ PlaylistView::PlaylistView(QWidget *parent)
} }
PlaylistView::~PlaylistView() { PlaylistView::~PlaylistView() {
SaveGeometry();
delete style_; delete style_;
} }
@@ -294,10 +287,11 @@ void PlaylistView::setModel(QAbstractItemModel *m) {
void PlaylistView::LoadGeometry() { void PlaylistView::LoadGeometry() {
QSettings settings; QSettings s;
settings.beginGroup(Playlist::kSettingsGroup); s.beginGroup(Playlist::kSettingsGroup);
QByteArray state(s.value("state").toByteArray());
s.endGroup();
QByteArray state(settings.value("state").toByteArray());
if (!header_->RestoreState(state)) { if (!header_->RestoreState(state)) {
// Maybe we're upgrading from a version that persisted the state with QHeaderView. // Maybe we're upgrading from a version that persisted the state with QHeaderView.
if (!header_->restoreState(state)) { if (!header_->restoreState(state)) {
@@ -340,8 +334,6 @@ void PlaylistView::LoadGeometry() {
header_->ShowSection(Playlist::Column_Title); header_->ShowSection(Playlist::Column_Title);
} }
header_loaded_ = true;
} }
void PlaylistView::SaveGeometry() { void PlaylistView::SaveGeometry() {
@@ -1117,7 +1109,6 @@ void PlaylistView::StretchChanged(bool stretch) {
if (!initialized_) return; if (!initialized_) return;
setHorizontalScrollBarPolicy(stretch ? Qt::ScrollBarAlwaysOff : Qt::ScrollBarAsNeeded); setHorizontalScrollBarPolicy(stretch ? Qt::ScrollBarAlwaysOff : Qt::ScrollBarAsNeeded);
SaveGeometry();
} }
@@ -1298,15 +1289,14 @@ void PlaylistView::ResetColumns() {
read_only_settings_ = true; read_only_settings_ = true;
setting_initial_header_layout_ = true; setting_initial_header_layout_ = true;
QSettings settings; QSettings s;
settings.beginGroup(Playlist::kSettingsGroup); s.beginGroup(Playlist::kSettingsGroup);
settings.remove("state"); s.remove("state");
settings.endGroup(); s.endGroup();
ReloadSettings(); ReloadSettings();
LoadGeometry(); LoadGeometry();
ReloadSettings(); ReloadSettings();
read_only_settings_ = false; read_only_settings_ = false;
SaveGeometry();
SetPlaylist(playlist_); SetPlaylist(playlist_);
} }

View File

@@ -113,9 +113,11 @@ class PlaylistView : public QTreeView {
void setModel(QAbstractItemModel *model); void setModel(QAbstractItemModel *model);
void ResetColumns(); void ResetColumns();
void SaveGeometry();
public slots: public slots:
void ReloadSettings(); void ReloadSettings();
void SaveSettings();
void StopGlowing(); void StopGlowing();
void StartGlowing(); void StartGlowing();
void JumpToCurrentlyPlayingTrack(); void JumpToCurrentlyPlayingTrack();
@@ -164,14 +166,12 @@ class PlaylistView : public QTreeView {
private slots: private slots:
void LoadGeometry(); void LoadGeometry();
void SaveGeometry();
void GlowIntensityChanged(); void GlowIntensityChanged();
void InhibitAutoscrollTimeout(); void InhibitAutoscrollTimeout();
void MaybeAutoscroll(); void MaybeAutoscroll();
void InvalidateCachedCurrentPixmap(); void InvalidateCachedCurrentPixmap();
void PlaylistDestroyed(); void PlaylistDestroyed();
void SaveSettings();
void StretchChanged(bool stretch); void StretchChanged(bool stretch);
void FadePreviousBackgroundImage(qreal value); void FadePreviousBackgroundImage(qreal value);
@@ -217,7 +217,6 @@ class PlaylistView : public QTreeView {
bool background_initialized_; bool background_initialized_;
bool setting_initial_header_layout_; bool setting_initial_header_layout_;
bool read_only_settings_; bool read_only_settings_;
bool header_loaded_;
QImage background_image_; QImage background_image_;
QImage current_song_cover_art_; QImage current_song_cover_art_;

View File

@@ -25,6 +25,7 @@
#include <QDebug> #include <QDebug>
#include <QObject>
#include <QTabBar> #include <QTabBar>
#include <QWidget> #include <QWidget>
#include <QMap> #include <QMap>
@@ -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 // Spacers are just disabled pages
void FancyTabWidget::addSpacer() { void FancyTabWidget::addSpacer() {
QWidget *spacer = new QWidget(this); QWidget *spacer = new QWidget(this);
const int index = addTab(spacer, QIcon(), QString()); const int index = insertTab(count(), spacer, QIcon(), QString());
setTabEnabled(index, false); setTabEnabled(index, false);
} }
void FancyTabWidget::setBackgroundPixmap(const QPixmap& pixmap) { void FancyTabWidget::setBackgroundPixmap(const QPixmap& pixmap) {
background_pixmap_ = pixmap; background_pixmap_ = pixmap;
update(); update();
} }
void FancyTabWidget::setCurrentIndex(int index) { 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; QSettings s;
settings.beginGroup(kSettingsGroup); s.beginGroup(kSettingsGroup);
QMap <int, TabData*> tabs;
for (int i = 0 ; i < count() ; i++) { for (TabData *tab : tabs_) {
QString k = "tab_" + tabBar()->tabData(i).toString().toLower(); const int idx = s.value("tab_" + tab->name(), tabs_.count()).toInt();
int index = settings.value(k, i).toInt(); tabs.insert(idx, tab);
if (index >= 0) {
tabBar()->moveTab(i, index);
}
} }
s.endGroup();
settings.endGroup(); QMap <int, TabData*> ::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; void FancyTabWidget::SaveSettings(const QString &kSettingsGroup) {
settings.beginGroup(kSettingsGroup);
QSettings s;
s.beginGroup(kSettingsGroup);
s.setValue("tab_mode", mode_);
s.setValue("current_tab", currentIndex());
for (int i = 0 ; i < count() ; i++) { for (int i = 0 ; i < count() ; i++) {
QString k = "tab_" + tabBar()->tabData(i).toString().toLower(); 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; bottom_widget_ = widget_view;
} }
int FancyTabWidget::addTab(QWidget *widget_view, const QIcon &icon, const QString &label) { void FancyTabWidget::AddTab(QWidget *widget_view, const QString &name, const QIcon &icon, const QString &label) {
return insertTab(count(), widget_view, icon, label);
}
int FancyTabWidget::insertTab(int index, QWidget *widget_view, const QIcon &icon, const QString &label) { TabData *tab = new TabData(widget_view, name, icon, label, false, this);
tabs_.insert(widget_view, tab);
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;
} }
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++) { for (int i = 0 ; i < count() ; i++) {
QString l = tabBar()->tabData(i).toString(); if (tabBar()->tabData(i).toString() == tab->name()) {
if (l == label) {
removeTab(i); removeTab(i);
break; tab->set_enabled(false);
return true;
} }
} }
return false;
} }

View File

@@ -30,28 +30,35 @@
#include <QActionGroup> #include <QActionGroup>
#include <QMenu> #include <QMenu>
#include <QSignalMapper> #include <QSignalMapper>
#include <QString>
#include <QIcon>
#include <QPixmap> #include <QPixmap>
#include <QSize> #include <QSize>
#include <QtEvents> #include <QtEvents>
class TabData;
namespace Core { namespace Core {
namespace Internal { namespace Internal {
class FancyTabWidget : public QTabWidget { class FancyTabWidget : public QTabWidget {
Q_OBJECT Q_OBJECT
~FancyTabWidget();
public: public:
FancyTabWidget(QWidget* parent = 0); FancyTabWidget(QWidget* parent = 0);
int addTab(QWidget *widget_view, const QIcon &icon, const QString &label); void AddTab(QWidget *widget_view, const QString &name, const QIcon &icon, const QString &label);
void delTab(const QString &label); bool EnableTab(QWidget *widget_view);
int insertTab(int index, QWidget *widget_view, const QIcon &icon, const QString &label); bool DisableTab(QWidget *widget_view);
int insertTab(int index, QWidget *page, const QIcon &icon, const QString &label);
void addBottomWidget(QWidget* widget_view); void addBottomWidget(QWidget* widget_view);
void setBackgroundPixmap(const QPixmap& pixmap); void setBackgroundPixmap(const QPixmap& pixmap);
void addSpacer(); void addSpacer();
void loadSettings(const char *); void Load(const QString &kSettingsGroup);
void saveSettings(const char *); void SaveSettings(const QString &kSettingsGroup);
// Values are persisted - only add to the end // Values are persisted - only add to the end
enum Mode { enum Mode {
@@ -95,7 +102,7 @@ class FancyTabWidget : public QTabWidget {
Mode mode_; Mode mode_;
QWidget *bottom_widget_; QWidget *bottom_widget_;
QHash <QString, QWidget*> tabs_; QMap <QWidget*, TabData*> tabs_;
}; };