|
From: Tapio V. <aa...@us...> - 2011-02-01 20:00:15
|
Module: editor
Branch: master
Commit: a09c9f9867d14d65ad257d9b460a487fe76d2abd
Author: Tapio Vierros <tap...@gm...>
Date: Tue Feb 1 21:55:50 2011 +0200
Prepare for selecting multiple notes.
* Currently selected NoteLabels are "doubly linked"
* List maintaining is implemented, but not properly tested
* UI is ready for multiple note selection by not showing anything then
---
editorapp.cc | 3 ++-
notegraphwidget.cc | 23 +++++++++++++++++++----
notegraphwidget.hh | 2 +-
notelabel.cc | 6 +++---
notelabel.hh | 8 ++++++++
5 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/editorapp.cc b/editorapp.cc
index 3811cff..b5b3680 100644
--- a/editorapp.cc
+++ b/editorapp.cc
@@ -146,7 +146,8 @@ void EditorApp::updateMenuStates()
void EditorApp::updateNoteInfo(NoteLabel *note)
{
- if (note) {
+ // For now we disable all controls when multiple notes are selected
+ if (note && !note->nextSelected) {
MusicalScale ms;
ui.valNoteBegin->setText(QString::number(note->note().begin, 'f', 2) + tr(" s"));
ui.valNoteEnd->setText(QString::number(note->note().end, 'f', 2) + tr(" s"));
diff --git a/notegraphwidget.cc b/notegraphwidget.cc
index 4f34b87..f2f1606 100644
--- a/notegraphwidget.cc
+++ b/notegraphwidget.cc
@@ -44,12 +44,27 @@ NoteGraphWidget::NoteGraphWidget(QWidget *parent)
updateNotes();
}
-void NoteGraphWidget::selectNote(NoteLabel* note)
+void NoteGraphWidget::selectNote(NoteLabel* note, bool clearPrevious)
{
- if (m_selectedNote) // Reset old pixmap
- m_selectedNote->setSelected(false);
+ if (!note) clearPrevious = true; // NULL means allways clear all
- // Assign new selection
+ if (m_selectedNote) {
+ m_selectedNote->setSelected(false); // Pixmap reset
+ // Clear all selections
+ if (clearPrevious) {
+ // Assumes m_selectedNote is the first note in the selection chain
+ for (NoteLabel* n = m_selectedNote; n; n = n->nextSelected)
+ n->setSelected(false);
+ } else {
+ // Add at the beginning of the chain
+ if (note && note != m_selectedNote && !note->isSelected()) {
+ m_selectedNote->prevSelected = note;
+ note->nextSelected = m_selectedNote;
+ }
+ }
+ }
+
+ // Assign new selection as the first selected note
m_selectedNote = note;
if (m_selectedNote) {
m_selectedNote->setSelected();
diff --git a/notegraphwidget.hh b/notegraphwidget.hh
index c637a62..bfcef9d 100644
--- a/notegraphwidget.hh
+++ b/notegraphwidget.hh
@@ -42,7 +42,7 @@ public:
void stopMusic();
void seek(int x);
- void selectNote(NoteLabel *note);
+ void selectNote(NoteLabel *note, bool clearPrevious = true);
NoteLabel* selectedNote() const { return m_selectedNote; }
void split(NoteLabel *note, float ratio = 0.5f);
void del(NoteLabel *note);
diff --git a/notelabel.cc b/notelabel.cc
index b006831..cc6f7e7 100644
--- a/notelabel.cc
+++ b/notelabel.cc
@@ -16,7 +16,7 @@ const int NoteLabel::min_width = 10; // How many pixels is the resize area
const int NoteLabel::default_size = 100; // The preferred size of notes
NoteLabel::NoteLabel(const Note ¬e, QWidget *parent, const QPoint &position, const QSize &size, bool floating)
- : QLabel(parent), m_note(note), m_selected(false), m_floating(floating), m_resizing(0), m_hotspot()
+ : QLabel(parent), m_note(note), m_selected(false), m_floating(floating), m_resizing(0), m_hotspot(), nextSelected(), prevSelected()
{
createPixmap(size);
if (!position.isNull())
@@ -48,7 +48,7 @@ void NoteLabel::createPixmap(QSize size)
QLinearGradient gradient(0, 0, 0, image.height()-1);
float ff = m_floating ? 1.0f : 0.6f;
- int alpha = m_floating ? 160 : ( m_selected ? 80 : 220 );
+ int alpha = m_floating ? 160 : ( isSelected() ? 80 : 220 );
gradient.setColorAt(0.0, m_floating ? QColor(255, 255, 255, alpha) : QColor(50, 50, 50, alpha));
if (m_note.type == Note::NORMAL) {
gradient.setColorAt(0.2, QColor(100 * ff, 100 * ff, 255 * ff, alpha));
@@ -67,7 +67,7 @@ void NoteLabel::createPixmap(QSize size)
QPainter painter;
painter.begin(&image);
painter.setRenderHint(QPainter::Antialiasing);
- painter.setPen(m_selected ? Qt::red : Qt::black); // Hilight selected note
+ painter.setPen(isSelected() ? Qt::red : Qt::black); // Hilight selected note
painter.setBrush(gradient);
painter.drawRoundedRect(QRectF(0.5, 0.5, image.width()-1, image.height()-1), 8, 8);
diff --git a/notelabel.hh b/notelabel.hh
index ff68456..f58a270 100644
--- a/notelabel.hh
+++ b/notelabel.hh
@@ -18,9 +18,14 @@ public:
QString lyric() const { return m_note.syllable; }
void setLyric(const QString &text) { m_note.syllable = text; createPixmap(size()); }
+ bool isSelected() const { return m_selected; }
void setSelected(bool state = true) {
if (m_selected != state) {
m_selected = state; createPixmap(size());
+ if (!m_selected) {
+ if (nextSelected) nextSelected->prevSelected = prevSelected;
+ if (prevSelected) prevSelected->nextSelected = nextSelected;
+ }
}
}
@@ -39,6 +44,9 @@ public:
bool operator<(const NoteLabel &rhs) const { return x() < rhs.x(); }
+ NoteLabel* nextSelected;
+ NoteLabel* prevSelected;
+
public slots:
void showContextMenu(const QPoint &pos);
|