mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-19 08:21:22 +00:00
Places Panel: Prepare code to save state of bookmarks
The saving is still disabled currently until 100 % backward compatibility with KFilePlacesView has been reached.
This commit is contained in:
parent
6039c246ea
commit
1426b8d3c7
|
@ -142,3 +142,20 @@ QList<KStandardItem*> KStandardItem::children() const
|
||||||
{
|
{
|
||||||
return m_children;
|
return m_children;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KStandardItem::onDataValueChanged(const QByteArray& role,
|
||||||
|
const QVariant& current,
|
||||||
|
const QVariant& previous)
|
||||||
|
{
|
||||||
|
Q_UNUSED(role);
|
||||||
|
Q_UNUSED(current);
|
||||||
|
Q_UNUSED(previous);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KStandardItem::onDataChanged(const QHash<QByteArray, QVariant>& current,
|
||||||
|
const QHash<QByteArray, QVariant>& previous)
|
||||||
|
{
|
||||||
|
Q_UNUSED(current);
|
||||||
|
Q_UNUSED(previous);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,14 @@ public:
|
||||||
|
|
||||||
QList<KStandardItem*> children() const;
|
QList<KStandardItem*> children() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void onDataValueChanged(const QByteArray& role,
|
||||||
|
const QVariant& current,
|
||||||
|
const QVariant& previous);
|
||||||
|
|
||||||
|
virtual void onDataChanged(const QHash<QByteArray, QVariant>& current,
|
||||||
|
const QHash<QByteArray, QVariant>& previous);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
KStandardItem* m_parent;
|
KStandardItem* m_parent;
|
||||||
QList<KStandardItem*> m_children;
|
QList<KStandardItem*> m_children;
|
||||||
|
|
|
@ -22,53 +22,24 @@
|
||||||
|
|
||||||
#include "placesitem.h"
|
#include "placesitem.h"
|
||||||
|
|
||||||
#include <KBookmark>
|
#include <KBookmarkManager>
|
||||||
|
#include <KDebug>
|
||||||
#include <KIcon>
|
#include <KIcon>
|
||||||
#include <KLocale>
|
#include <KLocale>
|
||||||
#include "placesitemstorageaccesslistener.h"
|
#include "placesitemstorageaccesslistener.h"
|
||||||
|
#include <QDateTime>
|
||||||
#include <Solid/Block>
|
#include <Solid/Block>
|
||||||
|
|
||||||
PlacesItem::PlacesItem(PlacesItem* parent) :
|
|
||||||
KStandardItem(parent),
|
|
||||||
m_device(),
|
|
||||||
m_access(),
|
|
||||||
m_volume(),
|
|
||||||
m_disc(),
|
|
||||||
m_accessListener(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
PlacesItem::PlacesItem(const KBookmark& bookmark, PlacesItem* parent) :
|
PlacesItem::PlacesItem(const KBookmark& bookmark, PlacesItem* parent) :
|
||||||
KStandardItem(parent),
|
KStandardItem(parent),
|
||||||
m_device(),
|
m_device(),
|
||||||
m_access(),
|
m_access(),
|
||||||
m_volume(),
|
m_volume(),
|
||||||
m_disc(),
|
m_disc(),
|
||||||
m_accessListener(0)
|
m_accessListener(0),
|
||||||
|
m_bookmark()
|
||||||
{
|
{
|
||||||
setHidden(bookmark.metaDataItem("IsHidden") == QLatin1String("true"));
|
setBookmark(bookmark);
|
||||||
|
|
||||||
const QString udi = bookmark.metaDataItem("UDI");
|
|
||||||
if (udi.isEmpty()) {
|
|
||||||
setIcon(bookmark.icon());
|
|
||||||
setText(bookmark.text());
|
|
||||||
setUrl(bookmark.url());
|
|
||||||
setDataValue("address", bookmark.address());
|
|
||||||
setGroup(i18nc("@item", "Places"));
|
|
||||||
} else {
|
|
||||||
initializeDevice(udi);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PlacesItem::PlacesItem(const QString& udi, PlacesItem* parent) :
|
|
||||||
KStandardItem(parent),
|
|
||||||
m_device(),
|
|
||||||
m_access(),
|
|
||||||
m_volume(),
|
|
||||||
m_disc(),
|
|
||||||
m_accessListener(0)
|
|
||||||
{
|
|
||||||
initializeDevice(udi);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PlacesItem::PlacesItem(const PlacesItem& item) :
|
PlacesItem::PlacesItem(const PlacesItem& item) :
|
||||||
|
@ -77,14 +48,14 @@ PlacesItem::PlacesItem(const PlacesItem& item) :
|
||||||
m_access(),
|
m_access(),
|
||||||
m_volume(),
|
m_volume(),
|
||||||
m_disc(),
|
m_disc(),
|
||||||
m_accessListener(0)
|
m_accessListener(0),
|
||||||
|
m_bookmark()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
PlacesItem::~PlacesItem()
|
PlacesItem::~PlacesItem()
|
||||||
{
|
{
|
||||||
delete m_accessListener;
|
delete m_accessListener;
|
||||||
m_accessListener = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlacesItem::setUrl(const KUrl& url)
|
void PlacesItem::setUrl(const KUrl& url)
|
||||||
|
@ -110,6 +81,9 @@ QString PlacesItem::udi() const
|
||||||
void PlacesItem::setHidden(bool hidden)
|
void PlacesItem::setHidden(bool hidden)
|
||||||
{
|
{
|
||||||
setDataValue("isHidden", hidden);
|
setDataValue("isHidden", hidden);
|
||||||
|
if (!m_bookmark.isNull()) {
|
||||||
|
m_bookmark.setMetaDataItem("IsHidden", hidden ? "true" : "false");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PlacesItem::isHidden() const
|
bool PlacesItem::isHidden() const
|
||||||
|
@ -117,11 +91,109 @@ bool PlacesItem::isHidden() const
|
||||||
return dataValue("isHidden").toBool();
|
return dataValue("isHidden").toBool();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PlacesItem::setSystemItem(bool isSystemItem)
|
||||||
|
{
|
||||||
|
setDataValue("isSystemItem", isSystemItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PlacesItem::isSystemItem() const
|
||||||
|
{
|
||||||
|
return dataValue("isSystemItem").toBool();
|
||||||
|
}
|
||||||
|
|
||||||
Solid::Device PlacesItem::device() const
|
Solid::Device PlacesItem::device() const
|
||||||
{
|
{
|
||||||
return m_device;
|
return m_device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PlacesItem::setBookmark(const KBookmark& bookmark)
|
||||||
|
{
|
||||||
|
m_bookmark = bookmark;
|
||||||
|
|
||||||
|
delete m_access;
|
||||||
|
delete m_volume;
|
||||||
|
delete m_disc;
|
||||||
|
delete m_accessListener;
|
||||||
|
|
||||||
|
const QString udi = bookmark.metaDataItem("UDI");
|
||||||
|
if (udi.isEmpty()) {
|
||||||
|
setIcon(bookmark.icon());
|
||||||
|
setText(bookmark.text());
|
||||||
|
setUrl(bookmark.url());
|
||||||
|
setDataValue("address", bookmark.address());
|
||||||
|
setGroup(i18nc("@item", "Places"));
|
||||||
|
} else {
|
||||||
|
initializeDevice(udi);
|
||||||
|
}
|
||||||
|
setHidden(bookmark.metaDataItem("IsHidden") == QLatin1String("true"));
|
||||||
|
}
|
||||||
|
|
||||||
|
KBookmark PlacesItem::bookmark() const
|
||||||
|
{
|
||||||
|
return m_bookmark;
|
||||||
|
}
|
||||||
|
|
||||||
|
KBookmark PlacesItem::createBookmark(KBookmarkManager* manager,
|
||||||
|
const QString& text,
|
||||||
|
const KUrl& url,
|
||||||
|
const QString& iconName,
|
||||||
|
PlacesItem* after)
|
||||||
|
{
|
||||||
|
KBookmarkGroup root = manager->root();
|
||||||
|
if (root.isNull()) {
|
||||||
|
return KBookmark();
|
||||||
|
}
|
||||||
|
|
||||||
|
KBookmark bookmark = root.addBookmark(text, url, iconName);
|
||||||
|
bookmark.setMetaDataItem("ID", generateNewId());
|
||||||
|
|
||||||
|
if (after) {
|
||||||
|
root.moveBookmark(bookmark, after->bookmark());
|
||||||
|
}
|
||||||
|
|
||||||
|
return bookmark;
|
||||||
|
}
|
||||||
|
|
||||||
|
KBookmark PlacesItem::createDeviceBookmark(KBookmarkManager* manager,
|
||||||
|
const QString& udi)
|
||||||
|
{
|
||||||
|
KBookmarkGroup root = manager->root();
|
||||||
|
if (root.isNull()) {
|
||||||
|
return KBookmark();
|
||||||
|
}
|
||||||
|
|
||||||
|
KBookmark bookmark = root.createNewSeparator();
|
||||||
|
bookmark.setMetaDataItem("UDI", udi);
|
||||||
|
bookmark.setMetaDataItem("isSystemItem", "true");
|
||||||
|
return bookmark;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlacesItem::onDataValueChanged(const QByteArray& role,
|
||||||
|
const QVariant& current,
|
||||||
|
const QVariant& previous)
|
||||||
|
{
|
||||||
|
Q_UNUSED(current);
|
||||||
|
Q_UNUSED(previous);
|
||||||
|
|
||||||
|
if (!m_bookmark.isNull()) {
|
||||||
|
updateBookmarkForRole(role);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlacesItem::onDataChanged(const QHash<QByteArray, QVariant>& current,
|
||||||
|
const QHash<QByteArray, QVariant>& previous)
|
||||||
|
{
|
||||||
|
Q_UNUSED(previous);
|
||||||
|
|
||||||
|
if (!m_bookmark.isNull()) {
|
||||||
|
QHashIterator<QByteArray, QVariant> it(current);
|
||||||
|
while (it.hasNext()) {
|
||||||
|
it.next();
|
||||||
|
updateBookmarkForRole(it.key());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PlacesItem::initializeDevice(const QString& udi)
|
void PlacesItem::initializeDevice(const QString& udi)
|
||||||
{
|
{
|
||||||
m_device = Solid::Device(udi);
|
m_device = Solid::Device(udi);
|
||||||
|
@ -141,11 +213,11 @@ void PlacesItem::initializeDevice(const QString& udi)
|
||||||
|
|
||||||
if (m_access) {
|
if (m_access) {
|
||||||
setUrl(m_access->filePath());
|
setUrl(m_access->filePath());
|
||||||
|
if (!m_accessListener) {
|
||||||
// The access listener takes care to call PlacesItem::onAccessibilityChanged()
|
// The access listener takes care to call PlacesItem::onAccessibilityChanged()
|
||||||
// in case if the accessibility of m_access has been changed.
|
// in case if the accessibility of m_access has been changed.
|
||||||
Q_ASSERT(!m_accessListener);
|
m_accessListener = new PlacesItemStorageAccessListener(this);
|
||||||
m_accessListener = new PlacesItemStorageAccessListener(this);
|
}
|
||||||
} else if (m_disc && (m_disc->availableContent() & Solid::OpticalDisc::Audio) != 0) {
|
} else if (m_disc && (m_disc->availableContent() & Solid::OpticalDisc::Audio) != 0) {
|
||||||
const QString device = m_device.as<Solid::Block>()->device();
|
const QString device = m_device.as<Solid::Block>()->device();
|
||||||
setUrl(QString("audiocd:/?device=%1").arg(device));
|
setUrl(QString("audiocd:/?device=%1").arg(device));
|
||||||
|
@ -157,3 +229,26 @@ void PlacesItem::onAccessibilityChanged()
|
||||||
setIconOverlays(m_device.emblems());
|
setIconOverlays(m_device.emblems());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PlacesItem::updateBookmarkForRole(const QByteArray& role)
|
||||||
|
{
|
||||||
|
Q_ASSERT(!m_bookmark.isNull());
|
||||||
|
if (role == "iconName") {
|
||||||
|
m_bookmark.setIcon(icon());
|
||||||
|
} else if (role == "text") {
|
||||||
|
m_bookmark.setDescription(text());
|
||||||
|
} else if (role == "url") {
|
||||||
|
m_bookmark.setUrl(url());
|
||||||
|
} else if (role == "udi)") {
|
||||||
|
m_bookmark.setMetaDataItem("UDI", udi());
|
||||||
|
} else if (role == "isSystemItem") {
|
||||||
|
m_bookmark.setMetaDataItem("isSystemItem", isSystemItem() ? "true" : "false");
|
||||||
|
} else if (role == "isHidden") {
|
||||||
|
m_bookmark.setMetaDataItem("IsHidden", isHidden() ? "true" : "false");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString PlacesItem::generateNewId()
|
||||||
|
{
|
||||||
|
static int count = 0;
|
||||||
|
return QString::number(QDateTime::currentDateTime().toTime_t()) + '/' + QString::number(count++);
|
||||||
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#ifndef PLACESITEM_H
|
#ifndef PLACESITEM_H
|
||||||
#define PLACESITEM_H
|
#define PLACESITEM_H
|
||||||
|
|
||||||
|
#include <KBookmark>
|
||||||
#include <kitemviews/kstandarditem.h>
|
#include <kitemviews/kstandarditem.h>
|
||||||
#include <KUrl>
|
#include <KUrl>
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
|
@ -28,7 +29,6 @@
|
||||||
#include <Solid/StorageAccess>
|
#include <Solid/StorageAccess>
|
||||||
#include <Solid/StorageVolume>
|
#include <Solid/StorageVolume>
|
||||||
|
|
||||||
class KBookmark;
|
|
||||||
class PlacesItemStorageAccessListener;
|
class PlacesItemStorageAccessListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -38,10 +38,8 @@ class PlacesItem : public KStandardItem
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit PlacesItem(PlacesItem* parent = 0);
|
|
||||||
explicit PlacesItem(const KBookmark& bookmark, PlacesItem* parent = 0);
|
explicit PlacesItem(const KBookmark& bookmark, PlacesItem* parent = 0);
|
||||||
explicit PlacesItem(const QString& udi, PlacesItem* parent = 0);
|
explicit PlacesItem(const PlacesItem& item);
|
||||||
PlacesItem(const PlacesItem& item);
|
|
||||||
virtual ~PlacesItem();
|
virtual ~PlacesItem();
|
||||||
|
|
||||||
void setUrl(const KUrl& url);
|
void setUrl(const KUrl& url);
|
||||||
|
@ -53,8 +51,30 @@ public:
|
||||||
void setHidden(bool hidden);
|
void setHidden(bool hidden);
|
||||||
bool isHidden() const;
|
bool isHidden() const;
|
||||||
|
|
||||||
|
void setSystemItem(bool isSystemItem);
|
||||||
|
bool isSystemItem() const;
|
||||||
|
|
||||||
Solid::Device device() const;
|
Solid::Device device() const;
|
||||||
|
|
||||||
|
void setBookmark(const KBookmark& bookmark);
|
||||||
|
KBookmark bookmark() const;
|
||||||
|
|
||||||
|
static KBookmark createBookmark(KBookmarkManager* manager,
|
||||||
|
const QString& text,
|
||||||
|
const KUrl& url,
|
||||||
|
const QString& iconName,
|
||||||
|
PlacesItem* after = 0);
|
||||||
|
static KBookmark createDeviceBookmark(KBookmarkManager* manager,
|
||||||
|
const QString& udi);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void onDataValueChanged(const QByteArray& role,
|
||||||
|
const QVariant& current,
|
||||||
|
const QVariant& previous);
|
||||||
|
|
||||||
|
virtual void onDataChanged(const QHash<QByteArray, QVariant>& current,
|
||||||
|
const QHash<QByteArray, QVariant>& previous);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initializeDevice(const QString& udi);
|
void initializeDevice(const QString& udi);
|
||||||
|
|
||||||
|
@ -64,12 +84,20 @@ private:
|
||||||
*/
|
*/
|
||||||
void onAccessibilityChanged();
|
void onAccessibilityChanged();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies the data-value from the role to m_bookmark.
|
||||||
|
*/
|
||||||
|
void updateBookmarkForRole(const QByteArray& role);
|
||||||
|
|
||||||
|
static QString generateNewId();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Solid::Device m_device;
|
Solid::Device m_device;
|
||||||
QPointer<Solid::StorageAccess> m_access;
|
QPointer<Solid::StorageAccess> m_access;
|
||||||
QPointer<Solid::StorageVolume> m_volume;
|
QPointer<Solid::StorageVolume> m_volume;
|
||||||
QPointer<Solid::OpticalDisc> m_disc;
|
QPointer<Solid::OpticalDisc> m_disc;
|
||||||
PlacesItemStorageAccessListener* m_accessListener;
|
QPointer<PlacesItemStorageAccessListener> m_accessListener;
|
||||||
|
KBookmark m_bookmark;
|
||||||
|
|
||||||
friend class PlacesItemStorageAccessListener; // Calls onAccessibilityChanged()
|
friend class PlacesItemStorageAccessListener; // Calls onAccessibilityChanged()
|
||||||
};
|
};
|
||||||
|
|
|
@ -23,16 +23,6 @@
|
||||||
|
|
||||||
#include "placesitemmodel.h"
|
#include "placesitemmodel.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 <KBookmark>
|
||||||
#include <KBookmarkGroup>
|
#include <KBookmarkGroup>
|
||||||
#include <KBookmarkManager>
|
#include <KBookmarkManager>
|
||||||
|
@ -53,6 +43,10 @@
|
||||||
#include <Solid/StorageAccess>
|
#include <Solid/StorageAccess>
|
||||||
#include <Solid/StorageDrive>
|
#include <Solid/StorageDrive>
|
||||||
|
|
||||||
|
#ifdef HAVE_NEPOMUK
|
||||||
|
#include <Nepomuk/ResourceManager>
|
||||||
|
#endif
|
||||||
|
|
||||||
PlacesItemModel::PlacesItemModel(QObject* parent) :
|
PlacesItemModel::PlacesItemModel(QObject* parent) :
|
||||||
KStandardItemModel(parent),
|
KStandardItemModel(parent),
|
||||||
m_nepomukRunning(false),
|
m_nepomukRunning(false),
|
||||||
|
@ -172,15 +166,6 @@ bool PlacesItemModel::hiddenItemsShown() const
|
||||||
return m_hiddenItemsShown;
|
return m_hiddenItemsShown;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PlacesItemModel::isSystemItem(int index) const
|
|
||||||
{
|
|
||||||
if (index >= 0 && index < count()) {
|
|
||||||
const KUrl url = placesItem(index)->url();
|
|
||||||
return m_systemBookmarksIndexes.contains(url);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int PlacesItemModel::closestItem(const KUrl& url) const
|
int PlacesItemModel::closestItem(const KUrl& url) const
|
||||||
{
|
{
|
||||||
int foundIndex = -1;
|
int foundIndex = -1;
|
||||||
|
@ -303,8 +288,23 @@ void PlacesItemModel::requestTeardown(int index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PlacesItemModel::save()
|
||||||
|
{
|
||||||
|
// TODO: Temporary deactivated until 100 % backward compatibility is provided
|
||||||
|
// m_bookmarkManager->emitChanged(m_bookmarkManager->root());
|
||||||
|
}
|
||||||
|
|
||||||
void PlacesItemModel::onItemInserted(int index)
|
void PlacesItemModel::onItemInserted(int index)
|
||||||
{
|
{
|
||||||
|
if (index == count() - 1) {
|
||||||
|
// The item has been appended as last item to the list. In this
|
||||||
|
// case assure that it is also appended after the hidden items and
|
||||||
|
// not before (like done otherwise).
|
||||||
|
m_hiddenItems.append(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int modelIndex = 0;
|
int modelIndex = 0;
|
||||||
int hiddenIndex = 0;
|
int hiddenIndex = 0;
|
||||||
while (hiddenIndex < m_hiddenItems.count()) {
|
while (hiddenIndex < m_hiddenItems.count()) {
|
||||||
|
@ -336,20 +336,34 @@ void PlacesItemModel::onItemRemoved(int index)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PlacesItemModel::onItemReplaced(int index)
|
||||||
|
{
|
||||||
|
Q_UNUSED(index);
|
||||||
|
}
|
||||||
|
|
||||||
void PlacesItemModel::slotDeviceAdded(const QString& udi)
|
void PlacesItemModel::slotDeviceAdded(const QString& udi)
|
||||||
{
|
{
|
||||||
appendItem(new PlacesItem(udi));
|
const Solid::Device device(udi);
|
||||||
|
if (m_predicate.matches(device)) {
|
||||||
|
m_availableDevices << udi;
|
||||||
|
const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi);
|
||||||
|
appendItem(new PlacesItem(bookmark));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlacesItemModel::slotDeviceRemoved(const QString& udi)
|
void PlacesItemModel::slotDeviceRemoved(const QString& udi)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < m_hiddenItems.count(); ++i) {
|
if (!m_availableDevices.contains(udi)) {
|
||||||
PlacesItem* item = m_hiddenItems[i];
|
return;
|
||||||
if (item && item->udi() == udi) {
|
}
|
||||||
m_hiddenItems.removeAt(i);
|
|
||||||
delete item;
|
for (int i = 0; i < m_hiddenItems.count(); ++i) {
|
||||||
return;
|
PlacesItem* item = m_hiddenItems[i];
|
||||||
}
|
if (item && item->udi() == udi) {
|
||||||
|
m_hiddenItems.removeAt(i);
|
||||||
|
delete item;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < count(); ++i) {
|
for (int i = 0; i < count(); ++i) {
|
||||||
|
@ -380,7 +394,7 @@ void PlacesItemModel::loadBookmarks()
|
||||||
|
|
||||||
// The bookmarks might have a mixed order of "places" and "devices". In
|
// The bookmarks might have a mixed order of "places" and "devices". In
|
||||||
// Dolphin's places panel the devices should always be appended as last
|
// Dolphin's places panel the devices should always be appended as last
|
||||||
// group.
|
// group, so they are collected as separate lists.
|
||||||
QList<PlacesItem*> placesItems;
|
QList<PlacesItem*> placesItems;
|
||||||
QList<PlacesItem*> devicesItems;
|
QList<PlacesItem*> devicesItems;
|
||||||
|
|
||||||
|
@ -391,7 +405,8 @@ void PlacesItemModel::loadBookmarks()
|
||||||
const bool deviceAvailable = devices.remove(udi);
|
const bool deviceAvailable = devices.remove(udi);
|
||||||
|
|
||||||
const bool allowedHere = (appName.isEmpty() || appName == KGlobal::mainComponent().componentName())
|
const bool allowedHere = (appName.isEmpty() || appName == KGlobal::mainComponent().componentName())
|
||||||
&& (m_nepomukRunning || url.protocol() != QLatin1String("timeline"));
|
&& (m_nepomukRunning || (url.protocol() != QLatin1String("timeline") &&
|
||||||
|
url.protocol() != QLatin1String("search")));
|
||||||
|
|
||||||
if ((udi.isEmpty() && allowedHere) || deviceAvailable) {
|
if ((udi.isEmpty() && allowedHere) || deviceAvailable) {
|
||||||
PlacesItem* item = new PlacesItem(bookmark);
|
PlacesItem* item = new PlacesItem(bookmark);
|
||||||
|
@ -407,10 +422,8 @@ void PlacesItemModel::loadBookmarks()
|
||||||
// translation might be shown.
|
// translation might be shown.
|
||||||
const int index = m_systemBookmarksIndexes.value(url);
|
const int index = m_systemBookmarksIndexes.value(url);
|
||||||
item->setText(m_systemBookmarks[index].text);
|
item->setText(m_systemBookmarks[index].text);
|
||||||
|
item->setSystemItem(true);
|
||||||
// The system bookmarks don't contain "real" queries stored as URLs, so
|
item->setGroup(m_systemBookmarks[index].group);
|
||||||
// they must be translated first.
|
|
||||||
item->setUrl(translatedSystemBookmarkUrl(url));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -421,12 +434,24 @@ void PlacesItemModel::loadBookmarks()
|
||||||
addItems(placesItems);
|
addItems(placesItems);
|
||||||
|
|
||||||
if (!missingSystemBookmarks.isEmpty()) {
|
if (!missingSystemBookmarks.isEmpty()) {
|
||||||
|
// The current bookmarks don't contain all system-bookmarks. Add the missing
|
||||||
|
// bookmarks.
|
||||||
foreach (const SystemBookmarkData& data, m_systemBookmarks) {
|
foreach (const SystemBookmarkData& data, m_systemBookmarks) {
|
||||||
if (missingSystemBookmarks.contains(data.url)) {
|
if (missingSystemBookmarks.contains(data.url)) {
|
||||||
PlacesItem* item = new PlacesItem();
|
KBookmark bookmark = PlacesItem::createBookmark(m_bookmarkManager,
|
||||||
item->setIcon(data.icon);
|
data.text,
|
||||||
item->setText(data.text);
|
data.url,
|
||||||
item->setUrl(translatedSystemBookmarkUrl(data.url));
|
data.icon);
|
||||||
|
|
||||||
|
const QString protocol = data.url.protocol();
|
||||||
|
if (protocol == QLatin1String("timeline") || protocol == QLatin1String("search")) {
|
||||||
|
// As long as the KFilePlacesView from kdelibs is available, the system-bookmarks
|
||||||
|
// for timeline and search should be a Dolphin-specific setting.
|
||||||
|
bookmark.setMetaDataItem("OnlyInApp", KGlobal::mainComponent().componentName());
|
||||||
|
}
|
||||||
|
|
||||||
|
PlacesItem* item = new PlacesItem(bookmark);
|
||||||
|
item->setSystemItem(true);
|
||||||
item->setGroup(data.group);
|
item->setGroup(data.group);
|
||||||
appendItem(item);
|
appendItem(item);
|
||||||
}
|
}
|
||||||
|
@ -435,8 +460,8 @@ void PlacesItemModel::loadBookmarks()
|
||||||
|
|
||||||
// Create items for devices that have not stored as bookmark yet
|
// Create items for devices that have not stored as bookmark yet
|
||||||
foreach (const QString& udi, devices) {
|
foreach (const QString& udi, devices) {
|
||||||
PlacesItem* item = new PlacesItem(udi);
|
const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi);
|
||||||
devicesItems.append(item);
|
devicesItems.append(new PlacesItem(bookmark));
|
||||||
}
|
}
|
||||||
|
|
||||||
addItems(devicesItems);
|
addItems(devicesItems);
|
||||||
|
@ -450,7 +475,7 @@ void PlacesItemModel::loadBookmarks()
|
||||||
void PlacesItemModel::addItems(const QList<PlacesItem*>& items)
|
void PlacesItemModel::addItems(const QList<PlacesItem*>& items)
|
||||||
{
|
{
|
||||||
foreach (PlacesItem* item, items) {
|
foreach (PlacesItem* item, items) {
|
||||||
if (item->isHidden()) {
|
if (!m_hiddenItemsShown && item->isHidden()) {
|
||||||
m_hiddenItems.append(item);
|
m_hiddenItems.append(item);
|
||||||
} else {
|
} else {
|
||||||
appendItem(item);
|
appendItem(item);
|
||||||
|
@ -522,8 +547,7 @@ void PlacesItemModel::createSystemBookmarks()
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < m_systemBookmarks.count(); ++i) {
|
for (int i = 0; i < m_systemBookmarks.count(); ++i) {
|
||||||
const KUrl url = translatedSystemBookmarkUrl(m_systemBookmarks[i].url);
|
m_systemBookmarksIndexes.insert(m_systemBookmarks[i].url, i);
|
||||||
m_systemBookmarksIndexes.insert(url, i);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -581,100 +605,6 @@ QString PlacesItemModel::searchForGroupName()
|
||||||
return i18nc("@item", "Search For");
|
return i18nc("@item", "Search For");
|
||||||
}
|
}
|
||||||
|
|
||||||
KUrl PlacesItemModel::translatedSystemBookmarkUrl(const KUrl& url)
|
|
||||||
{
|
|
||||||
KUrl translatedUrl = url;
|
|
||||||
if (url.protocol() == QLatin1String("timeline")) {
|
|
||||||
translatedUrl = createTimelineUrl(url);
|
|
||||||
} else if (url.protocol() == QLatin1String("search")) {
|
|
||||||
translatedUrl = createSearchUrl(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
return translatedUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
KUrl PlacesItemModel::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;
|
|
||||||
|
|
||||||
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());
|
|
||||||
} else {
|
|
||||||
Q_ASSERT(path.endsWith("today"));
|
|
||||||
timelineUrl= url;
|
|
||||||
}
|
|
||||||
|
|
||||||
return timelineUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString PlacesItemModel::timelineDateString(int year, int month, int day)
|
|
||||||
{
|
|
||||||
QString date = QString::number(year) + '-';
|
|
||||||
if (month < 10) {
|
|
||||||
date += '0';
|
|
||||||
}
|
|
||||||
date += QString::number(month);
|
|
||||||
|
|
||||||
if (day >= 1) {
|
|
||||||
date += '-';
|
|
||||||
if (day < 10) {
|
|
||||||
date += '0';
|
|
||||||
}
|
|
||||||
date += QString::number(day);
|
|
||||||
}
|
|
||||||
|
|
||||||
return date;
|
|
||||||
}
|
|
||||||
|
|
||||||
KUrl PlacesItemModel::createSearchUrl(const KUrl& url)
|
|
||||||
{
|
|
||||||
KUrl searchUrl;
|
|
||||||
|
|
||||||
#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);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
Q_UNUSED(url);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return searchUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
KUrl PlacesItemModel::searchUrlForTerm(const Nepomuk::Query::Term& term)
|
|
||||||
{
|
|
||||||
const Nepomuk::Query::Query query(term);
|
|
||||||
return query.toSearchUrl();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PLACESITEMMODEL_DEBUG
|
#ifdef PLACESITEMMODEL_DEBUG
|
||||||
void PlacesItemModel::showModelState()
|
void PlacesItemModel::showModelState()
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,16 +35,6 @@ class KBookmarkManager;
|
||||||
class PlacesItem;
|
class PlacesItem;
|
||||||
class QAction;
|
class QAction;
|
||||||
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
namespace Nepomuk
|
|
||||||
{
|
|
||||||
namespace Query
|
|
||||||
{
|
|
||||||
class Term;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PLACESITEMMODEL_DEBUG
|
#define PLACESITEMMODEL_DEBUG
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -71,12 +61,6 @@ public:
|
||||||
void setItemHidden(int index, bool hide);
|
void setItemHidden(int index, bool hide);
|
||||||
bool isItemHidden(int index) const;
|
bool isItemHidden(int index) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* @return True if the item is a default item created by
|
|
||||||
* the system (e.g. the places for home, root, trash etc.)
|
|
||||||
*/
|
|
||||||
bool isSystemItem(int index) const;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Search the item which is equal to the URL or at least
|
* Search the item which is equal to the URL or at least
|
||||||
* is a parent URL. If there are more than one possible
|
* is a parent URL. If there are more than one possible
|
||||||
|
@ -98,12 +82,15 @@ public:
|
||||||
void requestEject(int index);
|
void requestEject(int index);
|
||||||
void requestTeardown(int index);
|
void requestTeardown(int index);
|
||||||
|
|
||||||
|
void save();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void errorMessage(const QString& message);
|
void errorMessage(const QString& message);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void onItemInserted(int index);
|
virtual void onItemInserted(int index);
|
||||||
virtual void onItemRemoved(int index);
|
virtual void onItemRemoved(int index);
|
||||||
|
virtual void onItemReplaced(int index);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slotDeviceAdded(const QString& udi);
|
void slotDeviceAdded(const QString& udi);
|
||||||
|
@ -139,36 +126,6 @@ private:
|
||||||
static QString recentlyAccessedGroupName();
|
static QString recentlyAccessedGroupName();
|
||||||
static QString searchForGroupName();
|
static QString searchForGroupName();
|
||||||
|
|
||||||
static KUrl translatedSystemBookmarkUrl(const KUrl& url);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return URL using the timeline-protocol for searching.
|
|
||||||
*/
|
|
||||||
static KUrl createTimelineUrl(const KUrl& url);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper method for createTimelineUrl().
|
|
||||||
* @return String that represents a date-path in the format that
|
|
||||||
* the timeline-protocol expects.
|
|
||||||
*/
|
|
||||||
static QString timelineDateString(int year, int month, int day = 0);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return URL that can be listed by KIO and results in searching
|
|
||||||
* for a given term. The URL \a url represents a places-internal
|
|
||||||
* URL like e.g. "search:/documents"
|
|
||||||
*/
|
|
||||||
static KUrl createSearchUrl(const KUrl& url);
|
|
||||||
|
|
||||||
#ifdef HAVE_NEPOMUK
|
|
||||||
/**
|
|
||||||
* Helper method for createSearchUrl().
|
|
||||||
* @return URL that can be listed by KIO and results in searching
|
|
||||||
* for the given term.
|
|
||||||
*/
|
|
||||||
static KUrl searchUrlForTerm(const Nepomuk::Query::Term& term);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef PLACESITEMMODEL_DEBUG
|
#ifdef PLACESITEMMODEL_DEBUG
|
||||||
void showModelState();
|
void showModelState();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include <KMenu>
|
#include <KMenu>
|
||||||
#include <KMessageBox>
|
#include <KMessageBox>
|
||||||
#include <KNotification>
|
#include <KNotification>
|
||||||
|
#include "placesitem.h"
|
||||||
#include "placesitemeditdialog.h"
|
#include "placesitemeditdialog.h"
|
||||||
#include "placesitemlistgroupheader.h"
|
#include "placesitemlistgroupheader.h"
|
||||||
#include "placesitemlistwidget.h"
|
#include "placesitemlistwidget.h"
|
||||||
|
@ -46,6 +47,15 @@
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <QShowEvent>
|
#include <QShowEvent>
|
||||||
|
|
||||||
|
#ifdef HAVE_NEPOMUK
|
||||||
|
#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
|
||||||
|
|
||||||
PlacesPanel::PlacesPanel(QWidget* parent) :
|
PlacesPanel::PlacesPanel(QWidget* parent) :
|
||||||
Panel(parent),
|
Panel(parent),
|
||||||
m_controller(0),
|
m_controller(0),
|
||||||
|
@ -107,7 +117,7 @@ void PlacesPanel::slotItemActivated(int index)
|
||||||
{
|
{
|
||||||
const KUrl url = m_model->data(index).value("url").value<KUrl>();
|
const KUrl url = m_model->data(index).value("url").value<KUrl>();
|
||||||
if (!url.isEmpty()) {
|
if (!url.isEmpty()) {
|
||||||
emit placeActivated(url);
|
emit placeActivated(convertedUrl(url));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,14 +125,16 @@ void PlacesPanel::slotItemMiddleClicked(int index)
|
||||||
{
|
{
|
||||||
const KUrl url = m_model->data(index).value("url").value<KUrl>();
|
const KUrl url = m_model->data(index).value("url").value<KUrl>();
|
||||||
if (!url.isEmpty()) {
|
if (!url.isEmpty()) {
|
||||||
emit placeMiddleClicked(url);
|
emit placeMiddleClicked(convertedUrl(url));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
|
void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
|
||||||
{
|
{
|
||||||
const QHash<QByteArray, QVariant> data = m_model->data(index);
|
const PlacesItem* item = m_model->placesItem(index);
|
||||||
const QString label = data.value("text").toString();
|
if (!item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
KMenu menu(this);
|
KMenu menu(this);
|
||||||
|
|
||||||
|
@ -133,8 +145,9 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
|
||||||
QAction* teardownAction = 0;
|
QAction* teardownAction = 0;
|
||||||
QAction* ejectAction = 0;
|
QAction* ejectAction = 0;
|
||||||
|
|
||||||
const bool isSystemItem = m_model->isSystemItem(index);
|
const QString label = item->text();
|
||||||
const bool isDevice = !data.value("udi").toString().isEmpty();
|
|
||||||
|
const bool isDevice = !item->udi().isEmpty();
|
||||||
if (isDevice) {
|
if (isDevice) {
|
||||||
ejectAction = m_model->ejectAction(index);
|
ejectAction = m_model->ejectAction(index);
|
||||||
if (ejectAction) {
|
if (ejectAction) {
|
||||||
|
@ -152,7 +165,7 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
|
||||||
mainSeparator = menu.addSeparator();
|
mainSeparator = menu.addSeparator();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (data.value("url").value<KUrl>() == KUrl("trash:/")) {
|
if (item->url() == KUrl("trash:/")) {
|
||||||
emptyTrashAction = menu.addAction(KIcon("trash-empty"), i18nc("@action:inmenu", "Empty Trash"));
|
emptyTrashAction = menu.addAction(KIcon("trash-empty"), i18nc("@action:inmenu", "Empty Trash"));
|
||||||
KConfig trashConfig("trashrc", KConfig::SimpleConfig);
|
KConfig trashConfig("trashrc", KConfig::SimpleConfig);
|
||||||
emptyTrashAction->setEnabled(!trashConfig.group("Status").readEntry("Empty", true));
|
emptyTrashAction->setEnabled(!trashConfig.group("Status").readEntry("Empty", true));
|
||||||
|
@ -171,13 +184,13 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
|
||||||
openInNewTabAction->setIcon(KIcon("tab-new"));
|
openInNewTabAction->setIcon(KIcon("tab-new"));
|
||||||
|
|
||||||
QAction* removeAction = 0;
|
QAction* removeAction = 0;
|
||||||
if (!isDevice && !isSystemItem) {
|
if (!isDevice && !item->isSystemItem()) {
|
||||||
removeAction = menu.addAction(KIcon("edit-delete"), i18nc("@item:inmenu", "Remove '%1'", label));
|
removeAction = menu.addAction(KIcon("edit-delete"), i18nc("@item:inmenu", "Remove '%1'", label));
|
||||||
}
|
}
|
||||||
|
|
||||||
QAction* hideAction = menu.addAction(i18nc("@item:inmenu", "Hide '%1'", label));
|
QAction* hideAction = menu.addAction(i18nc("@item:inmenu", "Hide '%1'", label));
|
||||||
hideAction->setCheckable(true);
|
hideAction->setCheckable(true);
|
||||||
hideAction->setChecked(data.value("isHidden").toBool());
|
hideAction->setChecked(item->isHidden());
|
||||||
|
|
||||||
QAction* showAllAction = 0;
|
QAction* showAllAction = 0;
|
||||||
if (m_model->hiddenCount() > 0) {
|
if (m_model->hiddenCount() > 0) {
|
||||||
|
@ -204,8 +217,10 @@ void PlacesPanel::slotItemContextMenuRequested(int index, const QPointF& pos)
|
||||||
editEntry(index);
|
editEntry(index);
|
||||||
} else if (action == removeAction) {
|
} else if (action == removeAction) {
|
||||||
m_model->removeItem(index);
|
m_model->removeItem(index);
|
||||||
|
m_model->save();
|
||||||
} else if (action == hideAction) {
|
} else if (action == hideAction) {
|
||||||
m_model->setItemHidden(index, hideAction->isChecked());
|
m_model->setItemHidden(index, hideAction->isChecked());
|
||||||
|
m_model->save();
|
||||||
} else if (action == openInNewTabAction) {
|
} else if (action == openInNewTabAction) {
|
||||||
const KUrl url = m_model->item(index)->dataValue("url").value<KUrl>();
|
const KUrl url = m_model->item(index)->dataValue("url").value<KUrl>();
|
||||||
emit placeMiddleClicked(url);
|
emit placeMiddleClicked(url);
|
||||||
|
@ -264,7 +279,7 @@ void PlacesPanel::slotUrlsDropped(const KUrl& dest, QDropEvent* event, QWidget*
|
||||||
void PlacesPanel::slotTrashUpdated(KJob* job)
|
void PlacesPanel::slotTrashUpdated(KJob* job)
|
||||||
{
|
{
|
||||||
if (job->error()) {
|
if (job->error()) {
|
||||||
// TODO: Show error-string inside Dolphin, don't use job->ui->showErrorMessage().
|
emit errorMessage(job->errorString());
|
||||||
}
|
}
|
||||||
org::kde::KDirNotify::emitFilesAdded("trash:/");
|
org::kde::KDirNotify::emitFilesAdded("trash:/");
|
||||||
}
|
}
|
||||||
|
@ -322,6 +337,8 @@ void PlacesPanel::addEntry()
|
||||||
}
|
}
|
||||||
|
|
||||||
delete dialog;
|
delete dialog;
|
||||||
|
|
||||||
|
m_model->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlacesPanel::editEntry(int index)
|
void PlacesPanel::editEntry(int index)
|
||||||
|
@ -347,6 +364,8 @@ void PlacesPanel::editEntry(int index)
|
||||||
}
|
}
|
||||||
|
|
||||||
delete dialog;
|
delete dialog;
|
||||||
|
|
||||||
|
m_model->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlacesPanel::selectClosestItem()
|
void PlacesPanel::selectClosestItem()
|
||||||
|
@ -372,4 +391,98 @@ KStandardItem* PlacesPanel::createStandardItemFromDialog(PlacesItemEditDialog* d
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KUrl PlacesPanel::convertedUrl(const KUrl& url)
|
||||||
|
{
|
||||||
|
KUrl newUrl = url;
|
||||||
|
if (url.protocol() == QLatin1String("timeline")) {
|
||||||
|
newUrl = createTimelineUrl(url);
|
||||||
|
} else if (url.protocol() == QLatin1String("search")) {
|
||||||
|
newUrl = createSearchUrl(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
return newUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
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());
|
||||||
|
} else {
|
||||||
|
Q_ASSERT(path.endsWith("today"));
|
||||||
|
timelineUrl= url;
|
||||||
|
}
|
||||||
|
|
||||||
|
return timelineUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString PlacesPanel::timelineDateString(int year, int month, int day)
|
||||||
|
{
|
||||||
|
QString date = QString::number(year) + '-';
|
||||||
|
if (month < 10) {
|
||||||
|
date += '0';
|
||||||
|
}
|
||||||
|
date += QString::number(month);
|
||||||
|
|
||||||
|
if (day >= 1) {
|
||||||
|
date += '-';
|
||||||
|
if (day < 10) {
|
||||||
|
date += '0';
|
||||||
|
}
|
||||||
|
date += QString::number(day);
|
||||||
|
}
|
||||||
|
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
KUrl PlacesPanel::createSearchUrl(const KUrl& url)
|
||||||
|
{
|
||||||
|
KUrl searchUrl;
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
Q_UNUSED(url);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return searchUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_NEPOMUK
|
||||||
|
KUrl PlacesPanel::searchUrlForTerm(const Nepomuk::Query::Term& term)
|
||||||
|
{
|
||||||
|
const Nepomuk::Query::Query query(term);
|
||||||
|
return query.toSearchUrl();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "placespanel.moc"
|
#include "placespanel.moc"
|
||||||
|
|
|
@ -31,6 +31,16 @@ class KItemListController;
|
||||||
class PlacesItemEditDialog;
|
class PlacesItemEditDialog;
|
||||||
class PlacesItemModel;
|
class PlacesItemModel;
|
||||||
|
|
||||||
|
#ifdef HAVE_NEPOMUK
|
||||||
|
namespace Nepomuk
|
||||||
|
{
|
||||||
|
namespace Query
|
||||||
|
{
|
||||||
|
class Term;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Combines bookmarks and mounted devices as list.
|
* @brief Combines bookmarks and mounted devices as list.
|
||||||
*/
|
*/
|
||||||
|
@ -76,6 +86,42 @@ private:
|
||||||
*/
|
*/
|
||||||
KStandardItem* createStandardItemFromDialog(PlacesItemEditDialog* dialog) const;
|
KStandardItem* createStandardItemFromDialog(PlacesItemEditDialog* dialog) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Converts the URL, which contains "virtual" URLs for system-items like
|
||||||
|
* "search:/documents" into a Nepomuk-Query-URL that will be handled by
|
||||||
|
* the corresponding IO-slave. Virtual URLs for bookmarks are used to
|
||||||
|
* be independent from internal format changes.
|
||||||
|
*/
|
||||||
|
static KUrl convertedUrl(const KUrl& url);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return URL using the timeline-protocol for searching (see convertedUrl()).
|
||||||
|
*/
|
||||||
|
static KUrl createTimelineUrl(const KUrl& url);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method for createTimelineUrl().
|
||||||
|
* @return String that represents a date-path in the format that
|
||||||
|
* the timeline-protocol expects.
|
||||||
|
*/
|
||||||
|
static QString timelineDateString(int year, int month, int day = 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return URL that can be listed by KIO and results in searching
|
||||||
|
* for a given term. The URL \a url represents a places-internal
|
||||||
|
* URL like e.g. "search:/documents" (see convertedUrl()).
|
||||||
|
*/
|
||||||
|
static KUrl createSearchUrl(const KUrl& url);
|
||||||
|
|
||||||
|
#ifdef HAVE_NEPOMUK
|
||||||
|
/**
|
||||||
|
* Helper method for createSearchUrl().
|
||||||
|
* @return URL that can be listed by KIO and results in searching
|
||||||
|
* for the given term.
|
||||||
|
*/
|
||||||
|
static KUrl searchUrlForTerm(const Nepomuk::Query::Term& term);
|
||||||
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
KItemListController* m_controller;
|
KItemListController* m_controller;
|
||||||
PlacesItemModel* m_model;
|
PlacesItemModel* m_model;
|
||||||
|
|
Loading…
Reference in a new issue