diff options
Diffstat (limited to 'src/plugins/Ui/qsui/qsuitabwidget.cpp')
| -rw-r--r-- | src/plugins/Ui/qsui/qsuitabwidget.cpp | 296 |
1 files changed, 248 insertions, 48 deletions
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); } |
