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