26 : InspectorWidgetDelegate_T{obj, parent}
27 , m_dispatcher{doc.commandStack}
34 m_channel.setRange(1, 16);
35 m_lanes.setRange(1, 127);
36 m_length.setRange(1, Pattern::maxLength);
37 m_rate.setRange(1, 64);
38 m_rate.setPrefix(QStringLiteral(
"1/"));
39 m_rate.setToolTip(tr(
"Steps per whole note"));
40 for(
auto box : {&m_channel, &m_lanes, &m_length, &m_rate})
41 box->setKeyboardTracking(
false);
43 m_labels.addItem(tr(
"Note and number"), int(LaneLabels::NameAndNumber));
44 m_labels.addItem(tr(
"Note name"), int(LaneLabels::Name));
45 m_labels.addItem(tr(
"MIDI number"), int(LaneLabels::Number));
46 m_labels.addItem(tr(
"General MIDI drum"), int(LaneLabels::DrumName));
48 auto lay =
new QFormLayout{
this};
49 lay->addRow(tr(
"Channel"), &m_channel);
50 lay->addRow(tr(
"Lanes"), &m_lanes);
51 lay->addRow(tr(
"Steps"), &m_length);
52 lay->addRow(tr(
"Rate"), &m_rate);
53 lay->addRow(tr(
"Labels"), &m_labels);
57 con(obj, &ProcessModel::channelChanged,
this, [
this] { updateFromModel(); });
58 con(obj, &ProcessModel::currentPatternChanged,
this, [
this] { updateFromModel(); });
59 con(obj, &ProcessModel::patternsChanged,
this, [
this] { updateFromModel(); });
60 con(obj, &ProcessModel::laneLabelsChanged,
this, [
this] { updateFromModel(); });
62 con(m_channel, qOverload<int>(&QSpinBox::valueChanged),
this, [
this](
int v) {
63 if(v != process().channel())
64 m_dispatcher.submit<SetPatternChannel>(process(), v);
67 con(m_lanes, qOverload<int>(&QSpinBox::valueChanged),
this, [
this](
int n) {
69 if(n <
int(p.lanes.size()))
71 while(
int(p.lanes.size()) < n)
76 con(m_length, qOverload<int>(&QSpinBox::valueChanged),
this,
77 [
this](
int n) { editPattern([n](
Pattern& p) { setLength(p, n); }); });
79 con(m_rate, qOverload<int>(&QSpinBox::valueChanged),
this,
80 [
this](
int n) { editPattern([n](
Pattern& p) { p.division = n; }); });
82 con(m_labels, qOverload<int>(&QComboBox::currentIndexChanged),
this, [
this](
int) {
83 const auto l = LaneLabels(m_labels.currentData().toInt());
84 if(l != process().laneLabels())
85 m_dispatcher.submit<SetLaneLabels>(process(), l);
93 const auto& obj = process();
94 if(!ossia::valid_index(obj.currentPattern(), obj.patterns()))
96 auto p = obj.patterns()[obj.currentPattern()];
99 if(p != obj.patterns()[obj.currentPattern()])
100 m_dispatcher.submit<
UpdatePattern>(obj, obj.currentPattern(), p);
103 void updateFromModel()
105 const auto& obj = process();
106 QSignalBlocker b0{m_channel}, b1{m_lanes}, b2{m_length}, b3{m_rate}, b4{m_labels};
107 m_channel.setValue(obj.channel());
108 m_labels.setCurrentIndex(m_labels.findData(
int(obj.laneLabels())));
110 const bool valid = ossia::valid_index(obj.currentPattern(), obj.patterns());
111 for(
auto box : {&m_lanes, &m_length, &m_rate})
112 box->setEnabled(valid);
115 const Pattern& pat = obj.patterns()[obj.currentPattern()];
116 m_lanes.setValue(pat.lanes.size());
117 m_length.setValue(pat.length);
118 m_rate.setValue(pat.division);
Definition DocumentContext.hpp:18