From 74f6ba333fa0e174437f9bfd304b0a5e17de9cda Mon Sep 17 00:00:00 2001 From: mfreiholz Date: Fri, 26 Feb 2016 09:07:19 +0100 Subject: [PATCH] Adds activeTabChanged() signal to let API users know about this state change. It might be use to re-polish style sheets. --- .../include/ads/ContainerWidget.h | 8 ++++ .../res/stylesheets/vendor-partsolutions.css | 4 +- AdvancedDockingSystem/src/ContainerWidget.cpp | 12 ++++++ .../src/icontitlewidget.cpp | 38 ++++++++++--------- .../src/icontitlewidget.h | 9 +++-- AdvancedDockingSystemDemo/src/main.cpp | 4 +- AdvancedDockingSystemDemo/src/mainwindow.cpp | 12 +++++- AdvancedDockingSystemDemo/src/mainwindow.h | 7 ++-- README.md | 2 +- 9 files changed, 65 insertions(+), 31 deletions(-) diff --git a/AdvancedDockingSystem/include/ads/ContainerWidget.h b/AdvancedDockingSystem/include/ads/ContainerWidget.h index 3c8b383..36261f8 100644 --- a/AdvancedDockingSystem/include/ads/ContainerWidget.h +++ b/AdvancedDockingSystem/include/ads/ContainerWidget.h @@ -118,11 +118,19 @@ private: bool takeContent(const SectionContent::RefPtr& sc, InternalContentData& data); private slots: + void onActiveTabChanged(); void onActionToggleSectionContentVisibility(bool visible); signals: void orientationChanged(); + /*! + * Emits whenever the "isActiveTab" state of a SectionContent changes. + * Whenever the users sets another tab as active, this signal gets invoked + * for the old now inactive tab and the new active tab (the order is unspecified). + */ + void activeTabChanged(const SectionContent::RefPtr& sc, bool active); + private: QList _sections; QList _floatings; diff --git a/AdvancedDockingSystem/res/stylesheets/vendor-partsolutions.css b/AdvancedDockingSystem/res/stylesheets/vendor-partsolutions.css index 4eb7096..0d6262a 100644 --- a/AdvancedDockingSystem/res/stylesheets/vendor-partsolutions.css +++ b/AdvancedDockingSystem/res/stylesheets/vendor-partsolutions.css @@ -48,8 +48,10 @@ IconTitleWidget { ads--SectionTitleWidget QLabel, SectionTitleWidget QLabel { color: #ffffff; + background: #7c9eb3; } ads--SectionTitleWidget[activeTab="true"] QLabel, SectionTitleWidget[activeTab="true"] QLabel { - color: #ffffff; + color: #000000; + background: #E7F3F8; } \ No newline at end of file diff --git a/AdvancedDockingSystem/src/ContainerWidget.cpp b/AdvancedDockingSystem/src/ContainerWidget.cpp index 7c3754b..43fe103 100644 --- a/AdvancedDockingSystem/src/ContainerWidget.cpp +++ b/AdvancedDockingSystem/src/ContainerWidget.cpp @@ -70,6 +70,8 @@ SectionWidget* ContainerWidget::addSectionContent(const SectionContent::RefPtr& data.content = sc; data.titleWidget = new SectionTitleWidget(sc, NULL); data.contentWidget = new SectionContentWidget(sc, NULL); + QObject::connect(data.titleWidget, &SectionTitleWidget::activeTabChanged, this, &ContainerWidget::onActiveTabChanged); + return dropContent(data, sw, area, false); } @@ -1021,6 +1023,16 @@ bool ContainerWidget::takeContent(const SectionContent::RefPtr& sc, InternalCont return found; } +void ContainerWidget::onActiveTabChanged() +{ + SectionTitleWidget* stw = qobject_cast(sender()); + if (stw) + { + qDebug() << "Active tab changed" << stw->_content->uid() << stw->isActiveTab(); + emit activeTabChanged(stw->_content, stw->isActiveTab()); + } +} + void ContainerWidget::onActionToggleSectionContentVisibility(bool visible) { QAction* a = qobject_cast(sender()); diff --git a/AdvancedDockingSystemDemo/src/icontitlewidget.cpp b/AdvancedDockingSystemDemo/src/icontitlewidget.cpp index 85d7946..f5f8d2e 100644 --- a/AdvancedDockingSystemDemo/src/icontitlewidget.cpp +++ b/AdvancedDockingSystemDemo/src/icontitlewidget.cpp @@ -13,23 +13,25 @@ IconTitleWidget::IconTitleWidget(const QIcon& icon, const QString& title, QWidge l->setContentsMargins(0, 0, 0, 0); setLayout(l); - // Icon label - if (icon.isNull()) - { -// QLabel* titleIcon = new QLabel(); -// titleIcon->setPixmap(style()->standardIcon(QStyle::SP_MessageBoxInformation).pixmap(16, 16)); -// l->addWidget(titleIcon); - } - else - { - QLabel* titleIcon = new QLabel(); - titleIcon->setPixmap(icon.pixmap(16, 16)); - l->addWidget(titleIcon); - } + _iconLabel = new QLabel(); + if (!icon.isNull()) + _iconLabel->setPixmap(icon.pixmap(16, 16)); + l->addWidget(_iconLabel); - // Title label - QLabel* titleText = new QLabel(title); - QFont titleFont = titleText->font(); - titleText->setFont(titleFont); - l->addWidget(titleText, 1); + _titleLabel = new QLabel(); + _titleLabel->setText(title); + l->addWidget(_titleLabel, 1); +} + +void IconTitleWidget::polishUpdate() +{ + QList widgets; + widgets.append(_iconLabel); + widgets.append(_titleLabel); + foreach (QWidget* w, widgets) + { + w->style()->unpolish(w); + w->style()->polish(w); + w->update(); + } } diff --git a/AdvancedDockingSystemDemo/src/icontitlewidget.h b/AdvancedDockingSystemDemo/src/icontitlewidget.h index f02f9d0..4be1582 100644 --- a/AdvancedDockingSystemDemo/src/icontitlewidget.h +++ b/AdvancedDockingSystemDemo/src/icontitlewidget.h @@ -4,16 +4,19 @@ #include class QIcon; class QString; +class QLabel; class IconTitleWidget : public QFrame { Q_OBJECT + public: explicit IconTitleWidget(const QIcon& icon, const QString& title, QWidget *parent = 0); + void polishUpdate(); -signals: - -public slots: +public: + QLabel* _iconLabel; + QLabel* _titleLabel; }; #endif // ICONTITLEWIDGET_H diff --git a/AdvancedDockingSystemDemo/src/main.cpp b/AdvancedDockingSystemDemo/src/main.cpp index ec99d8b..f723add 100644 --- a/AdvancedDockingSystemDemo/src/main.cpp +++ b/AdvancedDockingSystemDemo/src/main.cpp @@ -12,8 +12,8 @@ int main(int argc, char *argv[]) //Q_INIT_RESOURCE(ads); // Load style sheet - QFile f(":/stylesheets/default-windows.css"); -// QFile f(":/stylesheets/vendor-partsolutions.css"); +// QFile f(":/stylesheets/default-windows.css"); + QFile f(":/stylesheets/vendor-partsolutions.css"); if (f.open(QFile::ReadOnly)) { QByteArray ba = f.readAll(); diff --git a/AdvancedDockingSystemDemo/src/mainwindow.cpp b/AdvancedDockingSystemDemo/src/mainwindow.cpp index f86cfb1..9174d14 100644 --- a/AdvancedDockingSystemDemo/src/mainwindow.cpp +++ b/AdvancedDockingSystemDemo/src/mainwindow.cpp @@ -9,9 +9,7 @@ #include #include -#include "ads/ContainerWidget.h" #include "ads/SectionWidget.h" -#include "ads/SectionContent.h" #include "icontitlewidget.h" @@ -95,6 +93,7 @@ MainWindow::MainWindow(QWidget *parent) : _container = new ADS_NS::ContainerWidget(); _container->setOrientation(Qt::Vertical); + QObject::connect(_container, &ADS_NS::ContainerWidget::activeTabChanged, this, &MainWindow::onActiveTabChanged); setCentralWidget(_container); // Test #1: Use high-level public API @@ -122,6 +121,15 @@ MainWindow::~MainWindow() delete ui; } +void MainWindow::onActiveTabChanged(const ADS_NS::SectionContent::RefPtr& sc, bool active) +{ + IconTitleWidget* itw = dynamic_cast(sc->titleWidget()); + if (itw) + { + itw->polishUpdate(); + } +} + void MainWindow::onActionAddSectionContentTriggered() { return; diff --git a/AdvancedDockingSystemDemo/src/mainwindow.h b/AdvancedDockingSystemDemo/src/mainwindow.h index 0d7d62a..ee58cce 100644 --- a/AdvancedDockingSystemDemo/src/mainwindow.h +++ b/AdvancedDockingSystemDemo/src/mainwindow.h @@ -3,15 +3,13 @@ #include #include "ads/API.h" +#include "ads/ContainerWidget.h" +#include "ads/SectionContent.h" namespace Ui { class MainWindow; } -ADS_NAMESPACE_BEGIN -class ContainerWidget; -ADS_NAMESPACE_END - class MainWindow : public QMainWindow { Q_OBJECT @@ -21,6 +19,7 @@ public: virtual ~MainWindow(); private slots: + void onActiveTabChanged(const ADS_NS::SectionContent::RefPtr& sc, bool active); void onActionAddSectionContentTriggered(); protected: diff --git a/README.md b/README.md index 8b1039b..bf3304e 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Items sorted by priority - [x] Show close button on right corner of SectionWidget. How to safe last section position? - [x] Serialize state of `_hiddenSectionContents` - [x] Add "title" to SectionContent object, which will be used in visible areas to display contents name. -- [ ] It should be possible to catch the "activeTabChanged" signal for EXTERN_API users +- [x] It should be possible to catch the "activeTabChanged" signal for EXTERN_API users - [x] Add API function to set an SC as active-tab - [ ] Use scrolling for SectionWidget tabs?