kde4_add_library(dolphinprivate SHARED ${dolphinprivate_LIB_SRCS})
-target_link_libraries(dolphinprivate ${KDE4_KFILE_LIBS} konq ${KDE4_KNEWSTUFF3_LIBS})
+target_link_libraries(
+ dolphinprivate
+ ${KDE4_KFILE_LIBS}
+ konq
+ ${KDE4_KNEWSTUFF3_LIBS}
+)
+
if (Nepomuk_FOUND)
target_link_libraries(
dolphinprivate
endif (Nepomuk_FOUND)
if(X11_Xrender_FOUND)
- target_link_libraries(dolphinprivate ${X11_Xrender_LIB} )
+ target_link_libraries(dolphinprivate ${X11_Xrender_LIB})
endif(X11_Xrender_FOUND)
set_target_properties(dolphinprivate PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION ${GENERIC_LIB_SOVERSION} )
panels/information/pixmapviewer.cpp
panels/information/phononwidget.cpp
panels/places/placespanel.cpp
+ panels/places/placesitem.cpp
panels/places/placesitemeditdialog.cpp
panels/places/placesitemlistgroupheader.cpp
panels/places/placesitemlistwidget.cpp
konq
dolphinprivate
knewstuff3
+ ${KDE4_SOLID_LIBS}
${KDE4_PHONON_LIBS}
)
setText(text);
}
-KStandardItem::KStandardItem(const QIcon& icon, const QString& text, KStandardItem* parent) :
+KStandardItem::KStandardItem(const QString& icon, const QString& text, KStandardItem* parent) :
m_parent(parent),
m_children(),
m_model(0),
return m_data["text"].toString();
}
-void KStandardItem::setIcon(const QIcon& icon)
+void KStandardItem::setIcon(const QString& icon)
{
- setDataValue("iconName", icon.name());
+ setDataValue("iconName", icon);
}
-QIcon KStandardItem::icon() const
+QString KStandardItem::icon() const
{
- return QIcon(m_data["iconName"].toString());
+ return m_data["iconName"].toString();
+}
+
+void KStandardItem::setIconOverlays(const QStringList& overlays)
+{
+ setDataValue("iconOverlays", overlays);
+}
+
+QStringList KStandardItem::iconOverlays() const
+{
+ return m_data["iconOverlays"].toStringList();
}
void KStandardItem::setGroup(const QString& group)
public:
explicit KStandardItem(KStandardItem* parent = 0);
explicit KStandardItem(const QString& text, KStandardItem* parent = 0);
- KStandardItem(const QIcon& icon, const QString& text, KStandardItem* parent = 0);
+ KStandardItem(const QString& icon, const QString& text, KStandardItem* parent = 0);
KStandardItem(const KStandardItem& item);
virtual ~KStandardItem();
/**
* Sets the icon for the "iconName"-role.
*/
- void setIcon(const QIcon& icon);
- QIcon icon() const;
+ void setIcon(const QString& icon);
+ QString icon() const;
+
+ void setIconOverlays(const QStringList& overlays);
+ QStringList iconOverlays() const;
/**
* Sets the group for the "group"-role.
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2012 by Peter Penz <peter.penz19@gmail.com> *
+ * *
+ * Based on KFilePlacesItem from kdelibs: *
+ * Copyright (C) 2007 Kevin Ottens <ervin@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 "placesitem.h"
+
+#include <KBookmark>
+#include <KIcon>
+#include <KLocale>
+#include <Solid/Block>
+
+PlacesItem::PlacesItem(PlacesItem* parent) :
+ KStandardItem(parent)
+{
+}
+
+PlacesItem::PlacesItem(const KBookmark& bookmark, const QString& udi, PlacesItem* parent) :
+ KStandardItem(parent),
+ m_device(udi),
+ m_access(),
+ m_volume(),
+ m_disc()
+{
+ setHidden(bookmark.metaDataItem("IsHidden") == QLatin1String("true"));
+
+ if (udi.isEmpty()) {
+ setIcon(bookmark.icon());
+ setText(bookmark.text());
+ setUrl(bookmark.url());
+ setDataValue("address", bookmark.address());
+ setGroup(i18nc("@item", "Places"));
+ } else if (m_device.isValid()) {
+ m_access = m_device.as<Solid::StorageAccess>();
+ m_volume = m_device.as<Solid::StorageVolume>();
+ m_disc = m_device.as<Solid::OpticalDisc>();
+
+ setText(m_device.description());
+ setIcon(m_device.icon());
+ setIconOverlays(m_device.emblems());
+ setDataValue("udi", udi);
+ setGroup(i18nc("@item", "Devices"));
+
+ if (m_access) {
+ setUrl(m_access->filePath());
+ } else if (m_disc && (m_disc->availableContent() & Solid::OpticalDisc::Audio) != 0) {
+ const QString device = m_device.as<Solid::Block>()->device();
+ setUrl(QString("audiocd:/?device=%1").arg(device));
+ }
+ }
+}
+
+PlacesItem::PlacesItem(const PlacesItem& item) :
+ KStandardItem(item),
+ m_device(),
+ m_access(),
+ m_volume(),
+ m_disc()
+{
+}
+
+PlacesItem::~PlacesItem()
+{
+}
+
+void PlacesItem::setUrl(const KUrl& url)
+{
+ setDataValue("url", url);
+}
+
+KUrl PlacesItem::url() const
+{
+ return dataValue("url").value<KUrl>();
+}
+
+void PlacesItem::setHidden(bool hidden)
+{
+ setDataValue("isHidden", hidden);
+}
+
+bool PlacesItem::isHidden() const
+{
+ return dataValue("isHidden").toBool();
+}
+
+
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2012 by Peter Penz <peter.penz19@gmail.com> *
+ * *
+ * 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 *
+ ***************************************************************************/
+
+#ifndef PLACESITEM_H
+#define PLACESITEM_H
+
+#include <kitemviews/kstandarditem.h>
+#include <KUrl>
+#include <QPointer>
+#include <Solid/Device>
+#include <Solid/OpticalDisc>
+#include <Solid/StorageAccess>
+#include <Solid/StorageVolume>
+
+class KBookmark;
+
+/**
+ * @brief Extends KStandardItem by places-specific properties.
+ */
+class PlacesItem : public KStandardItem
+{
+
+public:
+ explicit PlacesItem(PlacesItem* parent = 0);
+ PlacesItem(const KBookmark& bookmark,
+ const QString& udi,
+ PlacesItem* parent = 0);
+ PlacesItem(const PlacesItem& item);
+ virtual ~PlacesItem();
+
+ void setUrl(const KUrl& url);
+ KUrl url() const;
+
+ void setHidden(bool hidden);
+ bool isHidden() const;
+
+private:
+ Solid::Device m_device;
+ QPointer<Solid::StorageAccess> m_access;
+ QPointer<Solid::StorageVolume> m_volume;
+ QPointer<Solid::OpticalDisc> m_disc;
+};
+
+#endif
+
+
#include <KBookmarkManager>
#include <KComponentData>
#include <KDebug>
-#include <KIcon>
-#include <kitemviews/kstandarditem.h>
#include <KLocale>
#include <KStandardDirs>
#include <KUser>
+#include "placesitem.h"
#include <QDate>
+#include <Solid/Device>
+#include <Solid/DeviceNotifier>
+
PlacesItemModel::PlacesItemModel(QObject* parent) :
KStandardItemModel(parent),
m_nepomukRunning(false),
m_hiddenItemsShown(false),
m_availableDevices(),
+ m_predicate(),
m_bookmarkManager(0),
m_systemBookmarks(),
m_systemBookmarksIndexes(),
m_bookmarkManager = KBookmarkManager::managerForFile(file, "kfilePlaces");
createSystemBookmarks();
+ initializeAvailableDevices();
loadBookmarks();
}
m_hiddenItems.clear();
}
+PlacesItem* PlacesItemModel::placesItem(int index) const
+{
+ return dynamic_cast<PlacesItem*>(item(index));
+}
+
int PlacesItemModel::hiddenCount() const
{
int modelIndex = 0;
int itemCount = 0;
- foreach (const KStandardItem* hiddenItem, m_hiddenItems) {
+ foreach (const PlacesItem* hiddenItem, m_hiddenItems) {
if (hiddenItem) {
++itemCount;
} else {
- if (item(modelIndex)->dataValue("isHidden").toBool()) {
+ if (placesItem(modelIndex)->isHidden()) {
++itemCount;
}
++modelIndex;
void PlacesItemModel::setItemHidden(int index, bool hide)
{
if (index >= 0 && index < count()) {
- KStandardItem* shownItem = this->item(index);
- shownItem->setDataValue("isHidden", hide);
+ PlacesItem* shownItem = placesItem(index);
+ shownItem->setHidden(true);
if (!m_hiddenItemsShown && hide) {
const int newIndex = hiddenIndex(index);
- KStandardItem* hiddenItem = new KStandardItem(*shownItem);
+ PlacesItem* hiddenItem = new PlacesItem(*shownItem);
removeItem(index);
m_hiddenItems.insert(newIndex, hiddenItem);
}
int modelIndex = 0;
for (int hiddenIndex = 0; hiddenIndex < m_hiddenItems.count(); ++hiddenIndex) {
if (m_hiddenItems[hiddenIndex]) {
- KStandardItem* visibleItem = new KStandardItem(*m_hiddenItems[hiddenIndex]);
+ PlacesItem* visibleItem = new PlacesItem(*m_hiddenItems[hiddenIndex]);
delete m_hiddenItems[hiddenIndex];
m_hiddenItems.removeAt(hiddenIndex);
insertItem(modelIndex, visibleItem);
// m_hiddenItems.
Q_ASSERT(m_hiddenItems.count() == count());
for (int i = count() - 1; i >= 0; --i) {
- KStandardItem* visibleItem = item(i);
- if (visibleItem->dataValue("isHidden").toBool()) {
- KStandardItem* hiddenItem = new KStandardItem(*visibleItem);
+ PlacesItem* visibleItem = placesItem(i);
+ if (visibleItem->isHidden()) {
+ PlacesItem* hiddenItem = new PlacesItem(*visibleItem);
removeItem(i);
m_hiddenItems.insert(i, hiddenItem);
}
bool PlacesItemModel::isSystemItem(int index) const
{
if (index >= 0 && index < count()) {
- const KUrl url = data(index).value("url").value<KUrl>();
+ const KUrl url = placesItem(index)->url();
return m_systemBookmarksIndexes.contains(url);
}
return false;
int maxLength = 0;
for (int i = 0; i < count(); ++i) {
- const KUrl itemUrl = data(i).value("url").value<KUrl>();
+ const KUrl itemUrl = placesItem(i)->url();
if (itemUrl.isParentOf(url)) {
const int length = itemUrl.prettyUrl().length();
if (length > maxLength) {
#endif
}
+void PlacesItemModel::slotDeviceAdded(const QString& udi)
+{
+ Q_UNUSED(udi);
+}
+
+void PlacesItemModel::slotDeviceRemoved(const QString& udi)
+{
+ Q_UNUSED(udi);
+}
+
void PlacesItemModel::loadBookmarks()
{
KBookmarkGroup root = m_bookmarkManager->root();
missingSystemBookmarks.insert(data.url);
}
+ // The bookmarks might have a mixed order of "places" and "devices". In
+ // Dolphin's places panel the devices should always be appended as last
+ // group.
+ QList<PlacesItem*> placesItems;
+ QList<PlacesItem*> devicesItems;
+
while (!bookmark.isNull()) {
const QString udi = bookmark.metaDataItem("UDI");
const KUrl url = bookmark.url();
&& (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 (missingSystemBookmarks.contains(url)) {
- missingSystemBookmarks.remove(url);
- // Apply the translated text to the system bookmarks, otherwise an outdated
- // translation might be shown.
- const int index = m_systemBookmarksIndexes.value(url);
- item->setText(m_systemBookmarks[index].text);
-
- // The system bookmarks don't contain "real" queries stored as URLs, so
- // they must be translated first.
- item->setDataValue("url", translatedSystemBookmarkUrl(url));
- } else {
- item->setText(bookmark.text());
- }
-
+ PlacesItem* item = new PlacesItem(bookmark, udi);
if (deviceAvailable) {
- item->setDataValue("udi", udi);
- item->setGroup(i18nc("@item", "Devices"));
+ devicesItems.append(item);
} else {
- item->setGroup(i18nc("@item", "Places"));
- }
+ placesItems.append(item);
- if (bookmark.metaDataItem("IsHidden") == QLatin1String("true")) {
- m_hiddenItems.append(item);
- } else {
- appendItem(item);
+ if (missingSystemBookmarks.contains(url)) {
+ missingSystemBookmarks.remove(url);
+
+ // Apply the translated text to the system bookmarks, otherwise an outdated
+ // translation might be shown.
+ const int index = m_systemBookmarksIndexes.value(url);
+ item->setText(m_systemBookmarks[index].text);
+
+ // The system bookmarks don't contain "real" queries stored as URLs, so
+ // they must be translated first.
+ item->setUrl(translatedSystemBookmarkUrl(url));
+ }
}
}
bookmark = root.next(bookmark);
}
+ addItems(placesItems);
+
if (!missingSystemBookmarks.isEmpty()) {
foreach (const SystemBookmarkData& data, m_systemBookmarks) {
if (missingSystemBookmarks.contains(data.url)) {
- KStandardItem* item = new KStandardItem();
- item->setIcon(KIcon(data.icon));
+ PlacesItem* item = new PlacesItem();
+ item->setIcon(data.icon);
item->setText(data.text);
- item->setDataValue("url", translatedSystemBookmarkUrl(data.url));
+ item->setUrl(translatedSystemBookmarkUrl(data.url));
item->setGroup(data.group);
appendItem(item);
}
}
}
+ addItems(devicesItems);
+
+ // TODO: add bookmarks for missing devices
+ // foreach (const QString &udi, devices) {
+ // bookmark = KFilePlacesItem::createDeviceBookmark(bookmarkManager, udi);
+ // ...
+
#ifdef PLACESITEMMODEL_DEBUG
kDebug() << "Loaded bookmarks";
showModelState();
#endif
}
+void PlacesItemModel::addItems(const QList<PlacesItem*>& items)
+{
+ foreach (PlacesItem* item, items) {
+ if (item->isHidden()) {
+ m_hiddenItems.append(item);
+ } else {
+ appendItem(item);
+ }
+ }
+}
+
void PlacesItemModel::createSystemBookmarks()
{
Q_ASSERT(m_systemBookmarks.isEmpty());
}
}
+void PlacesItemModel::initializeAvailableDevices()
+{
+ m_predicate = Solid::Predicate::fromString(
+ "[[[[ StorageVolume.ignored == false AND [ StorageVolume.usage == 'FileSystem' OR StorageVolume.usage == 'Encrypted' ]]"
+ " OR "
+ "[ IS StorageAccess AND StorageDrive.driveType == 'Floppy' ]]"
+ " OR "
+ "OpticalDisc.availableContent & 'Audio' ]"
+ " OR "
+ "StorageAccess.ignored == false ]");
+ Q_ASSERT(m_predicate.isValid());
+
+ Solid::DeviceNotifier* notifier = Solid::DeviceNotifier::instance();
+ connect(notifier, SIGNAL(deviceAdded(QString)), this, SLOT(slotDeviceAdded(QString)));
+ connect(notifier, SIGNAL(deviceRemoved(QString)), this, SLOT(slotDeviceRemoved(QString)));
+
+ const QList<Solid::Device>& deviceList = Solid::Device::listFromQuery(m_predicate);
+ foreach(const Solid::Device& device, deviceList) {
+ m_availableDevices << device.udi();
+ }
+}
+
int PlacesItemModel::hiddenIndex(int index) const
{
int hiddenIndex = 0;
#include <QHash>
#include <QList>
#include <QSet>
+#include <Solid/Predicate>
class KBookmarkManager;
+class PlacesItem;
class QAction;
#ifdef HAVE_NEPOMUK
explicit PlacesItemModel(QObject* parent = 0);
virtual ~PlacesItemModel();
+ PlacesItem* placesItem(int index) const;
+
void setHiddenItemsShown(bool show);
bool hiddenItemsShown() const;
virtual void onItemInserted(int index);
virtual void onItemRemoved(int index);
+private slots:
+ void slotDeviceAdded(const QString& udi);
+ void slotDeviceRemoved(const QString& udi);
+
private:
void loadBookmarks();
+ /**
+ * Helper method for loadBookmarks(): Adds the items
+ * to the model if the "isHidden"-property is false,
+ * otherwise the items get added to m_hiddenItems.
+ */
+ void addItems(const QList<PlacesItem*>& items);
+
/**
* Creates system bookmarks that are shown per default and can
* only be hidden but not removed. The result will be stored
*/
void createSystemBookmarks();
+ void initializeAvailableDevices();
+
/**
* @param index Item index related to the model.
* @return Corresponding item index related to m_hiddenItems.
bool m_hiddenItemsShown;
QSet<QString> m_availableDevices;
+ Solid::Predicate m_predicate;
KBookmarkManager* m_bookmarkManager;
struct SystemBookmarkData
QList<SystemBookmarkData> m_systemBookmarks;
QHash<KUrl, int> m_systemBookmarksIndexes;
- QList<KStandardItem*> m_hiddenItems;
+ QList<PlacesItem*> m_hiddenItems;
};
#endif
const KUrl newUrl = dialog->url();
KStandardItem* item = new KStandardItem();
- item->setIcon(KIcon(dialog->icon()));
+ item->setIcon(dialog->icon());
item->setText(dialog->text());
item->setDataValue("url", newUrl);
item->setGroup(m_model->groupName(newUrl));