Verovio
Source code documentation
accid.h
1 // Name: accid.h
3 // Author: Laurent Pugin
4 // Created: 201X
5 // Copyright (c) Authors and others. All rights reserved.
7 
8 #ifndef __VRV_ACCID_H__
9 #define __VRV_ACCID_H__
10 
11 #include "atts_externalsymbols.h"
12 #include "atts_gestural.h"
13 #include "floatingobject.h"
14 #include "layerelement.h"
15 #include "offsetinterface.h"
16 #include "positioninterface.h"
17 
18 namespace vrv {
19 
20 class AlignmentReference;
21 class AccidFloatingObject;
22 
23 //----------------------------------------------------------------------------
24 // Accid
25 //----------------------------------------------------------------------------
26 
30 class Accid : public LayerElement,
31  public OffsetInterface,
32  public PositionInterface,
33  public AttAccidental,
34  public AttAccidentalGes,
35  public AttAccidLog,
36  public AttColor,
37  public AttEnclosingChars,
38  public AttExtSymAuth,
39  public AttExtSymNames,
40  public AttPlacementOnStaff,
41  public AttPlacementRelEvent {
42 public:
48  Accid();
49  virtual ~Accid();
50  Object *Clone() const override { return new Accid(*this); }
51  void Reset() override;
52  std::string GetClassName() const override { return "accid"; }
54 
57 
60 
62  AccidFloatingObject *GetFloatingObject() { return m_floatingObject; }
63 
65  bool IsRelativeToStaff() const override { return (this->HasLoc() || (this->HasOloc() && this->HasPloc())); }
66 
71  OffsetInterface *GetOffsetInterface() override { return vrv_cast<OffsetInterface *>(this); }
72  const OffsetInterface *GetOffsetInterface() const override { return vrv_cast<const OffsetInterface *>(this); }
73  PositionInterface *GetPositionInterface() override { return vrv_cast<PositionInterface *>(this); }
74  const PositionInterface *GetPositionInterface() const override { return vrv_cast<const PositionInterface *>(this); }
76 
78  bool HasToBeAligned() const override { return true; }
79 
84  void SetDrawingUnisonAccid(Accid *drawingUnison) { m_drawingUnison = drawingUnison; }
85  Accid *GetDrawingUnisonAccid() { return m_drawingUnison; }
86  const Accid *GetDrawingUnisonAccid() const { return m_drawingUnison; }
88 
93  std::u32string GetSymbolStr(data_NOTATIONTYPE notationType) const;
94 
98  void AdjustX(LayerElement *element, const Doc *doc, int staffSize, std::vector<Accid *> &leftAccids,
99  std::set<Accid *> &adjustedAccids);
100 
104  void AdjustToLedgerLines(const Doc *doc, LayerElement *element, int staffSize);
105 
110  void IsAlignedWithSameLayer(bool alignWithSameLayer) { m_alignedWithSameLayer = alignWithSameLayer; }
111  bool IsAlignedWithSameLayer() const { return m_alignedWithSameLayer; }
113 
114  //----------------//
115  // Static methods //
116  //----------------//
117 
121  static char32_t GetAccidGlyph(data_ACCIDENTAL_WRITTEN accid);
122 
126  static std::u32string CreateSymbolStr(data_ACCIDENTAL_WRITTEN accid, data_ENCLOSURE enclosure = ENCLOSURE_NONE,
127  data_NOTATIONTYPE notationType = NOTATIONTYPE_NONE, const Resources *resources = NULL, data_HEXNUM glyphNum = 0,
128  std::string glyphName = "");
129 
130  //----------//
131  // Functors //
132  //----------//
133 
138  FunctorCode Accept(Functor &functor) override;
139  FunctorCode Accept(ConstFunctor &functor) const override;
140  FunctorCode AcceptEnd(Functor &functor) override;
141  FunctorCode AcceptEnd(ConstFunctor &functor) const override;
143 
144 private:
145  //
146 public:
147  //
148 private:
149  Accid *m_drawingUnison;
150  bool m_alignedWithSameLayer;
151 
153  AccidFloatingObject *m_floatingObject;
154 };
155 
156 //----------------------------------------------------------------------------
157 // AccidFloatingObject
158 //----------------------------------------------------------------------------
159 
164 public:
171  virtual ~AccidFloatingObject() {}
172  std::string GetClassName() const override { return "accid"; }
173  void Reset() override;
175 
176 private:
177  //
178 public:
179  //
180 private:
181  //
182 };
183 
184 //----------------------------------------------------------------------------
185 // AccidSpaceSort
186 //----------------------------------------------------------------------------
187 
192 
193 public:
194  AccidSpaceSort() = default;
195 
196  bool operator()(const Accid *first, const Accid *second) const
197  {
198  if (first->GetDrawingY() == second->GetDrawingY()) {
199  // with unissons, natural should always be the last accidental
200  return ((first->GetAccid() == ACCIDENTAL_WRITTEN_n) && (second->GetAccid() != ACCIDENTAL_WRITTEN_n));
201  }
202  else {
203  return (first->GetDrawingY() > second->GetDrawingY());
204  }
205  }
206 };
207 
208 //----------------------------------------------------------------------------
209 // AccidOctaveSort
210 //----------------------------------------------------------------------------
211 
216 
217 public:
218  AccidOctaveSort() = default;
219 
220  // Encodes parent ID + accid type + pitch
221  std::string GetOctaveID(const Accid *accid) const;
222 
223  bool operator()(const Accid *first, const Accid *second) const
224  {
225  return this->GetOctaveID(first) < this->GetOctaveID(second);
226  }
227 };
228 
229 } // namespace vrv
230 
231 #endif
This class is used for editorial accidentals to be laid out as floating objects.
Definition: accid.h:163
void Reset() override
Reset the object, that is 1) removing all children and 2) resetting all attributes.
This class models the MEI <accid> element.
Definition: accid.h:41
void AdjustToLedgerLines(const Doc *doc, LayerElement *element, int staffSize)
Adjust accid position if it's placed above/below staff so that it does not overlap with ledger lines.
void InitFloatingObject()
Init the accid floating object for editorial accidentals.
bool HasToBeAligned() const override
Override the method since alignment is required.
Definition: accid.h:78
void AdjustX(LayerElement *element, const Doc *doc, int staffSize, std::vector< Accid * > &leftAccids, std::set< Accid * > &adjustedAccids)
Adjust X position of accid in relation to other element.
void Reset() override
Virtual reset method.
static std::u32string CreateSymbolStr(data_ACCIDENTAL_WRITTEN accid, data_ENCLOSURE enclosure=ENCLOSURE_NONE, data_NOTATIONTYPE notationType=NOTATIONTYPE_NONE, const Resources *resources=NULL, data_HEXNUM glyphNum=0, std::string glyphName="")
Create the SMuFL string based on various properties.
Object * Clone() const override
Method call for copying child classes.
Definition: accid.h:50
FunctorCode Accept(Functor &functor) override
Interface for class functor visitation.
bool IsRelativeToStaff() const override
Override the method since it is align to the staff.
Definition: accid.h:65
AccidFloatingObject * GetFloatingObject()
Return the floating object (NULL if not set)
Definition: accid.h:62
void ClearFloatingObject()
Delete the floating object (editorial accidental) on reset or deletion.
std::u32string GetSymbolStr(data_NOTATIONTYPE notationType) const
Retrieve SMuFL string for the accidental.
Equivalence of accidentals that are an octave apart.
Definition: accid.h:215
Sort Object by drawing Y value.
Definition: accid.h:191
This abstract class is the base class for all const functors.
Definition: functor.h:126
This class is a hold the data and corresponds to the model of a MVC design pattern.
Definition: doc.h:41
This class represents elements appearing within a measure.
Definition: floatingobject.h:28
This abstract class is the base class for all mutable functors.
Definition: functor.h:101
This class is a base class for the Layer (<layer>) content.
Definition: layerelement.h:51
This class represents a basic object.
Definition: object.h:64
This class is an interface for elements having a single visual offset, such as arpeg,...
Definition: offsetinterface.h:28
This class is an interface for elements with a position on the staff, such as rests.
Definition: positioninterface.h:30
This class provides resource values.
Definition: resources.h:30