summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/gui/ControlGroups.cpp7
-rw-r--r--src/libs/gui/ControlGroups.hpp3
-rw-r--r--src/libs/gui/DSSIController.hpp2
-rw-r--r--src/libs/gui/NodeMenu.hpp5
-rw-r--r--src/libs/gui/ObjectMenu.cpp26
-rw-r--r--src/libs/gui/ObjectMenu.hpp2
-rw-r--r--src/libs/gui/PortMenu.hpp5
-rw-r--r--src/libs/gui/PortPropertiesWindow.cpp32
-rw-r--r--src/libs/gui/PortPropertiesWindow.hpp18
-rw-r--r--src/libs/gui/WindowFactory.cpp35
-rw-r--r--src/libs/gui/WindowFactory.hpp8
-rw-r--r--src/libs/gui/ingen_gui.glade26
12 files changed, 101 insertions, 68 deletions
diff --git a/src/libs/gui/ControlGroups.cpp b/src/libs/gui/ControlGroups.cpp
index 46052d72..b7828a48 100644
--- a/src/libs/gui/ControlGroups.cpp
+++ b/src/libs/gui/ControlGroups.cpp
@@ -156,10 +156,9 @@ SliderControlGroup::menu_properties()
{
Glib::RefPtr<Gnome::Glade::Xml> xml = GladeFactory::new_glade_reference();
- PortPropertiesWindow* dialog;
- xml->get_widget_derived("port_properties_win", dialog);
- dialog->init(this, _port_model);
- dialog->run();
+ PortPropertiesWindow* window;
+ xml->get_widget_derived("port_properties_win", window);
+ window->present(_port_model);
}
diff --git a/src/libs/gui/ControlGroups.hpp b/src/libs/gui/ControlGroups.hpp
index 232b1b56..15e5a6ea 100644
--- a/src/libs/gui/ControlGroups.hpp
+++ b/src/libs/gui/ControlGroups.hpp
@@ -32,7 +32,6 @@ namespace Ingen {
namespace GUI {
class ControlPanel;
-class PortPropertiesWindow;
/** A group of controls (for a single Port) in a NodeControlWindow.
@@ -50,8 +49,6 @@ public:
inline const SharedPtr<PortModel> port_model() const { return _port_model; }
protected:
- friend class PortPropertiesWindow;
-
virtual void set_value(float value) = 0;
virtual void set_range(float min, float max) {}
diff --git a/src/libs/gui/DSSIController.hpp b/src/libs/gui/DSSIController.hpp
index 0d7073ea..7d6e0c97 100644
--- a/src/libs/gui/DSSIController.hpp
+++ b/src/libs/gui/DSSIController.hpp
@@ -36,7 +36,7 @@ namespace Ingen {
namespace GUI {
class NodeControlWindow;
-class NodePropertiesWindow;
+
/* Controller for a DSSI node.
*
diff --git a/src/libs/gui/NodeMenu.hpp b/src/libs/gui/NodeMenu.hpp
index 715cf6b9..05457b8f 100644
--- a/src/libs/gui/NodeMenu.hpp
+++ b/src/libs/gui/NodeMenu.hpp
@@ -30,11 +30,6 @@ using Ingen::Client::NodeModel;
namespace Ingen {
namespace GUI {
-class Controller;
-class NodeControlWindow;
-class NodePropertiesWindow;
-class PatchCanvas;
-
/** Menu for a Node.
*
diff --git a/src/libs/gui/ObjectMenu.cpp b/src/libs/gui/ObjectMenu.cpp
index ca000cfa..73d01389 100644
--- a/src/libs/gui/ObjectMenu.cpp
+++ b/src/libs/gui/ObjectMenu.cpp
@@ -33,11 +33,13 @@ ObjectMenu::ObjectMenu(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade:
, _disconnect_menuitem(NULL)
, _rename_menuitem(NULL)
, _destroy_menuitem(NULL)
+ , _properties_menuitem(NULL)
{
xml->get_widget("object_polyphonic_menuitem", _polyphonic_menuitem);
xml->get_widget("object_disconnect_menuitem", _disconnect_menuitem);
xml->get_widget("object_rename_menuitem", _rename_menuitem);
xml->get_widget("object_destroy_menuitem", _destroy_menuitem);
+ xml->get_widget("object_properties_menuitem", _properties_menuitem);
}
@@ -62,6 +64,9 @@ ObjectMenu::init(SharedPtr<ObjectModel> object)
_destroy_menuitem->signal_activate().connect(
sigc::mem_fun(this, &ObjectMenu::on_menu_destroy));
+
+ _properties_menuitem->signal_activate().connect(
+ sigc::mem_fun(this, &ObjectMenu::on_menu_properties));
object->signal_polyphonic.connect(sigc::mem_fun(this, &ObjectMenu::polyphonic_changed));
@@ -70,13 +75,6 @@ ObjectMenu::init(SharedPtr<ObjectModel> object)
void
-ObjectMenu::on_menu_destroy()
-{
- App::instance().engine()->destroy(_object->path());
-}
-
-
-void
ObjectMenu::on_menu_polyphonic()
{
if (_enable_signal)
@@ -99,6 +97,20 @@ ObjectMenu::on_menu_disconnect()
App::instance().engine()->disconnect_all(_object->path());
}
+
+void
+ObjectMenu::on_menu_destroy()
+{
+ App::instance().engine()->destroy(_object->path());
+}
+
+
+void
+ObjectMenu::on_menu_properties()
+{
+ App::instance().window_factory()->present_properties(_object);
+}
+
} // namespace GUI
} // namespace Ingen
diff --git a/src/libs/gui/ObjectMenu.hpp b/src/libs/gui/ObjectMenu.hpp
index b65c78ef..1acc278f 100644
--- a/src/libs/gui/ObjectMenu.hpp
+++ b/src/libs/gui/ObjectMenu.hpp
@@ -50,6 +50,7 @@ protected:
void on_menu_polyphonic();
void on_menu_disconnect();
void on_menu_destroy();
+ void on_menu_properties();
void polyphonic_changed(bool polyphonic);
@@ -59,6 +60,7 @@ protected:
Gtk::MenuItem* _disconnect_menuitem;
Gtk::MenuItem* _rename_menuitem;
Gtk::MenuItem* _destroy_menuitem;
+ Gtk::MenuItem* _properties_menuitem;
};
diff --git a/src/libs/gui/PortMenu.hpp b/src/libs/gui/PortMenu.hpp
index e1079f0d..06e8ac7d 100644
--- a/src/libs/gui/PortMenu.hpp
+++ b/src/libs/gui/PortMenu.hpp
@@ -30,11 +30,6 @@ using Ingen::Client::PortModel;
namespace Ingen {
namespace GUI {
-class Controller;
-class PortControlWindow;
-class PortPropertiesWindow;
-class PatchCanvas;
-
/** Menu for a Port.
*
diff --git a/src/libs/gui/PortPropertiesWindow.cpp b/src/libs/gui/PortPropertiesWindow.cpp
index cf8dbd98..a715a114 100644
--- a/src/libs/gui/PortPropertiesWindow.cpp
+++ b/src/libs/gui/PortPropertiesWindow.cpp
@@ -31,9 +31,8 @@ namespace GUI {
PortPropertiesWindow::PortPropertiesWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& xml)
- : Gtk::Dialog(cobject)
+ : Gtk::Window(cobject)
, _enable_signal(false)
- , _control(NULL)
{
xml->get_widget("port_properties_min_spinner", _min_spinner);
xml->get_widget("port_properties_max_spinner", _max_spinner);
@@ -52,13 +51,16 @@ PortPropertiesWindow::PortPropertiesWindow(BaseObjectType* cobject, const Glib::
* This function MUST be called before using this object in any way.
*/
void
-PortPropertiesWindow::init(ControlGroup* control, SharedPtr<PortModel> pm)
+PortPropertiesWindow::present(SharedPtr<PortModel> pm)
{
assert(pm);
- assert(control);
+ for (list<sigc::connection>::iterator i = _connections.begin(); i != _connections.end(); ++i)
+ (*i).disconnect();
+
+ _connections.clear();
+
_port_model = pm;
- _control = control;
set_title(pm->path() + " Properties");
@@ -71,13 +73,19 @@ PortPropertiesWindow::init(ControlGroup* control, SharedPtr<PortModel> pm)
_initial_max = max;
_min_spinner->set_value(min);
- _min_spinner->signal_value_changed().connect(sigc::mem_fun(*this, &PortPropertiesWindow::min_changed));
+ _connections.push_back(_min_spinner->signal_value_changed().connect(
+ sigc::mem_fun(*this, &PortPropertiesWindow::min_changed)));
+
_max_spinner->set_value(max);
- _max_spinner->signal_value_changed().connect(sigc::mem_fun(*this, &PortPropertiesWindow::max_changed));
+ _connections.push_back(_max_spinner->signal_value_changed().connect(
+ sigc::mem_fun(*this, &PortPropertiesWindow::max_changed)));
- pm->signal_metadata.connect(sigc::mem_fun(this, &PortPropertiesWindow::metadata_update));
+ _connections.push_back(pm->signal_metadata.connect(
+ sigc::mem_fun(this, &PortPropertiesWindow::metadata_update)));
_enable_signal = true;
+
+ Gtk::Window::present();
}
@@ -106,8 +114,6 @@ PortPropertiesWindow::min_changed()
_max_spinner->set_value(max);
}
- _control->set_range(min, max);
-
if (_enable_signal)
App::instance().engine()->set_metadata(_port_model->path(), "ingen:minimum", min);
}
@@ -124,8 +130,6 @@ PortPropertiesWindow::max_changed()
_min_spinner->set_value(min);
}
- _control->set_range(min, max);
-
if (_enable_signal)
App::instance().engine()->set_metadata(_port_model->path(), "ingen:maximum", max);
}
@@ -136,14 +140,14 @@ PortPropertiesWindow::cancel()
{
App::instance().engine()->set_metadata(_port_model->path(), "ingen:minimum", _initial_min);
App::instance().engine()->set_metadata(_port_model->path(), "ingen:maximum", _initial_max);
- delete this;
+ hide();
}
void
PortPropertiesWindow::ok()
{
- delete this;
+ hide();
}
diff --git a/src/libs/gui/PortPropertiesWindow.hpp b/src/libs/gui/PortPropertiesWindow.hpp
index 8c8f1c96..5d10960d 100644
--- a/src/libs/gui/PortPropertiesWindow.hpp
+++ b/src/libs/gui/PortPropertiesWindow.hpp
@@ -27,8 +27,6 @@ using namespace Ingen::Client;
namespace Ingen {
namespace GUI {
-class ControlGroup;
-
/** Port properties window.
*
@@ -36,12 +34,12 @@ class ControlGroup;
*
* \ingroup GUI
*/
-class PortPropertiesWindow : public Gtk::Dialog
+class PortPropertiesWindow : public Gtk::Window
{
public:
PortPropertiesWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade);
- void init(ControlGroup* control, SharedPtr<PortModel> port_model);
+ void present(SharedPtr<PortModel> port_model);
private:
void metadata_update(const string& key, const Atom& value);
@@ -56,12 +54,12 @@ private:
float _initial_min;
float _initial_max;
- ControlGroup* _control;
- SharedPtr<PortModel> _port_model;
- Gtk::SpinButton* _min_spinner;
- Gtk::SpinButton* _max_spinner;
- Gtk::Button* _cancel_button;
- Gtk::Button* _ok_button;
+ SharedPtr<PortModel> _port_model;
+ Gtk::SpinButton* _min_spinner;
+ Gtk::SpinButton* _max_spinner;
+ Gtk::Button* _cancel_button;
+ Gtk::Button* _ok_button;
+ std::list<sigc::connection> _connections;
};
} // namespace GUI
diff --git a/src/libs/gui/WindowFactory.cpp b/src/libs/gui/WindowFactory.cpp
index 096bb9df..caa02390 100644
--- a/src/libs/gui/WindowFactory.cpp
+++ b/src/libs/gui/WindowFactory.cpp
@@ -20,8 +20,9 @@
#include "App.hpp"
#include "PatchWindow.hpp"
#include "GladeFactory.hpp"
-#include "NodePropertiesWindow.hpp"
#include "PatchPropertiesWindow.hpp"
+#include "NodePropertiesWindow.hpp"
+#include "PortPropertiesWindow.hpp"
#include "NodeControlWindow.hpp"
#include "LoadPluginWindow.hpp"
#include "LoadPatchWindow.hpp"
@@ -44,8 +45,9 @@ WindowFactory::WindowFactory()
, _upload_patch_win(NULL)
, _new_subpatch_win(NULL)
, _load_subpatch_win(NULL)
- , _node_properties_win(NULL)
, _patch_properties_win(NULL)
+ , _node_properties_win(NULL)
+ , _port_properties_win(NULL)
{
Glib::RefPtr<Gnome::Glade::Xml> xml = GladeFactory::new_glade_reference();
@@ -54,8 +56,9 @@ WindowFactory::WindowFactory()
xml->get_widget_derived("load_remote_patch_win", _load_remote_patch_win);
xml->get_widget_derived("new_subpatch_win", _new_subpatch_win);
xml->get_widget_derived("load_subpatch_win", _load_subpatch_win);
- xml->get_widget_derived("node_properties_win", _node_properties_win);
xml->get_widget_derived("patch_properties_win", _patch_properties_win);
+ xml->get_widget_derived("node_properties_win", _node_properties_win);
+ xml->get_widget_derived("port_properties_win", _port_properties_win);
xml->get_widget_derived("rename_win", _rename_win);
#ifdef HAVE_CURL
@@ -340,24 +343,36 @@ WindowFactory::present_rename(SharedPtr<ObjectModel> object)
void
-WindowFactory::present_properties(SharedPtr<NodeModel> node)
+WindowFactory::present_properties(SharedPtr<ObjectModel> object)
{
- SharedPtr<PatchModel> patch = PtrCast<PatchModel>(node);
+ SharedPtr<PatchModel> patch = PtrCast<PatchModel>(object);
if (patch) {
-
PatchWindowMap::iterator w = _patch_windows.find(patch->path());
if (w != _patch_windows.end())
_patch_properties_win->set_transient_for(*w->second);
_patch_properties_win->present(patch);
+ return;
+ }
- } else {
-
- PatchWindowMap::iterator w = _patch_windows.find(node->parent()->path());
+ SharedPtr<NodeModel> node = PtrCast<NodeModel>(object);
+ if (node) {
+ PatchWindowMap::iterator w = _patch_windows.find(node->path().parent());
if (w != _patch_windows.end())
_node_properties_win->set_transient_for(*w->second);
-
+
_node_properties_win->present(node);
+ return;
+ }
+
+ SharedPtr<PortModel> port = PtrCast<PortModel>(object);
+ if (port) {
+ PatchWindowMap::iterator w = _patch_windows.find(port->path().parent().parent());
+ if (w != _patch_windows.end())
+ _patch_properties_win->set_transient_for(*w->second);
+
+ _port_properties_win->present(port);
+ return;
}
}
diff --git a/src/libs/gui/WindowFactory.hpp b/src/libs/gui/WindowFactory.hpp
index 0227f728..91fb27ab 100644
--- a/src/libs/gui/WindowFactory.hpp
+++ b/src/libs/gui/WindowFactory.hpp
@@ -31,8 +31,9 @@ namespace GUI {
class PatchWindow;
class NodeControlWindow;
-class NodePropertiesWindow;
class PatchPropertiesWindow;
+class NodePropertiesWindow;
+class PortPropertiesWindow;
class LoadPatchWindow;
class LoadRemotePatchWindow;
class UploadPatchWindow;
@@ -68,7 +69,7 @@ public:
void present_new_subpatch(SharedPtr<PatchModel> patch, MetadataMap data = MetadataMap());
void present_load_subpatch(SharedPtr<PatchModel> patch, MetadataMap data = MetadataMap());
void present_rename(SharedPtr<ObjectModel> object);
- void present_properties(SharedPtr<NodeModel> node);
+ void present_properties(SharedPtr<ObjectModel> object);
bool remove_patch_window(PatchWindow* win, GdkEventAny* ignored = NULL);
@@ -93,8 +94,9 @@ private:
UploadPatchWindow* _upload_patch_win;
NewSubpatchWindow* _new_subpatch_win;
LoadSubpatchWindow* _load_subpatch_win;
- NodePropertiesWindow* _node_properties_win;
PatchPropertiesWindow* _patch_properties_win;
+ NodePropertiesWindow* _node_properties_win;
+ PortPropertiesWindow* _port_properties_win;
RenameWindow* _rename_win;
};
diff --git a/src/libs/gui/ingen_gui.glade b/src/libs/gui/ingen_gui.glade
index e2e9d093..1ef92b53 100644
--- a/src/libs/gui/ingen_gui.glade
+++ b/src/libs/gui/ingen_gui.glade
@@ -2030,9 +2030,10 @@ Hold &lt;Ctrl&gt; to play controls in either mode.</property>
</child>
</widget>
<widget class="GtkWindow" id="node_properties_win">
- <property name="border_width">6</property>
+ <property name="border_width">8</property>
<property name="title" translatable="yes">Node Properties - Ingen</property>
<property name="icon">ingen.svg</property>
+ <property name="window_position">GTK_WIN_POS_MOUSE</property>
<child>
<widget class="GtkVBox" id="vbox17">
<property name="visible">True</property>
@@ -2985,15 +2986,13 @@ Thank you for contributing.</property>
</widget>
</child>
</widget>
- <widget class="GtkDialog" id="port_properties_win">
+ <widget class="GtkWindow" id="port_properties_win">
<property name="border_width">8</property>
<property name="type">GTK_WINDOW_POPUP</property>
<property name="title" translatable="yes">Port Properties - Ingen</property>
<property name="resizable">False</property>
<property name="window_position">GTK_WIN_POS_MOUSE</property>
- <property name="destroy_with_parent">True</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <child internal-child="vbox">
+ <child>
<widget class="GtkVBox" id="dialog-vbox6">
<property name="visible">True</property>
<property name="spacing">8</property>
@@ -3065,7 +3064,7 @@ Thank you for contributing.</property>
<property name="position">2</property>
</packing>
</child>
- <child internal-child="action_area">
+ <child>
<widget class="GtkHButtonBox" id="dialog-action_area6">
<property name="visible">True</property>
<property name="layout_style">GTK_BUTTONBOX_END</property>
@@ -3150,6 +3149,21 @@ Thank you for contributing.</property>
<property name="use_stock">True</property>
</widget>
</child>
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator9">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkImageMenuItem" id="object_properties_menuitem">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip" translatable="yes">View and edit properties</property>
+ <property name="label" translatable="yes">gtk-properties</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
</widget>
<widget class="GtkMenu" id="node_menu">
<property name="visible">True</property>