1 /*
2  * Copyright (C) 2017 Hermann Meyer, Andreas Degert
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 
19 #pragma once
20 
21 #ifndef SRC_HEADERS_GX_SEQUENCER_SETTINGS_H_
22 #define SRC_HEADERS_GX_SEQUENCER_SETTINGS_H_
23 
24 
25 #include <string>
26 
27 namespace gx_seq {
28 
29 class Drums {
30  public:
31     gx_engine::SeqParameter *p;
32     Gtk::Box* box;
Drums(gx_engine::SeqParameter * pa)33     Drums(gx_engine::SeqParameter *pa)
34     : p(pa) {}
~Drums()35     ~Drums() {}
36 };
37 
38 class UPresetListStore: public Gtk::ListStore {
39  public:
40     class UPresetListColumns : public Gtk::TreeModel::ColumnRecord {
41      public:
42         Gtk::TreeModelColumn<Glib::ustring> name;
UPresetListColumns()43         UPresetListColumns() { add(name); }
44     } col;
45  private:
UPresetListStore()46     UPresetListStore(): Gtk::ListStore(), col() {
47         set_column_types(col);
48     }
49  public:
create()50     static Glib::RefPtr<UPresetListStore> create() {
51         return Glib::RefPtr<UPresetListStore>(new UPresetListStore);
52     }
53 };
54 
55 /****************************************************************
56  ** PluginPresetConnectWindow
57  */
58 
59 class PluginPresetConnectWindow: public Gtk::Window {
60  private:
61     Glib::RefPtr<UPresetListStore> upresetliststore;
62     gx_engine::GxMachineBase& machine;
63     Gtk::TreeView *treeview;
64     Gtk::Button *connectbutton;
65     void on_connect();
66     void on_selection_changed();
67     virtual bool on_key_press_event(GdkEventKey *event);
68     static PluginPresetConnectWindow* create_from_builder(
69       BaseObjectType* cobject, Glib::RefPtr<gx_gui::GxBuilder> bld,
70       gx_engine::GxMachineBase& machine);
71     PluginPresetConnectWindow(BaseObjectType* cobject,
72       Glib::RefPtr<gx_gui::GxBuilder> bld, gx_engine::GxMachineBase& machine);
73  public:
74     ~PluginPresetConnectWindow();
75     static PluginPresetConnectWindow *create(gx_engine::GxMachineBase& machine);
76     void run();
77 };
78 
79 /****************************************************************
80  ** Sequencer Parameter Window
81  */
82 
83 class SEQWindow: public sigc::trackable {
84 private:
85     gx_engine::GxMachineBase& machine;
86     Glib::RefPtr<gx_gui::GxBuilder> builder;
87     std::vector<Drums> drums;
88     Drums tom;
89     Drums tom1;
90     Drums tom2;
91     Drums kick;
92     Drums snare;
93     Drums hat;
94     bool is_active;
95 
96     //  widget pointers
97     Gtk::Window* gtk_window;
98     Gtk::Viewport *vp;
99     Gtk::Label *preset_label;
100     Gtk::Box *preset_button;
101     Gxw::Switch *add_button;
102     Gxw::Regler *seq_pos;
103     Gxw::Regler *seq_count;
104     Gxw::Regler *seq_tact;
105     Gxw::Switch *next_preset;
106     Gxw::Switch *previus_preset;
107     Gxw::Switch *set_step;
108     Gxw::Switch *set_fstep;
109     Gxw::Switch *set_sync;
110     Gxw::Switch *reset_step;
111     Gtk::Label *step_label;
112     Gxw::ValueDisplay *step_value;
113 
114     // signal functions
115     void on_window_hide();
116     void on_preset_popup_clicked();
117     void on_selection_done(Gtk::Menu *presetMenu);
118     bool get_sequencer_pos(Gxw::Regler * regler, const std::string id);
119     bool on_key_press_event(GdkEventKey *event);
120     void check_preset_label();
121     void seq_changed(const gx_engine::GxSeqSettings* seqc, Gtk::Box *box);
122     void make_state(gx_engine::GxSeqSettings& seqc, std::vector<int> seq);
123     void on_seq_button_clicked(Gtk::Box *box, gx_engine::SeqParameter *p);
124     void on_seq_button_clicked_set(Gtk::Box *box, gx_engine::SeqParameter *p);
125     void on_sec_length_changed(bool update);
126     void on_sec_tact_changed();
127     void append_seq_block(Gtk::Box * box, gx_engine::SeqParameter *p, int r, int r_save);
128     void remove_seq_block(Gtk::Box * box, int r);
129     void reset_control(Glib::ustring id, float value);
130     int append_sequence(const gx_engine::GxSeqSettings* seqc, gx_engine::SeqParameter *p, std::vector<int> *sequence);
131     void make_preset_button(Gtk::Box *box);
132     void scroll_playhead(float value);
133     void append_plugin_preset(Glib::ustring name);
134     void append_plugin_preset_set(Glib::ustring name);
135     void on_preset_add_clicked();
136     void on_next_preset();
137     void on_next_preset_set();
138     void on_previus_preset();
139     void on_previus_preset_set();
140     void connect_midi();
141     void on_set_step();
142     void on_set_fstep();
143     void on_sync_stepper();
144     void on_reset_stepper();
145     void init_connect();
146     void init_sequences(gx_engine::SeqParameter *p, Gtk::Box* _box);
147     SEQWindow(const Glib::RefPtr<gx_gui::GxBuilder>& builder, gx_engine::SeqParameter *tomp_,
148               gx_engine::SeqParameter *tomp1_, gx_engine::SeqParameter *tomp2_,
149               gx_engine::SeqParameter *kickp_, gx_engine::SeqParameter *snarep_,
150               gx_engine::SeqParameter *hatp_, gx_engine::GxMachineBase& machine_);
151 
152 public:
153     void reload_and_show();
154     static SEQWindow *create(const std::string& unit_id, gx_engine::GxMachineBase& machine);
155     ~SEQWindow();
156 };
157 
158 } /* end of gx_seq namespace*/
159 #endif  // SRC_HEADERS_GX_SEQUENCER_SETTINGS_H_
160