diff --git a/app/dockcorona.cpp b/app/dockcorona.cpp index 19f62c00d..012ead881 100644 --- a/app/dockcorona.cpp +++ b/app/dockcorona.cpp @@ -57,26 +57,18 @@ DockCorona::DockCorona(QObject *parent) connect(this, &Corona::containmentAdded, this, &DockCorona::addDock); loadLayout(); - - /*QAction *addDock = actions()->add(QStringLiteral("add dock")); - connect(addDock, &QAction::triggered, this, &NowDockCorona::loadDefaultLayout); - addDock->setText(i18n("Add New Dock")); - addDock->setAutoRepeat(true); - addDock->setStatusTip(tr("Adds a new dock in the environment")); - addDock->setVisible(true); - addDock->setEnabled(true); - - addDock->setIcon(QIcon::fromTheme(QStringLiteral("object-locked"))); - addDock->setData(Plasma::Types::ControlAction); - addDock->setShortcut(QKeySequence(QStringLiteral("alt+d, l"))); - addDock->setShortcutContext(Qt::ApplicationShortcut);*/ } DockCorona::~DockCorona() { - for (auto c : m_containments) - c->deleteLater(); - + while (!containments().isEmpty()) { + //deleting a containment will remove it from the list due to QObject::destroyed connect in Corona + delete containments().first(); + } + + qDeleteAll(m_dockViews); + m_dockViews.clear(); + qDebug() << "deleted" << this; } @@ -136,6 +128,16 @@ int DockCorona::primaryScreenId() const return id; } +int DockCorona::numDocks() +{ + return m_dockViews.size(); +} + +void DockCorona::closeApplication() +{ + qGuiApp->quit(); +} + QList DockCorona::freeEdges(int screen) const { using Plasma::Types; @@ -145,7 +147,7 @@ QList DockCorona::freeEdges(int screen) const //when screen=-1 is passed then the primaryScreenid is used int fixedScreen = (screen == -1) ? primaryScreenId() : screen; - for (const DockView *cont : m_containments) { + for (const DockView *cont : m_dockViews) { if (cont && cont->containment()->screen() == fixedScreen) edges.removeOne(cont->location()); } @@ -155,7 +157,7 @@ QList DockCorona::freeEdges(int screen) const int DockCorona::screenForContainment(const Plasma::Containment *containment) const { - for (auto *view : m_containments) { + for (auto *view : m_dockViews) { if (view && view->containment() && view->containment()->id() == containment->id()) if (view->screen()) return qGuiApp->screens().indexOf(view->screen()); @@ -179,7 +181,7 @@ void DockCorona::addDock(Plasma::Containment *containment) return; } - foreach (DockView *dock, m_containments) { + foreach (DockView *dock, m_dockViews) { if (dock->containment() == containment) { return; } @@ -190,9 +192,20 @@ void DockCorona::addDock(Plasma::Containment *containment) auto dockView = new DockView(this); dockView->init(); dockView->setContainment(containment); + connect(containment, &QObject::destroyed, this, &DockCorona::dockContainmentDestroyed); + dockView->show(); - - m_containments.push_back(dockView); + + m_dockViews[containment] = dockView; + + emit containmentsNoChanged(); +} + +void DockCorona::dockContainmentDestroyed(QObject *cont) +{ + auto view = m_dockViews.take(static_cast(cont)); + view->deleteLater(); + emit containmentsNoChanged(); } void DockCorona::loadDefaultLayout() diff --git a/app/dockcorona.h b/app/dockcorona.h index 656ca4da7..d56a9c1de 100644 --- a/app/dockcorona.h +++ b/app/dockcorona.h @@ -48,20 +48,26 @@ public: QList freeEdges(int screen) const; int screenForContainment(const Plasma::Containment *containment) const override; + int numDocks(); void addDock(Plasma::Containment *containment); + + void closeApplication(); public slots: void loadDefaultLayout() override; + void dockContainmentDestroyed(QObject *cont); signals: void configurationShown(PlasmaQuick::ConfigView *configView); + void containmentsNoChanged(); private: void qmlRegisterTypes() const; int primaryScreenId() const; - std::vector m_containments; + //std::vector m_containments; + QHash m_dockViews; }; } diff --git a/app/dockview.cpp b/app/dockview.cpp index 7cfeeee8d..26ff389fe 100644 --- a/app/dockview.cpp +++ b/app/dockview.cpp @@ -45,7 +45,8 @@ namespace Latte { DockView::DockView(Plasma::Corona *corona, QScreen *targetScreen) : PlasmaQuick::ContainmentView(corona), - m_contextMenu(0) + m_contextMenu(0), + m_docksCount(0) { setVisible(false); setTitle(corona->kPackage().metadata().name()); @@ -81,6 +82,10 @@ DockView::DockView(Plasma::Corona *corona, QScreen *targetScreen) QAction *lockWidgetsAction = containment()->actions()->action("lock widgets"); containment()->actions()->removeAction(lockWidgetsAction); + QAction *removeAction = containment()->actions()->action("remove"); + removeAction->setVisible(false); + //containment()->actions()->removeAction(removeAction); + //FIX: hide and not delete in order to disable a nasty behavior from //ContainmentInterface. If only one action exists for containment the //this action is triggered directly @@ -89,6 +94,12 @@ DockView::DockView(Plasma::Corona *corona, QScreen *targetScreen) //containment()->actions()->removeAction(addWidgetsAction); }, Qt::DirectConnection); + + DockCorona *dcorona = qobject_cast(this->corona()); + + if (dcorona) { + connect(dcorona, &DockCorona::containmentsNoChanged, this, &DockView::updateDocksCount); + } } DockView::~DockView() @@ -135,6 +146,8 @@ void DockView::init() connect(&m_lockGeometry, &QTimer::timeout, [&]() { updateDockPosition(); }); + + updateDocksCount(); qDebug() << "SOURCE:" << source(); @@ -373,6 +386,28 @@ bool DockView::compositing() const return WindowSystem::self().compositingActive(); } +int DockView::docksCount() const +{ + return m_docksCount; +} + +void DockView::updateDocksCount() +{ + DockCorona *corona = qobject_cast(this->corona()); + + if (corona) { + int no = corona->numDocks(); + + if (no == m_docksCount) { + return; + } + + m_docksCount = no; + + emit docksCountChanged(); + } +} + /*Candil::VisibilityManager *DockView::visibility() { return m_visibility.data(); @@ -526,6 +561,17 @@ QList DockView::freeEdges() const return edgesInt; } +void DockView::closeApplication() +{ + DockCorona *corona = qobject_cast(this->corona()); + + if (corona) { + m_configView->hide(); + corona->closeApplication(); + } +} + + void DockView::saveConfig() { if (!containment()) diff --git a/app/dockview.h b/app/dockview.h index 0a1edf8d1..92f029e99 100644 --- a/app/dockview.h +++ b/app/dockview.h @@ -46,6 +46,7 @@ class DockView : public PlasmaQuick::ContainmentView { Q_OBJECT Q_PROPERTY(bool compositing READ compositing NOTIFY compositingChanged) + Q_PROPERTY(int docksCount READ docksCount NOTIFY docksCountChanged) Q_PROPERTY(int height READ height NOTIFY heightChanged) Q_PROPERTY(int length READ length WRITE setLength NOTIFY lengthChanged) Q_PROPERTY(int maxLength READ maxLength WRITE setMaxLength NOTIFY maxLengthChanged) @@ -84,6 +85,8 @@ public: void setOffset(int offset); void updateOffset(); + + int docksCount() const; VisibilityManager *visibility(); @@ -109,6 +112,8 @@ public slots: Q_INVOKABLE void removeDock(); Q_INVOKABLE void setLocalDockGeometry(const QRect &geometry); Q_INVOKABLE bool tasksPresent(); + Q_INVOKABLE void closeApplication(); + void resizeWindow(); void restoreConfig(); void saveConfig(); @@ -130,6 +135,7 @@ signals: void compositingChanged(); void heightChanged(); void lengthChanged(); + void docksCountChanged(); void localDockGeometryChanged(); void maskAreaChanged(); void maxLengthChanged(); @@ -145,10 +151,12 @@ public slots: private slots: void menuAboutToHide(); + void updateDocksCount(); private: bool m_secondInitPass; + int m_docksCount; int m_offset{0}; int m_maxThickness{24}; int m_length{0}; diff --git a/plasmoid/contents/ui/main.qml b/plasmoid/contents/ui/main.qml index 2e7dba26b..1a3d51fc1 100644 --- a/plasmoid/contents/ui/main.qml +++ b/plasmoid/contents/ui/main.qml @@ -311,7 +311,7 @@ Item { onAnyTaskDemandsAttentionChanged: { if (anyTaskDemandsAttention){ plasmoid.status = PlasmaCore.Types.RequiresAttentionStatus; - attentionTimerComponent.createObject(panel); + attentionTimerComponent.createObject(root); } } diff --git a/shell/contents/configuration/BehaviorConfig.qml b/shell/contents/configuration/BehaviorConfig.qml index ae7fdf47c..e88940799 100644 --- a/shell/contents/configuration/BehaviorConfig.qml +++ b/shell/contents/configuration/BehaviorConfig.qml @@ -54,6 +54,13 @@ PlasmaComponents.Page{ onDockLocationChanged: updateDockLocationVisual(); + property int docksCount: dock.docksCount + + onDocksCountChanged: { + lockReservedEdges(); + updateDockLocationVisual(); + } + Component.onCompleted: { lockReservedEdges(); updateDockLocationVisual(); diff --git a/shell/contents/configuration/LatteDockConfiguration.qml.cmake b/shell/contents/configuration/LatteDockConfiguration.qml.cmake index 420413777..091dc0c78 100644 --- a/shell/contents/configuration/LatteDockConfiguration.qml.cmake +++ b/shell/contents/configuration/LatteDockConfiguration.qml.cmake @@ -188,12 +188,15 @@ PlasmaCore.FrameSvgItem { anchors.bottom: parent.bottom anchors.bottomMargin: windowSpace - spacing: windowSpace + spacing: 2 width: parent.width - 2*windowSpace PlasmaComponents.Button{ enabled: true - text: i18n("Add New Dock") + text: i18n("Add") + iconSource: "list-add" + + width: parent.width/4 - 2 onClicked: dock.addNewDock(); @@ -206,10 +209,27 @@ PlasmaCore.FrameSvgItem { } PlasmaComponents.Button{ enabled: true - text: i18n("Remove Dock") + text: i18n("Remove") + iconSource: "edit-delete" + width: parent.width/4 - 2 + opacity: dock.docksCount > 1 ? 1 : 0 onClicked: dock.removeDock(); } + + Item{ + width: parent.width/4 - 2 + height: 1 + } + + PlasmaComponents.Button{ + enabled: true + text: i18n("Quit") + iconSource: "window-close" + width: parent.width/4 - 2 + + onClicked: dock.closeApplication(); + } } }