12#include <QInputDialog>
18#define GROUP_PREFIX QString("Group")
29 std::shared_ptr<QSettings> settings;
30 QMap<QString, QStringList> groups;
33class DockGroupManagerPrivate
38 DockGroupManagerPrivate();
40 QMap<QString, PerspectiveInfo> m_perspectives;
41 QString m_perspectivesFolder;
44DockGroupManagerPrivate::DockGroupManagerPrivate()
48DockGroupManager::DockGroupManager(
const QString &perspectivesFolder)
52 d->m_perspectivesFolder = perspectivesFolder;
55DockGroupManager::~DockGroupManager()
59 for (
auto perspective : d->m_perspectives) {
60 QString
fileName = perspective.settings->fileName();
61 perspective.settings.reset();
67QStringList DockGroupManager::perspectiveNames()
const
70 return d->m_perspectives.keys();
73void DockGroupManager::addPerspective(
const QString &
name,
DockGroup *group)
76 if (!d->m_perspectivesFolder.isEmpty()) {
77 d->m_perspectives[
name].settings = getSettingsObject(getSettingsFileName(
name,
true));
90 Q_EMIT perspectivesListChanged();
96 auto widget = sw->findDockWidget(
name);
103void DockGroupManager::openPerspective(
const QString &
name,
DockGroup *group)
108 if (!d->m_perspectivesFolder.isEmpty()) {
109 if (d->m_perspectives.contains(
name)) {
110 Q_EMIT openingPerspective();
114 for (
auto grpName : d->m_perspectives[
name].groups.keys()) {
116 for (
auto sw : sws) {
117 if (sw->getPersistGroupName() == grpName) {
123 grpName = DockSubWindow::getGroupNameFromPersistGroupName(grpName);
132 for (
auto sw : sws) {
133 if (!d->m_perspectives[
name].groups.keys().contains(sw->getPersistGroupName())) {
140 for (
auto grpName : d->m_perspectives[
name].groups.keys()) {
141 for (
auto sw : sws) {
142 if (sw->getPersistGroupName() == grpName) {
143 for (QString widgetName : d->m_perspectives[
name].groups[grpName]) {
152 MoveDockWidgetAction::move(dw, sw);
167 Q_EMIT openedPerspective();
174void DockGroupManager::removePerspectives()
177 d->m_perspectives.clear();
178 Q_EMIT perspectivesListChanged();
181void DockGroupManager::removePerspective(
const QString &
name)
184 d->m_perspectives.remove(
name);
185 Q_EMIT perspectivesListChanged();
188void DockGroupManager::loadPerspectives()
191 if (!d->m_perspectivesFolder.isEmpty()) {
192 QDir().mkpath(d->m_perspectivesFolder);
194 d->m_perspectives.clear();
196 auto mainSettings = getSettingsObject(getSettingsFileName(
"",
false));
197 std::string debug = mainSettings->fileName().toStdString();
199 int Size = mainSettings->beginReadArray(
"Perspectives");
201 for (
int i = 0; i < Size; ++i) {
202 mainSettings->setArrayIndex(i);
203 QString perspective = mainSettings->value(
"Name").toString();
205 if (!perspective.isEmpty()) {
207 auto toLoad = getSettingsFileName(perspective,
false);
208 auto loaded = getSettingsFileName(perspective,
true);
211 std::string debug1 = loaded.toStdString();
212 std::string debug2 = toLoad.toStdString();
215 QFile::remove(loaded);
216 if (!QFile::copy(toLoad, loaded))
219 d->m_perspectives[perspective].settings = getSettingsObject(loaded);
223 for (
const auto &key : mainSettings->allKeys()) {
224 d->m_perspectives[perspective].groups[key] = mainSettings->value(key).toStringList();
226 mainSettings->endGroup();
232 mainSettings->endArray();
235 Q_EMIT perspectivesListChanged();
238void DockGroupManager::savePerspectives()
const
241 if (!d->m_perspectivesFolder.isEmpty()) {
242 auto mainSettings = getSettingsObject(getSettingsFileName(
"",
false));
245 mainSettings->beginWriteArray(
"Perspectives", d->m_perspectives.size());
247 for (
auto perspective : d->m_perspectives.keys()) {
248 mainSettings->setArrayIndex(i);
249 mainSettings->setValue(
"Name", perspective);
251 for (
auto group : d->m_perspectives[perspective].groups.keys()) {
252 mainSettings->setValue(group, d->m_perspectives[perspective].groups[group]);
254 mainSettings->endGroup();
257 mainSettings->endArray();
260 for (
auto perspectiveName : d->m_perspectives.keys()) {
261 auto toSave = getSettingsFileName(perspectiveName,
false);
262 QSettings &settings = *(d->m_perspectives[perspectiveName].settings);
266 std::string debug1 = settings.fileName().toStdString();
267 std::string debug2 = toSave.toStdString();
270 QFile::remove(toSave);
271 if (!QFile::copy(settings.fileName(), toSave))
277QString DockGroupManager::getSettingsFileName(
const QString &perspective,
bool temp)
const
280 auto name = (perspective.isEmpty()) ? QStringLiteral(
"perspectives.ini")
281 : QStringLiteral(
"perspective_") + perspective + (temp ?
".tmp" :
".ini");
283 return d->m_perspectivesFolder +
"/" +
name;
286std::shared_ptr<QSettings> DockGroupManager::getSettingsObject(
const QString &filePath)
const
288 return std::make_shared<QSettings>(filePath, QSettings::IniFormat);
292CreateChildDockAction::CreateChildDockAction(
DockGroup *group, QMenu *menu)
293 : QAction(tr(
"New group..."), menu)
296 connect(
this, SIGNAL(triggered()),
this, SLOT(
createGroup()));
304 name = QInputDialog::getText(NULL, this->
text(), tr(
"Enter group name"), QLineEdit::Normal,
name, &ok);
312 if (error.isEmpty()) {
317 QMessageBox::critical(NULL,
"Error", error);
328 : QAction(tr(
"Destroy ") + group->subWindow()->getGroupName(), menu)
331 connect(
this, SIGNAL(triggered()),
this, SLOT(
destroyGroup()));
346 setText(tr(
"To top"));
348 setText(tr(
"To ") + moveTo->
group()->objectName());
350 connect(
this, SIGNAL(triggered()),
this, SLOT(
move()));
355 move(m_widget, m_moveTo);
360 if (widget && moveTo) {
370 : QAction(
name, parent)
374 connect(
this, SIGNAL(triggered()),
this, SLOT(
load()));
384 : QAction(
name, parent)
388 connect(
this, SIGNAL(triggered()),
this, SLOT(
remove()));
DestroyGroupAction(DockGroup *group, QMenu *menu)
void removePerspective(const QString &name)
void openPerspective(const QString &name, DockGroup *group)
bool canCreateNewGroups() const
void destroyGroup(DockGroup *group)
DockGroup * topLevelGroup() const
DockGroupManager * groupManager() const
DockSubWindow * subWindow() const
QString getGroupNameError(const QString &groupName)
DockGroup * createGroup(const QString &groupName, DockPanel *insertPos)
DockPanel manages multiple instances of DockWidgets.
void openPerspectiveRec(const QString &name)
QMap< QString, QStringList > getGroupContents()
void savePerspectivesRec(QSettings &Settings) const
DockPanel * getInsertDefaultPos()
void loadPerspectivesRec(QSettings &Settings)
std::vector< DockSubWindow * > allSubWindows(bool includeThis, bool rec) const
void addPerspectiveRec(const QString &name)
void removePerspectives(const QStringList &names)
void removeDockWidget(DockWidget *w)
QStringList perspectiveNames() const
DockPanel * addDockWidget(Qx::DockWidgetArea area, DockWidget *w, DockPanel *p=nullptr, int index=-1)
Adds dockwidget into the given area.
LoadPerspectiveAction(QMenu *parent, const QString &name, DockGroup *group)
RemovePerspectiveAction(QMenu *parent, const QString &name, DockGroup *group)
#define GROUP_PREFIX
Copyleft (C) 2024 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
DockWidget * findWidget(QString name, const std::vector< DockSubWindow * > &sws)
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE