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 ↦ 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