File indexing completed on 2024-04-28 05:45:06

0001 /*
0002  * SPDX-FileCopyrightText: 2011 Peter Penz <peter.penz19@gmail.com>
0003  *
0004  * Based on the Itemviews NG project from Trolltech Labs
0005  *
0006  * SPDX-License-Identifier: GPL-2.0-or-later
0007  */
0008 
0009 #ifndef KITEMLISTCONTAINER_H
0010 #define KITEMLISTCONTAINER_H
0011 
0012 #include "dolphin_export.h"
0013 
0014 #include <QAbstractScrollArea>
0015 
0016 class KItemListController;
0017 class KItemListSmoothScroller;
0018 class KItemListView;
0019 class KItemModelBase;
0020 class QScroller;
0021 
0022 /**
0023  * @brief Provides a QWidget based scrolling view for a KItemListController.
0024  *
0025  * The model and view are maintained by the KItemListController.
0026  *
0027  * @see KItemListController
0028  */
0029 class DOLPHIN_EXPORT KItemListContainer : public QAbstractScrollArea
0030 {
0031     Q_OBJECT
0032 
0033 public:
0034     /**
0035      * @param controller Controller that maintains the model and the view.
0036      *                   The KItemListContainer takes ownership of the controller
0037      *                   (the parent will be set to the KItemListContainer).
0038      * @param parent     Optional parent widget.
0039      */
0040     explicit KItemListContainer(KItemListController *controller, QWidget *parent = nullptr);
0041     ~KItemListContainer() override;
0042     KItemListController *controller() const;
0043 
0044     void setEnabledFrame(bool enable);
0045     bool enabledFrame() const;
0046 
0047 protected:
0048     void keyPressEvent(QKeyEvent *event) override;
0049     void contextMenuEvent(QContextMenuEvent *event) override;
0050     void showEvent(QShowEvent *event) override;
0051     void resizeEvent(QResizeEvent *event) override;
0052     void scrollContentsBy(int dx, int dy) override;
0053     void wheelEvent(QWheelEvent *event) override;
0054     void focusInEvent(QFocusEvent *event) override;
0055     void focusOutEvent(QFocusEvent *event) override;
0056 
0057 private Q_SLOTS:
0058     void slotScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous);
0059     void slotModelChanged(KItemModelBase *current, KItemModelBase *previous);
0060     void slotViewChanged(KItemListView *current, KItemListView *previous);
0061     void scrollTo(qreal offset);
0062     void updateScrollOffsetScrollBar();
0063     void updateItemOffsetScrollBar();
0064     void stopScroller();
0065 
0066 private:
0067     void updateGeometries();
0068     void updateSmoothScrollers(Qt::Orientation orientation);
0069 
0070     /**
0071      * Helper method for updateScrollOffsetScrollBar(). Updates the scrollbar-policy
0072      * to Qt::ScrollBarAlwaysOn for cases where turning off the scrollbar might lead
0073      * to an endless layout loop (see bug #293318).
0074      */
0075     void updateScrollOffsetScrollBarPolicy();
0076 
0077 private:
0078     KItemListController *m_controller;
0079 
0080     KItemListSmoothScroller *m_horizontalSmoothScroller;
0081     KItemListSmoothScroller *m_verticalSmoothScroller;
0082     QScroller *m_scroller;
0083 };
0084 
0085 #endif