/* This file is part of the KDE libraries Copyright (C) 2005 Joseph Wenninger This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KCHARSELECT_P_H #define KCHARSELECT_P_H #include #include #include #include #include #include #include #include #include "kcharselectdata_p.h" class KCharSelectTablePrivate; /** * @short Character selection table * * A table widget which displays the characters of a font. Internally * used by KCharSelect. See the KCharSelect documentation for further * details. * * @author Reginald Stadlbauer * @author Daniel Laidig */ class KCharSelectTable : public QTableView { Q_OBJECT public: /** * Constructor. Using @p _font, draw a table of chars. * @sa setContents */ KCharSelectTable(QWidget *parent, const QFont &_font); ~KCharSelectTable(); /** * Reimplemented. */ virtual void resizeEvent(QResizeEvent *); /** Set the font to be displayed to @p _font . */ virtual void setFont(const QFont &_font); /** Set the highlighted character to @p c . */ virtual void setChar(const QChar &c); /** Set the contents of the table to @p chars . */ void setContents(QList chars); /** @return Currently highlighted character. */ virtual QChar chr(); /** * Returns the currently displayed font. */ QFont font() const; /** * Returns a list of currently displayed characters. */ QList displayedChars() const; /** * Reimplemented. */ virtual void scrollTo(const QModelIndex & index, ScrollHint hint = EnsureVisible); protected: /** * Reimplemented. */ virtual void keyPressEvent(QKeyEvent *e); Q_SIGNALS: /** Emitted to indicate that character @p c is activated (such as by double-clicking it). */ void activated(const QChar &c); void focusItemChanged(const QChar &c); void showCharRequested(const QChar& c); private: Q_PRIVATE_SLOT(d, void _k_slotSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected)) Q_PRIVATE_SLOT(d, void _k_resizeCells()) Q_PRIVATE_SLOT(d, void _k_doubleClicked(const QModelIndex & index)) private: friend class KCharSelectTablePrivate; KCharSelectTablePrivate* const d; Q_DISABLE_COPY(KCharSelectTable) }; // NO D-Pointer needed, private internal class, no public API class KCharSelectItemModel: public QAbstractTableModel { Q_OBJECT public: KCharSelectItemModel(QList chars, const QFont& font, QObject *parent): QAbstractTableModel(parent), m_chars(chars), m_font(font) { if(chars.count()) { m_columns = chars.count(); } else { m_columns = 1; } } enum internalRoles {CharacterRole = Qt::UserRole}; int rowCount(const QModelIndex&) const { if (m_chars.count() % m_columns == 0) return m_chars.count() / m_columns; else return m_chars.count() / m_columns + 1; } int columnCount(const QModelIndex&) const { return m_columns; } void setFont(const QFont& font) { m_font = font; reset(); } Qt::ItemFlags flags(const QModelIndex &index) const { int pos = m_columns * (index.row()) + index.column(); if (pos >= m_chars.size() || index.row() < 0 || index.column() < 0) { return Qt::ItemIsDropEnabled; } return (Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | Qt::ItemIsSelectable | Qt::ItemIsEnabled); } QVariant data(const QModelIndex &index, int role) const; QMimeData *mimeData(const QModelIndexList & indexes) const { if (indexes.size() != 1) { return 0; } QMimeData *mimeData = new QMimeData(); mimeData->setText(data(indexes[0], CharacterRole).toString()); return mimeData; } Qt::DropActions supportedDropActions() const { return Qt::CopyAction; } QStringList mimeTypes() const { QStringList types; types << "text/plain"; return types; } bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { Q_UNUSED(row) Q_UNUSED(parent) if (action == Qt::IgnoreAction) { return true; } if (!data->hasText()) { return false; } if (column > 0) { return false; } QString text = data->text(); if (text.isEmpty()) { return false; } emit showCharRequested(text[0]); return true; } void updateColumnCount(int maxWidth) { emit layoutAboutToBeChanged(); QFontMetrics fm(m_font); int maxChar = fm.maxWidth(); if (maxChar < 2*fm.xHeight()) { maxChar = 2 * fm.xHeight(); } if (maxChar < 5) { maxChar = qMax(5, fm.height()); } m_columns = maxWidth / maxChar; if (m_columns <= 0) { m_columns = 1; } emit layoutChanged(); } private: QList m_chars; int m_tableNum; QFont m_font; int m_columns; Q_SIGNALS: void showCharRequested(const QChar& c); }; #endif // KCHARSELECT_P_H