mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-19 16:31:21 +00:00
Let the places-item determine the group itself
Related improvements: When loading the bookmarks assure in any case that items having the same group are inserted as one single group.
This commit is contained in:
parent
f74c72b965
commit
d47d83c9ae
|
@ -124,10 +124,18 @@ void PlacesItem::setBookmark(const KBookmark& bookmark)
|
|||
setText(bookmark.description());
|
||||
setUrl(bookmark.url());
|
||||
setDataValue("address", bookmark.address());
|
||||
setGroup(i18nc("@item", "Places"));
|
||||
} else {
|
||||
initializeDevice(udi);
|
||||
}
|
||||
|
||||
switch (groupType()) {
|
||||
case PlacesType: setGroup(i18nc("@item", "Places")); break;
|
||||
case RecentlyAccessedType: setGroup(i18nc("@item", "Recently Accessed")); break;
|
||||
case SearchForType: setGroup(i18nc("@item", "Search For")); break;
|
||||
case DevicesType: setGroup(i18nc("@item", "Devices")); break;
|
||||
default: Q_ASSERT(false); break;
|
||||
}
|
||||
|
||||
setHidden(bookmark.metaDataItem("IsHidden") == QLatin1String("true"));
|
||||
}
|
||||
|
||||
|
@ -136,6 +144,24 @@ KBookmark PlacesItem::bookmark() const
|
|||
return m_bookmark;
|
||||
}
|
||||
|
||||
PlacesItem::GroupType PlacesItem::groupType() const
|
||||
{
|
||||
if (udi().isEmpty()) {
|
||||
const QString protocol = url().protocol();
|
||||
if (protocol == QLatin1String("timeline")) {
|
||||
return RecentlyAccessedType;
|
||||
}
|
||||
|
||||
if (protocol == QLatin1String("search")) {
|
||||
return SearchForType;
|
||||
}
|
||||
|
||||
return PlacesType;
|
||||
}
|
||||
|
||||
return DevicesType;
|
||||
}
|
||||
|
||||
KBookmark PlacesItem::createBookmark(KBookmarkManager* manager,
|
||||
const QString& text,
|
||||
const KUrl& url,
|
||||
|
@ -208,7 +234,6 @@ void PlacesItem::initializeDevice(const QString& udi)
|
|||
setIcon(m_device.icon());
|
||||
setIconOverlays(m_device.emblems());
|
||||
setUdi(udi);
|
||||
setGroup(i18nc("@item", "Devices"));
|
||||
|
||||
if (m_access) {
|
||||
setUrl(m_access->filePath());
|
||||
|
|
|
@ -38,6 +38,14 @@ class PlacesItem : public KStandardItem
|
|||
{
|
||||
|
||||
public:
|
||||
enum GroupType
|
||||
{
|
||||
PlacesType,
|
||||
SearchForType,
|
||||
RecentlyAccessedType,
|
||||
DevicesType
|
||||
};
|
||||
|
||||
explicit PlacesItem(const KBookmark& bookmark, PlacesItem* parent = 0);
|
||||
explicit PlacesItem(const PlacesItem& item);
|
||||
virtual ~PlacesItem();
|
||||
|
@ -59,6 +67,8 @@ public:
|
|||
void setBookmark(const KBookmark& bookmark);
|
||||
KBookmark bookmark() const;
|
||||
|
||||
GroupType groupType() const;
|
||||
|
||||
static KBookmark createBookmark(KBookmarkManager* manager,
|
||||
const QString& text,
|
||||
const KUrl& url,
|
||||
|
|
|
@ -89,9 +89,7 @@ PlacesItem* PlacesItemModel::createPlacesItem(const QString& text,
|
|||
const QString& iconName)
|
||||
{
|
||||
const KBookmark bookmark = PlacesItem::createBookmark(m_bookmarkManager, text, url, iconName);
|
||||
PlacesItem* item = new PlacesItem(bookmark);
|
||||
item->setGroup(groupName(url));
|
||||
return item;
|
||||
return new PlacesItem(bookmark);
|
||||
}
|
||||
|
||||
PlacesItem* PlacesItemModel::placesItem(int index) const
|
||||
|
@ -143,11 +141,9 @@ void PlacesItemModel::setHiddenItemsShown(bool show)
|
|||
// m_hiddenItems.
|
||||
Q_ASSERT(m_hiddenItems.count() == count());
|
||||
for (int i = count() - 1; i >= 0; --i) {
|
||||
PlacesItem* visibleItem = placesItem(i);
|
||||
const PlacesItem* visibleItem = placesItem(i);
|
||||
if (visibleItem->isHidden()) {
|
||||
PlacesItem* hiddenItem = new PlacesItem(*visibleItem);
|
||||
removeItem(i);
|
||||
m_hiddenItems.insert(i, hiddenItem);
|
||||
removeHiddenItem(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -181,21 +177,6 @@ int PlacesItemModel::closestItem(const KUrl& url) const
|
|||
return foundIndex;
|
||||
}
|
||||
|
||||
QString PlacesItemModel::groupName(const KUrl &url) const
|
||||
{
|
||||
const QString protocol = url.protocol();
|
||||
|
||||
if (protocol.contains(QLatin1String("search"))) {
|
||||
return searchForGroupName();
|
||||
}
|
||||
|
||||
if (protocol == QLatin1String("timeline")) {
|
||||
return recentlyAccessedGroupName();
|
||||
}
|
||||
|
||||
return placesGroupName();
|
||||
}
|
||||
|
||||
QAction* PlacesItemModel::ejectAction(int index) const
|
||||
{
|
||||
const PlacesItem* item = placesItem(index);
|
||||
|
@ -420,14 +401,7 @@ void PlacesItemModel::slotStorageTeardownDone(Solid::ErrorType error, const QVar
|
|||
|
||||
void PlacesItemModel::removeHiddenItem()
|
||||
{
|
||||
const PlacesItem* shownItem = placesItem(m_hiddenItemToRemove);
|
||||
const int newIndex = hiddenIndex(m_hiddenItemToRemove);
|
||||
if (shownItem && newIndex >= 0) {
|
||||
PlacesItem* hiddenItem = new PlacesItem(*shownItem);
|
||||
removeItem(m_hiddenItemToRemove);
|
||||
m_hiddenItems.insert(newIndex, hiddenItem);
|
||||
m_saveBookmarksTimer->start();
|
||||
}
|
||||
removeHiddenItem(m_hiddenItemToRemove);
|
||||
m_hiddenItemToRemove = -1;
|
||||
}
|
||||
|
||||
|
@ -449,10 +423,13 @@ void PlacesItemModel::loadBookmarks()
|
|||
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, so they are collected as separate lists.
|
||||
// The bookmarks might have a mixed order of places, devices and search-groups due
|
||||
// to the compatibility with the KFilePlacesPanel. In Dolphin's places panel the
|
||||
// items should always be collected in one group so the items are collected first
|
||||
// in separate lists before inserting them.
|
||||
QList<PlacesItem*> placesItems;
|
||||
QList<PlacesItem*> recentlyAccessedItems;
|
||||
QList<PlacesItem*> searchForItems;
|
||||
QList<PlacesItem*> devicesItems;
|
||||
|
||||
while (!bookmark.isNull()) {
|
||||
|
@ -470,8 +447,6 @@ void PlacesItemModel::loadBookmarks()
|
|||
if (deviceAvailable) {
|
||||
devicesItems.append(item);
|
||||
} else {
|
||||
placesItems.append(item);
|
||||
|
||||
if (missingSystemBookmarks.contains(url)) {
|
||||
missingSystemBookmarks.remove(url);
|
||||
|
||||
|
@ -480,7 +455,14 @@ void PlacesItemModel::loadBookmarks()
|
|||
const int index = m_systemBookmarksIndexes.value(url);
|
||||
item->setText(m_systemBookmarks[index].text);
|
||||
item->setSystemItem(true);
|
||||
item->setGroup(m_systemBookmarks[index].group);
|
||||
}
|
||||
|
||||
switch (item->groupType()) {
|
||||
case PlacesItem::PlacesType: placesItems.append(item); break;
|
||||
case PlacesItem::RecentlyAccessedType: recentlyAccessedItems.append(item); break;
|
||||
case PlacesItem::SearchForType: searchForItems.append(item); break;
|
||||
case PlacesItem::DevicesType:
|
||||
default: Q_ASSERT(false); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -488,8 +470,6 @@ void PlacesItemModel::loadBookmarks()
|
|||
bookmark = root.next(bookmark);
|
||||
}
|
||||
|
||||
addItems(placesItems);
|
||||
|
||||
if (!missingSystemBookmarks.isEmpty()) {
|
||||
// The current bookmarks don't contain all system-bookmarks. Add the missing
|
||||
// bookmarks.
|
||||
|
@ -509,12 +489,22 @@ void PlacesItemModel::loadBookmarks()
|
|||
|
||||
PlacesItem* item = new PlacesItem(bookmark);
|
||||
item->setSystemItem(true);
|
||||
item->setGroup(data.group);
|
||||
appendItem(item);
|
||||
|
||||
switch (item->groupType()) {
|
||||
case PlacesItem::PlacesType: placesItems.append(item); break;
|
||||
case PlacesItem::RecentlyAccessedType: recentlyAccessedItems.append(item); break;
|
||||
case PlacesItem::SearchForType: searchForItems.append(item); break;
|
||||
case PlacesItem::DevicesType:
|
||||
default: Q_ASSERT(false); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
addItems(placesItems);
|
||||
addItems(recentlyAccessedItems);
|
||||
addItems(searchForItems);
|
||||
|
||||
// Create items for devices that have not stored as bookmark yet
|
||||
foreach (const QString& udi, devices) {
|
||||
const KBookmark bookmark = PlacesItem::createDeviceBookmark(m_bookmarkManager, udi);
|
||||
|
@ -545,62 +535,47 @@ void PlacesItemModel::createSystemBookmarks()
|
|||
Q_ASSERT(m_systemBookmarks.isEmpty());
|
||||
Q_ASSERT(m_systemBookmarksIndexes.isEmpty());
|
||||
|
||||
const QString placesGroup = placesGroupName();
|
||||
const QString recentlyAccessedGroup = recentlyAccessedGroupName();
|
||||
const QString searchForGroup = searchForGroupName();
|
||||
const QString timeLineIcon = "package_utility_time"; // TODO: Ask the Oxygen team to create
|
||||
// a custom icon for the timeline-protocol
|
||||
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl(KUser().homeDir()),
|
||||
"user-home",
|
||||
i18nc("@item", "Home"),
|
||||
placesGroup));
|
||||
i18nc("@item", "Home")));
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("remote:/"),
|
||||
"network-workgroup",
|
||||
i18nc("@item", "Network"),
|
||||
placesGroup));
|
||||
i18nc("@item", "Network")));
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("/"),
|
||||
"folder-red",
|
||||
i18nc("@item", "Root"),
|
||||
placesGroup));
|
||||
i18nc("@item", "Root")));
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("trash:/"),
|
||||
"user-trash",
|
||||
i18nc("@item", "Trash"),
|
||||
placesGroup));
|
||||
i18nc("@item", "Trash")));
|
||||
|
||||
if (m_nepomukRunning) {
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("timeline:/today"),
|
||||
timeLineIcon,
|
||||
i18nc("@item Recently Accessed", "Today"),
|
||||
recentlyAccessedGroup));
|
||||
i18nc("@item Recently Accessed", "Today")));
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("timeline:/yesterday"),
|
||||
timeLineIcon,
|
||||
i18nc("@item Recently Accessed", "Yesterday"),
|
||||
recentlyAccessedGroup));
|
||||
i18nc("@item Recently Accessed", "Yesterday")));
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("timeline:/thismonth"),
|
||||
timeLineIcon,
|
||||
i18nc("@item Recently Accessed", "This Month"),
|
||||
recentlyAccessedGroup));
|
||||
i18nc("@item Recently Accessed", "This Month")));
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("timeline:/lastmonth"),
|
||||
timeLineIcon,
|
||||
i18nc("@item Recently Accessed", "Last Month"),
|
||||
recentlyAccessedGroup));
|
||||
i18nc("@item Recently Accessed", "Last Month")));
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("search:/documents"),
|
||||
"folder-txt",
|
||||
i18nc("@item Commonly Accessed", "Documents"),
|
||||
searchForGroup));
|
||||
i18nc("@item Commonly Accessed", "Documents")));
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("search:/images"),
|
||||
"folder-image",
|
||||
i18nc("@item Commonly Accessed", "Images"),
|
||||
searchForGroup));
|
||||
i18nc("@item Commonly Accessed", "Images")));
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("search:/audio"),
|
||||
"folder-sound",
|
||||
i18nc("@item Commonly Accessed", "Audio Files"),
|
||||
searchForGroup));
|
||||
i18nc("@item Commonly Accessed", "Audio Files")));
|
||||
m_systemBookmarks.append(SystemBookmarkData(KUrl("search:/videos"),
|
||||
"folder-video",
|
||||
i18nc("@item Commonly Accessed", "Videos"),
|
||||
searchForGroup));
|
||||
i18nc("@item Commonly Accessed", "Videos")));
|
||||
}
|
||||
|
||||
for (int i = 0; i < m_systemBookmarks.count(); ++i) {
|
||||
|
@ -647,19 +622,31 @@ int PlacesItemModel::hiddenIndex(int index) const
|
|||
return hiddenIndex >= m_hiddenItems.count() ? -1 : hiddenIndex;
|
||||
}
|
||||
|
||||
QString PlacesItemModel::placesGroupName()
|
||||
void PlacesItemModel::removeHiddenItem(int index)
|
||||
{
|
||||
return i18nc("@item", "Places");
|
||||
}
|
||||
const PlacesItem* shownItem = placesItem(index);
|
||||
const int newIndex = hiddenIndex(index);
|
||||
if (shownItem && newIndex >= 0) {
|
||||
PlacesItem* hiddenItem = new PlacesItem(*shownItem);
|
||||
const KBookmark hiddenBookmark = hiddenItem->bookmark();
|
||||
|
||||
QString PlacesItemModel::recentlyAccessedGroupName()
|
||||
{
|
||||
return i18nc("@item", "Recently Accessed");
|
||||
}
|
||||
const PlacesItem* previousItem = placesItem(index - 1);
|
||||
KBookmark previousBookmark;
|
||||
if (previousItem) {
|
||||
previousBookmark = previousItem->bookmark();
|
||||
}
|
||||
|
||||
QString PlacesItemModel::searchForGroupName()
|
||||
{
|
||||
return i18nc("@item", "Search For");
|
||||
removeItem(index);
|
||||
|
||||
// removeItem() also removed the bookmark from m_bookmarkManager in
|
||||
// PlacesItemModel::onItemRemoved(). However for hidden items the
|
||||
// bookmark should still be remembered, so readd it again:
|
||||
m_bookmarkManager->root().addBookmark(hiddenBookmark);
|
||||
m_bookmarkManager->root().moveBookmark(hiddenBookmark, previousBookmark);
|
||||
|
||||
m_hiddenItems.insert(newIndex, hiddenItem);
|
||||
m_saveBookmarksTimer->start();
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef PLACESITEMMODEL_DEBUG
|
||||
|
|
|
@ -72,12 +72,6 @@ public:
|
|||
*/
|
||||
int closestItem(const KUrl& url) const;
|
||||
|
||||
/**
|
||||
* @return Name of the group where the item with the URL
|
||||
* \a URL belongs to.
|
||||
*/
|
||||
QString groupName(const KUrl& url) const;
|
||||
|
||||
QAction* ejectAction(int index) const;
|
||||
QAction* teardownAction(int index) const;
|
||||
|
||||
|
@ -124,9 +118,7 @@ private:
|
|||
*/
|
||||
int hiddenIndex(int index) const;
|
||||
|
||||
static QString placesGroupName();
|
||||
static QString recentlyAccessedGroupName();
|
||||
static QString searchForGroupName();
|
||||
void removeHiddenItem(int index);
|
||||
|
||||
#ifdef PLACESITEMMODEL_DEBUG
|
||||
void showModelState();
|
||||
|
@ -143,14 +135,12 @@ private:
|
|||
struct SystemBookmarkData
|
||||
{
|
||||
SystemBookmarkData(const KUrl& url,
|
||||
const QString& icon,
|
||||
const QString& text,
|
||||
const QString& group) :
|
||||
url(url), icon(icon), text(text), group(group) {}
|
||||
const QString& icon,
|
||||
const QString& text) :
|
||||
url(url), icon(icon), text(text) {}
|
||||
KUrl url;
|
||||
QString icon;
|
||||
QString text;
|
||||
QString group;
|
||||
};
|
||||
|
||||
QList<SystemBookmarkData> m_systemBookmarks;
|
||||
|
|
Loading…
Reference in a new issue