Merge pull request #5887 from SKefalidis/dc-footer
fix #16077 part 2: Double click a header/footer to open the corresponding menu
This commit is contained in:
commit
81662a270e
10 changed files with 63 additions and 23 deletions
|
@ -79,6 +79,9 @@ inline int trackZeroVoice(int track) { return track & ~3; }
|
|||
|
||||
static const int MAX_TAGS = 32;
|
||||
|
||||
static const int MAX_HEADERS = 3;
|
||||
static const int MAX_FOOTERS = 3;
|
||||
|
||||
static constexpr qreal INCH = 25.4;
|
||||
static constexpr qreal PPI = 72.0; // printer points per inch
|
||||
static constexpr qreal DPI_F = 5;
|
||||
|
|
|
@ -151,20 +151,22 @@ void Page::drawHeaderFooter(QPainter* p, int area, const QString& ss) const
|
|||
return;
|
||||
|
||||
Text* text;
|
||||
if (area < 3) {
|
||||
text = score()->headerText();
|
||||
if (area < MAX_HEADERS) {
|
||||
text = score()->headerText(area);
|
||||
if (!text) {
|
||||
text = new Text(score(), Tid::HEADER);
|
||||
text->setFlag(ElementFlag::GENERATED, true); // set to disable editing
|
||||
text->setLayoutToParentWidth(true);
|
||||
score()->setHeaderText(text);
|
||||
score()->setHeaderText(text, area);
|
||||
}
|
||||
}
|
||||
else {
|
||||
text = score()->footerText();
|
||||
text = score()->footerText(area - MAX_HEADERS); // because they are 3 4 5
|
||||
if (!text) {
|
||||
text = new Text(score(), Tid::FOOTER);
|
||||
text->setFlag(ElementFlag::GENERATED, true); // set to disable editing
|
||||
text->setLayoutToParentWidth(true);
|
||||
score()->setFooterText(text);
|
||||
score()->setFooterText(text, area - MAX_HEADERS);
|
||||
}
|
||||
}
|
||||
text->setParent((Page*)this);
|
||||
|
|
|
@ -1234,10 +1234,12 @@ static void updateStyle(void*, Element* e)
|
|||
void Score::styleChanged()
|
||||
{
|
||||
scanElements(0, updateStyle);
|
||||
if (headerText())
|
||||
headerText()->styleChanged();
|
||||
if (footerText())
|
||||
footerText()->styleChanged();
|
||||
for(int i = 0; i < MAX_HEADERS; i++)
|
||||
if (headerText(i))
|
||||
headerText(i)->styleChanged();
|
||||
for(int i = 0; i < MAX_FOOTERS; i++)
|
||||
if (footerText(i))
|
||||
footerText(i)->styleChanged();
|
||||
setLayoutAll();
|
||||
}
|
||||
|
||||
|
@ -4750,7 +4752,7 @@ bool Score::isTopScore() const
|
|||
//---------------------------------------------------------
|
||||
|
||||
Movements::Movements()
|
||||
: std::vector<MasterScore*>()
|
||||
: std::vector<MasterScore*>(), _headersText(MAX_HEADERS, nullptr), _footersText(MAX_FOOTERS, nullptr)
|
||||
{
|
||||
_undo = new UndoStack();
|
||||
}
|
||||
|
|
|
@ -353,8 +353,8 @@ class Movements : public std::vector<MasterScore*> {
|
|||
UndoStack* _undo;
|
||||
QList<Page*> _pages; // pages are build from systems
|
||||
MStyle _style;
|
||||
Text* _headerText { 0 };
|
||||
Text* _footerText { 0 };
|
||||
std::vector<Text*> _headersText;
|
||||
std::vector<Text*> _footersText;
|
||||
|
||||
public:
|
||||
Movements();
|
||||
|
@ -366,10 +366,10 @@ class Movements : public std::vector<MasterScore*> {
|
|||
UndoStack* undo() const { return _undo; }
|
||||
MStyle& style() { return _style; }
|
||||
const MStyle& style() const { return _style; }
|
||||
Text* headerText() const { return _headerText; }
|
||||
Text* footerText() const { return _footerText; }
|
||||
void setHeaderText(Text* t) { _headerText = t; }
|
||||
void setFooterText(Text* t) { _footerText = t; }
|
||||
std::vector<Text*> headersText() const { return _headersText; }
|
||||
std::vector<Text*> footersText() const { return _footersText; }
|
||||
void setHeaderText(Text* t, int index) { _headersText[index] = t; }
|
||||
void setFooterText(Text* t, int index) { _footersText[index] = t; }
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------------------
|
||||
|
@ -1207,10 +1207,10 @@ class Score : public QObject, public ScoreElement {
|
|||
|
||||
bool isTopScore() const;
|
||||
|
||||
Text* headerText() const { return movements()->headerText(); }
|
||||
Text* footerText() const { return movements()->footerText(); }
|
||||
void setHeaderText(Text* t) { movements()->setHeaderText(t); }
|
||||
void setFooterText(Text* t) { movements()->setFooterText(t); }
|
||||
Text* headerText(int index) const { return movements()->headersText()[index]; }
|
||||
Text* footerText(int index) const { return movements()->footersText()[index]; }
|
||||
void setHeaderText(Text* t, int index) { movements()->setHeaderText(t, index); }
|
||||
void setFooterText(Text* t, int index) { movements()->setFooterText(t, index); }
|
||||
|
||||
void cmdAddPitch(int note, bool addFlag, bool insert);
|
||||
void forAllLyrics(std::function<void(Lyrics*)> f);
|
||||
|
|
|
@ -768,6 +768,16 @@ void EditStyle::gotoElement(Element* e)
|
|||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// gotoElement
|
||||
/// used to go to the correct page when double-clicking on a header/footer
|
||||
//---------------------------------------------------------
|
||||
|
||||
void EditStyle::gotoHeaderFooterPage()
|
||||
{
|
||||
setPage(pageStack->indexOf(PageHeaderFooter));
|
||||
}
|
||||
|
||||
//---------------------------------------------------------
|
||||
// elementHasPage
|
||||
/// check if an element has a style page related to it
|
||||
|
|
|
@ -104,6 +104,7 @@ class EditStyle : public QDialog, private Ui::EditStyleBase {
|
|||
void setScore(Score* s) { cs = s; }
|
||||
|
||||
void gotoElement(Element* e);
|
||||
void gotoHeaderFooterPage();
|
||||
static bool elementHasPage(Element* e);
|
||||
};
|
||||
|
||||
|
|
|
@ -748,6 +748,8 @@ void ScoreView::mouseDoubleClickEvent(QMouseEvent* mouseEvent)
|
|||
if (!clickedElement->isEditable()) {
|
||||
if (clickedElement->isInstrumentName()) // double-click an instrument name to open the edit staff/part properties menu
|
||||
elementPropertyAction("staff-props", clickedElement);
|
||||
else if (clickedElement->isText() && (toText(clickedElement)->tid() == Tid::FOOTER || toText(clickedElement)->tid() == Tid::HEADER)) // double-click an instrument name to open the edit staff/part properties menu
|
||||
elementPropertyAction("style-header-footer", clickedElement);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -377,10 +377,16 @@ void Inspector::update(Score* s)
|
|||
ie = new InspectorNoteDot(this);
|
||||
break;
|
||||
default:
|
||||
if (element()->isText())
|
||||
ie = new InspectorText(this);
|
||||
else
|
||||
if (element()->isText()) {
|
||||
// don't allow footers/headers to be edited via the inspector
|
||||
if (toText(element())->tid() != Tid::FOOTER && toText(element())->tid() != Tid::HEADER)
|
||||
ie = new InspectorText(this);
|
||||
else
|
||||
ie = new InspectorEmpty(this);
|
||||
}
|
||||
else {
|
||||
ie = new InspectorElement(this);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -435,6 +435,14 @@ void ScoreView::elementPropertyAction(const QString& cmd, Element* e)
|
|||
mscore->styleDlg()->gotoElement(e);
|
||||
mscore->styleDlg()->exec();
|
||||
}
|
||||
else if (cmd == "style-header-footer") { // used to go to the header/footer dialog by double-clicking on a header/footer
|
||||
if (!mscore->styleDlg())
|
||||
mscore->setStyleDlg(new EditStyle { _score, mscore });
|
||||
else
|
||||
mscore->styleDlg()->setScore(mscore->currentScore());
|
||||
mscore->styleDlg()->gotoHeaderFooterPage();
|
||||
mscore->styleDlg()->exec();
|
||||
}
|
||||
else if (cmd == "ch-instr")
|
||||
selectInstrument(toInstrumentChange(e));
|
||||
else if (cmd == "staff-props") {
|
||||
|
|
|
@ -4899,6 +4899,12 @@ QList<Element*> ScoreView::elementsNear(QPointF p)
|
|||
QRectF r(p.x() - w, p.y() - w, 3.0 * w, 3.0 * w);
|
||||
|
||||
QList<Element*> el = page->items(r);
|
||||
for (int i = 0; i < MAX_HEADERS; i++)
|
||||
if (score()->headerText(i) != nullptr) // gives the ability to select the header
|
||||
el.push_back(score()->headerText(i));
|
||||
for (int i = 0; i < MAX_FOOTERS; i++)
|
||||
if (score()->footerText(i) != nullptr) // gives the ability to select the footer
|
||||
el.push_back(score()->footerText(i));
|
||||
for (Element* e : el) {
|
||||
e->itemDiscovered = 0;
|
||||
if (!e->selectable() || e->isPage())
|
||||
|
|
Loading…
Reference in a new issue