From f28edd6d03551177dd70733bcdbd150afe7fc090 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Wed, 19 Jul 2017 19:34:59 +0300 Subject: [PATCH] make activities combobox work properly --activitiescmbbox in layout manager now shows always only the available activities --- app/layoutconfigdialog.cpp | 41 +++++++++++++- app/layoutconfigdialog.h | 7 +++ .../activitycmbboxdelegate.cpp | 55 +++++++++++++------ app/layoutsDelegates/activitycmbboxdelegate.h | 9 +-- app/layoutsDelegates/colorcmbboxdelegate.cpp | 4 ++ 5 files changed, 95 insertions(+), 21 deletions(-) diff --git a/app/layoutconfigdialog.cpp b/app/layoutconfigdialog.cpp index 43d8bcd85..88f90aa30 100644 --- a/app/layoutconfigdialog.cpp +++ b/app/layoutconfigdialog.cpp @@ -86,7 +86,9 @@ LayoutConfigDialog::LayoutConfigDialog(QWidget *parent, LayoutManager *manager) ui->layoutsView->setItemDelegateForColumn(1, new ColorCmbBoxDelegate(this, iconsPath, colors)); ui->layoutsView->setItemDelegateForColumn(3, new CheckBoxDelegate(this)); - ui->layoutsView->setItemDelegateForColumn(4, new ActivityCmbBoxDelegate(this, m_manager)); + ui->layoutsView->setItemDelegateForColumn(4, new ActivityCmbBoxDelegate(this)); + + connect(m_model, &QStandardItemModel::itemChanged, this, &LayoutConfigDialog::itemChanged); } LayoutConfigDialog::~LayoutConfigDialog() @@ -98,6 +100,16 @@ LayoutConfigDialog::~LayoutConfigDialog() } } +QStringList LayoutConfigDialog::activities() +{ + return m_manager->activities(); +} + +QStringList LayoutConfigDialog::availableActivities() +{ + return m_availableActivities; +} + void LayoutConfigDialog::on_copyButton_clicked() { qDebug() << Q_FUNC_INFO; @@ -197,6 +209,8 @@ void LayoutConfigDialog::loadLayouts() ui->layoutsView->selectRow(i - 1); } } + + recalculateAvailableActivities(); } void LayoutConfigDialog::on_switchButton_clicked() @@ -230,5 +244,30 @@ void LayoutConfigDialog::currentLayoutNameChanged() } } +void LayoutConfigDialog::itemChanged(QStandardItem *item) +{ + //! recalculate the available activities + if (item->column() == 4) { + recalculateAvailableActivities(); + } +} + +void LayoutConfigDialog::recalculateAvailableActivities() +{ + QStringList tempActivities = m_manager->activities(); + + for (int i = 0; i < m_model->rowCount(); ++i) { + QStringList assigned = m_model->data(m_model->index(i, 4), Qt::UserRole).toStringList(); + + foreach (auto activity, assigned) { + if (tempActivities.contains(activity)) { + tempActivities.removeAll(activity); + } + } + } + + m_availableActivities = tempActivities; +} + }//end of namespace diff --git a/app/layoutconfigdialog.h b/app/layoutconfigdialog.h index 8a83276d3..824dfcb4e 100644 --- a/app/layoutconfigdialog.h +++ b/app/layoutconfigdialog.h @@ -45,6 +45,9 @@ public: LayoutConfigDialog(QWidget *parent, LayoutManager *corona); ~LayoutConfigDialog(); + QStringList activities(); + QStringList availableActivities(); + private slots: // auto connections void on_copyButton_clicked(); @@ -59,9 +62,13 @@ private slots: void restoreDefaults(); void currentLayoutNameChanged(); + void itemChanged(QStandardItem *item); private: void loadLayouts(); + void recalculateAvailableActivities(); + + QStringList m_availableActivities; LayoutManager *m_manager{nullptr}; diff --git a/app/layoutsDelegates/activitycmbboxdelegate.cpp b/app/layoutsDelegates/activitycmbboxdelegate.cpp index 547427ed3..bd1cdf545 100644 --- a/app/layoutsDelegates/activitycmbboxdelegate.cpp +++ b/app/layoutsDelegates/activitycmbboxdelegate.cpp @@ -10,11 +10,14 @@ #include -ActivityCmbBoxDelegate::ActivityCmbBoxDelegate(QObject *parent, Latte::LayoutManager *manager) - : QItemDelegate(parent), - m_manager(manager) +ActivityCmbBoxDelegate::ActivityCmbBoxDelegate(QObject *parent) + : QItemDelegate(parent) { - m_activities = m_manager->activities(); + auto *configDialog = qobject_cast(parent); + + if (configDialog) { + m_configDialog = configDialog; + } } QWidget *ActivityCmbBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const @@ -22,19 +25,29 @@ QWidget *ActivityCmbBoxDelegate::createEditor(QWidget *parent, const QStyleOptio QComboBox *editor = new QComboBox(parent); QStringList assignedActivities = index.model()->data(index, Qt::UserRole).toStringList(); + QStringList availableActivities = m_configDialog->availableActivities(); + QStringList activities = m_configDialog->activities(); + + QStringList shownActivities; + + foreach (auto activity, activities) { + if (assignedActivities.contains(activity) || availableActivities.contains(activity)) { + shownActivities.append(activity); + } + } - for (unsigned int i = 0; i < m_activities.count(); ++i) { + for (unsigned int i = 0; i < shownActivities.count(); ++i) { - KActivities::Info info(m_activities[i]); + KActivities::Info info(shownActivities[i]); QString indicator = " "; - if (assignedActivities.contains(m_activities[i])) { + if (assignedActivities.contains(shownActivities[i])) { indicator = QString::fromUtf8("\u2714") + " "; } if (info.state() != KActivities::Info::Invalid) { - editor->addItem(QIcon::fromTheme(info.icon()), QString(indicator + info.name()), QVariant(m_activities[i])); + editor->addItem(QIcon::fromTheme(info.icon()), QString(indicator + info.name()), QVariant(shownActivities[i])); } } @@ -50,11 +63,13 @@ void ActivityCmbBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &i QComboBox *comboBox = static_cast(editor); QStringList assignedActivities = index.model()->data(index, Qt::UserRole).toStringList(); + int pos = -1; + if (assignedActivities.count() > 0) { - comboBox->setCurrentIndex(m_activities.indexOf(assignedActivities[0])); - } else { - comboBox->setCurrentIndex(-1); + pos = comboBox->findData(QVariant(assignedActivities[0])); } + + comboBox->setCurrentIndex(pos); } void ActivityCmbBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const @@ -85,8 +100,19 @@ void ActivityCmbBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem QStringList assignedActivities = index.model()->data(index, Qt::UserRole).toStringList(); if (assignedActivities.count() > 0) { - QString finalText; + myOption.text = assignedActivitiesText(index); + } + QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &myOption, painter); +} + +QString ActivityCmbBoxDelegate::assignedActivitiesText(const QModelIndex &index) 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]); @@ -98,10 +124,7 @@ void ActivityCmbBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem finalText += info.name(); } } - - myOption.text = finalText; } - QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &myOption, painter); + return finalText; } - diff --git a/app/layoutsDelegates/activitycmbboxdelegate.h b/app/layoutsDelegates/activitycmbboxdelegate.h index e9eef450a..bdafca412 100644 --- a/app/layoutsDelegates/activitycmbboxdelegate.h +++ b/app/layoutsDelegates/activitycmbboxdelegate.h @@ -1,7 +1,7 @@ #ifndef ACTIVITYCMBBOXDELEGATE_H #define ACTIVITYCMBBOXDELEGATE_H -#include "../layoutmanager.h" +#include "../layoutconfigdialog.h" #include @@ -16,7 +16,7 @@ class LayoutManager; class ActivityCmbBoxDelegate : public QItemDelegate { Q_OBJECT public: - ActivityCmbBoxDelegate(QObject *parent = 0, Latte::LayoutManager *manager = 0); + ActivityCmbBoxDelegate(QObject *parent); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; @@ -25,8 +25,9 @@ public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; private: - QStringList m_activities; - Latte::LayoutManager *m_manager{nullptr}; + QString assignedActivitiesText(const QModelIndex &index) const; + + Latte::LayoutConfigDialog *m_configDialog{nullptr}; }; #endif diff --git a/app/layoutsDelegates/colorcmbboxdelegate.cpp b/app/layoutsDelegates/colorcmbboxdelegate.cpp index 00d594429..d6c121e2a 100644 --- a/app/layoutsDelegates/colorcmbboxdelegate.cpp +++ b/app/layoutsDelegates/colorcmbboxdelegate.cpp @@ -32,6 +32,10 @@ QWidget *ColorCmbBoxDelegate::createEditor(QWidget *parent, const QStyleOptionVi } } + connect(editor, static_cast(&QComboBox::activated), [ = ](int index) { + editor->clearFocus(); + }); + return editor; }