diff options
Diffstat (limited to 'src/plugins/Ui')
| -rw-r--r-- | src/plugins/Ui/qsui/forms/mainwindow.ui | 34 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/listwidget.cpp | 30 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/listwidget.h | 1 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/mainwindow.cpp | 137 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/mainwindow.h | 8 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/qsuitabwidget.cpp | 296 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/qsuitabwidget.h | 58 |
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 |
