File indexing completed on 2024-05-05 17:56:54

0001 /*
0002     SPDX-FileCopyrightText: 2004 Csaba Karai <krusader@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #ifndef DULISTVIEW_H
0009 #define DULISTVIEW_H
0010 
0011 // QtGui
0012 #include <QKeyEvent>
0013 #include <QMouseEvent>
0014 
0015 #include "../GUI/krtreewidget.h"
0016 #include "diskusage.h"
0017 
0018 class DUListViewItem : public QTreeWidgetItem
0019 {
0020 public:
0021     DUListViewItem(DiskUsage *diskUsageIn,
0022                    File *fileIn,
0023                    QTreeWidget *parent,
0024                    const QString &label1,
0025                    const QString &label2,
0026                    const QString &label3,
0027                    const QString &label4,
0028                    const QString &label5,
0029                    const QString &label6,
0030                    const QString &label7,
0031                    const QString &label8,
0032                    const QString &label9)
0033         : QTreeWidgetItem(parent)
0034         , diskUsage(diskUsageIn)
0035         , file(fileIn)
0036     {
0037         setText(0, label1);
0038         setText(1, label2);
0039         setText(2, label3);
0040         setText(3, label4);
0041         setText(4, label5);
0042         setText(5, label6);
0043         setText(6, label7);
0044         setText(7, label8);
0045         setText(8, label9);
0046 
0047         setTextAlignment(1, Qt::AlignRight);
0048         setTextAlignment(2, Qt::AlignRight);
0049         setTextAlignment(3, Qt::AlignRight);
0050 
0051         setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
0052         diskUsage->addProperty(file, "ListView-Ref", this);
0053     }
0054     DUListViewItem(DiskUsage *diskUsageIn,
0055                    File *fileIn,
0056                    QTreeWidgetItem *parent,
0057                    const QString &label1,
0058                    const QString &label2,
0059                    const QString &label3,
0060                    const QString &label4,
0061                    const QString &label5,
0062                    const QString &label6,
0063                    const QString &label7,
0064                    const QString &label8,
0065                    const QString &label9)
0066         : QTreeWidgetItem(parent)
0067         , diskUsage(diskUsageIn)
0068         , file(fileIn)
0069     {
0070         setText(0, label1);
0071         setText(1, label2);
0072         setText(2, label3);
0073         setText(3, label4);
0074         setText(4, label5);
0075         setText(5, label6);
0076         setText(6, label7);
0077         setText(7, label8);
0078         setText(8, label9);
0079 
0080         setTextAlignment(1, Qt::AlignRight);
0081         setTextAlignment(2, Qt::AlignRight);
0082         setTextAlignment(3, Qt::AlignRight);
0083 
0084         setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
0085         diskUsage->addProperty(file, "ListView-Ref", this);
0086     }
0087     DUListViewItem(DiskUsage *diskUsageIn,
0088                    File *fileIn,
0089                    QTreeWidget *parent,
0090                    QTreeWidgetItem *after,
0091                    const QString &label1,
0092                    const QString &label2,
0093                    const QString &label3,
0094                    const QString &label4,
0095                    const QString &label5,
0096                    const QString &label6,
0097                    const QString &label7,
0098                    const QString &label8,
0099                    const QString &label9)
0100         : QTreeWidgetItem(parent, after)
0101         , diskUsage(diskUsageIn)
0102         , file(fileIn)
0103     {
0104         setText(0, label1);
0105         setText(1, label2);
0106         setText(2, label3);
0107         setText(3, label4);
0108         setText(4, label5);
0109         setText(5, label6);
0110         setText(6, label7);
0111         setText(7, label8);
0112         setText(8, label9);
0113 
0114         setTextAlignment(1, Qt::AlignRight);
0115         setTextAlignment(2, Qt::AlignRight);
0116         setTextAlignment(3, Qt::AlignRight);
0117 
0118         setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
0119         diskUsage->addProperty(file, "ListView-Ref", this);
0120     }
0121     DUListViewItem(DiskUsage *diskUsageIn,
0122                    File *fileIn,
0123                    QTreeWidgetItem *parent,
0124                    QTreeWidgetItem *after,
0125                    const QString &label1,
0126                    const QString &label2,
0127                    const QString &label3,
0128                    const QString &label4,
0129                    const QString &label5,
0130                    const QString &label6,
0131                    const QString &label7,
0132                    const QString &label8,
0133                    const QString &label9)
0134         : QTreeWidgetItem(parent, after)
0135         , diskUsage(diskUsageIn)
0136         , file(fileIn)
0137     {
0138         setText(0, label1);
0139         setText(1, label2);
0140         setText(2, label3);
0141         setText(3, label4);
0142         setText(4, label5);
0143         setText(5, label6);
0144         setText(6, label7);
0145         setText(7, label8);
0146         setText(8, label9);
0147 
0148         setTextAlignment(1, Qt::AlignRight);
0149         setTextAlignment(2, Qt::AlignRight);
0150         setTextAlignment(3, Qt::AlignRight);
0151 
0152         setChildIndicatorPolicy(QTreeWidgetItem::DontShowIndicatorWhenChildless);
0153         diskUsage->addProperty(file, "ListView-Ref", this);
0154     }
0155     ~DUListViewItem() override
0156     {
0157         diskUsage->removeProperty(file, "ListView-Ref");
0158     }
0159 
0160     bool operator<(const QTreeWidgetItem &other) const override
0161     {
0162         int column = treeWidget() ? treeWidget()->sortColumn() : 0;
0163 
0164         if (text(0) == "..")
0165             return true;
0166 
0167         const auto *compWith = dynamic_cast<const DUListViewItem *>(&other);
0168         if (compWith == nullptr)
0169             return false;
0170 
0171         switch (column) {
0172         case 1:
0173         case 2:
0174             return file->size() > compWith->file->size();
0175         case 3:
0176             return file->ownSize() > compWith->file->ownSize();
0177         case 5:
0178             return file->time() < compWith->file->time();
0179         default:
0180             return text(column) < other.text(column);
0181         }
0182     }
0183 
0184     inline File *getFile()
0185     {
0186         return file;
0187     }
0188 
0189 private:
0190     DiskUsage *diskUsage;
0191     File *file;
0192 };
0193 
0194 class DUListView : public KrTreeWidget
0195 {
0196     Q_OBJECT
0197 
0198 public:
0199     explicit DUListView(DiskUsage *usage);
0200     ~DUListView() override;
0201 
0202     File *getCurrentFile();
0203 
0204 public slots:
0205     void slotDirChanged(Directory *);
0206     void slotChanged(File *);
0207     void slotDeleted(File *);
0208     void slotRightClicked(QTreeWidgetItem *, const QPoint &);
0209     void slotExpanded(QTreeWidgetItem *);
0210 
0211 protected:
0212     DiskUsage *diskUsage;
0213 
0214     void mouseDoubleClickEvent(QMouseEvent *e) override;
0215     void keyPressEvent(QKeyEvent *e) override;
0216 
0217 private:
0218     void addDirectory(Directory *dirEntry, QTreeWidgetItem *parent);
0219     bool doubleClicked(QTreeWidgetItem *item);
0220 };
0221 
0222 #endif /* __DU_LISTVIEW_H__ */