20 #include <gtkmm/box.h>
21 #include <gtkmm/label.h>
22 #include <gtkmm/stock.h>
33 : source_list(
Gtk::ListStore::create(source_cols))
34 , property_list(
Gtk::ListStore::create(property_cols))
35 , operator_list(
Gtk::ListStore::create(operator_cols))
37 static const char* source_labels[] = {
40 _(
"the previous note's"),
41 _(
"this note's index"),
42 _(
"the number of notes"),
44 _(
"a random number from"),
47 for (
int s = 0; source_labels[s]; ++s) {
57 static const char* property_labels[] = {
65 for (
int p = 0; property_labels[p]; ++p) {
71 static const char* operator_labels[] = {
72 "+",
"-",
"*",
"/",
"mod", NULL
74 for (
int o = 0; operator_labels[o]; ++o) {
90 Gtk::HBox* property_hbox = Gtk::manage(
new Gtk::HBox);
91 property_hbox->pack_start(*Gtk::manage(
new Gtk::Label(
_(
"Set "))),
false,
false);
93 property_hbox->pack_start(*Gtk::manage(
new Gtk::Label(
_(
" to "))),
false,
false);
100 Gtk::HBox* add_hbox = Gtk::manage(
new Gtk::HBox);
102 *manage(
new Gtk::Image(Gtk::Stock::ADD, Gtk::ICON_SIZE_BUTTON)));
107 get_vbox()->set_spacing(6);
108 get_vbox()->pack_start(*property_hbox,
false,
false);
110 get_vbox()->pack_start(*add_hbox,
false,
false);
112 add_button(Stock::CANCEL, Gtk::RESPONSE_CANCEL);
113 add_button(
_(
"Transform"), Gtk::RESPONSE_OK);
152 case MidiModel::NoteDiffCommand::NoteNumber:
153 case MidiModel::NoteDiffCommand::Velocity:
154 spinner.get_adjustment()->set_lower(1);
155 spinner.get_adjustment()->set_upper(127);
156 spinner.get_adjustment()->set_step_increment(1);
157 spinner.get_adjustment()->set_page_increment(10);
158 spinner.set_digits(0);
160 case MidiModel::NoteDiffCommand::StartTime:
161 spinner.get_adjustment()->set_lower(0);
162 spinner.get_adjustment()->set_upper(1024);
163 spinner.get_adjustment()->set_step_increment(0.125);
164 spinner.get_adjustment()->set_page_increment(1.0);
165 spinner.set_digits(2);
167 case MidiModel::NoteDiffCommand::Length:
168 spinner.get_adjustment()->set_lower(1.0 / 64.0);
169 spinner.get_adjustment()->set_upper(32);
170 spinner.get_adjustment()->set_step_increment(1.0 / 64.0);
171 spinner.get_adjustment()->set_page_increment(1.0);
172 spinner.set_digits(2);
174 case MidiModel::NoteDiffCommand::Channel:
175 spinner.get_adjustment()->set_lower(0);
176 spinner.get_adjustment()->set_upper(15);
177 spinner.get_adjustment()->set_step_increment(1);
178 spinner.get_adjustment()->set_page_increment(10);
179 spinner.set_digits(0);
183 std::min(spinner.get_adjustment()->get_upper(),
184 std::max(spinner.get_adjustment()->get_lower(), spinner.get_value())));
190 target_property = prop;
198 Gtk::TreeModel::const_iterator s = source_combo.get_active();
199 const Source source = (*s)[model.source_cols.source];
201 value_spinner.hide();
205 value_spinner.show();
206 property_combo.hide();
208 value_spinner.show();
211 property_combo.hide();
217 value_spinner.show();
220 property_combo.hide();
222 value_spinner.hide();
223 property_combo.hide();
225 value_spinner.hide();
226 property_combo.show();
233 Gtk::TreeModel::const_iterator s = source_combo.get_active();
234 const Source source = (*s)[model.source_cols.source];
236 if (source == Transform::Value::RANDOM) {
239 const double a = value_spinner.get_value();
240 const double b = max_spinner.get_value();
241 const double min = std::min(a, b);
242 const double max = std::max(a, b);
243 const double range = max - min;
252 }
else if (source == Transform::Value::NOWHERE) {
256 const double first = value_spinner.get_value();
257 const double last = max_spinner.get_value();
258 const double rise = last - first;
274 Value val((*s)[model.source_cols.source]);
275 if (val.
source == Transform::Value::THIS_NOTE ||
276 val.
source == Transform::Value::PREV_NOTE) {
277 Gtk::TreeModel::const_iterator p = property_combo.get_active();
278 val.
prop = (*p)[model.property_cols.property];
279 }
else if (val.
source == Transform::Value::LITERAL) {
281 MidiModel::NoteDiffCommand::value_type(target_property),
282 value_spinner.get_value());
289 , value_chooser(model)
297 pack_start(*Gtk::manage(
new Gtk::Label(
" ")),
true,
true);
301 *manage(
new Gtk::Image(Gtk::Stock::REMOVE, Gtk::ICON_SIZE_BUTTON)));
316 Gtk::TreeModel::const_iterator o = operator_combo.get_active();
318 value_chooser.get(ops);
319 ops.push_back(
Operation((*o)[model.operator_cols.op]));
340 const std::vector<Gtk::Widget*>& choosers =
_operations_box.get_children();
341 for (std::vector<Gtk::Widget*>::const_iterator o = choosers.begin();
342 o != choosers.end(); ++o) {