X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d80e9db9fb801bb5230c5b80190e5630bd738823..7a593fc92bf28fbdcdec0e241e18ee8ba2ad7334:/src/kitemviews/kitemlistview.h diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index 4455166dd..cf6f27c03 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -25,22 +25,24 @@ #include -#include +#include #include -#include #include #include +#include #include #include class KItemListController; class KItemListGroupHeaderCreatorBase; class KItemListHeader; +class KItemListHeaderWidget; class KItemListSizeHintResolver; class KItemListRubberBand; class KItemListViewAnimation; class KItemListViewLayouter; class KItemListWidget; +class KItemListWidgetInformant; class KItemListWidgetCreatorBase; class KItemListViewCreatorBase; class QTimer; @@ -52,11 +54,8 @@ class QTimer; * a GraphicsItem. Each visible item is represented by a KItemListWidget. * * The created view must be applied to the KItemListController with - * KItemListController::setView(). For showing a custom model it is not - * mandatory to derive from KItemListView, all that is necessary is - * to set a widget-creator that is capable to create KItemListWidgets - * showing the model items. A widget-creator can be set with - * KItemListView::setWidgetCreator(). + * KItemListController::setView() or with the constructor of + * KItemListController. * * @see KItemListWidget * @see KItemModelBase @@ -72,23 +71,29 @@ public: KItemListView(QGraphicsWidget* parent = 0); virtual ~KItemListView(); - void setScrollOrientation(Qt::Orientation orientation); - Qt::Orientation scrollOrientation() const; - - void setItemSize(const QSizeF& size); - QSizeF itemSize() const; - - // TODO: add note that offset is not checked against maximumOffset, only against 0. + /** + * Offset of the scrollbar that represents the scroll-orientation + * (see setScrollOrientation()). + */ void setScrollOffset(qreal offset); qreal scrollOffset() const; qreal maximumScrollOffset() const; + /** + * Offset related to an item, that does not fit into the available + * size of the listview. If the scroll-orientation is vertical + * the item-offset describes the offset of the horizontal axe, if + * the scroll-orientation is horizontal the item-offset describes + * the offset of the vertical axe. + */ void setItemOffset(qreal scrollOffset); qreal itemOffset() const; qreal maximumItemOffset() const; + int maximumVisibleItems() const; + void setVisibleRoles(const QList& roles); QList visibleRoles() const; @@ -116,7 +121,7 @@ public: /** * @return Model of the item-list. The model gets - * initialized by KItemListController::setView() and will + * initialized by KItemListController::setModel() and will * result in calling KItemListController::onModelChanged(). */ KItemModelBase* model() const; @@ -129,54 +134,86 @@ public: * * itemListView->setWidgetCreator(new KItemListWidgetCreator()); * - * Note that the ownership of the widget creator is not transferred to - * the item-list view: One instance of a widget creator might get shared - * by several item-list view instances. + * The ownership of the widget creator is transferred to + * the item-list view. **/ void setWidgetCreator(KItemListWidgetCreatorBase* widgetCreator); KItemListWidgetCreatorBase* widgetCreator() const; + /** + * Sets the creator that creates a group header. Usually it is sufficient + * to implement a custom header widget X derived from KItemListGroupHeader and + * set the creator by: + * + * itemListView->setGroupHeaderCreator(new KItemListGroupHeaderCreator()); + * + * The ownership of the gropup header creator is transferred to + * the item-list view. + **/ void setGroupHeaderCreator(KItemListGroupHeaderCreatorBase* groupHeaderCreator); KItemListGroupHeaderCreatorBase* groupHeaderCreator() const; - void setStyleOption(const KItemListStyleOption& option); + /** + * @return The basic size of all items. The size of an item may be larger than + * the basic size (see KItemListView::itemSizeHint() and KItemListView::itemRect()). + */ + QSizeF itemSize() const; + const KItemListStyleOption& styleOption() const; /** @reimp */ virtual void setGeometry(const QRectF& rect); + /** + * @return The page step which should be used by the vertical scroll bar. + * This is the height of the view except for the header widget. + */ + qreal verticalPageStep() const; + + /** + * @return Index of the item that is below the point \a pos. + * The position is relative to the upper right of + * the visible area. Only (at least partly) visible + * items are considered. -1 is returned if no item is + * below the position. + */ int itemAt(const QPointF& pos) const; bool isAboveSelectionToggle(int index, const QPointF& pos) const; bool isAboveExpansionToggle(int index, const QPointF& pos) const; + /** + * @return Index of the first item that is at least partly visible. + * -1 is returned if the model contains no items. + */ int firstVisibleIndex() const; - int lastVisibleIndex() const; /** - * @return Required size for the item with the index \p index. - * Per default KItemListView::itemSize() is returned. - * When reimplementing this method it is recommended to - * also reimplement KItemListView::itemSizeHintUpdateRequired(). + * @return Index of the last item that is at least partly visible. + * -1 is returned if the model contains no items. */ - virtual QSizeF itemSizeHint(int index) const; + int lastVisibleIndex() const; /** - * @param itemRanges Items that must be checked for getting the visible roles sizes. - * @return The size of each visible role in case if KItemListView::itemSize() - * is empty. This allows to have dynamic but equal role sizes between - * all items. Per default an empty hash is returned. + * @return Calculates the required size for all items in the model. + * It might be larger than KItemListView::itemSize(). + * In this case the layout grid will be stretched to assure an + * unclipped item. + * NOTE: the logical height (width) is actually the + * width (height) if the scroll orientation is Qt::Vertical! */ - virtual QHash visibleRolesSizes(const KItemRangeList& itemRanges) const; + void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint) const; /** - * @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. + * If set to true, items having child-items can be expanded to show the child-items as + * part of the view. Per default the expanding of items is is disabled. If expanding of + * items is enabled, the methods KItemModelBase::setExpanded(), KItemModelBase::isExpanded(), + * KItemModelBase::isExpandable() and KItemModelBase::expandedParentsCount() + * 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; + void setSupportsItemExpanding(bool supportsExpanding); + bool supportsItemExpanding() const; /** * @return The rectangle of the item relative to the top/left of @@ -202,23 +239,46 @@ public: */ void scrollToItem(int index); + /** + * If several properties of KItemListView are changed synchronously, it is + * recommended to encapsulate the calls between beginTransaction() and endTransaction(). + * This prevents unnecessary and expensive layout-calculations. + */ void beginTransaction(); + + /** + * Counterpart to beginTransaction(). The layout changes will only be animated if + * all property changes between beginTransaction() and endTransaction() support + * animations. + */ void endTransaction(); + bool isTransactionActive() const; /** - * Turns on the header if \p show is true. Per default the - * header is not shown. + * Turns on the header if \p visible is true. Per default the + * header is not visible. Usually the header is turned on when + * showing a classic "table-view" to describe the shown columns. */ - void setHeaderShown(bool show); - bool isHeaderShown() const; + void setHeaderVisible(bool visible); + bool isHeaderVisible() const; + + /** + * @return Header of the list. The header is also available if it is not shown + * (see KItemListView::setHeaderShown()). + */ + KItemListHeader* header() const; /** * @return Pixmap that is used for a drag operation based on the - * items given by \a indexes. The default implementation returns - * a null-pixmap. + * items given by \a indexes. */ - virtual QPixmap createDragPixmap(const QSet& indexes) const; + virtual QPixmap createDragPixmap(const KItemSet& indexes) const; + + /** + * Lets the user edit the role \a role for item with the index \a index. + */ + void editRole(int index, const QByteArray& role); /** * @reimp @@ -251,7 +311,50 @@ signals: */ void sortRoleChanged(const QByteArray& current, const QByteArray& previous); + /** + * Is emitted if the user has changed the visible roles by moving a header + * item (see KItemListView::setHeaderShown()). Note that no signal will be + * emitted if the roles have been changed without user interaction by + * KItemListView::setVisibleRoles(). + */ + void visibleRolesChanged(const QList& current, const QList& previous); + + void roleEditingCanceled(int index, const QByteArray& role, const QVariant& value); + void roleEditingFinished(int index, const QByteArray& role, const QVariant& value); + protected: + virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); + void setItemSize(const QSizeF& size); + void setStyleOption(const KItemListStyleOption& option); + + /** + * If the scroll-orientation is vertical, the items are ordered + * from top to bottom (= default setting). If the scroll-orientation + * is horizontal, the items are ordered from left to right. + */ + void setScrollOrientation(Qt::Orientation orientation); + Qt::Orientation scrollOrientation() const; + + /** + * Factory method for creating a default widget-creator. The method will be used + * in case if setWidgetCreator() has not been set by the application. + * @return New instance of the widget-creator that should be used per + * default. + */ + virtual KItemListWidgetCreatorBase* defaultWidgetCreator() const; + + /** + * Factory method for creating a default group-header-creator. The method will be used + * in case if setGroupHeaderCreator() has not been set by the application. + * @return New instance of the group-header-creator that should be used per + * default. + */ + virtual KItemListGroupHeaderCreatorBase* defaultGroupHeaderCreator() const; + + /** + * Is called when creating a new KItemListWidget instance and allows derived + * classes to do a custom initialization. + */ virtual void initializeItemListWidget(KItemListWidget* item); /** @@ -272,6 +375,7 @@ protected: virtual void onScrollOffsetChanged(qreal current, qreal previous); virtual void onVisibleRolesChanged(const QList& current, const QList& previous); virtual void onStyleOptionChanged(const KItemListStyleOption& current, const KItemListStyleOption& previous); + virtual void onSupportsItemExpandingChanged(bool supportsExpanding); virtual void onTransactionBegin(); virtual void onTransactionEnd(); @@ -286,18 +390,22 @@ protected: QList visibleItemListWidgets() const; + virtual void updateFont(); + virtual void updatePalette(); + protected slots: virtual void slotItemsInserted(const KItemRangeList& itemRanges); virtual void slotItemsRemoved(const KItemRangeList& itemRanges); virtual void slotItemsMoved(const KItemRange& itemRange, const QList& movedToIndexes); virtual void slotItemsChanged(const KItemRangeList& itemRanges, const QSet& roles); + virtual void slotGroupsChanged(); 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); + virtual void slotSelectionChanged(const KItemSet& current, const KItemSet& previous); private slots: void slotAnimationFinished(QGraphicsWidget* widget, @@ -308,14 +416,22 @@ private slots: void slotRubberBandActivationChanged(bool active); /** - * Is invoked if the visible role-width of one role in the header has - * been changed by the user. It is remembered that the user has modified - * the role-width, so that it won't be changed anymore automatically to - * calculate an optimized width. + * Is invoked if the column-width of one role in the header has + * been changed by the user. The automatic resizing of columns + * will be turned off as soon as this method has been called at + * least once. */ - void slotVisibleRoleWidthChanged(const QByteArray& role, - qreal currentWidth, - qreal previousWidth); + void slotHeaderColumnWidthChanged(const QByteArray& role, + qreal currentWidth, + qreal previousWidth); + + /** + * Is invoked if a column has been moved by the user. Applies + * the moved role to the view. + */ + void slotHeaderColumnMoved(const QByteArray& role, + int currentIndex, + int previousIndex); /** * Triggers the autoscrolling if autoScroll() is enabled by checking the @@ -324,6 +440,17 @@ private slots: */ void triggerAutoScrolling(); + /** + * Is invoked if the geometry of the parent-widget from a group-header has been + * changed. The x-position and width of the group-header gets adjusted to assure + * that it always spans the whole width even during temporary transitions of the + * parent widget. + */ + void slotGeometryOfGroupHeaderParentChanged(); + + void slotRoleEditingCanceled(int index, const QByteArray& role, const QVariant& value); + void slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value); + private: enum LayoutAnimationHint { @@ -347,10 +474,13 @@ private: /** * 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 and not animated. Reusing items is faster in comparison to deleting invisible + * 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); + QList recycleInvisibleItems(int firstVisibleIndex, + int lastVisibleIndex, + LayoutAnimationHint hint); /** * Helper method for doLayout: Starts a moving-animation for the widget to the given @@ -358,14 +488,28 @@ private: * 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); + bool moveWidget(KItemListWidget* widget, const QPointF& newPos); void emitOffsetChanges(); KItemListWidget* createWidget(int index); void recycleWidget(KItemListWidget* widget); + + /** + * Changes the index of the widget to \a index and assures a consistent + * update for m_visibleItems and m_visibleCells. The cell-information + * for the new index will not be updated and be initialized as empty cell. + */ void setWidgetIndex(KItemListWidget* widget, int index); + /** + * Changes the index of the widget to \a index. In opposite to + * setWidgetIndex() the cell-information for the widget gets updated. + * This update gives doLayout() the chance to animate the moving + * of the item visually (see moveWidget()). + */ + void moveWidgetToIndex(KItemListWidget* widget, int index); + /** * Helper method for prepareLayoutForIncreasedItemCount(). */ @@ -378,7 +522,7 @@ private: void updateWidgetProperties(KItemListWidget* widget, int index); /** - * Helper method for createWidget() and setWidgetIndex() to create or update + * Helper method for updateWidgetPropertes() to create or update * the itemlist group-header. */ void updateGroupHeaderForWidget(KItemListWidget* widget); @@ -391,7 +535,7 @@ private: void updateGroupHeaderLayout(KItemListWidget* widget); /** - * Recycles the group-header from the widget. + * Recycles the group-header for the widget. */ void recycleGroupHeaderForWidget(KItemListWidget* widget); @@ -403,39 +547,73 @@ private: void updateVisibleGroupHeaders(); /** - * @return The widths of each visible role that is shown in the KItemListHeader. + * @return Index for the item in the list returned by KItemModelBase::groups() + * that represents the group where the item with the index \a index + * belongs to. -1 is returned if no groups are available. + */ + int groupIndexForItem(int index) const; + + /** + * Updates the alternate background for all visible items. + * @see updateAlternateBackgroundForWidget() + */ + void updateAlternateBackgrounds(); + + /** + * Updates the alternateBackground-property of the widget dependent + * on the state of useAlternateBackgrounds() and the grouping state. + */ + void updateAlternateBackgroundForWidget(KItemListWidget* widget); + + /** + * @return True if alternate backgrounds should be used for the items. + * This is the case if an empty item-size is given and if there + * is more than one visible role. + */ + bool useAlternateBackgrounds() const; + + /** + * @param itemRanges Items that must be checked for getting the widths of columns. + * @return The preferred width of the column of each visible role. The width will + * be respected if the width of the item size is <= 0 (see + * KItemListView::setItemSize()). Per default an empty hash + * is returned. + */ + QHash preferredColumnWidths(const KItemRangeList& itemRanges) const; + + /** + * Applies the column-widths from m_headerWidget to the layout + * of the view. */ - QHash headerRolesWidths() const; + void applyColumnWidthsFromHeader(); /** - * Updates m_visibleRolesSizes by calling KItemListView::visibleRolesSizes(). - * Nothing will be done if m_itemRect is not empty or custom header-widths - * are used (see m_useHeaderWidths). Also m_strechedVisibleRolesSizes will be adjusted - * to respect the available view-size. + * Applies the column-widths from m_headerWidget to \a widget. */ - void updateVisibleRolesSizes(const KItemRangeList& itemRanges); + void updateWidgetColumnWidths(KItemListWidget* widget); /** - * Convenience method for updateVisibleRoleSizes(KItemRangeList() << KItemRange(0, m_model->count()). + * Updates the preferred column-widths of m_groupHeaderWidget by + * invoking KItemListView::columnWidths(). */ - void updateVisibleRolesSizes(); + void updatePreferredColumnWidths(const KItemRangeList& itemRanges); /** - * Updates m_stretchedVisibleRolesSizes based on m_visibleRolesSizes and the available - * view-size. Nothing will be done if m_itemRect is not empty or custom header-widths - * are used (see m_useHeaderWidths). + * Convenience method for + * updatePreferredColumnWidths(KItemRangeList() << KItemRange(0, m_model->count()). */ - void updateStretchedVisibleRolesSizes(); + void updatePreferredColumnWidths(); /** - * @return Sum of the widths of all visible roles. + * Resizes the column-widths of m_headerWidget based on the preferred widths + * and the vailable view-size. */ - qreal visibleRolesSizesWidthSum() const; + void applyAutomaticColumnWidths(); /** - * @return Sum of the heights of all visible roles. + * @return Sum of the widths of all columns. */ - qreal visibleRolesSizesHeightSum() const; + qreal columnWidthsSum() const; /** * @return Boundaries of the header. An empty rectangle is returned @@ -443,6 +621,69 @@ private: */ 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 QSizeF& newItemMargin) 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; + + /** + * @return True if a scrollbar for the given scroll-orientation is required + * when using a size of \p size for the view. Calling the method is rather + * expansive as a temporary relayout needs to be done. + */ + bool scrollBarRequired(const QSizeF& size) const; + + /** + * Shows a drop-indicator between items dependent on the given + * cursor position. The cursor position is relative the the upper left + * edge of the view. + * @return Index of the item where the dropping is done. An index of -1 + * indicates that the item has been dropped after the last item. + */ + int showDropIndicator(const QPointF& pos); + void hideDropIndicator(); + + /** + * Applies the height of the group header to the layouter. The height + * depends on the used scroll orientation. + */ + void updateGroupHeaderHeight(); + + /** + * Updates the siblings-information for all visible items that are inside + * the range of \p firstIndex and \p lastIndex. If firstIndex or lastIndex + * is smaller than 0, the siblings-information for all visible items gets + * updated. + * @see KItemListWidget::setSiblingsInformation() + */ + void updateSiblingsInformation(int firstIndex = -1, int lastIndex = -1); + + /** + * Helper method for updateExpansionIndicators(). + * @return True if the item with the index \a index has a sibling successor + * (= the item is not the last item of the current hierarchy). + */ + bool hasSiblingSuccessor(int index) const; + + /** + * Helper method for slotRoleEditingCanceled() and slotRoleEditingFinished(). + * Disconnects the two Signals "roleEditingCanceled" and + * "roleEditingFinished" + */ + void disconnectRoleEditingSignals(int index); + /** * Helper function for triggerAutoScrolling(). * @param pos Logical position of the mouse relative to the range. @@ -455,24 +696,41 @@ private: */ static int calculateAutoScrollingIncrement(int pos, int range, int oldInc); + /** + * Helper functions for changesItemCount(). + * @return The number of items that fit into the available size by + * respecting the size of the item and the margin between the items. + */ + static int itemsPerSize(qreal size, qreal itemSize, qreal itemMargin); + private: bool m_enabledSelectionToggles; bool m_grouped; + bool m_supportsItemExpanding; + bool m_editingRole; int m_activeTransactions; // Counter for beginTransaction()/endTransaction() + LayoutAnimationHint m_endTransactionAnimationHint; QSizeF m_itemSize; KItemListController* m_controller; KItemModelBase* m_model; QList m_visibleRoles; - QHash m_visibleRolesSizes; - QHash m_stretchedVisibleRolesSizes; - KItemListWidgetCreatorBase* m_widgetCreator; - KItemListGroupHeaderCreatorBase* m_groupHeaderCreator; + mutable KItemListWidgetCreatorBase* m_widgetCreator; + mutable KItemListGroupHeaderCreatorBase* m_groupHeaderCreator; KItemListStyleOption m_styleOption; QHash m_visibleItems; QHash m_visibleGroups; + struct Cell + { + Cell() : column(-1), row(-1) {} + Cell(int c, int r) : column(c), row(r) {} + int column; + int row; + }; + QHash m_visibleCells; + int m_scrollBarExtent; KItemListSizeHintResolver* m_sizeHintResolver; KItemListViewLayouter* m_layouter; @@ -492,9 +750,22 @@ private: QTimer* m_autoScrollTimer; KItemListHeader* m_header; - bool m_useHeaderWidths; - + KItemListHeaderWidget* m_headerWidget; + + // When dragging items into the view where the sort-role of the model + // is empty, a visual indicator should be shown during dragging where + // the dropping will happen. This indicator is specified by an index + // of the item. -1 means that no indicator will be shown at all. + // The m_dropIndicator is set by the KItemListController + // by KItemListView::showDropIndicator() and KItemListView::hideDropIndicator(). + QRectF m_dropIndicator; + + friend class KItemListContainer; // Accesses scrollBarRequired() + friend class KItemListHeader; // Accesses m_headerWidget friend class KItemListController; + friend class KItemListControllerTest; + friend class KItemListViewAccessible; + friend class KItemListAccessibleCell; }; /** @@ -522,29 +793,58 @@ private: * @brief Base class for creating KItemListWidgets. * * It is recommended that applications simply use the KItemListWidgetCreator-template class. - * For a custom implementation the methods create() and recyle() must be reimplemented. - * The intention of the widget creator is to prevent repetitive and expensive instantiations and - * deletions of KItemListWidgets by recycling existing widget instances. + * For a custom implementation the methods create(), itemSizeHint() and preferredColumnWith() + * must be reimplemented. The intention of the widget creator is to prevent repetitive and + * expensive instantiations and deletions of KItemListWidgets by recycling existing widget + * instances. */ class LIBDOLPHINPRIVATE_EXPORT KItemListWidgetCreatorBase : public KItemListCreatorBase { public: virtual ~KItemListWidgetCreatorBase(); + virtual KItemListWidget* create(KItemListView* view) = 0; + virtual void recycle(KItemListWidget* widget); + + virtual void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const = 0; + + virtual qreal preferredRoleColumnWidth(const QByteArray& role, + int index, + const KItemListView* view) const = 0; }; +/** + * @brief Template class for creating KItemListWidgets. + */ template class KItemListWidgetCreator : public KItemListWidgetCreatorBase { public: + KItemListWidgetCreator(); virtual ~KItemListWidgetCreator(); + virtual KItemListWidget* create(KItemListView* view); + + virtual void calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const; + + virtual qreal preferredRoleColumnWidth(const QByteArray& role, + int index, + const KItemListView* view) const; +private: + KItemListWidgetInformant* m_informant; }; +template +KItemListWidgetCreator::KItemListWidgetCreator() : + m_informant(T::createInformant()) +{ +} + template KItemListWidgetCreator::~KItemListWidgetCreator() { + delete m_informant; } template @@ -552,12 +852,26 @@ KItemListWidget* KItemListWidgetCreator::create(KItemListView* view) { KItemListWidget* widget = static_cast(popRecycleableWidget()); if (!widget) { - widget = new T(view); + widget = new T(m_informant, view); addCreatedWidget(widget); } return widget; } +template +void KItemListWidgetCreator::calculateItemSizeHints(QVector& logicalHeightHints, qreal& logicalWidthHint, const KItemListView* view) const +{ + return m_informant->calculateItemSizeHints(logicalHeightHints, logicalWidthHint, view); +} + +template +qreal KItemListWidgetCreator::preferredRoleColumnWidth(const QByteArray& role, + int index, + const KItemListView* view) const +{ + return m_informant->preferredRoleColumnWidth(role, index, view); +} + /** * @brief Base class for creating KItemListGroupHeaders. *