Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-Studio-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2025 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 :
23 : #include "editfretboarddiagram.h"
24 :
25 : #include "../dom/box.h"
26 : #include "../dom/fret.h"
27 :
28 : using namespace mu::engraving;
29 :
30 : //---------------------------------------------------------
31 : // updateStored
32 : //---------------------------------------------------------
33 :
34 36 : FretUndoData::FretUndoData(FretDiagram* fd)
35 : {
36 : // We need to store the old barres and markers, since predicting how
37 : // adding dots, markers, barres etc. will change things is too difficult.
38 : // Update linked fret diagrams:
39 36 : m_diagram = fd;
40 36 : m_dots = m_diagram->m_dots;
41 36 : m_markers = m_diagram->m_markers;
42 36 : m_barres = m_diagram->m_barres;
43 :
44 36 : m_strings = m_diagram->m_strings;
45 36 : m_frets = m_diagram->m_frets;
46 36 : m_fretOffset = m_diagram->m_fretOffset;
47 36 : m_maxFrets = m_diagram->m_maxFrets;
48 36 : m_showNut = m_diagram->m_showNut;
49 36 : m_orientation = m_diagram->m_orientation;
50 :
51 36 : m_userMag = m_diagram->m_userMag;
52 :
53 36 : m_showFingering = m_diagram->m_showFingering;
54 36 : }
55 :
56 : //---------------------------------------------------------
57 : // updateDiagram
58 : //---------------------------------------------------------
59 :
60 36 : void FretUndoData::updateDiagram()
61 : {
62 36 : if (!m_diagram) {
63 0 : ASSERT_X("Tried to undo fret diagram change without ever setting diagram!");
64 : return;
65 : }
66 :
67 : // Reset every fret diagram property of the changed diagram
68 : // FretUndoData is a friend of FretDiagram so has access to these private members
69 36 : m_diagram->m_barres = m_barres;
70 36 : m_diagram->m_markers = m_markers;
71 36 : m_diagram->m_dots = m_dots;
72 :
73 36 : m_diagram->m_strings = m_strings;
74 36 : m_diagram->m_frets = m_frets;
75 36 : m_diagram->m_fretOffset = m_fretOffset;
76 36 : m_diagram->m_maxFrets = m_maxFrets;
77 36 : m_diagram->m_showNut = m_showNut;
78 36 : m_diagram->m_orientation = m_orientation;
79 :
80 36 : m_diagram->m_userMag = m_userMag;
81 :
82 36 : m_diagram->m_showFingering = m_showFingering;
83 : }
84 :
85 : //---------------------------------------------------------
86 : // FretDataChange
87 : //---------------------------------------------------------
88 :
89 32 : void FretDataChange::redo()
90 : {
91 32 : m_undoData = FretUndoData(m_diagram);
92 :
93 32 : m_diagram->updateDiagram(m_harmonyName);
94 32 : }
95 :
96 32 : void FretDataChange::undo()
97 : {
98 32 : m_undoData.updateDiagram();
99 32 : }
100 :
101 : //---------------------------------------------------------
102 : // FretDot
103 : //---------------------------------------------------------
104 :
105 1 : void FretDot::redo()
106 : {
107 1 : undoData = FretUndoData(diagram);
108 :
109 1 : diagram->setDot(string, fret, add, dtype);
110 1 : diagram->triggerLayout();
111 1 : }
112 :
113 1 : void FretDot::undo()
114 : {
115 1 : undoData.updateDiagram();
116 1 : diagram->triggerLayout();
117 1 : }
118 :
119 : //---------------------------------------------------------
120 : // FretMarker
121 : //---------------------------------------------------------
122 :
123 1 : void FretMarker::redo()
124 : {
125 1 : undoData = FretUndoData(diagram);
126 :
127 1 : diagram->setMarker(string, mtype);
128 1 : diagram->triggerLayout();
129 1 : }
130 :
131 1 : void FretMarker::undo()
132 : {
133 1 : undoData.updateDiagram();
134 1 : diagram->triggerLayout();
135 1 : }
136 :
137 : //---------------------------------------------------------
138 : // FretBarre
139 : //---------------------------------------------------------
140 :
141 1 : void FretBarre::redo()
142 : {
143 1 : undoData = FretUndoData(diagram);
144 :
145 1 : diagram->setBarre(string, fret, add);
146 1 : diagram->triggerLayout();
147 1 : }
148 :
149 1 : void FretBarre::undo()
150 : {
151 1 : undoData.updateDiagram();
152 1 : diagram->triggerLayout();
153 1 : }
154 :
155 : //---------------------------------------------------------
156 : // FretClear
157 : //---------------------------------------------------------
158 :
159 1 : void FretClear::redo()
160 : {
161 1 : undoData = FretUndoData(diagram);
162 :
163 1 : diagram->clear();
164 1 : diagram->triggerLayout();
165 1 : }
166 :
167 1 : void FretClear::undo()
168 : {
169 1 : undoData.updateDiagram();
170 1 : diagram->triggerLayout();
171 1 : }
172 :
173 : //---------------------------------------------------------
174 : // AddFretDiagramToFretBox
175 : //---------------------------------------------------------
176 :
177 22 : AddFretDiagramToFretBox::AddFretDiagramToFretBox(FretDiagram* f, size_t idx)
178 22 : : m_fretDiagram(f), m_idx(idx)
179 : {
180 22 : }
181 :
182 22 : void AddFretDiagramToFretBox::redo()
183 : {
184 22 : FBox* fbox = toFBox(m_fretDiagram->parent());
185 22 : fbox->addAtIdx(m_fretDiagram, m_idx);
186 22 : }
187 :
188 0 : void AddFretDiagramToFretBox::undo()
189 : {
190 0 : FBox* fbox = toFBox(m_fretDiagram->parent());
191 0 : fbox->remove(m_fretDiagram);
192 0 : }
193 :
194 : //---------------------------------------------------------
195 : // RemoveFretDiagramFromFretBox
196 : //---------------------------------------------------------
197 :
198 0 : RemoveFretDiagramFromFretBox::RemoveFretDiagramFromFretBox(FretDiagram* f)
199 0 : : m_fretDiagram(f)
200 : {
201 0 : FBox* fbox = toFBox(f->parent());
202 0 : const ElementList& el = fbox->el();
203 0 : m_idx = muse::indexOf(el, m_fretDiagram);
204 0 : }
205 :
206 0 : void RemoveFretDiagramFromFretBox::redo()
207 : {
208 0 : FBox* fbox = toFBox(m_fretDiagram->parent());
209 0 : fbox->remove(m_fretDiagram);
210 0 : }
211 :
212 0 : void RemoveFretDiagramFromFretBox::undo()
213 : {
214 0 : FBox* fbox = toFBox(m_fretDiagram->parent());
215 0 : fbox->addAtIdx(m_fretDiagram, m_idx);
216 0 : }
|