You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
270 lines
6.7 KiB
270 lines
6.7 KiB
#pragma once |
|
|
|
/* |
|
* SPDX-FileCopyrightText: 2003-2007 Craig Drummond <craig@kde.org> |
|
* SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
|
|
#include "FontList.h" |
|
#include <KIO/Job> |
|
#include <QAbstractItemModel> |
|
#include <QList> |
|
#include <QModelIndex> |
|
#include <QTreeView> |
|
#include <QVariant> |
|
|
|
class QDragEnterEvent; |
|
class QDragLeaveEvent; |
|
class QDropEvent; |
|
class QTextStream; |
|
class QDomElement; |
|
|
|
namespace KFI |
|
{ |
|
class CGroupList; |
|
class CFontItem; |
|
|
|
class CGroupListItem |
|
{ |
|
public: |
|
enum EType { |
|
ALL, |
|
PERSONAL, |
|
SYSTEM, |
|
UNCLASSIFIED, |
|
CUSTOM, |
|
}; |
|
|
|
union Data { |
|
bool validated; // CUSTOM |
|
CGroupList *parent; // UNCLASSIFIED |
|
}; |
|
|
|
CGroupListItem(const QString &name); |
|
CGroupListItem(EType type, CGroupList *p); |
|
|
|
const QString &name() const |
|
{ |
|
return m_name; |
|
} |
|
void setName(const QString &n) |
|
{ |
|
m_name = n; |
|
} |
|
QSet<QString> &families() |
|
{ |
|
return m_families; |
|
} |
|
EType type() const |
|
{ |
|
return m_type; |
|
} |
|
bool isCustom() const |
|
{ |
|
return CUSTOM == m_type; |
|
} |
|
bool isAll() const |
|
{ |
|
return ALL == m_type; |
|
} |
|
bool isUnclassified() const |
|
{ |
|
return UNCLASSIFIED == m_type; |
|
} |
|
bool isPersonal() const |
|
{ |
|
return PERSONAL == m_type; |
|
} |
|
bool isSystem() const |
|
{ |
|
return SYSTEM == m_type; |
|
} |
|
bool validated() const |
|
{ |
|
return isCustom() ? m_data.validated : true; |
|
} |
|
void setValidated() |
|
{ |
|
if (isCustom()) |
|
m_data.validated = true; |
|
} |
|
bool highlighted() const |
|
{ |
|
return m_highlighted; |
|
} |
|
void setHighlighted(bool b) |
|
{ |
|
m_highlighted = b; |
|
} |
|
bool hasFont(const CFontItem *fnt) const; |
|
CFamilyItem::EStatus status() const |
|
{ |
|
return m_status; |
|
} |
|
void updateStatus(QSet<QString> &enabled, QSet<QString> &disabled, QSet<QString> &partial); |
|
bool load(QDomElement &elem); |
|
bool addFamilies(QDomElement &elem); |
|
void save(QTextStream &str); |
|
void addFamily(const QString &family) |
|
{ |
|
m_families.insert(family); |
|
} |
|
void removeFamily(const QString &family) |
|
{ |
|
m_families.remove(family); |
|
} |
|
bool hasFamily(const QString &family) |
|
{ |
|
return m_families.contains(family); |
|
} |
|
|
|
private: |
|
QSet<QString> m_families; |
|
QString m_name; |
|
EType m_type; |
|
Data m_data; |
|
bool m_highlighted; |
|
CFamilyItem::EStatus m_status; |
|
}; |
|
|
|
class CGroupList : public QAbstractItemModel |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
CGroupList(QWidget *parent = nullptr); |
|
~CGroupList() override; |
|
|
|
QVariant data(const QModelIndex &index, int role) const override; |
|
bool setData(const QModelIndex &index, const QVariant &value, int role) override; |
|
Qt::ItemFlags flags(const QModelIndex &index) const override; |
|
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; |
|
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; |
|
QModelIndex parent(const QModelIndex &index) const override; |
|
int rowCount(const QModelIndex &parent = QModelIndex()) const override; |
|
int columnCount(const QModelIndex &parent = QModelIndex()) const override; |
|
void update(const QModelIndex &unHighlight, const QModelIndex &highlight); |
|
void updateStatus(QSet<QString> &enabled, QSet<QString> &disabled, QSet<QString> &partial); |
|
void setSysMode(bool sys); |
|
void rescan(); |
|
void load(); |
|
bool load(const QString &file); |
|
bool save(); |
|
bool save(const QString &fileName, CGroupListItem *grp); |
|
void merge(const QString &file); |
|
void clear(); |
|
QModelIndex index(CGroupListItem::EType t); |
|
void createGroup(const QString &name); |
|
bool removeGroup(const QModelIndex &idx); |
|
void removeFamily(const QString &family); |
|
bool removeFromGroup(CGroupListItem *grp, const QString &family); |
|
QString whatsThis() const; |
|
|
|
CGroupListItem *group(CGroupListItem::EType t) |
|
{ |
|
return m_specialGroups[t]; |
|
} |
|
bool exists(const QString &name, bool showDialog = true); |
|
|
|
public Q_SLOTS: |
|
|
|
void addToGroup(const QModelIndex &group, const QSet<QString> &families); |
|
void removeFromGroup(const QModelIndex &group, const QSet<QString> &families); |
|
|
|
Q_SIGNALS: |
|
|
|
void refresh(); |
|
|
|
private: |
|
void readGroupsFile(); |
|
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; |
|
Qt::DropActions supportedDropActions() const override; |
|
QStringList mimeTypes() const override; |
|
CGroupListItem *find(const QString &name); |
|
QModelIndex createIdx(int r, int c, void *p) |
|
{ |
|
return createIndex(r, c, p); |
|
} |
|
|
|
private: |
|
QString m_fileName; |
|
time_t m_timeStamp; |
|
bool m_modified; |
|
QWidget *m_parent; |
|
QList<CGroupListItem *> m_groups; |
|
QMap<CGroupListItem::EType, CGroupListItem *> m_specialGroups; |
|
Qt::SortOrder m_sortOrder; |
|
|
|
friend class CGroupListItem; |
|
friend class CGroupListView; |
|
}; |
|
|
|
class CGroupListView : public QTreeView |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
CGroupListView(QWidget *parent, CGroupList *model); |
|
~CGroupListView() override |
|
{ |
|
} |
|
|
|
QSize sizeHint() const override |
|
{ |
|
return QSize(32, 32); |
|
} |
|
|
|
bool isCustom() |
|
{ |
|
return CGroupListItem::CUSTOM == getType(); |
|
} |
|
bool isUnclassified() |
|
{ |
|
return CGroupListItem::UNCLASSIFIED == getType(); |
|
} |
|
bool isSystem() |
|
{ |
|
return CGroupListItem::SYSTEM == getType(); |
|
} |
|
bool isPersonal() |
|
{ |
|
return CGroupListItem::PERSONAL == getType(); |
|
} |
|
CGroupListItem::EType getType(); |
|
void controlMenu(bool del, bool en, bool dis, bool p, bool exp); |
|
|
|
Q_SIGNALS: |
|
|
|
void del(); |
|
void print(); |
|
void enable(); |
|
void disable(); |
|
void zip(); |
|
void moveFonts(); |
|
void info(const QString &str); |
|
void addFamilies(const QModelIndex &group, const QSet<QString> &); |
|
void removeFamilies(const QModelIndex &group, const QSet<QString> &); |
|
void itemSelected(const QModelIndex &); |
|
void unclassifiedChanged(); |
|
|
|
private Q_SLOTS: |
|
|
|
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override; |
|
void rename(); |
|
void emitMoveFonts(); |
|
|
|
private: |
|
void contextMenuEvent(QContextMenuEvent *ev) override; |
|
void dragEnterEvent(QDragEnterEvent *event) override; |
|
void dragMoveEvent(QDragMoveEvent *event) override; |
|
void dragLeaveEvent(QDragLeaveEvent *event) override; |
|
void dropEvent(QDropEvent *event) override; |
|
void drawHighlighter(const QModelIndex &idx); |
|
bool viewportEvent(QEvent *event) override; |
|
|
|
private: |
|
QMenu *m_menu; |
|
QAction *m_deleteAct, *m_enableAct, *m_disableAct, *m_printAct, *m_renameAct, *m_exportAct; |
|
QModelIndex m_currentDropItem; |
|
}; |
|
}
|
|
|