diff --git a/mscore/data/icons/viewOptions.svg b/mscore/data/icons/viewOptions.svg new file mode 100644 index 0000000000000..db74718e6cdc0 --- /dev/null +++ b/mscore/data/icons/viewOptions.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/mscore/icons.cpp b/mscore/icons.cpp index 69f57c2605815..418c9b5b108e9 100644 --- a/mscore/icons.cpp +++ b/mscore/icons.cpp @@ -158,7 +158,8 @@ static const char* iconNames[] = { "arrow_down.svg", "mail.svg", "bug.svg", - "note_timewise.svg" + "note_timewise.svg", + "viewOptions.svg" }; //--------------------------------------------------------- diff --git a/mscore/icons.h b/mscore/icons.h index 110541a892a38..95ef2ca366a7c 100644 --- a/mscore/icons.h +++ b/mscore/icons.h @@ -58,7 +58,7 @@ enum class Icons : signed char { Invalid_ICON = -1, timesig_prolatio08_ICON, timesig_prolatio10_ICON, timesig_prolatio11_ICON, edit_ICON, reset_ICON, close_ICON, arrowUp_ICON, arrowDown_ICON, mail_ICON, bug_ICON, - noteTimewise_ICON, + noteTimewise_ICON, viewOptions_ICON, voice1_ICON, voice2_ICON, voice3_ICON, voice4_ICON, ICONS }; diff --git a/mscore/musescore.cpp b/mscore/musescore.cpp index d27aa6381d07a..0ca5ef2a033bd 100644 --- a/mscore/musescore.cpp +++ b/mscore/musescore.cpp @@ -244,7 +244,9 @@ const std::list MuseScore::_allFileOperationEntries { "file-save-online", "print", "undo", - "redo" + "redo", + "", + "view-options" }; const std::list MuseScore::_allPlaybackControlEntries { @@ -909,27 +911,29 @@ void MuseScore::populateFileOperations() { fileTools->clear(); - if (qApp->layoutDirection() == Qt::LayoutDirection::LeftToRight) { - for (auto s : _fileOperationEntries) { - if (!*s) - fileTools->addSeparator(); - else - fileTools->addWidget(new AccessibleToolButton(fileTools, getAction(s))); - } - } - else { - _fileOperationEntries.reverse(); - for (auto s : _fileOperationEntries) { - if (!*s) - fileTools->addSeparator(); - else - fileTools->addWidget(new AccessibleToolButton(fileTools, getAction(s))); - } + bool leftToRightLayout = qApp->layoutDirection() == Qt::LayoutDirection::LeftToRight; + + if (!leftToRightLayout) _fileOperationEntries.reverse(); + + for (auto s : _fileOperationEntries) { + + if (!*s) + fileTools->addSeparator(); + else if (!strcmp("view-options", s)) + addViewOptionsDoubleWidget(); + else + fileTools->addWidget(new AccessibleToolButton(fileTools, getAction(s))); } - // Currently not customizable in ToolbarEditor - fileTools->addSeparator(); + if (!leftToRightLayout) + _fileOperationEntries.reverse(); + } + +// view-options is treated as a special case as it's not a QToolButton +// but, rather, made up of two QComboBox objects (one sub-classed). +void MuseScore::addViewOptionsDoubleWidget() + { mag = new MagBox; connect(mag, SIGNAL(magChanged(MagIdx)), SLOT(magChanged(MagIdx))); fileTools->addWidget(mag); @@ -951,6 +955,7 @@ void MuseScore::populateFileOperations() fileTools->addWidget(viewModeCombo); } + //--------------------------------------------------------- // populatePlaybackControls //--------------------------------------------------------- @@ -960,14 +965,15 @@ void MuseScore::populatePlaybackControls() transportTools->clear(); for (const auto s : _playbackControlEntries) { - if (!*s) + if (!*s) { transportTools->addSeparator(); + } else { if (QString(s) == "repeat") { - QAction* repeatAction = getAction("repeat"); - repeatAction->setChecked(preferences.getBool(PREF_APP_PLAYBACK_PLAYREPEATS)); - QWidget* w = new AccessibleToolButton(transportTools, repeatAction); - transportTools->addWidget(w); + QAction* repeatAction = getAction("repeat"); + repeatAction->setChecked(preferences.getBool(PREF_APP_PLAYBACK_PLAYREPEATS)); + QWidget* w = new AccessibleToolButton(transportTools, repeatAction); + transportTools->addWidget(w); } else if (QString(s) == "play") { _playButton = new AccessibleToolButton(transportTools, getAction("play")); diff --git a/mscore/musescore.h b/mscore/musescore.h index d4f8c171f1db7..633f6ca3786da 100644 --- a/mscore/musescore.h +++ b/mscore/musescore.h @@ -849,6 +849,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { std::list* fileOperationEntries() { return &_fileOperationEntries; } void setFileOperationEntries(std::list l) { _fileOperationEntries = l; } void populateFileOperations(); + void addViewOptionsDoubleWidget(); static const std::list& allPlaybackControlEntries() { return _allPlaybackControlEntries; } std::list* playbackControlEntries() { return &_playbackControlEntries; } @@ -882,6 +883,7 @@ MasterSynthesizer* synthesizerFactory(); Driver* driverFactory(Seq*, QString driver); extern QAction* getAction(const char*); +extern QString getShortcutText(const char*); extern Shortcut* midiActionMap[128]; extern void loadTranslation(QString fileName, QString localeName); extern void setMscoreLocale(QString localeName); diff --git a/mscore/musescore.qrc b/mscore/musescore.qrc index a865ec031de34..2979c67b6808d 100644 --- a/mscore/musescore.qrc +++ b/mscore/musescore.qrc @@ -167,6 +167,7 @@ data/icons/mail.svg data/icons/bug.svg data/icons/note_timewise.svg + data/icons/viewOptions.svg data/icons/mixer-slider-handle.svg data/icons/mixer-mute-off.svg data/icons/mixer-mute-on.svg diff --git a/mscore/shortcut.cpp b/mscore/shortcut.cpp index 02b0b357a7bbd..72116a77b447e 100644 --- a/mscore/shortcut.cpp +++ b/mscore/shortcut.cpp @@ -182,6 +182,15 @@ Shortcut Shortcut::_sc[] = { Icons::redo_ICON, Qt::ApplicationShortcut }, + { + MsWidget::MAIN_WINDOW, + STATE_NORMAL, + "view-options", + QT_TRANSLATE_NOOP("action","View Options"), + 0, + 0, + Icons::viewOptions_ICON, + }, { MsWidget::SCORE_TAB, STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_LYRICS_EDIT @@ -3880,6 +3889,18 @@ QAction* getAction(const char* id) return s ? s->action() : 0; } + +//--------------------------------------------------------- +// getShortcutText +// returns description for shortcut +//--------------------------------------------------------- + +QString getShortcutText(const char* id) + { + Shortcut* shortcut = Shortcut::getShortcut(id); + return shortcut ? shortcut->text() : ""; + } + //--------------------------------------------------------- // aAction //--------------------------------------------------------- diff --git a/mscore/toolbarEditor.cpp b/mscore/toolbarEditor.cpp index 7d0db1bf46db0..3603a365b0d6d 100644 --- a/mscore/toolbarEditor.cpp +++ b/mscore/toolbarEditor.cpp @@ -71,15 +71,16 @@ ToolbarEditor::ToolbarEditor(QWidget* parent) void ToolbarEditor::init() { QString name = Workspace::currentWorkspace->name(); - bool writable = !Workspace::currentWorkspace->readOnly(); - if (!writable) { - name += " " + tr("(not changeable)"); - } - add->setEnabled(writable); - remove->setEnabled(writable); - up->setEnabled(writable); - down->setEnabled(writable); - workspaceName->setText(name); + QString mainTitle = tr("Customize Toolbars"); + setWindowTitle(mainTitle + " (" + name + ")"); + + // defensive - don't expect to be here if workspace is not customizable + bool canBeCustomized = !Workspace::currentWorkspace->readOnly(); + + add->setEnabled(canBeCustomized); + remove->setEnabled(canBeCustomized); + up->setEnabled(canBeCustomized); + down->setEnabled(canBeCustomized); // Syncs the editor with the current toolbars new_toolbars->at(0) = mscore->noteInputMenuEntries(); @@ -113,38 +114,52 @@ void ToolbarEditor::accepted() void ToolbarEditor::populateLists(const std::list& all, std::list* current) { actionList->clear(); - availableList->clear(); - for (auto i : *current) { - QAction* a = getAction(i); + for (auto currentId : *current) { + QString shortcutText = getShortcutText(currentId); + QAction* action = getAction(currentId); QListWidgetItem* item; - QString actionName = QString(i); - if (a) - item = new QListWidgetItem(a->icon(), actionName); - else if (actionName.isEmpty()) + + if (action) + item = new QListWidgetItem(action->icon(), shortcutText); + else if (QString(currentId).isEmpty()) item = new QListWidgetItem(tr("Separator")); else - item = new QListWidgetItem(actionName); - item->setData(Qt::UserRole, QVariant::fromValue((void*)i)); + item = new QListWidgetItem(shortcutText); + + item->setData(Qt::UserRole, QVariant::fromValue((void*)currentId)); actionList->addItem(item); } - for (auto i : all) { + + refreshAvailableList(all, current); + } + + +void ToolbarEditor::refreshAvailableList(const std::list& all, std::list* current) + { + availableList->clear(); + + for (auto id : all) { bool found = false; - for (auto k : *current) { - if (strcmp(k, i) == 0) { + + for (auto allId : *current) { + if (strcmp(allId, id) == 0) { found = true; break; } } + if (!found) { - QAction* a = getAction(i); + QString shortcutText = getShortcutText(id); + QAction* action = getAction(id); QListWidgetItem* item = 0; - QString actionName = QString(i); - if (a) - item = new QListWidgetItem(a->icon(), actionName); - else if (!actionName.isEmpty()) - item = new QListWidgetItem(QString(i)); - if (item) { - item->setData(Qt::UserRole, QVariant::fromValue((void*)i)); + + if (action) + item = new QListWidgetItem(action->icon(), shortcutText); + else if (!QString(id).isEmpty()) + item = new QListWidgetItem(shortcutText); + + if (item) { + item->setData(Qt::UserRole, QVariant::fromValue((void*)id)); availableList->addItem(item); } } @@ -198,10 +213,24 @@ void ToolbarEditor::removeAction() int cr = actionList->currentRow(); if (cr == -1) return; + QListWidgetItem* item = actionList->takeItem(cr); - if (!isSpacer(item)) - availableList->addItem(item); updateNewToolbar(toolbarList->currentRow()); + + if (isSpacer(item)) + return; + + int currentRow = toolbarList->currentRow(); + switch (currentRow) { + case 0: + refreshAvailableList(MuseScore::allNoteInputMenuEntries(), new_toolbars->at(currentRow)); + break; + case 1: + refreshAvailableList(MuseScore::allFileOperationEntries(), new_toolbars->at(currentRow)); + break; + case 2: + refreshAvailableList(MuseScore::allPlaybackControlEntries(), new_toolbars->at(currentRow)); + } } //--------------------------------------------------------- diff --git a/mscore/toolbarEditor.h b/mscore/toolbarEditor.h index 9881e4f08b592..7081de37370f1 100644 --- a/mscore/toolbarEditor.h +++ b/mscore/toolbarEditor.h @@ -28,6 +28,7 @@ class ToolbarEditor : public QDialog, public Ui::ToolbarEditor { void updateNewToolbar(int toolbar_to_update); void populateLists(const std::list&, std::list*); + void refreshAvailableList(const std::list&, std::list*); bool isSpacer(QListWidgetItem*) const; virtual void hideEvent(QHideEvent*); diff --git a/mscore/toolbarEditor.ui b/mscore/toolbarEditor.ui index 29a494fe2e15c..524940e644541 100644 --- a/mscore/toolbarEditor.ui +++ b/mscore/toolbarEditor.ui @@ -11,11 +11,11 @@ - Dialog + Customize Toolbars - - + + 0 @@ -23,25 +23,22 @@ - Toolbar + Available actions - - - - - 0 - 0 - + + + + Qt::Horizontal - - Actions + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - + + 0 @@ -49,73 +46,52 @@ - Available Actions + Actions - - - - -1 + + + + Actions available to show on toolbar - - - - - - - - - - - - - 0 - 0 - - - - Workspace: - - - - - - - true - - - - - - + + + Add action to toolbar + - :/data/icons/go-previous.svg:/data/icons/go-previous.svg + :/data/icons/go-next.svg:/data/icons/go-next.svg + + Remove action from toolbar + - :/data/icons/go-next.svg:/data/icons/go-next.svg + :/data/icons/go-previous.svg:/data/icons/go-previous.svg + + Move action up + @@ -127,6 +103,9 @@ + + Move action down + @@ -138,20 +117,39 @@ - - - - Qt::Horizontal + + + + Toolbar to customize - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + -1 + + + + + + + + 0 + 0 + + + + Toolbar + + + + + + + Actions shown on toolbar - workspaceName toolbarList actionList add diff --git a/mscore/workspace.cpp b/mscore/workspace.cpp index 6d9a00b70ab3f..93b9c542e1769 100644 --- a/mscore/workspace.cpp +++ b/mscore/workspace.cpp @@ -179,6 +179,8 @@ void MuseScore::changeWorkspace(Workspace* p, bool first) updateIcons(); preferencesChanged(true); } + + getAction("edit-toolbars")->setEnabled(!Workspace::currentWorkspace->readOnly()); } //--------------------------------------------------------- diff --git a/share/workspaces/Advanced.xml b/share/workspaces/Advanced.xml index 8ea90556f2014..eccecbd4bd1a3 100644 --- a/share/workspaces/Advanced.xml +++ b/share/workspaces/Advanced.xml @@ -4111,6 +4111,8 @@ print undo redo + + view-options midi-on diff --git a/share/workspaces/Basic.xml b/share/workspaces/Basic.xml index eda9d22887bb3..1546f78e0e77c 100644 --- a/share/workspaces/Basic.xml +++ b/share/workspaces/Basic.xml @@ -904,6 +904,8 @@ print undo redo + + view-options midi-on