4#include "mimetypemodel.h"
8#include <QMimeDatabase>
14Q_DECLARE_METATYPE(QMimeType)
16typedef QList<QStandardItem *> StandardItemList;
18enum { mimeTypeRole = Qt::UserRole + 1, iconQueriedRole = Qt::UserRole + 2 };
21bool operator<(
const QMimeType &t1,
const QMimeType &t2)
23 return t1.name() < t2.name();
27static StandardItemList createRow(
const QMimeType &t)
29 const QVariant v = QVariant::fromValue(t);
30 QStandardItem *nameItem =
new QStandardItem(t.name());
31 const Qt::ItemFlags flags = Qt::ItemIsSelectable | Qt::ItemIsEnabled;
32 nameItem->setData(v, mimeTypeRole);
33 nameItem->setData(QVariant(
false), iconQueriedRole);
34 nameItem->setFlags(flags);
35 nameItem->setToolTip(t.comment());
36 return StandardItemList{nameItem};
39MimetypeModel::MimetypeModel(QObject *parent)
40 : QStandardItemModel(0, ColumnCount, parent)
42 setHorizontalHeaderLabels(QStringList{tr(
"Name")});
46QVariant MimetypeModel::data(
const QModelIndex &index,
int role)
const
48 if (role != Qt::DecorationRole || !index.isValid() || index.data(iconQueriedRole).toBool())
49 return QStandardItemModel::data(index, role);
50 QStandardItem *item = itemFromIndex(index);
51 const QString iconName = qvariant_cast<QMimeType>(item->data(mimeTypeRole)).iconName();
52 if (!iconName.isEmpty())
53 item->setIcon(QIcon::fromTheme(iconName));
54 item->setData(QVariant(
true), iconQueriedRole);
58QMimeType MimetypeModel::mimeType(
const QModelIndex &index)
const
60 return qvariant_cast<QMimeType>(index.data(mimeTypeRole));
63void MimetypeModel::populate()
65 typedef QList<QMimeType>::Iterator Iterator;
67 QMimeDatabase mimeDatabase;
68 QList<QMimeType> allTypes = mimeDatabase.allMimeTypes();
72 Iterator end = allTypes.end();
73 const Iterator topLevelStart =
74 std::stable_partition(allTypes.begin(), end,
75 [](
const QMimeType &t) { return !t.parentMimeTypes().isEmpty(); });
76 std::stable_sort(topLevelStart, end);
77 for (Iterator it = topLevelStart; it != end; ++it) {
78 const StandardItemList row = createRow(*it);
80 m_nameIndexHash.insert(it->name(), indexFromItem(row.constFirst()));
82 allTypes.erase(topLevelStart, end);
84 while (!allTypes.isEmpty()) {
87 auto nameIndexIt = m_nameIndexHash.constEnd();
88 for (Iterator it = allTypes.begin(); it != end; ++it) {
89 nameIndexIt = m_nameIndexHash.constFind(it->parentMimeTypes().constFirst());
90 if (nameIndexIt != m_nameIndexHash.constEnd())
93 if (nameIndexIt == m_nameIndexHash.constEnd()) {
94 qWarning() <<
"Orphaned mime types:" << allTypes;
100 const QString &parentName = nameIndexIt.key();
101 const Iterator start =
102 std::stable_partition(allTypes.begin(), end, [parentName](
const QMimeType &t)
103 { return !t.parentMimeTypes().contains(parentName); });
104 std::stable_sort(start, end);
105 QStandardItem *parentItem = itemFromIndex(nameIndexIt.value());
106 for (Iterator it = start; it != end; ++it) {
107 const StandardItemList row = createRow(*it);
108 parentItem->appendRow(row);
109 m_nameIndexHash.insert(it->name(), indexFromItem(row.constFirst()));
111 allTypes.erase(start, end);
115QTextStream &operator<<(QTextStream &stream,
const QStringList &list)
117 for (
int i = 0, size = list.size(); i < size; ++i) {
120 stream << list.at(i);
125QString MimetypeModel::formatMimeTypeInfo(
const QMimeType &t)
128 QTextStream str(&result);
129 str <<
"<html><head/><body><h3><center>" << t.name() <<
"</center></h3><br><table>";
131 const QStringList &aliases = t.aliases();
132 if (!aliases.isEmpty())
133 str <<
"<tr><td>Aliases:</td><td>" <<
" (" << aliases <<
')';
136 <<
"<tr><td>Comment:</td><td>" << t.comment() <<
"</td></tr>"
137 <<
"<tr><td>Icon name:</td><td>" << t.iconName() <<
"</td></tr>"
138 <<
"<tr><td>Generic icon name</td><td>" << t.genericIconName() <<
"</td></tr>";
140 const QString &filter = t.filterString();
141 if (!filter.isEmpty())
142 str <<
"<tr><td>Filter:</td><td>" << t.filterString() <<
"</td></tr>";
144 const QStringList &patterns = t.globPatterns();
145 if (!patterns.isEmpty())
146 str <<
"<tr><td>Glob patterns:</td><td>" << patterns <<
"</td></tr>";
148 const QStringList &parentMimeTypes = t.parentMimeTypes();
149 if (!parentMimeTypes.isEmpty())
150 str <<
"<tr><td>Parent types:</td><td>" << t.parentMimeTypes() <<
"</td></tr>";
152 QStringList suffixes = t.suffixes();
153 if (!suffixes.isEmpty()) {
154 str <<
"<tr><td>Suffixes:</td><td>";
155 const QString &preferredSuffix = t.preferredSuffix();
156 if (!preferredSuffix.isEmpty()) {
157 suffixes.removeOne(preferredSuffix);
158 str <<
"<b>" << preferredSuffix <<
"</b> ";
160 str << suffixes <<
"</td></tr>";
162 str <<
"</table></body></html>";