noteEditorHandlers.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  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. //XXX 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. Q_OBJECT
  35. friend class qtauNoteEditor;
  36. public:
  37. qtauEdController(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts,
  38. qne::editorState &st)
  39. : _owner(&ne),
  40. _setup(&ns),
  41. _notes(&nts),
  42. _state(&st),
  43. _edit(0),
  44. _pointedNote(0),
  45. _absFirstClickPos(-1, -1),
  46. _rmbDragging(false),
  47. _idOffset(0) {}
  48. qtauEdController(qtauEdController *c)
  49. : _owner(c->_owner),
  50. _setup(c->_setup),
  51. _notes(c->_notes),
  52. _state(c->_state),
  53. _edit(c->_edit),
  54. _pointedNote(c->_pointedNote),
  55. _absFirstClickPos(c->_absFirstClickPos),
  56. _rmbDragging(false),
  57. _idOffset(c->_idOffset) {}
  58. virtual ~qtauEdController() {}
  59. void onEvent(qtauEvent *e);
  60. void deleteSelected();
  61. protected:
  62. qtauNoteEditor *_owner;
  63. SNoteSetup *_setup;
  64. qne::editorNotes *_notes;
  65. qne::editorState *_state;
  66. QLineEdit *_edit; // should be alive after deleting text controller - may
  67. // receive buffered event
  68. qne::editorNote *_pointedNote;
  69. QPoint _absFirstClickPos;
  70. qne::editorNote *noteInPoint(const QPoint &p);
  71. virtual void init() {}
  72. virtual void reset() {
  73. } // called when event happens - current editing activity should be halted
  74. virtual void cleanup() {
  75. } // called when changing controllers - should check if stopped its activity
  76. inline void addToGrid(int noteCoord, quint64 id) {
  77. int bar = _setup->getBarForScreenOffset(noteCoord);
  78. if (bar == -1) return;
  79. if (bar >= _notes->grid.size()) _notes->grid.resize(bar + 10);
  80. if (_notes->grid[bar].indexOf(id) == -1) _notes->grid[bar].append(id);
  81. }
  82. inline void removeFromGrid(int noteCoord, quint64 id) {
  83. int bar = _setup->getBarForScreenOffset(noteCoord);
  84. if (bar == -1) return;
  85. if (bar < _notes->grid.size()) {
  86. int i = _notes->grid[bar].indexOf(id);
  87. if (i >= 0) _notes->grid[bar].remove(i);
  88. }
  89. }
  90. inline void unselectAll() {
  91. foreach (const quint64 &id, _notes->selected)
  92. _notes->idMap[id].selected = false;
  93. _notes->selected.clear();
  94. }
  95. inline void updateModelData(qne::editorNote &n) {
  96. float pixelToPulses = 480.f / _setup->note.width();
  97. n.pulseLength = n.r.width() * pixelToPulses + 0.001;
  98. n.pulseOffset = n.r.left() * pixelToPulses + 0.001;
  99. int totalKeys = (_setup->baseOctave + _setup->numOctaves - 1) * 12;
  100. int screenKeyInd = n.r.y() / _setup->note.height();
  101. n.keyNumber = totalKeys - screenKeyInd - 1;
  102. }
  103. // just because friends aren't inherited ---------
  104. void changeController(qtauEdController *c);
  105. void eventHappened(qtauEvent *e);
  106. void recalcNoteRects();
  107. void lazyUpdate();
  108. void updateDyntableModel();
  109. //------------------------------------------------
  110. virtual void mouseDoubleClickEvent(QMouseEvent *);
  111. virtual void mouseMoveEvent(QMouseEvent *);
  112. virtual void mousePressEvent(QMouseEvent *);
  113. virtual void mouseReleaseEvent(QMouseEvent *);
  114. // what happens in session and needs to be reflected in editor
  115. void onNoteAdd(qtauEvent_NoteAddition *event);
  116. void onNoteResize(qtauEvent_NoteResize *event);
  117. void onNoteMove(qtauEvent_NoteMove *event);
  118. void onNoteText(qtauEvent_NoteText *event);
  119. //void onNoteEffect(qtauEvent_NoteEffect *event);
  120. QPoint _rmbScrollStartPos;
  121. QPoint _rmbStartVpOffset;
  122. bool _rmbDragging;
  123. quint64 _idOffset;
  124. };
  125. /// mouse handler for changing phoneme/lyrics in note(s)
  126. class qtauEd_TextInput : public qtauEdController {
  127. Q_OBJECT
  128. public:
  129. qtauEd_TextInput(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts,
  130. qne::editorState &st);
  131. qtauEd_TextInput(qtauEdController *c);
  132. ~qtauEd_TextInput();
  133. bool getEditingNote() const;
  134. void setEditingNote(bool value);
  135. protected:
  136. void reset() override;
  137. void cleanup() override;
  138. void init() override;
  139. bool _managedOnEdited; // if onEdited() is called manually and need a
  140. // different controller next
  141. bool _editingNote;
  142. qne::editorNote *_editedNote;
  143. protected slots:
  144. void onEdited();
  145. void unfocus();
  146. bool eventFilter(QObject *obj, QEvent *event) override;
  147. };
  148. /// mouse handler for note selection with rectangle
  149. class qtauEd_SelectRect : public qtauEdController {
  150. Q_OBJECT
  151. public:
  152. qtauEd_SelectRect(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts,
  153. qne::editorState &st);
  154. qtauEd_SelectRect(qtauEdController *c);
  155. ~qtauEd_SelectRect();
  156. protected:
  157. void mouseMoveEvent(QMouseEvent *) override;
  158. void mouseReleaseEvent(QMouseEvent *) override;
  159. void mouseDoubleClickEvent(QMouseEvent *) override {
  160. changeController(new qtauEdController(this));
  161. }
  162. void mousePressEvent(QMouseEvent *) override {
  163. changeController(new qtauEdController(this));
  164. }
  165. void reset() override;
  166. };
  167. /// mouse handler for dragging note(s) when pressing lmb
  168. class qtauEd_DragNotes : public qtauEdController {
  169. Q_OBJECT
  170. public:
  171. qtauEd_DragNotes(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts,
  172. qne::editorState &st);
  173. qtauEd_DragNotes(qtauEdController *c);
  174. ~qtauEd_DragNotes();
  175. protected:
  176. void mouseMoveEvent(QMouseEvent *) override;
  177. void mouseReleaseEvent(QMouseEvent *) override;
  178. void mouseDoubleClickEvent(QMouseEvent *) override {
  179. changeController(new qtauEdController(this));
  180. }
  181. void mousePressEvent(QMouseEvent *) override {
  182. changeController(new qtauEdController(this));
  183. }
  184. void init() override;
  185. void reset() override;
  186. qne::editorNote *_mainMovedNote;
  187. QVector<QRect> _selRects;
  188. QRect _selBounds;
  189. };
  190. /// mouse handler for resizing notes by dragging their left/right borders
  191. class qtauEd_ResizeNote : public qtauEdController {
  192. Q_OBJECT
  193. public:
  194. qtauEd_ResizeNote(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts,
  195. qne::editorState &st, bool left);
  196. qtauEd_ResizeNote(qtauEdController *c, bool left);
  197. ~qtauEd_ResizeNote();
  198. protected:
  199. void mouseMoveEvent(QMouseEvent *) override;
  200. void mouseReleaseEvent(QMouseEvent *) override;
  201. void mouseDoubleClickEvent(QMouseEvent *) override {
  202. changeController(new qtauEdController(this));
  203. }
  204. void mousePressEvent(QMouseEvent *) override {
  205. changeController(new qtauEdController(this));
  206. }
  207. void init() override;
  208. void reset() override;
  209. qne::editorNote *_editedNote;
  210. bool _toLeft; // if should resize to left direction (move beginning) or to
  211. // right (move end)
  212. int _minNoteWidth;
  213. QRect _originalRect;
  214. };
  215. /// mouse handler for adding notes with mouse drag
  216. class qtauEd_AddNote : public qtauEdController {
  217. Q_OBJECT
  218. public:
  219. qtauEd_AddNote(qtauNoteEditor &ne, SNoteSetup &ns, qne::editorNotes &nts,
  220. qne::editorState &st);
  221. qtauEd_AddNote(qtauEdController *c);
  222. ~qtauEd_AddNote();
  223. protected:
  224. void mouseMoveEvent(QMouseEvent *) override;
  225. void mouseReleaseEvent(QMouseEvent *) override;
  226. void mouseDoubleClickEvent(QMouseEvent *) override {
  227. changeController(new qtauEdController(this));
  228. }
  229. void mousePressEvent(QMouseEvent *) override {
  230. changeController(new qtauEdController(this));
  231. }
  232. void init() override;
  233. void reset() override;
  234. qne::editorNote *_editedNote;
  235. int _minOffset;
  236. };
  237. #endif // NOTEEDITORHANDLERS_H