FolderTreeCtrl.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include "Util/FileChangeMonitor.h"
  10. #include <AzCore/std/containers/vector.h>
  11. #include <AzCore/std/containers/map.h>
  12. #include <QList>
  13. #include <QStandardItem>
  14. #include <QTreeView>
  15. #include <QIcon>
  16. class QSortFilterProxyModel;
  17. class QStandardItemModel;
  18. class CFolderTreeCtrl
  19. : public QTreeView
  20. , public CFileChangeMonitorListener
  21. {
  22. Q_OBJECT
  23. friend class CTreeItem;
  24. enum class IconType
  25. {
  26. FolderIcon = 0,
  27. FileIcon = 2
  28. };
  29. enum class Roles : int
  30. {
  31. IsFolderRole = Qt::UserRole
  32. };
  33. class CTreeItem
  34. : public QStandardItem
  35. {
  36. public:
  37. CTreeItem(CFolderTreeCtrl& folderTreeCtrl, CTreeItem* parent,
  38. const QString& name, const QString& path, IconType image);
  39. ~CTreeItem();
  40. void Remove();
  41. CTreeItem* AddChild(const QString& name, const QString& path, IconType image);
  42. QString GetPath() const { return m_path; }
  43. private:
  44. CFolderTreeCtrl& m_folderTreeCtrl;
  45. QString m_path;
  46. };
  47. public:
  48. CFolderTreeCtrl(QWidget* parent = 0);
  49. virtual ~CFolderTreeCtrl();
  50. void Configure(const AZStd::vector<QString>& folders, const QString& fileNameSpec,
  51. const QString& rootName, bool bEnabledMonitor = true, bool bFlatTree = true);
  52. QString GetPath(QStandardItem* item) const;
  53. bool IsFolder(QStandardItem* item) const;
  54. bool IsFile(QStandardItem* item) const;
  55. QIcon GetItemIcon(IconType image) const;
  56. QList<QStandardItem*> GetSelectedItems() const;
  57. void SetSearchFilter(const QString& searchText);
  58. Q_SIGNALS:
  59. void ItemDoubleClicked(QStandardItem* item);
  60. protected Q_SLOTS:
  61. void OnIndexDoubleClicked(const QModelIndex& index);
  62. protected:
  63. struct CaseInsensitiveCompare
  64. {
  65. bool operator()(const QString& left, const QString& right) const
  66. {
  67. return QString::compare(left, right, Qt::CaseInsensitive) < 0;
  68. }
  69. };
  70. void OnFileMonitorChange(const SFileChangeInfo& rChange) override;
  71. void contextMenuEvent(QContextMenuEvent* e) override;
  72. void LoadTreeRec(const QString& currentFolder);
  73. void AddItem(const QString& path);
  74. void RemoveItem(const QString& path);
  75. CTreeItem* GetItem(const QString& path);
  76. QStandardItem* GetSourceItemByIndex(const QModelIndex& index) const;
  77. QString CalculateFolderFullPath(const QStringList& splittedFolder, int idx);
  78. CTreeItem* CreateFolderItems(const QString& folder);
  79. void RemoveEmptyFolderItems(const QString& folder);
  80. void Edit(const QString& path);
  81. void ShowInExplorer(const QString& path);
  82. bool m_bEnableMonitor = false;
  83. bool m_bFlatStyle = false;
  84. QString m_fileNameSpec = "";
  85. AZStd::vector<QString> m_folders = {};
  86. QString m_rootName = "";
  87. AZStd::map< QString, CTreeItem*, CaseInsensitiveCompare > m_pathToTreeItem = {};
  88. CTreeItem* m_rootTreeItem = nullptr;
  89. QIcon m_folderIcon;
  90. QIcon m_fileIcon;
  91. QStandardItemModel* m_model;
  92. QSortFilterProxyModel* m_proxyModel;
  93. };