LCOV - code coverage report
Current view: top level - src/engraving/dom - hammeronpulloff.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              : #pragma once
      23              : 
      24              : #include "slur.h"
      25              : #include "textbase.h"
      26              : 
      27              : namespace mu::engraving {
      28              : class HammerOnPullOffText final : public TextBase
      29              : {
      30           69 :     OBJECT_ALLOCATOR(engraving, HammerOnPullOffText)
      31              :     DECLARE_CLASSOF(ElementType::HAMMER_ON_PULL_OFF_TEXT)
      32              : 
      33              : public:
      34              :     HammerOnPullOffText(HammerOnPullOffSegment* parent = nullptr);
      35              :     HammerOnPullOffText(const HammerOnPullOffText& h);
      36            0 :     HammerOnPullOffText* clone() const override { return new HammerOnPullOffText(*this); }
      37              : 
      38            0 :     bool isEditAllowed(EditData&) const override { return false; }
      39              : 
      40            0 :     HammerOnPullOffSegment* hopoSegment() const { return toHammerOnPullOffSegment(ownershipParent()); }
      41              : 
      42           75 :     Chord* startChord() const { return m_startChord; }
      43           75 :     Chord* endChord() const { return m_endChord; }
      44           75 :     void setStartChord(Chord* c) { m_startChord = c; }
      45           75 :     void setEndChord(Chord* c) { m_endChord = c; }
      46              : 
      47              :     std::vector<LineF> dragAnchorLines() const override;
      48              : 
      49              :     bool isUserModified() const override;
      50            0 :     bool isValid() const { return m_isValid; }
      51           75 :     void setIsValid(bool v) { m_isValid = v; }
      52          128 :     bool isHammerOn() const { return m_isHammerOn; }
      53           75 :     void setIsHammerOn(bool v) { m_isHammerOn = v; }
      54              : 
      55              :     Color curColor(const rendering::PaintOptions& opt) const override;
      56              : 
      57              :     PropertyValue propertyDefault(Pid id) const override;
      58              : 
      59           75 :     bool positionRelativeToNoteheadRest() const override { return false; }
      60              : 
      61              : private:
      62              :     Chord* m_startChord = nullptr;
      63              :     Chord* m_endChord = nullptr;
      64              :     bool m_isValid = true;
      65              :     bool m_isHammerOn = true;
      66              : };
      67              : 
      68              : class HammerOnPullOffSegment final : public SlurSegment
      69              : {
      70          109 :     OBJECT_ALLOCATOR(engraving, HammerOnPullOffSegment)
      71              :     DECLARE_CLASSOF(ElementType::HAMMER_ON_PULL_OFF_SEGMENT)
      72              : 
      73              : public:
      74              :     HammerOnPullOffSegment(HammerOnPullOff* sp);
      75              :     HammerOnPullOffSegment(const HammerOnPullOffSegment& other);
      76              : 
      77            0 :     HammerOnPullOffSegment* clone() const override { return new HammerOnPullOffSegment(*this); }
      78              : 
      79          122 :     HammerOnPullOff* hammerOnPullOff() const { return toHammerOnPullOff(spanner()); }
      80              : 
      81              :     Color curColor(const rendering::PaintOptions& opt) const override;
      82              : 
      83              :     void scanElements(std::function<void(EngravingItem*)> func) override;
      84              : 
      85              :     void setTrack(track_idx_t idx) override;
      86              :     void setSelected(bool f) override;
      87              : 
      88              :     void updateHopoText();
      89            4 :     void addHopoText(HammerOnPullOffText* t) { m_hopoText.push_back(t); }
      90          601 :     const std::vector<HammerOnPullOffText*>& hopoText() const { return m_hopoText; }
      91              : 
      92              :     bool isUserModified() const override;
      93              :     bool isValid() const;
      94              : 
      95              :     void reset() override;
      96              : 
      97              : private:
      98              :     struct HopoTextRegion {
      99              :         Chord* startChord = nullptr;
     100              :         Chord* endChord = nullptr;
     101              :         bool isHammerOn = true;
     102              :         bool isValid = true;
     103              :     };
     104              : 
     105              :     std::vector<HopoTextRegion> computeHopoTextRegions(Chord* startChord, Chord* endChord);
     106              :     void resolveStartEndNotes(Note** startNote, Note** endNote, Chord* startChord, Chord* endChord, bool isTabStaff);
     107              : 
     108              :     std::vector<HammerOnPullOffText*> m_hopoText;
     109              : };
     110              : 
     111              : class HammerOnPullOff final : public Slur
     112              : {
     113          109 :     OBJECT_ALLOCATOR(engraving, HammerOnPullOff)
     114         1399 :     DECLARE_CLASSOF(ElementType::HAMMER_ON_PULL_OFF)
     115              : 
     116              : public:
     117            5 :     HammerOnPullOff* clone() const override { return new HammerOnPullOff(*this); }
     118           57 :     SlurTieSegment* newSlurTieSegment() override { return new HammerOnPullOffSegment(this); }
     119              : 
     120              :     friend class Factory;
     121              : 
     122              :     HammerOnPullOff(DummyParentOr<EngravingItem> parent);
     123              :     HammerOnPullOff(const HammerOnPullOff&);
     124              : };
     125              : } // namespace mu::engraving
        

Generated by: LCOV version 2.0-1