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