File indexing completed on 2024-05-05 05:51:13

0001 /***********************************************************************
0002  * SPDX-FileCopyrightText: 2003-2004 Max Howell <max.howell@methylblue.com>
0003  * SPDX-FileCopyrightText: 2008-2009 Martin Sandsmark <martin.sandsmark@kde.org>
0004  * SPDX-FileCopyrightText: 2022 Harald Sitter <sitter@kde.org>
0005  *
0006  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0007  ***********************************************************************/
0008 
0009 #pragma once
0010 
0011 #include <QPixmap>
0012 #include <QRectF>
0013 #include <QString>
0014 
0015 #include "Config.h"
0016 #include "fileTree.h"
0017 #include "radialMap.h"
0018 
0019 namespace Filelight
0020 {
0021 class ContextMenuContext;
0022 }
0023 
0024 namespace RadialMap
0025 {
0026 class Segment;
0027 
0028 class Map : public QObject
0029 {
0030     Q_OBJECT
0031 
0032     Q_PROPERTY(bool valid READ isValid NOTIFY signatureChanged)
0033     Q_PROPERTY(QRectF rect MEMBER m_rect NOTIFY rectChanged)
0034     Q_PROPERTY(QList<QVariant> signature READ signature NOTIFY signatureChanged)
0035     Q_PROPERTY(QString overallSize READ overallSize NOTIFY signatureChanged)
0036     Q_PROPERTY(uint numberOfChildren READ numberOfChildren NOTIFY signatureChanged)
0037     Q_PROPERTY(QUrl rootUrl READ rootUrl NOTIFY signatureChanged)
0038     Q_PROPERTY(QObject *rootSegment READ rootSegment NOTIFY signatureChanged)
0039     Q_PROPERTY(QString displayPath READ displayPath NOTIFY signatureChanged)
0040     friend class Filelight::ContextMenuContext;
0041     friend class Item;
0042 
0043 public:
0044     static Map *instance()
0045     {
0046         static Map map;
0047         return &map;
0048     }
0049     ~Map() override;
0050     Q_DISABLE_COPY_MOVE(Map)
0051 
0052     bool isValid() const
0053     {
0054         return !m_signature.isEmpty() && m_root;
0055     }
0056 
0057     QString overallSize() const
0058     {
0059         return m_root ? m_root->humanReadableSize() : QString();
0060     }
0061 
0062     uint numberOfChildren() const
0063     {
0064         return m_root ? m_root->children() : 0;
0065     }
0066 
0067     QUrl rootUrl() const;
0068 
0069     void make(const std::shared_ptr<Folder> &tree, bool = false);
0070     bool resize(const QRectF &);
0071 
0072     bool isNull() const
0073     {
0074         return (m_signature.isEmpty());
0075     }
0076     Q_INVOKABLE void invalidate();
0077 
0078     qreal height() const
0079     {
0080         return m_rect.height();
0081     }
0082     qreal width() const
0083     {
0084         return m_rect.width();
0085     }
0086 
0087     Q_INVOKABLE QList<QVariant> signature();
0088     QList<QList<Segment *>> rawSignature() const
0089     {
0090         return m_signature;
0091     }
0092 
0093     Q_INVOKABLE QString displayPath() const
0094     {
0095         return m_root ? m_root->displayPath() : QString();
0096     }
0097 
0098     std::shared_ptr<Folder> root()
0099     {
0100         return m_root;
0101     }
0102 
0103     QObject *rootSegment() const;
0104 
0105 public Q_SLOTS:
0106     void zoomIn();
0107     void zoomOut();
0108     void refresh(Filelight::Dirty filth);
0109     void createFromCacheObject(RadialMap::Segment *segment);
0110 
0111 Q_SIGNALS:
0112     void rectChanged();
0113     void signatureChanged();
0114 
0115 private:
0116     Map();
0117     void colorise();
0118     void setRingBreadth();
0119     void findVisibleDepth(const std::shared_ptr<Folder> &dir, uint currentDepth = 0);
0120     bool build(const std::shared_ptr<Folder> &dir, uint depth = 0, uint a_start = 0, uint a_end = MAX_DEGREE);
0121     void createFromCache(const std::shared_ptr<Folder> &tree);
0122 
0123     QList<QList<Segment *>> m_signature;
0124 
0125     std::shared_ptr<Folder> m_root;
0126     std::unique_ptr<Segment> m_rootSegment;
0127     uint m_minSize{};
0128     QList<FileSize> m_limits;
0129     QRectF m_rect;
0130     uint m_visibleDepth; /// visible level depth of system
0131     int m_ringBreadth;
0132     uint m_innerRadius; /// radius of inner circle
0133 
0134     uint MAP_2MARGIN;
0135 };
0136 } // namespace RadialMap