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 (Bracket* b : s->brackets()) {
if (b->selected()) {
bool selected = b->selected();
m_score->_selection.remove(b);
BracketItem* item = b->bracketItem();
item->setSelected(selected);
m_score->setSelectionChanged(true);
}
}

View file

@ -120,7 +120,7 @@ public:
Pid propertyId(const QStringRef& xmlName) const override;
// 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; }
Grip initialEditModeGrip() const override { return Grip::END; }
Grip defaultGrip() const override { return Grip::START; }

View file

@ -161,7 +161,7 @@ public:
QString accessibleInfo() 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; }
Grip initialEditModeGrip() const override { return Grip::START; }
Grip defaultGrip() const override { return Grip::START; }

View file

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

View file

@ -100,7 +100,7 @@ public:
QString accessibleExtraInfo() const override;
// 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; }
Grip initialEditModeGrip() 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)
{
// _bi->setSelected(f);
_bi->setSelected(f);
EngravingItem::setSelected(f);
}

View file

@ -89,7 +89,7 @@ public:
mu::engraving::PropertyValue propertyDefault(Pid) 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()); }
Grip initialEditModeGrip() const override { return Grip(gripsCount() - 1); }
Grip defaultGrip() const override { return initialEditModeGrip(); }

View file

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

View file

@ -65,7 +65,7 @@ public:
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; }
Grip initialEditModeGrip() const override { return Grip::END; }
Grip defaultGrip() const override { return Grip::MIDDLE; }

View file

@ -125,7 +125,7 @@ public:
UP& ups(Grip i) { return _ups[int(i)]; }
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); }
Grip initialEditModeGrip() const override { return Grip::END; }
Grip defaultGrip() const override { return Grip::DRAG; }

View file

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

View file

@ -76,7 +76,7 @@ public:
mu::PointF flagPosition() const;
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; }
Grip initialEditModeGrip() 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);
}
add(b);
if (bi->selected()) {
score()->select(b, SelectType::ADD);
}
b->setStaffSpan(firstStaff, lastStaff);
return b;
}

View file

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

View file

@ -155,7 +155,7 @@ public:
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; }
Grip initialEditModeGrip() const override { return Grip::END; }
Grip defaultGrip() const override { return Grip::START; }

View file

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

View file

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

View file

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

View file

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

View file

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