|
| 1 | +//============================================================================ |
| 2 | +/// \file DockAreaTitleBar.cpp |
| 3 | +/// \author Uwe Kindler |
| 4 | +/// \date 12.10.2018 |
| 5 | +/// \brief Implementation of CDockAreaTitleBar class |
| 6 | +//============================================================================ |
| 7 | + |
| 8 | +//============================================================================ |
| 9 | +// INCLUDES |
| 10 | +//============================================================================ |
| 11 | +#include "DockAreaTitleBar.h" |
| 12 | + |
| 13 | +#include <QPushButton> |
| 14 | +#include <QBoxLayout> |
| 15 | +#include <QStyle> |
| 16 | +#include <QMenu> |
| 17 | +#include <QScrollArea> |
| 18 | +#include <QMouseEvent> |
| 19 | +#include <QDebug> |
| 20 | + |
| 21 | +#include "FloatingDockContainer.h" |
| 22 | +#include "DockAreaWidget.h" |
| 23 | +#include "DockOverlay.h" |
| 24 | +#include "DockManager.h" |
| 25 | +#include "DockWidget.h" |
| 26 | +#include "DockWidgetTab.h" |
| 27 | +#include "DockAreaTabBar.h" |
| 28 | + |
| 29 | +#include <iostream> |
| 30 | + |
| 31 | +namespace ads |
| 32 | +{ |
| 33 | +/** |
| 34 | + * Private data class of CDockAreaTitleBar class (pimpl) |
| 35 | + */ |
| 36 | +struct DockAreaTitleBarPrivate |
| 37 | +{ |
| 38 | + CDockAreaTitleBar* _this; |
| 39 | + QPushButton* TabsMenuButton; |
| 40 | + QPushButton* CloseButton; |
| 41 | + QBoxLayout* TopLayout; |
| 42 | + CDockAreaWidget* DockArea; |
| 43 | + CDockAreaTabBar* TabBar; |
| 44 | + bool MenuOutdated = true; |
| 45 | + QMenu* TabsMenu; |
| 46 | + |
| 47 | + /** |
| 48 | + * Private data constructor |
| 49 | + */ |
| 50 | + DockAreaTitleBarPrivate(CDockAreaTitleBar* _public); |
| 51 | + |
| 52 | + /** |
| 53 | + * Creates the title bar close and menu buttons |
| 54 | + */ |
| 55 | + void createButtons(); |
| 56 | + |
| 57 | + /** |
| 58 | + * Creates the internal TabBar |
| 59 | + */ |
| 60 | + void createTabBar(); |
| 61 | +};// struct DockAreaTitleBarPrivate |
| 62 | + |
| 63 | + |
| 64 | + |
| 65 | +//============================================================================ |
| 66 | +DockAreaTitleBarPrivate::DockAreaTitleBarPrivate(CDockAreaTitleBar* _public) : |
| 67 | + _this(_public) |
| 68 | +{ |
| 69 | + |
| 70 | +} |
| 71 | + |
| 72 | + |
| 73 | +//============================================================================ |
| 74 | +void DockAreaTitleBarPrivate::createButtons() |
| 75 | +{ |
| 76 | + TabsMenuButton = new QPushButton(); |
| 77 | + TabsMenuButton->setObjectName("tabsMenuButton"); |
| 78 | + TabsMenuButton->setFlat(true); |
| 79 | + TabsMenuButton->setIcon(_this->style()->standardIcon(QStyle::SP_TitleBarUnshadeButton)); |
| 80 | + TabsMenuButton->setMaximumWidth(TabsMenuButton->iconSize().width()); |
| 81 | + |
| 82 | + QMenu* TabsMenu = new QMenu(TabsMenuButton); |
| 83 | + _this->connect(TabsMenu, SIGNAL(aboutToShow()), SLOT(onTabsMenuAboutToShow())); |
| 84 | + TabsMenuButton->setMenu(TabsMenu); |
| 85 | + TopLayout->addWidget(TabsMenuButton, 0); |
| 86 | + TabsMenuButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); |
| 87 | + _this->connect(TabsMenuButton->menu(), SIGNAL(triggered(QAction*)), |
| 88 | + SLOT(onTabsMenuActionTriggered(QAction*))); |
| 89 | + |
| 90 | + CloseButton = new QPushButton(); |
| 91 | + CloseButton->setObjectName("closeButton"); |
| 92 | + CloseButton->setFlat(true); |
| 93 | + CloseButton->setIcon(_this->style()->standardIcon(QStyle::SP_TitleBarCloseButton)); |
| 94 | + CloseButton->setToolTip(QObject::tr("Close")); |
| 95 | + CloseButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); |
| 96 | + TopLayout->addWidget(CloseButton, 0); |
| 97 | + _this->connect(CloseButton, SIGNAL(clicked()), SLOT(onCloseButtonClicked())); |
| 98 | +} |
| 99 | + |
| 100 | + |
| 101 | +//============================================================================ |
| 102 | +void DockAreaTitleBarPrivate::createTabBar() |
| 103 | +{ |
| 104 | + TabBar = new CDockAreaTabBar(DockArea); |
| 105 | + TopLayout->addWidget(TabBar); |
| 106 | + _this->connect(TabBar, SIGNAL(tabClosed()), SLOT(markTabsMenuOutdated())); |
| 107 | + _this->connect(TabBar, SIGNAL(tabOpened()), SLOT(markTabsMenuOutdated())); |
| 108 | + _this->connect(TabBar, SIGNAL(tabInserted()), SLOT(markTabsMenuOutdated())); |
| 109 | + _this->connect(TabBar, SIGNAL(tabRemoved()), SLOT(markTabsMenuOutdated())); |
| 110 | +} |
| 111 | + |
| 112 | + |
| 113 | +//============================================================================ |
| 114 | +CDockAreaTitleBar::CDockAreaTitleBar(CDockAreaWidget* parent) : |
| 115 | + QFrame(parent), |
| 116 | + d(new DockAreaTitleBarPrivate(this)) |
| 117 | +{ |
| 118 | + d->DockArea = parent; |
| 119 | + |
| 120 | + setObjectName("dockAreaTitleBar"); |
| 121 | + d->TopLayout = new QBoxLayout(QBoxLayout::LeftToRight); |
| 122 | + d->TopLayout->setContentsMargins(0, 0, 0, 0); |
| 123 | + d->TopLayout->setSpacing(0); |
| 124 | + setLayout(d->TopLayout); |
| 125 | + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); |
| 126 | + |
| 127 | + d->createTabBar(); |
| 128 | + d->createButtons(); |
| 129 | + |
| 130 | +} |
| 131 | + |
| 132 | + |
| 133 | +//============================================================================ |
| 134 | +CDockAreaTitleBar::~CDockAreaTitleBar() |
| 135 | +{ |
| 136 | + delete d; |
| 137 | +} |
| 138 | + |
| 139 | + |
| 140 | +//============================================================================ |
| 141 | +CDockAreaTabBar* CDockAreaTitleBar::tabBar() const |
| 142 | +{ |
| 143 | + return d->TabBar; |
| 144 | +} |
| 145 | + |
| 146 | + |
| 147 | +//============================================================================ |
| 148 | +void CDockAreaTitleBar::markTabsMenuOutdated() |
| 149 | +{ |
| 150 | + qDebug() << "CDockAreaTitleBar::markTabsMenuOutdated()"; |
| 151 | + d->MenuOutdated = true; |
| 152 | +} |
| 153 | + |
| 154 | + |
| 155 | +//============================================================================ |
| 156 | +void CDockAreaTitleBar::onTabsMenuAboutToShow() |
| 157 | +{ |
| 158 | + if (!d->MenuOutdated) |
| 159 | + { |
| 160 | + return; |
| 161 | + } |
| 162 | + |
| 163 | + QMenu* menu = d->TabsMenuButton->menu(); |
| 164 | + menu->clear(); |
| 165 | + for (int i = 0; i < d->TabBar->count(); ++i) |
| 166 | + { |
| 167 | + if (!d->TabBar->isTabOpen(i)) |
| 168 | + { |
| 169 | + continue; |
| 170 | + } |
| 171 | + auto Tab = d->TabBar->tab(i); |
| 172 | + QAction* Action = menu->addAction(Tab->icon(), Tab->text()); |
| 173 | + Action->setData(i); |
| 174 | + } |
| 175 | + |
| 176 | + d->MenuOutdated = false; |
| 177 | +} |
| 178 | + |
| 179 | + |
| 180 | +//============================================================================ |
| 181 | +void CDockAreaTitleBar::onCloseButtonClicked() |
| 182 | +{ |
| 183 | + qDebug() << "CDockAreaTitleBar::onCloseButtonClicked"; |
| 184 | + d->TabBar->closeTab(d->TabBar->currentIndex()); |
| 185 | +} |
| 186 | + |
| 187 | + |
| 188 | +//============================================================================ |
| 189 | +void CDockAreaTitleBar::onTabsMenuActionTriggered(QAction* Action) |
| 190 | +{ |
| 191 | + int Index = Action->data().toInt(); |
| 192 | + d->TabBar->setCurrentIndex(Index); |
| 193 | +} |
| 194 | + |
| 195 | + |
| 196 | +} // namespace ads |
| 197 | + |
| 198 | +//--------------------------------------------------------------------------- |
| 199 | +// EOF DockAreaTitleBar.cpp |
0 commit comments