Merge pull request #10506 from RomanPudashkin/crash_after_selecting_brackets

[MU4] Fix #10496: Crash on selecting multiple brackets
This commit is contained in:
RomanPudashkin 2022-02-11 19:36:31 +02:00 committed by GitHub
commit b0020ec292
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 27 additions and 33 deletions

View file

@ -188,7 +188,10 @@ void Layout::doLayoutRange(const LayoutOptions& options, const Fraction& st, con
for (System* s : qAsConst(m_score->_systems)) { for (System* s : qAsConst(m_score->_systems)) {
for (Bracket* b : s->brackets()) { for (Bracket* b : s->brackets()) {
if (b->selected()) { if (b->selected()) {
bool selected = b->selected();
m_score->_selection.remove(b); m_score->_selection.remove(b);
BracketItem* item = b->bracketItem();
item->setSelected(selected);
m_score->setSelectionChanged(true); m_score->setSelectionChanged(true);
} }
} }

View file

@ -120,7 +120,7 @@ public:
Pid propertyId(const QStringRef& xmlName) const override; Pid propertyId(const QStringRef& xmlName) const override;
// TODO: add a grip for moving the entire arpeggio // TODO: add a grip for moving the entire arpeggio
EditBehavior normalModeEditBehavior() const override { return EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return 2; } int gripsCount() const override { return 2; }
Grip initialEditModeGrip() const override { return Grip::END; } Grip initialEditModeGrip() const override { return Grip::END; }
Grip defaultGrip() const override { return Grip::START; } Grip defaultGrip() const override { return Grip::START; }

View file

@ -161,7 +161,7 @@ public:
QString accessibleInfo() const override; QString accessibleInfo() const override;
QString accessibleExtraInfo() const override; QString accessibleExtraInfo() const override;
EditBehavior normalModeEditBehavior() const override { return EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return 1; } int gripsCount() const override { return 1; }
Grip initialEditModeGrip() const override { return Grip::START; } Grip initialEditModeGrip() const override { return Grip::START; }
Grip defaultGrip() const override { return Grip::START; } Grip defaultGrip() const override { return Grip::START; }

View file

@ -197,7 +197,7 @@ public:
void triggerLayout() const override; void triggerLayout() const override;
EditBehavior normalModeEditBehavior() const override { return EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return 3; } int gripsCount() const override { return 3; }
Grip initialEditModeGrip() const override { return Grip::END; } Grip initialEditModeGrip() const override { return Grip::END; }
Grip defaultGrip() const override { return Grip::MIDDLE; } Grip defaultGrip() const override { return Grip::MIDDLE; }

View file

@ -100,7 +100,7 @@ public:
QString accessibleExtraInfo() const override; QString accessibleExtraInfo() const override;
// TODO: add a grip for moving the entire box // TODO: add a grip for moving the entire box
EditBehavior normalModeEditBehavior() const override { return EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return 1; } int gripsCount() const override { return 1; }
Grip initialEditModeGrip() const override { return Grip::START; } Grip initialEditModeGrip() const override { return Grip::START; }
Grip defaultGrip() const override { return Grip::START; } Grip defaultGrip() const override { return Grip::START; }

View file

@ -521,7 +521,7 @@ void Bracket::undoChangeProperty(Pid id, const PropertyValue& v, PropertyFlags p
void Bracket::setSelected(bool f) void Bracket::setSelected(bool f)
{ {
// _bi->setSelected(f); _bi->setSelected(f);
EngravingItem::setSelected(f); EngravingItem::setSelected(f);
} }

View file

@ -89,7 +89,7 @@ public:
mu::engraving::PropertyValue propertyDefault(Pid) const override; mu::engraving::PropertyValue propertyDefault(Pid) const override;
Pid propertyId(const QStringRef& xmlName) const override; Pid propertyId(const QStringRef& xmlName) const override;
EngravingItem::EditBehavior normalModeEditBehavior() const override { return EngravingItem::EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return _straight ? 1 : static_cast<int>(path.elementCount()); } int gripsCount() const override { return _straight ? 1 : static_cast<int>(path.elementCount()); }
Grip initialEditModeGrip() const override { return Grip(gripsCount() - 1); } Grip initialEditModeGrip() const override { return Grip(gripsCount() - 1); }
Grip defaultGrip() const override { return initialEditModeGrip(); } Grip defaultGrip() const override { return initialEditModeGrip(); }

View file

@ -221,11 +221,6 @@ protected:
virtual mu::engraving::AccessibleItem* createAccessible(); virtual mu::engraving::AccessibleItem* createAccessible();
public: public:
enum class EditBehavior {
SelectOnly,
Edit,
};
virtual ~EngravingItem(); virtual ~EngravingItem();
virtual void setupAccessible(); virtual void setupAccessible();
@ -392,6 +387,7 @@ public:
QVector<mu::LineF> genericDragAnchorLines() const; QVector<mu::LineF> genericDragAnchorLines() const;
virtual bool isEditable() const { return !flag(ElementFlag::GENERATED); } virtual bool isEditable() const { return !flag(ElementFlag::GENERATED); }
virtual bool needStartEditingAfterSelecting() const { return false; }
virtual void startEdit(EditData&); virtual void startEdit(EditData&);
virtual bool edit(EditData&); virtual bool edit(EditData&);
@ -409,7 +405,6 @@ public:
/** Returns anchor lines displayed while dragging element's grip in canvas coordinates. */ /** Returns anchor lines displayed while dragging element's grip in canvas coordinates. */
virtual QVector<mu::LineF> gripAnchorLines(Grip) const { return QVector<mu::LineF>(); } virtual QVector<mu::LineF> gripAnchorLines(Grip) const { return QVector<mu::LineF>(); }
virtual EditBehavior normalModeEditBehavior() const { return EditBehavior::SelectOnly; }
virtual int gripsCount() const { return 0; } virtual int gripsCount() const { return 0; }
virtual Grip initialEditModeGrip() const { return Grip::NO_GRIP; } virtual Grip initialEditModeGrip() const { return Grip::NO_GRIP; }
virtual Grip defaultGrip() const { return Grip::NO_GRIP; } virtual Grip defaultGrip() const { return Grip::NO_GRIP; }

View file

@ -88,7 +88,7 @@ public:
ImageType getImageType() const { return imageType; } ImageType getImageType() const { return imageType; }
bool isValid() const { return rasterDoc || svgDoc; } bool isValid() const { return rasterDoc || svgDoc; }
EngravingItem::EditBehavior normalModeEditBehavior() const override { return EngravingItem::EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return 2; } int gripsCount() const override { return 2; }
Grip initialEditModeGrip() const override { return Grip(1); } Grip initialEditModeGrip() const override { return Grip(1); }
Grip defaultGrip() const override { return Grip(1); } Grip defaultGrip() const override { return Grip(1); }

View file

@ -65,7 +65,7 @@ public:
virtual EngravingItem* propertyDelegate(Pid) override; virtual EngravingItem* propertyDelegate(Pid) override;
EngravingItem::EditBehavior normalModeEditBehavior() const override { return EngravingItem::EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return 3; } int gripsCount() const override { return 3; }
Grip initialEditModeGrip() const override { return Grip::END; } Grip initialEditModeGrip() const override { return Grip::END; }
Grip defaultGrip() const override { return Grip::MIDDLE; } Grip defaultGrip() const override { return Grip::MIDDLE; }

View file

@ -125,7 +125,7 @@ public:
UP& ups(Grip i) { return _ups[int(i)]; } UP& ups(Grip i) { return _ups[int(i)]; }
Shape shape() const override { return _shape; } Shape shape() const override { return _shape; }
EngravingItem::EditBehavior normalModeEditBehavior() const override { return EngravingItem::EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return int(Grip::GRIPS); } int gripsCount() const override { return int(Grip::GRIPS); }
Grip initialEditModeGrip() const override { return Grip::END; } Grip initialEditModeGrip() const override { return Grip::END; }
Grip defaultGrip() const override { return Grip::DRAG; } Grip defaultGrip() const override { return Grip::DRAG; }

View file

@ -78,7 +78,7 @@ public:
void setGap(Millimetre sp); void setGap(Millimetre sp);
Millimetre gap() const { return _gap; } Millimetre gap() const { return _gap; }
EditBehavior normalModeEditBehavior() const override { return EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return 1; } int gripsCount() const override { return 1; }
Grip initialEditModeGrip() const override { return Grip::START; } Grip initialEditModeGrip() const override { return Grip::START; }
Grip defaultGrip() const override { return Grip::START; } Grip defaultGrip() const override { return Grip::START; }

View file

@ -76,7 +76,7 @@ public:
mu::PointF flagPosition() const; mu::PointF flagPosition() const;
double length() const { return m_baseLength + m_userLength; } double length() const { return m_baseLength + m_userLength; }
EditBehavior normalModeEditBehavior() const override { return EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return 1; } int gripsCount() const override { return 1; }
Grip initialEditModeGrip() const override { return Grip::START; } Grip initialEditModeGrip() const override { return Grip::START; }
Grip defaultGrip() const override { return Grip::START; } Grip defaultGrip() const override { return Grip::START; }

View file

@ -681,7 +681,13 @@ Bracket* System::createBracket(const LayoutContext& ctx, Ms::BracketItem* bi, in
b->setMeasure(measure); b->setMeasure(measure);
} }
add(b); add(b);
if (bi->selected()) {
score()->select(b, SelectType::ADD);
}
b->setStaffSpan(firstStaff, lastStaff); b->setStaffSpan(firstStaff, lastStaff);
return b; return b;
} }

View file

@ -65,7 +65,7 @@ public:
Grip initialEditModeGrip() const override; Grip initialEditModeGrip() const override;
Grip defaultGrip() const override; Grip defaultGrip() const override;
EditBehavior normalModeEditBehavior() const override { return EditBehavior::SelectOnly; } bool needStartEditingAfterSelecting() const override { return false; }
}; };
} // namespace Ms } // namespace Ms
#endif #endif

View file

@ -155,7 +155,7 @@ public:
Shape shape() const override; Shape shape() const override;
EngravingItem::EditBehavior normalModeEditBehavior() const override { return EngravingItem::EditBehavior::Edit; } bool needStartEditingAfterSelecting() const override { return true; }
int gripsCount() const override { return 2; } int gripsCount() const override { return 2; }
Grip initialEditModeGrip() const override { return Grip::END; } Grip initialEditModeGrip() const override { return Grip::END; }
Grip defaultGrip() const override { return Grip::START; } Grip defaultGrip() const override { return Grip::START; }

View file

@ -233,8 +233,6 @@ void AbstractInspectorModel::onPropertyValueChanged(const Ms::Pid pid, const QVa
updateNotation(); updateNotation();
endCommand(); endCommand();
emit elementsModified();
} }
void AbstractInspectorModel::updateProperties() void AbstractInspectorModel::updateProperties()

View file

@ -150,7 +150,6 @@ public slots:
signals: signals:
void titleChanged(); void titleChanged();
void elementsModified();
void modelReseted(); void modelReseted();
void isEmptyChanged(); void isEmptyChanged();

View file

@ -47,9 +47,6 @@ public:
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
int columnCount(const QModelIndex& parent = QModelIndex()) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override;
signals:
void elementsModified();
private: private:
enum RoleNames { enum RoleNames {
InspectorSectionModelRole = Qt::UserRole + 1 InspectorSectionModelRole = Qt::UserRole + 1

View file

@ -2740,13 +2740,9 @@ void NotationInteraction::startEditElement(EngravingItem* element)
} }
if (element->isTextBase()) { if (element->isTextBase()) {
startEditText(element, PointF()); startEditText(element);
} else if (m_editData.grips > 1) { } else if (element->hasGrips()) {
startEditGrip(element, Ms::Grip::END); startEditGrip(element, element->defaultGrip());
if (m_editData.element->generated()) {
m_editData.element = nullptr;
}
} else if (element->isEditable()) { } else if (element->isEditable()) {
element->startEdit(m_editData); element->startEdit(m_editData);
m_editData.element = element; m_editData.element = element;

View file

@ -505,7 +505,7 @@ void NotationViewInputController::mousePressEvent(QMouseEvent* event)
if (viewInteraction()->isHitGrip(logicPos)) { if (viewInteraction()->isHitGrip(logicPos)) {
viewInteraction()->startEditGrip(logicPos); viewInteraction()->startEditGrip(logicPos);
return; return;
} else if (hitElement->hasGrips()) { } else if (hitElement->hasGrips() && hitElement->needStartEditingAfterSelecting()) {
viewInteraction()->startEditGrip(hitElement, hitElement->defaultGrip()); viewInteraction()->startEditGrip(hitElement, hitElement->defaultGrip());
return; return;
} }