panels/places/placespanel.cpp
panels/places/placesitemeditdialog.cpp
panels/places/placesitemlistgroupheader.cpp
+ panels/places/placesitemlistwidget.cpp
panels/places/placesitemmodel.cpp
panels/panel.cpp
panels/folders/treeviewcontextmenu.cpp
return role == "size";
}
+bool KFileItemListWidget::isHidden() const
+{
+ return data().value("text").toString().startsWith(QLatin1Char('.'));
+}
+
#include "kfileitemlistwidget.moc"
protected:
virtual bool isRoleRightAligned(const QByteArray& role) const;
+ virtual bool isHidden() const;
};
#endif
bool startMovingAnim = false;
- // When having a grid the moving-animation should only be started, if it is done within
- // one row in the vertical scroll-orientation or one column in the horizontal scroll-orientation.
- // Otherwise instead of a moving-animation a create-animation on the new position will be used
- // instead. This is done to prevent overlapping (and confusing) moving-animations.
- const int index = widget->index();
- const Cell cell = m_visibleCells.value(index);
- if (cell.column >= 0 && cell.row >= 0) {
- if (scrollOrientation() == Qt::Vertical) {
- startMovingAnim = (cell.row == m_layouter->itemRow(index));
- } else {
- startMovingAnim = (cell.column == m_layouter->itemColumn(index));
+ if (m_itemSize.isEmpty()) {
+ // The items are not aligned in a grid but either as columns or rows.
+ startMovingAnim = !supportsItemExpanding();
+ } else {
+ // When having a grid the moving-animation should only be started, if it is done within
+ // one row in the vertical scroll-orientation or one column in the horizontal scroll-orientation.
+ // Otherwise instead of a moving-animation a create-animation on the new position will be used
+ // instead. This is done to prevent overlapping (and confusing) moving-animations.
+ const int index = widget->index();
+ const Cell cell = m_visibleCells.value(index);
+ if (cell.column >= 0 && cell.row >= 0) {
+ if (scrollOrientation() == Qt::Vertical) {
+ startMovingAnim = (cell.row == m_layouter->itemRow(index));
+ } else {
+ startMovingAnim = (cell.column == m_layouter->itemColumn(index));
+ }
}
}
bool KItemListView::animateChangedItemCount(int changedItemCount) const
{
+ if (m_itemSize.isEmpty()) {
+ // We have only columns or only rows, but no grid: An animation is usually
+ // welcome when inserting or removing items.
+ return !supportsItemExpanding();
+ }
+
if (m_layouter->size().isEmpty() || m_layouter->itemSize().isEmpty()) {
return false;
}
setText(text);
}
+KStandardItem::KStandardItem(const KStandardItem& item) :
+ m_parent(item.m_parent),
+ m_children(item.m_children),
+ m_model(item.m_model),
+ m_data(item.m_data)
+{
+}
+
KStandardItem::~KStandardItem()
{
}
return m_parent;
}
+void KStandardItem::setData(const QHash<QByteArray, QVariant>& values)
+{
+ m_data = values;
+}
+
QHash<QByteArray, QVariant> KStandardItem::data() const
{
return m_data;
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 KStandardItem& item);
virtual ~KStandardItem();
/**
void setParent(KStandardItem* parent);
KStandardItem* parent() const;
+ void setData(const QHash<QByteArray, QVariant>& values);
QHash<QByteArray, QVariant> data() const;
+
QList<KStandardItem*> children() const;
private:
return false;
}
+bool KStandardItemListWidget::isHidden() const
+{
+ return false;
+}
+
void KStandardItemListWidget::setTextColor(const QColor& color)
{
if (color != m_customTextColor) {
const QHash<QByteArray, QVariant> values = data();
m_isExpandable = m_supportsItemExpanding && values["isExpandable"].toBool();
- m_isHidden = values["text"].toString().startsWith(QLatin1Char('.'));
+ m_isHidden = isHidden();
updateExpansionArea();
updateTextsCache();
*/
virtual bool isRoleRightAligned(const QByteArray& role) const;
+ /**
+ * @return True if the item should be visually marked as hidden item. Per default
+ * false is returned.
+ */
+ virtual bool isHidden() const;
+
void setTextColor(const QColor& color);
QColor textColor() const;
void KStandardItemModel::insertItem(int index, KStandardItem* item)
{
- if (!m_indexesForItems.contains(item) && !item->m_model) {
+ if (item && !m_indexesForItems.contains(item) && !item->m_model) {
+ item->m_model = this;
m_items.insert(index, item);
m_indexesForItems.insert(item, index);
- item->m_model = this;
// TODO: no hierarchical items are handled yet
+ onItemInserted(index);
emit itemsInserted(KItemRangeList() << KItemRange(index, 1));
}
}
void KStandardItemModel::replaceItem(int index, KStandardItem* item)
{
- if (index >= 0 && index < count()) {
+ if (item && index >= 0 && index < count() && !item->m_model) {
+ item->m_model = this;
+
QSet<QByteArray> changedRoles;
KStandardItem* oldItem= m_items[index];
m_items[index] = item;
m_indexesForItems.insert(item, index);
+ onItemReplaced(index);
emit itemsChanged(KItemRangeList() << KItemRange(index, 1), changedRoles);
} else {
kWarning() << "No item available to replace on the given index" << index;
}
}
-void KStandardItemModel::appendItem(KStandardItem *item)
-{
- insertItem(m_items.count(), item);
-}
-
void KStandardItemModel::removeItem(int index)
{
if (index >= 0 && index < count()) {
delete item;
item = 0;
+ onItemRemoved(index);
emit itemsRemoved(KItemRangeList() << KItemRange(index, 1));
// TODO: no hierarchical items are handled yet
}
return m_indexesForItems.value(item, -1);
}
+void KStandardItemModel::appendItem(KStandardItem *item)
+{
+ insertItem(m_items.count(), item);
+}
+
int KStandardItemModel::count() const
{
return m_items.count();
return groups;
}
+void KStandardItemModel::onItemInserted(int index)
+{
+ Q_UNUSED(index);
+}
+
+void KStandardItemModel::onItemReplaced(int index)
+{
+ Q_UNUSED(index);
+}
+
+void KStandardItemModel::onItemRemoved(int index)
+{
+ Q_UNUSED(index);
+}
+
+
#include "kstandarditemmodel.moc"
explicit KStandardItemModel(QObject* parent = 0);
virtual ~KStandardItemModel();
+ /**
+ * Inserts the item \a item at the index \a index. If the index
+ * is equal to the number of items of the model, the item
+ * gets appended as last element. KStandardItemModel takes
+ * the ownership of the item.
+ */
void insertItem(int index, KStandardItem* item);
+
+ /**
+ * Replaces the item on the index \a index by \a item.
+ * KStandardItemModel takes the ownership of the item. The
+ * old item gets deleted.
+ */
void replaceItem(int index, KStandardItem* item);
- void appendItem(KStandardItem* item);
+
void removeItem(int index);
KStandardItem* item(int index) const;
int index(const KStandardItem* item) const;
+ /**
+ * Convenience method for insertItem(count(), item).
+ */
+ void appendItem(KStandardItem* item);
+
virtual int count() const;
virtual QHash<QByteArray, QVariant> data(int index) const;
virtual bool setData(int index, const QHash<QByteArray, QVariant>& values);
virtual QString roleDescription(const QByteArray& role) const;
virtual QList<QPair<int, QVariant> > groups() const;
+protected:
+ /**
+ * Is invoked after an item has been inserted and before the signal
+ * itemsInserted() gets emitted.
+ */
+ virtual void onItemInserted(int index);
+
+ /**
+ * Is invoked after an item has been replaced and before the signal
+ * itemsChanged() gets emitted.
+ */
+ virtual void onItemReplaced(int index);
+
+ /**
+ * Is invoked after an item has been removed and before the signal
+ * itemsRemoved() gets emitted.
+ */
+ virtual void onItemRemoved(int index);
+
private:
QList<KStandardItem*> m_items;
QHash<const KStandardItem*, int> m_indexesForItems;
--- /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 *
+ ***************************************************************************/
+
+#include "placesitemlistwidget.h"
+
+PlacesItemListWidget::PlacesItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent) :
+ KStandardItemListWidget(informant, parent)
+{
+}
+
+PlacesItemListWidget::~PlacesItemListWidget()
+{
+}
+
+bool PlacesItemListWidget::isHidden() const
+{
+ return data().value("isHidden").toBool();
+}
+
+#include "placesitemlistwidget.moc"
--- /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 PLACESITEMLISTWIDGET_H
+#define PLACESITEMLISTWIDGET_H
+
+#include <kitemviews/kstandarditemlistwidget.h>
+
+class PlacesItemListWidget : public KStandardItemListWidget
+{
+ Q_OBJECT
+
+public:
+ PlacesItemListWidget(KItemListWidgetInformant* informant, QGraphicsItem* parent);
+ virtual ~PlacesItemListWidget();
+
+protected:
+ virtual bool isHidden() const;
+};
+
+#endif
+
+
m_availableDevices(),
m_bookmarkManager(0),
m_systemBookmarks(),
- m_systemBookmarksIndexes()
+ m_systemBookmarksIndexes(),
+ m_hiddenItems()
{
#ifdef HAVE_NEPOMUK
m_nepomukRunning = (Nepomuk::ResourceManager::instance()->initialized());
PlacesItemModel::~PlacesItemModel()
{
+ qDeleteAll(m_hiddenItems);
+ m_hiddenItems.clear();
}
int PlacesItemModel::hiddenCount() const
{
- return 0;
+ int itemCount = 0;
+ foreach (const KStandardItem* item, m_hiddenItems) {
+ if (item) {
+ ++itemCount;
+ }
+ }
+
+ return itemCount;
+}
+
+void PlacesItemModel::setItemHidden(int index, bool hide)
+{
+ if (index >= 0 && index < count()) {
+ KStandardItem* shownItem = this->item(index);
+ shownItem->setDataValue("isHidden", hide);
+ if (!m_hiddenItemsShown && hide) {
+ KStandardItem* hiddenItem = new KStandardItem(*shownItem);
+ removeItem(index);
+ index = hiddenIndex(index);
+ Q_ASSERT(!m_hiddenItems[index]);
+ m_hiddenItems[index] = hiddenItem;
+ }
+ }
+}
+
+bool PlacesItemModel::isItemHidden(int index) const
+{
+ return (index >= 0 && index < count()) ? m_hiddenItems[index] != 0 : false;
}
void PlacesItemModel::setHiddenItemsShown(bool show)
return 0;
}
+void PlacesItemModel::onItemInserted(int index)
+{
+ m_hiddenItems.insert(hiddenIndex(index), 0);
+}
+
+void PlacesItemModel::onItemRemoved(int index)
+{
+ const int removeIndex = hiddenIndex(index);
+ Q_ASSERT(!m_hiddenItems[removeIndex]);
+ m_hiddenItems.removeAt(removeIndex);
+}
+
void PlacesItemModel::loadBookmarks()
{
KBookmarkGroup root = m_bookmarkManager->root();
item->setGroup(i18nc("@item", "Places"));
}
- appendItem(item);
+ if (bookmark.metaDataItem("IsHidden") == QLatin1String("true")) {
+ m_hiddenItems.append(item);
+ } else {
+ appendItem(item);
+ }
}
bookmark = root.next(bookmark);
}
}
+int PlacesItemModel::hiddenIndex(int index) const
+{
+ int hiddenIndex = 0;
+ int visibleItemIndex = 0;
+ while (visibleItemIndex < index && hiddenIndex < m_hiddenItems.count()) {
+ if (!m_hiddenItems[hiddenIndex]) {
+ ++visibleItemIndex;
+ }
+ ++hiddenIndex;
+ }
+
+ return hiddenIndex;
+}
+
QString PlacesItemModel::placesGroupName()
{
return i18nc("@item", "Places");
int hiddenCount() const;
+ void setItemHidden(int index, bool hide);
+ 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.)
QAction* ejectAction(int index) const;
QAction* tearDownAction(int index) const;
+protected:
+ virtual void onItemInserted(int index);
+ virtual void onItemRemoved(int index);
+
private:
void loadBookmarks();
void createSystemBookmarks();
+ int hiddenIndex(int index) const;
+
static QString placesGroupName();
static QString recentlyAccessedGroupName();
static QString searchForGroupName();
QList<SystemBookmarkData> m_systemBookmarks;
QHash<KUrl, int> m_systemBookmarksIndexes;
+
+ QList<KStandardItem*> m_hiddenItems;
};
#endif
#include <KNotification>
#include "placesitemeditdialog.h"
#include "placesitemlistgroupheader.h"
+#include "placesitemlistwidget.h"
#include "placesitemmodel.h"
#include <views/draganddrophelper.h>
#include <QVBoxLayout>
m_model->setSortRole("group");
KStandardItemListView* view = new KStandardItemListView();
+ view->setWidgetCreator(new KItemListWidgetCreator<PlacesItemListWidget>());
view->setGroupHeaderCreator(new KItemListGroupHeaderCreator<PlacesItemListGroupHeader>());
m_controller = new KItemListController(m_model, view, this);
QAction* hideAction = menu.addAction(i18nc("@item:inmenu", "Hide Entry '%1'", label));
hideAction->setCheckable(true);
- //hideEntry->setChecked(data.value("hidden").toBool());
+ hideAction->setChecked(data.value("isHidden").toBool());
QAction* showAllAction = 0;
if (m_model->hiddenCount() > 0) {
}
showAllAction = menu.addAction(i18nc("@item:inmenu", "Show All Entries"));
showAllAction->setCheckable(true);
- //showAllEntries->setChecked(showAll)
+ showAllAction->setChecked(m_model->hiddenItemsShown());
}
QAction* removeAction = 0;
} else if (action == removeAction) {
m_model->removeItem(index);
} else if (action == hideAction) {
+ m_model->setItemHidden(index, hideAction->isChecked());
} else if (action == showAllAction) {
+ m_model->setHiddenItemsShown(showAllAction->isChecked());
} else if (action == tearDownAction) {
} else if (action == ejectAction) {
}