File indexing completed on 2024-05-12 17:07:15
0001 /* 0002 SPDX-FileCopyrightText: 2010 Andriy Rysin <rysin@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include <QAbstractItemModel> 0010 #include <QAbstractTableModel> 0011 #include <QSet> 0012 #include <QStyledItemDelegate> 0013 0014 class QTreeView; 0015 class KeyboardConfig; 0016 struct Rules; 0017 class Flags; 0018 0019 class LayoutsTableModel : public QAbstractTableModel 0020 { 0021 Q_OBJECT 0022 0023 public: 0024 LayoutsTableModel(Rules *rules, Flags *flags, KeyboardConfig *keyboardConfig, QObject *parent = nullptr); 0025 0026 int columnCount(const QModelIndex &) const override; 0027 Qt::ItemFlags flags(const QModelIndex &index) const override; 0028 QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; 0029 0030 int rowCount(const QModelIndex &parent = QModelIndex()) const override; 0031 QVariant data(const QModelIndex &index, int role) const override; 0032 bool setData(const QModelIndex &index, const QVariant &value, int role) override; 0033 #ifdef DRAG_ENABLED 0034 Qt::DropActions supportedDropActions() const 0035 { 0036 return Qt::MoveAction; 0037 } 0038 QStringList mimeTypes() const; 0039 QMimeData *mimeData(const QModelIndexList &indexes) const; 0040 #endif 0041 void refresh(); 0042 0043 static const int MAP_COLUMN; 0044 static const int LAYOUT_COLUMN; 0045 static const int VARIANT_COLUMN; 0046 static const int DISPLAY_NAME_COLUMN; 0047 static const int SHORTCUT_COLUMN; 0048 0049 private: 0050 KeyboardConfig *keyboardConfig; 0051 const Rules *rules; 0052 Flags *countryFlags; 0053 }; 0054 0055 class LabelEditDelegate : public QStyledItemDelegate 0056 { 0057 Q_OBJECT 0058 0059 public: 0060 explicit LabelEditDelegate(const KeyboardConfig *keyboardConfig, QObject *parent = nullptr); 0061 0062 QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 0063 0064 void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 0065 0066 private: 0067 const KeyboardConfig *keyboardConfig; 0068 }; 0069 0070 class VariantComboDelegate : public QStyledItemDelegate 0071 { 0072 Q_OBJECT 0073 0074 public: 0075 VariantComboDelegate(const KeyboardConfig *keyboardConfig, const Rules *rules, QObject *parent = nullptr); 0076 0077 QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 0078 0079 void setEditorData(QWidget *editor, const QModelIndex &index) const override; 0080 void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; 0081 0082 void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 0083 0084 private: 0085 const KeyboardConfig *keyboardConfig; 0086 const Rules *rules; 0087 }; 0088 0089 class KKeySequenceWidgetDelegate : public QStyledItemDelegate 0090 { 0091 Q_OBJECT 0092 0093 public: 0094 KKeySequenceWidgetDelegate(const KeyboardConfig *keyboardConfig_, QObject *parent = nullptr); 0095 0096 QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 0097 void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; 0098 void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 0099 0100 private: 0101 const KeyboardConfig *keyboardConfig; 0102 mutable QSet<QModelIndex> itemsBeingEdited; 0103 }; 0104 0105 class XkbOptionsTreeModel : public QAbstractItemModel 0106 { 0107 public: 0108 XkbOptionsTreeModel(Rules *rules_, QObject *parent); 0109 0110 void setXkbOptions(const QStringList &options); 0111 QStringList xkbOptions() const; 0112 0113 int columnCount(const QModelIndex & /*parent*/) const override 0114 { 0115 return 1; 0116 } 0117 int rowCount(const QModelIndex &parent) const override; 0118 QModelIndex parent(const QModelIndex &index) const override 0119 { 0120 if (!index.isValid()) 0121 return QModelIndex(); 0122 if (index.internalId() < 100) 0123 return QModelIndex(); 0124 return createIndex(((index.internalId() - index.row()) / 100) - 1, index.column()); 0125 } 0126 QModelIndex index(int row, int column, const QModelIndex &parent) const override 0127 { 0128 if (!parent.isValid()) 0129 return createIndex(row, column); 0130 return createIndex(row, column, (100 * (parent.row() + 1)) + row); 0131 } 0132 Qt::ItemFlags flags(const QModelIndex &index) const override 0133 { 0134 if (!index.isValid()) 0135 return Qt::ItemFlags(); 0136 0137 if (!index.parent().isValid()) 0138 return Qt::ItemIsEnabled | Qt::ItemIsSelectable; 0139 0140 return Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable; 0141 } 0142 0143 bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; 0144 QVariant data(const QModelIndex &index, int role) const override; 0145 void reset() 0146 { 0147 beginResetModel(); 0148 endResetModel(); 0149 } 0150 void gotoGroup(const QString &group, QTreeView *view); 0151 0152 private: 0153 Rules *rules; 0154 QStringList m_xkbOptions; 0155 };