33 const char *
display_type_names[] = {
"Scale",
"Log. Scale",
"Toggle",
"Enum",
"Display",
"Led",
"Hide",
"Int",
"Toggle" };
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();
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_enabled);
227 append_displaytype(display_type_list,
tp_toggle);
228 append_displaytype(display_type_list,
tp_int);
229 append_displaytype(display_type_list,
tp_enum);
230 append_displaytype(display_type_list,
tp_none);
231 display_type_list_sr = Gtk::ListStore::create(recdef);
232 append_displaytype(display_type_list_sr,
tp_scale);
234 append_displaytype(display_type_list_sr,
tp_none);
235 output_type_list = Gtk::ListStore::create(recdef);
236 append_displaytype(output_type_list,
tp_display);
238 append_displaytype(output_type_list,
tp_none);
240 treeview1->signal_row_activated().connect(sigc::mem_fun(
this, &PluginDisplay::on_row_activated));
241 treeview1->set_search_equal_func(sigc::mem_fun(
this,&PluginDisplay::search_equal));
243 bld->find_widget(
"search_entry", e);
244 e->signal_activate().connect(sigc::mem_fun(
this, &PluginDisplay::on_search_entry_activate));
245 treeview1->set_search_entry(*e);
246 sel = treeview1->get_selection();
247 sel->set_mode(Gtk::SELECTION_BROWSE);
248 sel->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::selection_changed));
249 treeview1->set_model(plugin_liststore);
250 cellrenderer_active->signal_toggled().connect(sigc::mem_fun(
this, &PluginDisplay::on_active_toggled));
251 bld->find_widget(
"cellrenderer_ladspa", r);
252 bld->find_widget(
"treeviewcolumn_ladspa", c);
253 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_ladspa));
256 bld->find_widget(
"plugin_category", cb);
257 cb->set_cell_data_func(*cellrenderer_category, sigc::mem_fun(
this, &PluginDisplay::display_category));
258 bld->find_widget(
"plugin_quirks", cb);
259 cb->set_cell_data_func(*cellrenderer_quirks, sigc::mem_fun(
this, &PluginDisplay::display_quirks));
261 master_slider_idx->set_cell_data_func(*cellrenderer_master, sigc::mem_fun(
this, &PluginDisplay::display_master_idx));
262 master_slider_idx->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::set_master_text));
264 selected_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), selected_only));
265 changed_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), changed_only));
266 ladspa_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), ladspa_only));
267 lv2_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), lv2_only));
268 show_all->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), show_all));
270 bld->find_widget(
"combobox_mono_stereo", cb);
271 cb->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::on_mono_stereo_changed));
274 bld->find_widget(
"reset_changes", b);
275 b->signal_clicked().connect(sigc::mem_fun(
this, &PluginDisplay::on_delete_changes));
277 bld->find_widget(
"master_slider_idx", cb);
278 cb->set_model(masteridx_liststore);
280 bld->find_widget(
"button_cancel", b);
281 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"QuitAction")->gobj());
282 bld->find_widget(
"button_apply", b);
283 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"ApplyAction")->gobj());
284 bld->find_widget(
"button_save", b);
285 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"SaveAction")->gobj());
286 bld->find_widget(
"select_all", b);
287 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"SelectAllAction")->gobj());
288 bld->find_widget(
"select_none", b);
289 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"SelectNoneAction")->gobj());
291 window->set_icon(icon);
299 static void split(std::vector<ustring>& strvec,
const ustring& str) {
300 size_t start = 0, np = ustring::npos;
302 size_t end = str.find_first_of(
' ',
start);
305 strvec.push_back(str.substr(
start, len).lowercase());
314 bool PluginDisplay::search_equal(
const Glib::RefPtr<Gtk::TreeModel>& model,
int column,
const ustring& key,
const Gtk::TreeIter& iter) {
315 PluginDesc *p = iter->get_value(plugin_liststore->col.pdesc);
317 if (txt.compare(0, ustring::npos, key, 0, key.size()) == 0) {
320 txt = iter->get_value(plugin_liststore->col.name).lowercase();
321 std::vector<ustring> keyvec;
323 for (std::vector<ustring>::iterator i = keyvec.begin(); i != keyvec.end(); ++i) {
324 if (txt.find(*i) == ustring::npos) {
331 void PluginDisplay::display_step(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
332 PortDesc *q = it->get_value(port_liststore->col.port);
336 dynamic_cast<Gtk::CellRendererText*>(cell)->property_foreground().set_value(
"red");
338 dynamic_cast<Gtk::CellRendererText*>(cell)->property_foreground_set().set_value(
false);
342 void PluginDisplay::display_ladspa(Gtk::CellRenderer *cell,
const Gtk::TreeIter& iter) {
343 PluginDesc *p = iter->get_value(plugin_liststore->col.pdesc);
344 if (p->has_settings) {
345 dynamic_cast<Gtk::CellRendererText*>(cell)->property_foreground().set_value(
"red");
347 dynamic_cast<Gtk::CellRendererText*>(cell)->property_foreground_set().set_value(
false);
351 void PluginDisplay::display_label(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
352 PortDesc *q = it->get_value(enum_liststore->col.port);
353 if (q->enumkey_changed(
int(it->get_value(enum_liststore->col.value)))) {
354 dynamic_cast<Gtk::CellRendererText*>(cell)->property_foreground().set_value(
"red");
356 dynamic_cast<Gtk::CellRendererText*>(cell)->property_foreground_set().set_value(
false);
360 void PluginDisplay::display_idx(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
361 PortDesc *q = it->get_value(port_liststore->col.port);
362 if (
int(port_liststore->get_path(it)[0]) != q->get_pos()) {
363 dynamic_cast<Gtk::CellRendererText*>(cell)->property_foreground().set_value(
"red");
365 dynamic_cast<Gtk::CellRendererText*>(cell)->property_foreground_set().set_value(
false);
369 void PluginDisplay::display_name(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
370 PortDesc *q = it->get_value(port_liststore->col.port);
372 dynamic_cast<Gtk::CellRendererText*>(cell)->property_foreground().set_value(
"red");
374 dynamic_cast<Gtk::CellRendererText*>(cell)->property_foreground_set().set_value(
false);
378 void PluginDisplay::display_default(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
379 PortDesc *q = it->get_value(port_liststore->col.port);
380 Gtk::CellRendererText *tcell = dynamic_cast<Gtk::CellRendererText*>(cell);
381 tcell->property_foreground_set().set_value(
false);
382 tcell->property_background_set().set_value(
false);
385 cell->property_visible().set_value(
false);
388 cell->property_visible().set_value(
true);
390 tcell->property_foreground().set_value(
"red");
391 }
else if (q->fake_dflt) {
392 tcell->property_background().set_value(
"grey");
396 void PluginDisplay::display_lower(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
397 PortDesc *q = it->get_value(port_liststore->col.port);
398 Gtk::CellRendererText *tcell = dynamic_cast<Gtk::CellRendererText*>(cell);
399 tcell->property_foreground_set().set_value(
false);
400 tcell->property_background_set().set_value(
false);
403 cell->property_visible().set_value(
false);
406 cell->property_visible().set_value(
true);
408 tcell->property_foreground().set_value(
"red");
409 }
else if (q->fake_low) {
410 tcell->property_background().set_value(
"grey");
414 void PluginDisplay::display_upper(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
415 PortDesc *q = it->get_value(port_liststore->col.port);
416 Gtk::CellRendererText *tcell = dynamic_cast<Gtk::CellRendererText*>(cell);
417 tcell->property_foreground_set().set_value(
false);
418 tcell->property_background_set().set_value(
false);
421 cell->property_visible().set_value(
false);
424 cell->property_visible().set_value(
true);
426 tcell->property_foreground().set_value(
"red");
427 }
else if (q->fake_up) {
428 tcell->property_background().set_value(
"grey");
432 void PluginDisplay::display_SR(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
433 cell->property_visible().set_value(it->get_value(port_liststore->col.port)->has_sr);
436 void PluginDisplay::display_type(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
437 PortDesc *q = it->get_value(port_liststore->col.port);
438 Gtk::CellRendererText *tcell = dynamic_cast<Gtk::CellRendererText*>(cell);
440 tcell->property_foreground().set_value(
"red");
442 tcell->property_foreground_set().set_value(
false);
446 void PluginDisplay::display_newrow(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
447 PortDesc *q = it->get_value(port_liststore->col.port);
449 cell->property_cell_background().set_value(
"red");
451 cell->property_cell_background_set().set_value(
false);
455 void PluginDisplay::display_caption(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
456 PortDesc *q = it->get_value(port_liststore->col.port);
457 if (!q->has_caption) {
458 cell->property_cell_background().set_value(
"red");
460 cell->property_cell_background_set().set_value(
false);
464 void PluginDisplay::on_delete_changes() {
465 if (!current_plugin) {
468 current_plugin->
reset();
470 int change_diff = changed - old_state;
472 change_count += change_diff;
482 void PluginDisplay::on_search_entry_activate() {
483 Gtk::TreeIter it = treeview1->get_selection()->get_selected();
485 bool v = !it->get_value(plugin_liststore->col.active);
486 it->set_value(plugin_liststore->col.active, v);
487 change_count += it->get_value(plugin_liststore->col.pdesc)->set_active(v);
492 bool PluginDisplay::check_for_changes() {
496 for (std::vector<PluginDesc*>::iterator p = pluginlist.begin(); p != pluginlist.end(); ++p) {
497 if ((*p)->active != (*p)->active_set) {
512 int PluginDisplay::ask_discard() {
513 Gtk::MessageDialog d(*window, _(
"Discard changes to plugin definitions?"),
false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO,
true);
518 if (check_for_changes()) {
519 int ret = ask_discard();
520 if (ret != Gtk::RESPONSE_YES) {
527 bool PluginDisplay::on_delete_event(GdkEventAny *) {
531 void PluginDisplay::on_quit() {
533 finished_callback(
false,
true);
537 void PluginDisplay::on_find() {
538 search_entry->grab_focus();
541 void PluginDisplay::display_quirks(
const Gtk::TreeIter& it) {
542 if (!current_plugin) {
543 cellrenderer_quirks->property_foreground_set().set_value(
false);
546 it->get_value(1, quirks);
548 cellrenderer_quirks->property_foreground_set().set_value(
false);
550 cellrenderer_quirks->property_foreground().set_value(
"red");
555 void PluginDisplay::display_category(
const Gtk::TreeIter& it) {
556 if (!current_plugin) {
557 cellrenderer_category->property_foreground_set().set_value(
false);
560 it->get_value(0, cat);
562 cellrenderer_category->property_foreground_set().set_value(
false);
564 cellrenderer_category->property_foreground().set_value(
"red");
569 void PluginDisplay::load() {
570 int a = combobox_mono_stereo->get_model()->get_path(combobox_mono_stereo->get_active())[0];
571 bool s = selected_only->get_active();
572 bool c = changed_only->get_active();
573 bool d = ladspa_only->get_active();
574 bool e = lv2_only->get_active();
575 plugin_liststore->clear();
576 for (std::vector<PluginDesc*>::iterator v = pluginlist.begin(); v != pluginlist.end(); ++v) {
577 if (s && !(*v)->active) {
580 else if (c && !(*v)->has_settings) {
583 else if (d && (*v)->is_lv2) {
586 else if (e && !(*v)->is_lv2) {
589 if ((a == 1 && (*v)->tp != 0) || (a == 2 && (*v)->tp != 1)) {
593 Gtk::TreeIter it = plugin_liststore->append();
594 it->set_value(plugin_liststore->col.name, ustring((*v)->Name));
595 it->set_value(plugin_liststore->col.active, (*v)->active);
596 it->set_value(plugin_liststore->col.pdesc, *v);
600 void PluginDisplay::on_save() {
601 finished_callback(do_save(),
true);
604 void PluginDisplay::on_apply() {
606 finished_callback(
true,
false);
609 needs_reload.clear();
613 void PluginDisplay::on_stereo_to_mono() {
614 for (std::vector<PluginDesc*>::iterator p = needs_reload.begin(); p != needs_reload.end(); ++p) {
615 (*p)->active_set = (*p)->active =
false;
618 finished_callback(
true,
false);
620 for (std::vector<PluginDesc*>::iterator p = needs_reload.begin(); p != needs_reload.end(); ++p) {
621 (*p)->active_set = (*p)->active =
true;
623 needs_reload.clear();
626 bool PluginDisplay::do_save() {
627 bool changed = check_for_changes();
628 if (changed && reload_plug) on_stereo_to_mono();
630 for (std::vector<PluginDesc*>::iterator p = pluginlist.begin(); p != pluginlist.end(); ++p) {
631 (*p)->active_set = (*p)->active;
641 void PluginDisplay::on_select_all(
bool v) {
643 Gtk::TreeNodeChildren ch = plugin_liststore->children();
644 for (Gtk::TreeIter it = ch.begin(); it != ch.end(); ++it) {
645 it->set_value(plugin_liststore->col.active, v);
646 d += it->get_value(plugin_liststore->col.pdesc)->set_active(v);
654 void PluginDisplay::on_show_details() {
655 details_box->set_visible(show_details->get_active());
657 window->get_size(w, h);
658 window->resize(1, h);
661 void PluginDisplay::on_add_dry_wet_controller() {
662 if (!current_plugin) {
668 void PluginDisplay::on_stereo_to_mono_controller() {
669 if (!current_plugin) {
674 needs_reload.push_back(current_plugin);
677 void PluginDisplay::on_row_activated(
const Gtk::TreePath& path, Gtk::TreeViewColumn* column) {
678 show_details->clicked();
681 void PluginDisplay::on_mono_stereo_changed() {
685 void PluginDisplay::on_view_changed(
const Gtk::ToggleButton *b) {
686 if (b->get_active()) {
691 void PluginDisplay::save_current() {
692 if (!current_plugin) {
695 ustring s = plugin_name->get_text();
702 plugin_category->get_active()->get_value(1, current_plugin->
category);
703 plugin_quirks->get_active()->get_value(1, current_plugin->
quirks);
704 Gtk::TreeIter it = master_slider_idx->get_active();
706 it->get_value(0, current_plugin->
MasterIdx);
713 current_plugin->
MasterLabel = master_slider_name->get_text();
717 int change_diff = changed - old_state;
719 change_count += change_diff;
728 void PluginDisplay::set_title() {
729 ustring t = _(
"Select LADSPA/LV2 plugins for Guitarix");
731 window->set_title(t + _(
" (*changed*)"));
733 window->set_title(t);
737 void PluginDisplay::set_old_state(
PluginDesc *p) {
739 old_state = (p->old != 0);
745 void PluginDisplay::selection_changed() {
746 Gtk::TreeIter it = treeview1->get_selection()->get_selected();
749 p = it->get_value(plugin_liststore->col.pdesc);
750 if (current_plugin == p) {
755 on_reordered_conn.block();
756 port_liststore->clear();
757 on_reordered_conn.unblock();
758 ladspa_category->set_text(
"");
759 ladspa_maker->set_text(
"");
760 ladspa_uniqueid->set_text(
"");
761 plugin_name->set_text(
"");
762 plugin_category->set_active(-1);
763 plugin_quirks->set_active(-1);
768 if (p->shortname != p->Name) {
769 plugin_name->modify_text(Gtk::STATE_NORMAL, Gdk::Color(
"red"));
771 plugin_name->unset_text(Gtk::STATE_NORMAL);
773 plugin_name->set_text(p->shortname);
774 Gtk::TreeNodeChildren ch = plugin_category->get_model()->children();
776 for (it = ch.begin(); it != ch.end(); ++it, ++i) {
778 it->get_value(1, cat);
779 if (cat == p->category) {
780 plugin_category->set_active(i);
784 ch = plugin_quirks->get_model()->children();
785 for (i = 0, it = ch.begin(); it != ch.end(); ++it, ++i) {
787 it->get_value(1, quirks);
788 if (quirks == p->quirks) {
789 plugin_quirks->set_active(i);
793 Glib::RefPtr<Gtk::ListStore> ls_master = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(master_slider_idx->get_model());
795 it = ls_master->append();
799 for (
unsigned int i = 0; i < p->ctrl_ports.size(); ++i) {
800 it = ls_master->append();
801 it->set_value(0,
int(i));
802 if (p->ctrl_ports[i]->pos == p->MasterIdx) {
803 ml = p->ctrl_ports[i]->factory.get_name();
806 master_slider_idx->set_active(p->MasterIdx+1);
807 master_slider_name->unset_text(Gtk::STATE_NORMAL);
808 if (!p->MasterLabel.empty()) {
809 master_slider_name->set_text(p->MasterLabel);
810 if (p->MasterLabel != ml) {
811 master_slider_name->modify_text(Gtk::STATE_NORMAL, Gdk::Color(
"red"));
814 dry_wet_button->set_active(current_plugin->
add_wet_dry);
815 stereo_to_mono_button->set_active(current_plugin->
stereo_to_mono);
816 stereo_to_mono_button->set_sensitive(p->tp);
817 ladspa_category->set_text(p->ladspa_category);
818 ladspa_maker->set_text(p->Maker);
820 ladspa_uniqueid->set_text(ustring::compose(
"LV2: %1", p->path));
822 ladspa_uniqueid->set_text(ustring::compose(
"%1: %2[%3]", p->UniqueID, p->path, p->index));
824 for (
unsigned int i = 0; i < p->ctrl_ports.size(); ++i) {
825 PortDesc *q = p->ctrl_ports[i];
826 Glib::RefPtr<Gtk::ListStore> tls;
828 tls = output_type_list;
829 }
else if (q->has_sr) {
830 tls = display_type_list_sr;
832 tls = display_type_list;
834 float dflt = q->get_dflt();
835 float low = q->get_low();
836 float up = q->get_up();
837 if (q->has_sr && !q->use_sr) {
848 it = port_liststore->append();
849 it->set_value(port_liststore->col.pos, q->pos);
850 it->set_value(port_liststore->col.name, q->get_name());
851 it->set_value(port_liststore->col.dflt, ustring::format(dflt));
852 it->set_value(port_liststore->col.low, ustring::format(low));
853 it->set_value(port_liststore->col.up, ustring::format(up));
854 it->set_value(port_liststore->col.step, ustring(
step_type_names[q->step]));
856 it->set_value(port_liststore->col.display_types, tls);
857 it->set_value(port_liststore->col.port, q);
858 it->set_value(port_liststore->col.newrow, q->get_newrow());
859 it->set_value(port_liststore->col.use_sr, q->has_sr && !q->use_sr);
860 it->set_value(port_liststore->col.has_caption, q->has_caption);
864 void PluginDisplay::display_master_idx(
const Gtk::TreeIter& it) {
868 cellrenderer_master->property_text().set_value(
"--");
869 cellrenderer_master->property_foreground_set().set_value(
false);
871 cellrenderer_master->property_foreground().set_value(
"red");
875 void PluginDisplay::set_master_text() {
876 Gtk::TreeIter it = master_slider_idx->get_active();
878 master_slider_name->set_text(
"");
879 master_slider_name->set_editable(
false);
883 it->get_value(0, idx);
885 master_slider_name->set_text(
"");
886 master_slider_name->set_editable(
false);
888 for (std::vector<PortDesc*>::iterator q = current_plugin->
ctrl_ports.begin(); q != current_plugin->
ctrl_ports.end(); ++q) {
889 if ((*q)->pos == idx) {
890 master_slider_name->set_text((*q)->factory.get_name());
894 master_slider_name->set_editable(
true);
898 void PluginDisplay::on_parameter_selection_changed() {
899 Gtk::TreeIter it = treeview2->get_selection()->get_selected();
900 enum_liststore->clear();
902 PortDesc *q = it->get_value(port_liststore->col.port);
904 int up = int(q->get_up());
905 for (
int idx =
int(q->get_low()); idx <= up; ++idx) {
906 it = enum_liststore->append();
907 it->set_value(enum_liststore->col.value, idx);
908 it->set_value(enum_liststore->col.label, q->get_enum(idx));
909 it->set_value(enum_liststore->col.port, q);
915 void PluginDisplay::on_reordered(
const Gtk::TreePath& path) {
916 assert(current_plugin);
918 for (
unsigned int i = 0; i < current_plugin->
ctrl_ports.size(); ++i) {
921 std::vector<PortDesc*> l;
922 Gtk::TreeNodeChildren ch = port_liststore->children();
923 for (Gtk::TreeIter it = ch.begin(); it != ch.end(); ++it) {
924 l.push_back(current_plugin->
ctrl_ports[d[it->get_value(port_liststore->col.pos)]]);
929 void PluginDisplay::on_type_edited(
const ustring& path,
const ustring& newtext) {
930 Gtk::TreeIter it = port_liststore->get_iter(path);
931 PortDesc *q = it->get_value(port_liststore->col.port);
936 tp = static_cast<DisplayType>(i);
943 if (q->get_low() <= 0) {
946 if (q->get_up() <= q->get_low()) {
947 q->set_up(q->get_low()*1000);
949 float dflt = q->get_dflt();
950 if (!(q->get_low() <= dflt && dflt <= q->get_up())) {
951 q->set_dflt(q->get_low());
954 q->set_dflt(
int(q->get_dflt() != 0));
958 q->set_dflt(
int(q->get_dflt() != 0));
962 q->set_dflt(round(q->get_dflt()));
963 q->set_low(round(q->get_low()));
964 q->set_up(round(q->get_up()));
966 float dflt = q->get_dflt();
967 float low = q->get_low();
968 float up = q->get_up();
969 if (q->has_sr && !q->use_sr) {
974 it->set_value(port_liststore->col.dflt, ustring::format(dflt));
975 it->set_value(port_liststore->col.low, ustring::format(low));
976 it->set_value(port_liststore->col.up, ustring::format(up));
978 it->set_value(port_liststore->col.display, newtext);
979 on_parameter_selection_changed();
982 void PluginDisplay::on_step_edited(
const ustring& path,
const ustring& newtext) {
983 Gtk::TreeIter it = port_liststore->get_iter(path);
987 m = static_cast<step_mode>(i);
991 it->get_value(port_liststore->col.port)->step = m;
992 it->set_value(port_liststore->col.step, newtext);
995 void PluginDisplay::on_label_edited(
const ustring& path,
const ustring& newtext) {
996 Gtk::TreeIter it = enum_liststore->get_iter(path);
997 PortDesc *q = it->get_value(enum_liststore->col.port);
998 ustring text(newtext);
1000 int idx = it->get_value(enum_liststore->col.value);
1001 std::map<int, ustring>::iterator i = q->factory.find_enum(idx);
1002 if (text.empty() || (i != q->factory.enum_end() && i->second == text)) {
1003 q->user.erase_enum(idx);
1007 std::map<int, ustring>::iterator i = q->factory.find_enum(idx);
1008 if (i == q->factory.enum_end()) {
1009 text = ustring::format(idx);
1014 q->user.set_enumvalue(idx, text);
1016 it->set_value(enum_liststore->col.label, text);
1019 void PluginDisplay::on_name_edited(
const ustring& path,
const ustring& newtext) {
1020 Gtk::TreeIter it = port_liststore->get_iter(path);
1021 PortDesc *q = it->get_value(port_liststore->col.port);
1022 ustring text(newtext);
1024 if (text.empty() || q->factory.get_name() == text) {
1027 q->user.set_name(text);
1029 it->set_value(port_liststore->col.name, q->get_name());
1032 void PluginDisplay::on_dflt_edited(
const ustring& path,
const ustring& newtext) {
1033 Gtk::TreeIter it = port_liststore->get_iter(path);
1034 PortDesc *q = it->get_value(port_liststore->col.port);
1035 ustring text(newtext);
1040 val = q->factory.get_dflt();
1041 if (val < q->get_low()) {
1044 if (val > q->get_up()) {
1047 if (q->has_sr && !q->use_sr) {
1052 val = strtod(text.c_str(), &p);
1053 if (p != text.c_str() + text.size()) {
1057 if (q->has_sr && !q->use_sr) {
1062 if (!(q->get_low() <= val2 && val2 <= q->get_up())) {
1067 it->set_value(port_liststore->col.dflt, ustring::format(val));
1070 void PluginDisplay::on_low_edited(
const ustring& path,
const ustring& newtext) {
1071 Gtk::TreeIter it = port_liststore->get_iter(path);
1072 PortDesc *q = it->get_value(port_liststore->col.port);
1073 ustring text(newtext);
1078 val = q->factory.get_low();
1079 if (q->get_dflt() < val) {
1082 if (q->get_up() < val) {
1083 q->set_up(
min(q->get_up(),val+1));
1085 if (q->has_sr && !q->use_sr) {
1090 val = strtod(text.c_str(), &p);
1091 if (p != text.c_str() + text.size()) {
1095 if (q->has_sr && !q->use_sr) {
1100 if (!(val2 < q->get_up())) {
1103 if (q->get_dflt() < val2) {
1104 q->user.set_dflt(val2);
1106 it->set_value(port_liststore->col.dflt, ustring::format(q->get_dflt()));
1109 on_parameter_selection_changed();
1112 it->set_value(port_liststore->col.low, ustring::format(val));
1115 void PluginDisplay::on_up_edited(
const ustring& path,
const ustring& newtext) {
1116 Gtk::TreeIter it = port_liststore->get_iter(path);
1117 PortDesc *q = it->get_value(port_liststore->col.port);
1118 ustring text(newtext);
1123 val = q->factory.get_up();
1124 if (q->get_dflt() > val) {
1127 if (q->get_low() > val) {
1128 q->set_low(
max(q->get_low(),val-1));
1130 if (q->has_sr && !q->use_sr) {
1135 val = strtod(text.c_str(), &p);
1136 if (p != text.c_str() + text.size()) {
1140 if (q->has_sr && !q->use_sr) {
1145 if (!(val2 > q->get_low())) {
1148 if (q->get_dflt() > val2) {
1149 q->user.set_dflt(val2);
1151 it->set_value(port_liststore->col.dflt, ustring::format(q->get_dflt()));
1154 on_parameter_selection_changed();
1157 it->set_value(port_liststore->col.up, ustring::format(val));
1160 void PluginDisplay::on_newrow_toggled(
const ustring& path) {
1161 Gtk::TreeIter it = port_liststore->get_iter(path);
1162 PortDesc *q = it->get_value(port_liststore->col.port);
1163 bool s = !cellrenderer_newrow->get_active();
1164 it->set_value(port_liststore->col.newrow, s);
1165 if (s == q->factory.get_newrow()) {
1168 q->user.set_newrow(s);
1172 void PluginDisplay::on_caption_toggled(
const ustring& path) {
1173 Gtk::TreeIter it = port_liststore->get_iter(path);
1174 PortDesc *q = it->get_value(port_liststore->col.port);
1175 bool s = !cellrenderer_caption->get_active();
1176 it->set_value(port_liststore->col.has_caption, s);
1180 void PluginDisplay::on_active_toggled(
const ustring& path) {
1181 Gtk::TreeIter it = plugin_liststore->get_iter(path);
1182 bool s = !cellrenderer_active->get_active();
1183 it->set_value(plugin_liststore->col.active, s);
1184 change_count += it->get_value(plugin_liststore->col.pdesc)->set_active(s);