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);
142 new MidiControllerTable(machine, item);
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));
218 m->machine.midi_modifyCurrent(m->param, 0, 0, toggle, toggle_behaviour);
221 case RESPONSE_DELETE:
222 m->machine.midi_deleteParameter(m->param);
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);
261 m->machine.midi_set_config_mode(
false);
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);
282 if (!m->machine.midi_get_config_mode(&ctl)) {
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());
330 m->machine.midi_set_current_control(n);
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());
369 float lower = param.getLowerAsFloat();
370 float upper = param.getUpperAsFloat();
371 float step = param.getStepAsFloat();
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"));
413 g_signal_connect(dialog,
"response", G_CALLBACK(midi_response_cb),
this);
414 g_signal_connect(dialog,
"destroy", G_CALLBACK(midi_destroy_cb),
this);
415 g_signal_connect(entry_new,
"changed", G_CALLBACK(changed_text_handler),
this);
416 g_signal_connect(use_toggle,
"toggled", G_CALLBACK(toggle_behaviours_visibility),
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);
426 g_timeout_add(40, check_midi_cb,
this);
427 g_object_unref(G_OBJECT(builder));