File indexing completed on 2024-05-12 05:35:43

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