X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d9f9e69ce1bdd6f898ee21cb2f14607bd90fa07b..7f4e9d9ed908eaa10659cbd04f53a82e28e8a59b:/src/kitemviews/kitemlistview.h diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index 3ddfabde6..9c34daba3 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -25,6 +25,7 @@ #include +#include #include #include #include @@ -33,7 +34,6 @@ #include class KItemListController; -class KItemListGroupHeader; class KItemListGroupHeaderCreatorBase; class KItemListHeader; class KItemListSizeHintResolver; @@ -101,11 +101,11 @@ public: bool autoScroll() const; /** - * Turns on the header if \p show is true. Per default the - * header is not shown. + * If set to true selection-toggles will be shown when hovering + * an item. Per default the selection-toggles are disabled. */ - void setHeaderShown(bool show); - bool isHeaderShown() const; + void setEnabledSelectionToggles(bool enabled); + bool enabledSelectionToggles() const; /** * @return Controller of the item-list. The controller gets @@ -169,24 +169,50 @@ public: virtual QHash visibleRolesSizes(const KItemRangeList& itemRanges) const; /** - * @return The bounding rectangle of the item relative to the top/left of + * @return True if the view supports the expanding of items. Per default false + * is returned. If expanding of items is supported, the methods + * KItemModelBase::setExpanded(), KItemModelBase::isExpanded() and + * KItemModelBase::isExpandable() must be reimplemented. The view-implementation + * has to take care itself how to visually represent the expanded items provided + * by the model. + */ + virtual bool supportsItemExpanding() const; + + /** + * @return The rectangle of the item relative to the top/left of * the currently visible area (see KItemListView::offset()). */ - QRectF itemBoundingRect(int index) const; + QRectF itemRect(int index) const; /** - * @return The number of items that can be shown in parallel for one offset. - * Assuming the scrolldirection is vertical then a value of 4 means - * that 4 columns for items are available. Assuming the scrolldirection - * is horizontal then a value of 4 means that 4 lines for items are - * available. + * @return The context rectangle of the item relative to the top/left of + * the currently visible area (see KItemListView::offset()). The + * context rectangle is defined by by the united rectangle of + * the icon rectangle and the text rectangle (see KItemListWidget::iconRect() + * and KItemListWidget::textRect()) and is useful as reference for e.g. aligning + * a tooltip or a context-menu for an item. Note that a context rectangle will + * only be returned for (at least partly) visible items. An empty rectangle will + * be returned for fully invisible items. */ - int itemsPerOffset() const; + QRectF itemContextRect(int index) const; + + /** + * Scrolls to the item with the index \a index so that the item + * will be fully visible. + */ + void scrollToItem(int index); void beginTransaction(); void endTransaction(); bool isTransactionActive() const; + /** + * Turns on the header if \p show is true. Per default the + * header is not shown. + */ + void setHeaderShown(bool show); + bool isHeaderShown() const; + /** * @return Pixmap that is used for a drag operation based on the * items given by \a indexes. The default implementation returns @@ -207,6 +233,24 @@ signals: void maximumItemOffsetChanged(qreal current, qreal previous); void scrollTo(qreal newOffset); + /** + * Is emitted if the user has changed the sort order by clicking on a + * header item (see KItemListView::setHeaderShown()). The sort order + * of the model has already been adjusted to + * the current sort order. Note that no signal will be emitted if the + * sort order of the model has been changed without user interaction. + */ + void sortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); + + /** + * Is emitted if the user has changed the sort role by clicking on a + * header item (see KItemListView::setHeaderShown()). The sort role + * of the model has already been adjusted to + * the current sort role. Note that no signal will be emitted if the + * sort role of the model has been changed without user interaction. + */ + void sortRoleChanged(const QByteArray& current, const QByteArray& previous); + protected: virtual void initializeItemListWidget(KItemListWidget* item); @@ -242,9 +286,6 @@ protected: QList visibleItemListWidgets() const; - /** @reimp */ - virtual void resizeEvent(QGraphicsSceneResizeEvent* event); - protected slots: virtual void slotItemsInserted(const KItemRangeList& itemRanges); virtual void slotItemsRemoved(const KItemRangeList& itemRanges); @@ -252,9 +293,13 @@ protected slots: virtual void slotItemsChanged(const KItemRangeList& itemRanges, const QSet& roles); + virtual void slotGroupedSortingChanged(bool current); + virtual void slotSortOrderChanged(Qt::SortOrder current, Qt::SortOrder previous); + virtual void slotSortRoleChanged(const QByteArray& current, const QByteArray& previous); + virtual void slotCurrentChanged(int current, int previous); + virtual void slotSelectionChanged(const QSet& current, const QSet& previous); + private slots: - void slotCurrentChanged(int current, int previous); - void slotSelectionChanged(const QSet& current, const QSet& previous); void slotAnimationFinished(QGraphicsWidget* widget, KItemListViewAnimation::AnimationType type); void slotLayoutTimerFinished(); @@ -297,26 +342,33 @@ private: KItemListRubberBand* rubberBand() const; - void updateLayout(); - void doLayout(LayoutAnimationHint hint, int changedIndex, int changedCount); - void doGroupHeadersLayout(LayoutAnimationHint hint, int changedIndex, int changedCount); + void doLayout(LayoutAnimationHint hint, int changedIndex = 0, int changedCount = 0); + + /** + * Helper method for doLayout: Returns a list of items that can be reused for the visible + * area. Invisible group headers get recycled. The reusable items are items that are + * invisible. If the animation hint is 'Animation' then items that are currently animated + * won't be reused. Reusing items is faster in comparison to deleting invisible + * items and creating a new instance for visible items. + */ + QList recycleInvisibleItems(int firstVisibleIndex, + int lastVisibleIndex, + LayoutAnimationHint hint); + + /** + * Helper method for doLayout: Starts a moving-animation for the widget to the given + * new position. The moving-animation is only started if the new position is within + * the same row or column, otherwise the create-animation is used instead. + * @return True if the moving-animation has been applied. + */ + bool moveWidget(KItemListWidget* widget, const QRectF& itemBounds); + void emitOffsetChanges(); KItemListWidget* createWidget(int index); void recycleWidget(KItemListWidget* widget); void setWidgetIndex(KItemListWidget* widget, int index); - /** - * Helper method for setGeometry() and setItemSize(): Calling both methods might result - * in a changed number of visible items. To assure that currently invisible items can - * get animated from the old position to the new position prepareLayoutForIncreasedItemCount() - * takes care to create all item widgets that are visible with the old or the new size. - * @param size Size of the layouter or the item dependent on \p sizeType. - * @param sizeType LayouterSize: KItemListLayouter::setSize() is used. - * ItemSize: KItemListLayouter::setItemSize() is used. - */ - void prepareLayoutForIncreasedItemCount(const QSizeF& size, SizeType sizeType); - /** * Helper method for prepareLayoutForIncreasedItemCount(). */ @@ -329,10 +381,29 @@ private: void updateWidgetProperties(KItemListWidget* widget, int index); /** - * Updates the width of the KItemListHeader corresponding to the required width of - * the roles. + * Helper method for createWidget() and setWidgetIndex() to create or update + * the itemlist group-header. + */ + void updateGroupHeaderForWidget(KItemListWidget* widget); + + /** + * Updates the position and size of the group-header that belongs + * to the itemlist widget \a widget. The given widget must represent + * the first item of a group. + */ + void updateGroupHeaderLayout(KItemListWidget* widget); + + /** + * Recycles the group-header from the widget. + */ + void recycleGroupHeaderForWidget(KItemListWidget* widget); + + /** + * Helper method for slotGroupedSortingChanged(), slotSortOrderChanged() + * and slotSortRoleChanged(): Iterates through all visible items and updates + * the group-header widgets. */ - void updateHeaderWidth(); + void updateVisibleGroupHeaders(); /** * @return The widths of each visible role that is shown in the KItemListHeader. @@ -359,6 +430,37 @@ private: */ void updateStretchedVisibleRolesSizes(); + /** + * @return Sum of the widths of all visible roles. + */ + qreal visibleRolesSizesWidthSum() const; + + /** + * @return Sum of the heights of all visible roles. + */ + qreal visibleRolesSizesHeightSum() const; + + /** + * @return Boundaries of the header. An empty rectangle is returned + * if no header is shown. + */ + QRectF headerBoundaries() const; + + /** + * @return True if the number of columns or rows will be changed when applying + * the new grid- and item-size. Used to determine whether an animation + * should be done when applying the new layout. + */ + bool changesItemGridLayout(const QSizeF& newGridSize, const QSizeF& newItemSize) const; + + /** + * @param changedItemCount Number of inserted or removed items. + * @return True if the inserting or removing of items should be animated. + * No animation should be done if the number of items is too large + * to provide a pleasant animation. + */ + bool animateChangedItemCount(int changedItemCount) const; + /** * Helper function for triggerAutoScrolling(). * @param pos Logical position of the mouse relative to the range. @@ -372,6 +474,7 @@ private: static int calculateAutoScrollingIncrement(int pos, int range, int oldInc); private: + bool m_enabledSelectionToggles; bool m_grouped; int m_activeTransactions; // Counter for beginTransaction()/endTransaction() @@ -410,6 +513,7 @@ private: bool m_useHeaderWidths; friend class KItemListController; + friend class KItemListControllerTest; }; /** @@ -450,7 +554,7 @@ public: }; template -class LIBDOLPHINPRIVATE_EXPORT KItemListWidgetCreator : public KItemListWidgetCreatorBase +class KItemListWidgetCreator : public KItemListWidgetCreatorBase { public: virtual ~KItemListWidgetCreator(); @@ -485,16 +589,16 @@ class LIBDOLPHINPRIVATE_EXPORT KItemListGroupHeaderCreatorBase : public KItemLis { public: virtual ~KItemListGroupHeaderCreatorBase(); - virtual KItemListGroupHeader* create(QGraphicsWidget* parent) = 0; + virtual KItemListGroupHeader* create(KItemListView* view) = 0; virtual void recycle(KItemListGroupHeader* header); }; template -class LIBDOLPHINPRIVATE_EXPORT KItemListGroupHeaderCreator : public KItemListGroupHeaderCreatorBase +class KItemListGroupHeaderCreator : public KItemListGroupHeaderCreatorBase { public: virtual ~KItemListGroupHeaderCreator(); - virtual KItemListGroupHeader* create(QGraphicsWidget* parent); + virtual KItemListGroupHeader* create(KItemListView* view); }; template @@ -503,11 +607,11 @@ KItemListGroupHeaderCreator::~KItemListGroupHeaderCreator() } template -KItemListGroupHeader* KItemListGroupHeaderCreator::create(QGraphicsWidget* parent) +KItemListGroupHeader* KItemListGroupHeaderCreator::create(KItemListView* view) { KItemListGroupHeader* widget = static_cast(popRecycleableWidget()); if (!widget) { - widget = new T(parent); + widget = new T(view); addCreatedWidget(widget); } return widget;