31 set_column_types(
col);
35 Gtk::TreeModel::const_iterator i =
const_cast<PresetStore*
>(
this)->get_iter(path);
36 Glib::ustring s(i->get_value(
col.
name));
62 preset_row_del_conn(),
67 in_current_preset(false),
70 load_widget_pointers(bld);
71 actions.
new_bank = Gtk::Action::create(
"NewBank");
72 actions.
group->add(actions.
new_bank, sigc::mem_fun(*
this, &PresetWindow::on_new_bank));
73 gtk_activatable_set_related_action(GTK_ACTIVATABLE(new_preset_bank->gobj()), actions.
new_bank->gobj());
74 actions.
save_changes = Gtk::Action::create(
"Save", _(
"_Save changes"));
75 actions.
group->add(actions.
save_changes, sigc::mem_fun(*
this, &PresetWindow::on_preset_save));
76 gtk_activatable_set_related_action(GTK_ACTIVATABLE(save_preset->gobj()), actions.
save_changes->gobj());
77 actions.
organize = Gtk::ToggleAction::create(
"Organize", _(
"_Organize"));
78 actions.
group->add(actions.
organize, sigc::mem_fun(*
this, &PresetWindow::on_organize));
79 gtk_activatable_set_related_action(GTK_ACTIVATABLE(organize_presets->gobj()), GTK_ACTION(actions.
organize->gobj()));
86 gtk_activatable_set_related_action(GTK_ACTIVATABLE(online_preset->gobj()), actions.
online_preset_bank->gobj());
88 bank_treeview->set_model(Gtk::ListStore::create(bank_col));
89 bank_treeview->set_name(
"PresetView");
90 bank_treeview->get_selection()->set_select_function(
91 sigc::mem_fun(*
this, &PresetWindow::select_func));
92 bank_treeview->set_has_tooltip(
true);
93 bank_treeview->signal_query_tooltip().connect(
94 sigc::mem_fun(*
this, &PresetWindow::on_bank_query_tooltip));
95 pb_edit = bank_treeview->render_icon(Gtk::Stock::EDIT, Gtk::ICON_SIZE_MENU);
96 pb_del = bank_treeview->render_icon(Gtk::Stock::DELETE, Gtk::ICON_SIZE_MENU);
98 pb_versiondiff = Gdk::Pixbuf::create_from_file(options.
get_style_filepath(
"versiondiff.png"));
99 pb_readonly = Gdk::Pixbuf::create_from_file(options.
get_style_filepath(
"readonly.png"));
100 pb_factory = Gdk::Pixbuf::create_from_file(options.
get_style_filepath(
"factory.png"));
101 bank_treeview->set_row_separator_func(sigc::mem_fun(*
this, &PresetWindow::is_row_separator));
102 bank_cellrenderer->signal_edited().connect(
103 sigc::bind(sigc::mem_fun(*
this, &PresetWindow::on_bank_edited), bank_treeview));
104 bank_cellrenderer->signal_editing_canceled().connect(
105 sigc::bind(sigc::mem_fun(*
this, &PresetWindow::on_edit_canceled), bank_treeview->get_column(1)));
106 bank_cellrenderer->signal_editing_started().connect(
107 sigc::bind(sigc::mem_fun(*
this, &PresetWindow::on_editing_started), bank_treeview->get_model()));
108 Gtk::TreeViewColumn *col = bank_treeview->get_column(1);
109 col->set_cell_data_func(**col->get_cell_renderers().begin(), sigc::mem_fun(*
this, &PresetWindow::highlight_current_bank));
111 std::vector<Gtk::TargetEntry> listTargets;
112 listTargets.push_back(Gtk::TargetEntry(
"GTK_TREE_MODEL_ROW", Gtk::TARGET_SAME_WIDGET, MODELROW_TARGET));
113 listTargets.push_back(Gtk::TargetEntry(
"text/uri-list", Gtk::TARGET_OTHER_APP, URILIST_TARGET));
114 bank_treeview->enable_model_drag_source(listTargets, Gdk::BUTTON1_MASK, Gdk::ACTION_COPY);
115 bank_treeview->drag_source_add_text_targets();
116 bank_treeview->signal_drag_motion().connect(sigc::mem_fun(*
this, &PresetWindow::on_bank_drag_motion),
false);
117 bank_treeview->enable_model_drag_dest(listTargets, Gdk::ACTION_COPY);
118 bank_treeview->signal_drag_data_received().connect(
119 sigc::mem_fun(*
this, &PresetWindow::on_bank_drag_data_received));
120 bank_treeview->signal_drag_data_get().connect(
121 sigc::mem_fun(*
this, &PresetWindow::on_bank_drag_data_get));
122 bank_treeview->signal_drag_begin().connect(
124 Glib::RefPtr<Gtk::TreeSelection> sel = bank_treeview->get_selection();
125 sel->set_mode(Gtk::SELECTION_BROWSE);
126 sel->signal_changed().connect(sigc::mem_fun(*
this, &PresetWindow::on_bank_changed));
127 bank_treeview->signal_button_release_event().connect(sigc::mem_fun(*
this, &PresetWindow::on_bank_button_release),
true);
128 Glib::RefPtr<Gtk::TreeModel> ls = bank_treeview->get_model();
129 bank_row_del_conn = ls->signal_row_deleted().connect(sigc::mem_fun(*
this, &PresetWindow::on_bank_reordered));
131 preset_treeview->set_model(pstore);
132 preset_treeview->set_name(
"PresetView");
133 preset_treeview->signal_drag_motion().connect(sigc::mem_fun(*
this, &PresetWindow::on_preset_drag_motion),
false);
134 preset_treeview->signal_drag_data_get().connect(sigc::mem_fun(*
this, &PresetWindow::on_preset_drag_data_get));
135 preset_treeview->signal_row_activated().connect(sigc::mem_fun(*
this, &PresetWindow::on_preset_row_activated));
136 preset_treeview->signal_button_press_event().connect(sigc::mem_fun(*
this, &PresetWindow::on_preset_button_press));
137 preset_treeview->signal_button_release_event().connect(sigc::mem_fun(*
this, &PresetWindow::on_preset_button_release),
true);
138 preset_row_del_conn = pstore->signal_row_deleted().connect(sigc::mem_fun(*
this, &PresetWindow::on_preset_reordered));
139 preset_treeview->get_selection()->set_mode(Gtk::SELECTION_BROWSE);
140 preset_treeview->get_selection()->set_select_function(
141 sigc::mem_fun(*
this, &PresetWindow::select_func));
142 preset_treeview->get_selection()->signal_changed().connect(sigc::mem_fun(*
this, &PresetWindow::on_preset_changed));
143 preset_treeview->signal_cursor_changed().connect(sigc::mem_fun(*
this, &PresetWindow::on_cursor_changed));
144 preset_cellrenderer->signal_edited().connect(sigc::mem_fun(*
this, &PresetWindow::on_preset_edited));
145 preset_cellrenderer->signal_editing_canceled().connect(
146 sigc::bind(sigc::mem_fun(*
this, &PresetWindow::on_edit_canceled), preset_treeview->get_column(0)));
147 preset_cellrenderer->signal_editing_started().connect(
149 sigc::mem_fun(*
this, &PresetWindow::on_editing_started),
150 Glib::RefPtr<Gtk::TreeModel>::cast_static(pstore)));
151 preset_treeview->get_column(0)->set_cell_data_func(
152 *preset_cellrenderer, sigc::mem_fun(*
this, &PresetWindow::text_func));
153 banks_combobox->signal_changed().connect(
154 sigc::mem_fun(*
this, &PresetWindow::on_preset_combo_changed));
155 presets_target_treeview->get_selection()->set_mode(Gtk::SELECTION_NONE);
156 std::vector<Gtk::TargetEntry> listTargets3;
157 listTargets3.push_back(
158 Gtk::TargetEntry(
"application/x-guitarix-preset", Gtk::TARGET_SAME_APP, 0));
159 presets_target_treeview->enable_model_drag_dest(listTargets3, Gdk::ACTION_COPY);
160 presets_target_treeview->signal_drag_motion().connect(
161 sigc::mem_fun(*
this, &PresetWindow::on_target_drag_motion),
false);
162 presets_target_treeview->signal_drag_data_received().connect_notify(
163 sigc::mem_fun(*
this, &PresetWindow::target_drag_data_received));
165 sigc::mem_fun(*
this, &PresetWindow::on_selection_changed));
168 gtk_size_group_add_widget(lc, GTK_WIDGET(close_preset->gobj()));
169 gtk_size_group_add_widget(lc, GTK_WIDGET(save_preset->gobj()));
170 gtk_size_group_add_widget(lc, GTK_WIDGET(new_preset_bank->gobj()));
171 gtk_size_group_add_widget(lc, GTK_WIDGET(organize_presets->gobj()));
172 gtk_size_group_add_widget(lc, GTK_WIDGET(online_preset->gobj()));
178 void PresetWindow::on_selection_changed() {
179 Gtk::TreeIter it = bank_treeview->get_selection()->get_selected();
181 it = preset_treeview->get_selection()->get_selected();
183 Glib::RefPtr<Gdk::Window> w = bank_treeview->get_window();
185 gdk_window_invalidate_rect(w->gobj(), 0,
true);
186 gdk_window_invalidate_rect(preset_treeview->get_window()->gobj(), 0,
true);
202 void PresetWindow::load_widget_pointers(Glib::RefPtr<gx_gui::GxBuilder> bld) {
203 bld->find_widget(
"close_preset", close_preset);
204 bld->find_widget(
"save_preset", save_preset);
205 bld->find_widget(
"new_preset_bank", new_preset_bank);
206 bld->find_widget(
"organize_presets", organize_presets);
207 bld->find_widget(
"online_preset", online_preset);
209 bld->find_widget(
"bank_cellrenderer", bank_cellrenderer);
211 bld->find_widget(
"preset_cellrenderer", preset_cellrenderer);
212 bld->find_widget(
"banks_combobox", banks_combobox);
214 bld->find_widget(
"preset_title", preset_title);
215 bld->find_widget(
"presets_target_scrolledbox", presets_target_scrolledbox);
216 bld->find_widget(
"bank_column_edit", bank_column_edit);
217 bld->find_widget(
"bank_column_delete", bank_column_delete);
218 bld->find_widget(
"preset_column_edit", preset_column_edit);
219 bld->find_widget(
"preset_column_delete", preset_column_delete);
220 bld->find_widget(
"main_vpaned", main_vpaned);
221 bld->find_widget(
"preset_scrolledbox", preset_scrolledbox);
224 static bool preset_button_press_idle(Gtk::Widget& w) {
229 bool PresetWindow::on_bank_query_tooltip(
int x,
int y,
bool kb_tooltip, Glib::RefPtr<Gtk::Tooltip> tooltip) {
231 if (!bank_treeview->get_tooltip_context_iter(x, y, kb_tooltip, it)) {
234 int tp = it->get_value(bank_col.
tp);
238 Gtk::TreeModel::Path pt;
239 Gtk::TreeViewColumn *col;
241 if (!bank_treeview->get_path_at_pos(x, y, pt, col, dx, dy)) {
244 Glib::ustring nm = it->get_value(bank_col.
name);
249 if (col == bank_treeview->get_column(0) || col == bank_treeview->get_column(1)) {
252 tooltip->set_text(_(
"damaged bank file; click to delete"));
255 Glib::ustring::compose(_(
"wrong format version (is %1, need %2)\nclick to convert"),
259 tooltip->set_text(_(
"readonly bank, click to change to read-write"));
260 }
else if (col == bank_treeview->get_column(0)){
261 tooltip->set_text(_(
"click to set to readonly"));
266 tooltip->set_text(_(
"predefined factory preset bank"));
268 tooltip->set_text(_(
"scratch preset bank: changes will be persistent (without explicit saving)"));
272 }
else if (col == bank_treeview->get_column(2)) {
276 tooltip->set_text(_(
"click to edit the bank name"));
277 }
else if (col == bank_treeview->get_column(3)) {
281 tooltip->set_text(_(
"click to delete the bank"));
285 bank_treeview->set_tooltip_cell(tooltip, &pt, col, 0);
289 void PresetWindow::on_preset_row_activated(
const Gtk::TreePath& path, Gtk::TreeViewColumn* column) {
290 bool in_organize = actions.
organize->get_active();
293 preset_treeview->get_selection()->select(path);
297 bool PresetWindow::on_preset_button_press(GdkEventButton *ev) {
298 if (ev->type == GDK_BUTTON_PRESS) {
299 Glib::signal_idle().connect(sigc::bind(sigc::ptr_fun(preset_button_press_idle), sigc::ref(*preset_treeview)));
305 void PresetWindow::on_preset_drag_data_get(
const Glib::RefPtr<Gdk::DragContext>& context, Gtk::SelectionData& selection,
int info,
int timestamp) {
306 if (selection.get_target() ==
"application/x-guitarix-preset") {
307 Gtk::TreeModel::Path path;
308 Gtk::TreeViewColumn *focus_column;
309 preset_treeview->get_cursor(path, focus_column);
310 Glib::ustring data = pstore->get_iter(path)->get_value(pstore->col.name);
311 selection.set(
"application/x-guitarix-preset", data);
315 void PresetWindow::on_bank_drag_data_get(
const Glib::RefPtr<Gdk::DragContext>& context, Gtk::SelectionData& selection,
int info,
int timestamp) {
316 if (info != URILIST_TARGET && info != TEXT_TARGETS) {
319 Gtk::TreeModel::Path path;
320 Gtk::TreeViewColumn *focus_column;
321 bank_treeview->get_cursor(path, focus_column);
322 Glib::RefPtr<Gio::File> f =
323 Gio::File::create_for_path(
325 bank_treeview->get_model()->get_iter(path)->get_value(bank_col.
name)));
326 if (info == TEXT_TARGETS) {
327 selection.set_text(f->get_path());
329 std::vector<std::string> uris;
330 uris.push_back(f->get_uri());
331 selection.set_uris(uris);
335 void PresetWindow::on_bank_drag_data_received(
const Glib::RefPtr<Gdk::DragContext>& context,
int x,
int y,
const Gtk::SelectionData& data, guint info, guint timestamp) {
336 if (info != URILIST_TARGET) {
340 bool is_move = context->get_selected_action() == Gdk::ACTION_MOVE;
342 bool is_move = context->gobj()->action == GDK_ACTION_MOVE;
344 bool success =
false;
345 std::vector<Glib::ustring> uris = data.get_uris();
346 Glib::RefPtr<Gtk::ListStore> ls = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(bank_treeview->get_model());
347 for (std::vector<Glib::ustring>::iterator i = uris.begin(); i != uris.end(); ++i) {
350 Gtk::TreeIter i = ls->prepend();
351 set_row_for_presetfile(i,f);
352 bank_treeview->set_cursor(ls->get_path(i));
353 bank_treeview->get_selection()->select(i);
357 context->drag_finish(success,
false, timestamp);
360 Glib::ustring PresetWindow::get_combo_selection() {
361 Gtk::TreeIter idx = banks_combobox->get_active();
365 return idx->get_value(target_col.
name);
372 void PresetWindow::target_drag_data_received(
const Glib::RefPtr<Gdk::DragContext>& context,
int x,
int y,
const Gtk::SelectionData& data, guint info, guint timestamp) {
373 Glib::ustring bank = get_combo_selection();
375 presets_target_treeview->signal_drag_data_received().emission_stop();
379 Glib::RefPtr<Gtk::ListStore> ls = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(presets_target_treeview->get_model());
380 Glib::ustring srcnm = data.get_data_as_string();
381 Glib::ustring dstnm = srcnm;
387 Glib::ustring src_bank = get_current_bank();
389 if (src_bank == bank) {
393 Gtk::TreeModel::Path pt;
394 Gtk::TreeViewDropPosition dst;
395 if (!presets_target_treeview->get_dest_row_at_pos(x, y, pt, dst)) {
396 ls->append()->set_value(target_col.
name, dstnm);
399 Gtk::TreeIter it = ls->get_iter(pt);
400 if (dst == Gtk::TREE_VIEW_DROP_BEFORE || dst == Gtk::TREE_VIEW_DROP_INTO_OR_BEFORE) {
401 ls->insert(it)->set_value(target_col.
name, dstnm);
404 ls->insert_after(it)->set_value(target_col.
name, dstnm);
408 if (context->get_action() == Gdk::ACTION_MOVE) {
409 Gtk::TreeModel::Path pt;
410 Gtk::TreeViewColumn *col;
411 preset_treeview->get_cursor(pt, col);
412 preset_row_del_conn.block();
413 pstore->erase(pstore->get_iter(pt));
414 preset_row_del_conn.unblock();
417 if (src_bank == bank) {
422 bool PresetWindow::on_target_drag_motion(
const Glib::RefPtr<Gdk::DragContext>& context,
int x,
int y, guint timestamp) {
423 Gtk::Widget *source_widget = Gtk::Widget::drag_get_source_widget(context);
424 if (source_widget != preset_treeview || get_combo_selection().empty()) {
425 context->drag_status((Gdk::DragAction)0, timestamp);
428 presets_target_treeview->on_drag_motion(context, x, y, timestamp);
429 Gtk::TreeIter it = bank_treeview->get_selection()->get_selected();
430 int tp = it->get_value(bank_col.
tp);
431 Glib::ustring nm = it->get_value(bank_col.
name);
433 get_combo_selection() == nm) {
434 context->drag_status(Gdk::ACTION_COPY, timestamp);
439 void PresetWindow::reload_combo() {
440 Glib::ustring old = get_combo_selection();
441 Glib::RefPtr<Gtk::ListStore> ls = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(banks_combobox->get_model());
446 int tp = i->get_type();
450 if (i->get_flags()) {
453 Glib::ustring s = i->get_name();
454 ls->append()->set_value(bank_col.
name, s);
460 banks_combobox->set_active(nn);
463 void PresetWindow::on_preset_combo_changed() {
464 Glib::RefPtr<Gtk::ListStore> ls = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(presets_target_treeview->get_model());
466 Glib::ustring nm = get_combo_selection();
472 ls->
append()->set_value(bank_col.
name, i->name);
476 void PresetWindow::reload_target() {
477 on_preset_combo_changed();
484 bool PresetWindow::select_func(
const Glib::RefPtr<Gtk::TreeModel>& model,
const Gtk::TreePath& path,
bool path_currently_selected) {
485 Glib::ustring s = model->get_iter(path)->get_value(bank_col.
name);
492 void PresetWindow::on_editing_started(
const Gtk::CellEditable* edit,
const Glib::ustring& path, Glib::RefPtr<Gtk::TreeModel>& model) {
493 Glib::ustring s = model->get_iter(path)->get_value(bank_col.
name);
495 dynamic_cast<Gtk::Entry*
>(
const_cast<Gtk::CellEditable*
>(edit))->set_text(
"");
497 dynamic_cast<Gtk::Entry*
>(
const_cast<Gtk::CellEditable*
>(edit))->set_text(s);
499 dynamic_cast<Gtk::Window*
>(main_vpaned->get_toplevel())->remove_accel_group(actions.
accels);
502 bool PresetWindow::edit_cell(
const Gtk::TreeModel::Path pt, Gtk::TreeViewColumn& col, Gtk::CellRenderer& cell) {
503 dynamic_cast<Gtk::CellRendererText*
>(&cell)->property_editable().set_value(
true);
504 col.get_tree_view()->set_cursor(pt, col,
true);
508 void PresetWindow::reset_edit(Gtk::TreeViewColumn& col) {
510 Glib::RefPtr<Gtk::ListStore> ls = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(col.get_tree_view()->get_model());
511 ls->erase(edit_iter);
512 edit_iter = ls->children().end();
514 Gtk::CellRendererText& cell = *
dynamic_cast<Gtk::CellRendererText*
>(col.get_first_cell_renderer());
515 cell.property_editable().set_value(
false);
516 col.set_min_width(0);
519 dynamic_cast<Gtk::Window*
>(main_vpaned->get_toplevel())->add_accel_group(actions.
accels);
522 void PresetWindow::on_edit_canceled(Gtk::TreeViewColumn *col) {
526 void PresetWindow::start_edit(
const Gtk::TreeModel::Path& pt, Gtk::TreeViewColumn& col, Gtk::CellRenderer& cell) {
527 col.set_min_width(100);
528 Glib::signal_idle().connect(
529 sigc::bind(sigc::mem_fun(*
this, &PresetWindow::edit_cell),
530 pt, sigc::ref(col), sigc::ref(cell)));
537 void PresetWindow::highlight_current_bank(Gtk::CellRenderer *cell,
const Gtk::TreeModel::iterator& iter) {
538 Glib::ustring t = iter->get_value(bank_col.
name);
542 Gtk::CellRendererText *tc =
dynamic_cast<Gtk::CellRendererText*
>(cell);
544 tc->property_foreground().set_value(
"#f00");
546 tc->property_foreground_set().set_value(
false);
548 int n = machine.
bank_size() - *bank_treeview->get_model()->get_path(iter).begin();
555 t = Glib::ustring::compose(
"%1: %2",
char(
'A'+n), t);
557 cell->set_property(
"text", t);
560 Glib::ustring PresetWindow::get_current_bank() {
561 Gtk::TreeIter it = get_current_bank_iter();
565 return it->get_value(bank_col.
name);
568 bool PresetWindow::run_message_dialog(Gtk::Widget& w,
const Glib::ustring& msg) {
569 Gtk::MessageDialog d(*dynamic_cast<Gtk::Window*>(w.get_toplevel()), msg,
false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL,
true);
570 d.set_position(Gtk::WIN_POS_MOUSE);
571 return d.run() == Gtk::RESPONSE_OK;
574 bool PresetWindow::on_bank_button_release(GdkEventButton *ev) {
576 Gtk::TreeModel::Path pt;
577 Gtk::TreeViewColumn *col;
579 if (!bank_treeview->get_path_at_pos(ev->x, ev->y, pt, col, dx, dy)) {
582 Gtk::TreeModel::Path path;
583 Gtk::TreeViewColumn *focus_column;
584 bank_treeview->get_cursor(path, focus_column);
585 if (col != focus_column || pt != path) {
588 Glib::RefPtr<Gtk::ListStore> ls = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(bank_treeview->get_model());
589 Gtk::TreeModel::iterator it = ls->get_iter(pt);
590 Glib::ustring nm = it->get_value(bank_col.
name);
591 int tp = it->get_value(bank_col.
tp);
592 if (col == bank_treeview->get_column(0)) {
601 if (run_message_dialog(*bank_treeview,
"convert bank " + nm +
" to new version?")) {
611 if (run_message_dialog(*bank_treeview,
"convert readonly bank " + nm +
" to new version?")) {
617 if (run_message_dialog(
618 *bank_treeview,
"delete damaged bank " + nm +
"?" 619 " Export it before deleting and ask in the" 620 " guitarix online forum if you want to try to repair it!")) {
631 if (col == bank_treeview->get_column(2)) {
632 col = bank_treeview->get_column(1);
633 start_edit(pt, *col, *col->get_first_cell_renderer());
634 }
else if (col == bank_treeview->get_column(3)) {
635 Gtk::MessageDialog d(*dynamic_cast<Gtk::Window*>(bank_treeview->get_toplevel()),
"delete bank " + nm +
"?",
false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL,
true);
636 d.set_position(Gtk::WIN_POS_MOUSE);
637 if (d.run() == Gtk::RESPONSE_OK) {
638 bank_row_del_conn.block();
640 bank_row_del_conn.unblock();
651 void PresetWindow::on_bank_edited(
const Glib::ustring& path,
const Glib::ustring& newtext, Gtk::TreeView* w) {
652 Gtk::TreeIter sel = w->get_model()->get_iter(path);
653 Glib::ustring oldname = sel->get_value(bank_col.
name);
654 Glib::ustring newname = newtext;
656 if (newname.empty() || newname == oldname) {
657 Gtk::TreeViewColumn *p = w->get_column(1);
661 Glib::RefPtr<Gtk::ListStore> ls = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(banks_combobox->get_model());
665 ls->prepend()->set_value(target_col.
name, f->
get_name());
666 edit_iter = ls->children().end();
667 set_row_for_presetfile(sel, f);
668 w->get_selection()->select(sel);
672 Gtk::TreeNodeChildren ch = ls->children();
673 for (Gtk::TreeIter it = ch.begin(); it != ch.end(); ++it) {
674 if (it->get_value(bank_col.
name) == oldname) {
675 it->set_value(bank_col.
name, newname);
678 w->get_model()->get_iter(path)->set_value(bank_col.
name, newname);
680 Gtk::TreeViewColumn *p = w->get_column(1);
684 bool PresetWindow::is_row_separator(
const Glib::RefPtr<Gtk::TreeModel>& model,
const Gtk::TreeModel::iterator& iter) {
688 void PresetWindow::on_new_bank() {
689 Glib::RefPtr<Gtk::ListStore> m = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(bank_treeview->get_model());
690 edit_iter = m->prepend();
693 start_edit(m->get_path(edit_iter), *bank_treeview->get_column(1), *bank_cellrenderer);
699 cancellable = Gio::Cancellable::create ();
700 file_state = sigc::ptr_fun(&f_progress);
707 Glib::Mutex::Lock lock (w_mutex);
711 cancellable->cancel();
712 if (!stop) timeout();
719 if(Gtk::Main::events_pending())
720 Gtk::Main::iteration(
false);
726 Glib::Mutex::Lock lock (w_mutex);
729 if (watcher) watcher->join();
732 void PresetWindow::go_watch () {
733 if(watch != NULL)
return;
735 watch->
timeout.connect(sigc::mem_fun(*
this, &PresetWindow::watch_done));
739 void PresetWindow::watch_done() {
740 if(watch == NULL)
return;
745 Glib::ustring PresetWindow::resolve_hostname() {
746 static Glib::ustring hostname =
"localhost";
748 hostname = Gio::Resolver::get_default()->lookup_by_address
754 bool PresetWindow::download_file(Glib::ustring from_uri, Glib::ustring to_path) {
757 Glib::RefPtr<Gio::File> rem = Gio::File::create_for_uri(from_uri);
758 Glib::RefPtr<Gio::File> dest = Gio::File::create_for_uri(Glib::filename_to_uri(to_path, resolve_hostname()));
761 }
catch (Gio::Error& e) {
763 gx_print_error( _(
"Time out, download cancelled"), _(
"the server on https://musical-artifacts.com/ takes to long to respond"));
765 gx_print_error(e.what().c_str(), Glib::ustring::compose(
"can't download '%1 ' from https://musical-artifacts.com/", from_uri));
766 if (watch) watch_done();
770 if (watch) watch_done();
774 void PresetWindow::downloadPreset(Gtk::Menu *presetMenu,std::string uri) {
776 std::string::size_type n = uri.find_last_of(
'/');
777 if (n != std::string::npos) {
778 std::string fn = uri.substr(n);
779 std::string ff =
"/tmp"+fn;
781 if (download_file(uri, ff)) {
782 Glib::RefPtr<Gtk::ListStore> ls = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(bank_treeview->get_model());
785 Gtk::TreeIter i = ls->prepend();
786 set_row_for_presetfile(i,f);
787 bank_treeview->set_cursor(ls->get_path(i));
788 bank_treeview->get_selection()->select(i);
792 gx_print_error(
"downloadPreset", _(
"can't download preset from https://musical-artifacts.com/"));
796 void PresetWindow::read_preset_menu() {
797 if (! machine.
get_jack()) usleep(5000);
798 Glib::RefPtr<Gio::File> dest = Gio::File::create_for_uri(Glib::filename_to_uri(options.
get_online_config_filename(), resolve_hostname()));
799 Glib::RefPtr<Gio::DataInputStream> in = Gio::DataInputStream::create(dest->read());
808 while ( in->read_line(line) )
810 std::istringstream is(line);
821 jp.
read_kv(
"description", INFO_);
826 INFO_ +=
"Author : " + AUTHOR_;
827 olp.push_back(std::tuple<std::string,std::string,std::string>(NAME_,FILE_,INFO_));
837 cerr <<
"JsonException: " << e.
what() <<
": '" << jp.
current_value() <<
"'" << endl;
879 void PresetWindow::popup_pos(
int& x,
int& y,
bool& push_in ){
880 online_preset->get_window()->get_origin( x, y );
886 void PresetWindow::create_preset_menu(
bool is_new) {
888 static bool read_new =
true;
889 if (read_new || is_new) {
895 Gtk::Menu *presetMenu = Gtk::manage(
new Gtk::Menu());
896 presetMenu->set_size_request (-1, 600);
897 for(std::vector<std::tuple<std::string,std::string,std::string> >::iterator it = olp.begin(); it != olp.end(); it++) {
898 item = Gtk::manage(
new Gtk::MenuItem(get<0>(*it),
true));
899 item->set_tooltip_text(get<2>(*it));
900 std::string f = get<1>(*it);
901 item->signal_activate().connect(sigc::bind(sigc::bind(sigc::mem_fun(
902 *
this, &PresetWindow::downloadPreset),f),presetMenu));
903 presetMenu->append(*item);
906 presetMenu->show_all();
907 presetMenu->popup(Gtk::Menu::SlotPositionCalc(sigc::mem_fun(
908 *
this, &PresetWindow::popup_pos ) ),0,gtk_get_current_event_time());
911 void PresetWindow::replace_inline(std::string& subject,
const std::string& search,
912 const std::string& replace) {
914 while ((pos = subject.find(search, pos)) != std::string::npos) {
915 subject.replace(pos, search.length(), replace);
916 pos += replace.length();
920 void PresetWindow::show_online_preset() {
922 Glib::RefPtr<Gio::File> dest = Gio::File::create_for_uri(Glib::filename_to_uri(options.
get_online_presets_filename(), resolve_hostname()));
923 static bool load_new =
true;
924 static bool load =
false;
925 Glib::RefPtr<Gdk::Window> window = preset_scrolledbox->get_toplevel()->get_window();
926 if (load_new || ! dest->query_exists()) {
927 Gdk::Cursor cursor(Gdk::WATCH);
928 window->set_cursor(cursor);
929 if (dest->query_exists()) {
930 Gtk::MessageDialog *d =
new Gtk::MessageDialog(*dynamic_cast<Gtk::Window*>(online_preset->get_toplevel()),
931 "Do you wont to check for new presets from\n https://musical-artifacts.com ? \n Note, that may take a while",
932 false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO,
true);
933 d->set_position(Gtk::WIN_POS_MOUSE);
934 if (d->run() == Gtk::RESPONSE_YES) load =
true;
937 if (load || ! dest->query_exists()) {
941 window->set_cursor();
945 window->set_cursor();
948 create_preset_menu(load_new);
951 void PresetWindow::on_online_preset() {
952 Glib::signal_idle().connect_once(sigc::mem_fun(*
this, &PresetWindow::show_online_preset));
955 bool PresetWindow::on_bank_drag_motion(
const Glib::RefPtr<Gdk::DragContext>& context,
int x,
int y, guint timestamp) {
956 Gtk::Widget *source_widget = Gtk::Widget::drag_get_source_widget(context);
957 if (!source_widget) {
960 if (context->get_suggested_action() == Gdk::ACTION_MOVE) {
961 a = context->get_suggested_action();
963 a = Gdk::ACTION_COPY;
965 context->drag_status(a, timestamp);
966 }
else if (source_widget != bank_treeview) {
968 context->drag_status((Gdk::DragAction)0, timestamp);
971 Gtk::TreeIter it = bank_treeview->get_selection()->get_selected();
975 int tp = it->get_value(bank_col.
tp);
977 context->drag_status((Gdk::DragAction)0, timestamp);
980 Gtk::TreeModel::Path pt;
981 Gtk::TreeViewDropPosition dst;
982 if (bank_treeview->get_dest_row_at_pos(x, y, pt, dst)) {
983 tp = bank_treeview->get_model()->get_iter(pt)->get_value(bank_col.
tp);
985 context->drag_status((Gdk::DragAction)0, timestamp);
989 bank_treeview->on_drag_motion(context, x, y, timestamp);
990 context->drag_status(Gdk::ACTION_MOVE, timestamp);
995 void PresetWindow::on_bank_changed() {
996 preset_row_del_conn.block();
1001 preset_row_del_conn.unblock();
1002 Gtk::TreeIter it = bank_treeview->get_selection()->get_selected();
1004 in_current_preset =
false;
1007 Glib::ustring nm = it->get_value(bank_col.
name);
1008 preset_title->set_text(nm);
1014 preset_treeview->unset_rows_drag_source();
1016 preset_treeview->unset_rows_drag_source();
1017 preset_treeview->set_reorderable(
true);
1018 std::vector<Gtk::TargetEntry> listTargets2;
1019 listTargets2.push_back(Gtk::TargetEntry(
"GTK_TREE_MODEL_ROW", Gtk::TARGET_SAME_WIDGET, 0));
1020 listTargets2.push_back(Gtk::TargetEntry(
"application/x-guitarix-preset", Gtk::TARGET_SAME_APP, 1));
1021 preset_treeview->enable_model_drag_source(listTargets2, Gdk::BUTTON1_MASK, Gdk::ACTION_COPY|Gdk::ACTION_MOVE);
1025 i = pstore->append();
1026 i->set_value(pstore->col.name, s->name);
1028 i->set_value(pstore->col.edit_pb, pb_edit);
1029 i->set_value(pstore->col.del_pb, pb_del);
1032 if (preset_treeview->get_mapped()) {
1033 preset_treeview->scroll_to_row(pstore->get_path(i));
1038 i = pstore->append();
1045 i->set_value(bank_col.
type_pb, pb_del);
1047 i->set_value(bank_col.
type_pb, pb_versiondiff);
1049 i->set_value(bank_col.
type_pb, pb_readonly);
1052 i->set_value(bank_col.
tp, tp);
1054 i->set_value(bank_col.
type_pb, pb_scratch);
1056 i->set_value(bank_col.
type_pb, pb_factory);
1058 i->set_value(bank_col.
edit_pb, pb_edit);
1059 i->set_value(bank_col.
del_pb, pb_del);
1063 void PresetWindow::reload_banks(
const Glib::ustring& sel_bank) {
1064 preset_row_del_conn.block();
1066 preset_row_del_conn.unblock();
1067 Glib::RefPtr<Gtk::ListStore> ls = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(bank_treeview->get_model());
1068 bank_row_del_conn.block();
1070 bank_row_del_conn.unblock();
1072 int in_factory =
false;
1080 set_row_for_presetfile(i, *v);
1081 if (v->get_name() == sel_bank) {
1082 bank_treeview->get_selection()->select(i);
1088 void PresetWindow::set_presets() {
1092 void PresetWindow::on_bank_reordered(
const Gtk::TreeModel::Path& path) {
1093 Glib::RefPtr<Gtk::TreeModel> ls = bank_treeview->get_model();
1094 Gtk::TreeModel::Children ch = ls->children();
1095 std::vector<Glib::ustring> l;
1096 for (Gtk::TreeIter i = ch.begin(); i != ch.end(); ++i) {
1097 int tp = i->get_value(bank_col.
tp);
1098 Glib::ustring nm = i->get_value(bank_col.
name);
1110 void PresetWindow::text_func(Gtk::CellRenderer *cell,
const Gtk::TreeModel::iterator& iter) {
1111 Glib::ustring val = iter->get_value(pstore->col.name);
1112 Glib::ustring t = val;
1113 #if false // gtk 2.24 1114 if (t.empty() && !cell->property_editing().get_value()) {
1118 g_object_get(cell->gobj(),
"editing", &editing, NULL);
1119 if (t.empty() && !editing) {
1122 }
else if (in_current_preset) {
1123 int n = *pstore->get_path(iter).begin();
1127 t = Glib::ustring::compose(
"%1: %2", n, t);
1130 cell->set_property(
"text", t);
1131 Gtk::CellRendererText *tc =
dynamic_cast<Gtk::CellRendererText*
>(cell);
1133 tc->property_foreground().set_value(
"#f00");
1135 tc->property_foreground_set().set_value(
false);
1139 bool PresetWindow::on_preset_button_release(GdkEventButton *ev) {
1140 Gtk::TreeModel::Path pt;
1141 Gtk::TreeViewColumn *col;
1143 if (!preset_treeview->get_path_at_pos(ev->x, ev->y, pt, col, dx, dy)) {
1146 Gtk::TreeModel::Path path;
1147 Gtk::TreeViewColumn *focus_column;
1148 preset_treeview->get_cursor(path, focus_column);
1149 if (col != focus_column || !path || pt != path) {
1152 Gtk::TreeIter bank_iter = get_current_bank_iter();
1153 int tp = bank_iter->get_value(bank_col.
tp);
1157 if (col == preset_treeview->get_column(1)) {
1158 col = preset_treeview->get_column(0);
1159 start_edit(pt, *col, *col->get_first_cell_renderer());
1160 }
else if (col == preset_treeview->get_column(2)) {
1161 Glib::ustring nm = pstore->get_iter(pt)->get_value(pstore->col.name);
1162 Gtk::MessageDialog d(*dynamic_cast<Gtk::Window*>(preset_treeview->get_toplevel()), Glib::ustring::compose(
"delete preset %1?", nm),
false,
1163 Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL,
true);
1164 d.set_position(Gtk::WIN_POS_MOUSE);
1165 if (d.run() == Gtk::RESPONSE_OK) {
1166 preset_row_del_conn.block();
1167 pstore->erase(pstore->get_iter(pt));
1168 preset_row_del_conn.unblock();
1176 void PresetWindow::on_preset_edited(
const Glib::ustring& path,
const Glib::ustring& newtext) {
1177 Gtk::TreeIter it = pstore->get_iter(path);
1178 Glib::ustring oldname = it->get_value(pstore->col.name);
1179 Glib::ustring newname = newtext;
1181 if (newname.empty() || newname == oldname) {
1182 reset_edit(*preset_treeview->get_column(0));
1187 if (newname.find_first_of(
"ÜüūûúùÖöøøōôóòǫ°Ääæǣāàáâąþćēêèéīîíìȳŷýỳźżłśñ&%$§!?*#|<>/~_") != Glib::ustring::npos) {
1188 gx_print_error(
"PresetWindow",
"Vowel mutation isn't allowed in preset names, please choose a name without \n(ÜüūûúùÖöøøōôóòǫ°Ääæǣāàáâąþēêèéīîíìȳŷýỳñ&%$§!?*#|<>/~_)");
1189 reset_edit(*preset_treeview->get_column(0));
1193 Glib::ustring t = newname;
1196 newname = Glib::ustring::compose(
"%1-%2", t, n);
1199 it->set_value(pstore->col.name, newname);
1200 it->set_value(pstore->col.edit_pb, pb_edit);
1201 it->set_value(pstore->col.del_pb, pb_del);
1202 if (oldname.empty()) {
1218 reset_edit(*preset_treeview->get_column(0));
1221 void PresetWindow::on_cursor_changed() {
1225 Gtk::TreeModel::Path path;
1226 Gtk::TreeViewColumn *focus_column;
1227 preset_treeview->get_cursor(path, focus_column);
1228 if (!pstore->get_iter(path)->get_value(pstore->col.name).empty()) {
1232 start_edit(path, *preset_treeview->get_column(0), *preset_cellrenderer);
1235 bool PresetWindow::on_preset_drag_motion(
const Glib::RefPtr<Gdk::DragContext>& context,
int x,
int y, guint timestamp) {
1236 if (Gtk::Widget::drag_get_source_widget(context) == preset_treeview) {
1237 Gtk::TreeIter it = bank_treeview->get_selection()->get_selected();
1240 preset_treeview->on_drag_motion(context, x, y, timestamp);
1241 Gtk::TreeModel::Path pt;
1242 Gtk::TreeViewDropPosition dst;
1243 if (preset_treeview->get_dest_row_at_pos(x, y, pt, dst)) {
1244 if (dst == Gtk::TREE_VIEW_DROP_BEFORE ||
1245 (dst == Gtk::TREE_VIEW_DROP_AFTER &&
1246 !pstore->get_iter(pt)->get_value(pstore->col.name).empty())) {
1247 context->drag_status(Gdk::ACTION_MOVE, timestamp);
1253 context->drag_status((Gdk::DragAction)0, timestamp);
1257 void PresetWindow::on_preset_reordered(
const Gtk::TreeModel::Path& path) {
1259 Gtk::TreeModel::Children ch = pstore->children();
1260 std::vector<Glib::ustring> l;
1261 for (Gtk::TreeIter i = ch.begin(); i != ch.end(); ++i) {
1262 Glib::ustring s = i->get_value(pstore->col.name);
1271 void PresetWindow::autosize() {
1272 if (bank_treeview->get_mapped()) {
1273 bank_treeview->columns_autosize();
1274 preset_treeview->columns_autosize();
1278 void PresetWindow::on_organize() {
1279 bool v = organize_presets->get_active();
1280 bank_column_edit->set_visible(v);
1281 bank_column_delete->set_visible(v);
1282 preset_column_edit->set_visible(v);
1283 preset_column_delete->set_visible(v);
1284 Glib::RefPtr<Gtk::TreeSelection> sel = preset_treeview->get_selection();
1286 actions.
presets->set_active(
true);
1287 sel->set_mode(Gtk::SELECTION_NONE);
1288 banks_combobox->set_active(-1);
1289 banks_combobox->show();
1290 presets_target_scrolledbox->show();
1293 sel->set_mode(Gtk::SELECTION_BROWSE);
1294 banks_combobox->hide();
1295 presets_target_scrolledbox->hide();
1306 void PresetWindow::on_presets_close() {
1307 actions.
presets->set_active(
false);
1314 bool PresetWindow::animate_preset_show() {
1315 vpaned_pos -= vpaned_step;
1316 if (vpaned_pos <= vpaned_target) {
1317 main_vpaned->set_position(vpaned_target);
1319 Gtk::TreeIter it = get_current_bank_iter();
1321 bank_treeview->scroll_to_row(bank_treeview->get_model()->get_path(it));
1325 main_vpaned->set_position(vpaned_pos);
1329 bool PresetWindow::animate_preset_hide() {
1330 vpaned_pos += vpaned_step;
1331 if (vpaned_pos >= vpaned_target) {
1332 preset_scrolledbox->hide();
1335 main_vpaned->set_position(vpaned_pos);
1339 void PresetWindow::on_preset_changed() {
1340 if (actions.
organize->get_active()) {
1345 Gtk::TreeIter it = bank_treeview->get_selection()->get_selected();
1349 bank = it->get_value(bank_col.
name);
1350 it = preset_treeview->get_selection()->get_selected();
1354 name = it->get_value(pstore->col.name);
1355 bool is_scratch =
false;
1370 in_current_preset =
true;
1376 void PresetWindow::on_preset_save() {
1387 void PresetWindow::display_paned(
bool show_preset,
int paned_child_height) {
1388 if (preset_scrolledbox->get_parent() == main_vpaned) {
1389 vpaned_pos = main_vpaned->get_allocation().get_height();
1391 main_vpaned->get_handle_window()->get_size(w, h);
1392 vpaned_target = vpaned_pos - paned_child_height - h;
1393 main_vpaned->set_position(vpaned_target);
1396 preset_scrolledbox->show();
1397 if (!show_preset || !in_current_preset) {
1400 on_map_conn.disconnect();
1406 Gtk::TreeIter it = get_current_bank_iter();
1408 Glib::signal_idle().connect_once(
1410 sigc::mem_fun1(bank_treeview, &MyTreeView::scroll_to_row),
1411 bank_treeview->get_model()->get_path(it)));
1413 Gtk::TreeNodeChildren ch = pstore->children();
1414 for (it = ch.begin(); it != ch.end(); ++it) {
1416 Glib::signal_idle().connect_once(
1418 sigc::mem_fun1(*preset_treeview, &MyTreeView::scroll_to_row),
1419 pstore->get_path(it)));
1426 static bool first_time =
true;
1429 paned_child_height += 1;
1432 on_map_conn.disconnect();
1433 bool is_mapped = main_vpaned->get_toplevel()->get_mapped();
1434 bool rack_visible = actions.
show_rack->get_active();
1438 }
else if (!get_current_bank_iter()) {
1440 if (!bank.empty()) {
1445 Gtk::TreeIter it = get_current_bank_iter();
1446 if (it && animated && is_mapped) {
1447 bank_treeview->scroll_to_row(bank_treeview->get_model()->get_path(it));
1452 on_map_conn = main_vpaned->get_toplevel()->signal_map().connect(
1454 sigc::mem_fun(*
this, &PresetWindow::display_paned),
1455 true, paned_child_height));
1456 }
else if (animated && rack_visible) {
1458 vpaned_pos = main_vpaned->get_allocation().get_height();
1460 main_vpaned->get_handle_window()->get_size(w, h);
1461 vpaned_target = vpaned_pos - paned_child_height - h;
1462 main_vpaned->set_position(vpaned_pos);
1463 vpaned_step = paned_child_height / 5;
1464 preset_scrolledbox->show();
1465 animate_preset_show();
1466 Glib::signal_timeout().connect(sigc::mem_fun(*
this, &PresetWindow::animate_preset_show), 20);
1468 display_paned(
false, paned_child_height);
1471 vpaned_target = main_vpaned->get_allocation().get_height();
1472 vpaned_pos = main_vpaned->get_position();
1473 if (animated && is_mapped && rack_visible) {
1474 vpaned_step = paned_child_height / 5;
1476 Glib::signal_timeout().connect(sigc::mem_fun(*
this, &PresetWindow::animate_preset_hide), 20);
1478 preset_scrolledbox->hide();
1480 actions.
organize->set_active(
false);
Gio::File::SlotFileProgress file_state
virtual gx_system::PresetFileGui * get_current_bank_file()=0
virtual void reorder_preset(gx_system::PresetFileGui &pf, const std::vector< Glib::ustring > &neworder)=0
Glib::RefPtr< Gio::Cancellable > cancellable
virtual void bank_set_flag(gx_system::PresetFileGui *pf, int flag, bool v)=0
bool has_entry(const Glib::ustring &name)
virtual bank_iterator bank_begin()=0
virtual std::string bank_get_filename(const Glib::ustring &bank)=0
Gtk::TreeModelColumn< Glib::RefPtr< Gdk::Pixbuf > > type_pb
std::string get_online_presets_filename() const
virtual void pf_insert_before(gx_system::PresetFileGui &pf, const Glib::ustring &src, gx_system::PresetFileGui &pftgt, const Glib::ustring &pos, const Glib::ustring &name)=0
virtual void pf_insert_after(gx_system::PresetFileGui &pf, const Glib::ustring &src, gx_system::PresetFileGui &pftgt, const Glib::ustring &pos, const Glib::ustring &name)=0
virtual int bank_size()=0
virtual gx_system::PresetFileGui * get_bank_file(const Glib::ustring &bank) const =0
virtual gx_jack::GxJack * get_jack()=0
std::vector< Position >::iterator iterator
virtual bool convert_preset(gx_system::PresetFileGui &pf)=0
Glib::RefPtr< Gtk::Action > save_changes
virtual gx_system::PresetFileGui * bank_insert_new(const Glib::ustring &newname)=0
virtual bool setting_is_preset()=0
std::string get_style_filepath(const std::string &basename) const
const Glib::ustring & get_rpcaddress()
static MyTreeView * create_from_builder(BaseObjectType *cobject)
Glib::RefPtr< Gtk::ToggleAction > show_rack
virtual void erase_preset(gx_system::PresetFileGui &pf, const Glib::ustring &name)=0
virtual bool rename_bank(const Glib::ustring &oldname, Glib::ustring &newname)=0
const SettingsFileHeader & get_header()
void gx_print_error(const char *, const std::string &)
bool read_kv(const char *key, float &v)
Glib::RefPtr< Gtk::ActionGroup > group
virtual bool bank_remove(const Glib::ustring &bank)=0
virtual const Glib::ustring & get_current_bank()=0
Gtk::TreeModelColumn< Glib::RefPtr< Gdk::Pixbuf > > del_pb
void append(const Glib::ustring &name)
virtual bool bank_check_reparse()=0
virtual bool row_draggable_vfunc(const TreeModel::Path &path) const
static void f_progress(goffset read, goffset total)
Gtk::TreeModelColumn< Glib::RefPtr< Gdk::Pixbuf > > edit_pb
Glib::RefPtr< Gtk::Action > new_bank
virtual sigc::signal< void > & signal_selection_changed()=0
Glib::RefPtr< Gtk::ToggleAction > organize
std::string to_string(const T &t)
void on_preset_select(bool v, bool animated, int preset_window_height)
virtual const char * what() const
PresetStore::PresetModelColumns col
std::string get_online_config_filename() const
virtual void load_preset(gx_system::PresetFileGui *pf, const Glib::ustring &name)=0
Glib::RefPtr< Gtk::AccelGroup > accels
Glib::RefPtr< Gtk::Action > online_preset_bank
virtual gx_system::CmdlineOptions & get_options() const =0
void strip(Glib::ustring &s)
Gtk::TreeModelColumn< Glib::ustring > name
PresetWindow(Glib::RefPtr< gx_gui::GxBuilder > bld, gx_engine::GxMachineBase &machine, const gx_system::CmdlineOptions &options, GxActions &actions, GtkSizeGroup *lc)
string current_value() const
void child_set_property(Gtk::Container &container, Gtk::Widget &child, const char *property_name, bool value)
Glib::RefPtr< Gtk::ToggleAction > presets
virtual bool rename_preset(gx_system::PresetFileGui &pf, const Glib::ustring &oldname, const Glib::ustring &newname)=0
Gtk::TreeModelColumn< int > tp
virtual void bank_reorder(const std::vector< Glib::ustring > &neworder)=0
const Glib::ustring & get_name(int n)
virtual const Glib::ustring & get_current_name()=0
virtual void bank_drag_begin()=0
Gtk::TreeModelColumn< Glib::ustring > name
virtual void pf_append(gx_system::PresetFileGui &pf, const Glib::ustring &src, gx_system::PresetFileGui &pftgt, const Glib::ustring &name)=0
virtual void pf_save(gx_system::PresetFileGui &pf, const Glib::ustring &name)=0
token next(token expect=no_token)
virtual gx_system::PresetFileGui * bank_insert_uri(const Glib::ustring &uri, bool move)=0
virtual gx_system::PresetFileGui * bank_get_file(const Glib::ustring &bank) const =0
Gtk::TreeModelColumn< Glib::ustring > name
virtual bank_iterator bank_end()=0