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:
Peter Penz 2012-05-14 22:08:32 +02:00
parent f74c72b965
commit d47d83c9ae
4 changed files with 105 additions and 93 deletions

View file

@ -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());

View file

@ -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,

View file

@ -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

View file

@ -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;