diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index e547916..50aa1d7 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -127,7 +127,7 @@ struct MainWindowPrivate Ui::MainWindow ui; QAction* SavePerspectiveAction = nullptr; QWidgetAction* PerspectiveListAction = nullptr; - QComboBox* PerspectiveComboBox = nullptr;; + QComboBox* PerspectiveComboBox = nullptr; ads::CDockManager* DockManager = nullptr; MainWindowPrivate(CMainWindow* _public) : _this(_public) {} @@ -188,6 +188,7 @@ void MainWindowPrivate::createContent() auto TopDockArea = DockManager->addDockWidget(ads::TopDockWidgetArea, FileSystemWidget); DockWidget = createCalendarDockWidget(ViewMenu); DockWidget->setFeature(ads::CDockWidget::DockWidgetClosable, false); + DockWidget->setTabToolTip(QString("Tab ToolTip\nHodie est dies magna")); DockManager->addDockWidget(ads::CenterDockWidgetArea, DockWidget, TopDockArea); // Test dock area docking diff --git a/src/DockAreaTitleBar.cpp b/src/DockAreaTitleBar.cpp index 5c1e151..65bc3dd 100644 --- a/src/DockAreaTitleBar.cpp +++ b/src/DockAreaTitleBar.cpp @@ -119,9 +119,14 @@ void DockAreaTitleBarPrivate::createButtons() TabsMenuButton->setIcon(_this->style()->standardIcon(QStyle::SP_TitleBarUnshadeButton)); QMenu* TabsMenu = new QMenu(TabsMenuButton); + #ifndef QT_NO_TOOLTIP + TabsMenu->setToolTipsVisible(true); + #endif _this->connect(TabsMenu, SIGNAL(aboutToShow()), SLOT(onTabsMenuAboutToShow())); TabsMenuButton->setMenu(TabsMenu); + #ifndef QT_NO_TOOLTIP TabsMenuButton->setToolTip(QObject::tr("List all tabs")); + #endif TabsMenuButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); TopLayout->addWidget(TabsMenuButton, 0); _this->connect(TabsMenuButton->menu(), SIGNAL(triggered(QAction*)), @@ -131,7 +136,9 @@ void DockAreaTitleBarPrivate::createButtons() UndockButton = new tTileBarButton(); UndockButton->setObjectName("undockButton"); UndockButton->setAutoRaise(true); + #ifndef QT_NO_TOOLTIP UndockButton->setToolTip(QObject::tr("Detach Group")); + #endif UndockButton->setIcon(_this->style()->standardIcon(QStyle::SP_TitleBarNormalButton)); UndockButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); TopLayout->addWidget(UndockButton, 0); @@ -148,6 +155,7 @@ void DockAreaTitleBarPrivate::createButtons() CloseIcon.addPixmap(disabledPixmap, QIcon::Disabled); CloseButton->setIcon(CloseIcon); + #ifndef QT_NO_TOOLTIP if (testConfigFlag(CDockManager::DockAreaCloseButtonClosesTab)) { CloseButton->setToolTip(QObject::tr("Close Active Tab")); @@ -156,6 +164,7 @@ void DockAreaTitleBarPrivate::createButtons() { CloseButton->setToolTip(QObject::tr("Close Group")); } + #endif CloseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); TopLayout->addWidget(CloseButton, 0); _this->connect(CloseButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked())); @@ -240,6 +249,9 @@ void CDockAreaTitleBar::onTabsMenuAboutToShow() } auto Tab = d->TabBar->tab(i); QAction* Action = menu->addAction(Tab->icon(), Tab->text()); + #ifndef QT_NO_TOOLTIP + Action->setToolTip(Tab->toolTip()); + #endif Action->setData(i); } @@ -312,6 +324,7 @@ QAbstractButton* CDockAreaTitleBar::button(TitleBarButton which) const void CDockAreaTitleBar::setVisible(bool Visible) { Super::setVisible(Visible); + markTabsMenuOutdated(); } diff --git a/src/DockAreaTitleBar.h b/src/DockAreaTitleBar.h index 9e30963..3ea1d3e 100644 --- a/src/DockAreaTitleBar.h +++ b/src/DockAreaTitleBar.h @@ -53,7 +53,6 @@ private: friend struct DockAreaTitleBarPrivate; private slots: - void markTabsMenuOutdated(); void onTabsMenuAboutToShow(); void onCloseButtonClicked(); void onUndockButtonClicked(); @@ -61,6 +60,10 @@ private slots: void onCurrentTabChanged(int Index); void showContextMenu(const QPoint& pos); +public slots: + void markTabsMenuOutdated(); + + public: using Super = QFrame; /** @@ -88,6 +91,7 @@ public: */ virtual void setVisible(bool Visible) override; + signals: /** * This signal is emitted if a tab in the tab bar is clicked by the user diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index 5e05f36..038a168 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -236,11 +236,11 @@ using DockAreaLayout = CDockAreaLayout; */ struct DockAreaWidgetPrivate { - CDockAreaWidget* _this; - QBoxLayout* Layout; - DockAreaLayout* ContentsLayout; - CDockAreaTitleBar* TitleBar; - CDockManager* DockManager = nullptr; + CDockAreaWidget* _this = nullptr; + QBoxLayout* Layout = nullptr; + DockAreaLayout* ContentsLayout = nullptr; + CDockAreaTitleBar* TitleBar = nullptr; + CDockManager* DockManager = nullptr; bool UpdateCloseButton = false; /** @@ -680,10 +680,24 @@ void CDockAreaWidget::updateTitleBarVisibility() return; } - d->TitleBar->setVisible(!Container->isFloating() || !Container->hasTopLevelDockWidget()); + if (d->TitleBar) + { + d->TitleBar->setVisible(!Container->isFloating() || !Container->hasTopLevelDockWidget()); + } } +//============================================================================ +void CDockAreaWidget::markTitleBarMenuOutdated() +{ + if (d->TitleBar) + { + d->TitleBar->markTabsMenuOutdated(); + } +} + + + //============================================================================ void CDockAreaWidget::saveState(QXmlStreamWriter& s) const { diff --git a/src/DockAreaWidget.h b/src/DockAreaWidget.h index d227fa4..02f2339 100644 --- a/src/DockAreaWidget.h +++ b/src/DockAreaWidget.h @@ -130,6 +130,12 @@ protected: */ void internalSetCurrentDockWidget(CDockWidget* DockWidget); + + /** + * Marks tabs menu to update + */ + void markTitleBarMenuOutdated(); + protected slots: void toggleView(bool Open); diff --git a/src/DockWidget.cpp b/src/DockWidget.cpp index 9389d3a..8ecdb13 100644 --- a/src/DockWidget.cpp +++ b/src/DockWidget.cpp @@ -58,8 +58,8 @@ namespace ads */ struct DockWidgetPrivate { - CDockWidget* _this; - QBoxLayout* Layout; + CDockWidget* _this = nullptr; + QBoxLayout* Layout = nullptr; QWidget* Widget = nullptr; CDockWidgetTab* TabWidget = nullptr; CDockWidget::DockWidgetFeatures Features = CDockWidget::AllDockWidgetFeatures; @@ -516,12 +516,36 @@ bool CDockWidget::event(QEvent *e) { d->ToggleViewAction->setText(title); } + if (d->DockArea) + { + d->DockArea->markTitleBarMenuOutdated();//update tabs menu + } emit titleChanged(title); } - return QFrame::event(e); + return Super::event(e); } +#ifndef QT_NO_TOOLTIP +//============================================================================ +void CDockWidget::setTabToolTip(const QString &text) +{ + if (d->TabWidget) + { + d->TabWidget->setToolTip(text); + } + if (d->ToggleViewAction) + { + d->ToggleViewAction->setToolTip(text); + } + if (d->DockArea) + { + d->DockArea->markTitleBarMenuOutdated();//update tabs menu + } +} +#endif + + //============================================================================ void CDockWidget::setIcon(const QIcon& Icon) { diff --git a/src/DockWidget.h b/src/DockWidget.h index a50e0c1..e083137 100644 --- a/src/DockWidget.h +++ b/src/DockWidget.h @@ -136,6 +136,8 @@ protected: void toggleViewInternal(bool Open); public: + using Super = QFrame; + enum DockWidgetFeature { DockWidgetClosable = 0x01, @@ -385,6 +387,14 @@ public: QSize toolBarIconSize(eState State) const; + #ifndef QT_NO_TOOLTIP + /** + * This is function sets text tooltip for title bar widget + * and tooltip for toggle view action + */ + void setTabToolTip(const QString &text); + #endif + public: // reimplements QFrame ----------------------------------------------- /** * Emits titleChanged signal if title change event occurs diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 887eb4a..ac5482d 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -153,7 +153,9 @@ void DockWidgetTabPrivate::createLayout() CloseButton->setIcon(CloseIcon); CloseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); CloseButton->setVisible(false); + #ifndef QT_NO_TOOLTIP CloseButton->setToolTip(QObject::tr("Close Tab")); + #endif _this->connect(CloseButton, SIGNAL(clicked()), SIGNAL(closeRequested())); QFontMetrics fm(TitleLabel->font()); @@ -264,7 +266,7 @@ void CDockWidgetTab::mousePressEvent(QMouseEvent* ev) emit clicked(); return; } - QFrame::mousePressEvent(ev); + Super::mousePressEvent(ev); } @@ -280,7 +282,7 @@ void CDockWidgetTab::mouseReleaseEvent(QMouseEvent* ev) d->DragStartMousePosition = QPoint(); d->DragState = DraggingInactive; - QFrame::mouseReleaseEvent(ev); + Super::mouseReleaseEvent(ev); } @@ -290,7 +292,7 @@ void CDockWidgetTab::mouseMoveEvent(QMouseEvent* ev) if (!(ev->buttons() & Qt::LeftButton) || d->isDraggingState(DraggingInactive)) { d->DragState = DraggingInactive; - QFrame::mouseMoveEvent(ev); + Super::mouseMoveEvent(ev); return; } @@ -298,7 +300,7 @@ void CDockWidgetTab::mouseMoveEvent(QMouseEvent* ev) if (d->isDraggingState(DraggingFloatingWidget)) { d->FloatingWidget->moveFloating(); - QFrame::mouseMoveEvent(ev); + Super::mouseMoveEvent(ev); return; } @@ -338,7 +340,7 @@ void CDockWidgetTab::mouseMoveEvent(QMouseEvent* ev) return; } - QFrame::mouseMoveEvent(ev); + Super::mouseMoveEvent(ev); } @@ -422,7 +424,9 @@ void CDockWidgetTab::setIcon(const QIcon& Icon) d->IconLabel = new QLabel(); d->IconLabel->setAlignment(Qt::AlignVCenter); d->IconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); + #ifndef QT_NO_TOOLTIP d->IconLabel->setToolTip(d->TitleLabel->toolTip()); + #endif Layout->insertWidget(0, d->IconLabel, Qt::AlignVCenter); Layout->insertSpacing(1, qRound(1.5 * Layout->contentsMargins().left() / 2.0)); } @@ -504,7 +508,25 @@ void CDockWidgetTab::onDetachActionTriggered() d->startFloating(DraggingInactive); } -} // namespace ads + + +//============================================================================ +bool CDockWidgetTab::event(QEvent *e) +{ + #ifndef QT_NO_TOOLTIP + if (e->type() == QEvent::ToolTipChange) + { + const auto text = toolTip(); + d->TitleLabel->setToolTip(text); + } + #endif + return Super::event(e); +} + + + + +} // namespace ads //--------------------------------------------------------------------------- // EOF DockWidgetTab.cpp diff --git a/src/DockWidgetTab.h b/src/DockWidgetTab.h index f828190..9acbe15 100644 --- a/src/DockWidgetTab.h +++ b/src/DockWidgetTab.h @@ -136,6 +136,12 @@ public: */ bool isClosable() const; + + /** + * Track event ToolTipChange and set child ToolTip + */ + virtual bool event(QEvent *e) override; + public slots: virtual void setVisible(bool visible) override; diff --git a/src/ElidingLabel.cpp b/src/ElidingLabel.cpp index cfebb16..8e6ea56 100644 --- a/src/ElidingLabel.cpp +++ b/src/ElidingLabel.cpp @@ -88,7 +88,9 @@ CElidingLabel::CElidingLabel(const QString& text, QWidget* parent, Qt::WindowFla d(new ElidingLabelPrivate(this)) { d->Text = text; +#ifndef QT_NO_TOOLTIP setToolTip(text); +#endif } @@ -183,7 +185,9 @@ void CElidingLabel::setText(const QString &text) else { d->Text = text; +#ifndef QT_NO_TOOLTIP setToolTip( text ); +#endif d->elideText(this->size().width()); } }