noteEditorHandlers.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. /*
  2. This file is part of QTau
  3. Copyright (C) 2013-2018 Tobias "Tomoko" Platen <tplaten@posteo.de>
  4. Copyright (C) 2013 digited <https://github.com/digited>
  5. Copyright (C) 2010-2013 HAL@ShurabaP <https://github.com/haruneko>
  6. QTau is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation, either version 3 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. SPDX-License-Identifier: GPL-3.0+
  17. */
  18. #ifndef NOTEEDITORHANDLERS_H
  19. #define NOTEEDITORHANDLERS_H
  20. #include "Utils.h"
  21. #include "ui/Config.h"
  22. class qtauEvent;
  23. class qtauNoteEditor;
  24. class qtauEvent_NoteAddition;
  25. class qtauEvent_NoteMove;
  26. class qtauEvent_NoteResize;
  27. class qtauEvent_NoteText;
  28. class qtauEvent_NoteEffect;
  29. class QLineEdit;
  30. class QMouseEvent;
  31. static const int textInputWidth = 100;
  32. /// default controller for note editor
  33. class qtauEdController : public QObject
  34. {
  35. Q_OBJECT
  36. friend class qtauNoteEditor;
  37. public:
  38. qtauEdController(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts, qne::editorState &st) :
  39. _owner(&ne), _setup(&ns), _notes(&nts), _state(&st), _edit(0), _pointedNote(0), _absFirstClickPos(-1,-1),
  40. _rmbDragging(false), _idOffset(0) {}
  41. qtauEdController(qtauEdController *c) :
  42. _owner(c->_owner), _setup(c->_setup), _notes(c->_notes), _state(c->_state), _edit(c->_edit),
  43. _pointedNote(c->_pointedNote), _absFirstClickPos(c->_absFirstClickPos), _rmbDragging(false),
  44. _idOffset(c->_idOffset) {}
  45. virtual ~qtauEdController() {}
  46. void onEvent(qtauEvent *e);
  47. void deleteSelected();
  48. protected:
  49. qtauNoteEditor *_owner;
  50. SNoteSetup *_setup;
  51. qne::editorNotes *_notes;
  52. qne::editorState *_state;
  53. QLineEdit *_edit; // should be alive after deleting text controller - may receive buffered event
  54. qne::editorNote *_pointedNote;
  55. QPoint _absFirstClickPos;
  56. qne::editorNote *noteInPoint(const QPoint &p);
  57. virtual void init() {}
  58. virtual void reset() {} // called when event happens - current editing activity should be halted
  59. virtual void cleanup() {} // called when changing controllers - should check if stopped its activity
  60. inline void addToGrid(int noteCoord, quint64 id)
  61. {
  62. int bar = noteCoord / _setup->barWidth;
  63. if (bar >= _notes->grid.size())
  64. _notes->grid.resize(bar + 10);
  65. if (_notes->grid[bar].indexOf(id) == -1)
  66. _notes->grid[bar].append(id);
  67. }
  68. inline void removeFromGrid(int noteCoord, quint64 id)
  69. {
  70. int bar = noteCoord / _setup->barWidth;
  71. if (bar < _notes->grid.size())
  72. {
  73. int i = _notes->grid[bar].indexOf(id);
  74. if (i >= 0)
  75. _notes->grid[bar].remove(i);
  76. }
  77. }
  78. inline void unselectAll()
  79. {
  80. foreach (const quint64 &id, _notes->selected)
  81. _notes->idMap[id].selected = false;
  82. _notes->selected.clear();
  83. }
  84. inline void updateModelData(qne::editorNote &n)
  85. {
  86. float pixelToPulses = 480.f / _setup->note.width();
  87. n.pulseLength = n.r.width() * pixelToPulses + 0.001;
  88. n.pulseOffset = n.r.left() * pixelToPulses + 0.001;
  89. int totalKeys = (_setup->baseOctave + _setup->numOctaves - 1) * 12;
  90. int screenKeyInd = n.r.y() / _setup->note.height();
  91. n.keyNumber = totalKeys - screenKeyInd-1;
  92. }
  93. // just because friends aren't inherited ---------
  94. void changeController(qtauEdController *c);
  95. void eventHappened (qtauEvent *e);
  96. void recalcNoteRects();
  97. void lazyUpdate();
  98. //------------------------------------------------
  99. virtual void mouseDoubleClickEvent(QMouseEvent*);
  100. virtual void mouseMoveEvent (QMouseEvent*);
  101. virtual void mousePressEvent (QMouseEvent*);
  102. virtual void mouseReleaseEvent (QMouseEvent*);
  103. // what happens in session and needs to be reflected in editor
  104. void onNoteAdd (qtauEvent_NoteAddition *event);
  105. void onNoteResize(qtauEvent_NoteResize *event);
  106. void onNoteMove (qtauEvent_NoteMove *event);
  107. void onNoteText (qtauEvent_NoteText *event);
  108. void onNoteEffect(qtauEvent_NoteEffect *event);
  109. QPoint _rmbScrollStartPos;
  110. QPoint _rmbStartVpOffset;
  111. bool _rmbDragging;
  112. quint64 _idOffset;
  113. };
  114. /// mouse handler for changing phoneme/lyrics in note(s)
  115. class qtauEd_TextInput : public qtauEdController
  116. {
  117. Q_OBJECT
  118. public:
  119. qtauEd_TextInput(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts, qne::editorState &st);
  120. qtauEd_TextInput(qtauEdController *c);
  121. ~qtauEd_TextInput();
  122. bool getEditingNote() const;
  123. void setEditingNote(bool value);
  124. protected:
  125. void reset() override;
  126. void cleanup() override;
  127. void init() override;
  128. bool _managedOnEdited; // if onEdited() is called manually and need a different controller next
  129. bool _editingNote;
  130. qne::editorNote *_editedNote;
  131. protected slots:
  132. void onEdited();
  133. void unfocus();
  134. bool eventFilter(QObject *obj, QEvent *event) override;
  135. };
  136. /// mouse handler for note selection with rectangle
  137. class qtauEd_SelectRect : public qtauEdController
  138. {
  139. Q_OBJECT
  140. public:
  141. qtauEd_SelectRect(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts, qne::editorState &st);
  142. qtauEd_SelectRect(qtauEdController *c);
  143. ~qtauEd_SelectRect();
  144. protected:
  145. void mouseMoveEvent (QMouseEvent*) override;
  146. void mouseReleaseEvent(QMouseEvent*) override;
  147. void mouseDoubleClickEvent(QMouseEvent*) override { changeController(new qtauEdController(this)); }
  148. void mousePressEvent (QMouseEvent*) override { changeController(new qtauEdController(this)); }
  149. void reset() override;
  150. };
  151. /// mouse handler for dragging note(s) when pressing lmb
  152. class qtauEd_DragNotes : public qtauEdController
  153. {
  154. Q_OBJECT
  155. public:
  156. qtauEd_DragNotes(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts, qne::editorState &st);
  157. qtauEd_DragNotes(qtauEdController *c);
  158. ~qtauEd_DragNotes();
  159. protected:
  160. void mouseMoveEvent (QMouseEvent*) override;
  161. void mouseReleaseEvent(QMouseEvent*) override;
  162. void mouseDoubleClickEvent(QMouseEvent*) override { changeController(new qtauEdController(this)); }
  163. void mousePressEvent (QMouseEvent*) override { changeController(new qtauEdController(this)); }
  164. void init() override;
  165. void reset() override;
  166. qne::editorNote *_mainMovedNote;
  167. QVector<QRect> _selRects;
  168. QRect _selBounds;
  169. };
  170. /// mouse handler for resizing notes by dragging their left/right borders
  171. class qtauEd_ResizeNote : public qtauEdController
  172. {
  173. Q_OBJECT
  174. public:
  175. qtauEd_ResizeNote(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts, qne::editorState &st, bool left);
  176. qtauEd_ResizeNote(qtauEdController *c, bool left);
  177. ~qtauEd_ResizeNote();
  178. protected:
  179. void mouseMoveEvent (QMouseEvent*) override;
  180. void mouseReleaseEvent(QMouseEvent*) override;
  181. void mouseDoubleClickEvent(QMouseEvent*) override { changeController(new qtauEdController(this)); }
  182. void mousePressEvent (QMouseEvent*) override { changeController(new qtauEdController(this)); }
  183. void init() override;
  184. void reset() override;
  185. qne::editorNote *_editedNote;
  186. bool _toLeft; // if should resize to left direction (move beginning) or to right (move end)
  187. int _minNoteWidth;
  188. QRect _originalRect;
  189. };
  190. /// mouse handler for adding notes with mouse drag
  191. class qtauEd_AddNote : public qtauEdController
  192. {
  193. Q_OBJECT
  194. public:
  195. qtauEd_AddNote(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts, qne::editorState &st);
  196. qtauEd_AddNote(qtauEdController *c);
  197. ~qtauEd_AddNote();
  198. protected:
  199. void mouseMoveEvent (QMouseEvent*) override;
  200. void mouseReleaseEvent(QMouseEvent*) override;
  201. void mouseDoubleClickEvent(QMouseEvent*) override { changeController(new qtauEdController(this)); }
  202. void mousePressEvent (QMouseEvent*) override { changeController(new qtauEdController(this)); }
  203. void init() override;
  204. void reset() override;
  205. qne::editorNote *_editedNote;
  206. int _minOffset;
  207. };
  208. #endif // NOTEEDITORHANDLERS_H