ACF $AcfVersion:0$
CFileTreeViewGuiComp.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ACF-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QDir>
7#include <QtCore/QTimer>
8#include <QtCore/QElapsedTimer>
9#include <QtCore/QThread>
10#include <QtCore/QMutexLocker>
11#include <QtGui/QStandardItemModel>
12#if QT_VERSION >= 0x050000
13#include <QtWidgets/QFileIconProvider>
14#else
15#include <QtGui/QFileIconProvider>
16#endif
17
18// ACF includes
20#include <ifile/IFileTypeInfo.h>
24
25#include <GeneratedFiles/ifilegui/ui_CFileTreeViewGuiComp.h>
26
27
28namespace ifilegui
29{
30
31
39 Ui::CFileTreeViewGuiComp, ifile::IFileNameParam>,
41{
42 Q_OBJECT
43public:
45 Ui::CFileTreeViewGuiComp, ifile::IFileNameParam> BaseClass;
46
47 I_BEGIN_COMPONENT(CFileTreeViewGuiComp);
48 I_REGISTER_SUBELEMENT(CurrentFile);
49 I_REGISTER_SUBELEMENT_INTERFACE(CurrentFile, ifile::IFileNameParam, ExtractCurrentFile);
50 I_REGISTER_SUBELEMENT_INTERFACE(CurrentFile, imod::IModel, ExtractCurrentFile);
51 I_REGISTER_SUBELEMENT_INTERFACE(CurrentFile, istd::IChangeable, ExtractCurrentFile);
52 I_REGISTER_SUBELEMENT_INTERFACE(CurrentFile, iser::ISerializable, ExtractCurrentFile);
53 I_ASSIGN(m_fileTypeInfoCompPtr, "FileTypeInfo", "File type info used to create file filters", false, "FileTypeInfo");
54 I_ASSIGN_MULTI_0(m_filtersAttrPtr, "Filters", "List of filters if no FileTypeInfo is specified", false);
55 I_ASSIGN(m_noEmptyDirsAttrPtr, "NoEmptyFolders", "Recursively skip folder which containing no files", true, true);
56 I_END_COMPONENT;
57
59 {
60 DR_PATH = Qt::UserRole + 1,
62 };
63
65
66protected:
67 // reimplemented (icomp::CComponentBase)
68 virtual void OnComponentCreated() override;
69 virtual void OnComponentDestroyed() override;
70
71 // reimplemented (iqtgui::CGuiComponentBase)
72 virtual void OnGuiCreated() override;
73
74 // reimplemented (iqtgui::TGuiObserverWrap)
75 virtual void UpdateGui(const istd::IChangeable::ChangeSet& changeSet) override;
76
77 // reimplemented (imod::CMultiModelDispatcherBase)
78 virtual void OnModelChanged(int modelId, const istd::IChangeable::ChangeSet& changeSet) override;
79
80private Q_SLOTS:
81 void OnSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
82 void on_Refresh_clicked();
83 void OnTreeModelUpdated();
84 void on_FilterText_textChanged(QString filterText);
85
86private:
87 void RebuildTreeModel();
88 void DoTreeModelUpdate();
89 void UpdateCurrentSelection();
90 void UpdateChildItems(QStandardItem* itemPtr);
91
97 bool CreateFileList(const QDir& root,
98 const QStringList& nameFilters,
99 QDir::SortFlags sortSpec,
100 QStandardItem* parentItemPtr);
101
105 bool CreateDirectoryList(
106 const QDir& root,
107 const QStringList& nameFilters,
108 QDir::SortFlags sortSpec,
109 QStandardItem* parentItemPtr);
110
111 void EnumerateDirectory(
112 const QDir& root,
113 const QStringList& nameFilters,
114 QDir::SortFlags sortSpec,
115 QStandardItem* parentItemPtr);
116
117private:
118 class CurrentFile: public ifile::CFileNameParamComp
119 {
120 public:
121 // reimplemented (ifile::IFileNameParam)
122 virtual int GetPathType() const override
123 {
124 return PT_FILE;
125 }
126 };
127
128 imod::TModelWrap<CurrentFile> m_currentFile;
129
130 // static template methods for subelement access
131 template <class InterfaceType>
132 static InterfaceType* ExtractCurrentFile(CFileTreeViewGuiComp& component)
133 {
134 return &component.m_currentFile;
135 }
136
137 class InternalThread: public QThread
138 {
139 public:
140 explicit InternalThread(CFileTreeViewGuiComp* parentPtr): QThread(parentPtr),
141 m_parentPtr(parentPtr)
142 {
143 }
144
145 // reimplemented (QThread)
146 virtual void run() override
147 {
148 m_parentPtr->DoTreeModelUpdate();
149 }
150
151 private:
152 CFileTreeViewGuiComp* m_parentPtr;
153 };
154
155 friend class InternalThread;
156 InternalThread* m_internalThreadPtr;
157
158 QMutex m_lock;
159
160 bool m_fileModelUpdateAllowed;
161 int m_filesCount;
162 int m_dirsCount;
163
164 mutable QStandardItemModel m_itemModel;
165 QFileIconProvider m_iconProvider;
166
167 mutable QMap<QString, QIcon> m_extToIconMap;
168
169 QRegularExpression m_filterMatcher;
170 QString m_userFilter;
171 QTimer m_filterTimer;
172 QElapsedTimer m_performanceTimer;
173
174 I_REF(ifile::IFileTypeInfo, m_fileTypeInfoCompPtr);
175 I_MULTIATTR(QString, m_filtersAttrPtr);
176 I_ATTR(bool, m_noEmptyDirsAttrPtr);
177};
178
179
180} // namespace ifilegui
181
182
Basic implementation of interface ifile::IFileNameParam as component.
Common interface for any file system item name (e.g directory, file or URL path)
Provide loading and saving of objects.
File system explorer-like component.
virtual void OnComponentDestroyed() override
virtual void OnModelChanged(int modelId, const istd::IChangeable::ChangeSet &changeSet) override
Called when some model observed by dispatcher will be changed.
virtual void UpdateGui(const istd::IChangeable::ChangeSet &changeSet) override
iqtgui::TDesignerGuiObserverCompBase< Ui::CFileTreeViewGuiComp, ifile::IFileNameParam > BaseClass
virtual void OnGuiCreated() override
virtual void OnComponentCreated() override
Generic implementation of a data model changes notifier.
Common interface for model objects, that supports Model/Observer design pattern.
Definition IModel.h:25
This model wrapper provides a simple connection between a concrete istd::IChangeable implementation a...
Definition TModelWrap.h:24
Base class for all Qt GUI components.
Common class for all classes which objects can be archived or restored from archive.
Set of change flags (its IDs).
Definition IChangeable.h:36
Common interface for data model objects, which can be changed.
Definition IChangeable.h:28
GUI specific interfaces and components for file system access and representation.