1 |
/* |
2 |
Copyright (c) MMXX Christian Schoenebeck |
3 |
|
4 |
This file is part of "gigedit" and released under the terms of the |
5 |
GNU General Public License version 2. |
6 |
*/ |
7 |
|
8 |
#ifndef SCRIPT_PATCH_VARS_H |
9 |
#define SCRIPT_PATCH_VARS_H |
10 |
|
11 |
#ifdef LIBGIG_HEADER_FILE |
12 |
# include LIBGIG_HEADER_FILE(gig.h) |
13 |
# include LIBGIG_HEADER_FILE(Serialization.h) |
14 |
#else |
15 |
# include <gig.h> |
16 |
# include <Serialization.h> |
17 |
#endif |
18 |
|
19 |
#ifdef GTKMM_HEADER_FILE |
20 |
# include GTKMM_HEADER_FILE(gtkmm.h) |
21 |
#else |
22 |
# include <gtkmm.h> |
23 |
#endif |
24 |
|
25 |
#if HAVE_CONFIG_H |
26 |
# include <config.h> |
27 |
#endif |
28 |
#include "compat.h" |
29 |
#if USE_GTKMM_BUILDER |
30 |
# include <gtkmm/builder.h> |
31 |
#else |
32 |
# include <gtkmm/uimanager.h> // deprecated in gtkmm >= 3.21.4 |
33 |
#endif |
34 |
#include "wrapLabel.hh" |
35 |
|
36 |
#include "scripteditor.h" // lazy inclusion of LS script VM header files |
37 |
|
38 |
/** @brief Editor for real-time instrument script 'patch' variables. |
39 |
* |
40 |
* 'Patch' variables are special variable types in real-time instrument scripts |
41 |
* which allow to override their initial value on a per instrument basis. That |
42 |
* allows to share the same script among multiple instruments, while at the same |
43 |
* time being able to fine tune certain aspects of the script for a specific |
44 |
* instrument. |
45 |
* |
46 |
* This class implements a window which allows to edit such 'patch' variables |
47 |
* for the currently selected instrument. In Gigedit this is currently available |
48 |
* under the 'Script' tab on the right hand side of Gigedit's main window. |
49 |
*/ |
50 |
class ScriptPatchVars : public Gtk::ScrolledWindow { |
51 |
public: |
52 |
ScriptPatchVars(); |
53 |
void setInstrument(gig::Instrument* pInstrument, bool forceUpdate = false); |
54 |
void deleteSelectedRows(); |
55 |
|
56 |
sigc::signal<void, gig::Instrument*> signal_vars_to_be_changed; |
57 |
sigc::signal<void, gig::Instrument*> signal_vars_changed; |
58 |
sigc::signal<void, gig::Script*> signal_edit_script; |
59 |
|
60 |
class VarsModel : public Gtk::TreeModel::ColumnRecord { |
61 |
public: |
62 |
VarsModel() { |
63 |
add(m_col_name); |
64 |
add(m_col_name_color); |
65 |
add(m_col_name_weight); |
66 |
add(m_col_type); |
67 |
add(m_col_value); |
68 |
add(m_col_value_color); |
69 |
add(m_col_value_weight); |
70 |
add(m_col_value_tooltip); |
71 |
add(m_col_slot); |
72 |
add(m_col_allowTextEntry); |
73 |
add(m_col_editable); |
74 |
add(m_col_options); |
75 |
add(m_col_script); |
76 |
} |
77 |
|
78 |
Gtk::TreeModelColumn<Glib::ustring> m_col_name; |
79 |
Gtk::TreeModelColumn<Glib::ustring> m_col_name_color; |
80 |
Gtk::TreeModelColumn<int> m_col_name_weight; |
81 |
Gtk::TreeModelColumn<Glib::ustring> m_col_type; |
82 |
Gtk::TreeModelColumn<Glib::ustring> m_col_value; |
83 |
Gtk::TreeModelColumn<Glib::ustring> m_col_value_color; |
84 |
Gtk::TreeModelColumn<int> m_col_value_weight; |
85 |
Gtk::TreeModelColumn<Glib::ustring> m_col_value_tooltip; |
86 |
Gtk::TreeModelColumn<int> m_col_slot; |
87 |
Gtk::TreeModelColumn<bool> m_col_allowTextEntry; |
88 |
Gtk::TreeModelColumn<bool> m_col_editable; |
89 |
Gtk::TreeModelColumn<Glib::RefPtr<Gtk::ListStore> > m_col_options; |
90 |
Gtk::TreeModelColumn<gig::Script*> m_col_script; |
91 |
} m_treeModel; |
92 |
|
93 |
class VarsTreeStore : public Gtk::TreeStore { |
94 |
public: |
95 |
static Glib::RefPtr<VarsTreeStore> create(const VarsModel& columns) { |
96 |
return Glib::RefPtr<VarsTreeStore>( new VarsTreeStore(columns) ); |
97 |
} |
98 |
protected: |
99 |
VarsTreeStore(const VarsModel& columns) : Gtk::TreeStore(columns) {} |
100 |
}; |
101 |
|
102 |
Gtk::TreeView m_treeView; |
103 |
Glib::RefPtr<VarsTreeStore> m_treeStore; |
104 |
Gtk::CellRendererCombo m_valueCellRenderer; |
105 |
bool m_ignoreTreeViewValueChange; |
106 |
|
107 |
protected: |
108 |
void buildTreeViewVar(const Gtk::TreeModel::Row& parentRow, int iScriptSlot, |
109 |
gig::Script* script, const std::string name, |
110 |
const struct PatchVar* var); |
111 |
void buildTreeViewSlot(const Gtk::TreeModel::Row& parentRow, int iScriptSlot); |
112 |
void reloadTreeView(); |
113 |
void onValueCellEdited(const Glib::ustring& sPath, const Glib::ustring& text); |
114 |
void onTreeViewSelectionChanged(); |
115 |
bool onQueryTreeViewTooltip(int x, int y, bool keyboardTip, |
116 |
const Glib::RefPtr<Gtk::Tooltip>& tooltip); |
117 |
#if GTKMM_MAJOR_VERSION > 3 || (GTKMM_MAJOR_VERSION == 3 && (GTKMM_MINOR_VERSION > 91 || (GTKMM_MINOR_VERSION == 91 && GTKMM_MICRO_VERSION >= 2))) // GTKMM >= 3.91.2 |
118 |
bool onTreeViewKeyRelease(Gdk::EventKey& key); |
119 |
#else |
120 |
void onTreeViewKeyRelease(GdkEventKey* button); |
121 |
#endif |
122 |
void deleteRows(const std::vector<Gtk::TreeModel::Path>& rows); |
123 |
void onTreeViewRowChanged(const Gtk::TreeModel::Path& path, |
124 |
const Gtk::TreeModel::iterator& iter); |
125 |
void onTreeViewRowValueChanged(const Gtk::TreeModel::Path& path, |
126 |
const Gtk::TreeModel::iterator& iter, |
127 |
const Glib::ustring value); |
128 |
private: |
129 |
::gig::Instrument* m_instrument; |
130 |
bool m_editing; |
131 |
}; |
132 |
|
133 |
#endif // SCRIPT_PATCH_VARS_H |