QtCanpool 3.3.0
载入中...
搜索中...
未找到
dockgroup.cpp
浏览该文件的文档.
1
5#include "dockgroup.h"
6#include "dockgroupmanager.h"
7#include "docksubwindow.h"
9#include "dockpanel.h"
10
11#include <QVBoxLayout>
12#include <QIcon>
13#include <QMessageBox>
14#include <QMenu>
15#include <QInputDialog>
16
18
19class DockGroupPrivate
20{
21public:
22 QX_DECLARE_PUBLIC(DockGroup)
23public:
24 DockGroupPrivate();
25public:
26 DockGroup *m_topLevelGroup;
27 DockGroupManager *m_mgr;
28 DockSubWindow *m_subWindow;
29 bool m_canCreateNewGroups;
30 QString m_newPerspectiveDefaultName;
31};
32
33DockGroupPrivate::DockGroupPrivate()
34{
35}
36
37DockGroup::DockGroup(QWidget *parent, bool canCreateNewGroups, DockGroupManager *manager)
38 : DockGroup(parent, nullptr, manager)
39{
40 Q_D(DockGroup);
41 d->m_canCreateNewGroups = canCreateNewGroups;
42 d->m_topLevelGroup = this;
43}
44
45DockGroup::DockGroup(QWidget *parent, DockGroup *topLevelGroup, DockGroupManager *manager)
46 : Super(parent)
47{
49 Q_D(DockGroup);
50 d->m_topLevelGroup = topLevelGroup;
51 d->m_canCreateNewGroups = topLevelGroup ? topLevelGroup->d_ptr->m_canCreateNewGroups : false;
52 d->m_mgr = manager;
53 d->m_subWindow = new DockSubWindow(this);
54
55 QVBoxLayout *layout = new QVBoxLayout(this);
56 layout->setContentsMargins(0, 0, 0, 0);
57 layout->addWidget(d->m_subWindow);
58}
59
64
65DockPanel *DockGroup::addTabWidget(QWidget *widget, const QString &name, DockPanel *after)
66{
67 return addTabWidget(widget, name, QIcon(), after);
68}
69
70DockPanel *DockGroup::addTabWidget(QWidget *widget, const QString &name, QIcon icon, DockPanel *after)
71{
72 for (auto existing : topLevelGroup()->subWindow()->allDockWidgets(true, true)) {
73 if (existing.second->objectName() == name) {
74 QMessageBox::critical(this, "Error", "Name '" + name + "' already in use");
75 return nullptr;
76 }
77 }
78
79 DockWidget *dw = new DockWidget(name);
80 dw->setWidget(widget);
81 dw->setIcon(icon);
82
83 Q_D(DockGroup);
84 // Add the dock widget to the center dock widget area
85 return d->m_subWindow->addDockWidget(Qx::CenterDockWidgetArea, dw, after);
86}
87
88DockGroup *DockGroup::createGroup(const QString &groupName, DockPanel *insertPos)
89{
90 return createGroup(groupName, QIcon(), insertPos);
91}
92
93DockGroup *DockGroup::createGroup(const QString &groupName, QIcon icon, DockPanel *insertPos)
94{
95 Q_D(DockGroup);
96 QString error = getGroupNameError(groupName);
97 if (!error.isEmpty()) {
98 QMessageBox::critical(nullptr, "Error", error);
99 return nullptr;
100 }
101
102 DockGroup *child = new DockGroup(this, d->m_topLevelGroup, d->m_mgr);
103 child->setObjectName(groupName);
104
105 DockWidget *dw = new DockWidget(groupName);
106 dw->setWidget(child);
107 dw->setIcon(icon);
108
109 insertPos = d->m_subWindow->addDockWidget(Qx::CenterDockWidgetArea, dw, insertPos);
110
111 return child;
112}
113
115{
116 Q_D(const DockGroup);
117 return d->m_topLevelGroup;
118}
119
121{
122 auto topLevelGroup = group->topLevelGroup();
123
124 if (topLevelGroup && topLevelGroup != group) {
125 // reaffect all child docks to top-level
126 for (auto dockwidget :
127 group->subWindow()->getWidgetsInGUIOrder()) // don't use allDockWidgets to preserve sub-groups
128 {
130 }
131 assert(group->subWindow()->allDockWidgets(true, true).empty());
132
133 // find widget's parent:
134 for (auto dockwidget : topLevelGroup->subWindow()->allDockWidgets(true, true)) {
135 if (dockwidget.second->widget() == group) {
136 dockwidget.first->removeDockWidget(dockwidget.second);
137 delete dockwidget.second;
138 // delete group; automatically deleted when dockWidget is deleted
139 group = nullptr;
140 break;
141 }
142 }
143
144 assert(group == nullptr);
145 } else {
146 assert(false);
147 }
148}
149
151{
152 Q_D(const DockGroup);
153 return d->m_subWindow;
154}
155
157{
158 Q_D(const DockGroup);
159 return d->m_mgr;
160}
161
163{
164 Q_D(const DockGroup);
165 return d->m_canCreateNewGroups;
166}
167
169{
170 return objectName().isEmpty();
171}
172
173QString DockGroup::getGroupNameError(const QString &groupName)
174{
175 Q_D(DockGroup);
176 if (groupName.isEmpty()) {
177 return "Group must have a non-empty name";
178 }
179
180 std::vector<DockSubWindow *> sws = d->m_subWindow->allSubWindows(true, true);
181 for (auto sw : sws) {
182 if (sw->getGroupName() == groupName)
183 return "Group name '" + groupName + "' already used";
184 }
185
186 return "";
187}
188
190{
191 Q_D(DockGroup);
192 std::vector<DockSubWindow *> sws = d->m_subWindow->allSubWindows(true, true);
193
194 bool hasPerspectivesMenu = false;
195 if (topLevelGroup() == this)
196 hasPerspectivesMenu = (d->m_mgr != nullptr);
197 else
198 assert(false);
199
200 QMenu *organize = menu;
201 if (hasPerspectivesMenu)
202 organize = menu->addMenu(tr("Organize"));
203
204 setupMenu(organize, sws);
205
206 if (hasPerspectivesMenu) {
207 QMenu *perspectives = menu->addMenu(tr("Perspectives"));
208 fillPerspectivesMenu(perspectives);
209 }
210}
211
213{
214 connect(menu, SIGNAL(aboutToShow()), this, SLOT(autoFillAttachedViewMenu()));
215}
216
217void DockGroup::setupMenu(QMenu *menu, const std::vector<DockSubWindow *> &moveTo)
218{
219 Q_D(DockGroup);
220 d->m_subWindow->fillViewMenu(menu, moveTo);
221 menu->addSeparator();
222 auto moveMenu = menu->addMenu(tr("Move"));
223 d->m_subWindow->fillMoveMenu(moveMenu, moveTo);
224}
225
226void DockGroup::setNewPerspectiveDefaultName(const QString &defaultName)
227{
228 Q_D(DockGroup);
229 d->m_newPerspectiveDefaultName = defaultName;
230}
231
233{
234 QMenu *menu = dynamic_cast<QMenu *>(QObject::sender());
235
236 if (menu) {
237 menu->clear();
238 setupViewMenu(menu);
239 } else {
240 assert(false);
241 }
242}
243
245{
246 Q_D(DockGroup);
247 if (!d->m_mgr)
248 return;
249
250 QString name = d->m_newPerspectiveDefaultName;
251 if (!d->m_newPerspectiveDefaultName.isEmpty()) {
252 int index = 2;
253 while (d->m_mgr->perspectiveNames().contains(name)) {
254 name = d->m_newPerspectiveDefaultName + " (" + QString::number(index) + ")";
255 ++index;
256 }
257 }
258
259 while (true) {
260 bool ok = false;
261 name = QInputDialog::getText(nullptr, tr("Create perspective"), tr("Enter perspective name"), QLineEdit::Normal,
262 name, &ok);
263 if (ok) {
264 if (name.isEmpty()) {
265 QMessageBox::critical(nullptr, "Error", "Perspective name cannot be empty");
266 continue;
267 } else if (d->m_mgr->perspectiveNames().contains(name)) {
268 if (QMessageBox::critical(nullptr, "Error", "Perspective '" + name + "' already exists, overwrite it?",
269 QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No)
270 continue;
271 }
272
273 d->m_mgr->addPerspective(name, this);
274 break;
275 } else {
276 break;
277 }
278 }
279}
280
281void DockGroup::fillPerspectivesMenu(QMenu *menu)
282{
283 Q_D(DockGroup);
284 menu->addAction(tr("Create perspective..."), this, SLOT(createPerspective()));
285
286 QStringList perspectiveNames;
287 if (d->m_mgr)
288 perspectiveNames = d->m_mgr->perspectiveNames();
289
290 if (!perspectiveNames.isEmpty()) {
291 QMenu *load = menu->addMenu(tr("Load perspective"));
292 for (const auto &name : perspectiveNames) {
293 load->addAction(new LoadPerspectiveAction(load, name, this));
294 }
295 QMenu *remove = menu->addMenu(tr("Remove perspective"));
296 for (const auto &name : perspectiveNames) {
297 remove->addAction(new RemovePerspectiveAction(remove, name, this));
298 }
299 }
300}
301
DockPanel * addTabWidget(QWidget *widget, const QString &name, DockPanel *after)
Definition dockgroup.cpp:65
void setupMenu(QMenu *menu, const std::vector< DockSubWindow * > &moveTo)
bool canCreateNewGroups() const
void destroyGroup(DockGroup *group)
void setupViewMenu(QMenu *menu)
Manually fill a given view menu
DockGroup * topLevelGroup() const
DockGroupManager * groupManager() const
void attachViewMenu(QMenu *menu)
Attach a view menu that will be automatically fill
void autoFillAttachedViewMenu()
DockGroup(QWidget *parent, bool canCreateNewGroups, DockGroupManager *manager)
Definition dockgroup.cpp:37
DockSubWindow * subWindow() const
QString getGroupNameError(const QString &groupName)
void setNewPerspectiveDefaultName(const QString &defaultName)
DockGroup * createGroup(const QString &groupName, DockPanel *insertPos)
Definition dockgroup.cpp:88
DockPanel manages multiple instances of DockWidgets.
Definition dockpanel.h:31
void addDockWidget(DockWidget *w)
Add a new dock widget to dock panel.
std::vector< DockWidget * > getWidgetsInGUIOrder() const
std::vector< std::pair< DockSubWindow *, DockWidget * > > allDockWidgets(bool includeThis, bool rec) const
The DockWidget class provides a widget that can be docked inside a DockWindow or floated as a top-lev...
Definition dockwidget.h:31
void setIcon(const QIcon &icon)
void setWidget(QWidget *w, WidgetInsertMode insertMode=AutoScrollArea)
Sets the widget for the dock widget to widget.
@ CenterDockWidgetArea
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE
const char * name
Definition qxtheme.cpp:25