summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-03-17 06:32:50 +0000
committerDavid Robillard <d@drobilla.net>2011-03-17 06:32:50 +0000
commit08a6a9058d114a3208f5304799e2c84576e52f90 (patch)
tree87d103383c852535c63105d89fa27d906779f313 /src
parent69191cb00b87c5fda9e65d592a3b73ce80da9b0e (diff)
downloadingen-08a6a9058d114a3208f5304799e2c84576e52f90.tar.gz
ingen-08a6a9058d114a3208f5304799e2c84576e52f90.tar.bz2
ingen-08a6a9058d114a3208f5304799e2c84576e52f90.zip
Show plugin/port documentation in side pane when selected.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@3103 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src')
-rw-r--r--src/client/PluginModel.cpp53
-rw-r--r--src/client/PluginModel.hpp3
-rw-r--r--src/gui/NodeModule.cpp15
-rw-r--r--src/gui/PatchCanvas.cpp12
-rw-r--r--src/gui/PatchCanvas.hpp1
-rw-r--r--src/gui/PatchWindow.cpp1
-rw-r--r--src/gui/PatchWindow.hpp4
-rw-r--r--src/gui/Port.cpp24
-rw-r--r--src/gui/Port.hpp2
-rw-r--r--src/gui/WindowFactory.cpp10
-rw-r--r--src/gui/WindowFactory.hpp1
-rw-r--r--src/gui/ingen_gui.glade39
12 files changed, 157 insertions, 8 deletions
diff --git a/src/client/PluginModel.cpp b/src/client/PluginModel.cpp
index 8e826368..aa8e2e1d 100644
--- a/src/client/PluginModel.cpp
+++ b/src/client/PluginModel.cpp
@@ -243,6 +243,59 @@ PluginModel::get_lv2_icon_path(SLV2Plugin plugin)
}
#endif
+std::string
+PluginModel::documentation() const
+{
+ std::string doc;
+ #ifdef HAVE_SLV2
+ if (!_slv2_plugin)
+ return doc;
+
+ //SLV2Value lv2_documentation = slv2_value_new_uri(
+ // _slv2_world, SLV2_NAMESPACE_LV2 "documentation");
+ SLV2Value rdfs_comment = slv2_value_new_uri(
+ _slv2_world, "http://www.w3.org/2000/01/rdf-schema#comment");
+
+ SLV2Values vals = slv2_plugin_get_value(_slv2_plugin,
+ rdfs_comment);
+ SLV2Value val = slv2_values_get_first(vals);
+ if (slv2_value_is_string(val)) {
+ doc += slv2_value_as_string(val);
+ }
+ slv2_value_free(rdfs_comment);
+ slv2_values_free(vals);
+ #endif
+ return doc;
+}
+
+std::string
+PluginModel::port_documentation(uint32_t index) const
+{
+ std::string doc;
+ #ifdef HAVE_SLV2
+ if (!_slv2_plugin)
+ return doc;
+
+ SLV2Port port = slv2_plugin_get_port_by_index(_slv2_plugin, index);
+
+ //SLV2Value lv2_documentation = slv2_value_new_uri(
+ // _slv2_world, SLV2_NAMESPACE_LV2 "documentation");
+ SLV2Value rdfs_comment = slv2_value_new_uri(
+ _slv2_world, "http://www.w3.org/2000/01/rdf-schema#comment");
+
+ SLV2Values vals = slv2_port_get_value(_slv2_plugin,
+ port,
+ rdfs_comment);
+ SLV2Value val = slv2_values_get_first(vals);
+ if (slv2_value_is_string(val)) {
+ doc += slv2_value_as_string(val);
+ }
+ slv2_value_free(rdfs_comment);
+ slv2_values_free(vals);
+ #endif
+ return doc;
+}
+
} // namespace Client
} // namespace Ingen
diff --git a/src/client/PluginModel.hpp b/src/client/PluginModel.hpp
index 3f647a7c..006c53d9 100644
--- a/src/client/PluginModel.hpp
+++ b/src/client/PluginModel.hpp
@@ -86,6 +86,9 @@ public:
static std::string get_lv2_icon_path(SLV2Plugin plugin);
#endif
+ std::string documentation() const;
+ std::string port_documentation(uint32_t index) const;
+
static void set_rdf_world(Sord::World& world) {
_rdf_world = &world;
}
diff --git a/src/gui/NodeModule.cpp b/src/gui/NodeModule.cpp
index ea4c8079..d7523083 100644
--- a/src/gui/NodeModule.cpp
+++ b/src/gui/NodeModule.cpp
@@ -439,9 +439,22 @@ NodeModule::property_changed(const URI& key, const Atom& value)
void
NodeModule::set_selected(bool b)
{
- const LV2URIMap& uris = App::instance().uris();
+ const App& app = App::instance();
+ const LV2URIMap& uris = app.uris();
if (b != selected()) {
Module::set_selected(b);
+ if (b) {
+ PatchWindow* win = app.window_factory()->parent_patch_window(node());
+ if (win) {
+ const std::string& doc = node()->plugin_model()->documentation();
+ if (!doc.empty()) {
+ win->doc_textview()->get_buffer()->set_text(doc);
+ win->doc_textview()->show();
+ } else {
+ win->doc_textview()->hide();
+ }
+ }
+ }
if (App::instance().signal())
App::instance().engine()->set_property(_node->path(), uris.ingen_selected, b);
}
diff --git a/src/gui/PatchCanvas.cpp b/src/gui/PatchCanvas.cpp
index beb2da23..d3d8c5c4 100644
--- a/src/gui/PatchCanvas.cpp
+++ b/src/gui/PatchCanvas.cpp
@@ -606,6 +606,18 @@ PatchCanvas::canvas_event(GdkEvent* event)
return (ret ? true : Canvas::canvas_event(event));
}
+void
+PatchCanvas::clear_selection()
+{
+ const App& app = App::instance();
+ PatchWindow* win = app.window_factory()->patch_window(_patch);
+ if (win) {
+ win->doc_textview()->hide();
+ }
+
+ FlowCanvas::Canvas::clear_selection();
+}
+
#define FOREACH_ITEM(iter, coll) \
for (list<boost::shared_ptr<Item> >::iterator (iter) = coll.begin(); \
(iter) != coll.end(); ++(iter))
diff --git a/src/gui/PatchCanvas.hpp b/src/gui/PatchCanvas.hpp
index aa27c9e1..702f90bb 100644
--- a/src/gui/PatchCanvas.hpp
+++ b/src/gui/PatchCanvas.hpp
@@ -77,6 +77,7 @@ public:
void get_new_module_location(double& x, double& y);
+ void clear_selection();
void destroy_selection();
void copy_selection();
void paste();
diff --git a/src/gui/PatchWindow.cpp b/src/gui/PatchWindow.cpp
index adbfc933..c64d72b9 100644
--- a/src/gui/PatchWindow.cpp
+++ b/src/gui/PatchWindow.cpp
@@ -95,6 +95,7 @@ PatchWindow::PatchWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glad
xml->get_widget("patch_view_messages_window_menuitem", _menu_view_messages_window);
xml->get_widget("patch_view_patch_tree_window_menuitem", _menu_view_patch_tree_window);
xml->get_widget("patch_help_about_menuitem", _menu_help_about);
+ xml->get_widget("patch_documentation_textview", _doc_textview);
_menu_view_control_window->property_sensitive() = false;
string engine_name = App::instance().engine()->uri().str();
diff --git a/src/gui/PatchWindow.hpp b/src/gui/PatchWindow.hpp
index aafb9d2c..096343bd 100644
--- a/src/gui/PatchWindow.hpp
+++ b/src/gui/PatchWindow.hpp
@@ -57,6 +57,8 @@ public:
PatchWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& glade_xml);
~PatchWindow();
+ Gtk::TextView* doc_textview() { return _doc_textview; }
+
void set_patch_from_path(const Raul::Path& path, SharedPtr<PatchView> view);
void set_patch(SharedPtr<PatchModel> pc, SharedPtr<PatchView> view);
@@ -151,6 +153,8 @@ private:
BreadCrumbs* _breadcrumbs;
Gtk::Statusbar* _status_bar;
+ Gtk::TextView* _doc_textview;
+
sigc::connection _entered_connection;
sigc::connection _left_connection;
diff --git a/src/gui/Port.cpp b/src/gui/Port.cpp
index 4102a52c..949e459d 100644
--- a/src/gui/Port.cpp
+++ b/src/gui/Port.cpp
@@ -253,6 +253,30 @@ Port::dash()
return _dash;
}
+void
+Port::set_selected(bool b)
+{
+ if (b != selected()) {
+ FlowCanvas::Port::set_selected(b);
+ SharedPtr<PortModel> pm = _port_model.lock();
+ if (pm && b) {
+ const App& app = App::instance();
+ SharedPtr<NodeModel> node = PtrCast<NodeModel>(pm->parent());
+ PatchWindow* win = app.window_factory()->parent_patch_window(node);
+ if (win) {
+ const std::string& doc = node->plugin_model()->port_documentation(
+ pm->index());
+ if (!doc.empty()) {
+ win->doc_textview()->get_buffer()->set_text(doc);
+ win->doc_textview()->show();
+ } else {
+ win->doc_textview()->hide();
+ }
+ }
+ }
+ }
+}
+
} // namespace GUI
} // namespace Ingen
diff --git a/src/gui/Port.hpp b/src/gui/Port.hpp
index 49409510..ba2f2f99 100644
--- a/src/gui/Port.hpp
+++ b/src/gui/Port.hpp
@@ -58,6 +58,8 @@ public:
void value_changed(const Raul::Atom& value);
void activity();
+ void set_selected(bool b);
+
ArtVpathDash* dash();
private:
diff --git a/src/gui/WindowFactory.cpp b/src/gui/WindowFactory.cpp
index 99c596dd..6c48d11d 100644
--- a/src/gui/WindowFactory.cpp
+++ b/src/gui/WindowFactory.cpp
@@ -116,6 +116,16 @@ WindowFactory::patch_window(SharedPtr<PatchModel> patch)
}
+PatchWindow*
+WindowFactory::parent_patch_window(SharedPtr<NodeModel> node)
+{
+ if (!node)
+ return NULL;
+
+ return patch_window(PtrCast<PatchModel>(node->parent()));
+}
+
+
NodeControlWindow*
WindowFactory::control_window(SharedPtr<NodeModel> node)
{
diff --git a/src/gui/WindowFactory.hpp b/src/gui/WindowFactory.hpp
index 113cfc3d..a00ffc1e 100644
--- a/src/gui/WindowFactory.hpp
+++ b/src/gui/WindowFactory.hpp
@@ -62,6 +62,7 @@ public:
size_t num_open_patch_windows();
PatchWindow* patch_window(SharedPtr<PatchModel> patch);
+ PatchWindow* parent_patch_window(SharedPtr<NodeModel> node);
NodeControlWindow* control_window(SharedPtr<NodeModel> node);
void present_patch(SharedPtr<PatchModel> model,
diff --git a/src/gui/ingen_gui.glade b/src/gui/ingen_gui.glade
index 15e38061..0a38bbb2 100644
--- a/src/gui/ingen_gui.glade
+++ b/src/gui/ingen_gui.glade
@@ -9,6 +9,7 @@
<child>
<widget class="GtkVBox" id="patch_win_vbox">
<property name="visible">True</property>
+ <property name="orientation">vertical</property>
<child>
<widget class="GtkMenuBar" id="menubar">
<property name="visible">True</property>
@@ -335,8 +336,8 @@
</child>
<child>
<widget class="GtkImageMenuItem" id="patch_fullscreen_menuitem">
- <property name="visible">True</property>
<property name="label">gtk-fullscreen</property>
+ <property name="visible">True</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="patch_fullscreen_menuitem"/>
@@ -460,19 +461,43 @@
</packing>
</child>
<child>
- <widget class="GtkScrolledWindow" id="patch_win_scrolledwin">
+ <widget class="GtkHPaned" id="hpaned1">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="hscrollbar_policy">automatic</property>
- <property name="vscrollbar_policy">automatic</property>
<child>
- <widget class="GtkViewport" id="patch_win_viewport">
+ <widget class="GtkScrolledWindow" id="patch_win_scrolledwin">
<property name="visible">True</property>
- <property name="shadow_type">none</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
<child>
- <placeholder/>
+ <widget class="GtkViewport" id="patch_win_viewport">
+ <property name="visible">True</property>
+ <property name="resize_mode">queue</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <placeholder/>
+ </child>
+ </widget>
</child>
</widget>
+ <packing>
+ <property name="resize">True</property>
+ <property name="shrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkTextView" id="patch_documentation_textview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ <property name="wrap_mode">word</property>
+ <property name="cursor_visible">False</property>
+ </widget>
+ <packing>
+ <property name="resize">False</property>
+ <property name="shrink">True</property>
+ </packing>
</child>
</widget>
<packing>