summaryrefslogtreecommitdiffstats
path: root/src/gui/PropertiesWindow.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/PropertiesWindow.hpp')
-rw-r--r--src/gui/PropertiesWindow.hpp129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/gui/PropertiesWindow.hpp b/src/gui/PropertiesWindow.hpp
new file mode 100644
index 00000000..c1c3eee4
--- /dev/null
+++ b/src/gui/PropertiesWindow.hpp
@@ -0,0 +1,129 @@
+/*
+ This file is part of Ingen.
+ Copyright 2007-2015 David Robillard <http://drobilla.net/>
+
+ Ingen is free software: you can redistribute it and/or modify it under the
+ terms of the GNU Affero General Public License as published by the Free
+ Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with Ingen. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef INGEN_GUI_PROPERTIES_WINDOW_HPP
+#define INGEN_GUI_PROPERTIES_WINDOW_HPP
+
+#include <map>
+
+#include <gtkmm/alignment.h>
+#include <gtkmm/box.h>
+#include <gtkmm/builder.h>
+#include <gtkmm/button.h>
+#include <gtkmm/checkbutton.h>
+#include <gtkmm/combobox.h>
+#include <gtkmm/liststore.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/table.h>
+
+#include "ingen/client/BlockModel.hpp"
+#include "ingen/types.hpp"
+
+#include "Window.hpp"
+
+namespace ingen {
+
+namespace client { class ObjectModel; }
+
+namespace gui {
+
+/** Object properties window.
+ *
+ * Loaded from XML as a derived object.
+ *
+ * \ingroup GUI
+ */
+class PropertiesWindow : public Window
+{
+public:
+ PropertiesWindow(BaseObjectType* cobject,
+ const Glib::RefPtr<Gtk::Builder>& xml);
+
+ void present(SPtr<const client::ObjectModel> model);
+ void set_object(SPtr<const client::ObjectModel> model);
+
+private:
+ /** Record of a property (row in the table) */
+ struct Record {
+ Record(const Atom& v, Gtk::Alignment* vw, int r, Gtk::CheckButton* cb)
+ : value(v), value_widget(vw), row(r), present_button(cb)
+ {}
+ Atom value;
+ Gtk::Alignment* value_widget;
+ int row;
+ Gtk::CheckButton* present_button;
+ };
+
+ struct ComboColumns : public Gtk::TreeModel::ColumnRecord {
+ ComboColumns() {
+ add(label_col);
+ add(uri_col);
+ }
+ Gtk::TreeModelColumn<Glib::ustring> label_col;
+ Gtk::TreeModelColumn<Glib::ustring> uri_col;
+ };
+
+ void add_property(const URI& key, const Atom& value);
+ void change_property(const URI& key, const Atom& value);
+ void remove_property(const URI& key, const Atom& value);
+ void on_change(const URI& key);
+
+ bool datatype_supported(const std::set<URI>& types,
+ URI* widget_type);
+
+ bool class_supported(const std::set<URI>& types);
+
+ Gtk::Widget* create_value_widget(const URI& key,
+ const char* type_uri,
+ const Atom& value = Atom());
+
+ Atom get_value(LV2_URID type, Gtk::Widget* value_widget);
+
+ void reset();
+ void on_show() override;
+
+ std::string active_key() const;
+
+ void key_changed();
+ void add_clicked();
+ void cancel_clicked();
+ void apply_clicked();
+ void ok_clicked();
+
+ typedef std::map<URI, Record> Records;
+ Records _records;
+
+ SPtr<const client::ObjectModel> _model;
+ ComboColumns _combo_columns;
+ Glib::RefPtr<Gtk::ListStore> _key_store;
+ sigc::connection _property_connection;
+ sigc::connection _property_removed_connection;
+ Gtk::VBox* _vbox;
+ Gtk::ScrolledWindow* _scrolledwindow;
+ Gtk::Table* _table;
+ Gtk::ComboBox* _key_combo;
+ LV2_URID _value_type;
+ Gtk::Bin* _value_bin;
+ Gtk::Button* _add_button;
+ Gtk::Button* _cancel_button;
+ Gtk::Button* _apply_button;
+ Gtk::Button* _ok_button;
+};
+
+} // namespace gui
+} // namespace ingen
+
+#endif // INGEN_GUI_PROPERTIES_WINDOW_HPP