summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-04-23 02:41:20 +0000
committerDavid Robillard <d@drobilla.net>2007-04-23 02:41:20 +0000
commit67fff73eaa9c78cfbae53ac1948f38fe3812c77f (patch)
tree6125a493f3ad36e6decb14f98da17ffdb8103c4b
parentbd315305771e98eba1d81672a47ce4fe7bcc95cc (diff)
downloadingen-67fff73eaa9c78cfbae53ac1948f38fe3812c77f.tar.gz
ingen-67fff73eaa9c78cfbae53ac1948f38fe3812c77f.tar.bz2
ingen-67fff73eaa9c78cfbae53ac1948f38fe3812c77f.zip
Moved range controls from node controls window to popup dialog to declutter.
git-svn-id: http://svn.drobilla.net/lad/ingen@472 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--src/progs/ingenuity/ControlGroups.cpp118
-rw-r--r--src/progs/ingenuity/ControlGroups.h17
-rw-r--r--src/progs/ingenuity/Makefile.am2
-rw-r--r--src/progs/ingenuity/NodePropertiesWindow.h2
-rw-r--r--src/progs/ingenuity/PortPropertiesWindow.cpp173
-rw-r--r--src/progs/ingenuity/PortPropertiesWindow.h68
-rw-r--r--src/progs/ingenuity/ingenuity.glade306
7 files changed, 548 insertions, 138 deletions
diff --git a/src/progs/ingenuity/ControlGroups.cpp b/src/progs/ingenuity/ControlGroups.cpp
index 9bd96204..d7e2c6c1 100644
--- a/src/progs/ingenuity/ControlGroups.cpp
+++ b/src/progs/ingenuity/ControlGroups.cpp
@@ -23,6 +23,8 @@
#include "PluginModel.h"
#include "NodeModel.h"
#include "PortModel.h"
+#include "PortPropertiesWindow.h"
+#include "GladeFactory.h"
#include "App.h"
using std::cerr; using std::cout; using std::endl;
@@ -60,7 +62,6 @@ ControlGroup::init(ControlPanel* panel, SharedPtr<PortModel> pm, bool separator)
}
*/
- pm->metadata_update_sig.connect(sigc::mem_fun(this, &ControlGroup::metadata_update));
pm->control_change_sig.connect(sigc::mem_fun(this, &ControlGroup::set_value));
}
@@ -73,9 +74,14 @@ SliderControlGroup::SliderControlGroup(BaseObjectType* cobject, const Glib::RefP
_enabled(true)
{
xml->get_widget("control_strip_name_label", _name_label);
- xml->get_widget("control_strip_min_spinner", _min_spinner);
- xml->get_widget("control_strip_max_spinner", _max_spinner);
xml->get_widget("control_strip_slider", _slider);
+
+ Glib::RefPtr<Gnome::Glade::Xml> menu_xml = GladeFactory::new_glade_reference("port_control_menu");
+ menu_xml->get_widget("port_control_menu", _menu);
+ menu_xml->get_widget("port_control_menu_properties", _menu_properties);
+
+ _menu_properties->signal_activate().connect(
+ sigc::mem_fun(this, &SliderControlGroup::menu_properties));
}
@@ -85,12 +91,22 @@ SliderControlGroup::init(ControlPanel* panel, SharedPtr<PortModel> pm, bool sepa
ControlGroup::init(panel, pm, separator);
assert(_name_label);
- assert(_min_spinner);
- assert(_max_spinner);
assert(_slider);
+ set_name(pm->path().name());
+
_slider->set_draw_value(true);
+ _slider->set_value(_port_model->value());
+
+ _slider->signal_button_press_event().connect(sigc::mem_fun(*this, &SliderControlGroup::clicked));
+ _slider->signal_event().connect(
+ sigc::mem_fun(*this, &SliderControlGroup::slider_pressed));
+
+ _slider->signal_value_changed().connect(
+ sigc::mem_fun(*this, &SliderControlGroup::update_value_from_slider));
+
+ // FIXME: code duplication w/ PortPropertiesWindow.cpp
float min = 0.0f;
float max = 1.0f;
@@ -117,28 +133,37 @@ SliderControlGroup::init(ControlPanel* panel, SharedPtr<PortModel> pm, bool sepa
if (max <= min)
max = min + 1.0f;
- set_name(pm->path().name());
+ _slider->set_range(min, max);
- _min_spinner->set_value(min);
- _min_spinner->signal_value_changed().connect(sigc::mem_fun(*this, &SliderControlGroup::min_changed));
- _max_spinner->set_value(max);
- _max_spinner->signal_value_changed().connect(sigc::mem_fun(*this, &SliderControlGroup::max_changed));
+ set_value(pm->value());
- _slider->set_value(_port_model->value());
+ _enable_signal = true;
- _slider->signal_event().connect(
- sigc::mem_fun(*this, &SliderControlGroup::slider_pressed));
+ show_all();
+}
- _slider->signal_value_changed().connect(
- sigc::mem_fun(*this, &SliderControlGroup::update_value_from_slider));
- _slider->set_range(min, max);
+bool
+SliderControlGroup::clicked(GdkEventButton* ev)
+{
+ if (ev->button == 3) {
+ _menu->popup(ev->button, ev->time);
+ return true;
+ } else {
+ return false;
+ }
+}
- set_value(pm->value());
- _enable_signal = true;
+void
+SliderControlGroup::menu_properties()
+{
+ Glib::RefPtr<Gnome::Glade::Xml> xml = GladeFactory::new_glade_reference();
- show_all();
+ PortPropertiesWindow* dialog;
+ xml->get_widget_derived("port_properties_win", dialog);
+ dialog->init(this, _port_model);
+ dialog->run();
}
@@ -156,16 +181,9 @@ SliderControlGroup::set_value(float val)
void
-SliderControlGroup::metadata_update(const string& key, const Atom& value)
+SliderControlGroup::set_range(float min, float max)
{
- _enable_signal = false;
-
- if ( (key == "min") && value.type() == Atom::FLOAT)
- _min_spinner->set_value(value.get_float());
- else if ( (key == "max") && value.type() == Atom::FLOAT)
- _max_spinner->set_value(value.get_float());
-
- _enable_signal = true;
+ _slider->set_range(min, max);
}
@@ -182,8 +200,8 @@ void
SliderControlGroup::enable()
{
_slider->property_sensitive() = true;
- _min_spinner->property_sensitive() = true;
- _max_spinner->property_sensitive() = true;
+ //_min_spinner->property_sensitive() = true;
+ //_max_spinner->property_sensitive() = true;
//m_value_spinner.property_sensitive() = true;
_name_label->property_sensitive() = true;
}
@@ -193,50 +211,14 @@ void
SliderControlGroup::disable()
{
_slider->property_sensitive() = false;
- _min_spinner->property_sensitive() = false;
- _max_spinner->property_sensitive() = false;
+ //_min_spinner->property_sensitive() = false;
+ //_max_spinner->property_sensitive() = false;
//m_value_spinner.property_sensitive() = false;
_name_label->property_sensitive() = false;
}
void
-SliderControlGroup::min_changed()
-{
- float min = _min_spinner->get_value();
- const float max = _max_spinner->get_value();
-
- if (min >= max) {
- min = max - 1.0;
- _min_spinner->set_value(min);
- }
-
- _slider->set_range(min, max);
-
- if (_enable_signal)
- App::instance().engine()->set_metadata(_port_model->path(), "min", min);
-}
-
-
-void
-SliderControlGroup::max_changed()
-{
- const float min = _min_spinner->get_value();
- float max = _max_spinner->get_value();
-
- if (max <= min) {
- max = min + 1.0;
- _max_spinner->set_value(max);
- }
-
- _slider->set_range(min, max);
-
- if (_enable_signal)
- App::instance().engine()->set_metadata(_port_model->path(), "max", max);
-}
-
-
-void
SliderControlGroup::update_value_from_slider()
{
if (_enable_signal) {
diff --git a/src/progs/ingenuity/ControlGroups.h b/src/progs/ingenuity/ControlGroups.h
index 1cbf34d7..a05cceee 100644
--- a/src/progs/ingenuity/ControlGroups.h
+++ b/src/progs/ingenuity/ControlGroups.h
@@ -31,6 +31,7 @@ using namespace Ingen::Client;
namespace Ingenuity {
class ControlPanel;
+class PortPropertiesWindow;
/** A group of controls (for a single Port) in a NodeControlWindow.
@@ -52,9 +53,10 @@ public:
}
protected:
+ friend class PortPropertiesWindow;
virtual void set_value(float value) = 0;
- virtual void metadata_update(const string& key, const Atom& value) = 0;
+ virtual void set_range(float min, float max) {}
ControlPanel* _control_panel;
SharedPtr<PortModel> _port_model;
@@ -82,15 +84,17 @@ public:
private:
void set_name(const string& name);
- virtual void metadata_update(const string& key, const Atom& value);
+
+ bool clicked(GdkEventButton* ev);
void set_value(float value);
+ void set_range(float min, float max);
- void min_changed();
- void max_changed();
void update_range();
void update_value_from_slider();
void update_value_from_spinner();
+
+ void menu_properties();
//void slider_grabbed(bool b);
@@ -99,10 +103,11 @@ private:
bool _enabled;
Gtk::Label* _name_label;
- Gtk::SpinButton* _min_spinner;
- Gtk::SpinButton* _max_spinner;
//Gtk::SpinButton* _value_spinner;
Gtk::VScale* _slider;
+
+ Gtk::Menu* _menu;
+ Gtk::MenuItem* _menu_properties;
};
diff --git a/src/progs/ingenuity/Makefile.am b/src/progs/ingenuity/Makefile.am
index 932e47df..07420b48 100644
--- a/src/progs/ingenuity/Makefile.am
+++ b/src/progs/ingenuity/Makefile.am
@@ -92,6 +92,8 @@ ingenuity_SOURCES = \
RenameWindow.cpp \
NodePropertiesWindow.h \
NodePropertiesWindow.cpp \
+ PortPropertiesWindow.h \
+ PortPropertiesWindow.cpp \
PatchTreeWindow.h \
PatchTreeWindow.cpp
diff --git a/src/progs/ingenuity/NodePropertiesWindow.h b/src/progs/ingenuity/NodePropertiesWindow.h
index c45ab59c..b6d90062 100644
--- a/src/progs/ingenuity/NodePropertiesWindow.h
+++ b/src/progs/ingenuity/NodePropertiesWindow.h
@@ -27,7 +27,7 @@ using namespace Ingen::Client;
namespace Ingenuity {
-/** 'New Patch' Window.
+/** Node properties window.
*
* Loaded by libglade as a derived object.
*
diff --git a/src/progs/ingenuity/PortPropertiesWindow.cpp b/src/progs/ingenuity/PortPropertiesWindow.cpp
new file mode 100644
index 00000000..b7a78ebc
--- /dev/null
+++ b/src/progs/ingenuity/PortPropertiesWindow.cpp
@@ -0,0 +1,173 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "PortPropertiesWindow.h"
+#include <cassert>
+#include <string>
+#include "NodeModel.h"
+#include "PluginModel.h"
+#include "ModelEngineInterface.h"
+#include "ControlGroups.h"
+#include "App.h"
+
+using std::string;
+
+namespace Ingenuity {
+
+
+PortPropertiesWindow::PortPropertiesWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& xml)
+ : Gtk::Dialog(cobject)
+ , _enable_signal(false)
+ , _control(NULL)
+{
+ xml->get_widget("port_properties_min_spinner", _min_spinner);
+ xml->get_widget("port_properties_max_spinner", _max_spinner);
+ xml->get_widget("port_properties_cancel_button", _cancel_button);
+ xml->get_widget("port_properties_ok_button", _ok_button);
+
+ _cancel_button->signal_clicked().connect(sigc::mem_fun(this,
+ &PortPropertiesWindow::cancel));
+
+ _ok_button->signal_clicked().connect(sigc::mem_fun(this,
+ &PortPropertiesWindow::ok));
+}
+
+
+/** Set the port this window is associated with.
+ * This function MUST be called before using this object in any way.
+ */
+void
+PortPropertiesWindow::init(ControlGroup* control, SharedPtr<PortModel> pm)
+{
+ assert(pm);
+ assert(control);
+
+ _port_model = pm;
+ _control = control;
+
+
+ set_title(pm->path() + " Properties");
+
+ // FIXME: code duplication w/ ControlGroups.cpp
+ float min = 0.0f;
+ float max = 1.0f;
+
+ const Atom& min_atom = pm->get_metadata("min");
+ const Atom& max_atom = pm->get_metadata("max");
+ if (min_atom.type() == Atom::FLOAT && max_atom.type() == Atom::FLOAT) {
+ min = min_atom.get_float();
+ max = max_atom.get_float();
+ }
+
+ const SharedPtr<NodeModel> parent = PtrCast<NodeModel>(pm->parent());
+
+ if (parent && parent->plugin() && parent->plugin()->type() == PluginModel::LV2) {
+ min = slv2_port_get_minimum_value(
+ parent->plugin()->slv2_plugin(),
+ slv2_plugin_get_port_by_symbol(parent->plugin()->slv2_plugin(),
+ pm->path().name().c_str()));
+ max = slv2_port_get_maximum_value(
+ parent->plugin()->slv2_plugin(),
+ slv2_plugin_get_port_by_symbol(parent->plugin()->slv2_plugin(),
+ pm->path().name().c_str()));
+ }
+
+ if (max <= min)
+ max = min + 1.0f;
+
+ _initial_min = min;
+ _initial_max = max;
+
+ _min_spinner->set_value(min);
+ _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));
+
+ pm->metadata_update_sig.connect(sigc::mem_fun(this, &PortPropertiesWindow::metadata_update));
+
+ _enable_signal = true;
+}
+
+
+void
+PortPropertiesWindow::metadata_update(const string& key, const Atom& value)
+{
+ _enable_signal = false;
+
+ if ( (key == "min") && value.type() == Atom::FLOAT)
+ _min_spinner->set_value(value.get_float());
+ else if ( (key == "max") && value.type() == Atom::FLOAT)
+ _max_spinner->set_value(value.get_float());
+
+ _enable_signal = true;
+}
+
+
+void
+PortPropertiesWindow::min_changed()
+{
+ float min = _min_spinner->get_value();
+ const float max = _max_spinner->get_value();
+
+ if (min >= max) {
+ min = max - 1.0;
+ _min_spinner->set_value(min);
+ }
+
+ _control->set_range(min, max);
+
+ if (_enable_signal)
+ App::instance().engine()->set_metadata(_port_model->path(), "min", min);
+}
+
+
+void
+PortPropertiesWindow::max_changed()
+{
+ const float min = _min_spinner->get_value();
+ float max = _max_spinner->get_value();
+
+ if (max <= min) {
+ max = min + 1.0;
+ _max_spinner->set_value(max);
+ }
+
+ _control->set_range(min, max);
+
+ if (_enable_signal)
+ App::instance().engine()->set_metadata(_port_model->path(), "max", max);
+}
+
+
+void
+PortPropertiesWindow::cancel()
+{
+ App::instance().engine()->set_metadata(_port_model->path(), "min", _initial_min);
+ App::instance().engine()->set_metadata(_port_model->path(), "max", _initial_max);
+ delete this;
+}
+
+
+void
+PortPropertiesWindow::ok()
+{
+ delete this;
+}
+
+
+} // namespace Ingenuity
+
diff --git a/src/progs/ingenuity/PortPropertiesWindow.h b/src/progs/ingenuity/PortPropertiesWindow.h
new file mode 100644
index 00000000..cd22cb09
--- /dev/null
+++ b/src/progs/ingenuity/PortPropertiesWindow.h
@@ -0,0 +1,68 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef PORTPROPERTIESWINDOW_H
+#define PORTPROPERTIESWINDOW_H
+
+#include <gtkmm.h>
+#include <libglademm.h>
+#include "raul/SharedPtr.h"
+#include "PortModel.h"
+using namespace Ingen::Client;
+
+namespace Ingenuity {
+
+class ControlGroup;
+
+
+/** Port properties window.
+ *
+ * Loaded by libglade as a derived object.
+ *
+ * \ingroup Ingenuity
+ */
+class PortPropertiesWindow : public Gtk::Dialog
+{
+public:
+ PortPropertiesWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& refGlade);
+
+ void init(ControlGroup* control, SharedPtr<PortModel> port_model);
+
+private:
+ void metadata_update(const string& key, const Atom& value);
+ void min_changed();
+ void max_changed();
+
+ void ok();
+ void cancel();
+
+ bool _enable_signal;
+
+ 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;
+};
+
+} // namespace Ingenuity
+
+#endif // PORTPROPERTIESWINDOW_H
diff --git a/src/progs/ingenuity/ingenuity.glade b/src/progs/ingenuity/ingenuity.glade
index 6c80dc08..fddef5b4 100644
--- a/src/progs/ingenuity/ingenuity.glade
+++ b/src/progs/ingenuity/ingenuity.glade
@@ -1718,27 +1718,41 @@
<property name="spacing">0</property>
<child>
- <widget class="GtkScrolledWindow" id="scrolledwin1">
+ <widget class="GtkAlignment" id="alignment6">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xscale">0</property>
+ <property name="yscale">1</property>
+ <property name="top_padding">0</property>
+ <property name="bottom_padding">0</property>
+ <property name="left_padding">0</property>
+ <property name="right_padding">0</property>
<child>
- <widget class="GtkViewport" id="viewport1">
+ <widget class="GtkScrolledWindow" id="scrolledwin1">
<property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="shadow_type">GTK_SHADOW_NONE</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
- <widget class="GtkHBox" id="control_panel_controls_box">
+ <widget class="GtkViewport" id="viewport1">
<property name="visible">True</property>
- <property name="homogeneous">True</property>
- <property name="spacing">4</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
<child>
- <placeholder/>
+ <widget class="GtkHBox" id="control_panel_controls_box">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <property name="spacing">4</property>
+
+ <child>
+ <placeholder/>
+ </child>
+ </widget>
</child>
</widget>
</child>
@@ -2216,31 +2230,25 @@
</child>
<child>
+ <widget class="GtkHSeparator" id="hseparator5">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
<widget class="GtkVBox" id="control_strip">
<property name="visible">True</property>
<property name="homogeneous">False</property>
<property name="spacing">0</property>
<child>
- <widget class="GtkSpinButton" id="control_strip_max_spinner">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">3</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">1 -99999 99999 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
-
- <child>
<widget class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
<property name="xalign">0.5</property>
@@ -2309,45 +2317,13 @@
<property name="fill">True</property>
</packing>
</child>
-
- <child>
- <widget class="GtkSpinButton" id="control_strip_min_spinner">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="climb_rate">1</property>
- <property name="digits">3</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_ALWAYS</property>
- <property name="snap_to_ticks">False</property>
- <property name="wrap">False</property>
- <property name="adjustment">0 -99999 99999 1 10 10</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
</widget>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
- <property name="x_options">shrink|fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHSeparator" id="hseparator5">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
+ <property name="x_options">shrink</property>
</packing>
</child>
</widget>
@@ -4469,4 +4445,208 @@ Thank you for contributing.</property>
</child>
</widget>
+<widget class="GtkMenu" id="port_control_menu">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="port_control_menu_properties">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Properties...</property>
+ <property name="use_underline">True</property>
+ <signal name="activate" handler="on_port_control_menu_properties_activate" last_modification_time="Mon, 23 Apr 2007 00:39:20 GMT"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image2137">
+ <property name="visible">True</property>
+ <property name="stock">gtk-properties</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+<widget class="GtkDialog" id="port_properties_win">
+ <property name="border_width">8</property>
+ <property name="title" translatable="yes">Port Properties</property>
+ <property name="type">GTK_WINDOW_POPUP</property>
+ <property name="window_position">GTK_WIN_POS_MOUSE</property>
+ <property name="modal">False</property>
+ <property name="resizable">False</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+ <property name="has_separator">True</property>
+
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox6">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area6">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+ <child>
+ <widget class="GtkButton" id="port_properties_cancel_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-cancel</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">-6</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="port_properties_ok_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-ok</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">-5</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkTable" id="table20">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">4</property>
+ <property name="column_spacing">2</property>
+
+ <child>
+ <widget class="GtkSpinButton" id="port_properties_min_spinner">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">5</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">False</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">0 -100000000 100000000 1 10 10</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkSpinButton" id="port_properties_max_spinner">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">5</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+ <property name="snap_to_ticks">False</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">1 -99999 99999 1 10 10</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label138">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Minimum Value: </property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label139">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Maximum Value: </property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
</glade-interface>