diff --git a/app/dockcorona.cpp b/app/dockcorona.cpp index 774280d84..f2f00d781 100644 --- a/app/dockcorona.cpp +++ b/app/dockcorona.cpp @@ -1044,6 +1044,56 @@ void DockCorona::loadDefaultLayout() defaultContainment->createApplet(QStringLiteral("org.kde.plasma.analogclock")); } +void DockCorona::copyDock(Plasma::Containment *containment) +{ + if (!containment) + return; + + qDebug() << "copying containment layout"; + //! Settting mutable for create a containment + setImmutability(Plasma::Types::Mutable); + + Plasma::Containment *newContainment{nullptr}; + + //! WE NEED A WAY TO COPY A CONTAINMENT!!!! + + if (!newContainment) + return; + + newContainment->setContainmentType(Plasma::Types::PanelContainment); + newContainment->init(); + + if (!newContainment || !newContainment->kPackage().isValid()) { + qWarning() << "the requested containment plugin can not be located or loaded"; + return; + } + + auto config = newContainment->config(); + newContainment->restore(config); + QList edges = freeEdges(newContainment->screen()); + + if (edges.count() > 0) { + newContainment->setLocation(edges.at(0)); + } else { + newContainment->setLocation(Plasma::Types::BottomEdge); + } + + if (currentSession() != Dock::DefaultSession) { + config.writeEntry("session", (int)currentSession()); + } + + newContainment->updateConstraints(Plasma::Types::StartupCompletedConstraint); + + newContainment->save(config); + requestConfigSync(); + + newContainment->flushPendingConstraintsEvents(); + emit containmentAdded(newContainment); + emit containmentCreated(newContainment); + + addDock(newContainment); +} + //! This function figures in the beginning if a dock with tasks //! in it will be loaded taking into account also the screens are present. bool DockCorona::heuresticForLoadingDockWithTasks() diff --git a/app/dockcorona.h b/app/dockcorona.h index ed2235a46..e43e76c81 100644 --- a/app/dockcorona.h +++ b/app/dockcorona.h @@ -76,6 +76,7 @@ public: void addDock(Plasma::Containment *containment); void recreateDock(Plasma::Containment *containment); + void copyDock(Plasma::Containment *containment); Dock::SessionType currentSession(); void setCurrentSession(Dock::SessionType session); diff --git a/app/dockview.cpp b/app/dockview.cpp index 2d96e7f2f..198d74bd2 100644 --- a/app/dockview.cpp +++ b/app/dockview.cpp @@ -398,6 +398,15 @@ void DockView::addNewDock() } } +void DockView::copyDock() +{ + auto *dockCorona = qobject_cast(this->corona()); + + if (dockCorona) { + dockCorona->copyDock(containment()); + } +} + void DockView::removeDock() { if (docksCount() > 1) { diff --git a/app/dockview.h b/app/dockview.h index 9b0f6ae6b..b16b34e46 100644 --- a/app/dockview.h +++ b/app/dockview.h @@ -161,6 +161,7 @@ public: public slots: Q_INVOKABLE void addNewDock(); Q_INVOKABLE void removeDock(); + Q_INVOKABLE void copyDock(); Q_INVOKABLE QList freeEdges() const; Q_INVOKABLE QVariantList containmentActions(); diff --git a/shell/package/contents/configuration/LatteDockConfiguration.qml b/shell/package/contents/configuration/LatteDockConfiguration.qml index 6b9738a83..b1573dfe2 100644 --- a/shell/package/contents/configuration/LatteDockConfiguration.qml +++ b/shell/package/contents/configuration/LatteDockConfiguration.qml @@ -294,7 +294,7 @@ PlasmaCore.FrameSvgItem { tooltip: i18n("Add a new dock") - onClicked: dock.addNewDock() + onClicked: dock.copyDock() //dock.addNewDock() Component.onCompleted: { enabled = dock.freeEdges().length > 0