From 8854610aac91caaf6bb8db782cc4c9bd2ca53c52 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 10 Sep 2006 03:42:59 +0000 Subject: GUI redesigning. git-svn-id: http://svn.drobilla.net/lad/ingen@125 a436a847-0d15-0410-975c-d299462d15a1 --- src/common/util/Path.h | 5 + src/progs/ingenuity/BreadCrumb.h | 23 +- src/progs/ingenuity/Makefile.am | 4 +- src/progs/ingenuity/NewSubpatchWindow.cpp | 4 +- src/progs/ingenuity/PatchView.cpp | 72 +++-- src/progs/ingenuity/PatchView.h | 30 ++- src/progs/ingenuity/PatchWindow.cpp | 166 +++++------- src/progs/ingenuity/PatchWindow.h | 22 +- src/progs/ingenuity/ingenuity.glade | 431 +++++++++++++++++++----------- 9 files changed, 414 insertions(+), 343 deletions(-) (limited to 'src') diff --git a/src/common/util/Path.h b/src/common/util/Path.h index 197ffd16..c84607fb 100644 --- a/src/common/util/Path.h +++ b/src/common/util/Path.h @@ -96,6 +96,11 @@ public: return true; } + static bool is_valid_name(const std::basic_string& path) + { + return is_valid(string("/").append(path)); + } + /** Convert a string to a valid full path. * diff --git a/src/progs/ingenuity/BreadCrumb.h b/src/progs/ingenuity/BreadCrumb.h index 9b4c25cd..66e6d40a 100644 --- a/src/progs/ingenuity/BreadCrumb.h +++ b/src/progs/ingenuity/BreadCrumb.h @@ -17,10 +17,12 @@ #ifndef BREADCRUMB_H #define BREADCRUMB_H +// FIXME: remove +#include +using std::cerr; using std::endl; + #include -#include "PatchWindow.h" -#include "PatchController.h" -#include "PatchModel.h" +#include "util/Path.h" namespace Ingenuity { @@ -32,19 +34,14 @@ namespace Ingenuity { class BreadCrumb : public Gtk::ToggleButton { public: - BreadCrumb(PatchWindow* window, const Path& path) - : m_window(window) - , m_path(path) + BreadCrumb(const Path& path) + : m_path(path) { set_border_width(0); set_path(path); - signal_clicked().connect(sigc::bind(sigc::mem_fun( - m_window, &PatchWindow::breadcrumb_clicked), this)); show_all(); } - //PatchController* patch() { return m_patch; } - void set_path(const Path& path) { remove(); @@ -55,12 +52,10 @@ public: add(*lab); } - Path& path() { return m_path; } + const Path& path() { return m_path; } private: - PatchWindow* m_window; - Path m_path; - //PatchController* m_patch; + Path m_path; }; } // namespace Ingenuity diff --git a/src/progs/ingenuity/Makefile.am b/src/progs/ingenuity/Makefile.am index a014286c..7cc405c1 100644 --- a/src/progs/ingenuity/Makefile.am +++ b/src/progs/ingenuity/Makefile.am @@ -22,6 +22,9 @@ ingenuity_SOURCES = \ cmdline.h \ cmdline.c \ main.cpp \ + BreadCrumb.h \ + BreadCrumbBox.h \ + BreadCrumbBox.cpp \ ConnectWindow.h \ ConnectWindow.cpp \ App.h \ @@ -58,7 +61,6 @@ ingenuity_SOURCES = \ PatchView.cpp \ PatchWindow.h \ PatchWindow.cpp \ - BreadCrumb.h \ OmFlowCanvas.h \ OmFlowCanvas.cpp \ ../../common/types.h \ diff --git a/src/progs/ingenuity/NewSubpatchWindow.cpp b/src/progs/ingenuity/NewSubpatchWindow.cpp index 49122a21..0b94e3d2 100644 --- a/src/progs/ingenuity/NewSubpatchWindow.cpp +++ b/src/progs/ingenuity/NewSubpatchWindow.cpp @@ -63,8 +63,8 @@ void NewSubpatchWindow::name_changed() { string name = m_name_entry->get_text(); - if (name.find("/") != string::npos) { - m_message_label->set_text("Name may not contain '/'"); + if (!Path::is_valid_name(name)) { + m_message_label->set_text("Name contains invalid characters."); m_ok_button->property_sensitive() = false; } else if (m_patch_controller->patch_model()->get_node(name)) { m_message_label->set_text("An object already exists with that name."); diff --git a/src/progs/ingenuity/PatchView.cpp b/src/progs/ingenuity/PatchView.cpp index 644e0253..eb1fc1ce 100644 --- a/src/progs/ingenuity/PatchView.cpp +++ b/src/progs/ingenuity/PatchView.cpp @@ -35,19 +35,21 @@ namespace Ingenuity { PatchView::PatchView(BaseObjectType* cobject, const Glib::RefPtr& xml) : Gtk::Box(cobject), - m_patch(NULL), - m_canvas(NULL), - m_enable_signal(true) + _patch(NULL), + _canvas(NULL), + _breadcrumb_container(NULL), + _enable_signal(true) { property_visible() = false; - xml->get_widget("patch_canvas_scrolledwindow", m_canvas_scrolledwindow); - xml->get_widget("patch_zoom_scale", m_zoom_slider); - xml->get_widget("patch_polyphony_label", m_polyphony_label); - xml->get_widget("patch_process_checkbutton", m_process_checkbutton); + xml->get_widget("patch_view_scrolledwindow", _canvas_scrolledwindow); + xml->get_widget("patch_view_zoom_full_but", _zoom_full_but); + xml->get_widget("patch_view_zoom_normal_but", _zoom_normal_but); + xml->get_widget("patch_view_poly_spin", _poly_spin); + xml->get_widget("patch_view_process_but", _process_but); + xml->get_widget("patch_view_breadcrumb_container", _breadcrumb_container); - m_zoom_slider->signal_value_changed().connect( sigc::mem_fun(this, &PatchView::zoom_changed)); - m_process_checkbutton->signal_toggled().connect(sigc::mem_fun(this, &PatchView::process_toggled)); + _process_but->signal_toggled().connect(sigc::mem_fun(this, &PatchView::process_toggled)); } @@ -59,19 +61,17 @@ void PatchView::patch_controller(PatchController* pc) { //m_patch = new PatchController(pm, controller); - m_patch = pc; + _patch = pc; - m_canvas = new OmFlowCanvas(pc, 1600*2, 1200*2); + _canvas = new OmFlowCanvas(pc, 1600*2, 1200*2); - m_canvas_scrolledwindow->add(*m_canvas); - //m_canvas->show(); - //m_canvas_scrolledwindow->show(); + _canvas_scrolledwindow->add(*_canvas); + //_canvas->show(); + //_canvas_scrolledwindow->show(); - char txt[4]; - snprintf(txt, 8, "%zd", pc->patch_model()->poly()); - m_polyphony_label->set_text(txt); + _poly_spin->set_value(pc->patch_model()->poly()); - //m_description_window->patch_model(pc->model()); + //_description_window->patch_model(pc->model()); pc->patch_model()->enabled_sig.connect(sigc::mem_fun(this, &PatchView::enable)); pc->patch_model()->disabled_sig.connect(sigc::mem_fun(this, &PatchView::disable)); @@ -81,31 +81,23 @@ PatchView::patch_controller(PatchController* pc) void PatchView::show_control_window() { - if (m_patch != NULL) - m_patch->show_control_window(); -} - - -void -PatchView::zoom_changed() -{ - float z = m_zoom_slider->get_value(); - m_canvas->zoom(z); + if (_patch != NULL) + _patch->show_control_window(); } void PatchView::process_toggled() { - if (!m_enable_signal) + if (!_enable_signal) return; - if (m_process_checkbutton->get_active()) { - App::instance().engine()->enable_patch(m_patch->model()->path()); - App::instance().patch_tree()->patch_enabled(m_patch->model()->path()); + if (_process_but->get_active()) { + App::instance().engine()->enable_patch(_patch->model()->path()); + App::instance().patch_tree()->patch_enabled(_patch->model()->path()); } else { - App::instance().engine()->disable_patch(m_patch->model()->path()); - App::instance().patch_tree()->patch_disabled(m_patch->model()->path()); + App::instance().engine()->disable_patch(_patch->model()->path()); + App::instance().patch_tree()->patch_disabled(_patch->model()->path()); } } @@ -113,18 +105,18 @@ PatchView::process_toggled() void PatchView::enable() { - m_enable_signal = false; - m_process_checkbutton->set_active(true); - m_enable_signal = true; + _enable_signal = false; + _process_but->set_active(true); + _enable_signal = true; } void PatchView::disable() { - m_enable_signal = false; - m_process_checkbutton->set_active(false); - m_enable_signal = true; + _enable_signal = false; + _process_but->set_active(false); + _enable_signal = true; } diff --git a/src/progs/ingenuity/PatchView.h b/src/progs/ingenuity/PatchView.h index 9772154b..7f91f6cf 100644 --- a/src/progs/ingenuity/PatchView.h +++ b/src/progs/ingenuity/PatchView.h @@ -59,26 +59,32 @@ public: void patch_controller(PatchController* pc); - OmFlowCanvas* canvas() const { return m_canvas; } - PatchController* patch_controller() const { return m_patch; } - + OmFlowCanvas* canvas() const { return _canvas; } + PatchController* patch_controller() const { return _patch; } + Gtk::Viewport* breadcrumb_container() const { return _breadcrumb_container; } void show_control_window(); - void zoom_changed(); void process_toggled(); void enable(); void disable(); private: - PatchController* m_patch; - OmFlowCanvas* m_canvas; - - Gtk::ScrolledWindow* m_canvas_scrolledwindow; - Gtk::HScale* m_zoom_slider; - Gtk::Label* m_polyphony_label; - Gtk::CheckButton* m_process_checkbutton; + PatchController* _patch; + OmFlowCanvas* _canvas; - bool m_enable_signal; + Gtk::ScrolledWindow* _canvas_scrolledwindow; + + Gtk::ToggleToolButton* _process_but; + Gtk::SpinButton* _poly_spin; + Gtk::ToolButton* _clear_but; + Gtk::ToolButton* _destroy_but; + Gtk::ToolButton* _refresh_but; + Gtk::ToolButton* _save_but; + Gtk::ToolButton* _zoom_normal_but; + Gtk::ToolButton* _zoom_full_but; + Gtk::Viewport* _breadcrumb_container; + + bool _enable_signal; }; diff --git a/src/progs/ingenuity/PatchWindow.cpp b/src/progs/ingenuity/PatchWindow.cpp index 60fa966b..2dfcded0 100644 --- a/src/progs/ingenuity/PatchWindow.cpp +++ b/src/progs/ingenuity/PatchWindow.cpp @@ -33,7 +33,7 @@ #include "ConfigWindow.h" #include "MessagesWindow.h" #include "PatchTreeWindow.h" -#include "BreadCrumb.h" +#include "BreadCrumbBox.h" #include "Store.h" #include "ConnectWindow.h" #include "Loader.h" @@ -49,13 +49,13 @@ PatchWindow::PatchWindow(BaseObjectType* cobject, const Glib::RefPtrget_widget("patch_win_vbox", m_vbox); xml->get_widget("patch_win_viewport", m_viewport); - xml->get_widget("patch_win_breadcrumb_box", m_breadcrumb_box); //xml->get_widget("patch_win_status_bar", m_status_bar); //xml->get_widget("patch_open_menuitem", m_menu_open); xml->get_widget("patch_import_menuitem", m_menu_import); @@ -71,9 +71,6 @@ PatchWindow::PatchWindow(BaseObjectType* cobject, const Glib::RefPtrget_widget("patch_fullscreen_menuitem", m_menu_fullscreen); xml->get_widget("patch_clear_menuitem", m_menu_clear); xml->get_widget("patch_destroy_menuitem", m_menu_destroy_patch); - /*xml->get_widget("patch_add_plugin_menuitem", m_menu_add_plugin); - xml->get_widget("patch_add_new_subpatch_menuitem", m_menu_new_subpatch); - xml->get_widget("patch_add_subpatch_from_file_menuitem", m_menu_load_subpatch);*/ xml->get_widget("patch_view_messages_window_menuitem", m_menu_view_messages_window); xml->get_widget("patch_view_patch_tree_window_menuitem", m_menu_view_patch_tree_window); xml->get_widget("patch_help_about_menuitem", m_menu_help_about); @@ -83,7 +80,6 @@ PatchWindow::PatchWindow(BaseObjectType* cobject, const Glib::RefPtrget_widget_derived("load_patch_win", m_load_patch_window); xml->get_widget_derived("load_subpatch_win", m_load_subpatch_window); - //m_load_plugin_window->set_transient_for(*this); m_new_subpatch_window->set_transient_for(*this); m_load_patch_window->set_transient_for(*this); m_load_subpatch_window->set_transient_for(*this); @@ -118,12 +114,6 @@ PatchWindow::PatchWindow(BaseObjectType* cobject, const Glib::RefPtrsignal_activate().connect( sigc::mem_fun(this, &PatchWindow::event_clear)); - /*m_menu_add_plugin->signal_activate().connect( - sigc::mem_fun(m_load_plugin_window, &LoadPluginWindow::present)); - m_menu_new_subpatch->signal_activate().connect( - sigc::mem_fun(m_new_subpatch_window, &NewSubpatchWindow::present)); - m_menu_load_subpatch->signal_activate().connect( - sigc::mem_fun(m_load_subpatch_window, &LoadSubpatchWindow::present));*/ m_menu_view_messages_window->signal_activate().connect( sigc::mem_fun(App::instance().messages_dialog(), &MessagesWindow::present)); m_menu_view_patch_tree_window->signal_activate().connect( @@ -133,6 +123,9 @@ PatchWindow::PatchWindow(BaseObjectType* cobject, const Glib::RefPtrsignal_activate().connect( sigc::mem_fun(App::instance().about_dialog(), &Gtk::Dialog::present)); + + m_breadcrumb_box = new BreadCrumbBox(); + m_breadcrumb_box->signal_patch_selected.connect(sigc::mem_fun(this, &PatchWindow::patch)); App::instance().add_patch_window(this); } @@ -149,6 +142,32 @@ PatchWindow::~PatchWindow() } +/** Set the patch controller from a Path (for BreadCrumbs) + */ +void +PatchWindow::patch(const Path& path) +{ + CountedPtr model = App::instance().store()->object(path); + if (!model) + return; // can't really do anything useful.. + + PatchController* pc = dynamic_cast(model->controller()); + + if (!pc) { + pc = new PatchController(model); + model->set_controller(pc); + } + + assert(pc); + + if (pc->window() != NULL && pc->window()->is_visible()) { + pc->show_patch_window(); + } else { + patch_controller(pc); + } +} + + /** Sets the patch controller for this window and initializes everything. * * This function MUST be called before using the window in any way! @@ -156,9 +175,12 @@ PatchWindow::~PatchWindow() void PatchWindow::patch_controller(PatchController* pc) { + if (!pc || pc == m_patch) + return; + m_enable_signal = false; - assert(pc != NULL); + assert(pc); assert(m_patch != pc); assert(m_patch == NULL || pc->model()->path() != m_patch->model()->path()); @@ -174,11 +196,19 @@ PatchWindow::patch_controller(PatchController* pc) if (pc->view() == NULL) pc->create_view(); - assert(pc->view() != NULL); + assert(pc->view()); PatchView* const patch_view = pc->view(); assert(patch_view != NULL); patch_view->reparent(*m_viewport); + + if (m_breadcrumb_box->get_parent()) + m_breadcrumb_box->reparent(*patch_view->breadcrumb_container()); + else + patch_view->breadcrumb_container()->add(*m_breadcrumb_box); + + m_breadcrumb_box->build(pc->model()->path()); + m_breadcrumb_box->show(); pc->window(this); show_all(); @@ -204,26 +234,6 @@ PatchWindow::patch_controller(PatchController* pc) //m_properties_window->patch_model(pc->patch_model()); - - // Setup breadcrumbs box - // FIXME: this is filthy - - // Moving to a parent patch, depress correct button - if (old_pc != NULL && - old_pc->model()->path().substr(0, pc->model()->path().length()) - == pc->model()->path()) { - for (list::iterator i = m_breadcrumbs.begin(); i != m_breadcrumbs.end(); ++i) { - if ((*i)->path() == pc->path()) - (*i)->set_active(true); - else if ((*i)->path() == old_pc->path()) - (*i)->set_active(false); - } - - // Rebuild breadcrumbs from scratch (yeah, laziness..) - } else { - rebuild_breadcrumbs(); - } - if (pc->model()->path() == "/") m_menu_destroy_patch->set_sensitive(false); else @@ -237,71 +247,6 @@ PatchWindow::patch_controller(PatchController* pc) } -/** Destroys current breadcrumbs and rebuilds from scratch. - * - * (Needs to be called when a patch is cleared to eliminate children crumbs) - */ -void -PatchWindow::rebuild_breadcrumbs() -{ - // Empty existing breadcrumbs - for (list::iterator i = m_breadcrumbs.begin(); i != m_breadcrumbs.end(); ++i) - m_breadcrumb_box->remove(**i); - m_breadcrumbs.clear(); - - // Add new ones - string path = m_patch->path(); // To be chopped up, starting at the left - string but_name; // Name on breadcrumb button - string but_path; // Full path breadcrumb represents - - // Add root - assert(path[0] == '/'); - BreadCrumb* but = manage(new BreadCrumb(this, "/")); - m_breadcrumb_box->pack_start(*but, false, false, 1); - m_breadcrumbs.push_back(but); - path = path.substr(1); // hack off leading slash - - // Add the rest - while (path.length() > 0) { - if (path.find("/") != string::npos) { - but_name = path.substr(0, path.find("/")); - but_path += string("/") + path.substr(0, path.find("/")); - path = path.substr(path.find("/")+1); - } else { - but_name = path; - but_path += string("/") + path; - path = ""; - } - BreadCrumb* but = manage(new BreadCrumb(this, but_path));//Store::instance().patch(but_path))); - m_breadcrumb_box->pack_start(*but, false, false, 1); - m_breadcrumbs.push_back(but); - } - (*m_breadcrumbs.back()).set_active(true); - -} - - -void -PatchWindow::breadcrumb_clicked(BreadCrumb* crumb) -{ - if (m_enable_signal) { - // FIXME: check to be sure PatchModel exists, then controller - maybe - // even make a controller if there isn't one? - PatchController* const pc = dynamic_cast( - App::instance().store()->object(crumb->path())->controller()); - assert(pc != NULL); - - if (pc == m_patch) { - crumb->set_active(true); - } else if (pc->window() != NULL && pc->window()->is_visible()) { - pc->show_patch_window(); - crumb->set_active(false); - } else { - patch_controller(pc); - } - } -} - void PatchWindow::event_show_engine() @@ -336,6 +281,8 @@ PatchWindow::event_show_properties() void PatchWindow::node_removed(const string& name) { + throw; // FIXME +/* for (list::iterator i = m_breadcrumbs.begin(); i != m_breadcrumbs.end(); ++i) { if ((*i)->path() == m_patch->model()->base_path() + name) { for (list::iterator j = i; j != m_breadcrumbs.end(); ) { @@ -345,7 +292,7 @@ PatchWindow::node_removed(const string& name) } break; } - } + }*/ } @@ -354,10 +301,12 @@ PatchWindow::node_removed(const string& name) void PatchWindow::node_renamed(const string& old_path, const string& new_path) { + throw; // FIXME + /* for (list::iterator i = m_breadcrumbs.begin(); i != m_breadcrumbs.end(); ++i) { if ((*i)->path() == old_path) (*i)->set_path(new_path); - } + }*/ } @@ -366,11 +315,13 @@ PatchWindow::node_renamed(const string& old_path, const string& new_path) void PatchWindow::patch_renamed(const string& new_path) { + throw; // FIXME + /* set_title(new_path); for (list::iterator i = m_breadcrumbs.begin(); i != m_breadcrumbs.end(); ++i) { if ((*i)->path() == m_patch->path()) (*i)->set_path(new_path); - } + }*/ } /* @@ -474,6 +425,7 @@ PatchWindow::on_show() void PatchWindow::on_hide() { + claim_breadcrumbs(); m_position_stored = true; get_position(m_x, m_y); Gtk::Window::on_hide(); @@ -568,7 +520,7 @@ PatchWindow::event_clear() void PatchWindow::event_fullscreen_toggled() { - // FIXME: ugh, use GTK signals to track state and now for sure + // FIXME: ugh, use GTK signals to track state and know for sure static bool is_fullscreen = false; if (!is_fullscreen) { @@ -580,5 +532,11 @@ PatchWindow::event_fullscreen_toggled() } } +void +PatchWindow::claim_breadcrumbs() +{ + m_breadcrumb_box->reparent(m_breadcrumb_bin); +} + } // namespace Ingenuity diff --git a/src/progs/ingenuity/PatchWindow.h b/src/progs/ingenuity/PatchWindow.h index 291ea56b..07a3e92e 100644 --- a/src/progs/ingenuity/PatchWindow.h +++ b/src/progs/ingenuity/PatchWindow.h @@ -22,6 +22,7 @@ #include #include #include +#include "util/Path.h" using std::string; using std::list; @@ -49,7 +50,7 @@ class NodeControlWindow; class PatchDescriptionWindow; class SubpatchModule; class OmPort; -class BreadCrumb; +class BreadCrumbBox; /** A window for a patch. @@ -62,6 +63,7 @@ public: PatchWindow(BaseObjectType* cobject, const Glib::RefPtr& glade_xml); ~PatchWindow(); + void patch(const Path& path); void patch_controller(PatchController* pc); PatchController* patch_controller() const { return m_patch; } @@ -73,11 +75,11 @@ public: void node_removed(const string& name); void node_renamed(const string& old_path, const string& new_path); void patch_renamed(const string& new_path); - void rebuild_breadcrumbs(); - void breadcrumb_clicked(BreadCrumb* crumb); - + Gtk::MenuItem* menu_view_control_window() { return m_menu_view_control_window; } + void claim_breadcrumbs(); + protected: void on_show(); void on_hide(); @@ -85,7 +87,6 @@ protected: bool on_key_press_event(GdkEventKey* event); private: - //void event_open(); void event_import(); void event_save(); void event_save_as(); @@ -109,7 +110,6 @@ private: int m_x; int m_y; - //Gtk::MenuItem* m_menu_open; Gtk::MenuItem* m_menu_import; Gtk::MenuItem* m_menu_save; Gtk::MenuItem* m_menu_save_as; @@ -122,18 +122,18 @@ private: Gtk::MenuItem* m_menu_view_engine_window; Gtk::MenuItem* m_menu_view_control_window; Gtk::MenuItem* m_menu_view_patch_properties; - /*Gtk::MenuItem* m_menu_add_plugin; - Gtk::MenuItem* m_menu_new_subpatch; - Gtk::MenuItem* m_menu_load_subpatch;*/ Gtk::MenuItem* m_menu_view_messages_window; Gtk::MenuItem* m_menu_view_patch_tree_window; Gtk::MenuItem* m_menu_help_about; Gtk::VBox* m_vbox; Gtk::Viewport* m_viewport; - Gtk::HBox* m_breadcrumb_box; - list m_breadcrumbs; + BreadCrumbBox* m_breadcrumb_box; + //Gtk::Statusbar* m_status_bar; + + /** Invisible bin used to store breadcrumbs when not shown by a view */ + Gtk::Alignment m_breadcrumb_bin; }; diff --git a/src/progs/ingenuity/ingenuity.glade b/src/progs/ingenuity/ingenuity.glade index 178eac88..84540c7c 100644 --- a/src/progs/ingenuity/ingenuity.glade +++ b/src/progs/ingenuity/ingenuity.glade @@ -4,8 +4,7 @@ - 1 - Om + Ingen GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False @@ -389,23 +388,6 @@ - - - True - False - 0 - - - - - - - 0 - False - False - - - True @@ -1633,7 +1615,7 @@ True - 2 + 3 2 False 0 @@ -1781,27 +1763,6 @@ False 0 - - - 1 - True - True - GTK_POLICY_ALWAYS - GTK_POLICY_ALWAYS - GTK_SHADOW_NONE - GTK_CORNER_TOP_LEFT - - - - - - - 0 - True - True - - - True @@ -1809,185 +1770,337 @@ 0 - + True - Enable audio processing for this patch - True - Run - True - GTK_RELIEF_NORMAL - True - False - False - True + GTK_ORIENTATION_HORIZONTAL + GTK_TOOLBAR_BOTH + True + False + + + + True + True + True + False + + + + True + GTK_SHADOW_NONE + + + + + + + + + False + False + + + + + + True + True + True + True + + + False + False + + 0 - False + True True - + True - True - False - True - - - 0 - False - False - - + GTK_ORIENTATION_HORIZONTAL + GTK_TOOLBAR_ICONS + True + False - - - True - False - 0 + + + True + True + True + True + + + False + False + + - + True - Polyphony: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 + Enable DSP processing + + True + gtk-execute + True + True + False + True - 0 False - False + True - + True - ? - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 + True + True + True - 0 False - False + False - - - 10 - True - False - - - - - True - True - False - True - - - 0 - False - False - - + + + True + True + True + False - - - True - False - 0 + + + True + gtk-copy + 4 + 0.5 + 0.5 + 4 + 0 + + + + + False + False + + - + True - Zoom: - False - True - GTK_JUSTIFY_LEFT - False - False - 0.469999998808 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 + True + True + False + + + + True + Polyphony (Patch must be disabled to modify) + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 1 999 1 10 10 + + - 2 False - False + False - - 90 + True - True - False - GTK_POS_RIGHT - 1 - GTK_UPDATE_CONTINUOUS - False - 1.10638296604 0.25 2 0.25 0 0 + True + True + True - 0 False - False + False + + + + + + True + Destroy all children nodes (twice to clear ports as well) + + True + gtk-clear + True + True + False + + + False + True + + + + + + True + Destroy patch + gtk-delete + True + True + False + + + False + True + + + + + + True + True + True + True + + + False + False + + + + + + True + Refresh view + gtk-refresh + True + True + False + + + False + True + + + + + + True + Save patch to a file + gtk-save + True + True + False + + + False + True + + + + + + True + True + True + True + + + False + False + + + + + + True + Zoom to normal size + + True + gtk-zoom-100 + True + True + False + + + False + True + + + + + + True + Fit patch in window + + True + gtk-zoom-fit + True + True + False + + + False + True 0 False - True + False - 0 + 1 False False + + + + 1 + True + True + GTK_POLICY_ALWAYS + GTK_POLICY_ALWAYS + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + + + + 0 + True + True + + 0 1 - 1 - 2 + 2 + 3 fill -- cgit v1.2.1