┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/panels/places/placespanel.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2012-04-25 23:01:15 +0200
committerPeter Penz <[email protected]>2012-04-25 23:02:40 +0200
commit640696db728ad3163384e19f789ebc022d183da6 (patch)
tree15f546586488c39edbe307fab28cd5e3bc8f8215 /src/panels/places/placespanel.cpp
parent804021a8db9f41557a59ba15a6b4e4b62710d897 (diff)
Places panel: Internal cleanup
Move the bookmark handling into a custom model, so that the PlacesPanel only contains UI + controller code.
Diffstat (limited to 'src/panels/places/placespanel.cpp')
-rw-r--r--src/panels/places/placespanel.cpp309
1 files changed, 49 insertions, 260 deletions
diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp
index 09287169c..016a736de 100644
--- a/src/panels/places/placespanel.cpp
+++ b/src/panels/places/placespanel.cpp
@@ -1,7 +1,7 @@
/***************************************************************************
* Copyright (C) 2008-2012 by Peter Penz <[email protected]> *
* *
- * Based on KFilePlacesModel from kdelibs: *
+ * Based on KFilePlacesView from kdelibs: *
* Copyright (C) 2007 Kevin Ottens <[email protected]> *
* Copyright (C) 2007 David Faure <[email protected]> *
* *
@@ -23,45 +23,23 @@
#include "placespanel.h"
-#ifdef HAVE_NEPOMUK
- #include <Nepomuk/ResourceManager>
- #include <Nepomuk/Query/ComparisonTerm>
- #include <Nepomuk/Query/LiteralTerm>
- #include <Nepomuk/Query/Query>
- #include <Nepomuk/Query/ResourceTypeTerm>
- #include <Nepomuk/Vocabulary/NFO>
- #include <Nepomuk/Vocabulary/NIE>
-#endif
-
-#include <KBookmark>
-#include <KBookmarkGroup>
-#include <KBookmarkManager>
-#include <KComponentData>
-#include <KDebug>
+#include <KConfigGroup>
#include <KIcon>
#include <KLocale>
#include <kitemviews/kitemlistcontainer.h>
#include <kitemviews/kitemlistcontroller.h>
-#include <kitemviews/kstandarditem.h>
#include <kitemviews/kstandarditemlistview.h>
-#include <kitemviews/kstandarditemmodel.h>
-#include <KStandardDirs>
-#include <KUser>
+#include <KMenu>
#include "placesitemlistgroupheader.h"
+#include "placesitemmodel.h"
#include <views/draganddrophelper.h>
-#include <QDir>
#include <QVBoxLayout>
#include <QShowEvent>
PlacesPanel::PlacesPanel(QWidget* parent) :
Panel(parent),
- m_nepomukRunning(false),
m_controller(0),
- m_model(0),
- m_availableDevices(),
- m_bookmarkManager(0),
- m_defaultBookmarks(),
- m_defaultBookmarksIndexes()
+ m_model(0)
{
}
@@ -85,17 +63,9 @@ void PlacesPanel::showEvent(QShowEvent* event)
// Postpone the creating of the controller to the first show event.
// This assures that no performance and memory overhead is given when the folders panel is not
// used at all and stays invisible.
-#ifdef HAVE_NEPOMUK
- m_nepomukRunning = (Nepomuk::ResourceManager::instance()->initialized());
-#endif
- createDefaultBookmarks();
-
- const QString file = KStandardDirs::locateLocal("data", "kfileplaces/bookmarks.xml");
- m_bookmarkManager = KBookmarkManager::managerForFile(file, "kfilePlaces");
- m_model = new KStandardItemModel(this);
+ m_model = new PlacesItemModel(this);
m_model->setGroupedSorting(true);
m_model->setSortRole("group");
- loadBookmarks();
KStandardItemListView* view = new KStandardItemListView();
view->setGroupHeaderCreator(new KItemListGroupHeaderCreator<PlacesItemListGroupHeader>());
@@ -120,7 +90,7 @@ void PlacesPanel::showEvent(QShowEvent* event)
void PlacesPanel::slotItemActivated(int index)
{
- const KUrl url = urlForIndex(index);
+ const KUrl url = m_model->data(index).value("url").value<KUrl>();
if (!url.isEmpty()) {
emit placeActivated(url);
}
@@ -128,7 +98,7 @@ void PlacesPanel::slotItemActivated(int index)
void PlacesPanel::slotItemMiddleClicked(int index)
{
- const KUrl url = urlForIndex(index);
+ const KUrl url = m_model->data(index).value("url").value<KUrl>();
if (!url.isEmpty()) {
emit placeMiddleClicked(url);
}
@@ -136,247 +106,66 @@ void PlacesPanel::slotItemMiddleClicked(int index)
void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
{
- Q_UNUSED(index);
- Q_UNUSED(pos);
-}
-
-void PlacesPanel::slotViewContextMenuRequested(const QPointF& pos)
-{
- Q_UNUSED(pos);
-}
-
-void PlacesPanel::slotUrlsDropped(const KUrl& dest, QDropEvent* event, QWidget* parent)
-{
- Q_UNUSED(parent);
- DragAndDropHelper::dropUrls(KFileItem(), dest, event);
-}
-
-void PlacesPanel::createDefaultBookmarks()
-{
- Q_ASSERT(m_defaultBookmarks.isEmpty());
- Q_ASSERT(m_defaultBookmarksIndexes.isEmpty());
-
- const QString placesGroup = i18nc("@item", "Places");
- const QString recentlyAccessedGroup = i18nc("@item", "Recently Accessed");
- const QString searchForGroup = i18nc("@item", "Search For");
- const QString timeLineIcon = "package_utility_time"; // TODO: Ask the Oxygen team to create
- // a custom icon for the timeline-protocol
-
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl(KUser().homeDir()),
- "user-home",
- i18nc("@item", "Home"),
- placesGroup));
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("remote:/"),
- "network-workgroup",
- i18nc("@item", "Network"),
- placesGroup));
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("/"),
- "folder-red",
- i18nc("@item", "Root"),
- placesGroup));
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("trash:/"),
- "user-trash",
- i18nc("@item", "Trash"),
- placesGroup));
-
- if (m_nepomukRunning) {
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("timeline:/today"),
- timeLineIcon,
- i18nc("@item Recently Accessed", "Today"),
- recentlyAccessedGroup));
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("timeline:/yesterday"),
- timeLineIcon,
- i18nc("@item Recently Accessed", "Yesterday"),
- recentlyAccessedGroup));
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("timeline:/thismonth"),
- timeLineIcon,
- i18nc("@item Recently Accessed", "This Month"),
- recentlyAccessedGroup));
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("timeline:/lastmonth"),
- timeLineIcon,
- i18nc("@item Recently Accessed", "Last Month"),
- recentlyAccessedGroup));
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("search:/documents"),
- "folder-txt",
- i18nc("@item Commonly Accessed", "Documents"),
- searchForGroup));
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("search:/images"),
- "folder-image",
- i18nc("@item Commonly Accessed", "Images"),
- searchForGroup));
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("search:/audio"),
- "folder-sound",
- i18nc("@item Commonly Accessed", "Audio"),
- searchForGroup));
- m_defaultBookmarks.append(DefaultBookmarkData(KUrl("search:/videos"),
- "folder-video",
- i18nc("@item Commonly Accessed", "Videos"),
- searchForGroup));
- }
-
- for (int i = 0; i < m_defaultBookmarks.count(); ++i) {
- m_defaultBookmarksIndexes.insert(m_defaultBookmarks[i].url, i);
- }
-}
-
-void PlacesPanel::loadBookmarks()
-{
- KBookmarkGroup root = m_bookmarkManager->root();
- KBookmark bookmark = root.first();
- QSet<QString> devices = m_availableDevices;
-
- QSet<KUrl> missingDefaultBookmarks;
- foreach (const DefaultBookmarkData& data, m_defaultBookmarks) {
- missingDefaultBookmarks.insert(data.url);
- }
-
- while (!bookmark.isNull()) {
- const QString udi = bookmark.metaDataItem("UDI");
- const KUrl url = bookmark.url();
- const QString appName = bookmark.metaDataItem("OnlyInApp");
- const bool deviceAvailable = devices.remove(udi);
-
- const bool allowedHere = (appName.isEmpty() || appName == KGlobal::mainComponent().componentName())
- && (m_nepomukRunning || url.protocol() != QLatin1String("timeline"));
-
- if ((udi.isEmpty() && allowedHere) || deviceAvailable) {
- KStandardItem* item = new KStandardItem();
- item->setIcon(KIcon(bookmark.icon()));
- item->setDataValue("address", bookmark.address());
- item->setDataValue("url", url);
-
- if (missingDefaultBookmarks.contains(url)) {
- missingDefaultBookmarks.remove(url);
- // Always apply the translated text to the default bookmarks, otherwise an outdated
- // translation might be shown.
- const int index = m_defaultBookmarksIndexes.value(url);
- item->setText(m_defaultBookmarks[index].text);
- } else {
- item->setText(bookmark.text());
- }
-
- if (deviceAvailable) {
- item->setDataValue("udi", udi);
- item->setGroup(i18nc("@item", "Devices"));
- } else {
- item->setGroup(i18nc("@item", "Places"));
- }
-
- m_model->appendItem(item);
- }
-
- bookmark = root.next(bookmark);
- }
-
- if (!missingDefaultBookmarks.isEmpty()) {
- foreach (const DefaultBookmarkData& data, m_defaultBookmarks) {
- if (missingDefaultBookmarks.contains(data.url)) {
- KStandardItem* item = new KStandardItem();
- item->setIcon(KIcon(data.icon));
- item->setText(data.text);
- item->setDataValue("url", data.url);
- item->setGroup(data.group);
- m_model->appendItem(item);
- }
- }
- }
-}
-
-KUrl PlacesPanel::urlForIndex(int index) const
-{
- const KStandardItem* item = m_model->item(index);
- if (!item) {
- return KUrl();
- }
+ const QHash<QByteArray, QVariant> data = m_model->data(index);
+ const QString label = data.value("text").toString();
- KUrl url = item->dataValue("url").value<KUrl>();
- if (url.protocol() == QLatin1String("timeline")) {
- url = createTimelineUrl(url);
- } else if (url.protocol() == QLatin1String("search")) {
- url = createSearchUrl(url);
- }
-
- return url;
-}
+ KMenu menu(this);
-KUrl PlacesPanel::createTimelineUrl(const KUrl& url)
-{
- // TODO: Clarify with the Nepomuk-team whether it makes sense
- // provide default-timeline-URLs like 'yesterday', 'this month'
- // and 'last month'.
- KUrl timelineUrl;
+ QAction* emptyTrash = 0;
+ QAction* addEntry = 0;
+ QAction* mainSeparator = 0;
+ QAction* editEntry = 0;
+ QAction* hideEntry = 0;
- const QString path = url.pathOrUrl();
- if (path.endsWith("yesterday")) {
- const QDate date = QDate::currentDate().addDays(-1);
- const int year = date.year();
- const int month = date.month();
- const int day = date.day();
- timelineUrl = "timeline:/" + timelineDateString(year, month) +
- '/' + timelineDateString(year, month, day);
- } else if (path.endsWith("thismonth")) {
- const QDate date = QDate::currentDate();
- timelineUrl = "timeline:/" + timelineDateString(date.year(), date.month());
- } else if (path.endsWith("lastmonth")) {
- const QDate date = QDate::currentDate().addMonths(-1);
- timelineUrl = "timeline:/" + timelineDateString(date.year(), date.month());
+ const bool isDevice = !data.value("udi").toString().isEmpty();
+ if (isDevice) {
} else {
- Q_ASSERT(path.endsWith("today"));
- timelineUrl= url;
+ if (data.value("url").value<KUrl>() == KUrl("trash:/")) {
+ emptyTrash = menu.addAction(KIcon("trash-empty"), i18nc("@action:inmenu", "Empty Trash"));
+ KConfig trashConfig("trashrc", KConfig::SimpleConfig);
+ emptyTrash->setEnabled(!trashConfig.group("Status").readEntry("Empty", true));
+ menu.addSeparator();
+ }
+ addEntry = menu.addAction(KIcon("document-new"), i18nc("@item:inmenu", "Add Entry..."));
+ mainSeparator = menu.addSeparator();
+ editEntry = menu.addAction(KIcon("document-properties"), i18n("&Edit Entry '%1'...", label));
}
- return timelineUrl;
-}
-
-QString PlacesPanel::timelineDateString(int year, int month, int day)
-{
- QString date = QString::number(year) + '-';
- if (month < 10) {
- date += '0';
+ if (!addEntry) {
+ addEntry = menu.addAction(KIcon("document-new"), i18nc("@item:inmenu", "Add Entry..."));
}
- date += QString::number(month);
- if (day >= 1) {
- date += '-';
- if (day < 10) {
- date += '0';
- }
- date += QString::number(day);
+ menu.addSeparator();
+ foreach (QAction* action, customContextMenuActions()) {
+ menu.addAction(action);
}
- return date;
+ QAction* action = menu.exec(pos.toPoint());
+ hideEntry = menu.addAction(i18n("&Hide Entry '%1'", label));
+ hideEntry->setCheckable(true);
+ //hideEntry->setChecked(data.value("hidden").toBool());
+ Q_UNUSED(action);
}
-KUrl PlacesPanel::createSearchUrl(const KUrl& url)
+void PlacesPanel::slotViewContextMenuRequested(const QPointF& pos)
{
- KUrl searchUrl;
+ KMenu menu(this);
-#ifdef HAVE_NEPOMUK
- const QString path = url.pathOrUrl();
- if (path.endsWith("documents")) {
- searchUrl = searchUrlForTerm(Nepomuk::Query::ResourceTypeTerm(Nepomuk::Vocabulary::NFO::Document()));
- } else if (path.endsWith("images")) {
- searchUrl = searchUrlForTerm(Nepomuk::Query::ResourceTypeTerm(Nepomuk::Vocabulary::NFO::Image()));
- } else if (path.endsWith("audio")) {
- searchUrl = searchUrlForTerm(Nepomuk::Query::ComparisonTerm(Nepomuk::Vocabulary::NIE::mimeType(),
- Nepomuk::Query::LiteralTerm("audio")));
- } else if (path.endsWith("videos")) {
- searchUrl = searchUrlForTerm(Nepomuk::Query::ComparisonTerm(Nepomuk::Vocabulary::NIE::mimeType(),
- Nepomuk::Query::LiteralTerm("video")));
- } else {
- Q_ASSERT(false);
+ QAction* addEntry = menu.addAction(KIcon("document-new"), i18nc("@item:inmenu", "Add Entry..."));
+ menu.addSeparator();
+ foreach (QAction* action, customContextMenuActions()) {
+ menu.addAction(action);
}
-#endif
- return searchUrl;
+ QAction* action = menu.exec(pos.toPoint());
+ Q_UNUSED(action);
+ Q_UNUSED(addEntry);
}
-#ifdef HAVE_NEPOMUK
-KUrl PlacesPanel::searchUrlForTerm(const Nepomuk::Query::Term& term)
+void PlacesPanel::slotUrlsDropped(const KUrl& dest, QDropEvent* event, QWidget* parent)
{
- const Nepomuk::Query::Query query(term);
- return query.toSearchUrl();
+ Q_UNUSED(parent);
+ DragAndDropHelper::dropUrls(KFileItem(), dest, event);
}
-#endif
#include "placespanel.moc"