From 7954a3ac3974ba57f7183c6093d098722c009b70 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Sun, 14 Jul 2019 13:59:02 +0300 Subject: [PATCH] improve Screens Report --the new report identifies for all your layouts when a screen has not been assigned any docks/panels. That can help user to clean up the ScreensConnectors if wants to --- app/layout/genericlayout.cpp | 32 +++++++++++++++++++++ app/layout/genericlayout.h | 2 ++ app/layout/storage.cpp | 27 ++++++++++++++++++ app/layout/storage.h | 3 ++ app/screenpool.cpp | 50 +++++++++++++++++++++++++-------- app/screenpool.h | 6 ++-- app/settings/settingsdialog.cpp | 37 ++++++++++++++++++------ app/settings/settingsdialog.h | 1 + 8 files changed, 135 insertions(+), 23 deletions(-) diff --git a/app/layout/genericlayout.cpp b/app/layout/genericlayout.cpp index f3e401e05..a7e3e2449 100644 --- a/app/layout/genericlayout.cpp +++ b/app/layout/genericlayout.cpp @@ -1205,6 +1205,38 @@ void GenericLayout::syncLatteViewsToScreens(Layout::ViewsMap *occupiedMap) qDebug() << "end of, syncLatteViewsToScreens ...."; } +QList GenericLayout::viewsScreens() +{ + QList screens; + + if (isActive()) { + for (const auto containment : m_containments) { + if (m_storage->isLatteContainment(containment)) { + int screenId = -1; + + //! valid screen id + if (latteViewExists(containment)) { + screenId = m_latteViews[containment]->positioner()->currentScreenId(); + } else { + screenId = containment->screen(); + + if (screenId == -1) { + screenId = containment->lastScreen(); + } + } + + if (screenId!=-1 &&!screens.contains(screenId)) { + screens << screenId; + } + } + } + + return screens; + } else { + return m_storage->viewsScreens(); + } +} + //! STORAGE diff --git a/app/layout/genericlayout.h b/app/layout/genericlayout.h index 1e7570a5b..9b6fcaef8 100644 --- a/app/layout/genericlayout.h +++ b/app/layout/genericlayout.h @@ -130,6 +130,8 @@ public: //! that latteView QList unassignFromLayout(Latte::View *latteView); + QList viewsScreens(); + public slots: Q_INVOKABLE void addNewView(); Q_INVOKABLE int viewsWithTasks() const; diff --git a/app/layout/storage.cpp b/app/layout/storage.cpp index 1b0204432..f6f07014c 100644 --- a/app/layout/storage.cpp +++ b/app/layout/storage.cpp @@ -76,6 +76,12 @@ bool Storage::isLatteContainment(Plasma::Containment *containment) const return false; } +bool Storage::isLatteContainment(const KConfigGroup &group) const +{ + QString pluginId = group.readEntry("plugin", ""); + return pluginId == "org.kde.latte.containment"; +} + void Storage::lock() { QFileInfo layoutFileInfo(m_layout->file()); @@ -344,6 +350,27 @@ QList Storage::importLayoutFile(QString file) return importedDocks; } +QList Storage::viewsScreens() +{ + QList screens; + + KSharedConfigPtr lFile = KSharedConfig::openConfig(m_layout->file()); + + KConfigGroup containmentGroups = KConfigGroup(lFile, "Containments"); + + for (const auto &cId : containmentGroups.groupList()) { + if (isLatteContainment(containmentGroups.group(cId))) { + int screenId = containmentGroups.group(cId).readEntry("lastScreen", -1); + + if (screenId != -1 && !screens.contains(screenId)) { + screens << screenId; + } + } + } + + return screens; +} + QString Storage::availableId(QStringList all, QStringList assigned, int base) { bool found = false; diff --git a/app/layout/storage.h b/app/layout/storage.h index acece8257..2792642bc 100644 --- a/app/layout/storage.h +++ b/app/layout/storage.h @@ -42,6 +42,7 @@ public: bool isWritable() const; bool isLatteContainment(Plasma::Containment *containment) const; + bool isLatteContainment(const KConfigGroup &group) const; bool layoutIsBroken() const; void importToCorona(); @@ -51,6 +52,8 @@ public: void copyView(Plasma::Containment *containment); void syncToLayoutFile(bool removeLayoutId); + QList viewsScreens(); + /// STATIC //! Check if an applet config group is valid or belongs to removed applet static bool appletGroupIsValid(KConfigGroup appletGroup); diff --git a/app/screenpool.cpp b/app/screenpool.cpp index 2d870095b..e6107fbd2 100644 --- a/app/screenpool.cpp +++ b/app/screenpool.cpp @@ -104,32 +104,58 @@ ScreenPool::~ScreenPool() } -QString ScreenPool::reportHtml() const +QString ScreenPool::reportHtml(const QList &assignedScreens) const { QString report; - report += ""; - report += ""; + report += "
IDNameState
"; + report += "" + + "" + + "" + + ""; + + report += ""; for(const QString &connector : m_connectorForId) { + int scrId = id(connector); + bool hasViews = assignedScreens.contains(scrId); bool primary = m_primaryConnector == connector; + bool secondary = !primary && screenExists(scrId); + report += ""; //! ScreenId - QString idStr = primary ? ""+QString::number(id(connector))+"" : QString::number(id(connector)); + QString idStr = QString::number(scrId); + if (primary || secondary) { + idStr = "" + idStr +""; + } report += ""; - //! ScreenName - QString connectorStr = primary ? ""+connector+"" : connector; + //! ScreenName and Primary flag + QString connectorStr = connector; + if (primary || secondary) { + connectorStr = ""+ connector + ""; + } report += ""; - //! Screen State + //! ScreenType + QString typeStr = ""; if (primary) { - report += ""; - } else { - report += ""; + typeStr = "[" + i18nc("primary screen","Primary") + "]"; + } else if (secondary) { + typeStr = "[" + i18nc("secondary screen","Secondary") + "]"; } + report += ""; + + //! Screen has not assigned any docks/panels + QString notAssignedStr = ""; + if (!hasViews) { + notAssignedStr = "[" + i18nc("it has not latte docks/panels", "none") + "]"; + } + + report += ""; + report += ""; } @@ -263,12 +289,12 @@ QList ScreenPool::knownIds() const return m_connectorForId.keys(); } -bool ScreenPool::hasId(int id) +bool ScreenPool::hasId(int id) const { return ((id!=-1) && m_connectorForId.keys().contains(id)); } -bool ScreenPool::screenExists(int id) +bool ScreenPool::screenExists(int id) const { if (id != -1 && knownIds().contains(id)) { QString scrName = connector(id); diff --git a/app/screenpool.h b/app/screenpool.h index bb650c36a..6af6ff03f 100644 --- a/app/screenpool.h +++ b/app/screenpool.h @@ -43,8 +43,8 @@ public: void load(); ~ScreenPool() override; - bool hasId(int id); - bool screenExists(int id); + bool hasId(int id) const; + bool screenExists(int id) const; int primaryScreenId() const; QString primaryConnector() const; @@ -59,7 +59,7 @@ public: int firstAvailableId() const; - QString reportHtml() const; + QString reportHtml(const QList &assignedScreens) const; //all ids that are known, included screens not enabled at the moment QList knownIds() const; diff --git a/app/settings/settingsdialog.cpp b/app/settings/settingsdialog.cpp index 460954ad8..305117333 100644 --- a/app/settings/settingsdialog.cpp +++ b/app/settings/settingsdialog.cpp @@ -253,14 +253,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, Latte::Corona *corona) } }); - connect(screensAction, &QAction::triggered, this, [&]() { - auto msg = new QMessageBox(this); - msg->setIcon(QMessageBox::Information); - msg->setWindowTitle(i18n("Screens Information")); - msg->setText(m_corona->screenPool()->reportHtml()); - - msg->open(); - }); + connect(screensAction, &QAction::triggered, this, &SettingsDialog::showScreensInformation); //! update all layouts view when runningActivities changed. This way we update immediately //! the running Activities in Activities checkboxes which are shown as bold @@ -1561,6 +1554,34 @@ bool SettingsDialog::dataAreAccepted() return true; } +void SettingsDialog::showScreensInformation() +{ + QList assignedScreens; + + for (int i = 0; i < m_model->rowCount(); ++i) { + QString id = m_model->data(m_model->index(i, IDCOLUMN), Qt::DisplayRole).toString(); + QString name = m_model->data(m_model->index(i, NAMECOLUMN), Qt::DisplayRole).toString(); + + Layout::GenericLayout *genericActive= m_corona->layoutsManager()->synchronizer()->layout(m_layouts[id]->name()); + Layout::GenericLayout *generic = genericActive ? genericActive : m_layouts[id]; + + QList vScreens = generic->viewsScreens(); + + for (const int scrId : vScreens) { + if (!assignedScreens.contains(scrId)) { + assignedScreens << scrId; + } + } + } + + auto msg = new QMessageBox(this); + msg->setIcon(QMessageBox::Information); + msg->setWindowTitle(i18n("Screens Information")); + msg->setText(m_corona->screenPool()->reportHtml(assignedScreens)); + + msg->open(); +} + bool SettingsDialog::saveAllChanges() { if (!dataAreAccepted()) { diff --git a/app/settings/settingsdialog.h b/app/settings/settingsdialog.h index f6b8e472c..aa226b516 100644 --- a/app/settings/settingsdialog.h +++ b/app/settings/settingsdialog.h @@ -94,6 +94,7 @@ private slots: void reject() override; void apply(); void restoreDefaults(); + void showScreensInformation(); void updatePerLayoutButtonsState(); void layoutsChanged();
" + i18nc("screen id","ID") + "" + i18nc("screen name", "Name") + "" + i18nc("screen type", "Type") + "" + i18n("Docks/Panels") + "

" + idStr + "" + connectorStr + "[" + i18nc("primary screen","Primary") + "]" + typeStr +"" + notAssignedStr +"