32 GtkWidget *MidiControllerTable::window = 0;
34 void MidiControllerTable::response_cb(GtkWidget *widget, gint response_id, gpointer data) {
35 MidiControllerTable& m = *
reinterpret_cast<MidiControllerTable*
>(data);
36 if (response_id == RESPONSE_DELETE_SELECTED) {
38 GList *list = gtk_tree_selection_get_selected_rows(m.selection, &model);
39 gtk_tree_selection_unselect_all(m.selection);
40 for (GList *p = g_list_last(list); p; p = g_list_previous(p)) {
42 gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter,
43 reinterpret_cast<GtkTreePath*>(p->data));
45 gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 7, &
id, -1);
47 m.machine.midi_deleteParameter(m.machine.get_parameter(
id));
48 m.midi_conn.unblock();
49 gtk_tree_path_free(reinterpret_cast<GtkTreePath*>(p->data));
52 m.machine.signal_midi_changed()();
55 m.menuaction->set_active(
false);
58 void MidiControllerTable::destroy_cb(GtkWidget*, gpointer data) {
59 delete reinterpret_cast<MidiControllerTable*
>(data);
62 void MidiControllerTable::edited_cb(
63 GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer data) {
64 GtkListStore *store = GTK_LIST_STORE(data);
66 gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(store), &iter, path);
68 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &ctrl, -1);
70 bool valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
74 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &n, -1);
76 gtk_list_store_set(store, &iter, 1, name, -1);
78 valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
82 void MidiControllerTable::toggleButtonSetSwitch(GtkWidget *w, gpointer data) {
84 p->
set(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)));
87 void MidiControllerTable::set(
bool v) {
88 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(togglebutton), v);
91 void MidiControllerTable::load() {
93 gtk_list_store_clear(store);
94 for (
int i = 0; i < machine.
midi_size(); i++) {
96 for (gx_engine::midi_controller_list::iterator j = cl.begin(); j != cl.end(); ++j) {
110 if (j->is_toggle()) {
120 gtk_list_store_append(store, &iter);
121 gtk_list_store_set(store, &iter,
136 if (!item->get_active()) {
138 gtk_widget_destroy(window);
147 MidiControllerTable::~MidiControllerTable() {
156 GtkBuilder * builder = gtk_builder_new();
158 store = GTK_LIST_STORE(gtk_builder_get_object(builder,
"liststore1"));
159 togglebutton = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder,
"save_controller"));
162 gtk_toggle_button_set_active(togglebutton, p.
get_value());
163 machine.
signal_parameter_value<
bool>(
"system.midi_in_preset").connect(sigc::mem_fun(*
this, &MidiControllerTable::set));
164 g_signal_connect(GTK_OBJECT(togglebutton),
"toggled",
165 G_CALLBACK(toggleButtonSetSwitch), (gpointer)&p);
170 selection = gtk_tree_view_get_selection(
171 GTK_TREE_VIEW(gtk_builder_get_object(builder,
"treeview1")));
172 gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
173 gtk_widget_set_redraw_on_allocate(GTK_WIDGET(gtk_builder_get_object(builder,
"dialog-vbox1")),
true);
174 gtk_widget_set_redraw_on_allocate(GTK_WIDGET(gtk_builder_get_object(builder,
"dialog-vbox2")),
true);
177 g_signal_connect(window,
"destroy", G_CALLBACK(destroy_cb),
this);
178 g_signal_connect(window,
"response", G_CALLBACK(response_cb),
this);
179 g_signal_connect(G_OBJECT(gtk_builder_get_object(builder,
"cellrenderertext2")),
180 "edited", G_CALLBACK(edited_cb), store);
185 gtk_widget_show(window);
186 g_object_unref(G_OBJECT(builder));
188 sigc::mem_fun(*
this, &MidiControllerTable::load));
196 string MidiConnect::ctr_desc(
int ctr) {
200 return "(" + p +
")";
206 switch (response_id) {
207 case GTK_RESPONSE_OK:
210 assert(m->adj_lower);
211 assert(m->adj_upper);
212 float lower = gtk_adjustment_get_value(m->adj_lower);
213 float upper = gtk_adjustment_get_value(m->adj_upper);
214 m->machine.
midi_modifyCurrent(m->param, lower, upper,
false, gx_engine::Parameter::toggle_type::OnOff);
216 bool toggle = gtk_toggle_button_get_active(m->use_toggle);
217 int toggle_behaviour = gtk_combo_box_get_active(GTK_COMBO_BOX(m->toggle_behaviours));
221 case RESPONSE_DELETE:
224 case GTK_RESPONSE_HELP:
225 static string midiconnecthelp;
226 if (midiconnecthelp.empty()) {
227 midiconnecthelp +=_(
"\n Guitarix:Midi learn \n");
229 _(
" Just move your midi controller to connect it \n" 230 " with the selected guitarix Controller. \n" 231 " As soon the Midi Controller is detected, \n" 232 " you will see the Controller Number in the \n" 233 " Midi Controller Number field. Press 'OK' to connect it, \n" 234 " or move a other Midi controller. \n" 235 " A exception is the MIDI BEAT CLOCK, \n" 236 " which isn't a Controller itself,\n" 237 " but could be used here to sync BPM controllers \n" 238 " with external devices. \n" 239 " To use it, you must insert '22' as Midi Controller Number \n" 241 " The same is true for the MIDI CLOCK start/stop function, \n" 242 " which could be used to switch effects on/off. \n" 243 " To use it, you must insert '23' as Midi Controller Number. \n\n" 244 " Also Jack Transport is supported and can be used to control \n" 245 " switch controllers (on/off) by connect then to \n" 246 " Midi Controller Number '24'. \n" 256 gtk_widget_destroy(m->dialog);
266 int b = gtk_toggle_button_get_active(m->use_toggle);
267 gtk_widget_set_sensitive(gtk_widget_get_parent(m->toggle_behaviours), b);
270 const char* MidiConnect::ctl_to_str(
int n) {
275 snprintf(buf,
sizeof(buf),
"%3d", n);
286 if (m->current_control == ctl)
288 m->current_control = ctl;
289 gtk_entry_set_text(GTK_ENTRY(m->entry_new), ctl_to_str(ctl));
291 gtk_toggle_button_set_active(m->use_toggle,
true);
292 gtk_combo_box_set_active(GTK_COMBO_BOX(m->toggle_behaviours), gx_engine::Parameter::toggle_type::Constant);
299 gchar *p = gtk_editable_get_chars(editable, 0, -1);
301 for (
const char *q = p; *q; q++) {
306 string str = buf.str();
309 istringstream i(buf.str());
316 str = b.str().substr(0, 3);
323 gtk_dialog_set_response_sensitive(GTK_DIALOG(m->dialog), GTK_RESPONSE_OK, FALSE);
324 gtk_dialog_set_default_response(GTK_DIALOG(m->dialog), GTK_RESPONSE_CANCEL);
326 gtk_dialog_set_response_sensitive(GTK_DIALOG(m->dialog), GTK_RESPONSE_OK, TRUE);
327 gtk_dialog_set_default_response(GTK_DIALOG(m->dialog), GTK_RESPONSE_OK);
329 gtk_label_set_text(GTK_LABEL(m->label_desc), ctr_desc(n).c_str());
331 m->current_control = n;
334 gtk_editable_delete_text(editable, 0, -1);
336 gtk_editable_insert_text(editable, str.c_str(), str.size(), &position);
346 GtkBuilder * builder = gtk_builder_new();
348 use_toggle = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder,
"use_toggle"));
349 toggle_behaviours = GTK_WIDGET(gtk_builder_get_object(builder,
"toggle_behaviours"));
350 GtkWidget *zn = GTK_WIDGET(gtk_builder_get_object(builder,
"zone_name"));
351 GtkStyle *style = gtk_widget_get_style(zn);
352 pango_font_description_set_size(style->font_desc, 12*PANGO_SCALE);
353 pango_font_description_set_weight(style->font_desc, PANGO_WEIGHT_BOLD);
354 gtk_widget_modify_font(zn, style->font_desc);
355 gtk_label_set_text(GTK_LABEL(zn), (param.
l_group() +
": " + param.
l_name()).c_str());
356 gtk_widget_set_tooltip_text(zn, (_(
"Parameter ID: ")+param.
id()).c_str());
357 zn = GTK_WIDGET(gtk_builder_get_object(builder,
"desc_box"));
358 if (param.
desc().empty()) {
361 GtkWidget *desc = GTK_WIDGET(gtk_builder_get_object(builder,
"desc"));
362 gtk_label_set_text(GTK_LABEL(desc), param.
l_desc().c_str());
372 GtkSpinButton *spinner;
373 adj_lower = GTK_ADJUSTMENT(gtk_adjustment_new(lower, lower, upper, step, 10*step, 0));
374 spinner = GTK_SPIN_BUTTON(gtk_builder_get_object(builder,
"lower"));
375 float climb_rate = 0.0;
376 gtk_spin_button_configure(spinner, adj_lower, climb_rate,
gx_gui::precision(step));
377 adj_upper = GTK_ADJUSTMENT(gtk_adjustment_new(upper, lower, upper, step, 10*step, 0));
378 spinner = GTK_SPIN_BUTTON(gtk_builder_get_object(builder,
"upper"));
379 gtk_spin_button_configure(spinner, adj_upper, climb_rate,
gx_gui::precision(step));
381 gtk_adjustment_set_value(adj_lower, pctrl->
lower());
382 gtk_adjustment_set_value(adj_upper, pctrl->
upper());
384 gtk_widget_hide(gtk_widget_get_parent(gtk_widget_get_parent(GTK_WIDGET(use_toggle))));
386 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(builder,
"range_label")));
387 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(builder,
"range_box")));
389 store = GTK_LIST_STORE(gtk_builder_get_object(builder,
"liststore2"));
391 gtk_list_store_clear(store);
392 for (std::map<gx_engine::Parameter::toggle_type, const char*>::iterator it = toggle_behaviour_descriptions.begin();
393 it!=toggle_behaviour_descriptions.end(); ++it) {
394 gtk_list_store_append(store, &iter);
395 gtk_list_store_set(store, &iter, 0, it->first, 1, it->second, -1);
397 gtk_combo_box_set_model(GTK_COMBO_BOX(toggle_behaviours), GTK_TREE_MODEL(store));
399 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
400 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(toggle_behaviours), renderer, TRUE);
401 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(toggle_behaviours), renderer,
"text", 1, NULL);
402 gtk_combo_box_set_active(GTK_COMBO_BOX(toggle_behaviours), gx_engine::Parameter::toggle_type::OnOff);
404 gtk_toggle_button_set_active(use_toggle, pctrl->
is_toggle());
405 gtk_combo_box_set_active(GTK_COMBO_BOX(toggle_behaviours), pctrl->
toggle_behaviour());
407 int b = gtk_toggle_button_get_active(use_toggle);
408 gtk_widget_set_sensitive(gtk_widget_get_parent(toggle_behaviours), b);
410 entry_new = GTK_WIDGET(gtk_builder_get_object(builder,
"new"));
411 label_desc = GTK_WIDGET(gtk_builder_get_object(builder,
"new_desc"));
414 g_signal_connect(dialog,
"destroy", G_CALLBACK(
midi_destroy_cb),
this);
418 gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), RESPONSE_DELETE, FALSE);
419 gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, FALSE);
420 gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_HELP, TRUE);
421 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
425 gtk_widget_show(dialog);
427 g_object_unref(G_OBJECT(builder));
static void changed_text_handler(GtkEditable *entry, gpointer data)
MidiStandardControllers midi_std_ctr
virtual Parameter & get_parameter(const std::string &id)=0
virtual float getUpperAsFloat() const
MidiConnect(GdkEventButton *event, gx_engine::Parameter ¶m, gx_engine::GxMachineBase &machine)
virtual int midi_size()=0
ctrl_type getControlType() const
static void midi_response_cb(GtkWidget *widget, gint response_id, gpointer data)
static gboolean check_midi_cb(gpointer)
virtual midi_controller_list & midi_get(int n)=0
virtual float getStepAsFloat() const
virtual void midi_set_config_mode(bool v, int ctl=-1)=0
virtual float getLowerAsFloat() const
virtual void midi_modifyCurrent(Parameter ¶m, float lower, float upper, bool toggle, int toggle_behaviour)=0
static void toggle(gx_engine::GxMachineBase &machine, Glib::RefPtr< Gtk::ToggleAction > item)
virtual sigc::signal< void > & signal_midi_changed()=0
virtual int midi_param2controller(Parameter ¶m, const MidiController **p)=0
list< MidiController > midi_controller_list
const string & desc() const
static void toggle_behaviours_visibility(GtkWidget *widget, gpointer data)
virtual void midi_set_current_control(int v)=0
GtkWidget * load_toplevel(GtkBuilder *builder, const char *filename, const char *windowname)
virtual void midi_deleteParameter(Parameter ¶m)=0
static void midi_destroy_cb(GtkWidget *widget, gpointer data)
void replace(int ctr, const string &name)
int toggle_behaviour() const
virtual bool midi_get_config_mode(int *ctl=0)=0
sigc::signal< void, T > & signal_parameter_value(const std::string &id)
BoolParameter & getBool()
std::string fformat(float value, float step)
const string & id() const
int gx_message_popup(const char *)