diff --git a/app/settings/delegates/CMakeLists.txt b/app/settings/delegates/CMakeLists.txt index 912293622..f579b386c 100644 --- a/app/settings/delegates/CMakeLists.txt +++ b/app/settings/delegates/CMakeLists.txt @@ -1,6 +1,6 @@ set(lattedock-app_SRCS ${lattedock-app_SRCS} - ${CMAKE_CURRENT_SOURCE_DIR}/activitycmbboxdelegate.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/activitiesdelegate.cpp ${CMAKE_CURRENT_SOURCE_DIR}/checkboxdelegate.cpp ${CMAKE_CURRENT_SOURCE_DIR}/colorcmbboxdelegate.cpp ${CMAKE_CURRENT_SOURCE_DIR}/colorcmbboxitemdelegate.cpp diff --git a/app/settings/delegates/activitycmbboxdelegate.cpp b/app/settings/delegates/activitiesdelegate.cpp similarity index 63% rename from app/settings/delegates/activitycmbboxdelegate.cpp rename to app/settings/delegates/activitiesdelegate.cpp index 0c6864230..67c7ae77e 100644 --- a/app/settings/delegates/activitycmbboxdelegate.cpp +++ b/app/settings/delegates/activitiesdelegate.cpp @@ -17,25 +17,27 @@ * along with this program. If not, see . */ -#include "activitycmbboxdelegate.h" +#include "activitiesdelegate.h" // local +#include "persistentmenu.h" #include "../settingsdialog.h" // Qt #include -#include #include #include +#include #include #include +#include #include #include // KDE #include -ActivityCmbBoxDelegate::ActivityCmbBoxDelegate(QObject *parent) +ActivitiesDelegate::ActivitiesDelegate(QObject *parent) : QItemDelegate(parent) { auto *settingsDialog = qobject_cast(parent); @@ -45,14 +47,12 @@ ActivityCmbBoxDelegate::ActivityCmbBoxDelegate(QObject *parent) } } -QWidget *ActivityCmbBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const +QWidget *ActivitiesDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { - QComboBox *editor = new QComboBox(parent); - - //! use focusPolicy as flag in order to update activities only when the user is clicking in the popup - //! it was the only way I found to communicate between the activated (const) signal and the - //! setEditorData (const) function - editor->setFocusPolicy(Qt::StrongFocus); + 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 availableActivities = m_settingsDialog->availableActivities(); @@ -67,70 +67,56 @@ QWidget *ActivityCmbBoxDelegate::createEditor(QWidget *parent, const QStyleOptio } for (unsigned int i = 0; i < shownActivities.count(); ++i) { - KActivities::Info info(shownActivities[i]); - QString indicator = " "; + if (info.state() != KActivities::Info::Invalid) { + QAction *action = new QAction(info.name()); + action->setData(shownActivities[i]); + action->setCheckable(true); + action->setChecked(assignedActivities.contains(shownActivities[i])); + + if ((info.state() == KActivities::Info::Running) || (info.state() == KActivities::Info::Starting)) { + QFont font = action->font(); + font.setBold(true); + action->setFont(font); + } - if (assignedActivities.contains(shownActivities[i])) { - indicator = QString::fromUtf8("\u2714") + " "; - } + menu->addAction(action); - if (info.state() != KActivities::Info::Invalid) { - editor->addItem(QIcon::fromTheme(info.icon()), QString(indicator + info.name()), QVariant(shownActivities[i])); + connect(action, &QAction::toggled, this, [this, button]() { + updateButton(button); + }); } } - connect(editor, static_cast(&QComboBox::activated), [ = ](int index) { - editor->setFocusPolicy(Qt::ClickFocus); - editor->clearFocus(); - }); - - return editor; + return button; } -void ActivityCmbBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +void ActivitiesDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { - QComboBox *comboBox = static_cast(editor); - QStringList assignedActivities = index.model()->data(index, Qt::UserRole).toStringList(); - - int pos = -1; - - if (assignedActivities.count() > 0) { - pos = comboBox->findData(QVariant(assignedActivities[0])); - } - - comboBox->setCurrentIndex(pos); + updateButton(editor); } -void ActivityCmbBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const +void ActivitiesDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { - QComboBox *comboBox = static_cast(editor); - - if (editor->focusPolicy() != Qt::ClickFocus) { - return; - } - - editor->setFocusPolicy(Qt::StrongFocus); - - QStringList assignedActivities = index.model()->data(index, Qt::UserRole).toStringList(); - QString selectedActivity = comboBox->currentData().toString(); + QPushButton *button = static_cast(editor); - if (assignedActivities.contains(selectedActivity)) { - assignedActivities.removeAll(selectedActivity); - } else { - assignedActivities.append(selectedActivity); + QStringList assignedActivities; + foreach (QAction *action, button->menu()->actions()) { + if (action->isChecked()) { + assignedActivities << action->data().toString(); + } } model->setData(index, assignedActivities, Qt::UserRole); } -void ActivityCmbBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const +void ActivitiesDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry(option.rect); } -void ActivityCmbBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +void ActivitiesDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem myOptions = option; //! Remove the focus dotted lines @@ -142,7 +128,7 @@ void ActivityCmbBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem QStringList assignedActivities = index.model()->data(index, Qt::UserRole).toStringList(); if (assignedActivities.count() > 0) { - myOptions.text = assignedActivitiesText(index); + myOptions.text = joinedActivities(assignedActivities); QTextDocument doc; QString css; @@ -220,31 +206,48 @@ void ActivityCmbBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem } } -QString ActivityCmbBoxDelegate::assignedActivitiesText(const QModelIndex &index) const +QString ActivitiesDelegate::joinedActivities(const QStringList &activities, bool boldForActive) const { - QStringList assignedActivities = index.model()->data(index, Qt::UserRole).toStringList(); - QString finalText; - if (assignedActivities.count() > 0) { - for (int i = 0; i < assignedActivities.count(); ++i) { - KActivities::Info info(assignedActivities[i]); + int i = 0; - if (info.state() != KActivities::Info::Invalid) { - if (i > 0) { - finalText += ", "; - } + for (const auto &activityId : activities) { + KActivities::Info info(activityId); - bool isActive{false}; + if (info.state() != KActivities::Info::Invalid) { + if (i > 0) { + finalText += ", "; + } + i++; - if ((info.state() == KActivities::Info::Running) || (info.state() == KActivities::Info::Starting)) { - isActive = true; - } + bool isActive{false}; - finalText += isActive ? "" + info.name() + "" : info.name(); + if (boldForActive && (info.state() == KActivities::Info::Running) || (info.state() == KActivities::Info::Starting)) { + isActive = true; } + + finalText += isActive ? "" + info.name() + "" : info.name(); } } return finalText; } + +void ActivitiesDelegate::updateButton(QWidget *editor) const +{ + if (!editor) { + return; + } + QPushButton *button = static_cast(editor); + QStringList assignedActivities; + + foreach (QAction *action, button->menu()->actions()) { + if (action->isChecked()) { + assignedActivities << action->data().toString(); + } + } + + button->setText(joinedActivities(assignedActivities,false)); +} + diff --git a/app/settings/delegates/activitycmbboxdelegate.h b/app/settings/delegates/activitiesdelegate.h similarity index 83% rename from app/settings/delegates/activitycmbboxdelegate.h rename to app/settings/delegates/activitiesdelegate.h index 9a74faa43..54db12edc 100644 --- a/app/settings/delegates/activitycmbboxdelegate.h +++ b/app/settings/delegates/activitiesdelegate.h @@ -17,8 +17,8 @@ * along with this program. If not, see . */ -#ifndef ACTIVITYCMBBOXDELEGATE_H -#define ACTIVITYCMBBOXDELEGATE_H +#ifndef ACTIVITIESDELEGATE_H +#define ACTIVITIESDELEGATE_H // Qt #include @@ -32,11 +32,11 @@ class LayoutManager; class SettingsDialog; } -class ActivityCmbBoxDelegate : public QItemDelegate +class ActivitiesDelegate : public QItemDelegate { Q_OBJECT public: - ActivityCmbBoxDelegate(QObject *parent); + ActivitiesDelegate(QObject *parent); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; @@ -45,9 +45,13 @@ public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; private: - QString assignedActivitiesText(const QModelIndex &index) const; + void updateButton(QWidget *editor) const; + QString joinedActivities(const QStringList &activities, bool boldForActive = true) const; + +private: Latte::SettingsDialog *m_settingsDialog{nullptr}; + }; #endif diff --git a/app/settings/settingsdialog.cpp b/app/settings/settingsdialog.cpp index a287c6fea..070beadc9 100644 --- a/app/settings/settingsdialog.cpp +++ b/app/settings/settingsdialog.cpp @@ -31,9 +31,9 @@ #include "../layout/centrallayout.h" #include "../liblatte2/types.h" #include "../plasma/extended/theme.h" +#include "delegates/activitiesdelegate.h" #include "delegates/checkboxdelegate.h" #include "delegates/colorcmbboxdelegate.h" -#include "delegates/activitycmbboxdelegate.h" #include "delegates/layoutnamedelegate.h" #include "delegates/shareddelegate.h" @@ -121,7 +121,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, Latte::Corona *corona) ui->layoutsView->setItemDelegateForColumn(COLORCOLUMN, new ColorCmbBoxDelegate(this, iconsPath, colors)); ui->layoutsView->setItemDelegateForColumn(MENUCOLUMN, new CheckBoxDelegate(this)); ui->layoutsView->setItemDelegateForColumn(BORDERSCOLUMN, new CheckBoxDelegate(this)); - ui->layoutsView->setItemDelegateForColumn(ACTIVITYCOLUMN, new ActivityCmbBoxDelegate(this)); + ui->layoutsView->setItemDelegateForColumn(ACTIVITYCOLUMN, new ActivitiesDelegate(this)); ui->layoutsView->setItemDelegateForColumn(SHAREDCOLUMN, new SharedDelegate(this)); m_inMemoryButtons = new QButtonGroup(this);