LCOV - code coverage report
Current view: top level - src/engraving/dom - accidental.h Coverage Total Hit
Test: filtered_coverage.info Lines: 77.3 % 22 17
Test Date: 2026-11-05 04:07:02

            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) 2021 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              : #pragma once
      24              : 
      25              : #include <vector>
      26              : 
      27              : #include "engravingitem.h"
      28              : 
      29              : namespace mu::engraving {
      30              : class Factory;
      31              : class Note;
      32              : class Transaction;
      33              : enum class AccidentalVal : signed char;
      34              : 
      35              : // NOTE: keep this in sync with accList array in accidentals.cpp
      36              : enum class AccidentalType : unsigned char {
      37              :     ///.\{
      38              :     NONE,
      39              :     FLAT,
      40              :     NATURAL,
      41              :     SHARP,
      42              :     SHARP2,
      43              :     FLAT2,
      44              :     SHARP3,
      45              :     FLAT3,
      46              :     NATURAL_FLAT,
      47              :     NATURAL_SHARP,
      48              :     SHARP_SHARP,
      49              : 
      50              :     // Gould arrow quartertone
      51              :     FLAT_ARROW_UP,
      52              :     FLAT_ARROW_DOWN,
      53              :     NATURAL_ARROW_UP,
      54              :     NATURAL_ARROW_DOWN,
      55              :     SHARP_ARROW_UP,
      56              :     SHARP_ARROW_DOWN,
      57              :     SHARP2_ARROW_UP,
      58              :     SHARP2_ARROW_DOWN,
      59              :     FLAT2_ARROW_UP,
      60              :     FLAT2_ARROW_DOWN,
      61              :     ARROW_DOWN,
      62              :     ARROW_UP,
      63              : 
      64              :     // Stein-Zimmermann
      65              :     MIRRORED_FLAT,
      66              :     MIRRORED_FLAT2,
      67              :     SHARP_SLASH,
      68              :     SHARP_SLASH4,
      69              : 
      70              :     // Arel-Ezgi-Uzdilek (AEU)
      71              :     FLAT_SLASH2,
      72              :     FLAT_SLASH,
      73              :     SHARP_SLASH3,
      74              :     SHARP_SLASH2,
      75              : 
      76              :     // Extended Helmholtz-Ellis accidentals (just intonation)
      77              :     DOUBLE_FLAT_ONE_ARROW_DOWN,
      78              :     FLAT_ONE_ARROW_DOWN,
      79              :     NATURAL_ONE_ARROW_DOWN,
      80              :     SHARP_ONE_ARROW_DOWN,
      81              :     DOUBLE_SHARP_ONE_ARROW_DOWN,
      82              :     DOUBLE_FLAT_ONE_ARROW_UP,
      83              : 
      84              :     FLAT_ONE_ARROW_UP,
      85              :     NATURAL_ONE_ARROW_UP,
      86              :     SHARP_ONE_ARROW_UP,
      87              :     DOUBLE_SHARP_ONE_ARROW_UP,
      88              :     DOUBLE_FLAT_TWO_ARROWS_DOWN,
      89              :     FLAT_TWO_ARROWS_DOWN,
      90              : 
      91              :     NATURAL_TWO_ARROWS_DOWN,
      92              :     SHARP_TWO_ARROWS_DOWN,
      93              :     DOUBLE_SHARP_TWO_ARROWS_DOWN,
      94              :     DOUBLE_FLAT_TWO_ARROWS_UP,
      95              :     FLAT_TWO_ARROWS_UP,
      96              :     NATURAL_TWO_ARROWS_UP,
      97              : 
      98              :     SHARP_TWO_ARROWS_UP,
      99              :     DOUBLE_SHARP_TWO_ARROWS_UP,
     100              :     DOUBLE_FLAT_THREE_ARROWS_DOWN,
     101              :     FLAT_THREE_ARROWS_DOWN,
     102              :     NATURAL_THREE_ARROWS_DOWN,
     103              :     SHARP_THREE_ARROWS_DOWN,
     104              : 
     105              :     DOUBLE_SHARP_THREE_ARROWS_DOWN,
     106              :     DOUBLE_FLAT_THREE_ARROWS_UP,
     107              :     FLAT_THREE_ARROWS_UP,
     108              :     NATURAL_THREE_ARROWS_UP,
     109              :     SHARP_THREE_ARROWS_UP,
     110              :     DOUBLE_SHARP_THREE_ARROWS_UP,
     111              : 
     112              :     LOWER_ONE_SEPTIMAL_COMMA,
     113              :     RAISE_ONE_SEPTIMAL_COMMA,
     114              :     LOWER_TWO_SEPTIMAL_COMMAS,
     115              :     RAISE_TWO_SEPTIMAL_COMMAS,
     116              :     LOWER_ONE_UNDECIMAL_QUARTERTONE,
     117              :     RAISE_ONE_UNDECIMAL_QUARTERTONE,
     118              : 
     119              :     LOWER_ONE_TRIDECIMAL_QUARTERTONE,
     120              :     RAISE_ONE_TRIDECIMAL_QUARTERTONE,
     121              : 
     122              :     DOUBLE_FLAT_EQUAL_TEMPERED,
     123              :     FLAT_EQUAL_TEMPERED,
     124              :     NATURAL_EQUAL_TEMPERED,
     125              :     SHARP_EQUAL_TEMPERED,
     126              :     DOUBLE_SHARP_EQUAL_TEMPERED,
     127              :     QUARTER_FLAT_EQUAL_TEMPERED,
     128              :     QUARTER_SHARP_EQUAL_TEMPERED,
     129              : 
     130              :     FLAT_17,
     131              :     SHARP_17,
     132              :     FLAT_19,
     133              :     SHARP_19,
     134              :     FLAT_23,
     135              :     SHARP_23,
     136              :     FLAT_31,
     137              :     SHARP_31,
     138              :     FLAT_53,
     139              :     SHARP_53,
     140              :     EQUALS_ALMOST,
     141              :     EQUALS,
     142              :     TILDE,
     143              : 
     144              :     // Persian
     145              :     SORI,
     146              :     KORON,
     147              : 
     148              :     // Wyschnegradsky
     149              :     TEN_TWELFTH_FLAT,
     150              :     TEN_TWELFTH_SHARP,
     151              :     ELEVEN_TWELFTH_FLAT,
     152              :     ELEVEN_TWELFTH_SHARP,
     153              :     ONE_TWELFTH_FLAT,
     154              :     ONE_TWELFTH_SHARP,
     155              :     TWO_TWELFTH_FLAT,
     156              :     TWO_TWELFTH_SHARP,
     157              :     THREE_TWELFTH_FLAT,
     158              :     THREE_TWELFTH_SHARP,
     159              :     FOUR_TWELFTH_FLAT,
     160              :     FOUR_TWELFTH_SHARP,
     161              :     FIVE_TWELFTH_FLAT,
     162              :     FIVE_TWELFTH_SHARP,
     163              :     SIX_TWELFTH_FLAT,
     164              :     SIX_TWELFTH_SHARP,
     165              :     SEVEN_TWELFTH_FLAT,
     166              :     SEVEN_TWELFTH_SHARP,
     167              :     EIGHT_TWELFTH_FLAT,
     168              :     EIGHT_TWELFTH_SHARP,
     169              :     NINE_TWELFTH_FLAT,
     170              :     NINE_TWELFTH_SHARP,
     171              : 
     172              :     // (Spartan) Sagittal
     173              :     SAGITTAL_5V7KD,
     174              :     SAGITTAL_5V7KU,
     175              :     SAGITTAL_5CD,
     176              :     SAGITTAL_5CU,
     177              :     SAGITTAL_7CD,
     178              :     SAGITTAL_7CU,
     179              :     SAGITTAL_25SDD,
     180              :     SAGITTAL_25SDU,
     181              :     SAGITTAL_35MDD,
     182              :     SAGITTAL_35MDU,
     183              :     SAGITTAL_11MDD,
     184              :     SAGITTAL_11MDU,
     185              :     SAGITTAL_11LDD,
     186              :     SAGITTAL_11LDU,
     187              :     SAGITTAL_35LDD,
     188              :     SAGITTAL_35LDU,
     189              :     SAGITTAL_FLAT25SU,
     190              :     SAGITTAL_SHARP25SD,
     191              :     SAGITTAL_FLAT7CU,
     192              :     SAGITTAL_SHARP7CD,
     193              :     SAGITTAL_FLAT5CU,
     194              :     SAGITTAL_SHARP5CD,
     195              :     SAGITTAL_FLAT5V7KU,
     196              :     SAGITTAL_SHARP5V7KD,
     197              :     SAGITTAL_FLAT,
     198              :     SAGITTAL_SHARP,
     199              : 
     200              :     // Turkish folk music
     201              :     ONE_COMMA_FLAT,
     202              :     ONE_COMMA_SHARP,
     203              :     TWO_COMMA_FLAT,
     204              :     TWO_COMMA_SHARP,
     205              :     THREE_COMMA_FLAT,
     206              :     THREE_COMMA_SHARP,
     207              :     FOUR_COMMA_FLAT,
     208              :     //FOUR_COMMA_SHARP,
     209              :     FIVE_COMMA_SHARP,
     210              : 
     211              :     END
     212              :     ///\}
     213              : };
     214              : 
     215              : //---------------------------------------------------------
     216              : //   AccidentalBracket
     217              : //---------------------------------------------------------
     218              : 
     219              : enum class AccidentalBracket : char {
     220              :     NONE,
     221              :     PARENTHESIS,
     222              :     BRACKET,
     223              :     BRACE, //! Deprecated; removed from the UI and kept here only for compatibility purposes
     224              : };
     225              : 
     226              : //---------------------------------------------------------
     227              : //   @@ Accidental
     228              : //   @P role        enum  (Accidental.AUTO, .USER) (read only)
     229              : //   @P isSmall     bool
     230              : //---------------------------------------------------------
     231              : 
     232              : class Accidental final : public EngravingItem
     233              : {
     234         9807 :     OBJECT_ALLOCATOR(engraving, Accidental)
     235         2376 :     DECLARE_CLASSOF(ElementType::ACCIDENTAL)
     236              : 
     237              : public:
     238              : 
     239          115 :     Accidental* clone() const override { return new Accidental(*this); }
     240              : 
     241              :     Note* note() const;
     242              : 
     243              :     TranslatableString subtypeUserName() const override;
     244              :     void setSubtype(const AsciiStringView& s);
     245            0 :     int subtype() const override { return (int)m_accidentalType; }
     246              : 
     247              :     void setAccidentalType(AccidentalType t);
     248       419024 :     AccidentalType accidentalType() const { return m_accidentalType; }
     249              : 
     250         2080 :     void setRole(AccidentalRole r) { m_role = r; }
     251         4607 :     AccidentalRole role() const { return m_role; }
     252              : 
     253        61720 :     AccidentalBracket bracket() const { return m_bracket; }
     254         1911 :     void setBracket(AccidentalBracket val) { m_bracket = val; }
     255              :     bool parentNoteHasParentheses() const;
     256              : 
     257         4180 :     bool isSmall() const { return m_isSmall; }
     258          260 :     void setSmall(bool val) { m_isSmall = val; }
     259              : 
     260              :     SymId symId() const;
     261              : 
     262              :     bool acceptDrop(EditData&) const override;
     263              :     EngravingItem* drop(Transaction& tx, EditData&) override;
     264              : 
     265            0 :     bool isEditable() const override { return true; }
     266            0 :     void startEdit(EditData&) override { setGenerated(false); }
     267              : 
     268              :     PropertyValue getProperty(Pid propertyId) const override;
     269              :     bool setProperty(Pid propertyId, const PropertyValue&) override;
     270              :     PropertyValue propertyDefault(Pid propertyId) const override;
     271              : 
     272              :     static AccidentalVal subtype2value(AccidentalType);               // return effective pitch offset
     273              :     static SymId subtype2symbol(AccidentalType);
     274              :     static AsciiStringView subtype2name(AccidentalType);
     275              :     static AccidentalType value2subtype(AccidentalVal);
     276              :     static AccidentalType value2MicrotonalSubtype(AccidentalVal val, int quarterOff);
     277              :     static AccidentalType name2subtype(const AsciiStringView&);
     278         5583 :     static bool isMicrotonal(AccidentalType t) { return t > AccidentalType::FLAT3; }
     279              :     static double subtype2centOffset(AccidentalType);
     280              :     static AccidentalType centOffset2Subtype(double centOffset);
     281              : 
     282         7518 :     int stackingOrder() const { return ldata()->stackingNumber + m_stackingOrderOffset; }
     283              : 
     284              :     int line() const;
     285              : 
     286              :     String accessibleInfo() const override;
     287              : 
     288              :     void computeMag();
     289              : 
     290              :     struct LayoutData : public EngravingItem::LayoutData {
     291              :         struct Sym {
     292              :             SymId sym;
     293              :             double x;
     294              :             double y;
     295         4105 :             Sym(SymId _sym, double _x, double _y)
     296         4105 :                 : sym(_sym), x(_x), y(_y) {}
     297              :         };
     298              : 
     299              :         std::vector<Sym> syms;
     300              : 
     301              :         ld_field<int> stackingNumber = { "[Accidental] stackingNumber", 0 };
     302              :         ld_field<int> verticalSubgroup = { "[Accidental] verticalSubgroup", 0 };
     303              :         ld_field<int> column = { "[Accidental] column", 0 };
     304              :         ld_field<std::vector<Accidental*> > octaves = { "[Accidental] octaves", std::vector<Accidental*> {} };
     305              :         ld_field<std::vector<Accidental*> > seconds = { "[Accidental] seconds", std::vector<Accidental*> {} };
     306              : 
     307         4086 :         bool isValid() const override { return EngravingItem::LayoutData::isValid() && !syms.empty(); }
     308              :     };
     309       102481 :     DECLARE_LAYOUTDATA_METHODS(Accidental)
     310              : 
     311         2618 :     int stackingOrderOffset() const { return m_stackingOrderOffset; }
     312            0 :     void setStackingOrderOffset(int v) { m_stackingOrderOffset = v; }
     313              : 
     314              : private:
     315              : 
     316              :     friend class Factory;
     317              : 
     318              :     Accidental(DummyParentOr<EngravingItem> parent);
     319              : 
     320              :     AccidentalType m_accidentalType = AccidentalType::NONE;
     321              :     AccidentalBracket m_bracket = AccidentalBracket::NONE;
     322              :     AccidentalRole m_role = AccidentalRole::AUTO;
     323              :     bool m_isSmall = false;
     324              :     int m_stackingOrderOffset = 0;
     325              : };
     326              : 
     327              : extern AccidentalVal sym2accidentalVal(SymId id);
     328              : }
     329              : 
     330              : #ifndef NO_QT_SUPPORT
     331            0 : Q_DECLARE_METATYPE(mu::engraving::AccidentalType)
     332              : #endif
        

Generated by: LCOV version 2.0-1