LCOV - code coverage report
Current view: top level - src/engraving/dom - whammybar.cpp Coverage Total Hit
Test: filtered_coverage.info Lines: 78.8 % 66 52
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              : #include "whammybar.h"
      24              : 
      25              : #include "score.h"
      26              : #include "system.h"
      27              : #include "text.h"
      28              : 
      29              : using namespace mu;
      30              : using namespace mu::engraving;
      31              : 
      32              : namespace mu::engraving {
      33              : static const ElementStyle whammyBarStyle {
      34              :     { Sid::whammyBarFontFace,                      Pid::BEGIN_FONT_FACE },
      35              :     { Sid::whammyBarFontFace,                      Pid::CONTINUE_FONT_FACE },
      36              :     { Sid::whammyBarFontFace,                      Pid::END_FONT_FACE },
      37              :     { Sid::whammyBarFontSize,                      Pid::BEGIN_FONT_SIZE },
      38              :     { Sid::whammyBarFontSize,                      Pid::CONTINUE_FONT_SIZE },
      39              :     { Sid::whammyBarFontSize,                      Pid::END_FONT_SIZE },
      40              :     { Sid::whammyBarFontStyle,                     Pid::BEGIN_FONT_STYLE },
      41              :     { Sid::whammyBarFontStyle,                     Pid::CONTINUE_FONT_STYLE },
      42              :     { Sid::whammyBarFontStyle,                     Pid::END_FONT_STYLE },
      43              :     { Sid::whammyBarTextAlign,                     Pid::BEGIN_TEXT_ALIGN },
      44              :     { Sid::whammyBarTextAlign,                     Pid::CONTINUE_TEXT_ALIGN },
      45              :     { Sid::whammyBarTextAlign,                     Pid::END_TEXT_ALIGN },
      46              :     { Sid::whammyBarPosition,                      Pid::BEGIN_TEXT_POSITION },
      47              :     { Sid::whammyBarPosition,                      Pid::CONTINUE_TEXT_POSITION },
      48              :     { Sid::whammyBarPosition,                      Pid::END_TEXT_POSITION },
      49              :     { Sid::whammyBarHookHeight,                    Pid::BEGIN_HOOK_HEIGHT },
      50              :     { Sid::whammyBarHookHeight,                    Pid::END_HOOK_HEIGHT },
      51              :     { Sid::whammyBarLineStyle,                     Pid::LINE_STYLE },
      52              :     { Sid::whammyBarDashLineLen,                   Pid::DASH_LINE_LEN },
      53              :     { Sid::whammyBarDashGapLen,                    Pid::DASH_GAP_LEN },
      54              :     { Sid::whammyBarFontSpatiumDependent,          Pid::TEXT_SIZE_SPATIUM_DEPENDENT },
      55              :     { Sid::whammyBarEndHookType,                   Pid::END_HOOK_TYPE },
      56              :     { Sid::whammyBarLineWidth,                     Pid::LINE_WIDTH },
      57              :     { Sid::whammyBarText,                          Pid::BEGIN_TEXT },
      58              :     { Sid::whammyBarPlacement,                     Pid::PLACEMENT },
      59              : 
      60              :     { Sid::whammyBarMusicalSymbolSize,             Pid::BEGIN_TEXT_MUSIC_SYMBOLS_SIZE },
      61              :     { Sid::whammyBarMusicalSymbolSize,             Pid::CONTINUE_TEXT_MUSIC_SYMBOLS_SIZE },
      62              :     { Sid::whammyBarMusicalSymbolSize,             Pid::END_TEXT_MUSIC_SYMBOLS_SIZE },
      63              :     { Sid::dummyMusicalSymbolsScale,               Pid::BEGIN_TEXT_MUSICAL_SYMBOLS_SCALE },
      64              :     { Sid::dummyMusicalSymbolsScale,               Pid::CONTINUE_TEXT_MUSICAL_SYMBOLS_SCALE },
      65              :     { Sid::dummyMusicalSymbolsScale,               Pid::END_TEXT_MUSICAL_SYMBOLS_SCALE },
      66              : };
      67              : 
      68            0 : WhammyBarSegment::WhammyBarSegment(WhammyBar* sp)
      69            0 :     : TextLineBaseSegment(ElementType::WHAMMY_BAR_SEGMENT, sp, ElementFlag::MOVABLE | ElementFlag::ON_STAFF)
      70              : {
      71            0 :     m_text->setTextStyleType(propertyDefault(Pid::TEXT_STYLE).value<TextStyleType>());
      72            0 :     m_endText->setTextStyleType(propertyDefault(Pid::TEXT_STYLE).value<TextStyleType>());
      73            0 : }
      74              : 
      75              : //---------------------------------------------------------
      76              : //   WhammyBar
      77              : //---------------------------------------------------------
      78              : 
      79           64 : WhammyBar::WhammyBar(DummyParentOr<EngravingItem> parent)
      80           64 :     : ChordTextLineBase(ElementType::WHAMMY_BAR, parent)
      81              : {
      82           64 :     initElementStyle(&whammyBarStyle);
      83           64 :     resetProperty(Pid::LINE_VISIBLE);
      84              : 
      85           64 :     resetProperty(Pid::BEGIN_TEXT_PLACE);
      86           64 :     resetProperty(Pid::BEGIN_TEXT);
      87           64 :     resetProperty(Pid::CONTINUE_TEXT_PLACE);
      88           64 :     resetProperty(Pid::CONTINUE_TEXT);
      89           64 :     resetProperty(Pid::END_TEXT_PLACE);
      90           64 :     resetProperty(Pid::END_TEXT);
      91           64 : }
      92              : 
      93              : static const ElementStyle whammyBarSegmentStyle {
      94              :     { Sid::letRingMinDistance,    Pid::MIN_DISTANCE },
      95              : };
      96              : 
      97              : //---------------------------------------------------------
      98              : //   createLineSegment
      99              : //---------------------------------------------------------
     100              : 
     101            0 : LineSegment* WhammyBar::createLineSegment()
     102              : {
     103            0 :     WhammyBarSegment* wb = new WhammyBarSegment(this);
     104            0 :     wb->setTrack(track());
     105            0 :     wb->initElementStyle(&whammyBarSegmentStyle);
     106            0 :     return wb;
     107              : }
     108              : 
     109              : //---------------------------------------------------------
     110              : //   propertyDefault
     111              : //---------------------------------------------------------
     112              : 
     113         1406 : PropertyValue WhammyBar::propertyDefault(Pid propertyId) const
     114              : {
     115         1406 :     switch (propertyId) {
     116            2 :     case Pid::LINE_WIDTH:
     117            2 :         return style().styleV(Sid::whammyBarLineWidth);
     118              : 
     119            2 :     case Pid::LINE_STYLE:
     120            2 :         return style().styleV(Sid::whammyBarLineStyle);
     121              : 
     122           96 :     case Pid::LINE_VISIBLE:
     123           96 :         return true;
     124              : 
     125           64 :     case Pid::CONTINUE_TEXT_OFFSET:
     126              :     case Pid::END_TEXT_OFFSET:
     127           64 :         return PropertyValue::fromValue(PointF(0, 0));
     128              : 
     129            2 :     case Pid::BEGIN_FONT_STYLE:
     130            2 :         return style().styleV(Sid::whammyBarFontStyle);
     131              : 
     132          162 :     case Pid::BEGIN_TEXT:
     133              :     case Pid::CONTINUE_TEXT:
     134          162 :         return style().styleV(Sid::whammyBarText).value<String>(); // TODO: fix the style
     135              : 
     136           96 :     case Pid::END_TEXT:
     137           96 :         return "";
     138              : 
     139           32 :     case Pid::BEGIN_HOOK_TYPE:
     140           32 :         return HookType::NONE;
     141              : 
     142          288 :     case Pid::BEGIN_TEXT_PLACE:
     143              :     case Pid::CONTINUE_TEXT_PLACE:
     144              :     case Pid::END_TEXT_PLACE:
     145          288 :         return TextPlace::AUTO;
     146              : 
     147            0 :     case Pid::TEXT_STYLE:
     148            0 :         return TextStyleType::WHAMMY_BAR;
     149              : 
     150          256 :     case Pid::BEGIN_FILLED_ARROW_HEIGHT:   // No arrow endings for whammy bar
     151              :     case Pid::BEGIN_FILLED_ARROW_WIDTH:
     152              :     case Pid::END_FILLED_ARROW_HEIGHT:
     153              :     case Pid::END_FILLED_ARROW_WIDTH:
     154              :     case Pid::BEGIN_LINE_ARROW_HEIGHT:
     155              :     case Pid::BEGIN_LINE_ARROW_WIDTH:
     156              :     case Pid::END_LINE_ARROW_HEIGHT:
     157              :     case Pid::END_LINE_ARROW_WIDTH:
     158          256 :         return 0.0;
     159              : 
     160          406 :     default:
     161          406 :         return TextLineBase::propertyDefault(propertyId);
     162              :     }
     163              : }
     164              : 
     165              : //---------------------------------------------------------
     166              : //   getPropertyStyle
     167              : //---------------------------------------------------------
     168              : 
     169         2070 : Sid WhammyBar::getPropertyStyle(Pid id) const
     170              : {
     171         2070 :     switch (id) {
     172           66 :     case Pid::PLACEMENT:
     173           66 :         return Sid::whammyBarPlacement;
     174           66 :     case Pid::BEGIN_FONT_FACE:
     175           66 :         return Sid::whammyBarFontFace;
     176          198 :     case Pid::BEGIN_FONT_SIZE:
     177              :     case Pid::CONTINUE_FONT_SIZE:
     178              :     case Pid::END_FONT_SIZE:
     179          198 :         return Sid::whammyBarFontSize;
     180          196 :     case Pid::BEGIN_FONT_STYLE:
     181              :     case Pid::CONTINUE_FONT_STYLE:
     182              :     case Pid::END_FONT_STYLE:
     183          196 :         return Sid::whammyBarFontStyle;
     184          198 :     case Pid::BEGIN_TEXT_ALIGN:
     185              :     case Pid::CONTINUE_TEXT_ALIGN:
     186              :     case Pid::END_TEXT_ALIGN:
     187          198 :         return Sid::whammyBarTextAlign;
     188          132 :     case Pid::BEGIN_HOOK_HEIGHT:
     189              :     case Pid::END_HOOK_HEIGHT:
     190          132 :         return Sid::whammyBarHookHeight;
     191         1214 :     default:
     192         1214 :         break;
     193              :     }
     194         1214 :     return TextLineBase::getPropertyStyle(id);
     195              : }
     196              : 
     197            0 : Sid WhammyBar::defaultPosSid() const
     198              : {
     199            0 :     return placeAbove() ? Sid::whammyBarPosAbove : Sid::whammyBarPosBelow;
     200              : }
     201              : }
        

Generated by: LCOV version 2.0-1