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(), 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_)
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 Glib::RefPtr<Gtk::TreeSelection> sel = treeview2->get_selection();
154 sel->set_mode(Gtk::SELECTION_BROWSE);
155 sel->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::on_parameter_selection_changed));
156 on_reordered_conn = port_liststore->signal_row_deleted().connect(sigc::mem_fun(
this, &PluginDisplay::on_reordered));
157 treeview2->set_model(port_liststore);
161 rd->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_type_edited));
162 bld->find_widget(
"treeviewcolumn_type", c);
163 c->set_cell_data_func(*rd, sigc::mem_fun(
this, &PluginDisplay::display_type));
166 rd->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_step_edited));
167 bld->find_widget(
"treeviewcolumn_step", c);
168 c->set_cell_data_func(*rd, sigc::mem_fun(
this, &PluginDisplay::display_step));
170 cellrenderer_newrow->signal_toggled().connect(sigc::mem_fun(
this, &PluginDisplay::on_newrow_toggled));
171 Gtk::Label *label =
new Gtk::Label(
"N");
172 label->set_tooltip_text(_(
"start a new row of controls in the rackbox unit"));
174 bld->find_widget(
"treeviewcolumn_newrow", c);
175 c->set_widget(*manage(label));
176 c->set_cell_data_func(*cellrenderer_newrow, sigc::mem_fun(
this, &PluginDisplay::display_newrow));
177 cellrenderer_caption->signal_toggled().connect(sigc::mem_fun(
this, &PluginDisplay::on_caption_toggled));
178 label =
new Gtk::Label(
"C");
179 label->set_tooltip_text(_(
"display the name as caption above the control"));
181 bld->find_widget(
"treeviewcolumn_caption", c);
182 c->set_widget(*manage(label));
183 c->set_cell_data_func(*cellrenderer_caption, sigc::mem_fun(
this, &PluginDisplay::display_caption));
185 bld->find_widget(
"cellrenderer_name", r);
186 r->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_name_edited));
187 bld->find_widget(
"treeviewcolumn_name", c);
188 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_name));
189 bld->find_widget(
"cellrenderer_dflt", r);
190 r->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_dflt_edited));
191 bld->find_widget(
"treeviewcolumn_dflt", c);
192 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_default));
193 bld->find_widget(
"cellrenderer_low", r);
194 r->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_low_edited));
195 bld->find_widget(
"treeviewcolumn_low", c);
196 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_lower));
197 bld->find_widget(
"cellrenderer_up", r);
198 r->signal_edited().connect(sigc::mem_fun(
this, &PluginDisplay::on_up_edited));
199 bld->find_widget(
"treeviewcolumn_up", c);
200 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_upper));
201 bld->find_widget(
"cellrenderer_idx", r);
202 bld->find_widget(
"treeviewcolumn_idx", c);
203 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_idx));
205 bld->find_widget(
"treeviewcolumn_SR", c);
206 label =
new Gtk::Label(
"SR");
207 label->set_tooltip_text(_(
"marked rows: range depends on samplerate; using 44100 as fixed value"));
209 c->set_widget(*manage(label));
210 Gtk::CellRendererToggle *t;
211 bld->find_widget(
"cellrenderer_SR", t);
212 c->set_cell_data_func(*t, sigc::mem_fun(
this, &PluginDisplay::display_SR));
214 Gtk::TreeModelColumnRecord recdef;
215 Gtk::TreeModelColumn<Glib::ustring> strcol;
216 Gtk::TreeModelColumn<DisplayType> intcol;
219 display_type_list = Gtk::ListStore::create(recdef);
220 append_displaytype(display_type_list,
tp_scale);
222 append_displaytype(display_type_list,
tp_toggle);
223 append_displaytype(display_type_list,
tp_int);
224 append_displaytype(display_type_list,
tp_enum);
225 append_displaytype(display_type_list,
tp_none);
226 display_type_list_sr = Gtk::ListStore::create(recdef);
227 append_displaytype(display_type_list_sr,
tp_scale);
229 append_displaytype(display_type_list_sr,
tp_none);
230 output_type_list = Gtk::ListStore::create(recdef);
231 append_displaytype(output_type_list,
tp_display);
233 append_displaytype(output_type_list,
tp_none);
235 treeview1->signal_row_activated().connect(sigc::mem_fun(
this, &PluginDisplay::on_row_activated));
236 treeview1->set_search_equal_func(sigc::mem_fun(
this,&PluginDisplay::search_equal));
238 bld->find_widget(
"search_entry", e);
239 e->signal_activate().connect(sigc::mem_fun(
this, &PluginDisplay::on_search_entry_activate));
240 treeview1->set_search_entry(*e);
241 sel = treeview1->get_selection();
242 sel->set_mode(Gtk::SELECTION_BROWSE);
243 sel->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::selection_changed));
244 treeview1->set_model(plugin_liststore);
245 cellrenderer_active->signal_toggled().connect(sigc::mem_fun(
this, &PluginDisplay::on_active_toggled));
246 bld->find_widget(
"cellrenderer_ladspa", r);
247 bld->find_widget(
"treeviewcolumn_ladspa", c);
248 c->set_cell_data_func(*r, sigc::mem_fun(
this, &PluginDisplay::display_ladspa));
251 bld->find_widget(
"plugin_category", cb);
252 cb->set_cell_data_func(*cellrenderer_category, sigc::mem_fun(
this, &PluginDisplay::display_category));
253 bld->find_widget(
"plugin_quirks", cb);
254 cb->set_cell_data_func(*cellrenderer_quirks, sigc::mem_fun(
this, &PluginDisplay::display_quirks));
256 master_slider_idx->set_cell_data_func(*cellrenderer_master, sigc::mem_fun(
this, &PluginDisplay::display_master_idx));
257 master_slider_idx->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::set_master_text));
259 selected_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), selected_only));
260 changed_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), changed_only));
261 ladspa_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), ladspa_only));
262 lv2_only->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), lv2_only));
263 show_all->signal_toggled().connect(sigc::bind(sigc::mem_fun(
this, &PluginDisplay::on_view_changed), show_all));
265 bld->find_widget(
"combobox_mono_stereo", cb);
266 cb->signal_changed().connect(sigc::mem_fun(
this, &PluginDisplay::on_mono_stereo_changed));
269 bld->find_widget(
"reset_changes", b);
270 b->signal_clicked().connect(sigc::mem_fun(
this, &PluginDisplay::on_delete_changes));
272 bld->find_widget(
"master_slider_idx", cb);
273 cb->set_model(masteridx_liststore);
275 bld->find_widget(
"button_cancel", b);
276 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"QuitAction")->gobj());
277 bld->find_widget(
"button_apply", b);
278 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"ApplyAction")->gobj());
279 bld->find_widget(
"button_save", b);
280 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"SaveAction")->gobj());
281 bld->find_widget(
"select_all", b);
282 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"SelectAllAction")->gobj());
283 bld->find_widget(
"select_none", b);
284 gtk_activatable_set_related_action(GTK_ACTIVATABLE(b->gobj()), actiongroup->get_action(
"SelectNoneAction")->gobj());
286 window->set_icon(icon);
294 static void split(std::vector<ustring>& strvec,
const ustring& str) {
295 size_t start = 0, np = ustring::npos;
297 size_t end = str.find_first_of(
' ', start);
298 size_t len = (end == np) ? np : end - start;
300 strvec.push_back(str.substr(start, len).lowercase());
309 bool PluginDisplay::search_equal(
const Glib::RefPtr<Gtk::TreeModel>& model,
int column,
const ustring& key,
const Gtk::TreeIter& iter) {
310 PluginDesc *p = iter->get_value(plugin_liststore->col.pdesc);
312 if (txt.compare(0, ustring::npos, key, 0, key.size()) == 0) {
315 txt = iter->get_value(plugin_liststore->col.name).lowercase();
316 std::vector<ustring> keyvec;
318 for (std::vector<ustring>::iterator i = keyvec.begin(); i != keyvec.end(); ++i) {
319 if (txt.find(*i) == ustring::npos) {
326 void PluginDisplay::display_step(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
327 PortDesc *q = it->get_value(port_liststore->col.port);
331 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground().set_value(
"red");
333 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground_set().set_value(
false);
337 void PluginDisplay::display_ladspa(Gtk::CellRenderer *cell,
const Gtk::TreeIter& iter) {
338 PluginDesc *p = iter->get_value(plugin_liststore->col.pdesc);
340 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground().set_value(
"red");
342 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground_set().set_value(
false);
346 void PluginDisplay::display_label(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
347 PortDesc *q = it->get_value(enum_liststore->col.port);
348 if (q->
enumkey_changed(
int(it->get_value(enum_liststore->col.value)))) {
349 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground().set_value(
"red");
351 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground_set().set_value(
false);
355 void PluginDisplay::display_idx(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
356 PortDesc *q = it->get_value(port_liststore->col.port);
357 if (
int(port_liststore->get_path(it)[0]) != q->
get_pos()) {
358 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground().set_value(
"red");
360 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground_set().set_value(
false);
364 void PluginDisplay::display_name(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
365 PortDesc *q = it->get_value(port_liststore->col.port);
367 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground().set_value(
"red");
369 dynamic_cast<Gtk::CellRendererText*
>(cell)->property_foreground_set().set_value(
false);
373 void PluginDisplay::display_default(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
374 PortDesc *q = it->get_value(port_liststore->col.port);
375 Gtk::CellRendererText *tcell =
dynamic_cast<Gtk::CellRendererText*
>(cell);
376 tcell->property_foreground_set().set_value(
false);
377 tcell->property_background_set().set_value(
false);
380 cell->property_visible().set_value(
false);
383 cell->property_visible().set_value(
true);
385 tcell->property_foreground().set_value(
"red");
387 tcell->property_background().set_value(
"grey");
391 void PluginDisplay::display_lower(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
392 PortDesc *q = it->get_value(port_liststore->col.port);
393 Gtk::CellRendererText *tcell =
dynamic_cast<Gtk::CellRendererText*
>(cell);
394 tcell->property_foreground_set().set_value(
false);
395 tcell->property_background_set().set_value(
false);
398 cell->property_visible().set_value(
false);
401 cell->property_visible().set_value(
true);
403 tcell->property_foreground().set_value(
"red");
405 tcell->property_background().set_value(
"grey");
409 void PluginDisplay::display_upper(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
410 PortDesc *q = it->get_value(port_liststore->col.port);
411 Gtk::CellRendererText *tcell =
dynamic_cast<Gtk::CellRendererText*
>(cell);
412 tcell->property_foreground_set().set_value(
false);
413 tcell->property_background_set().set_value(
false);
416 cell->property_visible().set_value(
false);
419 cell->property_visible().set_value(
true);
421 tcell->property_foreground().set_value(
"red");
423 tcell->property_background().set_value(
"grey");
427 void PluginDisplay::display_SR(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
428 cell->property_visible().set_value(it->get_value(port_liststore->col.port)->has_sr);
431 void PluginDisplay::display_type(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
432 PortDesc *q = it->get_value(port_liststore->col.port);
433 Gtk::CellRendererText *tcell =
dynamic_cast<Gtk::CellRendererText*
>(cell);
435 tcell->property_foreground().set_value(
"red");
437 tcell->property_foreground_set().set_value(
false);
441 void PluginDisplay::display_newrow(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
442 PortDesc *q = it->get_value(port_liststore->col.port);
444 cell->property_cell_background().set_value(
"red");
446 cell->property_cell_background_set().set_value(
false);
450 void PluginDisplay::display_caption(Gtk::CellRenderer *cell,
const Gtk::TreeIter& it) {
451 PortDesc *q = it->get_value(port_liststore->col.port);
453 cell->property_cell_background().set_value(
"red");
455 cell->property_cell_background_set().set_value(
false);
459 void PluginDisplay::on_delete_changes() {
460 if (!current_plugin) {
463 current_plugin->
reset();
465 int change_diff = changed - old_state;
467 change_count += change_diff;
477 void PluginDisplay::on_search_entry_activate() {
478 Gtk::TreeIter it = treeview1->get_selection()->get_selected();
480 bool v = !it->get_value(plugin_liststore->col.active);
481 it->set_value(plugin_liststore->col.active, v);
482 change_count += it->get_value(plugin_liststore->col.pdesc)->set_active(v);
487 bool PluginDisplay::check_for_changes() {
491 for (std::vector<PluginDesc*>::iterator p = pluginlist.begin(); p != pluginlist.end(); ++p) {
492 if ((*p)->active != (*p)->active_set) {
507 int PluginDisplay::ask_discard() {
508 Gtk::MessageDialog d(*window, _(
"Discard changes to plugin definitions?"),
false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO,
true);
513 if (check_for_changes()) {
514 int ret = ask_discard();
515 if (ret != Gtk::RESPONSE_YES) {
522 bool PluginDisplay::on_delete_event(GdkEventAny *) {
526 void PluginDisplay::on_quit() {
528 finished_callback(
false,
true);
532 void PluginDisplay::on_find() {
533 search_entry->grab_focus();
536 void PluginDisplay::display_quirks(
const Gtk::TreeIter& it) {
537 if (!current_plugin) {
538 cellrenderer_quirks->property_foreground_set().set_value(
false);
541 it->get_value(1, quirks);
543 cellrenderer_quirks->property_foreground_set().set_value(
false);
545 cellrenderer_quirks->property_foreground().set_value(
"red");
550 void PluginDisplay::display_category(
const Gtk::TreeIter& it) {
551 if (!current_plugin) {
552 cellrenderer_category->property_foreground_set().set_value(
false);
555 it->get_value(0, cat);
557 cellrenderer_category->property_foreground_set().set_value(
false);
559 cellrenderer_category->property_foreground().set_value(
"red");
564 void PluginDisplay::load() {
565 int a = combobox_mono_stereo->get_model()->get_path(combobox_mono_stereo->get_active())[0];
566 bool s = selected_only->get_active();
567 bool c = changed_only->get_active();
568 bool d = ladspa_only->get_active();
569 bool e = lv2_only->get_active();
570 plugin_liststore->clear();
571 for (std::vector<PluginDesc*>::iterator v = pluginlist.begin(); v != pluginlist.end(); ++v) {
572 if (s && !(*v)->active) {
575 else if (c && !(*v)->has_settings) {
578 else if (d && (*v)->is_lv2) {
581 else if (e && !(*v)->is_lv2) {
584 if ((a == 1 && (*v)->tp != 0) || (a == 2 && (*v)->tp != 1)) {
588 Gtk::TreeIter it = plugin_liststore->append();
589 it->set_value(plugin_liststore->col.name, ustring((*v)->Name));
590 it->set_value(plugin_liststore->col.active, (*v)->active);
591 it->set_value(plugin_liststore->col.pdesc, *v);
595 void PluginDisplay::on_save() {
596 finished_callback(do_save(),
true);
599 void PluginDisplay::on_apply() {
601 finished_callback(
true,
false);
606 bool PluginDisplay::do_save() {
607 bool changed = check_for_changes();
609 for (std::vector<PluginDesc*>::iterator p = pluginlist.begin(); p != pluginlist.end(); ++p) {
610 (*p)->active_set = (*p)->active;
620 void PluginDisplay::on_select_all(
bool v) {
622 Gtk::TreeNodeChildren ch = plugin_liststore->children();
623 for (Gtk::TreeIter it = ch.begin(); it != ch.end(); ++it) {
624 it->set_value(plugin_liststore->col.active, v);
625 d += it->get_value(plugin_liststore->col.pdesc)->set_active(v);
633 void PluginDisplay::on_show_details() {
634 details_box->set_visible(show_details->get_active());
636 window->get_size(w, h);
637 window->resize(1, h);
640 void PluginDisplay::on_add_dry_wet_controller() {
641 if (!current_plugin) {
647 void PluginDisplay::on_row_activated(
const Gtk::TreePath& path, Gtk::TreeViewColumn* column) {
648 show_details->clicked();
651 void PluginDisplay::on_mono_stereo_changed() {
655 void PluginDisplay::on_view_changed(
const Gtk::ToggleButton *b) {
656 if (b->get_active()) {
661 void PluginDisplay::save_current() {
662 if (!current_plugin) {
665 ustring s = plugin_name->get_text();
672 plugin_category->get_active()->get_value(1, current_plugin->
category);
673 plugin_quirks->get_active()->get_value(1, current_plugin->
quirks);
674 Gtk::TreeIter it = master_slider_idx->get_active();
676 it->get_value(0, current_plugin->
MasterIdx);
683 current_plugin->
MasterLabel = master_slider_name->get_text();
687 int change_diff = changed - old_state;
689 change_count += change_diff;
698 void PluginDisplay::set_title() {
699 ustring t = _(
"Select LADSPA/LV2 plugins for Guitarix");
701 window->set_title(t + _(
" (*changed*)"));
703 window->set_title(t);
707 void PluginDisplay::set_old_state(
PluginDesc *p) {
709 old_state = (p->
old != 0);
715 void PluginDisplay::selection_changed() {
716 Gtk::TreeIter it = treeview1->get_selection()->get_selected();
719 p = it->get_value(plugin_liststore->col.pdesc);
720 if (current_plugin == p) {
725 on_reordered_conn.block();
726 port_liststore->clear();
727 on_reordered_conn.unblock();
728 ladspa_category->set_text(
"");
729 ladspa_maker->set_text(
"");
730 ladspa_uniqueid->set_text(
"");
731 plugin_name->set_text(
"");
732 plugin_category->set_active(-1);
733 plugin_quirks->set_active(-1);
739 plugin_name->modify_text(Gtk::STATE_NORMAL, Gdk::Color(
"red"));
741 plugin_name->unset_text(Gtk::STATE_NORMAL);
744 Gtk::TreeNodeChildren ch = plugin_category->get_model()->children();
746 for (it = ch.begin(); it != ch.end(); ++it, ++i) {
748 it->get_value(1, cat);
750 plugin_category->set_active(i);
754 ch = plugin_quirks->get_model()->children();
755 for (i = 0, it = ch.begin(); it != ch.end(); ++it, ++i) {
757 it->get_value(1, quirks);
758 if (quirks == p->
quirks) {
759 plugin_quirks->set_active(i);
763 Glib::RefPtr<Gtk::ListStore> ls_master = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(master_slider_idx->get_model());
765 it = ls_master->append();
769 for (
unsigned int i = 0; i < p->
ctrl_ports.size(); ++i) {
770 it = ls_master->append();
771 it->set_value(0,
int(i));
776 master_slider_idx->set_active(p->
MasterIdx+1);
777 master_slider_name->unset_text(Gtk::STATE_NORMAL);
781 master_slider_name->modify_text(Gtk::STATE_NORMAL, Gdk::Color(
"red"));
784 dry_wet_button->set_active(current_plugin->
add_wet_dry);
786 ladspa_maker->set_text(p->
Maker);
788 ladspa_uniqueid->set_text(ustring::compose(
"LV2: %1", p->
path));
790 ladspa_uniqueid->set_text(ustring::compose(
"%1: %2[%3]", p->
UniqueID, p->
path, p->
index));
792 for (
unsigned int i = 0; i < p->
ctrl_ports.size(); ++i) {
794 Glib::RefPtr<Gtk::ListStore> tls;
796 tls = output_type_list;
798 tls = display_type_list_sr;
800 tls = display_type_list;
816 it = port_liststore->append();
817 it->set_value(port_liststore->col.pos, q->
pos);
818 it->set_value(port_liststore->col.name, q->
get_name());
819 it->set_value(port_liststore->col.dflt, ustring::format(dflt));
820 it->set_value(port_liststore->col.low, ustring::format(low));
821 it->set_value(port_liststore->col.up, ustring::format(up));
822 it->set_value(port_liststore->col.step, ustring(step_type_names[q->
step]));
823 it->set_value(port_liststore->col.display, ustring(display_type_names[q->
get_tp()]));
824 it->set_value(port_liststore->col.display_types, tls);
825 it->set_value(port_liststore->col.port, q);
826 it->set_value(port_liststore->col.newrow, q->
get_newrow());
827 it->set_value(port_liststore->col.use_sr, q->
has_sr && !q->
use_sr);
828 it->set_value(port_liststore->col.has_caption, q->
has_caption);
832 void PluginDisplay::display_master_idx(
const Gtk::TreeIter& it) {
836 cellrenderer_master->property_text().set_value(
"--");
837 cellrenderer_master->property_foreground_set().set_value(
false);
839 cellrenderer_master->property_foreground().set_value(
"red");
843 void PluginDisplay::set_master_text() {
844 Gtk::TreeIter it = master_slider_idx->get_active();
846 master_slider_name->set_text(
"");
847 master_slider_name->set_editable(
false);
851 it->get_value(0, idx);
853 master_slider_name->set_text(
"");
854 master_slider_name->set_editable(
false);
856 for (std::vector<PortDesc*>::iterator q = current_plugin->
ctrl_ports.begin(); q != current_plugin->
ctrl_ports.end(); ++q) {
857 if ((*q)->pos == idx) {
858 master_slider_name->set_text((*q)->factory.get_name());
862 master_slider_name->set_editable(
true);
866 void PluginDisplay::on_parameter_selection_changed() {
867 Gtk::TreeIter it = treeview2->get_selection()->get_selected();
868 enum_liststore->clear();
870 PortDesc *q = it->get_value(port_liststore->col.port);
872 int up = int(q->
get_up());
873 for (
int idx =
int(q->
get_low()); idx <= up; ++idx) {
874 it = enum_liststore->append();
875 it->set_value(enum_liststore->col.value, idx);
876 it->set_value(enum_liststore->col.label, q->
get_enum(idx));
877 it->set_value(enum_liststore->col.port, q);
883 void PluginDisplay::on_reordered(
const Gtk::TreePath& path) {
884 assert(current_plugin);
886 for (
unsigned int i = 0; i < current_plugin->
ctrl_ports.size(); ++i) {
889 std::vector<PortDesc*> l;
890 Gtk::TreeNodeChildren ch = port_liststore->children();
891 for (Gtk::TreeIter it = ch.begin(); it != ch.end(); ++it) {
892 l.push_back(current_plugin->
ctrl_ports[d[it->get_value(port_liststore->col.pos)]]);
897 void PluginDisplay::on_type_edited(
const ustring& path,
const ustring& newtext) {
898 Gtk::TreeIter it = port_liststore->get_iter(path);
899 PortDesc *q = it->get_value(port_liststore->col.port);
902 for (
unsigned int i = 0; i <
sizeof(
display_type_names)/
sizeof(display_type_names[0]); i++) {
903 if (newtext == display_type_names[i]) {
938 it->set_value(port_liststore->col.dflt, ustring::format(dflt));
939 it->set_value(port_liststore->col.low, ustring::format(low));
940 it->set_value(port_liststore->col.up, ustring::format(up));
942 it->set_value(port_liststore->col.display, newtext);
943 on_parameter_selection_changed();
946 void PluginDisplay::on_step_edited(
const ustring& path,
const ustring& newtext) {
947 Gtk::TreeIter it = port_liststore->get_iter(path);
949 for (
unsigned int i = 0; i <
sizeof(
step_type_names)/
sizeof(step_type_names[0]); ++i) {
950 if (step_type_names[i] == newtext) {
955 it->get_value(port_liststore->col.port)->step = m;
956 it->set_value(port_liststore->col.step, newtext);
959 void PluginDisplay::on_label_edited(
const ustring& path,
const ustring& newtext) {
960 Gtk::TreeIter it = enum_liststore->get_iter(path);
961 PortDesc *q = it->get_value(enum_liststore->col.port);
962 ustring text(newtext);
964 int idx = it->get_value(enum_liststore->col.value);
966 if (text.empty() || (i != q->
factory.
enum_end() && i->second == text)) {
973 text = ustring::format(idx);
980 it->set_value(enum_liststore->col.label, text);
983 void PluginDisplay::on_name_edited(
const ustring& path,
const ustring& newtext) {
984 Gtk::TreeIter it = port_liststore->get_iter(path);
985 PortDesc *q = it->get_value(port_liststore->col.port);
986 ustring text(newtext);
993 it->set_value(port_liststore->col.name, q->
get_name());
996 void PluginDisplay::on_dflt_edited(
const ustring& path,
const ustring& newtext) {
997 Gtk::TreeIter it = port_liststore->get_iter(path);
998 PortDesc *q = it->get_value(port_liststore->col.port);
999 ustring text(newtext);
1005 if (val < q->get_low()) {
1016 val = strtod(text.c_str(), &p);
1017 if (p != text.c_str() + text.size()) {
1031 it->set_value(port_liststore->col.dflt, ustring::format(val));
1034 void PluginDisplay::on_low_edited(
const ustring& path,
const ustring& newtext) {
1035 Gtk::TreeIter it = port_liststore->get_iter(path);
1036 PortDesc *q = it->get_value(port_liststore->col.port);
1037 ustring text(newtext);
1054 val = strtod(text.c_str(), &p);
1055 if (p != text.c_str() + text.size()) {
1064 if (!(val2 < q->get_up())) {
1070 it->set_value(port_liststore->col.dflt, ustring::format(q->
get_dflt()));
1073 on_parameter_selection_changed();
1076 it->set_value(port_liststore->col.low, ustring::format(val));
1079 void PluginDisplay::on_up_edited(
const ustring& path,
const ustring& newtext) {
1080 Gtk::TreeIter it = port_liststore->get_iter(path);
1081 PortDesc *q = it->get_value(port_liststore->col.port);
1082 ustring text(newtext);
1099 val = strtod(text.c_str(), &p);
1100 if (p != text.c_str() + text.size()) {
1115 it->set_value(port_liststore->col.dflt, ustring::format(q->
get_dflt()));
1118 on_parameter_selection_changed();
1121 it->set_value(port_liststore->col.up, ustring::format(val));
1124 void PluginDisplay::on_newrow_toggled(
const ustring& path) {
1125 Gtk::TreeIter it = port_liststore->get_iter(path);
1126 PortDesc *q = it->get_value(port_liststore->col.port);
1127 bool s = !cellrenderer_newrow->get_active();
1128 it->set_value(port_liststore->col.newrow, s);
1136 void PluginDisplay::on_caption_toggled(
const ustring& path) {
1137 Gtk::TreeIter it = port_liststore->get_iter(path);
1138 PortDesc *q = it->get_value(port_liststore->col.port);
1139 bool s = !cellrenderer_caption->get_active();
1140 it->set_value(port_liststore->col.has_caption, s);
1144 void PluginDisplay::on_active_toggled(
const ustring& path) {
1145 Gtk::TreeIter it = plugin_liststore->get_iter(path);
1146 bool s = !cellrenderer_active->get_active();
1147 it->set_value(plugin_liststore->col.active, s);
1148 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)
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)
std::string get_builder_filepath(const std::string &basename) const
CellRendererComboDerived()
CellRendererComboDerived(BaseObjectType *castitem)
Glib::ustring get_enum(int idx)
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)