summaryrefslogtreecommitdiff
path: root/muse2/muse/midiedit/scoreedit.cpp
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2011-12-21 17:39:57 +0000
committerFlorian Jung <flo@windfisch.org>2011-12-21 17:39:57 +0000
commit1057d7190242cdf9248671b316a398db805f5f56 (patch)
treeab50268a7db2f80cfb45a7ad6578fe735ab84ce5 /muse2/muse/midiedit/scoreedit.cpp
parent9977c7114089b8708d310268833b83343caa0fd1 (diff)
parentc36a5508aa42e596b005425208054af9a60734b4 (diff)
merged with trunk (that is, pulled the fixes from release_2_0)
only quickly tested, seems okay on the first glance
Diffstat (limited to 'muse2/muse/midiedit/scoreedit.cpp')
-rw-r--r--muse2/muse/midiedit/scoreedit.cpp210
1 files changed, 144 insertions, 66 deletions
diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp
index 2d24fa54..ff1893ce 100644
--- a/muse2/muse/midiedit/scoreedit.cpp
+++ b/muse2/muse/midiedit/scoreedit.cpp
@@ -88,10 +88,6 @@ QString IntToQStr(int i);
-#define APPLY_TO_SELECTED_STRING tr("Apply to selected notes:")
-#define APPLY_TO_NEW_STRING tr("Apply to new notes:")
-
-
//PIXELS_PER_NOTEPOS must be greater or equal to 3*NOTE_XLEN + 2*NOTE_SHIFT
//because if tick 0 is at x=0: the notes can be shifted by NOTE_SHIFT.
//additionally, they can be moved by NOTE_XLEN (collision avoiding)
@@ -170,6 +166,15 @@ QColor* mycolors; // array [NUM_MYCOLORS]
set<QString> ScoreEdit::names;
+int ScoreCanvas::_quant_power2_init=3;
+int ScoreCanvas::_pixels_per_whole_init=300;
+int ScoreCanvas::note_velo_init=64;
+int ScoreCanvas::note_velo_off_init=64;
+int ScoreCanvas::new_len_init=0;
+ScoreCanvas::coloring_mode_t ScoreCanvas::coloring_mode_init=COLOR_MODE_BLACK;
+bool ScoreCanvas::preamble_contains_timesig_init=true;
+bool ScoreCanvas::preamble_contains_keysig_init=true;
+
//---------------------------------------------------------
// ScoreEdit
@@ -223,6 +228,8 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
xscroll->setMinimum(0);
yscroll->setMinimum(0);
+ xscroll->setValue(0);
+ yscroll->setValue(0);
menu_mapper=new QSignalMapper(this);
connect(menu_mapper, SIGNAL(mapped(int)), SLOT(menu_command(int)));
@@ -295,14 +302,28 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
len_actions->addAction(n32_action);
len_actions->addAction(nlast_action);
- nlast_action->setChecked(true);
- menu_command(CMD_NOTELEN_LAST);
+ switch (ScoreCanvas::new_len_init)
+ {
+ case 0: nlast_action->setChecked(true); menu_command(CMD_NOTELEN_LAST); break;
+ case 1: n1_action->setChecked(true); menu_command(CMD_NOTELEN_1); break;
+ case 2: n2_action->setChecked(true); menu_command(CMD_NOTELEN_2); break;
+ case 4: n4_action->setChecked(true); menu_command(CMD_NOTELEN_4); break;
+ case 8: n8_action->setChecked(true); menu_command(CMD_NOTELEN_8); break;
+ case 16: n16_action->setChecked(true); menu_command(CMD_NOTELEN_16); break;
+ case 32: n32_action->setChecked(true); menu_command(CMD_NOTELEN_32); break;
+ default:
+ cerr << "ERROR: THIS SHOULD NEVER HAPPEN. newLen is invalid in ScoreEdit::ScoreEdit.\n" <<
+ " (newLen="<<ScoreCanvas::new_len_init<<"; the only valid values are 0,1,2,4,8,16 and 32)\n" <<
+ " however, don't worry, this is no major problem, using 0 instead" << endl;
+ nlast_action->setChecked(true);
+ menu_command(CMD_NOTELEN_LAST);
+ }
note_settings_toolbar->addSeparator();
- apply_velo_to_label = new QLabel(APPLY_TO_NEW_STRING, note_settings_toolbar);
- int w1 = apply_velo_to_label->fontMetrics().width(APPLY_TO_NEW_STRING);
- int w2 = apply_velo_to_label->fontMetrics().width(APPLY_TO_SELECTED_STRING);
+ apply_velo_to_label = new QLabel(tr("Apply to new notes:"), note_settings_toolbar);
+ int w1 = apply_velo_to_label->fontMetrics().width(tr("Apply to new notes:"));
+ int w2 = apply_velo_to_label->fontMetrics().width(tr("Apply to selected notes:"));
if (w1>w2)
apply_velo_to_label->setFixedWidth(w1+5);
else
@@ -318,7 +339,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
connect(velo_spinbox, SIGNAL(editingFinished()), SLOT(velo_box_changed()));
connect(this,SIGNAL(velo_changed(int)), score_canvas, SLOT(set_velo(int)));
note_settings_toolbar->addWidget(velo_spinbox);
- velo_spinbox->setValue(64);
+ velo_spinbox->setValue(ScoreCanvas::note_velo_init);
note_settings_toolbar->addWidget(new QLabel(tr("Off-Velocity:"), note_settings_toolbar));
velo_off_spinbox = new QSpinBox(this);
@@ -329,7 +350,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
connect(velo_off_spinbox, SIGNAL(editingFinished()), SLOT(velo_off_box_changed()));
connect(this,SIGNAL(velo_off_changed(int)), score_canvas, SLOT(set_velo_off(int)));
note_settings_toolbar->addWidget(velo_off_spinbox);
- velo_off_spinbox->setValue(64);
+ velo_off_spinbox->setValue(ScoreCanvas::note_velo_off_init);
@@ -338,13 +359,16 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
quant_toolbar->addWidget(new QLabel(tr("Quantisation:"), quant_toolbar));
quant_combobox = new QComboBox(this);
quant_combobox->addItem("2"); // if you add or remove items from
- quant_combobox->addItem("4"); // here, also change quant_mapper[]
- quant_combobox->addItem("8"); // in ScoreCanvas::set_quant()!
+ quant_combobox->addItem("4"); // here, also change all code regarding
+ quant_combobox->addItem("8"); // _quant_power2 and _quant_power2_init
quant_combobox->addItem("16"); // and MAX_QUANT_POWER (must be log2(largest_value))
quant_combobox->addItem("32");
+ quant_combobox->setCurrentIndex(score_canvas->quant_power2()-1);
+ // the above is intendedly executed BEFORE connecting. otherwise this would
+ // destroy pixels_per_whole_init!
connect(quant_combobox, SIGNAL(currentIndexChanged(int)), score_canvas, SLOT(set_quant(int)));
quant_toolbar->addWidget(quant_combobox);
- quant_combobox->setCurrentIndex(2);
+
quant_toolbar->addSeparator();
@@ -355,7 +379,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
connect(px_per_whole_spinbox, SIGNAL(valueChanged(int)), score_canvas, SLOT(set_pixels_per_whole(int)));
connect(score_canvas, SIGNAL(pixels_per_whole_changed(int)), px_per_whole_spinbox, SLOT(setValue(int)));
quant_toolbar->addWidget(px_per_whole_spinbox);
- px_per_whole_spinbox->setValue(300);
+ px_per_whole_spinbox->setValue(ScoreCanvas::_pixels_per_whole_init);
QMenu* edit_menu = menuBar()->addMenu(tr("&Edit"));
@@ -456,8 +480,18 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
menu_mapper->setMapping(color_velo_action, CMD_COLOR_VELO);
menu_mapper->setMapping(color_part_action, CMD_COLOR_PART);
- color_black_action->setChecked(true);
- menu_command(CMD_COLOR_BLACK);
+ switch (ScoreCanvas::coloring_mode_init)
+ {
+ case 0: color_black_action->setChecked(true); menu_command(CMD_COLOR_BLACK); break;
+ case 1: color_velo_action->setChecked(true); menu_command(CMD_COLOR_VELO); break;
+ case 2: color_part_action->setChecked(true); menu_command(CMD_COLOR_PART); break;
+ default:
+ cerr << "ERROR: THIS SHOULD NEVER HAPPEN. noteColor is invalid in ScoreEdit::ScoreEdit.\n" <<
+ " (noteColor="<<ScoreCanvas::coloring_mode_init<<"; the only valid values are 0,1 and 2)\n" <<
+ " however, don't worry, this is no major problem, using 0 instead" << endl;
+ color_black_action->setChecked(true);
+ menu_command(CMD_COLOR_BLACK);
+ }
QMenu* preamble_menu = settings_menu->addMenu(tr("Set up &preamble"));
preamble_keysig_action = preamble_menu->addAction(tr("Display &key signature"));
@@ -468,8 +502,8 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
preamble_keysig_action->setCheckable(true);
preamble_timesig_action->setCheckable(true);
- preamble_keysig_action->setChecked(true);
- preamble_timesig_action->setChecked(true);
+ preamble_keysig_action->setChecked(ScoreCanvas::preamble_contains_keysig_init);
+ preamble_timesig_action->setChecked(ScoreCanvas::preamble_contains_timesig_init);
QAction* set_name_action = settings_menu->addAction(tr("Set Score &name"), menu_mapper, SLOT(map()));
menu_mapper->setMapping(set_name_action, CMD_SET_NAME);
@@ -505,6 +539,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
apply_velo=true;
initTopwinState();
+ MusEGlobal::muse->topwinMenuInited(this);
}
void ScoreEdit::init_shortcuts()
@@ -589,7 +624,7 @@ bool ScoreEdit::set_name(QString newname, bool emit_signal, bool emergency_name)
ScoreEdit::~ScoreEdit()
{
-
+ names.erase(name);
}
void ScoreEdit::velo_box_changed()
@@ -604,16 +639,19 @@ void ScoreEdit::velo_off_box_changed()
void ScoreEdit::song_changed(int flags)
{
+ if(_isDeleting) // Ignore while while deleting to prevent crash.
+ return;
+
if (flags & (SC_SELECTION | SC_EVENT_MODIFIED | SC_EVENT_REMOVED))
{
map<MusECore::Event*, MusECore::Part*> selection=get_events(score_canvas->get_all_parts(),1);
if (selection.empty())
{
- apply_velo_to_label->setText(APPLY_TO_NEW_STRING);
+ apply_velo_to_label->setText(tr("Apply to new notes:"));
}
else
{
- apply_velo_to_label->setText(APPLY_TO_SELECTED_STRING);
+ apply_velo_to_label->setText(tr("Apply to selected notes:"));
int velo=-1;
int velo_off=-1;
@@ -659,6 +697,7 @@ void ScoreEdit::canvas_height_changed(int height)
void ScoreEdit::viewport_height_changed(int height)
{
int val=score_canvas->canvas_height() - height;
+ // FINDMICHJETZT canvas_height() is uninitalized!
if (val<0) val=0;
yscroll->setPageStep(height * PAGESTEP);
yscroll->setMaximum(val);
@@ -671,11 +710,14 @@ void ScoreEdit::viewport_height_changed(int height)
void ScoreEdit::closeEvent(QCloseEvent* e)
{
+ _isDeleting = true; // Set flag so certain signals like songChanged, which may cause crash during delete, can be ignored.
+ names.erase(name);
+
QSettings settings("MusE", "MusE-qt");
//settings.setValue("ScoreEdit/geometry", saveGeometry());
settings.setValue("ScoreEdit/windowState", saveState());
- emit deleted(static_cast<TopWin*>(this));
+ emit isDeleting(static_cast<TopWin*>(this));
e->accept();
}
@@ -688,8 +730,8 @@ void ScoreEdit::menu_command(int cmd)
{
bool ok;
QString newname = QInputDialog::getText(this, tr("Enter the new score title"),
- tr("Enter the new score title"), QLineEdit::Normal,
- name, &ok);
+ tr("Enter the new score title"), QLineEdit::Normal,
+ name, &ok);
if (ok)
{
if (!set_name(newname))
@@ -1055,7 +1097,23 @@ void ScoreEdit::read_configuration(MusECore::Xml& xml)
switch (token)
{
case MusECore::Xml::TagStart:
- if (tag == "topwin")
+ if (tag=="quantPowerInit")
+ ScoreCanvas::_quant_power2_init=xml.parseInt();
+ else if (tag=="pxPerWholeInit")
+ ScoreCanvas::_pixels_per_whole_init=xml.parseInt();
+ else if (tag=="newNoteVeloInit")
+ ScoreCanvas::note_velo_init=xml.parseInt();
+ else if (tag=="newNoteVeloOffInit")
+ ScoreCanvas::note_velo_off_init=xml.parseInt();
+ else if (tag=="newLenInit")
+ ScoreCanvas::new_len_init=xml.parseInt();
+ else if (tag=="noteColorInit")
+ ScoreCanvas::coloring_mode_init=(ScoreCanvas::coloring_mode_t)xml.parseInt();
+ else if (tag=="preambleContainsKeysig")
+ ScoreCanvas::preamble_contains_keysig_init=xml.parseInt();
+ else if (tag=="preambleContainsTimesig")
+ ScoreCanvas::preamble_contains_timesig_init=xml.parseInt();
+ else if (tag == "topwin")
TopWin::readConfiguration(SCORE, xml);
else
xml.unknown("ScoreEdit");
@@ -1075,7 +1133,18 @@ void ScoreEdit::read_configuration(MusECore::Xml& xml)
void ScoreEdit::write_configuration(int level, MusECore::Xml& xml)
{
xml.tag(level++, "scoreedit");
+
+ xml.intTag(level, "quantPowerInit", ScoreCanvas::_quant_power2_init);
+ xml.intTag(level, "pxPerWholeInit", ScoreCanvas::_pixels_per_whole_init);
+ xml.intTag(level, "newNoteVeloInit", ScoreCanvas::note_velo_init);
+ xml.intTag(level, "newNoteVeloOffInit", ScoreCanvas::note_velo_off_init);
+ xml.intTag(level, "newLenInit", ScoreCanvas::new_len_init);
+ xml.intTag(level, "noteColorInit", ScoreCanvas::coloring_mode_init);
+ xml.intTag(level, "preambleContainsKeysig", ScoreCanvas::preamble_contains_keysig_init);
+ xml.intTag(level, "preambleContainsTimesig", ScoreCanvas::preamble_contains_timesig_init);
+
TopWin::writeConfiguration(SCORE, level, xml);
+
xml.etag(level, "scoreedit");
}
@@ -1212,22 +1281,20 @@ ScoreCanvas::ScoreCanvas(ScoreEdit* pr, QWidget* parent_widget) : View(parent_wi
dragged_event_part=NULL;
last_len=384;
- new_len=-1;
+ new_len=-1; // will be initalized with new_len_init by ScoreEdit::ScoreEdit();
- set_quant(2); //this is actually unneccessary, as while
- //initalizing the quant_combobox, this gets
- //called again. but for safety...
- set_pixels_per_whole(300); //same as above. but safety rocks
+ _quant_power2=_quant_power2_init; // ScoreEdit relies on this to be done!
+ _pixels_per_whole_init = _pixels_per_whole_init;
- set_velo(64);
- set_velo_off(64);
+ note_velo=note_velo_init;
+ note_velo_off_init=note_velo_off_init;
dragging_staff=false;
- coloring_mode=COLOR_MODE_BLACK;
- preamble_contains_keysig=true;
- preamble_contains_timesig=true;
+ coloring_mode=coloring_mode_init;
+ preamble_contains_keysig=preamble_contains_keysig_init;
+ preamble_contains_timesig=preamble_contains_timesig_init;
x_scroll_speed=0;
@@ -1454,6 +1521,9 @@ void ScoreCanvas::fully_recalculate()
void ScoreCanvas::song_changed(int flags)
{
+ if(parent && parent->deleting()) // Ignore while while deleting to prevent crash.
+ return;
+
if (flags & (SC_PART_MODIFIED | SC_PART_REMOVED | SC_PART_INSERTED | SC_TRACK_REMOVED))
{
update_parts();
@@ -1503,7 +1573,7 @@ int ScoreCanvas::canvas_width()
int ScoreCanvas::canvas_height()
{
- return staves.rbegin()->y_bottom;
+ return staves.empty() ? 0 : staves.rbegin()->y_bottom;
}
int ScoreCanvas::viewport_width()
@@ -1532,7 +1602,7 @@ void color_image(QImage& img, const QColor& color)
{
uchar* ptr=img.bits();
//int bytes=img.byteCount();
- int bytes=img.bytesPerLine() * img.height(); // By Tim. For older Qt versions. Tested OK on Qt4.5.
+ int bytes=img.bytesPerLine() * img.height(); // By Tim. For older Qt versions. Tested OK on Qt4.5.
int r,g,b;
color.getRgb(&r,&g,&b);
@@ -2793,6 +2863,7 @@ void ScoreCanvas::draw_note_lines(QPainter& p, int y, bool reserve_akkolade_spac
{
int xbegin = reserve_akkolade_space ? AKKOLADE_LEFTMARGIN+AKKOLADE_WIDTH+AKKOLADE_RIGHTMARGIN : 0;
int xend=width();
+ // FINDMICHJETZT y is uninitalized!
p.setPen(Qt::black);
@@ -4183,7 +4254,7 @@ void ScoreCanvas::pos_changed(int index, unsigned tick, bool scroll)
{
switch (MusEGlobal::song->follow())
{
- case MusECore::Song::NO: break;
+ case MusECore::Song::NO: break;
case MusECore::Song::JUMP: goto_tick(tick,false); break;
case MusECore::Song::CONTINUOUS: goto_tick(tick,true); break;
}
@@ -4277,16 +4348,16 @@ void ScoreCanvas::menu_command(int cmd)
{
switch (cmd)
{
- case CMD_COLOR_BLACK: coloring_mode=COLOR_MODE_BLACK; redraw(); break;
- case CMD_COLOR_PART: coloring_mode=COLOR_MODE_PART; redraw(); break;
- case CMD_COLOR_VELO: coloring_mode=COLOR_MODE_VELO; redraw(); break;
- case CMD_NOTELEN_1: new_len=TICKS_PER_WHOLE/ 1; break;
- case CMD_NOTELEN_2: new_len=TICKS_PER_WHOLE/ 2; break;
- case CMD_NOTELEN_4: new_len=TICKS_PER_WHOLE/ 4; break;
- case CMD_NOTELEN_8: new_len=TICKS_PER_WHOLE/ 8; break;
- case CMD_NOTELEN_16: new_len=TICKS_PER_WHOLE/16; break;
- case CMD_NOTELEN_32: new_len=TICKS_PER_WHOLE/32; break;
- case CMD_NOTELEN_LAST: new_len=-1; break;
+ case CMD_COLOR_BLACK: coloring_mode_init=coloring_mode=COLOR_MODE_BLACK; redraw(); break;
+ case CMD_COLOR_PART: coloring_mode_init=coloring_mode=COLOR_MODE_PART; redraw(); break;
+ case CMD_COLOR_VELO: coloring_mode_init=coloring_mode=COLOR_MODE_VELO; redraw(); break;
+ case CMD_NOTELEN_1: new_len_init= 1; new_len=TICKS_PER_WHOLE/ 1; break;
+ case CMD_NOTELEN_2: new_len_init= 2; new_len=TICKS_PER_WHOLE/ 2; break;
+ case CMD_NOTELEN_4: new_len_init= 4; new_len=TICKS_PER_WHOLE/ 4; break;
+ case CMD_NOTELEN_8: new_len_init= 8; new_len=TICKS_PER_WHOLE/ 8; break;
+ case CMD_NOTELEN_16: new_len_init=16; new_len=TICKS_PER_WHOLE/16; break;
+ case CMD_NOTELEN_32: new_len_init=32; new_len=TICKS_PER_WHOLE/32; break;
+ case CMD_NOTELEN_LAST: new_len_init= 0; new_len=-1; break;
default:
cerr << "ERROR: ILLEGAL FUNCTION CALL: ScoreCanvas::menu_command called with unknown command ("<<cmd<<")"<<endl;
@@ -4296,23 +4367,24 @@ void ScoreCanvas::menu_command(int cmd)
void ScoreCanvas::preamble_keysig_slot(bool state)
{
preamble_contains_keysig=state;
+ preamble_contains_keysig_init=state;
redraw();
}
void ScoreCanvas::preamble_timesig_slot(bool state)
{
preamble_contains_timesig=state;
+ preamble_contains_timesig_init=state;
redraw();
}
void ScoreCanvas::set_quant(int val)
{
- int quant_mapper[]={1,2,3,4,5};
-
- if ((val>=0) && (val<signed(sizeof(quant_mapper)/sizeof(*quant_mapper))))
+ if ((val>=0) && (val<5))
{
int old_len=quant_len();
- _quant_power2=quant_mapper[val];
+ _quant_power2=val+1;
+ _quant_power2_init=_quant_power2;
set_pixels_per_whole(pixels_per_whole() * quant_len() / old_len );
@@ -4339,6 +4411,7 @@ void ScoreCanvas::set_pixels_per_whole(int val)
// zero!)
_pixels_per_whole=val;
+ _pixels_per_whole_init=val;
for (list<staff_t>::iterator it=staves.begin(); it!=staves.end(); it++)
it->calc_item_pos();
@@ -4380,6 +4453,7 @@ void ScoreCanvas::maybe_close_if_empty()
void ScoreCanvas::set_velo(int velo)
{
note_velo=velo;
+ note_velo_init=velo;
if (parent->get_apply_velo())
modify_velocity(get_all_parts(),1, 0,velo);
@@ -4388,6 +4462,7 @@ void ScoreCanvas::set_velo(int velo)
void ScoreCanvas::set_velo_off(int velo)
{
note_velo_off=velo;
+ note_velo_off_init=velo;
if (parent->get_apply_velo())
modify_off_velocity(get_all_parts(),1, 0,velo);
@@ -4583,13 +4658,9 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
/* BUGS and potential bugs
* o tied notes don't work properly when there's a key-change in
* between, for example, when a cis is tied to a des
- * o schedule_all_same_len_parts: if there are two clones A and B,
- * and both A and B get scheduled to be expanded (because we
- * have one event from A and one event from B), this causes a bug,
- * because after A (and B) got resized, the B-resize is invalid!
- * o when changing toolbarstate when sharing and immediately after that
+ * > o when changing toolbarstate when sharing and immediately after that
* changing "share" status, the changed state isn't stored
- * o arranger state and mixer state aren't stored (says tim)
+ * (could be solved by storing the current window when quitting/saving whatever)
* ? pasting in editors sometimes fails oO? ( ERROR: reading eventlist
* from clipboard failed. ignoring this one... ) [ not reproducible ]
*
@@ -4597,9 +4668,16 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
* o drum controllers
* update ctrlcanvas/panel
* test!
+ * o drum editor is buggy. propagate_drum_map may operate on old values
+ * ("BUGGY! problem is: while changing entries, ourDrumMap
+ may be reallocated which causes abort()s and/or bugs.")
* o don't mix DRUM and NEW_DRUM in drumeditor!
+ * o quantize must round UP, not down when at 0.5
* o my record flag handling
* o option for disabling old-style / new-style drum tracks?
+ * ! o using super glue while a score editor displaying the glued parts
+ * is open lets muse segfault. this may or may not be fixed in
+ * the release branch :/
*
* > o drum editor: channel-stuff
* o clearly state in the changelog: when having multiple drumeditors open,
@@ -4611,6 +4689,11 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
* ask the user if he wants to proceed, and then set maintained_automatically to false
* o offer some way to set maintained_automatically to true again
* o move generation and deletion of ourDrumMap from DCanvas to DrumEditor and remove ugly wrapper functions
+ * > o fix valgrind problems (the two "FINDMICHJETZT" lines in scoreedit.cpp)
+ * > o add a songposition scrollbar-toolbar (in different sizes)
+ * this might be equivalent to "redo transport menu" (below).
+ * > o add toolbar(s) for tempo- etc spinboxes from the transport window
+ *
*
* o find and fix FINDMICHJETZT
* o fix all segfaults and non-working stuff!
@@ -4626,9 +4709,9 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
* o all places where i added doubleclick-edits: only react on left-click double clicks!
* o support "new style" reordering with old style drum tracks as well
* (not swapping but inserting!)
+ * o support edge-scrolling when opening a lasso
* o add "dotted quarter" quantize option (for 6/8 beat)
* o ticks-to-quarter spinboxes
- * o newly created windows have to be focussed!
* o mirror most menus to an additional right-click context menu to avoid the long mouse pointer
* journey to the menu bar. try to find a way which does not involve duplicate code!
* o implement borland-style maximize: free windows do not cover the main menu, even when maximized
@@ -4651,6 +4734,7 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
* o thin out: remove unneeded ctrl messages
*
* less important stuff
+ * o allow "fixating" toolbars?
* o quantize-templates (everything is forced into a specified
* rhythm)
* o part-templates (you specify some notes and a control-chord;
@@ -4662,8 +4746,6 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
* calc_pos_add_list must be called before calc_item_pos then,
* and calc_item_pos must respect the pos_add_list instead of
* keeping its own pos_add variable (which is only an optimisation)
- * o support edge-scrolling when opening a lasso
- * o save more configuration stuff (quant, color)
*
* really unimportant nice-to-haves
* o support in-song clef-changes
@@ -4676,10 +4758,6 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
*
*
* stuff for the other muse developers
- * o update translations
- * o remove ambiguous translation: "offset"="zeitversatz"
- * this is ambigous in mod. note len and WRONG in mod. velo dialogs
- *
* o process accurate timesignatures from muse's list (has to be implemented first in muse)
* ( (2+2+3)/4 or (3+2+2)/4 instead of 7/4 )
*/