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.
191 lines
5.2 KiB
191 lines
5.2 KiB
/*************************************************************************** |
|
* Copyright (C) 2013-2014 by Eike Hein <hein@kde.org> * |
|
* * |
|
* This program is free software; you can redistribute it and/or modify * |
|
* it under the terms of the GNU General Public License as published by * |
|
* the Free Software Foundation; either version 2 of the License, or * |
|
* (at your option) any later version. * |
|
* * |
|
* This program 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 General Public License for more details. * |
|
* * |
|
* You should have received a copy of the GNU General Public License * |
|
* along with this program; if not, write to the * |
|
* Free Software Foundation, Inc., * |
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * |
|
***************************************************************************/ |
|
|
|
#include "recentappsmodel.h" |
|
#include "actionlist.h" |
|
|
|
#include <KLocalizedString> |
|
#include <KRun> |
|
#include <KService> |
|
|
|
RecentAppsModel::RecentAppsModel(QObject *parent) : AbstractModel(parent) |
|
{ |
|
} |
|
|
|
RecentAppsModel::~RecentAppsModel() |
|
{ |
|
} |
|
|
|
QVariant RecentAppsModel::data(const QModelIndex &index, int role) const |
|
{ |
|
if (!index.isValid() || index.row() >= m_recentApps.count()) { |
|
return QVariant(); |
|
} |
|
|
|
const QString storageId = m_recentApps.at(index.row()); |
|
KService::Ptr service = KService::serviceByStorageId(storageId); |
|
|
|
if (!service) { |
|
return QVariant(); |
|
} |
|
|
|
if (role == Qt::DisplayRole) { |
|
return service->name(); |
|
} else if (role == Qt::DecorationRole) { |
|
return service->icon().isEmpty() ? QLatin1String("unknown") : service->icon(); |
|
} else if (role == Kicker::FavoriteIdRole) { |
|
return QVariant("app:" + storageId); |
|
} else if (role == Kicker::HasActionListRole) { |
|
return true; |
|
} else if (role == Kicker::ActionListRole) { |
|
QVariantList actionList; |
|
|
|
const QVariantMap &forgetAction = Kicker::createActionItem(i18n("Forget Application"), "forget"); |
|
actionList.append(forgetAction); |
|
|
|
const QVariantMap &forgetAllAction = Kicker::createActionItem(i18n("Forget All Applications"), "forgetAll"); |
|
actionList.append(forgetAllAction); |
|
|
|
return actionList; |
|
} |
|
|
|
return QVariant(); |
|
} |
|
|
|
int RecentAppsModel::rowCount(const QModelIndex &parent) const |
|
{ |
|
return parent.isValid() ? 0 : m_recentApps.count(); |
|
} |
|
|
|
bool RecentAppsModel::trigger(int row, const QString &actionId, const QVariant &argument) |
|
{ |
|
Q_UNUSED(argument) |
|
|
|
if (row < 0 || row >= m_recentApps.count()) { |
|
return false; |
|
} |
|
|
|
const QString storageId = m_recentApps.at(row); |
|
|
|
|
|
if (actionId.isEmpty()) { |
|
KService::Ptr service = KService::serviceByStorageId(storageId); |
|
|
|
if (!service) { |
|
return false; |
|
} |
|
|
|
bool ran = KRun::run(*service, QList<QUrl>(), 0); |
|
|
|
if (ran) { |
|
addApp(storageId); |
|
} |
|
|
|
return ran; |
|
} else if (actionId == "forget") { |
|
forgetApp(row); |
|
|
|
return false; |
|
} else if (actionId == "forgetAll") { |
|
forgetAllApps(); |
|
|
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
QStringList RecentAppsModel::recentApps() const |
|
{ |
|
return m_recentApps; |
|
} |
|
|
|
void RecentAppsModel::setRecentApps(const QStringList &recentApps) |
|
{ |
|
if (m_recentApps != recentApps) { |
|
bool emitCountChanged = (m_recentApps.count() != recentApps.count()); |
|
|
|
beginResetModel(); |
|
|
|
m_recentApps = recentApps; |
|
|
|
endResetModel(); |
|
|
|
if (emitCountChanged) { |
|
emit countChanged(); |
|
} |
|
|
|
emit recentAppsChanged(); |
|
} |
|
} |
|
|
|
void RecentAppsModel::addApp(const QString &storageId) |
|
{ |
|
if (storageId.isEmpty()) { |
|
return; |
|
} |
|
|
|
int index = m_recentApps.indexOf(storageId); |
|
|
|
if (index > 0) { |
|
beginMoveRows(QModelIndex(), index, index, QModelIndex(), 0); |
|
m_recentApps.move(index, 0); |
|
endMoveRows(); |
|
} else if (index == -1) { |
|
if (m_recentApps.count() < 15) { |
|
beginInsertRows(QModelIndex(), 0, 0); |
|
m_recentApps.prepend(storageId); |
|
endInsertRows(); |
|
emit countChanged(); |
|
} else { |
|
beginResetModel(); |
|
m_recentApps.prepend(storageId); |
|
m_recentApps.removeLast(); |
|
endResetModel(); |
|
} |
|
} |
|
|
|
emit recentAppsChanged(); |
|
} |
|
|
|
void RecentAppsModel::forgetApp(int row) |
|
{ |
|
if (row < 0 || row >= m_recentApps.count()) { |
|
return; |
|
} |
|
|
|
beginRemoveRows(QModelIndex(), row, row); |
|
m_recentApps.removeAt(row); |
|
endRemoveRows(); |
|
|
|
emit countChanged(); |
|
|
|
emit recentAppsChanged(); |
|
} |
|
|
|
void RecentAppsModel::forgetAllApps() |
|
{ |
|
beginResetModel(); |
|
m_recentApps.clear(); |
|
endResetModel(); |
|
|
|
emit countChanged(); |
|
|
|
emit recentAppsChanged(); |
|
}
|
|
|