gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

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 }