┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dolphinmainwindow.cpp28
-rw-r--r--src/dolphinmainwindow.h15
-rw-r--r--src/kitemviews/kstandarditem.cpp50
-rw-r--r--src/kitemviews/kstandarditem.h26
-rw-r--r--src/kitemviews/kstandarditemlistwidget.cpp9
-rw-r--r--src/kitemviews/kstandarditemmodel.cpp11
-rw-r--r--src/panels/folders/folderspanel.cpp4
-rw-r--r--src/panels/folders/folderspanel.h6
-rw-r--r--src/panels/places/placespanel.cpp78
-rw-r--r--src/panels/places/placespanel.h13
10 files changed, 173 insertions, 67 deletions
diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp
index a990e2a17..209b10678 100644
--- a/src/dolphinmainwindow.cpp
+++ b/src/dolphinmainwindow.cpp
@@ -508,6 +508,12 @@ void DolphinMainWindow::openNewTab(const KUrl& url)
}
}
+void DolphinMainWindow::openNewActivatedTab(const KUrl& url)
+{
+ openNewTab(url);
+ m_tabBar->setCurrentIndex(m_viewTab.count() - 1);
+}
+
void DolphinMainWindow::activateNextTab()
{
if (m_viewTab.count() >= 2) {
@@ -1260,16 +1266,6 @@ void DolphinMainWindow::slotTabMoved(int from, int to)
m_tabIndex = m_tabBar->currentIndex();
}
-void DolphinMainWindow::handlePlacesClick(const KUrl& url, Qt::MouseButtons buttons)
-{
- if (buttons & Qt::MidButton) {
- openNewTab(url);
- m_tabBar->setCurrentIndex(m_viewTab.count() - 1);
- } else {
- changeUrl(url);
- }
-}
-
void DolphinMainWindow::slotTestCanDecode(const QDragMoveEvent* event, bool& canDecode)
{
canDecode = KUrl::List::canDecode(event->mimeData());
@@ -1781,8 +1777,10 @@ void DolphinMainWindow::setupDockWidgets()
addDockWidget(Qt::LeftDockWidgetArea, foldersDock);
connect(this, SIGNAL(urlChanged(KUrl)),
foldersPanel, SLOT(setUrl(KUrl)));
- connect(foldersPanel, SIGNAL(changeUrl(KUrl,Qt::MouseButtons)),
- this, SLOT(handlePlacesClick(KUrl,Qt::MouseButtons)));
+ connect(foldersPanel, SIGNAL(folderActivated(KUrl)),
+ this, SLOT(changeUrl(KUrl)));
+ connect(foldersPanel, SIGNAL(folderMiddleClicked(KUrl)),
+ this, SLOT(openNewActivatedTab(KUrl)));
// Setup "Terminal"
#ifndef Q_OS_WIN
@@ -1856,8 +1854,10 @@ void DolphinMainWindow::setupDockWidgets()
createPanelAction(KIcon("bookmarks"), Qt::Key_F9, placesAction, "show_places_panel");
addDockWidget(Qt::LeftDockWidgetArea, placesDock);
- //connect(placesPanel, SIGNAL(urlChanged(KUrl,Qt::MouseButtons)),
- // this, SLOT(handlePlacesClick(KUrl,Qt::MouseButtons)));
+ connect(placesPanel, SIGNAL(placeActivated(KUrl)),
+ this, SLOT(changeUrl(KUrl)));
+ connect(placesPanel, SIGNAL(placeMiddleClicked(KUrl)),
+ this, SLOT(openNewActivatedTab(KUrl)));
connect(this, SIGNAL(urlChanged(KUrl)),
placesPanel, SLOT(setUrl(KUrl)));
connect(placesDock, SIGNAL(visibilityChanged(bool)),
diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h
index 7e143f720..dec064d11 100644
--- a/src/dolphinmainwindow.h
+++ b/src/dolphinmainwindow.h
@@ -350,10 +350,16 @@ private slots:
void openNewTab();
/**
- * Opens a new tab showing the URL \a url.
+ * Opens a new tab in the background showing the URL \a url.
*/
void openNewTab(const KUrl& url);
+ /**
+ * Opens a new tab showing the URL \a url and activates
+ * the tab.
+ */
+ void openNewActivatedTab(const KUrl& url);
+
void activateNextTab();
void activatePrevTab();
@@ -405,13 +411,6 @@ private slots:
void slotTabMoved(int from, int to);
/**
- * Handles a click on a places item: if the middle mouse button is
- * clicked, a new tab is opened for \a url, otherwise the current
- * view is replaced by \a url.
- */
- void handlePlacesClick(const KUrl& url, Qt::MouseButtons buttons);
-
- /**
* Is connected to the KTabBar signal testCanDecode() and adjusts
* the output parameter \a accept.
*/
diff --git a/src/kitemviews/kstandarditem.cpp b/src/kitemviews/kstandarditem.cpp
index 090746df1..1754c531b 100644
--- a/src/kitemviews/kstandarditem.cpp
+++ b/src/kitemviews/kstandarditem.cpp
@@ -19,34 +19,33 @@
#include "kstandarditem.h"
+#include <KDebug>
+
KStandardItem::KStandardItem(KStandardItem* parent) :
- m_text(),
- m_icon(),
- m_group(),
m_parent(parent),
m_children(),
- m_model(0)
+ m_model(0),
+ m_data()
{
}
KStandardItem::KStandardItem(const QString& text, KStandardItem* parent) :
- m_text(text),
- m_icon(),
- m_group(),
m_parent(parent),
m_children(),
- m_model(0)
+ m_model(0),
+ m_data()
{
+ setText(text);
}
KStandardItem::KStandardItem(const QIcon& icon, const QString& text, KStandardItem* parent) :
- m_text(text),
- m_icon(icon),
- m_group(),
m_parent(parent),
m_children(),
- m_model(0)
+ m_model(0),
+ m_data()
{
+ setIcon(icon);
+ setText(text);
}
KStandardItem::~KStandardItem()
@@ -55,32 +54,42 @@ KStandardItem::~KStandardItem()
void KStandardItem::setText(const QString& text)
{
- m_text = text;
+ m_data.insert("text", text);
}
QString KStandardItem::text() const
{
- return m_text;
+ return m_data["text"].toString();
}
void KStandardItem::setIcon(const QIcon& icon)
{
- m_icon = icon;
+ m_data.insert("iconName", icon.name());
}
QIcon KStandardItem::icon() const
{
- return m_icon;
+ return QIcon(m_data["iconName"].toString());
}
void KStandardItem::setGroup(const QString& group)
{
- m_group = group;
+ m_data.insert("group", group);
}
QString KStandardItem::group() const
{
- return m_group;
+ return m_data["group"].toString();
+}
+
+void KStandardItem::setDataValue(const QByteArray& role, const QVariant& value)
+{
+ m_data.insert(role, value);
+}
+
+QVariant KStandardItem::dataValue(const QByteArray& role) const
+{
+ return m_data[role];
}
void KStandardItem::setParent(KStandardItem* parent)
@@ -94,6 +103,11 @@ KStandardItem* KStandardItem::parent() const
return m_parent;
}
+QHash<QByteArray, QVariant> KStandardItem::data() const
+{
+ return m_data;
+}
+
QList<KStandardItem*> KStandardItem::children() const
{
return m_children;
diff --git a/src/kitemviews/kstandarditem.h b/src/kitemviews/kstandarditem.h
index 0315f4bf6..a108572a7 100644
--- a/src/kitemviews/kstandarditem.h
+++ b/src/kitemviews/kstandarditem.h
@@ -22,16 +22,20 @@
#include <libdolphin_export.h>
+#include <QByteArray>
+#include <QHash>
#include <QIcon>
#include <QList>
+#include <QVariant>
class KStandardItemModel;
/**
* @brief Represents and item of KStandardItemModel.
*
- * Provides setter- and getter-methods for most commonly
- * used properties.
+ * Provides setter- and getter-methods for the most commonly
+ * used roles. It is possible to assign values for custom
+ * roles by using setDataValue().
*/
class LIBDOLPHINPRIVATE_EXPORT KStandardItem
{
@@ -42,28 +46,40 @@ public:
KStandardItem(const QIcon& icon, const QString& text, KStandardItem* parent = 0);
virtual ~KStandardItem();
+ /**
+ * Sets the text for the "text"-role.
+ */
void setText(const QString& text);
QString text() const;
+ /**
+ * Sets the icon for the "iconName"-role.
+ */
void setIcon(const QIcon& icon);
QIcon icon() const;
+ /**
+ * Sets the group for the "group"-role.
+ */
void setGroup(const QString& group);
QString group() const;
+ void setDataValue(const QByteArray& role, const QVariant& value);
+ QVariant dataValue(const QByteArray& role) const;
+
void setParent(KStandardItem* parent);
KStandardItem* parent() const;
+ QHash<QByteArray, QVariant> data() const;
QList<KStandardItem*> children() const;
private:
- QString m_text;
- QIcon m_icon;
- QString m_group;
KStandardItem* m_parent;
QList<KStandardItem*> m_children;
KStandardItemModel* m_model;
+ QHash<QByteArray, QVariant> m_data;
+
friend class KStandardItemModel;
};
diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp
index c9d9b4271..996d0cb58 100644
--- a/src/kitemviews/kstandarditemlistwidget.cpp
+++ b/src/kitemviews/kstandarditemlistwidget.cpp
@@ -339,9 +339,16 @@ QRectF KStandardItemListWidget::textFocusRect() const
case DetailsLayout: {
QRectF rect = m_textRect;
- const TextInfo* textInfo = m_textInfo.value(m_sortedVisibleRoles.first());
+ const TextInfo* textInfo = m_textInfo.value(m_sortedVisibleRoles.first());
rect.setTop(textInfo->pos.y());
rect.setBottom(textInfo->pos.y() + textInfo->staticText.size().height());
+
+ const KItemListStyleOption& option = styleOption();
+ if (option.extendedSelectionRegion) {
+ const QString text = textInfo->staticText.text();
+ rect.setWidth(option.fontMetrics.width(text) + 2 * option.padding);
+ }
+
return rect;
}
diff --git a/src/kitemviews/kstandarditemmodel.cpp b/src/kitemviews/kstandarditemmodel.cpp
index 76b2ad09a..86ef9563b 100644
--- a/src/kitemviews/kstandarditemmodel.cpp
+++ b/src/kitemviews/kstandarditemmodel.cpp
@@ -38,6 +38,8 @@ void KStandardItemModel::insertItem(int index, KStandardItem* item)
m_indexesForItems.insert(item, index);
item->m_model = this;
// TODO: no hierarchical items are handled yet
+
+ emit itemsInserted(KItemRangeList() << KItemRange(index, 1));
}
}
@@ -77,12 +79,11 @@ int KStandardItemModel::count() const
QHash<QByteArray, QVariant> KStandardItemModel::data(int index) const
{
- // TODO: Ugly hack
- QHash<QByteArray, QVariant> values;
const KStandardItem* item = m_items[index];
- values.insert("text", item->text());
- values.insert("iconName", item->icon().name());
- return values;
+ if (item) {
+ return item->data();
+ }
+ return QHash<QByteArray, QVariant>();
}
bool KStandardItemModel::setData(int index, const QHash<QByteArray, QVariant>& values)
diff --git a/src/panels/folders/folderspanel.cpp b/src/panels/folders/folderspanel.cpp
index 5e8286cdc..9b22aa5a0 100644
--- a/src/panels/folders/folderspanel.cpp
+++ b/src/panels/folders/folderspanel.cpp
@@ -173,7 +173,7 @@ void FoldersPanel::slotItemActivated(int index)
{
const KFileItem item = m_model->fileItem(index);
if (!item.isNull()) {
- emit changeUrl(item.url(), Qt::LeftButton);
+ emit folderActivated(item.url());
}
}
@@ -181,7 +181,7 @@ void FoldersPanel::slotItemMiddleClicked(int index)
{
const KFileItem item = m_model->fileItem(index);
if (!item.isNull()) {
- emit changeUrl(item.url(), Qt::MiddleButton);
+ emit folderMiddleClicked(item.url());
}
}
diff --git a/src/panels/folders/folderspanel.h b/src/panels/folders/folderspanel.h
index b21ecabad..a14c7d4d0 100644
--- a/src/panels/folders/folderspanel.h
+++ b/src/panels/folders/folderspanel.h
@@ -51,10 +51,8 @@ public:
void rename(const KFileItem& item);
signals:
- /**
- * Is emitted if the an URL change is requested.
- */
- void changeUrl(const KUrl& url, Qt::MouseButtons buttons);
+ void folderActivated(const KUrl& url);
+ void folderMiddleClicked(const KUrl& url);
protected:
/** @see Panel::urlChanged() */
diff --git a/src/panels/places/placespanel.cpp b/src/panels/places/placespanel.cpp
index 4ac822760..5ea4b971c 100644
--- a/src/panels/places/placespanel.cpp
+++ b/src/panels/places/placespanel.cpp
@@ -1,6 +1,9 @@
/***************************************************************************
* Copyright (C) 2008-2012 by Peter Penz <[email protected]> *
- * Copyright (C) 2010 by Christian Muehlhaeuser <[email protected]> *
+ * *
+ * Based on KFilePlacesModel from kdelibs: *
+ * Copyright (C) 2007 Kevin Ottens <[email protected]> *
+ * Copyright (C) 2007 David Faure <[email protected]> *
* *
* 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 *
@@ -20,12 +23,18 @@
#include "placespanel.h"
+#include <KBookmark>
+#include <KBookmarkGroup>
+#include <KBookmarkManager>
+#include <KComponentData>
+#include <KDebug>
#include <KIcon>
#include <kitemviews/kitemlistcontainer.h>
#include <kitemviews/kitemlistcontroller.h>
#include <kitemviews/kstandarditem.h>
#include <kitemviews/kstandarditemlistview.h>
#include <kitemviews/kstandarditemmodel.h>
+#include <KStandardDirs>
#include <views/draganddrophelper.h>
#include <QVBoxLayout>
#include <QShowEvent>
@@ -33,7 +42,9 @@
PlacesPanel::PlacesPanel(QWidget* parent) :
Panel(parent),
m_controller(0),
- m_model(0)
+ m_model(0),
+ m_availableDevices(),
+ m_bookmarkManager(0)
{
}
@@ -57,17 +68,17 @@ 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.
- KStandardItemListView* view = new KStandardItemListView();
+ const QString file = KStandardDirs::locateLocal("data", "kfileplaces/bookmarks.xml");
+ m_bookmarkManager = KBookmarkManager::managerForFile(file, "kfileplaces");
m_model = new KStandardItemModel(this);
- m_model->appendItem(new KStandardItem("Temporary"));
- m_model->appendItem(new KStandardItem("out of"));
- m_model->appendItem(new KStandardItem("order. Press"));
- m_model->appendItem(new KStandardItem("F9 and use"));
- m_model->appendItem(new KStandardItem("the left icon"));
- m_model->appendItem(new KStandardItem("of the location"));
- m_model->appendItem(new KStandardItem("bar instead."));
+ loadBookmarks();
+
+ KStandardItemListView* view = new KStandardItemListView();
m_controller = new KItemListController(m_model, view, this);
+ m_controller->setSelectionBehavior(KItemListController::SingleSelection);
+ connect(m_controller, SIGNAL(itemActivated(int)), this, SLOT(slotItemActivated(int)));
+ connect(m_controller, SIGNAL(itemMiddleClicked(int)), this, SLOT(slotItemMiddleClicked(int)));
KItemListContainer* container = new KItemListContainer(m_controller, this);
container->setEnabledFrame(false);
@@ -80,10 +91,57 @@ void PlacesPanel::showEvent(QShowEvent* event)
Panel::showEvent(event);
}
+void PlacesPanel::slotItemActivated(int index)
+{
+ const KStandardItem* item = m_model->item(index);
+ if (item) {
+ const KUrl url = item->dataValue("url").value<KUrl>();
+ emit placeActivated(url);
+ }
+}
+
+void PlacesPanel::slotItemMiddleClicked(int index)
+{
+ const KStandardItem* item = m_model->item(index);
+ if (item) {
+ const KUrl url = item->dataValue("url").value<KUrl>();
+ emit placeMiddleClicked(url);
+ }
+}
+
void PlacesPanel::slotUrlsDropped(const KUrl& dest, QDropEvent* event, QWidget* parent)
{
Q_UNUSED(parent);
DragAndDropHelper::dropUrls(KFileItem(), dest, event);
}
+void PlacesPanel::loadBookmarks()
+{
+ KBookmarkGroup root = m_bookmarkManager->root();
+ KBookmark bookmark = root.first();
+ QSet<QString> devices = m_availableDevices;
+
+ while (!bookmark.isNull()) {
+ const QString udi = bookmark.metaDataItem("UDI");
+ const QString appName = bookmark.metaDataItem("OnlyInApp");
+ const bool deviceAvailable = devices.remove(udi);
+
+ const bool allowedHere = appName.isEmpty() || (appName == KGlobal::mainComponent().componentName());
+
+ if ((udi.isEmpty() && allowedHere) || deviceAvailable) {
+ KStandardItem* item = new KStandardItem();
+ item->setIcon(KIcon(bookmark.icon()));
+ item->setText(bookmark.text());
+ item->setDataValue("address", bookmark.address());
+ item->setDataValue("url", bookmark.url());
+ if (deviceAvailable) {
+ item->setDataValue("udi", udi);
+ }
+ m_model->appendItem(item);
+ }
+
+ bookmark = root.next(bookmark);
+ }
+}
+
#include "placespanel.moc"
diff --git a/src/panels/places/placespanel.h b/src/panels/places/placespanel.h
index 1c46cd57d..80cb732f0 100644
--- a/src/panels/places/placespanel.h
+++ b/src/panels/places/placespanel.h
@@ -22,7 +22,9 @@
#define PLACESPANEL_H
#include <panels/panel.h>
+#include <QSet>
+class KBookmarkManager;
class KItemListController;
class KStandardItemModel;
@@ -37,16 +39,27 @@ public:
PlacesPanel(QWidget* parent);
virtual ~PlacesPanel();
+signals:
+ void placeActivated(const KUrl& url);
+ void placeMiddleClicked(const KUrl& url);
+
protected:
virtual bool urlChanged();
virtual void showEvent(QShowEvent* event);
private slots:
+ void slotItemActivated(int index);
+ void slotItemMiddleClicked(int index);
void slotUrlsDropped(const KUrl& dest, QDropEvent* event, QWidget* parent);
private:
+ void loadBookmarks();
+
+private:
KItemListController* m_controller;
KStandardItemModel* m_model;
+ QSet<QString> m_availableDevices;
+ KBookmarkManager* m_bookmarkManager;
};
#endif // PLACESPANEL_H