diff options
| author | Peter Penz <[email protected]> | 2012-04-25 23:01:15 +0200 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2012-04-25 23:02:40 +0200 |
| commit | 640696db728ad3163384e19f789ebc022d183da6 (patch) | |
| tree | 15f546586488c39edbe307fab28cd5e3bc8f8215 /src/panels/places/placespanel.cpp | |
| parent | 804021a8db9f41557a59ba15a6b4e4b62710d897 (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.cpp | 309 |
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" |
