File indexing completed on 2024-05-12 17:22:01

0001 /*
0002     SPDX-FileCopyrightText: 2002 Shie Erlich <erlich@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2002 Rafi Yanai <yanai@users.sourceforge.net>
0004     SPDX-FileCopyrightText: 2010 Jan Lepper <dehtris@yahoo.de>
0005     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #ifndef KRINTERVIEW_H
0011 #define KRINTERVIEW_H
0012 
0013 // QtCore
0014 #include <QSet>
0015 // QtWidgets
0016 #include <QAbstractItemView>
0017 
0018 #include "krview.h"
0019 
0020 class ListModel;
0021 class KrMouseHandler;
0022 class KrViewItem;
0023 
0024 /**
0025  * @brief Abstract intermediate class between KrView and full view implementations.
0026  *
0027  * It contains the methods common to all implementing subclasses of KrView.
0028  */
0029 class KrInterView : public KrView
0030 {
0031     friend class KrViewItem;
0032 
0033 public:
0034     KrInterView(KrViewInstance &instance, KConfig *cfg, QAbstractItemView *itemView);
0035     virtual ~KrInterView();
0036     QModelIndex getCurrentIndex() override
0037     {
0038         return _itemView->currentIndex();
0039     }
0040     bool isSelected(const QModelIndex &ndx) override;
0041     uint numSelected() const override
0042     {
0043         return _selection.count();
0044     }
0045     QList<QUrl> selectedUrls() override;
0046     void setSelectionUrls(const QList<QUrl> urls) override;
0047     KrViewItem *getFirst() override;
0048     KrViewItem *getLast() override;
0049     KrViewItem *getNext(KrViewItem *current) override;
0050     KrViewItem *getPrev(KrViewItem *current) override;
0051     KrViewItem *getCurrentKrViewItem() override;
0052     KrViewItem *findItemByName(const QString &name) override;
0053     KrViewItem *findItemByUrl(const QUrl &url) override;
0054     QString getCurrentItem() const override;
0055     KrViewItem *getKrViewItemAt(const QPoint &vp) override;
0056     void setCurrentItem(const QString &name, bool scrollToCurrent = true, const QModelIndex &fallbackToIndex = QModelIndex()) override;
0057     void setCurrentKrViewItem(KrViewItem *item, bool scrollToCurrent = true) override;
0058     void makeItemVisible(const KrViewItem *item) override;
0059     bool isItemVisible(const KrViewItem *item) override;
0060     void clear() override;
0061     void sort() override;
0062     void refreshColors() override;
0063     void redraw() override;
0064     void prepareForActive() override;
0065     void prepareForPassive() override;
0066     void selectRegion(KrViewItem *i1, KrViewItem *i2, bool select) override;
0067 
0068     void sortModeUpdated(int column, Qt::SortOrder order);
0069 
0070     void redrawItem(FileItem *fileitem)
0071     {
0072         _itemView->viewport()->update(itemRect(fileitem));
0073     }
0074 
0075 protected:
0076     class DummySelectionModel : public QItemSelectionModel
0077     {
0078     public:
0079         DummySelectionModel(QAbstractItemModel *model, QObject *parent)
0080             : QItemSelectionModel(model, parent)
0081         {
0082         }
0083         // do nothing - selection is managed by KrInterView
0084         void select(const QModelIndex &, QItemSelectionModel::SelectionFlags) override
0085         {
0086         }
0087         void select(const QItemSelection &, QItemSelectionModel::SelectionFlags) override
0088         {
0089         }
0090     };
0091 
0092     KIO::filesize_t calcSize() override;
0093     KIO::filesize_t calcSelectedSize() override;
0094     void populate(const QList<FileItem *> &fileItems, FileItem *dummy) override;
0095     KrViewItem *preAddItem(FileItem *fileitem) override;
0096     /**
0097      * Remove an item. Does not handle new current selection.
0098      */
0099     void preDeleteItem(KrViewItem *item) override;
0100     void intSetSelected(const FileItem *fileitem, bool select) override;
0101 
0102     virtual QRect itemRect(const FileItem *fileitem) = 0;
0103 
0104     KrViewItem *getKrViewItem(FileItem *fileitem);
0105     KrViewItem *getKrViewItem(const QModelIndex &);
0106     bool isSelected(const FileItem *fileitem) const
0107     {
0108         return _selection.contains(fileitem);
0109     }
0110     void makeCurrentVisible();
0111 
0112     ListModel *_model;
0113     QAbstractItemView *_itemView;
0114     KrMouseHandler *_mouseHandler;
0115     QHash<FileItem *, KrViewItem *> _itemHash;
0116     QSet<const FileItem *> _selection;
0117 
0118 private:
0119     void setCurrent(const QModelIndex &index, bool scrollToCurrent);
0120 };
0121 
0122 #endif