aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/Ui/qsui/forms/mainwindow.ui34
-rw-r--r--src/plugins/Ui/qsui/listwidget.cpp30
-rw-r--r--src/plugins/Ui/qsui/listwidget.h1
-rw-r--r--src/plugins/Ui/qsui/mainwindow.cpp137
-rw-r--r--src/plugins/Ui/qsui/mainwindow.h8
-rw-r--r--src/plugins/Ui/qsui/qsuitabwidget.cpp296
-rw-r--r--src/plugins/Ui/qsui/qsuitabwidget.h58
7 files changed, 390 insertions, 174 deletions
diff --git a/src/plugins/Ui/qsui/forms/mainwindow.ui b/src/plugins/Ui/qsui/forms/mainwindow.ui
index 22292be17..4e7ed0f4e 100644
--- a/src/plugins/Ui/qsui/forms/mainwindow.ui
+++ b/src/plugins/Ui/qsui/forms/mainwindow.ui
@@ -16,29 +16,7 @@
<property name="dockOptions">
<set>QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks|QMainWindow::VerticalTabs</set>
</property>
- <widget class="QWidget" name="centralwidget">
- <layout class="QVBoxLayout" name="verticalLayout">
- <property name="spacing">
- <number>2</number>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <item>
- <widget class="QSUiTabWidget" name="tabWidget">
- <property name="focusPolicy">
- <enum>Qt::StrongFocus</enum>
- </property>
- <property name="currentIndex">
- <number>-1</number>
- </property>
- <property name="documentMode">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
+ <widget class="QWidget" name="centralwidget"/>
<widget class="QStatusBar" name="statusbar"/>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
@@ -46,7 +24,7 @@
<x>0</x>
<y>0</y>
<width>614</width>
- <height>25</height>
+ <height>27</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@@ -270,14 +248,6 @@
</property>
</action>
</widget>
- <customwidgets>
- <customwidget>
- <class>QSUiTabWidget</class>
- <extends>QTabWidget</extends>
- <header>qsuitabwidget.h</header>
- <container>1</container>
- </customwidget>
- </customwidgets>
<resources/>
<connections/>
</ui>
diff --git a/src/plugins/Ui/qsui/listwidget.cpp b/src/plugins/Ui/qsui/listwidget.cpp
index 35043fb8e..b86bbf731 100644
--- a/src/plugins/Ui/qsui/listwidget.cpp
+++ b/src/plugins/Ui/qsui/listwidget.cpp
@@ -153,6 +153,32 @@ PlayListModel *ListWidget::model()
return m_model;
}
+void ListWidget::setModel(PlayListModel *selected, PlayListModel *previous)
+{
+ if(previous)
+ {
+ previous->setProperty("first_visible", m_first);
+ disconnect(previous, 0, this, 0); //disconnect previous model
+ disconnect(previous,0,m_header,0);
+ }
+ qApp->processEvents();
+ m_model = selected;
+
+ if(m_model->property("first_visible").isValid())
+ {
+ m_first = m_model->property("first_visible").toInt();
+ updateList(PlayListModel::STRUCTURE);
+ }
+ else
+ {
+ m_first = 0;
+ updateList(PlayListModel::STRUCTURE | PlayListModel::CURRENT);
+ }
+ connect (m_model, SIGNAL(currentVisibleRequest()), SLOT(scrollToCurrent()));
+ connect (m_model, SIGNAL(listChanged(int)), SLOT(updateList(int)));
+ connect (m_model, SIGNAL(sortingByColumnFinished(int,bool)), m_header, SLOT(showSortIndicator(int,bool)));
+}
+
void ListWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
@@ -327,7 +353,6 @@ bool ListWidget::event (QEvent *e)
void ListWidget::updateList(int flags)
{
- m_hslider->setVisible(m_header->maxScrollValue() > 0);
m_hslider->setRange(0, m_header->maxScrollValue());
m_hslider->setValue(m_header->offset());
@@ -341,6 +366,7 @@ void ListWidget::updateList(int flags)
if(flags & PlayListModel::STRUCTURE || flags & PlayListModel::CURRENT)
{
+ m_scrollBar->blockSignals(true);
if(m_row_count >= m_model->count())
{
m_first = 0;
@@ -361,6 +387,7 @@ void ListWidget::updateList(int flags)
m_scrollBar->setValue(m_first);
emit positionChanged(m_first, m_model->count() - m_row_count);
}
+ m_scrollBar->blockSignals(false);
items = m_model->mid(m_first, m_row_count);
@@ -394,6 +421,7 @@ void ListWidget::updateList(int flags)
int rowWidth = width() + m_header->maxScrollValue() - 10 - scroll_bar_width;
bool rtl = layoutDirection() == Qt::RightToLeft;
m_header->setScrollBarWidth(scroll_bar_width);
+ m_hslider->setVisible(m_header->maxScrollValue() > 0);
for(int i = 0; i < items.count(); ++i)
{
diff --git a/src/plugins/Ui/qsui/listwidget.h b/src/plugins/Ui/qsui/listwidget.h
index b31b83d8e..bfbc038e9 100644
--- a/src/plugins/Ui/qsui/listwidget.h
+++ b/src/plugins/Ui/qsui/listwidget.h
@@ -67,6 +67,7 @@ public:
PlayListModel *model();
public slots:
+ void setModel(PlayListModel *selected, PlayListModel *previous);
void readSettings();
void updateList(int flags);
void scroll(int); //0-99
diff --git a/src/plugins/Ui/qsui/mainwindow.cpp b/src/plugins/Ui/qsui/mainwindow.cpp
index a8784604a..436501300 100644
--- a/src/plugins/Ui/qsui/mainwindow.cpp
+++ b/src/plugins/Ui/qsui/mainwindow.cpp
@@ -26,6 +26,7 @@
#include <QMenu>
#include <QSettings>
#include <QInputDialog>
+#include <QGridLayout>
#include <qmmp/soundcore.h>
#include <qmmp/decoder.h>
#include <qmmp/metadatamanager.h>
@@ -38,6 +39,7 @@
#include <qmmpui/uihelper.h>
#include <qmmpui/configdialog.h>
#include <qmmpui/qmmpuisettings.h>
+#include "qsuitabbar.h"
#include "toolbareditor.h"
#include "actionmanager.h"
#include "qsuianalyzer.h"
@@ -53,6 +55,7 @@
#include "coverwidget.h"
#include "playlistbrowser.h"
#include "volumeslider.h"
+#include "qsuitabwidget.h"
#include "equalizer.h"
#define KEY_OFFSET 10000
@@ -60,7 +63,6 @@
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
m_ui.setupUi(this);
- m_balance = 0;
m_update = false;
m_wasMaximized = false;
m_titleFormatter.setPattern("%if(%p,%p - %t,%t)");
@@ -76,6 +78,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
m_ui.actionVisualization->setMenu(m_visMenu);
m_pl_menu = new QMenu(this); //playlist menu
new ActionManager(this); //action manager
+ createWidgets(); //widgets
//status
connect(m_core, SIGNAL(elapsedChanged(qint64)), SLOT(updatePosition(qint64)));
connect(m_core, SIGNAL(stateChanged(Qmmp::State)), SLOT(showState(Qmmp::State)));
@@ -87,22 +90,15 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
//create tabs
foreach(PlayListModel *model, m_pl_manager->playLists())
{
- ListWidget *list = new ListWidget(model, this);
- list->setMenu(m_pl_menu);
if(m_pl_manager->currentPlayList() != model)
- m_ui.tabWidget->addTab(list, model->name());
+ m_tabWidget->addTab(model->name());
else
- {
- m_ui.tabWidget->addTab(list, "[" + model->name() + "]");
- m_ui.tabWidget->setCurrentWidget(list);
- }
- if(model == m_pl_manager->selectedPlayList())
- {
- m_ui.tabWidget->setCurrentWidget(list);
- m_key_manager->setListWidget(list);
- }
+ m_tabWidget->addTab("[" + model->name() + "]");
connect(model, SIGNAL(nameChanged(QString)), SLOT(updateTabs()));
}
+ m_tabWidget->setCurrentIndex(m_pl_manager->selectedPlayListIndex());
+ m_key_manager->setListWidget(m_listWidget);
+
m_positionSlider = new PositionSlider(this);
m_positionSlider->setFocusPolicy(Qt::NoFocus);
m_positionSlider->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
@@ -116,14 +112,16 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
SLOT(updateTabs()));
connect(m_pl_manager, SIGNAL(playListRemoved(int)), SLOT(removeTab(int)));
connect(m_pl_manager, SIGNAL(playListAdded(int)), SLOT(addTab(int)));
- connect(m_ui.tabWidget,SIGNAL(currentChanged(int)), m_pl_manager, SLOT(selectPlayList(int)));
- connect(m_ui.tabWidget, SIGNAL(tabCloseRequested(int)), m_pl_manager, SLOT(removePlayList(int)));
- connect(m_ui.tabWidget, SIGNAL(tabMoved(int,int)), m_pl_manager, SLOT(move(int,int)));
- connect(m_ui.tabWidget, SIGNAL(createPlayListRequested()), m_pl_manager, SLOT(createPlayList()));
-
- m_ui.tabWidget->setContextMenuPolicy(Qt::CustomContextMenu);
- connect(m_ui.tabWidget, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showTabMenu(QPoint)));
- m_tab_menu = new QMenu(m_ui.tabWidget);
+ connect(m_pl_manager, SIGNAL(selectedPlayListChanged(PlayListModel*,PlayListModel*)),
+ m_listWidget, SLOT(setModel(PlayListModel*,PlayListModel*)));
+ connect(m_tabWidget,SIGNAL(currentChanged(int)), m_pl_manager, SLOT(selectPlayList(int)));
+ connect(m_tabWidget, SIGNAL(tabCloseRequested(int)), m_pl_manager, SLOT(removePlayList(int)));
+ connect(m_tabWidget, SIGNAL(tabMoved(int,int)), m_pl_manager, SLOT(move(int,int)));
+ connect(m_tabWidget, SIGNAL(createPlayListRequested()), m_pl_manager, SLOT(createPlayList()));
+
+ m_tabWidget->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(m_tabWidget, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showTabMenu(QPoint)));
+ m_tab_menu = new QMenu(m_tabWidget);
//status bar
m_timeLabel = new QLabel(this);
m_statusLabel = new QLabel(this);
@@ -156,7 +154,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
m_ui.playlistsDockWidget->setWidget(new PlayListBrowser(m_pl_manager, this));
createActions();
- createButtons();
readSettings();
updateStatus();
}
@@ -241,17 +238,11 @@ void MainWindow::updateTabs()
{
PlayListModel *model = m_pl_manager->playListAt(i);
if(model == m_pl_manager->currentPlayList())
- m_ui.tabWidget->setTabText(i, "[" + model->name() + "]");
+ m_tabWidget->setTabText(i, "[" + model->name() + "]");
else
- m_ui.tabWidget->setTabText(i, model->name());
- //hack for displaying '&'
- m_ui.tabWidget->setTabText(i, m_ui.tabWidget->tabText(i).replace("&", "&&"));
- if(model == m_pl_manager->selectedPlayList())
- {
- m_ui.tabWidget->setCurrentIndex(i);
- m_key_manager->setListWidget(qobject_cast<ListWidget *>(m_ui.tabWidget->widget(i)));
- }
+ m_tabWidget->setTabText(i, model->name());
}
+ m_tabWidget->setCurrentIndex(m_pl_manager->selectedPlayListIndex());
}
void MainWindow::removePlaylist()
@@ -266,17 +257,14 @@ void MainWindow::removePlaylistWithIndex(int index)
void MainWindow::addTab(int index)
{
- ListWidget *list = new ListWidget(m_pl_manager->playListAt(index), this);
- list->setMenu(m_pl_menu);
- m_ui.tabWidget->insertTab(index, list, m_pl_manager->playListAt(index)->name());
+ m_tabWidget->insertTab(index, m_pl_manager->playListAt(index)->name());
connect(m_pl_manager->playListAt(index), SIGNAL(nameChanged(QString)), SLOT(updateTabs()));
updateTabs();
}
void MainWindow::removeTab(int index)
{
- m_ui.tabWidget->widget(index)->deleteLater();
- m_ui.tabWidget->removeTab(index);
+ m_tabWidget->removeTab(index);
updateTabs();
}
@@ -403,9 +391,34 @@ void MainWindow::hideEvent(QHideEvent *)
m_wasMaximized = isMaximized();
}
+void MainWindow::createWidgets()
+{
+ m_tabWidget = new QSUiTabWidget(this);
+ m_listWidget = m_tabWidget->listWidget();
+ m_listWidget->setMenu(m_pl_menu);
+ setCentralWidget(m_tabWidget);
+ //'new playlist' button
+ m_addListButton = new QToolButton(m_tabWidget);
+ m_addListButton->setText("+");
+ m_addListButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ m_addListButton->setAutoRaise(true);
+ m_addListButton->setIcon(QIcon::fromTheme("list-add"));
+ m_addListButton->setToolTip(tr("Add new playlist"));
+ connect(m_addListButton, SIGNAL(clicked()), m_pl_manager, SLOT(createPlayList()));
+ //playlist menu button
+ m_tabListMenuButton = new QToolButton(m_tabWidget);
+ m_tabListMenuButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
+ m_tabListMenuButton->setAutoRaise(true);
+ m_tabListMenuButton->setToolTip(tr("Show all tabs"));
+ m_tabListMenuButton->setArrowType(Qt::DownArrow);
+ m_tabListMenuButton->setStyleSheet("QToolButton::menu-indicator { image: none; }");
+ m_tabListMenuButton->setPopupMode(QToolButton::InstantPopup);
+ m_tabListMenuButton->setMenu(m_tabWidget->menu());
+}
+
void MainWindow::createActions()
{
- //prepare cheackable actions
+ //prepare checkable actions
ACTION(ActionManager::REPEAT_ALL)->setChecked(m_ui_settings->isRepeatableList());
ACTION(ActionManager::REPEAT_TRACK)->setChecked(m_ui_settings->isRepeatableTrack());
ACTION(ActionManager::SHUFFLE)->setChecked(m_ui_settings->isShuffle());
@@ -484,7 +497,7 @@ void MainWindow::createActions()
m_ui.menuView->addAction(m_ui.coverDockWidget->toggleViewAction());
m_ui.menuView->addAction(m_ui.playlistsDockWidget->toggleViewAction());
m_ui.menuView->addSeparator();
- m_ui.menuView->addAction(SET_ACTION(ActionManager::UI_SHOW_TABS, m_ui.tabWidget, SLOT(setTabsVisible(bool))));
+ m_ui.menuView->addAction(SET_ACTION(ActionManager::UI_SHOW_TABS, m_tabWidget->tabBar(), SLOT(setVisible(bool))));
m_ui.menuView->addAction(SET_ACTION(ActionManager::UI_SHOW_TITLEBARS, this, SLOT(setTitleBarsVisible(bool))));
m_ui.menuView->addAction(ACTION(ActionManager::PL_SHOW_HEADER));
m_ui.menuView->addSeparator();
@@ -671,27 +684,6 @@ void MainWindow::createActions()
addActions(m_key_manager->actions());
}
-void MainWindow::createButtons()
-{
- //'new playlist' button
- m_addListButton = new QToolButton(m_ui.tabWidget);
- m_addListButton->setText("+");
- m_addListButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
- m_addListButton->setAutoRaise(true);
- m_addListButton->setIcon(QIcon::fromTheme("list-add"));
- m_addListButton->setToolTip(tr("Add new playlist"));
- connect(m_addListButton, SIGNAL(clicked()), m_pl_manager, SLOT(createPlayList()));
- //playlist menu button
- m_tabListMenuButton = new QToolButton(m_ui.tabWidget);
- m_tabListMenuButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
- m_tabListMenuButton->setAutoRaise(true);
- m_tabListMenuButton->setToolTip(tr("Show all tabs"));
- m_tabListMenuButton->setArrowType(Qt::DownArrow);
- m_tabListMenuButton->setStyleSheet("QToolButton::menu-indicator { image: none; }");
- m_tabListMenuButton->setPopupMode(QToolButton::InstantPopup);
- m_tabListMenuButton->setMenu(m_ui.tabWidget->menu());
-}
-
void MainWindow::readSettings()
{
QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
@@ -733,10 +725,7 @@ void MainWindow::readSettings()
if(m_update)
{
- for(int i = 0; i < m_ui.tabWidget->count(); ++i)
- {
- qobject_cast<ListWidget *>(m_ui.tabWidget->widget(i))->readSettings();
- }
+ m_listWidget->readSettings();
qobject_cast<FileSystemBrowser *> (m_ui.fileSystemDockWidget->widget())->readSettings();
if(ACTION(ActionManager::WM_ALLWAYS_ON_TOP)->isChecked())
@@ -747,7 +736,7 @@ void MainWindow::readSettings()
if(m_core->state() == Qmmp::Playing || m_core->state() == Qmmp::Paused)
showMetaData();
- m_ui.tabWidget->readSettings();
+ m_tabWidget->readSettings();
show();
}
@@ -779,7 +768,7 @@ void MainWindow::readSettings()
state = settings.value("show_tabs", true).toBool();
ACTION(ActionManager::UI_SHOW_TABS)->setChecked(state);
- m_ui.tabWidget->setTabsVisible(state);
+ m_tabWidget->setTabsVisible(state);
state = settings.value("block_toolbars", false).toBool();
ACTION(ActionManager::UI_BLOCK_TOOLBARS)->setChecked(state);
@@ -789,30 +778,30 @@ void MainWindow::readSettings()
}
m_hideOnClose = settings.value("hide_on_close", false).toBool();
- m_ui.tabWidget->setTabsClosable(settings.value("pl_tabs_closable", false).toBool());
if(settings.value("pl_show_new_pl_button", false).toBool())
{
- m_ui.tabWidget->setCornerWidget(m_addListButton, Qt::TopLeftCorner);
+ m_tabWidget->setCornerWidget(m_addListButton, Qt::TopLeftCorner);
m_addListButton->setIconSize(QSize(16, 16));
m_addListButton->setVisible(true);
}
else
{
m_addListButton->setVisible(false);
- m_ui.tabWidget->setCornerWidget(0, Qt::TopLeftCorner);
+ m_tabWidget->setCornerWidget(0, Qt::TopLeftCorner);
}
if(settings.value("pl_show_tab_list_menu", false).toBool())
{
- m_ui.tabWidget->setCornerWidget(m_tabListMenuButton, Qt::TopRightCorner);
+ m_tabWidget->setCornerWidget(m_tabListMenuButton, Qt::TopRightCorner);
m_tabListMenuButton->setIconSize(QSize(16, 16));
m_tabListMenuButton->setVisible(true);
}
else
{
m_tabListMenuButton->setVisible(false);
- m_ui.tabWidget->setCornerWidget(0, Qt::TopRightCorner);
+ m_tabWidget->setCornerWidget(0, Qt::TopRightCorner);
}
+
settings.endGroup();
addActions(m_uiHelper->actions(UiHelper::TOOLS_MENU));
addActions(m_uiHelper->actions(UiHelper::PLAYLIST_MENU));
@@ -820,16 +809,12 @@ void MainWindow::readSettings()
void MainWindow::showTabMenu(QPoint pos)
{
- QTabBar *tabBar = qobject_cast<QTabBar *> (m_ui.tabWidget->childAt(pos));
- if(!tabBar)
- return;
-
- int index = tabBar->tabAt(pos);
+ int index = m_tabWidget->tabBar()->tabAt(pos);
if(index == -1)
return;
m_pl_manager->selectPlayList(index);
- m_tab_menu->popup(m_ui.tabWidget->mapToGlobal(pos));
+ m_tab_menu->popup(m_tabWidget->mapToGlobal(pos));
}
void MainWindow::writeSettings()
diff --git a/src/plugins/Ui/qsui/mainwindow.h b/src/plugins/Ui/qsui/mainwindow.h
index 2113d0dfc..e2284f9db 100644
--- a/src/plugins/Ui/qsui/mainwindow.h
+++ b/src/plugins/Ui/qsui/mainwindow.h
@@ -40,6 +40,8 @@ class VisualMenu;
class PositionSlider;
class KeyboardManager;
class QSUiAnalyzer;
+class ListWidget;
+class QSUiTabWidget;
/**
@@ -91,11 +93,10 @@ private slots:
private:
void closeEvent(QCloseEvent *);
void hideEvent(QHideEvent *);
+ void createWidgets();
void createActions();
- void createButtons();
void writeSettings();
bool m_wasMaximized;
- QString m_lastDir;
PlayListManager *m_pl_manager;
Ui::MainWindow m_ui;
MediaPlayer *m_player;
@@ -112,10 +113,11 @@ private:
KeyboardManager *m_key_manager;
QSUiAnalyzer *m_analyzer;
QToolButton *m_addListButton, *m_tabListMenuButton;
+ ListWidget *m_listWidget;
MetaDataFormatter m_titleFormatter;
- int m_balance;
bool m_update;
bool m_hideOnClose;
+ QSUiTabWidget *m_tabWidget;
};
diff --git a/src/plugins/Ui/qsui/qsuitabwidget.cpp b/src/plugins/Ui/qsui/qsuitabwidget.cpp
index 6dfad0433..5a841a90f 100644
--- a/src/plugins/Ui/qsui/qsuitabwidget.cpp
+++ b/src/plugins/Ui/qsui/qsuitabwidget.cpp
@@ -1,5 +1,6 @@
/***************************************************************************
- * Copyright (C) 2012-2015 by Ilya Kotov *
+ * Copyright (C) 2016 The Qt Company Ltd. *
+ * Copyright (C) 2016 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -18,42 +19,146 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
-#include <QMouseEvent>
-#include <QTabBar>
+//Based on QTabWidget class copyrighted by Qt Company Ltd.
+
+#include <QStylePainter>
#include <QSettings>
#include <QApplication>
-#include <qmmp/qmmp.h>
-#include "qsuitabbar.h"
+#include <QStyleOptionTabWidgetFrame>
+#include <qmmpui/playlistmanager.h>
#include "qsuitabwidget.h"
-QSUiTabWidget::QSUiTabWidget(QWidget *parent) : QTabWidget(parent)
+QSUiTabWidget::QSUiTabWidget(QWidget *parent) : QWidget(parent)
{
- setTabBar(new QSUiTabBar(this));
- setMovable(true);
+ m_tabBar = new QSUiTabBar(this);
+ m_tabBar->setMovable(true);
+ m_tabBar->setExpanding(false);
+ m_listWidget = new ListWidget(PlayListManager::instance()->selectedPlayList(), this);
+ m_listWidget->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred,
+ QSizePolicy::TabWidget));
+ setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding,
+ QSizePolicy::TabWidget));
+
+
+ setFocusPolicy(Qt::TabFocus);
+ setFocusProxy(m_tabBar);
+ m_rightCornerWidget = 0;
+ m_leftCornerWidget = 0;
+
m_menu = new QMenu(this);
m_group = new QActionGroup(this);
m_group->setExclusive(true);
- connect(tabBar(), SIGNAL(tabMoved(int,int)), SIGNAL(tabMoved(int,int)));
- connect(tabBar(), SIGNAL(tabMoved(int,int)), SLOT(updateActions()));
- connect(tabBar(), SIGNAL(tabCloseRequested(int)), SLOT(onTabCloseRequest(int)));
- connect(this, SIGNAL(currentChanged(int)), SLOT(onCurrentChanged(int)));
+ connect(m_tabBar, SIGNAL(tabMoved(int,int)), SIGNAL(tabMoved(int,int)));
+ connect(m_tabBar, SIGNAL(tabMoved(int,int)), SLOT(updateActions()));
+ connect(m_tabBar, SIGNAL(tabCloseRequested(int)), SIGNAL(tabCloseRequested(int)));
+ connect(m_tabBar, SIGNAL(currentChanged(int)), SLOT(onCurrentChanged(int)));
connect(m_menu, SIGNAL(triggered(QAction*)), SLOT(onActionTriggered(QAction*)));
readSettings();
}
-QMenu *QSUiTabWidget::menu()
+QSUiTabBar *QSUiTabWidget::tabBar() const
+{
+ return m_tabBar;
+}
+
+ListWidget *QSUiTabWidget::listWidget() const
+{
+ return m_listWidget;
+}
+
+void QSUiTabWidget::setCornerWidget(QWidget *widget, Qt::Corner corner)
+{
+ if (widget && widget->parentWidget() != this)
+ widget->setParent(this);
+
+ if (corner & Qt::TopRightCorner)
+ {
+ if (m_rightCornerWidget)
+ m_rightCornerWidget->hide();
+ m_rightCornerWidget = widget;
+ }
+ else
+ {
+ if (m_leftCornerWidget)
+ m_leftCornerWidget->hide();
+ m_leftCornerWidget = widget;
+ }
+ setUpLayout();
+}
+
+void QSUiTabWidget::readSettings()
+{
+ QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
+ settings.beginGroup("Simple");
+ m_tabBar->setTabsClosable(settings.value("pl_tabs_closable", false).toBool());
+ QFont tab_font = qApp->font(m_tabBar);
+ if(!settings.value("use_system_fonts", true).toBool())
+ {
+ tab_font.fromString(settings.value("pl_tabs_font", tab_font.toString()).toString());
+ }
+ m_tabBar->setFont(tab_font);
+ settings.endGroup();
+ m_tabBar->updateGeometry();
+ setUpLayout();
+}
+
+QMenu *QSUiTabWidget::menu() const
{
return m_menu;
}
-void QSUiTabWidget::onTabCloseRequest(int i)
+void QSUiTabWidget::setTabText(int index, const QString &text)
{
- if(!tabsClosable())
- emit tabCloseRequested(i);
+ QString tabText = text;
+ tabText.replace("&","&&");
+ m_tabBar->setTabText(index, tabText);
+ m_menu->actions().at(index)->setText(tabText);
+}
+
+int QSUiTabWidget::addTab(const QString &label)
+{
+ return insertTab(-1, label);
+}
+
+int QSUiTabWidget::addTab(const QIcon &icon, const QString &label)
+{
+ return insertTab(-1, icon, label);
+}
+
+int QSUiTabWidget::insertTab(int index, const QString &label)
+{
+ return insertTab(index, QIcon(), label);
+}
+
+int QSUiTabWidget::insertTab(int index, const QIcon &icon, const QString &label)
+{
+ QString tabText = label;
+ index = m_tabBar->insertTab(index, icon, tabText.replace("&", "&&"));
+ setUpLayout();
+ tabInserted(index);
+ return index;
+}
+
+void QSUiTabWidget::removeTab(int index)
+{
+ m_tabBar->removeTab(index);
+ setUpLayout();
+ tabRemoved(index);
+}
+
+void QSUiTabWidget::setTabsVisible(bool visible)
+{
+ m_tabBar->setVisible(visible);
+}
+
+void QSUiTabWidget::setCurrentIndex(int index)
+{
+ m_tabBar->setCurrentIndex(index);
}
void QSUiTabWidget::onCurrentChanged(int index)
{
+ emit currentChanged(index);
if(index >= m_menu->actions().count())
return;
m_menu->actions().at(index)->setChecked(true);
@@ -61,16 +166,136 @@ void QSUiTabWidget::onCurrentChanged(int index)
void QSUiTabWidget::onActionTriggered(QAction *action)
{
- setCurrentIndex(m_menu->actions().indexOf(action));
+ m_tabBar->setCurrentIndex(m_menu->actions().indexOf(action));
}
void QSUiTabWidget::updateActions()
{
for(int i = 0; i < m_menu->actions().size(); ++i)
{
- m_menu->actions().at(i)->setText(tabText(i));
+ m_menu->actions().at(i)->setText(m_tabBar->tabText(i));
}
- m_menu->actions().at(currentIndex())->setChecked(true);
+ m_menu->actions().at(m_tabBar->currentIndex())->setChecked(true);
+}
+
+void QSUiTabWidget::initStyleOption(QStyleOptionTabWidgetFrame *option) const
+{
+ if (!option)
+ return;
+
+ option->initFrom(this);
+ option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this);
+
+ int exth = style()->pixelMetric(QStyle::PM_TabBarBaseHeight, 0, this);
+ QSize t(0, 0);
+ if (m_tabBar->isVisibleTo(const_cast<QSUiTabWidget *>(this)))
+ t = m_tabBar->sizeHint();
+
+ if (m_rightCornerWidget)
+ {
+ const QSize rightCornerSizeHint = m_rightCornerWidget->sizeHint();
+ const QSize bounds(rightCornerSizeHint.width(), t.height() - exth);
+ option->rightCornerWidgetSize = rightCornerSizeHint.boundedTo(bounds);
+ }
+ else
+ {
+ option->rightCornerWidgetSize = QSize(0, 0);
+ }
+
+ if (m_leftCornerWidget)
+ {
+ const QSize leftCornerSizeHint = m_leftCornerWidget->sizeHint();
+ const QSize bounds(leftCornerSizeHint.width(), t.height() - exth);
+ option->leftCornerWidgetSize = leftCornerSizeHint.boundedTo(bounds);
+ }
+ else
+ {
+ option->leftCornerWidgetSize = QSize(0, 0);
+ }
+
+
+ option->shape = QTabBar::RoundedNorth;
+
+ option->tabBarSize = t;
+
+#if QT_VERSION >= 0x050000
+ QRect tbRect = m_tabBar->geometry();
+ QRect selectedTabRect = tabBar()->tabRect(tabBar()->currentIndex());
+ option->tabBarRect = tbRect;
+ selectedTabRect.moveTopLeft(selectedTabRect.topLeft() + tbRect.topLeft());
+ option->selectedTabRect = selectedTabRect;
+#else
+ if(QStyleOptionTabWidgetFrameV2 *tabframe = qstyleoption_cast<QStyleOptionTabWidgetFrameV2*>(option))
+ {
+ QRect tbRect = tabBar()->geometry();
+ QRect selectedTabRect = tabBar()->tabRect(tabBar()->currentIndex());
+ tabframe->tabBarRect = tbRect;
+ selectedTabRect.moveTopLeft(selectedTabRect.topLeft() + tbRect.topLeft());
+ tabframe->selectedTabRect = selectedTabRect;
+ }
+#endif
+}
+
+void QSUiTabWidget::setUpLayout()
+{
+ QStyleOptionTabWidgetFrame option;
+ initStyleOption(&option);
+
+ QRect tabRect = style()->subElementRect(QStyle::SE_TabWidgetTabBar, &option, this);
+ m_panelRect = style()->subElementRect(QStyle::SE_TabWidgetTabPane, &option, this);
+ QRect contentsRect = style()->subElementRect(QStyle::SE_TabWidgetTabContents, &option, this);
+ QRect leftCornerRect = style()->subElementRect(QStyle::SE_TabWidgetLeftCorner, &option, this);
+ QRect rightCornerRect = style()->subElementRect(QStyle::SE_TabWidgetRightCorner, &option, this);
+
+ m_tabBar->setGeometry(tabRect);
+ m_listWidget->setGeometry(contentsRect);
+ if (m_leftCornerWidget)
+ m_leftCornerWidget->setGeometry(leftCornerRect);
+ if (m_rightCornerWidget)
+ m_rightCornerWidget->setGeometry(rightCornerRect);
+
+ updateGeometry();
+}
+
+void QSUiTabWidget::showEvent(QShowEvent *)
+{
+ setUpLayout();
+}
+
+void QSUiTabWidget::resizeEvent(QResizeEvent *e)
+{
+ QWidget::resizeEvent(e);
+ setUpLayout();
+}
+
+void QSUiTabWidget::paintEvent(QPaintEvent *)
+{
+ if(!m_tabBar->isVisibleTo(this))
+ return;
+ QStylePainter p(this);
+
+ QStyleOptionTabWidgetFrame opt;
+ initStyleOption(&opt);
+ opt.rect = m_panelRect;
+ p.drawPrimitive(QStyle::PE_FrameTabWidget, opt);
+}
+
+void QSUiTabWidget::changeEvent(QEvent *ev)
+{
+ if (ev->type() == QEvent::StyleChange
+#ifdef Q_OS_MAC
+ || ev->type() == QEvent::MacSizeChange
+#endif
+ )
+ setUpLayout();
+ QWidget::changeEvent(ev);
+}
+
+bool QSUiTabWidget::event(QEvent *ev)
+{
+ if (ev->type() == QEvent::LayoutRequest)
+ setUpLayout();
+ return QWidget::event(ev);
}
void QSUiTabWidget::tabInserted(int index)
@@ -78,7 +303,7 @@ void QSUiTabWidget::tabInserted(int index)
QAction *action = new QAction(m_menu);
action->setCheckable(true);
action->setActionGroup(m_group);
- action->setText(tabText(index));
+ action->setText(m_tabBar->tabText(index));
if(m_menu->actions().isEmpty() || index == m_menu->actions().count())
{
@@ -89,9 +314,8 @@ void QSUiTabWidget::tabInserted(int index)
QAction *before = m_menu->actions().at(index);
m_menu->insertAction(before, action);
}
- if(currentIndex() == index)
+ if(m_tabBar->currentIndex() == index)
action->setChecked(true);
- QTabWidget::tabInserted(index);
}
void QSUiTabWidget::tabRemoved(int index)
@@ -99,30 +323,6 @@ void QSUiTabWidget::tabRemoved(int index)
QAction *a = m_menu->actions().at(index);
m_menu->removeAction(a);
delete a;
- QTabWidget::tabRemoved(index);
-}
-
-void QSUiTabWidget::setTabText(int index, const QString &text)
-{
- QTabWidget::setTabText(index, text);
- m_menu->actions().at(index)->setText(text);
-}
-
-void QSUiTabWidget::readSettings()
-{
- QSettings settings(Qmmp::configFile(), QSettings::IniFormat);
- settings.beginGroup("Simple");
- QFont tab_font = qApp->font(tabBar());
- if(!settings.value("use_system_fonts", true).toBool())
- {
- tab_font.fromString(settings.value("pl_tabs_font", tab_font.toString()).toString());
- }
- tabBar()->setFont(tab_font);
-}
-
-void QSUiTabWidget::setTabsVisible(bool visible)
-{
- tabBar()->setVisible(visible);
}
void QSUiTabWidget::mousePressEvent(QMouseEvent *e)
@@ -133,7 +333,7 @@ void QSUiTabWidget::mousePressEvent(QMouseEvent *e)
e->accept();
emit createPlayListRequested();
}
- QTabWidget::mousePressEvent(e);
+ QWidget::mousePressEvent(e);
}
void QSUiTabWidget::mouseDoubleClickEvent(QMouseEvent *e)
@@ -144,5 +344,5 @@ void QSUiTabWidget::mouseDoubleClickEvent(QMouseEvent *e)
e->accept();
emit createPlayListRequested();
}
- QTabWidget::mouseDoubleClickEvent(e);
+ QWidget::mouseDoubleClickEvent(e);
}
diff --git a/src/plugins/Ui/qsui/qsuitabwidget.h b/src/plugins/Ui/qsui/qsuitabwidget.h
index 8bf4f6968..c15b3d4e3 100644
--- a/src/plugins/Ui/qsui/qsuitabwidget.h
+++ b/src/plugins/Ui/qsui/qsuitabwidget.h
@@ -1,5 +1,6 @@
/***************************************************************************
- * Copyright (C) 2012-2015 by Ilya Kotov *
+ * Copyright (C) 2016 The Qt Company Ltd. *
+ * Copyright (C) 2016 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -17,49 +18,78 @@
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
-
#ifndef QSUITABWIDGET_H
#define QSUITABWIDGET_H
-#include <QTabWidget>
+#include <QWidget>
#include <QMenu>
+#include <QActionGroup>
+#include "qsuitabbar.h"
+#include "listwidget.h"
-class QActionGroup;
-
+class QStyleOptionTabWidgetFrame;
/**
@author Ilya Kotov <forkotov02@hotmail.ru>
*/
-class QSUiTabWidget : public QTabWidget
+class QSUiTabWidget : public QWidget
{
Q_OBJECT
public:
- explicit QSUiTabWidget(QWidget *parent = 0);
+ QSUiTabWidget(QWidget *parent = 0);
- QMenu *menu();
- void setTabText(int index, const QString &text);
+ QSUiTabBar *tabBar() const;
+ ListWidget *listWidget() const;
+ void setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner);
void readSettings();
+ QMenu *menu() const;
+ void setTabText(int index, const QString &text);
+
+ int addTab(const QString &label);
+ int addTab(const QIcon& icon, const QString &label);
+
+ int insertTab(int index, const QString &label);
+ int insertTab(int index, const QIcon& icon, const QString &label);
+
+ void removeTab(int index);
+
signals:
void tabMoved(int from, int to);
void createPlayListRequested();
+ void tabCloseRequested(int);
+ void currentChanged(int);
public slots:
void setTabsVisible(bool visible);
+ void setCurrentIndex(int index);
private slots:
- void onTabCloseRequest(int i);
void onCurrentChanged(int index);
void onActionTriggered(QAction *action);
void updateActions();
private:
- void tabInserted(int index);
- void tabRemoved(int index);
+ void initStyleOption(QStyleOptionTabWidgetFrame *option) const;
+ void setUpLayout();
+ void showEvent(QShowEvent *);
+ void resizeEvent(QResizeEvent *e);
+ void paintEvent(QPaintEvent *);
+ void setTabBar(QTabBar *);
+ void changeEvent(QEvent *ev);
+ bool event(QEvent *ev);
void mousePressEvent(QMouseEvent *e);
void mouseDoubleClickEvent(QMouseEvent *e);
+ void tabInserted(int index);
+ void tabRemoved(int index);
+
+ QSUiTabBar *m_tabBar;
+ ListWidget *m_listWidget;
+ QWidget *m_rightCornerWidget;
+ QWidget *m_leftCornerWidget;
+ QRect m_panelRect;
QMenu *m_menu;
QActionGroup *m_group;
-
};
-#endif // QSUITABWIDGET_H
+
+#endif