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

View File

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

View File

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

View File

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

View File

@@ -25,6 +25,7 @@
#include <QDebug>
#include <QObject>
#include <QTabBar>
#include <QWidget>
#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
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 <int, TabData*> 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 <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;
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;
}

View File

@@ -30,28 +30,35 @@
#include <QActionGroup>
#include <QMenu>
#include <QSignalMapper>
#include <QString>
#include <QIcon>
#include <QPixmap>
#include <QSize>
#include <QtEvents>
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 <QString, QWidget*> tabs_;
QMap <QWidget*, TabData*> tabs_;
};