/* BEGIN_COMMON_COPYRIGHT_HEADER * (c)LGPL2+ * * LXQt - a lightweight, Qt based, desktop toolset * http://razor-qt.org, http://lxde.org/ * * Copyright (C) 2012 Alec Moskvin * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 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 * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * END_COMMON_COPYRIGHT_HEADER */ #include #include #include #include #include "modulemodel.h" #include "autostartutils.h" ModuleModel::ModuleModel(QObject* parent) : QAbstractListModel(parent) { mInterface = new QDBusInterface("org.lxqt.session", "/LXQtSession", "", QDBusConnection::sessionBus(), this); connect(mInterface, SIGNAL(moduleStateChanged(QString,bool)), SLOT(updateModuleState(QString,bool))); } ModuleModel::~ModuleModel() { delete mInterface; } void ModuleModel::reset() { mKeyList.clear(); mStateMap.clear(); mItemMap = AutostartItem::createItemMap(); QMap::iterator iter; for (iter = mItemMap.begin(); iter != mItemMap.end(); ++iter) { if (AutostartUtils::isLXQtModule(iter.value().file())) mKeyList.append(iter.key()); } QDBusReply reply = mInterface->call("listModules"); const QStringList moduleList = reply.value().toStringList(); foreach (const QString& moduleName, moduleList) { if (mItemMap.contains(moduleName)) mStateMap[moduleName] = true; } } QVariant ModuleModel::data(const QModelIndex& index, int role) const { QString name = mKeyList.at(index.row()); if (index.column() == 0) { switch (role) { case Qt::DisplayRole: return mItemMap.value(name).file().name(); case Qt::CheckStateRole: return mItemMap.value(name).isEnabled() ? Qt::Checked : Qt::Unchecked; case Qt::ToolTipRole: return mItemMap.value(name).file().comment(); } } else if (index.column() == 1 && (role == Qt::DisplayRole || role == Qt::DecorationRole)) { if (role == Qt::DisplayRole && mStateMap[name] == true) return QString(tr("Running") + QLatin1Char(' ')); } return QVariant(); } bool ModuleModel::setData(const QModelIndex& index, const QVariant& value, int role) { if (role == Qt::CheckStateRole) { QString key = mKeyList.at(index.row()); mItemMap[key].setEnabled(value == Qt::Checked); emit dataChanged(index, index); return true; } return false; } Qt::ItemFlags ModuleModel::flags(const QModelIndex& index) const { Q_UNUSED(index); return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable; } QMap ModuleModel::items() { QMap allItems; foreach(const QString &s, mKeyList) allItems[s] = mItemMap.value(s); return allItems; } int ModuleModel::rowCount(const QModelIndex& parent) const { Q_UNUSED(parent); return mKeyList.size(); } void ModuleModel::writeChanges() { foreach (const QString& key, mKeyList) mItemMap[key].commit(); } void ModuleModel::updateModuleState(QString moduleName, bool state) { if (mItemMap.contains(moduleName)) { mStateMap[moduleName] = state; QModelIndex i = index(mKeyList.indexOf(moduleName), 1); emit dataChanged(i, i); } } void ModuleModel::toggleModule(const QModelIndex &index, bool status) { if (!index.isValid()) return; QList arg; arg.append(mKeyList.at(index.row())); mInterface->callWithArgumentList(QDBus::NoBlock, status ? "startModule" : "stopModule", arg); }