[gst-debugger] gst-debugger: add control modules



commit 8e4c87987d1ceba7c164a6687d06cdc23fa0378c
Author: Marcin Kolny <marcin kolny gmail com>
Date:   Tue Sep 1 12:17:58 2015 +0200

    gst-debugger: add control modules
    
    Control modules are used for control main module

 src/gst-debugger/Makefile.am                       |   32 ++-
 src/gst-debugger/modules/control_module.h          |   67 +++++
 src/gst-debugger/modules/main_module.cpp           |   36 ++-
 src/gst-debugger/modules/main_module.h             |   12 +-
 .../modules/pad_path_control_module.cpp            |   57 ++++
 src/gst-debugger/modules/pad_path_control_module.h |   33 +++
 .../modules/pad_path_types_control_module.h        |   46 ++++
 src/gst-debugger/modules/types_control_module.cpp  |   86 ++++++
 src/gst-debugger/modules/types_control_module.h    |   39 +++
 src/gst-debugger/ui/gst-debugger.glade             |  273 ++++++++++---------
 10 files changed, 524 insertions(+), 157 deletions(-)
---
diff --git a/src/gst-debugger/Makefile.am b/src/gst-debugger/Makefile.am
index 2be8d18..3276dc5 100644
--- a/src/gst-debugger/Makefile.am
+++ b/src/gst-debugger/Makefile.am
@@ -16,9 +16,6 @@ bin_PROGRAMS = gst-debugger- GST_API_VERSION@
 
 gst_debugger_headers =                                 \
        common_model_columns.h                          \
-       gst-debugger-resources.h                        \
-       main_window.h                                   \
-       ui_utils.h                                      \
        controller/base_controller.h                    \
        controller/command_factory.h                    \
        controller/connection_controller.h              \
@@ -33,31 +30,34 @@ gst_debugger_headers =                                      \
        dialogs/factories_dialog.h                      \
        dialogs/remote_data_dialog.h                    \
        graphviz-plugin/graphviz-gstdebugger.h          \
+       gst-debugger-resources.h                        \
        gvalue-converter/gvalue_base.h                  \
        gvalue-converter/gvalue_boolean.h               \
        gvalue-converter/gvalue_caps.h                  \
        gvalue-converter/gvalue_enum.h                  \
        gvalue-converter/gvalue_numeric.h               \
        gvalue-converter/gvalue_string.h                \
+       main_window.h                                   \
        models/gst_enum_model.h                         \
        models/gst_factory_model.h                      \
        models/gst_pipeline_model.h                     \
        models/remote_data_container.h                  \
        modules/base_main_module.h                      \
-       modules/log_module.h                            \
        modules/bus_messages_module.h                   \
+       modules/control_module.h                        \
        modules/gst_log_module.h                        \
        modules/gst_properties_module.h                 \
+       modules/log_module.h                            \
        modules/main_module.h                           \
+       modules/pad_path_control_module.h               \
+       modules/pad_path_types_control_module.h         \
+       modules/types_control_modules.h                 \
        pipeline-drawer/graph_module.h                  \
-       pipeline-drawer/gst_bin_to_dot_converter.h
+       pipeline-drawer/gst_bin_to_dot_converter.h      \
+       ui_utils.h                                      
 
 
 gst_debugger_ GST_API_VERSION@_SOURCES =               \
-       gst-debugger-resources.c                        \
-       main.cpp                                        \
-       main_window.cpp                                 \
-       ui_utils.cpp                                    \
        controller/command_factory.cpp                  \
        controller/controller.cpp                       \
        controller/tcp_client.cpp                       \
@@ -68,23 +68,29 @@ gst_debugger_ GST_API_VERSION@_SOURCES =            \
        dialogs/factories_dialog.cpp                    \
        graphviz-plugin/gvdevice_gstdebugger.c          \
        graphviz-plugin/gvplugin_gstdebugger.c          \
+       gst-debugger-resources.c                        \
        gvalue-converter/gvalue_base.cpp                \
        gvalue-converter/gvalue_boolean.cpp             \
        gvalue-converter/gvalue_caps.cpp                \
        gvalue-converter/gvalue_enum.cpp                \
        gvalue-converter/gvalue_numeric.cpp             \
        gvalue-converter/gvalue_string.cpp              \
+       main.cpp                                        \
+       main_window.cpp                                 \
        models/gst_factory_model.cpp                    \
        models/gst_pipeline_model.cpp                   \
-       modules/main_module.cpp                         \
-       modules/log_module.cpp                          \
-       modules/bus_messages_module.cpp                 \
        modules/base_main_module.cpp                    \
-       modules/pad_data_modules.cpp                    \
+       modules/bus_messages_module.cpp                 \
        modules/gst_log_module.cpp                      \
        modules/gst_properties_module.cpp               \
+       modules/log_module.cpp                          \
+       modules/main_module.cpp                         \
+       modules/pad_data_modules.cpp                    \
+       modules/pad_path_control_module.cpp             \
+       modules/types_control_module.cpp                \
        pipeline-drawer/graph_module.cpp                \
        pipeline-drawer/gst_bin_to_dot_converter.cpp    \
+       ui_utils.cpp                                    \
        $(gst_debugger_headers)
 
 gst_debugger_ GST_API_VERSION@_LDFLAGS = $(GTKMM_LIBS) $(GSTMM_LIBS) $(GVC_LIBS) $(PROTOBUF_LIBS) -lX11
diff --git a/src/gst-debugger/modules/control_module.h b/src/gst-debugger/modules/control_module.h
new file mode 100644
index 0000000..db3a7e9
--- /dev/null
+++ b/src/gst-debugger/modules/control_module.h
@@ -0,0 +1,67 @@
+/*
+ * control_module.h
+ *
+ *  Created on: Aug 31, 2015
+ *      Author: loganek
+ */
+
+#ifndef SRC_GST_DEBUGGER_MODULES_CONTROL_MODULE_H_
+#define SRC_GST_DEBUGGER_MODULES_CONTROL_MODULE_H_
+
+#include "controller/iview.h"
+
+#include "common_model_columns.h"
+
+#include <gtkmm/widget.h>
+
+class ControlModule : public IBaseView
+{
+public:
+       virtual ~ControlModule() {};
+
+       virtual Gtk::Widget* get_widget() = 0;
+};
+
+class HooksControlModule : public ControlModule
+{
+protected:
+       Gtk::Box *main_box = nullptr;
+       Gtk::Button *add_hook_button;
+
+       void append_hook_widgets()
+       {
+               add_hook_button = Gtk::manage(new Gtk::Button("Add hook"));
+               main_box->pack_start(*add_hook_button, false, true);
+               main_box->pack_start(*Gtk::manage(new Gtk::Label("Existing hooks:")));
+               Gtk::ScrolledWindow *wnd = Gtk::manage(new Gtk::ScrolledWindow);
+               wnd->add(*Gtk::manage(new Gtk::TreeView()));
+               main_box->pack_start(*wnd, true, true);
+               main_box->pack_start(*Gtk::manage(new Gtk::Button("Remove selected hook")), false, true);
+
+               update_add_hook();
+       }
+
+       virtual bool add_hook_unlocked() { return true; }
+
+       void update_add_hook()
+       {
+               add_hook_button->set_sensitive(add_hook_unlocked());
+       }
+
+public:
+       HooksControlModule()
+       {
+               main_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); // todo possible memleak
+
+               append_hook_widgets();
+       }
+
+       virtual ~HooksControlModule() {}
+
+       Gtk::Widget* get_widget() override
+       {
+               return main_box;
+       }
+};
+
+#endif /* SRC_GST_DEBUGGER_MODULES_CONTROL_MODULE_H_ */
diff --git a/src/gst-debugger/modules/main_module.cpp b/src/gst-debugger/modules/main_module.cpp
index 23de899..cb1ae19 100644
--- a/src/gst-debugger/modules/main_module.cpp
+++ b/src/gst-debugger/modules/main_module.cpp
@@ -9,6 +9,8 @@
 
 #include "pad_data_modules.h"
 #include "log_module.h"
+#include "bus_messages_module.h"
+#include "pad_path_types_control_module.h"
 
 #include "controller/controller.h"
 #include "controller/element_path_processor.h"
@@ -32,6 +34,7 @@ MainModule::MainModule(const Glib::RefPtr<Gtk::Builder> &builder)
        builder->get_widget("hookTypeBox", hook_type_box);
        builder->get_widget("hookAnyPathCheckButton", any_path_check_button);
        builder->get_widget("hookAnyTypeCheckButton", any_type_check_button);
+       builder->get_widget("controllerFrame", controller_frame);
 
        create_dispatcher("selected-object", sigc::mem_fun(*this, &MainModule::selected_object_changed), 
nullptr);
 
@@ -40,11 +43,20 @@ MainModule::MainModule(const Glib::RefPtr<Gtk::Builder> &builder)
 
 void MainModule::load_submodules(const Glib::RefPtr<Gtk::Builder>& builder)
 {
-       submodules["logMessages"].module = std::make_shared<LogModule>();
-       submodules["queries"].module = std::make_shared<QueryModule>();
-       //main_modules["busMessages"].module = std::make_shared<GstMessageModule>();
-       submodules["buffers"].module = std::make_shared<BufferModule>();
-       submodules["events"].module = std::make_shared<EventModule>();
+       submodules["logMessages"].display_module = std::make_shared<LogModule>();
+       submodules["logMessages"].control_module = std::make_shared<HooksControlModule>();
+
+       submodules["queries"].display_module = std::make_shared<QueryModule>();
+       submodules["queries"].control_module = std::make_shared<PadPathTypesControlModule>("GstQueryType");
+
+       submodules["busMessages"].display_module = std::make_shared<BusMessagesModule>();
+       submodules["busMessages"].control_module = std::make_shared<TypesControlModule>("GstMessageType");
+
+       submodules["buffers"].display_module = std::make_shared<BufferModule>();
+       submodules["buffers"].control_module = std::make_shared<PadPathControlModule>();
+
+       submodules["events"].display_module = std::make_shared<EventModule>();
+       submodules["events"].control_module = std::make_shared<PadPathTypesControlModule>("GstEventType");
 
        for (auto m : submodules)
        {
@@ -52,7 +64,7 @@ void MainModule::load_submodules(const Glib::RefPtr<Gtk::Builder>& builder)
                m.second.switch_button->signal_toggled().connect([this, m] {
                        if (m.second.switch_button->get_active())
                        {
-                               update_module(m.second.module);
+                               update_module(m.second);
                        }
                });
        }
@@ -66,7 +78,8 @@ void MainModule::set_controller(const std::shared_ptr<Controller> &controller)
 
        for (auto m : submodules)
        {
-               m.second.module->set_controller(controller);
+               m.second.display_module->set_controller(controller);
+               m.second.control_module->set_controller(controller);
        }
 }
 
@@ -76,10 +89,13 @@ void MainModule::selected_object_changed()
        pad_path_label->set_text(selected_pad ? ElementPathProcessor::get_object_path(selected_pad) : 
"(none)");
 }
 
-void MainModule::update_module(const std::shared_ptr<BaseMainModule> &module)
+void MainModule::update_module(const MainModuleInfo &module_info)
 {
-       module->configure_main_list_view(list_tree_view);
-       current_module = module;
+       module_info.display_module->configure_main_list_view(list_tree_view);
+       current_module = module_info.display_module;
+       controller_frame->remove();
+       controller_frame->add(*(module_info.control_module->get_widget()));
+       controller_frame->show_all();
 }
 
 void MainModule::mainListTreeView_row_activated_cb(const Gtk::TreeModel::Path &path, Gtk::TreeViewColumn 
*column)
diff --git a/src/gst-debugger/modules/main_module.h b/src/gst-debugger/modules/main_module.h
index 60f1cdc..41e2c57 100644
--- a/src/gst-debugger/modules/main_module.h
+++ b/src/gst-debugger/modules/main_module.h
@@ -8,9 +8,10 @@
 #ifndef SRC_GST_DEBUGGER_MODULES_MAIN_MODULE_H_
 #define SRC_GST_DEBUGGER_MODULES_MAIN_MODULE_H_
 
-#include "controller/iview.h"
-
 #include "base_main_module.h"
+#include "control_module.h"
+
+#include "controller/iview.h"
 
 #include <gtkmm.h>
 
@@ -18,7 +19,8 @@ class MainModule : public IBaseView
 {
        struct MainModuleInfo
        {
-               std::shared_ptr<BaseMainModule> module;
+               std::shared_ptr<BaseMainModule> display_module;
+               std::shared_ptr<ControlModule> control_module;
                Gtk::RadioToolButton *switch_button;
        };
 
@@ -32,6 +34,7 @@ class MainModule : public IBaseView
        Gtk::TreeView *existing_hooks_tree_view;
        Gtk::Label *pad_path_label;
        Gtk::Box *hook_type_box;
+       Gtk::Frame *controller_frame;
 
        TypesModelColumns types_columns;
 
@@ -41,6 +44,7 @@ class MainModule : public IBaseView
 
        void selected_object_changed();
        void load_submodules(const Glib::RefPtr<Gtk::Builder>& builder);
+       void update_module(const MainModuleInfo &module_info);
 
        void mainListTreeView_row_activated_cb(const Gtk::TreeModel::Path &path, Gtk::TreeViewColumn *column);
        void mainDetailsTreeView_row_activated_cb(const Gtk::TreeModel::Path &path, Gtk::TreeViewColumn 
*column);
@@ -49,8 +53,6 @@ public:
        MainModule(const Glib::RefPtr<Gtk::Builder>& builder);
 
        void set_controller(const std::shared_ptr<Controller> &controller) override;
-
-       void update_module(const std::shared_ptr<BaseMainModule> &module);
 };
 
 #endif /* SRC_GST_DEBUGGER_MODULES_MAIN_MODULE_H_ */
diff --git a/src/gst-debugger/modules/pad_path_control_module.cpp 
b/src/gst-debugger/modules/pad_path_control_module.cpp
new file mode 100644
index 0000000..49fd4f9
--- /dev/null
+++ b/src/gst-debugger/modules/pad_path_control_module.cpp
@@ -0,0 +1,57 @@
+/*
+ * pad_path_control_module.cpp
+ *
+ *  Created on: Sep 1, 2015
+ *      Author: loganek
+ */
+
+#include "pad_path_control_module.h"
+
+#include "controller/controller.h"
+
+void PadPathControlModule::append_pad_path_widgets()
+{
+       Gtk::Box *path_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL));
+       path_box->pack_start(*Gtk::manage(new Gtk::Label("Pad path")));
+
+       any_path_check_button = Gtk::manage(new Gtk::CheckButton("any path"));
+       any_path_check_button->signal_clicked().connect([this] { update_add_hook(); });
+
+       path_box->pack_start(*any_path_check_button);
+       main_box->pack_start(*path_box);
+       main_box->pack_start(*Gtk::manage(new Gtk::Label("none")));
+}
+
+bool PadPathControlModule::add_hook_unlocked()
+{
+       return any_path_check_button->get_active() ||
+                       (controller && std::dynamic_pointer_cast<PadModel>(controller->get_selected_object()) 
!= nullptr);
+}
+
+void PadPathControlModule::selected_object_changed_()
+{
+       update_add_hook();
+}
+
+PadPathControlModule::PadPathControlModule()
+{
+       main_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); // todo possibly memleak
+
+       append_pad_path_widgets();
+       append_hook_widgets();
+
+       create_dispatcher("selected-object", sigc::mem_fun(*this, 
&PadPathControlModule::selected_object_changed_), nullptr);
+}
+
+Gtk::Widget* PadPathControlModule::get_widget()
+{
+       return main_box;
+}
+
+void PadPathControlModule::set_controller(const std::shared_ptr<Controller> &controller)
+{
+       IBaseView::set_controller(controller);
+       controller->on_selected_object_changed.connect([this](){
+               gui_emit("selected-object");
+       });
+}
diff --git a/src/gst-debugger/modules/pad_path_control_module.h 
b/src/gst-debugger/modules/pad_path_control_module.h
new file mode 100644
index 0000000..a84e6c2
--- /dev/null
+++ b/src/gst-debugger/modules/pad_path_control_module.h
@@ -0,0 +1,33 @@
+/*
+ * pad_path_control_module.h
+ *
+ *  Created on: Sep 1, 2015
+ *      Author: loganek
+ */
+
+#ifndef SRC_GST_DEBUGGER_MODULES_PAD_PATH_CONTROL_MODULE_H_
+#define SRC_GST_DEBUGGER_MODULES_PAD_PATH_CONTROL_MODULE_H_
+
+#include "control_module.h"
+
+class PadPathControlModule : virtual public HooksControlModule
+{
+protected:
+       Gtk::CheckButton *any_path_check_button;
+
+       void append_pad_path_widgets();
+
+       void selected_object_changed_();
+
+       bool add_hook_unlocked() override;
+
+public:
+       PadPathControlModule();
+       virtual ~PadPathControlModule() {}
+
+       Gtk::Widget* get_widget() override;
+
+       void set_controller(const std::shared_ptr<Controller> &controller) override;
+};
+
+#endif /* SRC_GST_DEBUGGER_MODULES_PAD_PATH_CONTROL_MODULE_H_ */
diff --git a/src/gst-debugger/modules/pad_path_types_control_module.h 
b/src/gst-debugger/modules/pad_path_types_control_module.h
new file mode 100644
index 0000000..b490231
--- /dev/null
+++ b/src/gst-debugger/modules/pad_path_types_control_module.h
@@ -0,0 +1,46 @@
+/*
+ * pad_path_types_control_module.h
+ *
+ *  Created on: Sep 1, 2015
+ *      Author: loganek
+ */
+
+#ifndef SRC_GST_DEBUGGER_MODULES_PAD_PATH_TYPES_CONTROL_MODULE_H_
+#define SRC_GST_DEBUGGER_MODULES_PAD_PATH_TYPES_CONTROL_MODULE_H_
+
+#include "pad_path_control_module.h"
+#include "types_control_module.h"
+
+class PadPathTypesControlModule : public PadPathControlModule, public TypesControlModule
+{
+       bool add_hook_unlocked() override
+       {
+               return PadPathControlModule::add_hook_unlocked() && TypesControlModule::add_hook_unlocked();
+       }
+
+public:
+       PadPathTypesControlModule(const std::string &type_name)
+       : TypesControlModule(type_name)
+       {
+               main_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); // todo possibly memleak
+
+               append_types_widgets();
+               append_pad_path_widgets();
+               append_hook_widgets();
+       }
+
+       virtual ~PadPathTypesControlModule () {}
+
+       Gtk::Widget* get_widget() override
+       {
+               return main_box;
+       }
+
+       void set_controller(const std::shared_ptr<Controller> &controller) override
+       {
+               PadPathControlModule::set_controller(controller);
+               TypesControlModule::set_controller(controller);
+       }
+};
+
+#endif /* SRC_GST_DEBUGGER_MODULES_PAD_PATH_TYPES_CONTROL_MODULE_H_ */
diff --git a/src/gst-debugger/modules/types_control_module.cpp 
b/src/gst-debugger/modules/types_control_module.cpp
new file mode 100644
index 0000000..1ba0ead
--- /dev/null
+++ b/src/gst-debugger/modules/types_control_module.cpp
@@ -0,0 +1,86 @@
+/*
+ * types_control_module.cpp
+ *
+ *  Created on: Sep 1, 2015
+ *      Author: loganek
+ */
+
+#include "types_control_module.h"
+
+#include "controller/controller.h"
+
+void TypesControlModule::append_types_widgets()
+{
+       Gtk::Box *type_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL));
+       any_type_check_button = Gtk::manage(new Gtk::CheckButton("any event"));
+       any_type_check_button->signal_clicked().connect([this] { update_add_hook(); });
+
+       type_box->pack_start(*any_type_check_button);
+       main_box->pack_start(*type_box);
+
+       types_combobox = Gtk::manage(new Gtk::ComboBox());
+       main_box->pack_start(*Gtk::manage(types_combobox), false, true);
+       types_model = Gtk::ListStore::create(types_model_columns);
+       types_combobox->set_model(types_model);
+       types_combobox->pack_start(types_model_columns.type_name);
+
+}
+
+bool TypesControlModule::add_hook_unlocked()
+{
+       return any_type_check_button->get_active() ||
+                       !!types_combobox->get_active();
+}
+
+TypesControlModule::TypesControlModule(const std::string &enum_type_name)
+: type_name(enum_type_name)
+{
+       create_dispatcher("enum", sigc::mem_fun(*this, &TypesControlModule::enum_list_changed_), nullptr); // 
todo memleak
+
+       main_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL)); // todo possibly memleak
+
+       append_types_widgets();
+       append_hook_widgets();
+}
+
+Gtk::Widget* TypesControlModule::get_widget()
+{
+       return main_box;
+}
+
+void TypesControlModule::set_controller(const std::shared_ptr<Controller> &controller)
+{
+       IBaseView::set_controller(controller);
+       controller->on_enum_list_changed.connect([this](const Glib::ustring &enum_name, bool add){
+               if (enum_name != type_name)
+                       return;
+
+               gui_push("enum", new std::string(enum_name));
+               gui_push("enum", new bool(add));
+               gui_emit("enum");
+       });
+}
+
+void TypesControlModule::enum_list_changed_()
+{
+       types_model->clear();
+       std::string* type_name = gui_pop<std::string*>("enum");
+       bool *add = gui_pop<bool*>("enum");
+
+       if (*add)
+       {
+               GstEnumType type = 
const_cast<RemoteDataContainer<GstEnumType>&>(controller->get_enum_container()).get_item(*type_name);
+               for (auto val : type.get_values())
+               {
+                       Gtk::TreeModel::Row row = *(types_model->append());
+                       row[types_model_columns.type_id] = val.first;
+                       row[types_model_columns.type_name] = val.second.nick;
+               }
+               if (types_model->children().size() > 0)
+               {
+                       types_combobox->set_active(0);
+               }
+       }
+       delete add;
+       delete type_name;
+}
diff --git a/src/gst-debugger/modules/types_control_module.h b/src/gst-debugger/modules/types_control_module.h
new file mode 100644
index 0000000..0565dae
--- /dev/null
+++ b/src/gst-debugger/modules/types_control_module.h
@@ -0,0 +1,39 @@
+/*
+ * types_control_module.h
+ *
+ *  Created on: Sep 1, 2015
+ *      Author: loganek
+ */
+
+#ifndef SRC_GST_DEBUGGER_MODULES_TYPES_CONTROL_MODULE_H_
+#define SRC_GST_DEBUGGER_MODULES_TYPES_CONTROL_MODULE_H_
+
+#include "control_module.h"
+
+class TypesControlModule : virtual public HooksControlModule
+{
+protected:
+       TypesModelColumns types_model_columns;
+       Glib::RefPtr<Gtk::ListStore> types_model;
+       std::string type_name;
+
+       Gtk::CheckButton *any_type_check_button;
+       Gtk::ComboBox *types_combobox;
+
+       void append_types_widgets();
+
+       void enum_list_changed_();
+
+       bool add_hook_unlocked() override;
+
+public:
+       TypesControlModule(const std::string &enum_type_name);
+       virtual ~TypesControlModule() {}
+
+       Gtk::Widget* get_widget() override;
+
+       void set_controller(const std::shared_ptr<Controller> &controller) override;
+
+};
+
+#endif /* SRC_GST_DEBUGGER_MODULES_TYPES_CONTROL_MODULE_H_ */
diff --git a/src/gst-debugger/ui/gst-debugger.glade b/src/gst-debugger/ui/gst-debugger.glade
index e9e3ec1..d639493 100644
--- a/src/gst-debugger/ui/gst-debugger.glade
+++ b/src/gst-debugger/ui/gst-debugger.glade
@@ -277,19 +277,48 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkBox" id="box22">
+                      <object class="GtkFrame" id="controllerFrame">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="orientation">vertical</property>
+                        <property name="label_xalign">0</property>
+                        <property name="shadow_type">none</property>
                         <child>
-                          <object class="GtkBox" id="hookTypeBox">
+                          <object class="GtkBox" id="box22">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
+                            <property name="orientation">vertical</property>
                             <child>
-                              <object class="GtkLabel" id="label18">
+                              <object class="GtkBox" id="hookTypeBox">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">Event type:</property>
+                                <child>
+                                  <object class="GtkLabel" id="label18">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="label" translatable="yes">Event type:</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkCheckButton" id="hookAnyTypeCheckButton">
+                                    <property name="label" translatable="yes">any event</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">False</property>
+                                    <property name="xalign">0</property>
+                                    <property name="draw_indicator">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="pack_type">end</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
@@ -298,149 +327,135 @@
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkCheckButton" id="hookAnyTypeCheckButton">
-                                <property name="label" translatable="yes">any event</property>
+                              <object class="GtkComboBox" id="hookTypesComboBox">
                                 <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
+                                <property name="can_focus">False</property>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
                                 <property name="fill">True</property>
-                                <property name="pack_type">end</property>
                                 <property name="position">1</property>
                               </packing>
                             </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkComboBox" id="hookTypesComboBox">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkBox" id="box24">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
                             <child>
-                              <object class="GtkLabel" id="label22">
+                              <object class="GtkBox" id="box24">
                                 <property name="visible">True</property>
                                 <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">Path:</property>
+                                <child>
+                                  <object class="GtkLabel" id="label22">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="label" translatable="yes">Path:</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkCheckButton" id="hookAnyPathCheckButton">
+                                    <property name="label" translatable="yes">any path</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">False</property>
+                                    <property name="xalign">0</property>
+                                    <property name="draw_indicator">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">True</property>
+                                    <property name="pack_type">end</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
                                 <property name="fill">True</property>
-                                <property name="position">0</property>
+                                <property name="position">2</property>
                               </packing>
                             </child>
                             <child>
-                              <object class="GtkCheckButton" id="hookAnyPathCheckButton">
-                                <property name="label" translatable="yes">any path</property>
+                              <object class="GtkLabel" id="hookPadPathLabel">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="halign">start</property>
+                                <property name="label" translatable="yes">(none)</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">3</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkButton" id="addNewHookButton">
+                                <property name="label" translatable="yes">Add hook</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="receives_default">False</property>
-                                <property name="xalign">0</property>
-                                <property name="draw_indicator">True</property>
+                                <property name="receives_default">True</property>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
                                 <property name="fill">True</property>
-                                <property name="pack_type">end</property>
-                                <property name="position">1</property>
+                                <property name="position">4</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkLabel" id="label23">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="label" translatable="yes">Existing hooks:</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">5</property>
                               </packing>
                             </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">2</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkLabel" id="hookPadPathLabel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="halign">start</property>
-                            <property name="label" translatable="yes">(none)</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">3</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkButton" id="addNewHookButton">
-                            <property name="label" translatable="yes">Add hook</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">4</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkLabel" id="label23">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="label" translatable="yes">Existing hooks:</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">5</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkScrolledWindow" id="scrolledwindow16">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="shadow_type">in</property>
                             <child>
-                              <object class="GtkTreeView" id="existingHooksTreeView">
+                              <object class="GtkScrolledWindow" id="scrolledwindow16">
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <child internal-child="selection">
-                                  <object class="GtkTreeSelection" id="treeview-selection22"/>
+                                <property name="shadow_type">in</property>
+                                <child>
+                                  <object class="GtkTreeView" id="existingHooksTreeView">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <child internal-child="selection">
+                                      <object class="GtkTreeSelection" id="treeview-selection2"/>
+                                    </child>
+                                  </object>
                                 </child>
                               </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">6</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkButton" id="removeSelectedHook">
+                                <property name="label" translatable="yes">Remove selected</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">True</property>
+                                <property name="position">7</property>
+                              </packing>
                             </child>
                           </object>
-                          <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">6</property>
-                          </packing>
                         </child>
-                        <child>
-                          <object class="GtkButton" id="removeSelectedHook">
-                            <property name="label" translatable="yes">Remove selected</property>
+                        <child type="label">
+                          <object class="GtkLabel" id="label1">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="label" translatable="yes">Controller</property>
                           </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">7</property>
-                          </packing>
                         </child>
                       </object>
                       <packing>
@@ -747,23 +762,6 @@
           </packing>
         </child>
         <child>
-          <object class="GtkStatusbar" id="mainStatusbar">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="margin_start">10</property>
-            <property name="margin_end">10</property>
-            <property name="margin_top">6</property>
-            <property name="margin_bottom">6</property>
-            <property name="orientation">vertical</property>
-            <property name="spacing">2</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">3</property>
-          </packing>
-        </child>
-        <child>
           <object class="GtkBox" id="box20">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
@@ -834,6 +832,23 @@
           <packing>
             <property name="expand">False</property>
             <property name="fill">True</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkStatusbar" id="mainStatusbar">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="margin_start">10</property>
+            <property name="margin_end">10</property>
+            <property name="margin_top">6</property>
+            <property name="margin_bottom">6</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">2</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
             <property name="position">4</property>
           </packing>
         </child>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]