File: GridController.h

package info (click to toggle)
bespokesynth 1.3.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 44,716 kB
  • sloc: cpp: 117,136; ansic: 18,752; python: 593; xml: 74; makefile: 4
file content (143 lines) | stat: -rw-r--r-- 4,711 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/**
    bespoke synth, a software modular synthesizer
    Copyright (C) 2021 Ryan Challinor (contact: awwbees@gmail.com)

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
**/
//
//  GridController.h
//  Bespoke
//
//  Created by Ryan Challinor on 2/9/15.
//
//

#pragma once

#include "IUIControl.h"
#include "MidiController.h"

#define MAX_GRIDCONTROLLER_ROWS 512
#define MAX_GRIDCONTROLLER_COLS 512

class IGridController;
class PatchCableSource;

enum GridColor
{
   kGridColorOff,
   kGridColor1Dim,
   kGridColor1Bright,
   kGridColor2Dim,
   kGridColor2Bright,
   kGridColor3Dim,
   kGridColor3Bright
};

class IGridControllerListener
{
public:
   virtual ~IGridControllerListener() {}
   virtual void OnControllerPageSelected() = 0;
   virtual void OnGridButton(int x, int y, float velocity, IGridController* grid) = 0;
};

class IGridController
{
public:
   virtual ~IGridController() {}
   virtual void SetGridControllerOwner(IGridControllerListener* owner) = 0;
   virtual void SetLight(int x, int y, GridColor color, bool force = false) = 0;
   virtual void SetLightDirect(int x, int y, int color, bool force = false) = 0;
   virtual void ResetLights() = 0;
   virtual int NumCols() = 0;
   virtual int NumRows() = 0;
   virtual bool HasInput() const = 0;
   virtual bool IsMultisliderGrid() const { return false; }
   virtual bool IsConnected() const = 0;
};

class GridControlTarget : public IUIControl
{
public:
   GridControlTarget(IGridControllerListener* owner, const char* name, int x, int y);
   virtual ~GridControlTarget() {}

   void Render() override;
   static void DrawGridIcon(float x, float y);

   void SetGridController(IGridController* gridController)
   {
      mGridController = gridController;
      gridController->SetGridControllerOwner(mOwner);
   }
   IGridController* GetGridController() { return mGridController; }

   //IUIControl
   void SetFromMidiCC(float slider, double time, bool setViaModulator) override {}
   void SetValue(float value, double time, bool forceUpdate = false) override {}
   bool CanBeTargetedBy(PatchCableSource* source) const override;
   void SaveState(FileStreamOut& out) override;
   void LoadState(FileStreamIn& in, bool shouldSetValue = true) override;
   bool IsSliderControl() override { return false; }
   bool IsButtonControl() override { return false; }
   bool GetNoHover() const override { return true; }

private:
   void GetDimensions(float& width, float& height) override
   {
      width = 30;
      height = 15;
   }
   bool MouseMoved(float x, float y) override;

   IGridControllerListener* mOwner{ nullptr };
   IGridController* mGridController{ nullptr };
};

class GridControllerMidi : public IGridController
{
public:
   GridControllerMidi();
   virtual ~GridControllerMidi() {}

   void SetUp(GridLayout* layout, int page, MidiController* controller);
   void UnhookController();

   //IGridController
   void SetGridControllerOwner(IGridControllerListener* owner) override { mOwner = owner; }
   void SetLight(int x, int y, GridColor color, bool force = false) override;
   void SetLightDirect(int x, int y, int color, bool force = false) override;
   void ResetLights() override;
   int NumCols() override { return mCols; }
   int NumRows() override { return mRows; }
   bool HasInput() const override;
   //bool IsMultisliderGrid() const override { return mColors.empty(); }   //commented out... don't remember what types of grids this is supposed to be for
   bool IsConnected() const override { return mMidiController != nullptr; }

   void OnControllerPageSelected();
   void OnInput(int control, float velocity);

private:
   unsigned int mRows{ 8 };
   unsigned int mCols{ 8 };
   int mControls[MAX_GRIDCONTROLLER_COLS][MAX_GRIDCONTROLLER_ROWS]{};
   float mInput[MAX_GRIDCONTROLLER_COLS][MAX_GRIDCONTROLLER_ROWS]{};
   int mLights[MAX_GRIDCONTROLLER_COLS][MAX_GRIDCONTROLLER_ROWS]{};
   std::vector<int> mColors;
   MidiMessageType mMessageType{ MidiMessageType::kMidiMessage_Note };
   MidiController* mMidiController{ nullptr };
   int mControllerPage{ 0 };
   IGridControllerListener* mOwner{ nullptr };
};