mirror of
https://github.com/strawberrymusicplayer/strawberry
synced 2025-01-27 23:59:53 +01:00
Replace FancyTabWidget with improved version
This commit is contained in:
parent
b9d0b3e152
commit
c05fb33ea2
@ -260,25 +260,24 @@ 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_, IconLoader::Load("strawberry"), "Context");
|
||||||
ui_->tabs->addTab(collection_view_, IconLoader::Load("vinyl"), tr("Collection"));
|
ui_->tabs->addTab(collection_view_, IconLoader::Load("vinyl"), "Collection");
|
||||||
ui_->tabs->addTab(file_view_, IconLoader::Load("document-open"), tr("Files"));
|
ui_->tabs->addTab(file_view_, IconLoader::Load("document-open"), "Files");
|
||||||
ui_->tabs->addTab(playlist_list_, IconLoader::Load("view-media-playlist"), tr("Playlists"));
|
ui_->tabs->addTab(playlist_list_, IconLoader::Load("view-media-playlist"), "Playlists");
|
||||||
#ifndef Q_OS_WIN
|
#ifndef Q_OS_WIN
|
||||||
ui_->tabs->addTab(device_view_, IconLoader::Load("device"), tr("Devices"));
|
ui_->tabs->addTab(device_view_, IconLoader::Load("device"), "Devices");
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_STREAM_TIDAL
|
#ifdef HAVE_STREAM_TIDAL
|
||||||
ui_->tabs->addTab(tidal_search_view_, IconLoader::Load("tidal"), tr("Tidal", "Tidal"));
|
ui_->tabs->addTab(tidal_search_view_, IconLoader::Load("tidal"), "Tidal");
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_STREAM_DEEZER
|
#ifdef HAVE_STREAM_DEEZER
|
||||||
ui_->tabs->addTab(deezer_search_view_, IconLoader::Load("deezer"), tr("Deezer", "Deezer"));
|
ui_->tabs->addTab(deezer_search_view_, IconLoader::Load("deezer"), "Deezer");
|
||||||
#endif
|
#endif
|
||||||
//ui_->tabs->AddSpacer();
|
|
||||||
|
|
||||||
// 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);
|
||||||
|
|
||||||
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()));
|
||||||
@ -722,7 +721,10 @@ MainWindow::MainWindow(Application *app, SystemTrayIcon *tray_icon, OSD *osd, co
|
|||||||
|
|
||||||
ui_->tabs->setCurrentIndex(settings_.value("current_tab", 1 /* Collection tab */ ).toInt());
|
ui_->tabs->setCurrentIndex(settings_.value("current_tab", 1 /* Collection tab */ ).toInt());
|
||||||
FancyTabWidget::Mode default_mode = FancyTabWidget::Mode_LargeSidebar;
|
FancyTabWidget::Mode default_mode = FancyTabWidget::Mode_LargeSidebar;
|
||||||
ui_->tabs->SetMode(FancyTabWidget::Mode(settings_.value("tab_mode", default_mode).toInt()));
|
int tab_mode_int = settings_.value("tab_mode", default_mode).toInt();
|
||||||
|
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());
|
file_view_->SetPath(settings_.value("file_path", QDir::homePath()).toString());
|
||||||
|
|
||||||
TabSwitched();
|
TabSwitched();
|
||||||
@ -811,6 +813,28 @@ void MainWindow::ReloadSettings() {
|
|||||||
album_cover_choice_controller_->search_cover_auto_action()->setChecked(settings.value("search_for_cover_auto", true).toBool());
|
album_cover_choice_controller_->search_cover_auto_action()->setChecked(settings.value("search_for_cover_auto", true).toBool());
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
|
#ifdef HAVE_STREAM_TIDAL
|
||||||
|
settings.beginGroup(TidalSettingsPage::kSettingsGroup);
|
||||||
|
bool enable_tidal = settings.value("enabled", false).toBool();
|
||||||
|
settings.endGroup();
|
||||||
|
if (enable_tidal)
|
||||||
|
ui_->tabs->addTab(tidal_search_view_, IconLoader::Load("tidal"), "Tidal");
|
||||||
|
else
|
||||||
|
ui_->tabs->delTab("tidal");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_STREAM_DEEZER
|
||||||
|
settings.beginGroup(DeezerSettingsPage::kSettingsGroup);
|
||||||
|
bool enable_deezer = settings.value("enabled", false).toBool();
|
||||||
|
settings.endGroup();
|
||||||
|
if (enable_deezer)
|
||||||
|
ui_->tabs->addTab(deezer_search_view_, IconLoader::Load("deezer"), "Deezer");
|
||||||
|
else
|
||||||
|
ui_->tabs->delTab("deezer");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ui_->tabs->loadSettings(kSettingsGroup);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::ReloadAllSettings() {
|
void MainWindow::ReloadAllSettings() {
|
||||||
@ -884,12 +908,14 @@ void MainWindow::MediaPlaying() {
|
|||||||
ui_->action_play_pause->setIcon(IconLoader::Load("media-pause"));
|
ui_->action_play_pause->setIcon(IconLoader::Load("media-pause"));
|
||||||
ui_->action_play_pause->setText(tr("Pause"));
|
ui_->action_play_pause->setText(tr("Pause"));
|
||||||
|
|
||||||
bool enable_play_pause = !(app_->player()->GetCurrentItem()->options() & PlaylistItem::PauseDisabled);
|
bool enable_play_pause(false);
|
||||||
|
bool can_seek(false);
|
||||||
|
if (app_->player()->GetCurrentItem()) {
|
||||||
|
enable_play_pause = !(app_->player()->GetCurrentItem()->options() & PlaylistItem::PauseDisabled);
|
||||||
|
can_seek = !(app_->player()->GetCurrentItem()->options() & PlaylistItem::SeekDisabled);
|
||||||
|
}
|
||||||
ui_->action_play_pause->setEnabled(enable_play_pause);
|
ui_->action_play_pause->setEnabled(enable_play_pause);
|
||||||
|
|
||||||
bool can_seek = !(app_->player()->GetCurrentItem()->options() & PlaylistItem::SeekDisabled);
|
|
||||||
ui_->track_slider->SetCanSeek(can_seek);
|
ui_->track_slider->SetCanSeek(can_seek);
|
||||||
|
|
||||||
if (tray_icon_) tray_icon_->SetPlaying(enable_play_pause);
|
if (tray_icon_) tray_icon_->SetPlaying(enable_play_pause);
|
||||||
|
|
||||||
track_position_timer_->start();
|
track_position_timer_->start();
|
||||||
@ -913,6 +939,7 @@ void MainWindow::SongChanged(const Song &song) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::TrackSkipped(PlaylistItemPtr item) {
|
void MainWindow::TrackSkipped(PlaylistItemPtr item) {
|
||||||
|
|
||||||
// If it was a collection item then we have to increment its skipped count in the database.
|
// If it was a collection item then we have to increment its skipped count in the database.
|
||||||
|
|
||||||
if (item && item->IsLocalCollectionItem() && item->Metadata().id() != -1) {
|
if (item && item->IsLocalCollectionItem() && item->Metadata().id() != -1) {
|
||||||
@ -929,6 +956,7 @@ void MainWindow::TrackSkipped(PlaylistItemPtr item) {
|
|||||||
app_->collection_backend()->IncrementSkipCountAsync(song.id(), percentage);
|
app_->collection_backend()->IncrementSkipCountAsync(song.id(), percentage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::changeEvent(QEvent *event) {
|
void MainWindow::changeEvent(QEvent *event) {
|
||||||
@ -937,16 +965,18 @@ void MainWindow::changeEvent(QEvent *event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::resizeEvent(QResizeEvent *event) {
|
void MainWindow::resizeEvent(QResizeEvent *event) {
|
||||||
|
if (!initialised_) return;
|
||||||
SaveGeometry();
|
SaveGeometry();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::TabSwitched() {
|
void MainWindow::TabSwitched() {
|
||||||
|
|
||||||
if (ui_->tabs->currentIndex() > 0)
|
if (ui_->tabs->tabBar()->tabData(ui_->tabs->currentIndex()).toString().toLower() == "context")
|
||||||
ui_->widget_playing->SetEnabled();
|
|
||||||
else
|
|
||||||
ui_->widget_playing->SetDisabled();
|
ui_->widget_playing->SetDisabled();
|
||||||
|
else
|
||||||
|
ui_->widget_playing->SetEnabled();
|
||||||
|
|
||||||
|
if (!initialised_) return;
|
||||||
SaveGeometry();
|
SaveGeometry();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -960,6 +990,7 @@ void MainWindow::SaveGeometry() {
|
|||||||
settings_.setValue("splitter_state", ui_->splitter->saveState());
|
settings_.setValue("splitter_state", ui_->splitter->saveState());
|
||||||
settings_.setValue("current_tab", ui_->tabs->currentIndex());
|
settings_.setValue("current_tab", ui_->tabs->currentIndex());
|
||||||
settings_.setValue("tab_mode", ui_->tabs->mode());
|
settings_.setValue("tab_mode", ui_->tabs->mode());
|
||||||
|
ui_->tabs->saveSettings(kSettingsGroup);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1145,6 +1176,7 @@ void MainWindow::UpdateTrackPosition() {
|
|||||||
//Playlist *playlist = app_->playlist_manager()->active();
|
//Playlist *playlist = app_->playlist_manager()->active();
|
||||||
|
|
||||||
PlaylistItemPtr item(app_->player()->GetCurrentItem());
|
PlaylistItemPtr item(app_->player()->GetCurrentItem());
|
||||||
|
if (!item) return;
|
||||||
const int position = std::floor(float(app_->player()->engine()->position_nanosec()) / kNsecPerSec + 0.5);
|
const int position = std::floor(float(app_->player()->engine()->position_nanosec()) / kNsecPerSec + 0.5);
|
||||||
const int length = item->Metadata().length_nanosec() / kNsecPerSec;
|
const int length = item->Metadata().length_nanosec() / kNsecPerSec;
|
||||||
|
|
||||||
@ -2216,8 +2248,8 @@ bool MainWindow::winEvent(MSG *msg, long*) {
|
|||||||
|
|
||||||
void MainWindow::Exit() {
|
void MainWindow::Exit() {
|
||||||
|
|
||||||
|
SaveGeometry();
|
||||||
SavePlaybackStatus();
|
SavePlaybackStatus();
|
||||||
//settings_.setValue("show_sidebar", ui_->action_toggle_show_sidebar->isChecked());
|
|
||||||
|
|
||||||
if (app_->player()->engine()->is_fadeout_enabled()) {
|
if (app_->player()->engine()->is_fadeout_enabled()) {
|
||||||
// To shut down the application when fadeout will be finished
|
// To shut down the application when fadeout will be finished
|
||||||
|
@ -387,6 +387,13 @@ signals:
|
|||||||
Song song_playing_;
|
Song song_playing_;
|
||||||
QImage image_original_;
|
QImage image_original_;
|
||||||
|
|
||||||
|
#ifdef HAVE_STREAM_TIDAL
|
||||||
|
int tab_index_tidal_;
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_STREAM_DEEZER
|
||||||
|
int tab_index_deezer_;
|
||||||
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
@ -73,6 +73,7 @@ void DeezerSettingsPage::Load() {
|
|||||||
QSettings s;
|
QSettings s;
|
||||||
|
|
||||||
s.beginGroup(kSettingsGroup);
|
s.beginGroup(kSettingsGroup);
|
||||||
|
ui_->checkbox_enable->setChecked(s.value("enabled", false).toBool());
|
||||||
ui_->username->setText(s.value("username").toString());
|
ui_->username->setText(s.value("username").toString());
|
||||||
QByteArray password = s.value("password").toByteArray();
|
QByteArray password = s.value("password").toByteArray();
|
||||||
if (password.isEmpty()) ui_->password->clear();
|
if (password.isEmpty()) ui_->password->clear();
|
||||||
@ -83,7 +84,12 @@ void DeezerSettingsPage::Load() {
|
|||||||
ui_->spinbox_songssearchlimit->setValue(s.value("songssearchlimit", 100).toInt());
|
ui_->spinbox_songssearchlimit->setValue(s.value("songssearchlimit", 100).toInt());
|
||||||
ui_->checkbox_fetchalbums->setChecked(s.value("fetchalbums", false).toBool());
|
ui_->checkbox_fetchalbums->setChecked(s.value("fetchalbums", false).toBool());
|
||||||
dialog()->ComboBoxLoadFromSettings(s, ui_->combobox_coversize, "coversize", "cover_big");
|
dialog()->ComboBoxLoadFromSettings(s, ui_->combobox_coversize, "coversize", "cover_big");
|
||||||
ui_->checkbox_preview->setChecked(s.value("preview", false).toBool());
|
#if defined(HAVE_DEEZER) || defined(HAVE_DZMEDIA)
|
||||||
|
bool preview(false);
|
||||||
|
#else
|
||||||
|
bool preview(true);
|
||||||
|
#endif
|
||||||
|
ui_->checkbox_preview->setChecked(s.value("preview", preview).toBool());
|
||||||
s.endGroup();
|
s.endGroup();
|
||||||
|
|
||||||
if (service_->authenticated()) ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn);
|
if (service_->authenticated()) ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn);
|
||||||
@ -95,6 +101,7 @@ void DeezerSettingsPage::Save() {
|
|||||||
|
|
||||||
QSettings s;
|
QSettings s;
|
||||||
s.beginGroup(kSettingsGroup);
|
s.beginGroup(kSettingsGroup);
|
||||||
|
s.setValue("enabled", ui_->checkbox_enable->isChecked());
|
||||||
s.setValue("username", ui_->username->text());
|
s.setValue("username", ui_->username->text());
|
||||||
s.setValue("password", QString::fromUtf8(ui_->password->text().toUtf8().toBase64()));
|
s.setValue("password", QString::fromUtf8(ui_->password->text().toUtf8().toBase64()));
|
||||||
s.setValue("quality", ui_->combobox_quality->itemData(ui_->combobox_quality->currentIndex()));
|
s.setValue("quality", ui_->combobox_quality->itemData(ui_->combobox_quality->currentIndex()));
|
||||||
|
@ -14,6 +14,13 @@
|
|||||||
<string>Deezer</string>
|
<string>Deezer</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="checkbox_enable">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="credential_group">
|
<widget class="QGroupBox" name="credential_group">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
|
@ -37,7 +37,6 @@ const char *TidalSettingsPage::kSettingsGroup = "Tidal";
|
|||||||
TidalSettingsPage::TidalSettingsPage(SettingsDialog *parent)
|
TidalSettingsPage::TidalSettingsPage(SettingsDialog *parent)
|
||||||
: SettingsPage(parent),
|
: SettingsPage(parent),
|
||||||
ui_(new Ui::TidalSettingsPage),
|
ui_(new Ui::TidalSettingsPage),
|
||||||
//service_(dialog()->app()->internet_model()->Service<TidalService>()) {
|
|
||||||
service_(dialog()->app()->internet_model()->Service<TidalService>()) {
|
service_(dialog()->app()->internet_model()->Service<TidalService>()) {
|
||||||
|
|
||||||
ui_->setupUi(this);
|
ui_->setupUi(this);
|
||||||
@ -75,6 +74,7 @@ void TidalSettingsPage::Load() {
|
|||||||
QSettings s;
|
QSettings s;
|
||||||
|
|
||||||
s.beginGroup(kSettingsGroup);
|
s.beginGroup(kSettingsGroup);
|
||||||
|
ui_->checkbox_enable->setChecked(s.value("enabled", false).toBool());
|
||||||
ui_->username->setText(s.value("username").toString());
|
ui_->username->setText(s.value("username").toString());
|
||||||
QByteArray password = s.value("password").toByteArray();
|
QByteArray password = s.value("password").toByteArray();
|
||||||
if (password.isEmpty()) ui_->password->clear();
|
if (password.isEmpty()) ui_->password->clear();
|
||||||
@ -96,6 +96,7 @@ void TidalSettingsPage::Save() {
|
|||||||
|
|
||||||
QSettings s;
|
QSettings s;
|
||||||
s.beginGroup(kSettingsGroup);
|
s.beginGroup(kSettingsGroup);
|
||||||
|
s.setValue("enabled", ui_->checkbox_enable->isChecked());
|
||||||
s.setValue("username", ui_->username->text());
|
s.setValue("username", ui_->username->text());
|
||||||
s.setValue("password", QString::fromUtf8(ui_->password->text().toUtf8().toBase64()));
|
s.setValue("password", QString::fromUtf8(ui_->password->text().toUtf8().toBase64()));
|
||||||
s.setValue("quality", ui_->combobox_quality->itemData(ui_->combobox_quality->currentIndex()));
|
s.setValue("quality", ui_->combobox_quality->itemData(ui_->combobox_quality->currentIndex()));
|
||||||
|
@ -14,6 +14,13 @@
|
|||||||
<string>Tidal</string>
|
<string>Tidal</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="checkbox_enable">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="credential_group">
|
<widget class="QGroupBox" name="credential_group">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,249 +1,107 @@
|
|||||||
/**************************************************************************
|
/*
|
||||||
**
|
* Strawberry Music Player
|
||||||
** This file is part of Qt Creator
|
* This file was part of Clementine.
|
||||||
**
|
* Copyright 2018, Vikram Ambrose <ambroseworks@gmail.com>
|
||||||
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
* Copyright 2018, Jonas Kvinge <jonas@jkvinge.net>
|
||||||
**
|
*
|
||||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
* Strawberry is free software: you can redistribute it and/or modify
|
||||||
**
|
* it under the terms of the GNU General Public License as published by
|
||||||
** Commercial Usage
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
**
|
* (at your option) any later version.
|
||||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
*
|
||||||
** accordance with the Qt Commercial License Agreement provided with the
|
* Strawberry is distributed in the hope that it will be useful,
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
** a written agreement between you and Nokia.
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
**
|
* GNU General Public License for more details.
|
||||||
** GNU Lesser General Public License Usage
|
*
|
||||||
**
|
* You should have received a copy of the GNU General Public License
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
* along with Strawberry. If not, see <http://www.gnu.org/licenses/>.
|
||||||
** General Public License version 2.1 as published by the Free Software
|
*
|
||||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
*/
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
**
|
|
||||||
** If you are unsure which license is appropriate for your use, please
|
|
||||||
** contact the sales department at http://qt.nokia.com/contact.
|
|
||||||
**
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
#ifndef FANCYTABWIDGET_H
|
#ifndef FANCYTABWIDGET_H
|
||||||
#define FANCYTABWIDGET_H
|
#define FANCYTABWIDGET_H
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
#include <QTabWidget>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QIcon>
|
|
||||||
#include <QList>
|
|
||||||
#include <QMetaType>
|
|
||||||
#include <QPixmap>
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QPalette>
|
|
||||||
#include <QRect>
|
|
||||||
#include <QSize>
|
|
||||||
#include <QString>
|
|
||||||
#include <QStyle>
|
|
||||||
#include <QTabBar>
|
|
||||||
#include <QTimer>
|
|
||||||
#include <QPropertyAnimation>
|
|
||||||
#include <QProxyStyle>
|
|
||||||
#include <QActionGroup>
|
#include <QActionGroup>
|
||||||
#include <QApplication>
|
|
||||||
#include <QSignalMapper>
|
|
||||||
#include <QStackedLayout>
|
|
||||||
#include <QStyleOption>
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
|
#include <QSignalMapper>
|
||||||
|
#include <QPixmap>
|
||||||
|
#include <QSize>
|
||||||
#include <QtEvents>
|
#include <QtEvents>
|
||||||
|
|
||||||
class QEvent;
|
|
||||||
class QMouseEvent;
|
|
||||||
class QPaintEvent;
|
|
||||||
class QContextMenuEvent;
|
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
class FancyTabProxyStyle : public QProxyStyle {
|
class FancyTabWidget : public QTabWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const;
|
FancyTabWidget(QWidget* parent = 0);
|
||||||
void polish(QWidget *widget);
|
int addTab(QWidget *widget, const QIcon &icon, const QString &label);
|
||||||
void polish(QApplication *app);
|
void delTab(const QString &label);
|
||||||
void polish(QPalette &palette);
|
int insertTab(int index, QWidget *widget, const QIcon &icon, const QString &label);
|
||||||
|
void addBottomWidget(QWidget* widget);
|
||||||
|
|
||||||
protected:
|
void setBackgroundPixmap(const QPixmap& pixmap);
|
||||||
bool eventFilter(QObject *o, QEvent *e);
|
void addSpacer();
|
||||||
};
|
|
||||||
|
|
||||||
class FancyTab : public QWidget {
|
void loadSettings(const char *);
|
||||||
Q_OBJECT
|
void saveSettings(const char *);
|
||||||
|
|
||||||
Q_PROPERTY(float fader READ fader WRITE setFader)
|
// Values are persisted - only add to the end
|
||||||
public:
|
enum Mode {
|
||||||
FancyTab(QWidget *tabbar);
|
Mode_None = 0,
|
||||||
float fader() { return m_fader; }
|
Mode_LargeSidebar,
|
||||||
void setFader(float value);
|
Mode_SmallSidebar,
|
||||||
|
Mode_Tabs,
|
||||||
QSize sizeHint() const;
|
Mode_IconOnlyTabs,
|
||||||
|
Mode_PlainSidebar,
|
||||||
void fadeIn();
|
|
||||||
void fadeOut();
|
|
||||||
|
|
||||||
QIcon icon;
|
|
||||||
QString text;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool event(QEvent *);
|
|
||||||
void enterEvent(QEvent *);
|
|
||||||
void leaveEvent(QEvent *);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QPropertyAnimation animator;
|
|
||||||
QWidget *tabbar;
|
|
||||||
float m_fader;
|
|
||||||
};
|
|
||||||
|
|
||||||
class FancyTabBar : public QWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
FancyTabBar(QWidget *parent = nullptr);
|
|
||||||
~FancyTabBar();
|
|
||||||
|
|
||||||
void paintEvent(QPaintEvent *event);
|
|
||||||
void paintTab(QPainter *painter, int tabIndex) const;
|
|
||||||
void mousePressEvent(QMouseEvent *);
|
|
||||||
bool validIndex(int index) const { return index >= 0 && index < m_tabs.count(); }
|
|
||||||
|
|
||||||
QSize sizeHint() const;
|
|
||||||
QSize minimumSizeHint() const;
|
|
||||||
|
|
||||||
void addTab(const QIcon &icon, const QString &label);
|
|
||||||
void addSpacer(int size = 40);
|
|
||||||
void removeTab(int index) {
|
|
||||||
FancyTab *tab = m_tabs.takeAt(index);
|
|
||||||
delete tab;
|
|
||||||
}
|
|
||||||
void setCurrentIndex(int index);
|
|
||||||
int currentIndex() const { return m_currentIndex; }
|
|
||||||
|
|
||||||
void setTabToolTip(int index, const QString &toolTip);
|
|
||||||
QString tabToolTip(int index) const;
|
|
||||||
|
|
||||||
QIcon tabIcon(int index) const {return m_tabs.at(index)->icon; }
|
|
||||||
QString tabText(int index) const { return m_tabs.at(index)->text; }
|
|
||||||
int count() const { return m_tabs.count(); }
|
|
||||||
QRect tabRect(int index) const;
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void currentChanged(int);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void emitCurrentIndex();
|
|
||||||
|
|
||||||
private:
|
|
||||||
static const int m_rounding;
|
|
||||||
static const int m_textPadding;
|
|
||||||
int m_currentIndex;
|
|
||||||
QList<FancyTab*> m_tabs;
|
|
||||||
QTimer m_triggerTimer;
|
|
||||||
QSize tabSizeHint(bool minimum = false) const;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
class FancyTabWidget : public QWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
FancyTabWidget(QWidget *parent = nullptr);
|
|
||||||
|
|
||||||
// Values are persisted - only add to the end
|
|
||||||
enum Mode {
|
|
||||||
Mode_None = 0,
|
|
||||||
|
|
||||||
Mode_LargeSidebar = 1,
|
|
||||||
Mode_SmallSidebar = 2,
|
|
||||||
Mode_Tabs = 3,
|
|
||||||
Mode_IconOnlyTabs = 4,
|
|
||||||
Mode_PlainSidebar = 5,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Item {
|
|
||||||
Item(const QIcon &icon, const QString &label)
|
|
||||||
: type_(Type_Tab), tab_label_(label), tab_icon_(icon), spacer_size_(0) {}
|
|
||||||
Item(int size) : type_(Type_Spacer), spacer_size_(size) {}
|
|
||||||
|
|
||||||
enum Type {
|
|
||||||
Type_Tab,
|
|
||||||
Type_Spacer,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Type type_;
|
static const QSize TabSize_LargeSidebar;
|
||||||
QString tab_label_;
|
|
||||||
QIcon tab_icon_;
|
|
||||||
int spacer_size_;
|
|
||||||
};
|
|
||||||
|
|
||||||
void addTab(QWidget *tab, const QIcon &icon, const QString &label);
|
static const QSize IconSize_LargeSidebar;
|
||||||
void AddSpacer(int size = 40);
|
static const QSize IconSize_SmallSidebar;
|
||||||
void SetBackgroundPixmap(const QPixmap &pixmap);
|
|
||||||
|
|
||||||
void addBottomWidget(QWidget *widget);
|
Mode mode() { return mode_; }
|
||||||
|
|
||||||
int currentIndex() const;
|
signals:
|
||||||
Mode mode() const { return mode_; }
|
void ModeChanged(FancyTabWidget::Mode mode);
|
||||||
|
void CurrentChanged(int);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setCurrentIndex(int index);
|
void setCurrentIndex(int index);
|
||||||
void setCurrentWidget(QWidget *widget);
|
void SetMode(Mode mode);
|
||||||
void SetMode(Mode mode);
|
// Mapper mapped signal needs this convenience function
|
||||||
void SetMode(int mode) { SetMode(Mode(mode)); }
|
void SetMode(int mode) { SetMode(Mode(mode)); }
|
||||||
|
|
||||||
signals:
|
private slots:
|
||||||
void CurrentChanged(int index);
|
void tabBarUpdateGeometry();
|
||||||
void ModeChanged(FancyTabWidget::Mode mode);
|
void currentTabChanged(int);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void paintEvent(QPaintEvent *event);
|
void paintEvent(QPaintEvent *);
|
||||||
void contextMenuEvent(QContextMenuEvent *e);
|
void contextMenuEvent(QContextMenuEvent* e);
|
||||||
|
private:
|
||||||
|
void addMenuItem(QSignalMapper* mapper, QActionGroup* group, const QString& text, Mode mode);
|
||||||
|
|
||||||
private slots:
|
QPixmap background_pixmap_;
|
||||||
void ShowWidget(int index);
|
QMenu* menu_;
|
||||||
|
Mode mode_;
|
||||||
|
QWidget *bottom_widget_;
|
||||||
|
|
||||||
private:
|
QHash <QString, QWidget*> tabs_;
|
||||||
void MakeTabBar(QTabBar::Shape shape, bool text, bool icons, bool fancy);
|
|
||||||
void AddMenuItem(QSignalMapper *mapper, QActionGroup *group, const QString &text, Mode mode);
|
|
||||||
|
|
||||||
Mode mode_;
|
|
||||||
QList<Item> items_;
|
|
||||||
|
|
||||||
QWidget *tab_bar_;
|
|
||||||
QStackedLayout *stack_;
|
|
||||||
QPixmap background_pixmap_;
|
|
||||||
QWidget *side_widget_;
|
|
||||||
QVBoxLayout *side_layout_;
|
|
||||||
QVBoxLayout *top_layout_;
|
|
||||||
|
|
||||||
bool use_background_;
|
|
||||||
|
|
||||||
QMenu *menu_;
|
|
||||||
|
|
||||||
std::unique_ptr<FancyTabProxyStyle> proxy_style_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace Core
|
} // namespace Core
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(QPropertyAnimation*);
|
|
||||||
|
|
||||||
using Core::Internal::FancyTab;
|
|
||||||
using Core::Internal::FancyTabBar;
|
|
||||||
using Core::Internal::FancyTabWidget;
|
using Core::Internal::FancyTabWidget;
|
||||||
|
|
||||||
#endif // FANCYTABWIDGET_H
|
#endif // FANCYTABWIDGET_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user