1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2005 Joseph Wenninger <jowenn@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#ifndef KCHARSELECT_P_H
9#define KCHARSELECT_P_H
10
11#include <QAbstractTableModel>
12#include <QFont>
13#include <QMimeData>
14#include <QTableView>
15#include <memory>
16
17#include "kcharselectdata_p.h"
18
19class KCharSelectTablePrivate;
20
21/**
22 * @short Character selection table
23 *
24 * A table widget which displays the characters of a font. Internally
25 * used by KCharSelect. See the KCharSelect documentation for further
26 * details.
27 *
28 * @author Reginald Stadlbauer <reggie@kde.org>
29 * @author Daniel Laidig <d.laidig@gmx.de>
30 */
31
32class KCharSelectTable : public QTableView
33{
34 Q_OBJECT
35
36public:
37 /**
38 * Constructor. Using @p _font, draw a table of chars.
39 * @sa setContents
40 */
41 KCharSelectTable(QWidget *parent, const QFont &_font);
42
43 ~KCharSelectTable() override;
44
45 void resizeEvent(QResizeEvent *) override;
46
47 /** Set the font to be displayed to @p _font . */
48 void setFont(const QFont &_font);
49
50 /** Set the highlighted character to @p c . */
51 void setChar(uint c);
52 /** Set the contents of the table to @p chars . */
53 void setContents(const QList<uint> &chars);
54
55 /** @return Currently highlighted character. */
56 uint chr();
57
58 /**
59 * Returns the currently displayed font.
60 */
61 QFont font() const;
62
63 /**
64 * Returns a list of currently displayed characters.
65 */
66 QList<uint> displayedChars() const;
67
68 /**
69 * Reimplemented.
70 */
71 void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override;
72
73protected:
74 /**
75 * Reimplemented.
76 */
77 void keyPressEvent(QKeyEvent *e) override;
78
79Q_SIGNALS:
80 /** Emitted to indicate that character @p c is activated (such as by double-clicking it). */
81 void activated(uint c);
82 void focusItemChanged(uint c);
83 void showCharRequested(uint c);
84
85private:
86 friend class KCharSelectTablePrivate;
87 std::unique_ptr<KCharSelectTablePrivate> const d;
88
89 Q_DISABLE_COPY(KCharSelectTable)
90};
91
92// NO D-Pointer needed, private internal class, no public API
93
94class KCharSelectItemModel : public QAbstractTableModel
95{
96 Q_OBJECT
97public:
98 KCharSelectItemModel(const QList<uint> &chars, const QFont &font, QObject *parent)
99 : QAbstractTableModel(parent)
100 , m_chars(chars)
101 , m_font(font)
102 {
103 if (!chars.isEmpty()) {
104 m_columns = chars.count();
105 } else {
106 m_columns = 1;
107 }
108 }
109
110 enum internalRoles { CharacterRole = Qt::UserRole };
111 int rowCount(const QModelIndex &parent = QModelIndex()) const override
112 {
113 if (parent.isValid()) {
114 return 0;
115 }
116 if (m_chars.count() % m_columns == 0) {
117 return m_chars.count() / m_columns;
118 } else {
119 return m_chars.count() / m_columns + 1;
120 }
121 }
122 int columnCount(const QModelIndex & = QModelIndex()) const override
123 {
124 return m_columns;
125 }
126
127 void setFont(const QFont &font)
128 {
129 beginResetModel();
130 m_font = font;
131 endResetModel();
132 }
133 Qt::ItemFlags flags(const QModelIndex &index) const override
134 {
135 int pos = m_columns * (index.row()) + index.column();
136 if (pos >= m_chars.size() || index.row() < 0 || index.column() < 0) {
137 return Qt::ItemIsDropEnabled;
138 }
139 return (Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
140 }
141 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
142 QMimeData *mimeData(const QModelIndexList &indexes) const override
143 {
144 if (indexes.size() != 1) {
145 return nullptr;
146 }
147 QMimeData *mimeData = new QMimeData();
148 char32_t character = data(index: indexes[0], role: CharacterRole).toUInt();
149 mimeData->setText(QString::fromUcs4(&character, size: 1));
150 return mimeData;
151 }
152 Qt::DropActions supportedDropActions() const override
153 {
154 return Qt::CopyAction;
155 }
156 QStringList mimeTypes() const override
157 {
158 return {QStringLiteral("text/plain")};
159 }
160 bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;
161
162 void setColumnCount(int columns);
163
164 QList<uint> chars() const
165 {
166 return m_chars;
167 }
168
169private:
170 QList<uint> m_chars;
171 QFont m_font;
172 int m_columns;
173
174Q_SIGNALS:
175 void showCharRequested(uint c);
176};
177#endif // KCHARSELECT_P_H
178

source code of kwidgetsaddons/src/kcharselect_p.h