patchmanager.h (6417B)
1 #pragma once 2 3 #include "resizerbar.h" 4 #include "state.h" 5 #include "types.h" 6 7 #include "baseLib/event.h" 8 9 #include "jucePluginLib/patchdb/db.h" 10 11 #include "juce_gui_basics/juce_gui_basics.h" 12 13 namespace jucePluginEditorLib 14 { 15 class Editor; 16 } 17 18 namespace genericUI 19 { 20 class UiObject; 21 } 22 23 namespace jucePluginEditorLib::patchManager 24 { 25 class Grid; 26 class List; 27 class Status; 28 class TreeItem; 29 class SearchTree; 30 class SearchList; 31 class Info; 32 class ListModel; 33 class Tree; 34 35 class PatchManager : public juce::Component, public pluginLib::patchDB::DB, juce::Timer, public juce::ChangeListener 36 { 37 public: 38 enum class LayoutType 39 { 40 List, 41 Grid 42 }; 43 44 baseLib::Event<uint32_t, pluginLib::patchDB::PatchKey> onSelectedPatchChanged; 45 46 static constexpr std::initializer_list<GroupType> DefaultGroupTypes{GroupType::Favourites, GroupType::LocalStorage, GroupType::Factory, GroupType::DataSources}; 47 48 explicit PatchManager(Editor& _editor, Component* _root, const std::initializer_list<GroupType>& _groupTypes = DefaultGroupTypes); 49 ~PatchManager() override; 50 51 void timerCallback() override; 52 void processDirty(const pluginLib::patchDB::Dirty& _dirty) const override; 53 54 void setSelectedItem(Tree* _tree, const TreeItem* _item); 55 void addSelectedItem(Tree* _tree, const TreeItem* _item); 56 void removeSelectedItem(Tree* _tree, const TreeItem* _item); 57 58 bool setSelectedPatch(const pluginLib::patchDB::PatchPtr& _patch, pluginLib::patchDB::SearchHandle _fromSearch); 59 60 bool selectPrevPreset(uint32_t _part); 61 bool selectNextPreset(uint32_t _part); 62 63 bool selectPatch(uint32_t _part, const pluginLib::patchDB::DataSource& _ds, uint32_t _program); 64 65 void setListStatus(uint32_t _selected, uint32_t _total) const; 66 67 pluginLib::patchDB::Color getPatchColor(const pluginLib::patchDB::PatchPtr& _patch) const; 68 69 bool addGroupTreeItemForTag(pluginLib::patchDB::TagType _type) const; 70 bool addGroupTreeItemForTag(pluginLib::patchDB::TagType _type, const std::string& _name) const; 71 72 void paint(juce::Graphics& g) override; 73 74 void exportPresets(const juce::File& _file, const std::vector<pluginLib::patchDB::PatchPtr>& _patches, const pluginLib::FileType& _fileType) const; 75 bool exportPresets(std::vector<pluginLib::patchDB::PatchPtr>&& _patches, const pluginLib::FileType& _fileType) const; 76 77 void resized() override; 78 79 juce::Colour getResizerBarColor() const; 80 81 bool copyPart(uint8_t _target, uint8_t _source); 82 83 bool setSelectedPatch(uint32_t _part, const pluginLib::patchDB::PatchPtr& _patch, pluginLib::patchDB::SearchHandle _fromSearch); 84 85 bool setSelectedDataSource(const pluginLib::patchDB::DataSourceNodePtr& _ds) const; 86 pluginLib::patchDB::DataSourceNodePtr getSelectedDataSource() const; 87 TreeItem* getSelectedDataSourceTreeItem() const; 88 89 const State& getState() const { return m_state; } 90 91 bool setSelectedPatch(uint32_t _part, const pluginLib::patchDB::PatchPtr& _patch); 92 bool setSelectedPatch(uint32_t _part, const pluginLib::patchDB::PatchKey& _patch); 93 94 void copyPatchesToLocalStorage(const pluginLib::patchDB::DataSourceNodePtr& _ds, const std::vector<pluginLib::patchDB::PatchPtr>& _patches, int _part); 95 96 uint32_t createSaveMenuEntries(juce::PopupMenu& _menu, uint32_t _part, const std::string& _name = "patch", uint64_t _userData = 0); 97 uint32_t createSaveMenuEntries(juce::PopupMenu& _menu, const std::string& _name = "patch", uint64_t _userData = 0) 98 { 99 return createSaveMenuEntries(_menu, getCurrentPart(), _name, _userData); 100 } 101 102 std::string getTagTypeName(pluginLib::patchDB::TagType _type) const; 103 void setTagTypeName(pluginLib::patchDB::TagType _type, const std::string& _name); 104 105 std::vector<pluginLib::patchDB::PatchPtr> getPatchesFromString(const std::string& _text); 106 std::vector<pluginLib::patchDB::PatchPtr> getPatchesFromClipboard(); 107 bool activatePatchFromString(const std::string& _text); 108 bool activatePatchFromClipboard(); 109 std::string toString(const pluginLib::patchDB::PatchPtr& _patch, const pluginLib::FileType& _fileType, pluginLib::ExportType _exportType) const; 110 111 LayoutType getLayout() const { return m_layout; } 112 void setLayout(LayoutType _layout); 113 114 bool setGridLayout128(); 115 void setCustomSearch(pluginLib::patchDB::SearchHandle _sh) const; 116 117 void bringToFront() const; 118 119 private: 120 bool selectPatch(uint32_t _part, int _offset); 121 122 public: 123 auto& getEditor() const { return m_editor; } 124 std::shared_ptr<genericUI::UiObject> getTemplate(const std::string& _name) const; 125 126 virtual uint32_t getCurrentPart() const = 0; 127 virtual bool activatePatch(const pluginLib::patchDB::PatchPtr& _patch, uint32_t _part) = 0; 128 129 virtual bool activatePatch(const std::string& _filename, uint32_t _part); 130 131 std::vector<pluginLib::patchDB::PatchPtr> loadPatchesFromFiles(const juce::StringArray& _files); 132 std::vector<pluginLib::patchDB::PatchPtr> loadPatchesFromFiles(const std::vector<std::string>& _files); 133 134 void onLoadFinished() override; 135 136 void setPerInstanceConfig(const std::vector<uint8_t>& _data); 137 void getPerInstanceConfig(std::vector<uint8_t>& _data) const; 138 139 void onProgramChanged(uint32_t _part); 140 141 void setCurrentPart(uint32_t _part); 142 143 protected: 144 void updateStateAsync(uint32_t _part, const pluginLib::patchDB::PatchPtr& _patch); 145 146 ListModel* getListModel() const; 147 148 void startLoaderThread(const juce::File& _migrateFromDir = {}) override; 149 150 private: 151 pluginLib::patchDB::SearchHandle getSearchHandle(const pluginLib::patchDB::DataSource& _ds, bool _selectTreeItem); 152 void onSelectedItemsChanged(); 153 154 void changeListenerCallback (juce::ChangeBroadcaster* _source) override; 155 156 static void selectTreeItem(TreeItem* _item); 157 158 Editor& m_editor; 159 160 Tree* m_treeDS = nullptr; 161 Tree* m_treeTags = nullptr; 162 List* m_list = nullptr; 163 Grid* m_grid = nullptr; 164 Info* m_info = nullptr; 165 166 SearchTree* m_searchTreeDS = nullptr; 167 SearchTree* m_searchTreeTags = nullptr; 168 SearchList* m_searchList = nullptr; 169 Status* m_status = nullptr; 170 171 State m_state; 172 173 std::map<Tree*, std::set<const TreeItem*>> m_selectedItems; 174 175 juce::StretchableLayoutManager m_stretchableManager; 176 177 ResizerBar m_resizerBarA{*this, &m_stretchableManager, 1}; 178 ResizerBar m_resizerBarB{*this, &m_stretchableManager, 3}; 179 ResizerBar m_resizerBarC{*this, &m_stretchableManager, 5}; 180 181 std::unordered_map<pluginLib::patchDB::TagType, std::string> m_tagTypeNames; 182 183 LayoutType m_layout = LayoutType::List; 184 bool m_firstTimeGridLayout = true; 185 }; 186 }