make activities combobox work properly

--activitiescmbbox in layout manager now shows always only
the available activities
pull/1/head
Michail Vourlakos 8 years ago
parent d8716f18a8
commit f28edd6d03

@ -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

@ -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};

@ -10,11 +10,14 @@
#include <KActivities/Info>
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<Latte::LayoutConfigDialog *>(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<QComboBox *>(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;
}

@ -1,7 +1,7 @@
#ifndef ACTIVITYCMBBOXDELEGATE_H
#define ACTIVITYCMBBOXDELEGATE_H
#include "../layoutmanager.h"
#include "../layoutconfigdialog.h"
#include <QItemDelegate>
@ -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

@ -32,6 +32,10 @@ QWidget *ColorCmbBoxDelegate::createEditor(QWidget *parent, const QStyleOptionVi
}
}
connect(editor, static_cast<void(QComboBox::*)(int)>(&QComboBox::activated), [ = ](int index) {
editor->clearFocus();
});
return editor;
}

Loading…
Cancel
Save