From c27727c9e7a13f32ac86034cb49f66306389bbfb Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Sun, 4 Apr 2021 11:55:03 +0300 Subject: [PATCH] provide options for views settings --- app/data/genericdata.cpp | 6 ++ app/data/genericdata.h | 1 + app/data/screendata.h | 1 + .../delegates/singleoptiondelegate.cpp | 23 ++++++ .../delegates/singleoptiondelegate.h | 6 +- app/settings/viewsdialog/viewscontroller.cpp | 9 +-- app/settings/viewsdialog/viewsmodel.cpp | 77 ++++++++++++++++++- app/settings/viewsdialog/viewsmodel.h | 12 +++ 8 files changed, 124 insertions(+), 11 deletions(-) diff --git a/app/data/genericdata.cpp b/app/data/genericdata.cpp index 4232ae4c5..7db390e53 100644 --- a/app/data/genericdata.cpp +++ b/app/data/genericdata.cpp @@ -35,6 +35,12 @@ Generic::Generic(const Generic &o) { } +Generic::Generic(const QString &newid, const QString &newname) + : id(newid), + name(newname) +{ +} + Generic &Generic::operator=(const Generic &rhs) { id = rhs.id; diff --git a/app/data/genericdata.h b/app/data/genericdata.h index e802e6273..5774362c9 100644 --- a/app/data/genericdata.h +++ b/app/data/genericdata.h @@ -36,6 +36,7 @@ public: Generic() = default; Generic(Generic &&o); Generic(const Generic &o); + Generic(const QString &newid, const QString &newname); //! Layout data QString id; diff --git a/app/data/screendata.h b/app/data/screendata.h index bb76e8892..7c0b88828 100644 --- a/app/data/screendata.h +++ b/app/data/screendata.h @@ -37,6 +37,7 @@ class Screen : public Generic { public: static constexpr const char* SERIALIZESPLITTER = ":::"; + static const int ONPRIMARYID = 0; Screen(); Screen(Screen &&o); diff --git a/app/settings/viewsdialog/delegates/singleoptiondelegate.cpp b/app/settings/viewsdialog/delegates/singleoptiondelegate.cpp index ef8f2d6b7..eb8d367fd 100644 --- a/app/settings/viewsdialog/delegates/singleoptiondelegate.cpp +++ b/app/settings/viewsdialog/delegates/singleoptiondelegate.cpp @@ -61,9 +61,32 @@ QWidget *SingleOption::createEditor(QWidget *parent, const QStyleOptionViewItem menu->addAction(action); } + connect(menu, &QMenu::aboutToHide, button, &QWidget::clearFocus); return button; } +void SingleOption::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + editor->setGeometry(option.rect); +} + +void SingleOption::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + QString currentText = index.data(Qt::DisplayRole).toString(); + QPushButton *button = static_cast(editor); + + button->setText(currentText); +} + +bool SingleOption::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, + const QModelIndex &index) +{ + Q_ASSERT(event); + Q_ASSERT(model); + + return QStyledItemDelegate::editorEvent(event, model, option, index); +} + } } } diff --git a/app/settings/viewsdialog/delegates/singleoptiondelegate.h b/app/settings/viewsdialog/delegates/singleoptiondelegate.h index 62cf163b8..535ba2c8b 100644 --- a/app/settings/viewsdialog/delegates/singleoptiondelegate.h +++ b/app/settings/viewsdialog/delegates/singleoptiondelegate.h @@ -43,11 +43,11 @@ public: SingleOption(QObject *parent); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; -// void setEditorData(QWidget *editor, const QModelIndex &index) const override; + void setEditorData(QWidget *editor, const QModelIndex &index) const override; // void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; -// void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; //void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; -// virtual bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override; + virtual bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override; }; diff --git a/app/settings/viewsdialog/viewscontroller.cpp b/app/settings/viewsdialog/viewscontroller.cpp index 3b3029738..3a893e961 100644 --- a/app/settings/viewsdialog/viewscontroller.cpp +++ b/app/settings/viewsdialog/viewscontroller.cpp @@ -25,6 +25,7 @@ #include "viewsdialog.h" #include "viewshandler.h" #include "viewsmodel.h" +#include "delegates/singleoptiondelegate.h" #include "../generic/generictools.h" // Qt @@ -92,11 +93,9 @@ void Views::init() m_view->sortByColumn(m_viewSortColumn, m_viewSortOrder); - //m_view->setItemDelegateForColumn(Model::Layouts::NAMECOLUMN, new Settings::Layout::Delegate::LayoutName(this)); - //m_view->setItemDelegateForColumn(Model::Layouts::BACKGROUNDCOLUMN, new Settings::Layout::Delegate::BackgroundDelegate(this)); - //m_view->setItemDelegateForColumn(Model::Layouts::MENUCOLUMN, new Settings::Layout::Delegate::CheckBox(this)); - //m_view->setItemDelegateForColumn(Model::Layouts::BORDERSCOLUMN, new Settings::Layout::Delegate::CheckBox(this)); - //m_view->setItemDelegateForColumn(Model::Layouts::ACTIVITYCOLUMN, new Settings::Layout::Delegate::Activities(this)); + m_view->setItemDelegateForColumn(Model::Views::SCREENCOLUMN, new Settings::View::Delegate::SingleOption(this)); + m_view->setItemDelegateForColumn(Model::Views::EDGECOLUMN, new Settings::View::Delegate::SingleOption(this)); + m_view->setItemDelegateForColumn(Model::Views::ALIGNMENTCOLUMN, new Settings::View::Delegate::SingleOption(this)); applyColumnWidths(); diff --git a/app/settings/viewsdialog/viewsmodel.cpp b/app/settings/viewsdialog/viewsmodel.cpp index bd6982102..4e9e1c44a 100644 --- a/app/settings/viewsdialog/viewsmodel.cpp +++ b/app/settings/viewsdialog/viewsmodel.cpp @@ -22,6 +22,8 @@ // local #include +#include "../../data/genericdata.h" +#include "../../data/screendata.h" // KDE #include @@ -34,6 +36,9 @@ Views::Views(QObject *parent, Latte::Corona *corona) : QAbstractTableModel(parent), m_corona(corona) { + initEdges(); + initAlignments(); + populateScreens(); } Views::~Views() @@ -81,6 +86,42 @@ const Latte::Data::ViewsTable &Views::originalViewsData() return o_viewsTable; } +void Views::initEdges() +{ + Latte::Data::GenericBasicTable edges; + edges << Data::Generic(QString::number(Plasma::Types::TopEdge), i18nc("top edge", "Top")); + edges << Data::Generic(QString::number(Plasma::Types::LeftEdge), i18nc("left edge", "Left")); + edges << Data::Generic(QString::number(Plasma::Types::BottomEdge), i18nc("bottom edge", "Bottom")); + edges << Data::Generic(QString::number(Plasma::Types::RightEdge), i18nc("right edge", "Right")); + + s_edges.setValue(edges); +} + +void Views::initAlignments() +{ + Latte::Data::GenericBasicTable horizontals; + Latte::Data::GenericBasicTable verticals; + + horizontals << Data::Generic(QString::number(Latte::Types::Left), i18nc("left alignment", "Left")); + verticals << Data::Generic(QString::number(Latte::Types::Left), i18nc("top alignment", "Top")); + + + horizontals << Data::Generic(QString::number(Latte::Types::Center), i18nc("center alignment", "Center")); + verticals << horizontals[1]; + + horizontals << Data::Generic(QString::number(Latte::Types::Right), i18nc("right alignment", "Right")); + verticals << Data::Generic(QString::number(Latte::Types::Left), i18nc("bottom alignment", "Bottom")); + + horizontals << Data::Generic(QString::number(Latte::Types::Right), i18nc("justify alignment", "Justify")); + verticals << horizontals[3]; + + s_horizontalAlignments.setValue(horizontals); + s_verticalAlignments.setValue(verticals); +} + +void Views::populateScreens() +{ +} void Views::setOriginalData(Latte::Data::ViewsTable &data) { @@ -152,6 +193,22 @@ QVariant Views::headerData(int section, Qt::Orientation orientation, int role) c return QAbstractTableModel::headerData(section, orientation, role); } +Qt::ItemFlags Views::flags(const QModelIndex &index) const +{ + const int column = index.column(); + const int row = index.row(); + + auto flags = QAbstractTableModel::flags(index); + + if (column == SCREENCOLUMN + || column == EDGECOLUMN + || column == ALIGNMENTCOLUMN) { + flags |= Qt::ItemIsEditable; + } + + return flags; +} + QVariant Views::data(const QModelIndex &index, int role) const { @@ -167,8 +224,16 @@ QVariant Views::data(const QModelIndex &index, int role) const return m_viewsTable[row].id; } else if (role == ISACTIVEROLE) { return m_viewsTable[row].isActive; + } else if (role == CHOICESROLE) { + if (column == EDGECOLUMN) { + return s_edges; + } else if (column == ALIGNMENTCOLUMN) { + bool isVertical = (m_viewsTable[row].edge == Plasma::Types::LeftEdge || m_viewsTable[row].edge == Plasma::Types::RightEdge); + return isVertical ? s_verticalAlignments : s_horizontalAlignments; + } } + if (role == Qt::TextAlignmentRole){ return static_cast(Qt::AlignHCenter | Qt::AlignVCenter); } @@ -185,12 +250,14 @@ QVariant Views::data(const QModelIndex &index, int role) const } break; case SCREENCOLUMN: - if (role == Qt::DisplayRole || role == Qt::UserRole){ + if (role == Qt::DisplayRole){ return (m_viewsTable[row].onPrimary ? QString("Primary") : QString::number(m_viewsTable[row].screen)); + } else if (role == Qt::UserRole) { + return m_viewsTable[row].onPrimary ? QString::number(Data::Screen::ONPRIMARYID) : QString::number(m_viewsTable[row].screen); } break; case EDGECOLUMN: - if (role == Qt::DisplayRole || role == Qt::UserRole){ + if (role == Qt::DisplayRole){ if (m_viewsTable[row].edge == Plasma::Types::BottomEdge) { return QString("Bottom"); } else if (m_viewsTable[row].edge == Plasma::Types::TopEdge) { @@ -202,10 +269,12 @@ QVariant Views::data(const QModelIndex &index, int role) const } return QString("Unknown"); + } else if (role == Qt::UserRole) { + return QString::number(m_viewsTable[row].edge); } break; case ALIGNMENTCOLUMN: - if (role == Qt::DisplayRole || role == Qt::UserRole){ + if (role == Qt::DisplayRole){ if (m_viewsTable[row].alignment == Latte::Types::Center) { return QString("Center"); } else if (m_viewsTable[row].alignment == Latte::Types::Left) { @@ -221,6 +290,8 @@ QVariant Views::data(const QModelIndex &index, int role) const } return QString("Unknown"); + } else if (role == Qt::UserRole) { + return QString::number(m_viewsTable[row].alignment); } break; case SUBCONTAINMENTSCOLUMN: diff --git a/app/settings/viewsdialog/viewsmodel.h b/app/settings/viewsdialog/viewsmodel.h index 2bbd7562c..899662fd4 100644 --- a/app/settings/viewsdialog/viewsmodel.h +++ b/app/settings/viewsdialog/viewsmodel.h @@ -23,6 +23,7 @@ // local #include "../../lattecorona.h" +#include "../../data/genericbasictable.h" #include "../../data/viewdata.h" #include "../../data/viewstable.h" @@ -77,6 +78,7 @@ public: QVariant data(const QModelIndex &index, int role) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; const Latte::Data::ViewsTable ¤tViewsData(); const Latte::Data::ViewsTable &originalViewsData(); @@ -90,11 +92,21 @@ signals: private slots: void clear(); + void initEdges(); + void initAlignments(); + void populateScreens(); + + private: Latte::Data::ViewsTable m_viewsTable; Latte::Data::ViewsTable o_viewsTable; Latte::Corona *m_corona{nullptr}; + + QVariant s_edges; + QVariant s_horizontalAlignments; + QVariant s_verticalAlignments; + Latte::Data::GenericBasicTable s_screens; }; }