00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "plasmaappletitemmodel_p.h"
00021
00022 #include <KSycoca>
00023
00024 PlasmaAppletItem::PlasmaAppletItem(PlasmaAppletItemModel * model, const QMap<QString, QVariant>& info,
00025 FilterFlags flags, QMap<QString, QVariant> * extraAttrs)
00026 : QObject(model), m_model(model)
00027 {
00028 QMap<QString, QVariant> attrs(info);
00029
00030 attrs.insert("favorite", flags & Favorite ? true : false);
00031 attrs.insert("used", flags & Used ? true : false);
00032
00033 if (extraAttrs) attrs.unite(* extraAttrs);
00034 setText(info["name"].toString() + " - "+ info["category"].toString());
00035 setData(attrs);
00036 setIcon(qvariant_cast<QIcon>(info["icon"]));
00037 }
00038
00039 QString PlasmaAppletItem::name() const
00040 {
00041 return data().toMap()["name"].toString();
00042 }
00043
00044 QString PlasmaAppletItem::pluginName() const
00045 {
00046 return data().toMap()["pluginName"].toString();
00047 }
00048
00049 QString PlasmaAppletItem::description() const
00050 {
00051 return data().toMap()["description"].toString();
00052 }
00053
00054 int PlasmaAppletItem::running() const
00055 {
00056 return data().toMap()["runningCount"].toInt();
00057 }
00058
00059 void PlasmaAppletItem::setFavorite(bool favorite)
00060 {
00061 QMap<QString, QVariant> attrs = data().toMap();
00062 attrs.insert("favorite", favorite ? true : false);
00063 setData(QVariant(attrs));
00064
00065 QString pluginName = attrs["pluginName"].toString();
00066 m_model->setFavorite(pluginName, favorite);
00067 }
00068
00069 void PlasmaAppletItem::setRunning(int count)
00070 {
00071 QMap<QString, QVariant> attrs = data().toMap();
00072 attrs.insert("running", count > 0);
00073 attrs.insert("runningCount", count);
00074 setData(QVariant(attrs));
00075 }
00076
00077 bool PlasmaAppletItem::passesFiltering(
00078 const KCategorizedItemsViewModels::Filter & filter) const
00079 {
00080 return data().toMap()[filter.first] == filter.second;
00081 }
00082
00083 QVariantList PlasmaAppletItem::arguments() const
00084 {
00085 return qvariant_cast<QVariantList>(data().toMap()["arguments"]);
00086 }
00087
00088 PlasmaAppletItemModel::PlasmaAppletItemModel(KConfigGroup configGroup, QObject * parent) :
00089 KCategorizedItemsViewModels::DefaultItemModel(parent),
00090 m_configGroup(configGroup)
00091 {
00092 m_used = m_configGroup.readEntry("used").split(",");
00093 m_favorites = m_configGroup.readEntry("favorites").split(",");
00094 connect(KSycoca::self(), SIGNAL(databaseChanged()), this, SLOT(populateModel()));
00095 }
00096
00097 void PlasmaAppletItemModel::populateModel()
00098 {
00099 clear();
00100
00101
00102
00103 QRegExp rx("recommended[.]([0-9A-Za-z]+)[.]plugins");
00104 QMapIterator<QString, QString> i(m_configGroup.entryMap());
00105 QMap < QString, QMap < QString, QVariant > > extraPluginAttrs;
00106 while (i.hasNext()) {
00107 i.next();
00108 if (!rx.exactMatch(i.key())) continue;
00109 QString id = rx.cap(1);
00110
00111 foreach (const QString &plugin, i.value().split(",")) {
00112 extraPluginAttrs[plugin]["recommended." + id] = true;
00113 }
00114 }
00115
00116
00117
00118 foreach (const KPluginInfo& info, Plasma::Applet::listAppletInfo(QString(), m_application)) {
00119
00120 if (info.property("NoDisplay").toBool()) {
00121
00122 continue;
00123 }
00124
00125
00126 QMap<QString, QVariant> attrs;
00127 attrs.insert("name", info.name());
00128 attrs.insert("pluginName", info.pluginName());
00129 attrs.insert("description", info.comment());
00130 attrs.insert("category", info.category());
00131 attrs.insert("icon", static_cast<QIcon>(KIcon(info.icon().isEmpty()?"application-x-plasma":info.icon())));
00132
00133 appendRow(new PlasmaAppletItem(this, attrs,
00134 ((m_favorites.contains(info.pluginName())) ? PlasmaAppletItem::Favorite : PlasmaAppletItem::NoFilter) |
00135 ((m_used.contains(info.pluginName())) ? PlasmaAppletItem::Used : PlasmaAppletItem::NoFilter)
00136 , &(extraPluginAttrs[info.pluginName()])));
00137 }
00138 }
00139
00140 void PlasmaAppletItemModel::setRunningApplets(const QHash<QString, int> &apps)
00141 {
00142
00143 for (int r=0; r<rowCount(); ++r) {
00144 QStandardItem *i = item(r);
00145 PlasmaAppletItem *p = dynamic_cast<PlasmaAppletItem *>(i);
00146 if (p) {
00147 p->setRunning(apps.value(p->name()));
00148 }
00149 }
00150 }
00151
00152 void PlasmaAppletItemModel::setRunningApplets(const QString &name, int count)
00153 {
00154 for (int r=0; r<rowCount(); ++r) {
00155 QStandardItem *i = item(r);
00156 PlasmaAppletItem *p = dynamic_cast<PlasmaAppletItem *>(i);
00157 if (p && p->name() == name) {
00158 p->setRunning(count);
00159 }
00160 }
00161 }
00162
00163 QStringList PlasmaAppletItemModel::mimeTypes() const
00164 {
00165 QStringList types;
00166 types << QLatin1String("text/x-plasmoidservicename");
00167 return types;
00168 }
00169
00170 QMimeData* PlasmaAppletItemModel::mimeData(const QModelIndexList & indexes) const
00171 {
00172 kDebug() << "GETTING MIME DATA\n";
00173 if (indexes.count() <= 0) {
00174 return 0;
00175 }
00176
00177 QStringList types = mimeTypes();
00178
00179 if (types.isEmpty()) {
00180 return 0;
00181 }
00182
00183 QMimeData * data = new QMimeData();
00184
00185 QString format = types.at(0);
00186
00187 QByteArray appletNames;
00188 int lastRow = -1;
00189 foreach (const QModelIndex &index, indexes) {
00190 if (index.row() == lastRow) {
00191 continue;
00192 }
00193
00194 lastRow = index.row();
00195 PlasmaAppletItem *selectedItem = (PlasmaAppletItem *) itemFromIndex(index);
00196 appletNames += '\n' + selectedItem->pluginName().toUtf8();
00197
00198 }
00199
00200 data->setData(format, appletNames);
00201 return data;
00202 }
00203
00204 void PlasmaAppletItemModel::setFavorite(const QString &plugin, bool favorite)
00205 {
00206 if (favorite) {
00207 if (!m_favorites.contains(plugin)) {
00208 m_favorites.append(plugin);
00209 }
00210 } else {
00211 if (m_favorites.contains(plugin)) {
00212 m_favorites.removeAll(plugin);
00213 }
00214 }
00215 m_configGroup.writeEntry("favorites", m_favorites.join(","));
00216 m_configGroup.sync();
00217
00218 }
00219
00220 void PlasmaAppletItemModel::setApplication(const QString& app)
00221 {
00222 m_application = app;
00223 populateModel();
00224 }
00225
00226 QString& PlasmaAppletItemModel::Application()
00227 {
00228 return m_application;
00229 }
00230
00231 #include <plasmaappletitemmodel_p.moc>
00232