grid.h (2480B)
1 #pragma once 2 3 #include "griditemcontainer.h" 4 #include "gridviewport.h" 5 #include "listmodel.h" 6 7 #include "juce_gui_basics/juce_gui_basics.h" 8 9 namespace jucePluginEditorLib::patchManager 10 { 11 class GridItem; 12 13 class Grid : public ListModel, public juce::Component 14 { 15 public: 16 static constexpr uint32_t InvalidItem = ~0; 17 18 Grid(PatchManager& _pm); 19 ~Grid() override; 20 21 Grid(Grid&&) = delete; 22 Grid(const Grid&) = delete; 23 Grid& operator = (Grid&&) = delete; 24 Grid& operator = (const Grid&) = delete; 25 26 void paint(juce::Graphics& g) override; 27 28 auto getItemWidth() const { return m_itemWidth; } 29 auto getItemHeight() const { return m_itemHeight; } 30 auto getSuggestedItemsPerRow() const { return m_suggestedItemsPerRow; } 31 32 void setItemWidth(float _width); 33 void setItemHeight(float _height); 34 void setSuggestedItemsPerRow(uint32_t _count); 35 36 void setVisibleItemRange(const std::pair<uint32_t, uint32_t>& _range); 37 38 const GridViewport& getViewport() const { return m_viewport; } 39 40 bool isSelected(const uint32_t _index) 41 { 42 return m_selectedItems.find(_index) != m_selectedItems.end(); 43 } 44 45 void selectItem(uint32_t _index, bool _deselectOthers); 46 void deselectItem(uint32_t _index); 47 GridItem* getItem(uint32_t _index) const; 48 void selectRange(uint32_t _newIndex); 49 bool keyPressed(const juce::KeyPress& _key) override; 50 51 private: 52 void resized() override; 53 int getNeededColumnCount(); 54 int getVisibleRowCount() const; 55 void updateViewportSize(); 56 void handleKeySelection(int _offsetX, int _offsetY, bool _shift); 57 std::pair<int, int> getXY(uint32_t _index) const; 58 59 public: 60 // ListModel 61 juce::Colour findColor(int _colorId) override; 62 const juce::LookAndFeel& getStyle() const override; 63 void onModelChanged() override; 64 void redraw() override; 65 void ensureVisible(int _row) override; 66 int getSelectedEntry() const override; 67 juce::SparseSet<int> getSelectedEntries() const override; 68 void deselectAll() override; 69 void setSelectedEntries(const juce::SparseSet<int>&) override; 70 juce::Rectangle<int> getEntryPosition(int _row, bool _relativeToComponentTopLeft) override; 71 72 private: 73 float m_itemHeight = 15; 74 float m_itemWidth = 140; 75 uint32_t m_suggestedItemsPerRow = 32; 76 77 GridViewport m_viewport; 78 GridItemContainer m_itemContainer; 79 80 std::map<uint32_t, std::unique_ptr<GridItem>> m_items; 81 std::list<std::unique_ptr<GridItem>> m_itemPool; 82 std::set<uint32_t> m_selectedItems; 83 uint32_t m_lastSelectedItem = InvalidItem; 84 }; 85 }