From d0f48e6c3d6bec0a775bb2fde61e7a0c5d29dedd Mon Sep 17 00:00:00 2001 From: Valeriy Kamyshniy Date: Tue, 27 May 2014 15:53:33 -0500 Subject: [PATCH] [Summary] Progressing tools for waveform zooming [git-p4: depot-paths = "//Abdaw/dev_main/tracks/": change = 463990] --- gtk2_ardour/ui/editor_window.xml | 2 +- gtk2_ardour/ui/session_dialog.xml | 6 ++ gtk2_ardour/waves_ui.cc | 127 ++++++++++++++++++++++-------- gtk2_ardour/waves_ui.h | 40 +++++----- libs/gtkmm2ext/wscript | 3 +- 5 files changed, 127 insertions(+), 51 deletions(-) diff --git a/gtk2_ardour/ui/editor_window.xml b/gtk2_ardour/ui/editor_window.xml index a24db0b5f7..98816f2664 100644 --- a/gtk2_ardour/ui/editor_window.xml +++ b/gtk2_ardour/ui/editor_window.xml @@ -8,7 +8,7 @@ diff --git a/gtk2_ardour/ui/session_dialog.xml b/gtk2_ardour/ui/session_dialog.xml index 35f7a7c238..d64a66a1a2 100644 --- a/gtk2_ardour/ui/session_dialog.xml +++ b/gtk2_ardour/ui/session_dialog.xml @@ -88,4 +88,10 @@ + diff --git a/gtk2_ardour/waves_ui.cc b/gtk2_ardour/waves_ui.cc index ea4be59546..4f8b9b3f6a 100644 --- a/gtk2_ardour/waves_ui.cc +++ b/gtk2_ardour/waves_ui.cc @@ -31,9 +31,9 @@ using namespace PBD; using namespace ARDOUR; Gtk::Widget* -WavesUI::create_widget (const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets) +WavesUI::create_widget (const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets) { - Gtk::Widget* child = NULL; + Gtk::Object* child = NULL; std::string widget_type = definition.name(); std::string widget_id = xml_property (definition, "id", styles, ""); @@ -77,20 +77,58 @@ WavesUI::create_widget (const XMLNode& definition, const XMLNodeMap& styles, std child = manage (new Gtk::HBox); } else if (widget_type == "EVENTBOX") { child = manage (new Gtk::EventBox); + } else if (widget_type == "FADER") { + std::string face_image = xml_property (definition, "facesource", styles, ""); + if (face_image.empty()) { + dbg_msg("Fader's facesource NOT SPECIFIED!"); + throw std::exception(); + } + std::string handle_image = xml_property (definition, "handlesource", styles, ""); + if (handle_image.empty()) { + dbg_msg("Fader's handlesource NOT SPECIFIED!"); + throw std::exception(); + } + std::string adjustment_id = xml_property (definition, "adjustment", styles, ""); + if (adjustment_id.empty()) { + dbg_msg("Fader's adjustment_id NOT SPECIFIED!"); + throw std::exception(); + } + Gtk::Adjustment& adjustment = named_widgets.get_adjustment(adjustment_id.c_str()); + child = manage (new Gtkmm2ext::Fader(adjustment, + face_image, + handle_image, + xml_property (definition, "minposx", styles, -1), + xml_property (definition, "minposy", styles, -1), + xml_property (definition, "maxposx", styles, -1), + xml_property (definition, "maxposy", styles, -1))); + } else if (widget_type == "ADJUSTMENT") { + double min_value = xml_property (definition, "minvalue", styles, 0.0); + double max_value = xml_property (definition, "maxvalue", styles, 100.0); + double initial_value = xml_property (definition, "initialvalue", styles, min_value); + double step = xml_property (definition, "step", styles, (max_value-min_value)/100.0); + double page_increment = xml_property (definition, "pageincrement", styles, (max_value-min_value)/10); + + child = manage (new Gtk::Adjustment (initial_value, + min_value, + max_value, + step, + page_increment)); } if (child != NULL) { if (!widget_id.empty()) { named_widgets[widget_id] = child; } - set_attributes(*child, definition, styles); + if (dynamic_cast(child)) { + set_attributes(*dynamic_cast(child), definition, styles); + } } - return child; + return dynamic_cast(child); } Gtk::Widget* -WavesUI::add_widget (Gtk::Box& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets) +WavesUI::add_widget (Gtk::Box& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets) { Gtk::Widget* child = create_widget(definition, styles, named_widgets); @@ -113,7 +151,7 @@ WavesUI::add_widget (Gtk::Box& parent, const XMLNode& definition, const XMLNodeM Gtk::Widget* -WavesUI::add_widget (Gtk::ScrolledWindow& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets) +WavesUI::add_widget (Gtk::ScrolledWindow& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets) { Gtk::Widget* child = create_widget(definition, styles, named_widgets); @@ -126,7 +164,7 @@ WavesUI::add_widget (Gtk::ScrolledWindow& parent, const XMLNode& definition, con Gtk::Widget* -WavesUI::add_widget (Gtk::Window& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets) +WavesUI::add_widget (Gtk::Window& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets) { Gtk::Widget* child = create_widget(definition, styles, named_widgets); @@ -139,7 +177,7 @@ WavesUI::add_widget (Gtk::Window& parent, const XMLNode& definition, const XMLNo Gtk::Widget* -WavesUI::add_widget (Gtk::EventBox& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets) +WavesUI::add_widget (Gtk::EventBox& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets) { Gtk::Widget* child = create_widget(definition, styles, named_widgets); @@ -152,7 +190,7 @@ WavesUI::add_widget (Gtk::EventBox& parent, const XMLNode& definition, const XML Gtk::Widget* -WavesUI::add_widget (Gtk::Layout& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets) +WavesUI::add_widget (Gtk::Layout& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets) { Gtk::Widget* child = create_widget(definition, styles, named_widgets); @@ -167,7 +205,7 @@ WavesUI::add_widget (Gtk::Layout& parent, const XMLNode& definition, const XMLNo Gtk::Widget* -WavesUI::add_widget (Gtk::Container& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets) +WavesUI::add_widget (Gtk::Container& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets) { Gtk::Widget* child = NULL; if(dynamic_cast (&parent)) { @@ -199,7 +237,7 @@ WavesUI::add_widget (Gtk::Container& parent, const XMLNode& definition, const XM } void -WavesUI::create_ui (const XMLNodeList& definition, const XMLNodeMap& styles, Gtk::Container& root, std::map& named_widgets) +WavesUI::create_ui (const XMLNodeList& definition, const XMLNodeMap& styles, Gtk::Container& root, WidgetMap& named_widgets) { for (XMLNodeList::const_iterator i = definition.begin(); i != definition.end(); ++i) { WavesUI::add_widget (root, **i, styles, named_widgets); @@ -207,7 +245,7 @@ WavesUI::create_ui (const XMLNodeList& definition, const XMLNodeMap& styles, Gtk } void -WavesUI::create_ui (const XMLTree& layout, Gtk::Container& root, std::map& named_widgets) +WavesUI::create_ui (const XMLTree& layout, Gtk::Container& root, WidgetMap& named_widgets) { XMLNodeMap styles; get_styles(layout, styles); @@ -369,23 +407,34 @@ WavesUI::set_attributes (Gtk::Widget& widget, const XMLNode& definition, const X } } - -Gtk::Widget* -WavesUI::WidgetMap::get_widget(char *id) +Gtk::Object* +WavesUI::WidgetMap::get_object(const char *id) { - Gtk::Widget *child = NULL; - std::map::iterator it = find(id); + Gtk::Object* object = NULL; + WidgetMap::iterator it = find(id); if(it != end()) - child = it->second; + object = it->second; - return child; + return object; +} + +Gtk::Adjustment& +WavesUI::WidgetMap::get_adjustment(const char* id) +{ + Gtk::Adjustment* child = dynamic_cast (get_object(id)); + if (child == NULL ) { + dbg_msg (std::string("Adjustment ") + id + " not found !"); + throw std::exception(); + } + return *child; } Gtk::VBox& -WavesUI::WidgetMap::get_vbox (char* id) +WavesUI::WidgetMap::get_vbox (const char* id) { - Gtk::VBox* child = dynamic_cast (get_widget(id)); + Gtk::VBox* child = dynamic_cast (get_object(id)); if (child == NULL ) { + dbg_msg (std::string("Gtk::VBox ") + id + " not found !"); throw std::exception(); } return *child; @@ -393,10 +442,11 @@ WavesUI::WidgetMap::get_vbox (char* id) Gtk::HBox& -WavesUI::WidgetMap::get_hbox (char* id) +WavesUI::WidgetMap::get_hbox (const char* id) { - Gtk::HBox* child = dynamic_cast (get_widget(id)); + Gtk::HBox* child = dynamic_cast (get_object(id)); if (child == NULL ) { + dbg_msg (std::string("Gtk::HBox ") + id + " not found !"); throw std::exception(); } return *child; @@ -404,10 +454,11 @@ WavesUI::WidgetMap::get_hbox (char* id) Gtk::Layout& -WavesUI::WidgetMap::get_layout (char* id) +WavesUI::WidgetMap::get_layout (const char* id) { - Gtk::Layout* child = dynamic_cast (get_widget(id)); + Gtk::Layout* child = dynamic_cast (get_object(id)); if (child == NULL ) { + dbg_msg (std::string("Gtk::Layout ") + id + " not found !"); throw std::exception(); } return *child; @@ -415,10 +466,11 @@ WavesUI::WidgetMap::get_layout (char* id) Gtk::Label& -WavesUI::WidgetMap::get_label (char* id) +WavesUI::WidgetMap::get_label (const char* id) { - Gtk::Label* child = dynamic_cast (get_widget(id)); + Gtk::Label* child = dynamic_cast (get_object(id)); if (child == NULL ) { + dbg_msg (std::string("Gtk::Label ") + id + " not found !"); throw std::exception(); } return *child; @@ -426,10 +478,11 @@ WavesUI::WidgetMap::get_label (char* id) Gtk::ComboBoxText& -WavesUI::WidgetMap::get_combo_box_text (char* id) +WavesUI::WidgetMap::get_combo_box_text (const char* id) { - Gtk::ComboBoxText* child = dynamic_cast (get_widget(id)); + Gtk::ComboBoxText* child = dynamic_cast (get_object(id)); if (child == NULL ) { + dbg_msg (std::string("Gtk::ComboBoxText ") + id + " not found !"); throw std::exception(); } return *child; @@ -437,10 +490,22 @@ WavesUI::WidgetMap::get_combo_box_text (char* id) WavesButton& -WavesUI::WidgetMap::get_waves_button (char* id) +WavesUI::WidgetMap::get_waves_button (const char* id) { - WavesButton* child = dynamic_cast (get_widget(id)); + WavesButton* child = dynamic_cast (get_object(id)); if (child == NULL ) { + dbg_msg (std::string("WavesButton ") + id + " not found !"); + throw std::exception(); + } + return *child; +} + +Gtkmm2ext::Fader& +WavesUI::WidgetMap::get_fader (const char* id) +{ + Gtkmm2ext::Fader* child = dynamic_cast (get_object(id)); + if (child == NULL ) { + dbg_msg (std::string("Gtkmm2ext::Fader ") + id + " not found !"); throw std::exception(); } return *child; diff --git a/gtk2_ardour/waves_ui.h b/gtk2_ardour/waves_ui.h index b3d1c73ca6..726f2fdd77 100644 --- a/gtk2_ardour/waves_ui.h +++ b/gtk2_ardour/waves_ui.h @@ -23,11 +23,13 @@ #include #include #include +#include #include #include #include #include #include +#include "gtkmm2ext/fader.h" #include "canvas/canvas.h" #include "canvas/xml_ui.h" #include "waves_button.h" @@ -36,30 +38,32 @@ using namespace ArdourCanvas::XMLUI; namespace WavesUI { - class WidgetMap : public std::map + class WidgetMap : public std::map { public: - Gtk::VBox& get_vbox (char* id); - Gtk::HBox& get_hbox (char* id); - Gtk::Layout& get_layout (char* id); - Gtk::Label& get_label (char* id); - Gtk::Image& get_image (char* id); - Gtk::ComboBoxText& get_combo_box_text (char* id); - WavesButton& get_waves_button (char* id); + Gtk::Adjustment& get_adjustment (const char* id); + Gtk::VBox& get_vbox (const char* id); + Gtk::HBox& get_hbox (const char* id); + Gtk::Layout& get_layout (const char* id); + Gtk::Label& get_label (const char* id); + Gtk::Image& get_image (const char* id); + Gtk::ComboBoxText& get_combo_box_text (const char* id); + WavesButton& get_waves_button (const char* id); + Gtkmm2ext::Fader& get_fader (const char* id); private: - Gtk::Widget* get_widget(char *id); + Gtk::Object* get_object(const char *id); }; const XMLTree* load_layout (const std::string xml_file_name); - void create_ui (const XMLTree& layout, Gtk::Container& root, std::map& named_widgets); - void create_ui (const XMLNodeList& definition, const XMLNodeMap& styles, Gtk::Container& root, std::map& named_widgets); - Gtk::Widget* create_widget (const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets); - Gtk::Widget* add_widget (Gtk::Box& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets); - Gtk::Widget* add_widget (Gtk::ScrolledWindow& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets); - Gtk::Widget* add_widget (Gtk::Window& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets); - Gtk::Widget* add_widget (Gtk::Layout& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets); - Gtk::Widget* add_widget (Gtk::Container& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets); - Gtk::Widget* add_widget (Gtk::EventBox& parent, const XMLNode& definition, const XMLNodeMap& styles, std::map& named_widgets); + void create_ui (const XMLTree& layout, Gtk::Container& root, WidgetMap& named_widgets); + void create_ui (const XMLNodeList& definition, const XMLNodeMap& styles, Gtk::Container& root, WidgetMap& named_widgets); + Gtk::Widget* create_widget (const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets); + Gtk::Widget* add_widget (Gtk::Box& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets); + Gtk::Widget* add_widget (Gtk::ScrolledWindow& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets); + Gtk::Widget* add_widget (Gtk::Window& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets); + Gtk::Widget* add_widget (Gtk::Layout& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets); + Gtk::Widget* add_widget (Gtk::Container& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets); + Gtk::Widget* add_widget (Gtk::EventBox& parent, const XMLNode& definition, const XMLNodeMap& styles, WidgetMap& named_widgets); void set_attributes (Gtk::Widget& widget, const XMLNode& definition, const XMLNodeMap& styles); } diff --git a/libs/gtkmm2ext/wscript b/libs/gtkmm2ext/wscript index 6d9f1edbe8..99e6a54662 100644 --- a/libs/gtkmm2ext/wscript +++ b/libs/gtkmm2ext/wscript @@ -38,6 +38,7 @@ gtkmm2ext_sources = [ 'click_box.cc', 'debug.cc', 'dndtreeview.cc', + 'fader.cc', 'fastmeter.cc', 'focus_entry.cc', 'grouped_buttons.cc', @@ -99,7 +100,7 @@ def build(bld): obj.name = 'libgtkmm2ext' obj.target = 'gtkmm2ext' obj.uselib = 'GTKMM GTK GTKOSX OSX GDK' - obj.use = [ 'libpbd' ] + obj.use = [ 'libpbd', 'libardour'] obj.vnum = GTKMM2EXT_LIB_VERSION obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3') obj.defines += [