Control Surface  1.2.0
MIDI Control Surface library for Arduino
Selector.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Selectable.hpp"
5 #include <AH/Debug/Debug.hpp>
6 #include <Def/Def.hpp>
7 
9 
14 enum class Wrap : bool {
15  Clamp = false,
16  Wrap = true,
19  NoWrap = false,
21 };
22 
26  void begin() {}
28  void update() {}
30  void update(setting_t oldSetting, setting_t newSetting) {
31  (void)oldSetting, (void)newSetting;
32  }
33 };
34 
40 class SelectorBase {
41  protected:
43  SelectorBase() = default;
44 
45  public:
47  setting_t get() const { return setting; }
48 
49  protected:
54 };
55 
56 template <setting_t N, class Callback = EmptySelectorCallback>
57 class GenericSelector : public SelectorBase, public AH::Updatable<> {
58  public:
72 
73  void begin() override {
74  callback.begin();
75  reset();
76  }
77 
78  void update() override { callback.update(); }
79 
81  void reset() {
82  setting_t initialSelection = selectable.getInitialSelection();
83  selectable.select(initialSelection);
84  callback.update(initialSelection, initialSelection);
85  this->setting = initialSelection;
86  }
87 
94  void set(setting_t newSetting) {
95  newSetting = selectable.validateSetting(newSetting);
96  selectable.select(newSetting);
97  if (get() != newSetting) {
98  callback.update(get(), newSetting);
99  this->setting = newSetting;
100  }
101  }
102 
110  void increment(Wrap wrap) {
111  setting_t setting = this->get();
112  setting++;
113  if (setting == N) {
114  if (wrap == Wrap::Wrap)
115  setting = 0;
116  else
117  return;
118  }
119  this->set(setting);
120  }
121 
129  void decrement(Wrap wrap) {
130  setting_t setting = this->get();
131  if (setting == 0) {
132  if (wrap == Wrap::Wrap)
133  setting = N;
134  else
135  return;
136  }
137  setting--;
138  this->set(setting);
139  }
140 
141  private:
143 
144  public:
145  Callback callback;
146 };
147 
154 template <setting_t N>
155 class Selector : public GenericSelector<N> {
156  public:
159 };
160 
SelectorBase::setting
setting_t setting
The selection of the selector.
Definition: Selector.hpp:53
Selector
A Selector with an empty callback.
Definition: Selector.hpp:155
Selector::Selector
Selector(Selectable< N > &selectable)
Constructor.
Definition: Selector.hpp:158
GenericSelector::begin
void begin() override
Initialize this updatable.
Definition: Selector.hpp:73
AH::Updatable
A super class for object that have to be updated regularly.
Definition: Updatable.hpp:195
EmptySelectorCallback::update
void update(setting_t oldSetting, setting_t newSetting)
Called when the setting changes.
Definition: Selector.hpp:30
SelectorBase::SelectorBase
SelectorBase()=default
Constructor.
Updatable.hpp
SelectorBase::get
setting_t get() const
Get the current selection/setting.
Definition: Selector.hpp:47
SelectorBase
Base class for all Selectors exposing the get method, so it can be used by display elements etc,...
Definition: Selector.hpp:40
Def.hpp
GenericSelector::update
void update() override
Update this updatable.
Definition: Selector.hpp:78
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:9
Selectable.hpp
Selectable
Definition: Selectable.hpp:11
GenericSelector::callback
Callback callback
Definition: Selector.hpp:145
GenericSelector::increment
void increment(Wrap wrap)
Add one to the setting, wrap around or clamp, depending on the parameter, if the new setting would be...
Definition: Selector.hpp:110
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:10
EmptySelectorCallback
A callback for the GenericSelector class that does nothing.
Definition: Selector.hpp:24
GenericSelector::GenericSelector
GenericSelector(Selectable< N > &selectable, const Callback &callback)
Constructor.
Definition: Selector.hpp:70
Wrap
Wrap
An enumeration to set the behavior of selectors that are incremented (decremented) beyond their maxim...
Definition: Selector.hpp:14
GenericSelector
Definition: Selector.hpp:57
GenericSelector::reset
void reset()
Reset the selection to the initial selection.
Definition: Selector.hpp:81
GenericSelector::set
void set(setting_t newSetting)
Select the given selection.
Definition: Selector.hpp:94
EmptySelectorCallback::update
void update()
Refresh, called periodically.
Definition: Selector.hpp:28
setting_t
uint8_t setting_t
The type used for Selectors.
Definition: Def.hpp:50
GenericSelector::decrement
void decrement(Wrap wrap)
Subtract one from the setting, wrap around or clamp, depending on the parameter, if the new setting w...
Definition: Selector.hpp:129
Debug.hpp
GenericSelector::selectable
Selectable< N > & selectable
Definition: Selector.hpp:142
EmptySelectorCallback::begin
void begin()
Initialize.
Definition: Selector.hpp:26
Wrap::Clamp
@ Clamp
When the maximum (minimum) setting is reached, clamp to the maximum (minimum) setting.