33 const char *
display_type_names[] = {
"Scale",
"Log. Scale",
"Toggle",
"Enum",
"Display",
"Led",
"Hide",
"Int" };
40 static const char *menudef =
"\ 42 <menubar name=\"ladspalist\">\n\ 43 <menu action=\"FileMenuAction\">\n\ 44 <menuitem action=\"SelectAllAction\" />\n\ 45 <menuitem action=\"SelectNoneAction\" />\n\ 46 <menuitem action=\"SaveAction\" />\n\ 47 <menuitem action=\"ApplyAction\" />\n\ 48 <menuitem action=\"QuitAction\" />\n\ 50 <menu action=\"ViewMenuAction\">\n\ 51 <menuitem action= \"FindAction\" />\n\ 57 static void append_displaytype(Glib::RefPtr<Gtk::ListStore> ls,
DisplayType tp) {
58 Gtk::TreeIter it = ls->append();
59 it->set_value(0, ustring(display_type_names[tp]));
74 : machine(machine_), pluginlist(), needs_reload(), current_plugin(0), old_state(0), bld(), change_count(0),
75 actiongroup(Gtk::ActionGroup::create(
"ladspa_window")), uimanager(),
78 on_reordered_conn(), display_type_list(), display_type_list_sr(), output_type_list(),
79 finished_callback(finished_callback_), reload_plug(false)
81 std::vector<std::string> old_not_found;
84 bld->get_toplevel(
"window1", window);
85 bld->find_widget(
"treeview1", treeview1);
86 bld->find_widget(
"treeview2", treeview2);
87 bld->find_widget(
"treeview3", treeview3);
88 bld->find_widget(
"ladspa_category", ladspa_category);
89 bld->find_widget(
"ladspa_maker", ladspa_maker);
90 bld->find_widget(
"ladspa_uniqueid", ladspa_uniqueid);
91 bld->find_widget(
"search_entry", search_entry);
92 bld->find_widget(
"combobox_mono_stereo", combobox_mono_stereo);
93 bld->find_widget(
"selected_only", selected_only);
94 bld->find_widget(
"changed_only", changed_only);
95 bld->find_widget(
"ladspa_only", ladspa_only);
96 bld->find_widget(
"lv2_only", lv2_only);
97 bld->find_widget(
"show_all", show_all);
98 bld->find_widget(
"details_box", details_box);
99 bld->find_widget(
"plugin_name", plugin_name);
100 bld->find_widget(
"plugin_category", plugin_category);
101 bld->find_widget(
"plugin_quirks", plugin_quirks);
102 bld->find_widget(
"master_slider_idx", master_slider_idx);
103 bld->find_widget(
"master_slider_name", master_slider_name);
104 bld->find_widget(
"cellrenderer_master", cellrenderer_master);
105 bld->find_widget(
"cellrenderer_newrow", cellrenderer_newrow);
106 bld->find_widget(
"cellrenderer_caption", cellrenderer_caption);
107 bld->find_widget(
"cellrenderer_active", cellrenderer_active);
108 bld->find_widget(
"cellrenderer_category", cellrenderer_category);
109 bld->find_widget(
"cellrenderer_quirks", cellrenderer_quirks);
112 treeview1->set_name(
"PresetView");
113 treeview2->set_name(
"PresetView");
114 treeview3->set_name(
"PresetView");
115 actiongroup->add(Gtk::Action::create(
"FileMenuAction",_(
"_File")));
116 save_action = Gtk::Action::create(
"SaveAction", _(
"_Ok"));
117 actiongroup->add(save_action, sigc::mem_fun(
this, &PluginDisplay::on_save));
118 apply_action = Gtk::Action::create(
"ApplyAction", _(
"_Apply"));
119 actiongroup->add(apply_action, sigc::mem_fun(
this, &PluginDisplay::on_apply));
120 quit_action = Gtk::Action::create(
"QuitAction", _(
"_Quit"));
121 actiongroup->add(quit_action, sigc::mem_fun(
this, &PluginDisplay::on_quit));
122 select_all_action = Gtk::Action::create(
"SelectAllAction", _(
"_Select All"));
123 actiongroup->add(select_all_action, sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_select_all),
true));
124 select_none_action = Gtk::Action::create(
"SelectNoneAction", _(
"Select _None"));
125 actiongroup->add(select_none_action, sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_select_all),
false));
126 actiongroup->add(Gtk::Action::create(
"ViewMenuAction", _(
"_View")));
127 Glib::RefPtr<Gtk::Action> act = Gtk::Action::create(
"FindAction", _(
"_Find"));
128 actiongroup->add(act, sigc::mem_fun(
this, &PluginDisplay::on_find));
130 uimanager = Gtk::UIManager::create();
131 uimanager->insert_action_group(actiongroup, 0);
132 uimanager->add_ui_from_string(menudef);
135 window->add_accel_group(uimanager->get_accel_group());
137 window->signal_delete_event().connect(sigc::mem_fun(
this, &PluginDisplay::on_delete_event));
138 bld->find_widget(
"show_details", show_details);
139 show_details->signal_clicked().connect(sigc::mem_fun(
this, &PluginDisplay::on_show_details));
140 treeview3->get_selection()->set_mode(Gtk::SELECTION_BROWSE);
141 treeview3->set_model(enum_liststore);
142 Gtk::CellRendererText *r;
143 bld->find_widget(
"cellrenderer_label", r);
144 r->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_label_edited));
145 Gtk::TreeViewColumn *c;
146 bld->find_widget(
"treeviewcolumn_label", c);
147 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_label));
149 bld->find_widget(
"dry_wet_button", dry_wet_button);
150 dry_wet_button->signal_clicked().connect(sigc::mem_fun(
this, &PluginDisplay::on_add_dry_wet_controller));
153 bld->find_widget(
"stereo_to_mono_button", stereo_to_mono_button);
154 stereo_to_mono_button->signal_clicked().connect(sigc::mem_fun(
this, &PluginDisplay::on_stereo_to_mono_controller));
157 Glib::RefPtr<Gtk::TreeSelection> sel = treeview2->get_selection();
158 sel->set_mode(Gtk::SELECTION_BROWSE);
159 sel->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::on_parameter_selection_changed));
160 on_reordered_conn = port_liststore->signal_row_deleted().connect(sigc::mem_fun(
this, &PluginDisplay::on_reordered));
161 treeview2->set_model(port_liststore);
165 rd->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_type_edited));
166 bld->find_widget(
"treeviewcolumn_type", c);
167 c->set_cell_data_func(*rd, sigc::mem_fun(
this, &PluginDisplay::display_type));
170 rd->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_step_edited));
171 bld->find_widget(
"treeviewcolumn_step", c);
172 c->set_cell_data_func(*rd, sigc::mem_fun(
this, &PluginDisplay::display_step));
174 cellrenderer_newrow->signal_toggled().connect(sigc::mem_fun(
this, &PluginDisplay::on_newrow_toggled));
175 Gtk::Label *label =
new Gtk::Label(
"N");
176 label->set_tooltip_text(_(
"start a new row of controls in the rackbox unit"));
178 bld->find_widget(
"treeviewcolumn_newrow", c);
179 c->set_widget(*manage(label));
180 c->set_cell_data_func(*cellrenderer_newrow, sigc::mem_fun(
this, &PluginDisplay::display_newrow));
181 cellrenderer_caption->signal_toggled().connect(sigc::mem_fun(
this, &PluginDisplay::on_caption_toggled));
182 label =
new Gtk::Label(
"C");
183 label->set_tooltip_text(_(
"display the name as caption above the control"));
185 bld->find_widget(
"treeviewcolumn_caption", c);
186 c->set_widget(*manage(label));
187 c->set_cell_data_func(*cellrenderer_caption, sigc::mem_fun(
this, &PluginDisplay::display_caption));
189 bld->find_widget(
"cellrenderer_name", r);
190 r->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_name_edited));
191 bld->find_widget(
"treeviewcolumn_name", c);
192 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_name));
193 bld->find_widget(
"cellrenderer_dflt", r);
194 r->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_dflt_edited));
195 bld->find_widget(
"treeviewcolumn_dflt", c);
196 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_default));
197 bld->find_widget(
"cellrenderer_low", r);
198 r->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_low_edited));
199 bld->find_widget(
"treeviewcolumn_low", c);
200 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_lower));
201 bld->find_widget(
"cellrenderer_up", r);
202 r->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_up_edited));
203 bld->find_widget(
"treeviewcolumn_up", c);
204 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_upper));
205 bld->find_widget(
"cellrenderer_idx", r);
206 bld->find_widget(
"treeviewcolumn_idx", c);
207 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_idx));
209 bld->find_widget(
"treeviewcolumn_SR", c);
210 label =
new Gtk::Label(
"SR");
211 label->set_tooltip_text(_(
"marked rows: range depends on samplerate; using 44100 as fixed value"));
213 c->set_widget(*manage(label));
214 Gtk::CellRendererToggle *t;
215 bld->find_widget(
"cellrenderer_SR", t);
216 c->set_cell_data_func(*t, sigc::mem_fun(
this, &PluginDisplay::display_SR));
218 Gtk::TreeModelColumnRecord recdef;
219 Gtk::TreeModelColumn<Glib::ustring> strcol;
220 Gtk::TreeModelColumn<DisplayType> intcol;
223 display_type_list = Gtk::ListStore::create(recdef);
224 append_displaytype(display_type_list,
tp_scale);
226 append_displaytype(display_type_list,
tp_toggle);
227 append_displaytype(display_type_list,
tp_int);
228 append_displaytype(display_type_list,
tp_enum);
229 append_displaytype(display_type_list,
tp_none);
230 display_type_list_sr = Gtk::ListStore::create(recdef);
231 append_displaytype(display_type_list_sr,
tp_scale);
233 append_displaytype(display_type_list_sr,
tp_none);
234 output_type_list = Gtk::ListStore::create(recdef);
235 append_displaytype(output_type_list,
tp_display);
237 append_displaytype(output_type_list,
tp_none);
239 treeview1->signal_row_activated().connect(sigc::mem_fun(
this, &PluginDisplay::on_row_activated));
240 treeview1->set_search_equal_func(sigc::mem_fun(
this,&PluginDisplay::search_equal));
242 bld->find_widget(
"search_entry", e);
243 e->signal_activate().connect(sigc::mem_fun(
this, &PluginDisplay::on_search_entry_activate));
244 treeview1->set_search_entry(*e);
245 sel = treeview1->get_selection();
246 sel->set_mode(Gtk::SELECTION_BROWSE);
247 sel->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::selection_changed));
248 treeview1->set_model(plugin_liststore);
249 cellrenderer_active->signal_toggled().connect(sigc::mem_fun(
this, &PluginDisplay::on_active_toggled));
250 bld->find_widget(
"cellrenderer_ladspa", r);
251 bld->find_widget(
"treeviewcolumn_ladspa", c);
252 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_ladspa));
255 bld->find_widget(
"plugin_category", cb);
256 cb->set_cell_data_func(*cellrenderer_category, sigc::mem_fun(
this, &PluginDisplay::display_category));
257 bld->find_widget(
"plugin_quirks", cb);
258 cb->set_cell_data_func(*cellrenderer_quirks, sigc::mem_fun(
this, &PluginDisplay::display_quirks));
260 master_slider_idx->set_cell_data_func(*cellrenderer_master, sigc::mem_fun(
this, &PluginDisplay::display_master_idx));
261 master_slider_idx->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::set_master_text));
263 selected_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), selected_only));
264 changed_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), changed_only));
265 ladspa_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), ladspa_only));
266 lv2_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), lv2_only));
267 show_all->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), show_all));
269 bld->find_widget(
"combobox_mono_stereo", cb);
270 cb->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::on_mono_stereo_changed));
273 bld->find_widget(
"reset_changes", b);
274 b->signal_clicked().connect(sigc::mem_fun(
this, &PluginDisplay::on_delete_changes));
276 bld->find_widget(
"master_slider_idx", cb);
277 cb->set_model(masteridx_liststore);
279 bld->find_widget(
"button_cancel", b);
280 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"QuitAction")->gobj());
281 bld->find_widget(
"button_apply", b);
282 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"ApplyAction")->gobj());
283 bld->find_widget(
"button_save", b);
284 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"SaveAction")->gobj());
285 bld->find_widget(
"select_all", b);
286 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"SelectAllAction")->gobj());
287 bld->find_widget(
"select_none", b);
288 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"SelectNoneAction")->gobj());
290 window->set_icon(icon);
298 static void split(std::vector<ustring>& strvec,
const ustring& str) {
299 size_t start = 0, np = ustring::npos;
301 size_t end = str.find_first_of(
' ', start);
302 size_t len = (end == np) ? np : end - start;
304 strvec.push_back(str.substr(start, len).lowercase());
313 bool PluginDisplay::search_equal(
const Glib::RefPtr<Gtk::TreeModel>& model,
int column,
const ustring& key,
const Gtk::TreeIter& iter) {
314 PluginDesc *p = iter->get_value(plugin_liststore->col.pdesc);
316 if (txt.compare(0, ustring::npos, key, 0, key.size()) == 0) {
319 txt = iter->get_value(plugin_liststore->col.name).lowercase();
320 std::vector<ustring> keyvec;
322 for (std::vector<ustring>::iterator i = keyvec.begin(); i != keyvec.end(); ++i) {
323 if (txt.find(*i) == ustring::npos) {
330 void PluginDisplay::display_step(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
331 PortDesc *q = it->get_value(port_liststore->col.port);
335 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground().set_value(
"red");
337 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground_set().set_value(
false);
341 void PluginDisplay::display_ladspa(Gtk::CellRenderer *cell,
const Gtk::TreeIter& iter) {
342 PluginDesc *p = iter->get_value(plugin_liststore->col.pdesc);
344 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground().set_value(
"red");
346 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground_set().set_value(
false);
350 void PluginDisplay::display_label(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
351 PortDesc *q = it->get_value(enum_liststore->col.port);
352 if (q->
enumkey_changed(
int(it->get_value(enum_liststore->col.value)))) {
353 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground().set_value(
"red");
355 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground_set().set_value(
false);
359 void PluginDisplay::display_idx(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
360 PortDesc *q = it->get_value(port_liststore->col.port);
361 if (
int(port_liststore->get_path(it)[0]) != q->
get_pos()) {
362 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground().set_value(
"red");
364 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground_set().set_value(
false);
368 void PluginDisplay::display_name(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
369 PortDesc *q = it->get_value(port_liststore->col.port);
371 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground().set_value(
"red");
373 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground_set().set_value(
false);
377 void PluginDisplay::display_default(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
378 PortDesc *q = it->get_value(port_liststore->col.port);
379 Gtk::CellRendererText *tcell =
dynamic_cast<Gtk::CellRendererText*
>(cell);
380 tcell->property_foreground_set().set_value(
false);
381 tcell->property_background_set().set_value(
false);
384 cell->property_visible().set_value(
false);
387 cell->property_visible().set_value(
true);
389 tcell->property_foreground().set_value(
"red");
391 tcell->property_background().set_value(
"grey");
395 void PluginDisplay::display_lower(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
396 PortDesc *q = it->get_value(port_liststore->col.port);
397 Gtk::CellRendererText *tcell =
dynamic_cast<Gtk::CellRendererText*
>(cell);
398 tcell->property_foreground_set().set_value(
false);
399 tcell->property_background_set().set_value(
false);
402 cell->property_visible().set_value(
false);
405 cell->property_visible().set_value(
true);
407 tcell->property_foreground().set_value(
"red");
409 tcell->property_background().set_value(
"grey");
413 void PluginDisplay::display_upper(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
414 PortDesc *q = it->get_value(port_liststore->col.port);
415 Gtk::CellRendererText *tcell =
dynamic_cast<Gtk::CellRendererText*
>(cell);
416 tcell->property_foreground_set().set_value(
false);
417 tcell->property_background_set().set_value(
false);
420 cell->property_visible().set_value(
false);
423 cell->property_visible().set_value(
true);
425 tcell->property_foreground().set_value(
"red");
427 tcell->property_background().set_value(
"grey");
431 void PluginDisplay::display_SR(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
432 cell->property_visible().set_value(it->get_value(port_liststore->col.port)->has_sr);
435 void PluginDisplay::display_type(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
436 PortDesc *q = it->get_value(port_liststore->col.port);
437 Gtk::CellRendererText *tcell =
dynamic_cast<Gtk::CellRendererText*
>(cell);
439 tcell->property_foreground().set_value(
"red");
441 tcell->property_foreground_set().set_value(
false);
445 void PluginDisplay::display_newrow(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
446 PortDesc *q = it->get_value(port_liststore->col.port);
448 cell->property_cell_background().set_value(
"red");
450 cell->property_cell_background_set().set_value(
false);
454 void PluginDisplay::display_caption(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
455 PortDesc *q = it->get_value(port_liststore->col.port);
457 cell->property_cell_background().set_value(
"red");
459 cell->property_cell_background_set().set_value(
false);
463 void PluginDisplay::on_delete_changes() {
464 if (!current_plugin) {
467 current_plugin->
reset();
469 int change_diff = changed - old_state;
471 change_count += change_diff;
481 void PluginDisplay::on_search_entry_activate() {
482 Gtk::TreeIter it = treeview1->get_selection()->get_selected();
484 bool v = !it->get_value(plugin_liststore->col.active);
485 it->set_value(plugin_liststore->col.active, v);
486 change_count += it->get_value(plugin_liststore->col.pdesc)->set_active(v);
491 bool PluginDisplay::check_for_changes() {
495 for (std::vector<PluginDesc*>::iterator p = pluginlist.begin(); p != pluginlist.end(); ++p) {
496 if ((*p)->active != (*p)->active_set) {
511 int PluginDisplay::ask_discard() {
512 Gtk::MessageDialog d(*window, _(
"Discard changes to plugin definitions?"),
false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO,
true);
517 if (check_for_changes()) {
518 int ret = ask_discard();
519 if (ret != Gtk::RESPONSE_YES) {
526 bool PluginDisplay::on_delete_event(GdkEventAny *) {
530 void PluginDisplay::on_quit() {
532 finished_callback(
false,
true);
536 void PluginDisplay::on_find() {
537 search_entry->grab_focus();
540 void PluginDisplay::display_quirks(
const Gtk::TreeIter& it) {
541 if (!current_plugin) {
542 cellrenderer_quirks->property_foreground_set().set_value(
false);
545 it->get_value(1, quirks);
547 cellrenderer_quirks->property_foreground_set().set_value(
false);
549 cellrenderer_quirks->property_foreground().set_value(
"red");
554 void PluginDisplay::display_category(
const Gtk::TreeIter& it) {
555 if (!current_plugin) {
556 cellrenderer_category->property_foreground_set().set_value(
false);
559 it->get_value(0, cat);
561 cellrenderer_category->property_foreground_set().set_value(
false);
563 cellrenderer_category->property_foreground().set_value(
"red");
568 void PluginDisplay::load() {
569 int a = combobox_mono_stereo->get_model()->get_path(combobox_mono_stereo->get_active())[0];
570 bool s = selected_only->get_active();
571 bool c = changed_only->get_active();
572 bool d = ladspa_only->get_active();
573 bool e = lv2_only->get_active();
574 plugin_liststore->clear();
575 for (std::vector<PluginDesc*>::iterator v = pluginlist.begin(); v != pluginlist.end(); ++v) {
576 if (s && !(*v)->active) {
579 else if (c && !(*v)->has_settings) {
582 else if (d && (*v)->is_lv2) {
585 else if (e && !(*v)->is_lv2) {
588 if ((a == 1 && (*v)->tp != 0) || (a == 2 && (*v)->tp != 1)) {
592 Gtk::TreeIter it = plugin_liststore->append();
593 it->set_value(plugin_liststore->col.name, ustring((*v)->Name));
594 it->set_value(plugin_liststore->col.active, (*v)->active);
595 it->set_value(plugin_liststore->col.pdesc, *v);
599 void PluginDisplay::on_save() {
600 finished_callback(do_save(),
true);
603 void PluginDisplay::on_apply() {
605 finished_callback(
true,
false);
608 needs_reload.clear();
612 void PluginDisplay::on_stereo_to_mono() {
613 for (std::vector<PluginDesc*>::iterator p = needs_reload.begin(); p != needs_reload.end(); ++p) {
614 (*p)->active_set = (*p)->active =
false;
617 finished_callback(
true,
false);
619 for (std::vector<PluginDesc*>::iterator p = needs_reload.begin(); p != needs_reload.end(); ++p) {
620 (*p)->active_set = (*p)->active =
true;
622 needs_reload.clear();
625 bool PluginDisplay::do_save() {
626 bool changed = check_for_changes();
627 if (changed && reload_plug) on_stereo_to_mono();
629 for (std::vector<PluginDesc*>::iterator p = pluginlist.begin(); p != pluginlist.end(); ++p) {
630 (*p)->active_set = (*p)->active;
640 void PluginDisplay::on_select_all(
bool v) {
642 Gtk::TreeNodeChildren ch = plugin_liststore->children();
643 for (Gtk::TreeIter it = ch.begin(); it != ch.end(); ++it) {
644 it->set_value(plugin_liststore->col.active, v);
645 d += it->get_value(plugin_liststore->col.pdesc)->set_active(v);
653 void PluginDisplay::on_show_details() {
654 details_box->set_visible(show_details->get_active());
656 window->get_size(w, h);
657 window->resize(1, h);
660 void PluginDisplay::on_add_dry_wet_controller() {
661 if (!current_plugin) {
667 void PluginDisplay::on_stereo_to_mono_controller() {
668 if (!current_plugin) {
673 needs_reload.push_back(current_plugin);
676 void PluginDisplay::on_row_activated(
const Gtk::TreePath& path, Gtk::TreeViewColumn* column) {
677 show_details->clicked();
680 void PluginDisplay::on_mono_stereo_changed() {
684 void PluginDisplay::on_view_changed(
const Gtk::ToggleButton *b) {
685 if (b->get_active()) {
690 void PluginDisplay::save_current() {
691 if (!current_plugin) {
694 ustring s = plugin_name->get_text();
701 plugin_category->get_active()->get_value(1, current_plugin->
category);
702 plugin_quirks->get_active()->get_value(1, current_plugin->
quirks);
703 Gtk::TreeIter it = master_slider_idx->get_active();
705 it->get_value(0, current_plugin->
MasterIdx);
712 current_plugin->
MasterLabel = master_slider_name->get_text();
716 int change_diff = changed - old_state;
718 change_count += change_diff;
727 void PluginDisplay::set_title() {
728 ustring t = _(
"Select LADSPA/LV2 plugins for Guitarix");
730 window->set_title(t + _(
" (*changed*)"));
732 window->set_title(t);
736 void PluginDisplay::set_old_state(
PluginDesc *p) {
738 old_state = (p->
old != 0);
744 void PluginDisplay::selection_changed() {
745 Gtk::TreeIter it = treeview1->get_selection()->get_selected();
748 p = it->get_value(plugin_liststore->col.pdesc);
749 if (current_plugin == p) {
754 on_reordered_conn.block();
755 port_liststore->clear();
756 on_reordered_conn.unblock();
757 ladspa_category->set_text(
"");
758 ladspa_maker->set_text(
"");
759 ladspa_uniqueid->set_text(
"");
760 plugin_name->set_text(
"");
761 plugin_category->set_active(-1);
762 plugin_quirks->set_active(-1);
768 plugin_name->modify_text(Gtk::STATE_NORMAL, Gdk::Color(
"red"));
770 plugin_name->unset_text(Gtk::STATE_NORMAL);
773 Gtk::TreeNodeChildren ch = plugin_category->get_model()->children();
775 for (it = ch.begin(); it != ch.end(); ++it, ++i) {
777 it->get_value(1, cat);
779 plugin_category->set_active(i);
783 ch = plugin_quirks->get_model()->children();
784 for (i = 0, it = ch.begin(); it != ch.end(); ++it, ++i) {
786 it->get_value(1, quirks);
787 if (quirks == p->
quirks) {
788 plugin_quirks->set_active(i);
792 Glib::RefPtr<Gtk::ListStore> ls_master = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(master_slider_idx->get_model());
794 it = ls_master->append();
798 for (
unsigned int i = 0; i < p->
ctrl_ports.size(); ++i) {
799 it = ls_master->append();
800 it->set_value(0,
int(i));
805 master_slider_idx->set_active(p->
MasterIdx+1);
806 master_slider_name->unset_text(Gtk::STATE_NORMAL);
810 master_slider_name->modify_text(Gtk::STATE_NORMAL, Gdk::Color(
"red"));
813 dry_wet_button->set_active(current_plugin->
add_wet_dry);
814 stereo_to_mono_button->set_active(current_plugin->
stereo_to_mono);
815 stereo_to_mono_button->set_sensitive(p->
tp);
817 ladspa_maker->set_text(p->
Maker);
819 ladspa_uniqueid->set_text(ustring::compose(
"LV2: %1", p->
path));
821 ladspa_uniqueid->set_text(ustring::compose(
"%1: %2[%3]", p->
UniqueID, p->
path, p->
index));
823 for (
unsigned int i = 0; i < p->
ctrl_ports.size(); ++i) {
825 Glib::RefPtr<Gtk::ListStore> tls;
827 tls = output_type_list;
829 tls = display_type_list_sr;
831 tls = display_type_list;
847 it = port_liststore->append();
848 it->set_value(port_liststore->col.pos, q->
pos);
849 it->set_value(port_liststore->col.name, q->
get_name());
850 it->set_value(port_liststore->col.dflt, ustring::format(dflt));
851 it->set_value(port_liststore->col.low, ustring::format(low));
852 it->set_value(port_liststore->col.up, ustring::format(up));
853 it->set_value(port_liststore->col.step, ustring(step_type_names[q->
step]));
854 it->set_value(port_liststore->col.display, ustring(display_type_names[q->
get_tp()]));
855 it->set_value(port_liststore->col.display_types, tls);
856 it->set_value(port_liststore->col.port, q);
857 it->set_value(port_liststore->col.newrow, q->
get_newrow());
858 it->set_value(port_liststore->col.use_sr, q->
has_sr && !q->
use_sr);
859 it->set_value(port_liststore->col.has_caption, q->
has_caption);
863 void PluginDisplay::display_master_idx(
const Gtk::TreeIter& it) {
867 cellrenderer_master->property_text().set_value(
"--");
868 cellrenderer_master->property_foreground_set().set_value(
false);
870 cellrenderer_master->property_foreground().set_value(
"red");
874 void PluginDisplay::set_master_text() {
875 Gtk::TreeIter it = master_slider_idx->get_active();
877 master_slider_name->set_text(
"");
878 master_slider_name->set_editable(
false);
882 it->get_value(0, idx);
884 master_slider_name->set_text(
"");
885 master_slider_name->set_editable(
false);
887 for (std::vector<PortDesc*>::iterator q = current_plugin->
ctrl_ports.begin(); q != current_plugin->
ctrl_ports.end(); ++q) {
888 if ((*q)->pos == idx) {
889 master_slider_name->set_text((*q)->factory.get_name());
893 master_slider_name->set_editable(
true);
897 void PluginDisplay::on_parameter_selection_changed() {
898 Gtk::TreeIter it = treeview2->get_selection()->get_selected();
899 enum_liststore->clear();
901 PortDesc *q = it->get_value(port_liststore->col.port);
903 int up = int(q->
get_up());
904 for (
int idx =
int(q->
get_low()); idx <= up; ++idx) {
905 it = enum_liststore->append();
906 it->set_value(enum_liststore->col.value, idx);
907 it->set_value(enum_liststore->col.label, q->
get_enum(idx));
908 it->set_value(enum_liststore->col.port, q);
914 void PluginDisplay::on_reordered(
const Gtk::TreePath& path) {
915 assert(current_plugin);
917 for (
unsigned int i = 0; i < current_plugin->
ctrl_ports.size(); ++i) {
920 std::vector<PortDesc*> l;
921 Gtk::TreeNodeChildren ch = port_liststore->children();
922 for (Gtk::TreeIter it = ch.begin(); it != ch.end(); ++it) {
923 l.push_back(current_plugin->
ctrl_ports[d[it->get_value(port_liststore->col.pos)]]);
928 void PluginDisplay::on_type_edited(
const ustring& path,
const ustring& newtext) {
929 Gtk::TreeIter it = port_liststore->get_iter(path);
930 PortDesc *q = it->get_value(port_liststore->col.port);
933 for (
unsigned int i = 0; i <
sizeof(
display_type_names)/
sizeof(display_type_names[0]); i++) {
934 if (newtext == display_type_names[i]) {
969 it->set_value(port_liststore->col.dflt, ustring::format(dflt));
970 it->set_value(port_liststore->col.low, ustring::format(low));
971 it->set_value(port_liststore->col.up, ustring::format(up));
973 it->set_value(port_liststore->col.display, newtext);
974 on_parameter_selection_changed();
977 void PluginDisplay::on_step_edited(
const ustring& path,
const ustring& newtext) {
978 Gtk::TreeIter it = port_liststore->get_iter(path);
980 for (
unsigned int i = 0; i <
sizeof(
step_type_names)/
sizeof(step_type_names[0]); ++i) {
981 if (step_type_names[i] == newtext) {
986 it->get_value(port_liststore->col.port)->step = m;
987 it->set_value(port_liststore->col.step, newtext);
990 void PluginDisplay::on_label_edited(
const ustring& path,
const ustring& newtext) {
991 Gtk::TreeIter it = enum_liststore->get_iter(path);
992 PortDesc *q = it->get_value(enum_liststore->col.port);
993 ustring text(newtext);
995 int idx = it->get_value(enum_liststore->col.value);
997 if (text.empty() || (i != q->
factory.
enum_end() && i->second == text)) {
1004 text = ustring::format(idx);
1011 it->set_value(enum_liststore->col.label, text);
1014 void PluginDisplay::on_name_edited(
const ustring& path,
const ustring& newtext) {
1015 Gtk::TreeIter it = port_liststore->get_iter(path);
1016 PortDesc *q = it->get_value(port_liststore->col.port);
1017 ustring text(newtext);
1024 it->set_value(port_liststore->col.name, q->
get_name());
1027 void PluginDisplay::on_dflt_edited(
const ustring& path,
const ustring& newtext) {
1028 Gtk::TreeIter it = port_liststore->get_iter(path);
1029 PortDesc *q = it->get_value(port_liststore->col.port);
1030 ustring text(newtext);
1036 if (val < q->get_low()) {
1047 val = strtod(text.c_str(), &p);
1048 if (p != text.c_str() + text.size()) {
1062 it->set_value(port_liststore->col.dflt, ustring::format(val));
1065 void PluginDisplay::on_low_edited(
const ustring& path,
const ustring& newtext) {
1066 Gtk::TreeIter it = port_liststore->get_iter(path);
1067 PortDesc *q = it->get_value(port_liststore->col.port);
1068 ustring text(newtext);
1085 val = strtod(text.c_str(), &p);
1086 if (p != text.c_str() + text.size()) {
1095 if (!(val2 < q->get_up())) {
1101 it->set_value(port_liststore->col.dflt, ustring::format(q->
get_dflt()));
1104 on_parameter_selection_changed();
1107 it->set_value(port_liststore->col.low, ustring::format(val));
1110 void PluginDisplay::on_up_edited(
const ustring& path,
const ustring& newtext) {
1111 Gtk::TreeIter it = port_liststore->get_iter(path);
1112 PortDesc *q = it->get_value(port_liststore->col.port);
1113 ustring text(newtext);
1130 val = strtod(text.c_str(), &p);
1131 if (p != text.c_str() + text.size()) {
1146 it->set_value(port_liststore->col.dflt, ustring::format(q->
get_dflt()));
1149 on_parameter_selection_changed();
1152 it->set_value(port_liststore->col.up, ustring::format(val));
1155 void PluginDisplay::on_newrow_toggled(
const ustring& path) {
1156 Gtk::TreeIter it = port_liststore->get_iter(path);
1157 PortDesc *q = it->get_value(port_liststore->col.port);
1158 bool s = !cellrenderer_newrow->get_active();
1159 it->set_value(port_liststore->col.newrow, s);
1167 void PluginDisplay::on_caption_toggled(
const ustring& path) {
1168 Gtk::TreeIter it = port_liststore->get_iter(path);
1169 PortDesc *q = it->get_value(port_liststore->col.port);
1170 bool s = !cellrenderer_caption->get_active();
1171 it->set_value(port_liststore->col.has_caption, s);
1175 void PluginDisplay::on_active_toggled(
const ustring& path) {
1176 Gtk::TreeIter it = plugin_liststore->get_iter(path);
1177 bool s = !cellrenderer_active->get_active();
1178 it->set_value(plugin_liststore->col.active, s);
1179 change_count += it->get_value(plugin_liststore->col.pdesc)->set_active(s);
CmdConnection::msg_type end
CmdConnection::msg_type start
void set_enumvalue(int k, const Glib::ustring &v)
std::string get_builder_filepath(const std::string &basename) const
const Glib::ustring & get_name()
void set_add_wet_dry_controller(bool v)
std::map< int, Glib::ustring >::iterator enum_end()
static CellRendererComboDerived * create_from_builder(BaseObjectType *cobject)
void set_tp(DisplayType v)
std::vector< PortDesc * > ctrl_ports
PluginDisplay(gx_engine::GxMachineBase &machine, Glib::RefPtr< Gdk::Pixbuf > icon, sigc::slot< void, bool, bool > finished_callback)
std::string ladspa_category
const Glib::ustring & get_name()
Glib::ustring deduced_category
void check_has_settings()
virtual ~CellRendererComboDerived()
std::string to_string(const T &t)
virtual void save_ladspalist(ladspa::LadspaPluginList &pluginlist)=0
const char * display_type_names[]
Glib::ustring MasterLabel
const char * step_type_names[]
void set_name(const Glib::ustring &nm)
virtual gx_system::CmdlineOptions & get_options() const =0
void strip(Glib::ustring &s)
CellRendererComboDerived()
CellRendererComboDerived(BaseObjectType *castitem)
Glib::ustring get_enum(int idx)
void set_stereo_to_mono(bool v)
virtual void load_ladspalist(std::vector< std::string > &old_not_found, ladspa::LadspaPluginList &pluginlist)=0
bool enumkey_changed(int k)
std::map< int, Glib::ustring >::iterator find_enum(int k)