make it compile
[alioth/musescore.git] / debian / patches / backports / plugin-remove-el.diff
1 Origin: backport, commit:19677e38768db0cd46832f30038d70012bc750a9
2 Author: Dale Larson <dlarson42@gmail.com>
3 Description: Fix #291790, fix #267604: Restore Chord.remove() and Chord.add() methods.
4  Restore the add and remove QML methods for the
5  Chord object. Adds exposed Element.parent property.
6  These existed in v2.x. Finally it adds a removeElement
7  method to PluginAPI for general element disposal.
8
9 --- a/mscore/plugin/api/elements.cpp
10 +++ b/mscore/plugin/api/elements.cpp
11 @@ -11,6 +11,7 @@
12  //=============================================================================
13  
14  #include "elements.h"
15 +#include "score.h"
16  #include "libmscore/property.h"
17  
18  namespace Ms {
19 @@ -70,6 +71,50 @@ void Note::setTpc(int val)
20        }
21  
22  //---------------------------------------------------------
23 +//   Chord::add
24 +//---------------------------------------------------------
25 +
26 +void Chord::add(Ms::PluginAPI::Element* wrapped)
27 +      {
28 +      Ms::Element* s = wrapped->element();
29 +      if (s)
30 +            {
31 +            // Ensure that the object has the expected ownership
32 +            if (wrapped->ownership() == Ownership::SCORE) {
33 +                  qWarning("Chord::add: Cannot add this element. The element is already part of the score.");
34 +                  return;        // Don't allow operation.
35 +                  }
36 +            // Score now owns the object.
37 +            wrapped->setOwnership(Ownership::SCORE);
38 +            // Provide parentage for element.
39 +            s->setParent(chord());
40 +            // If a note, ensure the element has proper Tpc values. (Will crash otherwise)
41 +            if (s->isNote()) {
42 +                  s->setTrack(chord()->track());
43 +                  toNote(s)->setTpcFromPitch();
44 +                  }
45 +            // Create undo op and add the element.
46 +            chord()->score()->undoAddElement(s);
47 +            }
48 +      }
49 +
50 +//---------------------------------------------------------
51 +//   Chord::remove
52 +//---------------------------------------------------------
53 +
54 +void Chord::remove(Ms::PluginAPI::Element* wrapped)
55 +      {
56 +      Ms::Element* s = wrapped->element();
57 +      if (s->parent() != chord())
58 +            qWarning("PluginAPI::Chord::remove: The element is not a child of this chord. Use removeElement() instead.");
59 +      else if (chord()->notes().size() <= 1 && s->type() == ElementType::NOTE)
60 +            qWarning("PluginAPI::Chord::remove: Removal of final note is not allowed.");
61 +      else if (s)
62 +            chord()->score()->deleteItem(s); // Create undo op and remove the element.
63 +      }
64 +
65 +
66 +//---------------------------------------------------------
67  //   wrap
68  ///   \cond PLUGIN_API \private \endcond
69  ///   Wraps Ms::Element choosing the correct wrapper type
70 --- a/mscore/plugin/api/elements.h
71 +++ b/mscore/plugin/api/elements.h
72 @@ -22,6 +22,7 @@
73  #include "libmscore/notedot.h"
74  #include "libmscore/segment.h"
75  #include "libmscore/accidental.h"
76 +#include "libmscore/types.h"
77  
78  namespace Ms {
79  namespace PluginAPI {
80 @@ -78,6 +79,11 @@ class Element : public Ms::PluginAPI::Sc
81         * \see Element::offset
82         */
83        Q_PROPERTY(qreal offsetY READ offsetY WRITE setOffsetY)
84 +      /**
85 +       * Parent element for this element.
86 +       * \since 3.3
87 +       */
88 +      Q_PROPERTY(Ms::PluginAPI::Element* parent READ parent)
89  
90        API_PROPERTY( subtype,                 SUBTYPE                   )
91        API_PROPERTY_READ_ONLY_T( bool, selected, SELECTED               )
92 @@ -316,6 +322,8 @@ class Element : public Ms::PluginAPI::Sc
93        void setOffsetX(qreal offX);
94        void setOffsetY(qreal offY);
95  
96 +      Ms::PluginAPI::Element* parent() const { return wrap(element()->parent()); }
97 +
98     public:
99        /// \cond MS_INTERNAL
100        Element(Ms::Element* e = nullptr, Ownership own = Ownership::PLUGIN)
101 @@ -449,6 +457,13 @@ class Chord : public Element {
102        //QQmlListProperty<Element> hook()         { return wrapContainerProperty<Element>(this, chord()->hook());      }
103        Ms::NoteType noteType()                  { return chord()->noteType(); }
104        /// \endcond
105 +
106 +      /// Add to a chord's elements.
107 +      /// \since MuseScore 3.3
108 +      Q_INVOKABLE void add(Ms::PluginAPI::Element* wrapped);
109 +      /// Remove a chord's element.
110 +      /// \since MuseScore 3.3
111 +      Q_INVOKABLE void remove(Ms::PluginAPI::Element* wrapped);
112        };
113  
114  //---------------------------------------------------------
115 --- a/mscore/plugin/api/qmlpluginapi.cpp
116 +++ b/mscore/plugin/api/qmlpluginapi.cpp
117 @@ -178,6 +178,19 @@ Element* PluginAPI::newElement(int eleme
118        }
119  
120  //---------------------------------------------------------
121 +//   removeElement
122 +///   Disposes of an Element and its children.
123 +///   \param Element type.
124 +///   \since MuseScore 3.3
125 +//---------------------------------------------------------
126 +
127 +void PluginAPI::removeElement(Ms::PluginAPI::Element* wrapped)
128 +      {
129 +      Ms::Score* score = wrapped->element()->score();
130 +      score->deleteItem(wrapped->element());
131 +      }
132 +
133 +//---------------------------------------------------------
134  //   newScore
135  //---------------------------------------------------------
136  
137 --- a/mscore/plugin/api/qmlpluginapi.h
138 +++ b/mscore/plugin/api/qmlpluginapi.h
139 @@ -165,6 +165,7 @@ class PluginAPI : public Ms::QmlPlugin {
140  
141        Q_INVOKABLE Ms::PluginAPI::Score* newScore(const QString& name, const QString& part, int measures);
142        Q_INVOKABLE Ms::PluginAPI::Element* newElement(int);
143 +      Q_INVOKABLE void removeElement(Ms::PluginAPI::Element* wrapped);
144        Q_INVOKABLE void cmd(const QString&);
145        /** \cond PLUGIN_API \private \endcond */
146        Q_INVOKABLE Ms::PluginAPI::MsProcess* newQProcess();