15#include <QInputDialog>
26 DockGroup *m_topLevelGroup;
27 DockGroupManager *m_mgr;
28 DockSubWindow *m_subWindow;
29 bool m_canCreateNewGroups;
30 QString m_newPerspectiveDefaultName;
33DockGroupPrivate::DockGroupPrivate()
37DockGroup::DockGroup(QWidget *parent,
bool canCreateNewGroups,
DockGroupManager *manager)
42 d->m_topLevelGroup =
this;
55 QVBoxLayout *layout =
new QVBoxLayout(
this);
56 layout->setContentsMargins(0, 0, 0, 0);
57 layout->addWidget(d->m_subWindow);
73 if (existing.second->objectName() ==
name) {
74 QMessageBox::critical(
this,
"Error",
"Name '" +
name +
"' already in use");
97 if (!error.isEmpty()) {
98 QMessageBox::critical(
nullptr,
"Error", error);
103 child->setObjectName(groupName);
117 return d->m_topLevelGroup;
126 for (
auto dockwidget :
135 if (dockwidget.second->widget() == group) {
136 dockwidget.first->removeDockWidget(dockwidget.second);
137 delete dockwidget.second;
144 assert(group ==
nullptr);
153 return d->m_subWindow;
165 return d->m_canCreateNewGroups;
170 return objectName().isEmpty();
176 if (groupName.isEmpty()) {
177 return "Group must have a non-empty name";
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";
192 std::vector<DockSubWindow *> sws = d->m_subWindow->allSubWindows(
true,
true);
194 bool hasPerspectivesMenu =
false;
196 hasPerspectivesMenu = (d->m_mgr !=
nullptr);
200 QMenu *organize = menu;
201 if (hasPerspectivesMenu)
202 organize = menu->addMenu(tr(
"Organize"));
206 if (hasPerspectivesMenu) {
207 QMenu *perspectives = menu->addMenu(tr(
"Perspectives"));
208 fillPerspectivesMenu(perspectives);
220 d->m_subWindow->fillViewMenu(menu, moveTo);
221 menu->addSeparator();
222 auto moveMenu = menu->addMenu(tr(
"Move"));
223 d->m_subWindow->fillMoveMenu(moveMenu, moveTo);
229 d->m_newPerspectiveDefaultName = defaultName;
234 QMenu *menu =
dynamic_cast<QMenu *
>(QObject::sender());
250 QString
name = d->m_newPerspectiveDefaultName;
251 if (!d->m_newPerspectiveDefaultName.isEmpty()) {
253 while (d->m_mgr->perspectiveNames().contains(
name)) {
254 name = d->m_newPerspectiveDefaultName +
" (" + QString::number(index) +
")";
261 name = QInputDialog::getText(
nullptr, tr(
"Create perspective"), tr(
"Enter perspective name"), QLineEdit::Normal,
264 if (
name.isEmpty()) {
265 QMessageBox::critical(
nullptr,
"Error",
"Perspective name cannot be empty");
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)
273 d->m_mgr->addPerspective(
name,
this);
281void DockGroup::fillPerspectivesMenu(QMenu *menu)
286 QStringList perspectiveNames;
288 perspectiveNames = d->m_mgr->perspectiveNames();
290 if (!perspectiveNames.isEmpty()) {
291 QMenu *load = menu->addMenu(tr(
"Load perspective"));
292 for (
const auto &
name : perspectiveNames) {
295 QMenu *remove = menu->addMenu(tr(
"Remove perspective"));
296 for (
const auto &
name : perspectiveNames) {
297 remove->addAction(
new RemovePerspectiveAction(remove,
name,
this));
DockPanel * addTabWidget(QWidget *widget, const QString &name, DockPanel *after)
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)
DockSubWindow * subWindow() const
QString getGroupNameError(const QString &groupName)
void setNewPerspectiveDefaultName(const QString &defaultName)
DockGroup * createGroup(const QString &groupName, DockPanel *insertPos)
DockPanel manages multiple instances of DockWidgets.
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
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE