aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Ui/qsui/qsuitabwidget.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2016-10-11 21:08:07 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2016-10-11 21:08:07 +0000
commit9b9fe8717f96e85934de34f4648ca7d654e4e25d (patch)
tree61f41612a88dc25eeef4622ceea7ee2d621af909 /src/plugins/Ui/qsui/qsuitabwidget.cpp
parentc337773616fc65ea6c0cacd3f9fbcebfbbec3c71 (diff)
downloadqmmp-9b9fe8717f96e85934de34f4648ca7d654e4e25d.tar.gz
qmmp-9b9fe8717f96e85934de34f4648ca7d654e4e25d.tar.bz2
qmmp-9b9fe8717f96e85934de34f4648ca7d654e4e25d.zip
qsui: using single ListWidget inctance
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@6779 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Ui/qsui/qsuitabwidget.cpp')
-rw-r--r--src/plugins/Ui/qsui/qsuitabwidget.cpp296
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);
}