diff --git a/app/settings/delegates/activitiesdelegate.cpp b/app/settings/delegates/activitiesdelegate.cpp index bd8578f9d..0de293c0c 100644 --- a/app/settings/delegates/activitiesdelegate.cpp +++ b/app/settings/delegates/activitiesdelegate.cpp @@ -21,7 +21,7 @@ // local #include "persistentmenu.h" -#include "../settingsdialog.h" +#include "../models/layoutsmodel.h" #include "../tools/settingstools.h" // Qt @@ -37,6 +37,7 @@ // KDE #include +#include namespace Latte { namespace Settings { @@ -46,43 +47,42 @@ namespace Delegates { Activities::Activities(QObject *parent) : QItemDelegate(parent) { - auto *settingsDialog = qobject_cast(parent); +} - if (settingsDialog) { - m_settingsDialog = settingsDialog; - } +QString Activities::freeActivities_text() const +{ + return QString("[ " + i18n("All Free Activities...") + " ]"); +} + +QString Activities::freeActivities_icon() const +{ + return "favorites"; } QWidget *Activities::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { - int row = index.row(); QPushButton *button = new QPushButton(parent); PersistentMenu *menu = new PersistentMenu(button); button->setMenu(menu); menu->setMinimumWidth(option.rect.width()); - QStringList assignedActivities = index.model()->data(index, Qt::UserRole).toStringList(); - QStringList shownActivities = m_settingsDialog->activitiesList(); - - m_settingsDialog->loadActivitiesInBuffer(row); + bool isLayoutActive = index.data(Model::Layouts::LAYOUTISACTIVEROLE).toBool(); + QStringList allActivities = index.data(Model::Layouts::ALLACTIVITIESROLE).toStringList(); + QStringList assignedActivities = index.data(Qt::UserRole).toStringList(); - QString freeActivitiesId = m_settingsDialog->freeActivities_id(); + for (unsigned int i = 0; i < allActivities.count(); ++i) { - for (unsigned int i = 0; i < shownActivities.count(); ++i) { + if (allActivities[i] == Model::Layouts::FREEACTIVITIESID) { + bool isFreeActivitiesChecked = assignedActivities.contains(Model::Layouts::FREEACTIVITIESID); - if (shownActivities[i] == freeActivitiesId) { - bool isFreeActivitiesChecked = assignedActivities.contains(freeActivitiesId); - - QAction *action = new QAction(m_settingsDialog->freeActivities_text()); - action->setData(freeActivitiesId); - action->setIcon(QIcon::fromTheme(m_settingsDialog->freeActivities_icon())); + QAction *action = new QAction(freeActivities_text()); + action->setData(Model::Layouts::FREEACTIVITIESID); + action->setIcon(QIcon::fromTheme(freeActivities_icon())); action->setCheckable(true); action->setChecked(isFreeActivitiesChecked); - bool isActive = m_settingsDialog->isActive(row); - - if (isActive) { + if (isLayoutActive) { QFont font = action->font(); font.setBold(true); action->setFont(font); @@ -95,27 +95,24 @@ QWidget *Activities::createEditor(QWidget *parent, const QStyleOptionViewItem &o connect(action, &QAction::toggled, this, [this, menu, button, action, i]() { if (action->isChecked()) { - m_settingsDialog->addActivityInBuffer(action->data().toString()); menu->setMasterIndex(i); } else { if (menu->masterIndex() == i) { action->setChecked(true); } - //do nothing.... - //m_settingsDialog->removeActivityFromBuffer(action->data().toString()); } updateButton(button); }); } else { - KActivities::Info info(shownActivities[i]); + KActivities::Info info(allActivities[i]); if (info.state() != KActivities::Info::Invalid) { QAction *action = new QAction(info.name()); - action->setData(shownActivities[i]); + action->setData(allActivities[i]); action->setIcon(QIcon::fromTheme(info.icon())); action->setCheckable(true); - action->setChecked(assignedActivities.contains(shownActivities[i])); + action->setChecked(assignedActivities.contains(allActivities[i])); if ((info.state() == KActivities::Info::Running) || (info.state() == KActivities::Info::Starting)) { QFont font = action->font(); @@ -128,9 +125,6 @@ QWidget *Activities::createEditor(QWidget *parent, const QStyleOptionViewItem &o connect(action, &QAction::toggled, this, [this, menu, button, action, i]() { if (action->isChecked()) { menu->setMasterIndex(-1); - m_settingsDialog->addActivityInBuffer(action->data().toString()); - } else { - m_settingsDialog->removeActivityFromBuffer(action->data().toString()); } updateButton(button); @@ -139,7 +133,7 @@ QWidget *Activities::createEditor(QWidget *parent, const QStyleOptionViewItem &o } } - connect(menu, &PersistentMenu::masterIndexChanged, this, [this, menu, button, freeActivitiesId]() { + connect(menu, &PersistentMenu::masterIndexChanged, this, [this, menu, button]() { int masterRow = menu->masterIndex(); if (masterRow>=0) { auto actions = button->menu()->actions(); @@ -152,7 +146,7 @@ QWidget *Activities::createEditor(QWidget *parent, const QStyleOptionViewItem &o } else { foreach (QAction *action, button->menu()->actions()) { QString actId = action->data().toString(); - if (actId == freeActivitiesId) { + if (actId == Model::Layouts::FREEACTIVITIESID) { action->setChecked(false); } } @@ -161,10 +155,6 @@ QWidget *Activities::createEditor(QWidget *parent, const QStyleOptionViewItem &o updateButton(button); }); - connect(menu, &QMenu::aboutToHide, this, [this, row]() { - m_settingsDialog->syncActivitiesFromBuffer(row); - }); - return button; } @@ -213,6 +203,7 @@ void Activities::paint(QPainter *painter, const QStyleOptionViewItem &option, co //! Remove the focus dotted lines myOptions.state = (myOptions.state & ~QStyle::State_HasFocus); + bool isLayoutActive = index.data(Model::Layouts::LAYOUTISACTIVEROLE).toBool(); bool isSharedCapable = index.data(Model::Layouts::LAYOUTISSHAREDROLE).toBool() && index.data(Model::Layouts::INMULTIPLELAYOUTSROLE).toBool(); if (!isSharedCapable) { @@ -221,7 +212,7 @@ void Activities::paint(QPainter *painter, const QStyleOptionViewItem &option, co QStringList assignedActivities = index.model()->data(index, Qt::UserRole).toStringList(); if (assignedActivities.count() > 0) { - myOptions.text = joinedActivities(assignedActivities, index.row()); + myOptions.text = joinedActivities(assignedActivities, isLayoutActive); QTextDocument doc; QString css; @@ -308,24 +299,21 @@ void Activities::paint(QPainter *painter, const QStyleOptionViewItem &option, co } } -QString Activities::joinedActivities(const QStringList &activities, int index) const +QString Activities::joinedActivities(const QStringList &activities, bool isActive, bool formatText) const { QString finalText; int i = 0; - QString freeActivitiesId = m_settingsDialog->freeActivities_id(); - for (const auto &activityId : activities) { QString name; bool bold{false}; bool italic{false}; - if (activityId == freeActivitiesId) { - name = m_settingsDialog->freeActivities_text(); + if (activityId == Model::Layouts::FREEACTIVITIESID) { + name = freeActivities_text(); - if (index >= 0) { - bool isActive = m_settingsDialog->isActive(index); + if (formatText) { bold = isActive; italic = !isActive; } @@ -338,7 +326,7 @@ QString Activities::joinedActivities(const QStringList &activities, int index) c } i++; - if ((info.state() == KActivities::Info::Running) || (info.state() == KActivities::Info::Starting)) { + if (formatText && ((info.state() == KActivities::Info::Running) || (info.state() == KActivities::Info::Starting))) { bold = true; } @@ -348,11 +336,11 @@ QString Activities::joinedActivities(const QStringList &activities, int index) c QString styledText = name; - if (bold) { + if (bold && formatText) { styledText = "" + styledText + ""; } - if (italic) { + if (italic && formatText) { styledText = "" + styledText + ""; } @@ -376,7 +364,7 @@ void Activities::updateButton(QWidget *editor) const } } - button->setText(joinedActivities(assignedActivities, -1)); + button->setText(joinedActivities(assignedActivities, false, false)); } } diff --git a/app/settings/delegates/activitiesdelegate.h b/app/settings/delegates/activitiesdelegate.h index f4863db52..94ca972cf 100644 --- a/app/settings/delegates/activitiesdelegate.h +++ b/app/settings/delegates/activitiesdelegate.h @@ -27,10 +27,6 @@ class QModelIndex; class QWidget; class QVariant; -namespace Latte { -class SettingsDialog; -} - namespace Latte { namespace Settings { namespace Layouts { @@ -52,13 +48,10 @@ public: private: void updateButton(QWidget *editor) const; - QString joinedActivities(const QStringList &activities, int index = -1) const; - -private: - Latte::SettingsDialog *m_settingsDialog{nullptr}; - + QString freeActivities_text() const; + QString freeActivities_icon() const; - int m_lastCurrentIndex{-1}; + QString joinedActivities(const QStringList &activities, bool isActive = false, bool formatText = true) const; }; } diff --git a/app/settings/models/layoutsmodel.cpp b/app/settings/models/layoutsmodel.cpp index 777d1cbbd..74b1c0d49 100644 --- a/app/settings/models/layoutsmodel.cpp +++ b/app/settings/models/layoutsmodel.cpp @@ -19,7 +19,11 @@ */ #include "layoutsmodel.h" + +// local #include "../data/layoutdata.h" +#include "../../layouts/manager.h" +#include "../../layouts/synchronizer.h" // Qt #include @@ -29,15 +33,15 @@ // KDE #include - const QChar CheckMark{0x2714}; namespace Latte { namespace Settings { namespace Model { -Layouts::Layouts(QObject *parent) - : QAbstractTableModel(parent) +Layouts::Layouts(QObject *parent, Latte::Corona *corona) + : QAbstractTableModel(parent), + m_corona(corona) { connect(this, &Layouts::inMultipleModeChanged, this, [&]() { @@ -247,6 +251,11 @@ QVariant Layouts::data(const QModelIndex &index, int role) const return inMultipleMode(); } else if (role == LAYOUTNAMEWASEDITEDROLE) { return m_layoutsTable[row].nameWasEdited(); + } else if (role == ALLACTIVITIESROLE) { + QStringList activities; + activities << QString(FREEACTIVITIESID); + activities << m_corona->layoutsManager()->synchronizer()->activities(); + return activities; } switch (column) { @@ -296,6 +305,44 @@ QVariant Layouts::data(const QModelIndex &index, int role) const return QVariant{}; } +QStringList Layouts::cleanStrings(const QStringList &original, const QStringList &occupied) +{ + QStringList result; + + for(int i=0; i roles; + roles << Qt::DisplayRole; + roles << Qt::UserRole; + + m_layoutsTable[row].activities = activities; + emit dataChanged(index(row, ACTIVITYCOLUMN), index(row,ACTIVITYCOLUMN), roles); + + for(int i=0; i @@ -39,6 +40,8 @@ class Layouts : public QAbstractTableModel Q_OBJECT public: + static constexpr const char* FREEACTIVITIESID = "{0000-0000}"; + enum Columns { IDCOLUMN = 0, @@ -58,13 +61,13 @@ public: LAYOUTISSHAREDROLE, LAYOUTNAMEWASEDITEDROLE, INMULTIPLELAYOUTSROLE, - ACTIVITIESROLE, + ALLACTIVITIESROLE, RUNNINGACTIVITIESROLE, SHARESROLE, ACTIVESHARESROLE }; - explicit Layouts(QObject *parent = nullptr); + explicit Layouts(QObject *parent, Latte::Corona *corona); bool inMultipleMode() const; void setInMultipleMode(bool inMultiple); @@ -95,9 +98,16 @@ public: signals: void inMultipleModeChanged(); +private: + void setActivities(const int &row, const QStringList &activities); + + QStringList cleanStrings(const QStringList &original, const QStringList &occupied); + private: bool m_inMultipleMode{false}; Data::LayoutsTable m_layoutsTable; + + Latte::Corona *m_corona{nullptr}; }; } diff --git a/app/settings/settingsdialog.cpp b/app/settings/settingsdialog.cpp index bd589f4f5..833189262 100644 --- a/app/settings/settingsdialog.cpp +++ b/app/settings/settingsdialog.cpp @@ -65,8 +65,6 @@ #include #include -#define FREEACTIVITIESID "{0000-0000}" - namespace Latte { const int IDCOLUMN = 0; @@ -103,15 +101,14 @@ SettingsDialog::SettingsDialog(QWidget *parent, Latte::Corona *corona) connect(ui->buttonBox->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked , this, &SettingsDialog::restoreDefaults); - //m_model = new QStandardItemModel(m_corona->layoutsManager()->layouts().count(), 6, this); - m_model = new Settings::Model::Layouts(this); + m_model = new Settings::Model::Layouts(this, m_corona); ui->layoutsView->setModel(m_model); ui->layoutsView->horizontalHeader()->setStretchLastSection(true); ui->layoutsView->verticalHeader()->setVisible(false); - connect(m_corona->layoutsManager(), &Layouts::Manager::currentLayoutNameChanged, this, &SettingsDialog::layoutsChanged); - connect(m_corona->layoutsManager(), &Layouts::Manager::centralLayoutsChanged, this, &SettingsDialog::layoutsChanged); + //connect(m_corona->layoutsManager(), &Layouts::Manager::currentLayoutNameChanged, this, &SettingsDialog::layoutsChanged); + //connect(m_corona->layoutsManager(), &Layouts::Manager::centralLayoutsChanged, this, &SettingsDialog::layoutsChanged); QString iconsPath(m_corona->kPackage().path() + "../../plasmoids/org.kde.latte.containment/contents/icons/"); @@ -337,30 +334,6 @@ void SettingsDialog::blockDeleteOnActivityStopped() }); } -QString SettingsDialog::freeActivities_text() const -{ - return QString("[ " + i18n("All Free Activities...") + " ]"); -} - -QString SettingsDialog::freeActivities_icon() const -{ - return "favorites"; -} - -QString SettingsDialog::freeActivities_id() const -{ - return FREEACTIVITIESID; -} - -QStringList SettingsDialog::activitiesList() -{ - QStringList result; - result << FREEACTIVITIESID; - result << m_corona->layoutsManager()->synchronizer()->activities(); - - return result; -} - QStringList SettingsDialog::availableSharesFor(int row) { QStringList availables; @@ -1141,19 +1114,6 @@ QList SettingsDialog::currentSettings() void SettingsDialog::appendLayout(Settings::Data::Layout &layout) { - //! Add Free Activities record - if (layout.activities.isEmpty()) { - if (m_corona->layoutsManager()->memoryUsage() == Types::SingleLayout) { - if (m_corona->layoutsManager()->currentLayoutName() == layout.originalName()) { - layout.activities << FREEACTIVITIESID; - } - } else if (m_corona->layoutsManager()->memoryUsage() == Types::MultipleLayouts) { - if (m_corona->layoutsManager()->synchronizer()->centralLayout(layout.originalName())) { - layout.activities << FREEACTIVITIESID; - } - } - } - m_model->appendLayout(layout); } @@ -1162,10 +1122,6 @@ void SettingsDialog::on_switchButton_clicked() int currentIndex = ui->layoutsView->currentIndex().row(); QStringList currentActivities = m_model->data(m_model->index(ui->layoutsView->currentIndex().row(), ACTIVITYCOLUMN), Qt::UserRole).toStringList(); - if (currentActivities.isEmpty() || (currentActivities.count() == 1 && currentActivities[0] == FREEACTIVITIESID)) { - setCurrentFreeActivitiesLayout(currentIndex); - } - if (ui->buttonBox->button(QDialogButtonBox::Apply)->isEnabled()) { //! thus there are changes in the settings @@ -1209,37 +1165,6 @@ void SettingsDialog::on_pauseButton_clicked() } } -void SettingsDialog::layoutsChanged() -{ - for (int i = 0; i < m_model->rowCount(); ++i) { - QModelIndex nameIndex = m_model->index(i, NAMECOLUMN); - QVariant value = m_model->data(nameIndex, Qt::DisplayRole); - - if (value.isValid()) { - QString name = value.toString(); - // QFont font; - - if (m_corona->layoutsManager()->currentLayoutName() == name) { - // font.setBold(true); - setCurrentFreeActivitiesLayout(i); - } else { - Layout::GenericLayout *layout = m_corona->layoutsManager()->synchronizer()->layout(name); - - if (layout && (m_corona->layoutsManager()->memoryUsage() == Types::MultipleLayouts)) { - // font.setBold(true); - - if (layout->appliedActivities().isEmpty()) { - setCurrentFreeActivitiesLayout(i); - } - } else { - // font.setBold(false); - } - } - - // m_model->setData(nameIndex, font, Qt::FontRole); - } - } -} void SettingsDialog::updateApplyButtonsState() { @@ -1540,7 +1465,7 @@ bool SettingsDialog::saveAllChanges() //!update only activities that are valid for (const auto &activity : lActivities) { - if (knownActivities.contains(activity) && activity != FREEACTIVITIESID) { + if (knownActivities.contains(activity) && activity != Settings::Model::Layouts::FREEACTIVITIESID) { cleanedActivities.append(activity); } } @@ -1759,69 +1684,6 @@ void SettingsDialog::syncActiveShares() m_sharesMap = currentSharesIdMap; } -int SettingsDialog::currentFreeActiviesLayout() const -{ - return m_currentFreeActivitiesLayout; -} - -void SettingsDialog::setCurrentFreeActivitiesLayout(const int &row) -{ - if (m_currentFreeActivitiesLayout == row) { - return; - } - - m_currentFreeActivitiesLayout = row; - - loadActivitiesInBuffer(row); - addActivityInBuffer(FREEACTIVITIESID); - syncActivitiesFromBuffer(row); -} - -void SettingsDialog::loadActivitiesInBuffer(const int &row) -{ - m_activitiesInBuffer.clear(); - m_activitiesInBuffer = m_model->data(m_model->index(row, ACTIVITYCOLUMN), Qt::UserRole).toStringList(); -} - -void SettingsDialog::syncActivitiesFromBuffer(const int &row) -{ - for (int i = 0; i < m_model->rowCount(); ++i) { - if (i == row) { - m_model->setData(m_model->index(i, ACTIVITYCOLUMN), m_activitiesInBuffer, Qt::UserRole); - continue; - } - - QStringList lActivities = m_model->data(m_model->index(i, ACTIVITYCOLUMN), Qt::UserRole).toStringList(); - - bool updated{false} ; - - for (const auto &activityId : m_activitiesInBuffer) { - if (lActivities.contains(activityId)) { - updated = true; - lActivities.removeAll(activityId); - } - } - - if (updated) { - m_model->setData(m_model->index(i, ACTIVITYCOLUMN), lActivities, Qt::UserRole); - } - }; -} - -void SettingsDialog::addActivityInBuffer(const QString &activityId) -{ - if (!m_activitiesInBuffer.contains(activityId)) { - m_activitiesInBuffer << activityId; - } -} - -void SettingsDialog::removeActivityFromBuffer(const QString &activityId) -{ - if (m_activitiesInBuffer.contains(activityId)) { - m_activitiesInBuffer.removeAll(activityId); - } -} - void SettingsDialog::addShareInCurrent(const QString &layoutId) { int currentRow = ui->layoutsView->currentIndex().row(); diff --git a/app/settings/settingsdialog.h b/app/settings/settingsdialog.h index f42c131bf..56684cb14 100644 --- a/app/settings/settingsdialog.h +++ b/app/settings/settingsdialog.h @@ -63,11 +63,6 @@ public: void toggleCurrentPage(); void setCurrentPage(int page); - void loadActivitiesInBuffer(const int &row); - void syncActivitiesFromBuffer(const int &row); - void addActivityInBuffer(const QString &activityId); - void removeActivityFromBuffer(const QString &activityId); - void addShareInCurrent(const QString &layoutId); void removeShareFromCurrent(const QString &layoutId); void updateShareAt(const int &row, const QString &fromId, const QString &toId); @@ -83,11 +78,6 @@ public: QString nameForId(QString id) const; QString idForRow(int row) const; - QString freeActivities_text() const; - QString freeActivities_icon() const; - QString freeActivities_id() const; - - QStringList activitiesList(); QStringList availableSharesFor(int row); void requestImagesDialog(int row); @@ -116,8 +106,6 @@ private slots: void showScreensInformation(); void updatePerLayoutButtonsState(); - void layoutsChanged(); - private: void addLayoutForFile(QString file, QString layoutName = QString(), bool newTempDirectory = true, bool showNotification = true); //! When an activity is closed for some reason the window manager hides and reshows @@ -156,8 +144,6 @@ private: QStringList m_tempDirectories; QStringList m_initLayoutPaths; - QStringList m_activitiesInBuffer; - QButtonGroup *m_inMemoryButtons; QButtonGroup *m_mouseSensitivityButtons;