From 7e51189beb7a89999aac91a49ea127f6b7da82e8 Mon Sep 17 00:00:00 2001 From: divya-urs Date: Sun, 13 Aug 2017 22:13:35 +0530 Subject: [PATCH] palette shortcut --- mscore/CMakeLists.txt | 11 +- mscore/menus.cpp | 32 +++ mscore/musescore.cpp | 147 +++++++++- mscore/musescore.h | 23 ++ mscore/palette.cpp | 112 +++++++- mscore/palette.h | 13 +- mscore/paletteShortcutManager.cpp | 459 ++++++++++++++++++++++++++++++ mscore/paletteShortcutManager.h | 67 +++++ mscore/paletteShortcutManager.ui | 231 +++++++++++++++ mscore/palettebox.cpp | 5 + mscore/palettebox.h | 34 +++ mscore/preferences.cpp | 37 +++ mscore/preferences.h | 20 ++ mscore/prefsdialog.h | 2 + mscore/prefsdialog.ui | 13 + mscore/shortcut.cpp | 20 ++ mscore/shortcut.h | 1 + mscore/shortcutcapturedialog.cpp | 90 +++++- mscore/workspace.cpp | 90 +++++- mscore/workspace.h | 3 + 20 files changed, 1394 insertions(+), 16 deletions(-) create mode 100644 mscore/paletteShortcutManager.cpp create mode 100644 mscore/paletteShortcutManager.h create mode 100644 mscore/paletteShortcutManager.ui diff --git a/mscore/CMakeLists.txt b/mscore/CMakeLists.txt index e3b0de744a987..bda26a98ee248 100644 --- a/mscore/CMakeLists.txt +++ b/mscore/CMakeLists.txt @@ -29,10 +29,17 @@ include_directories( ) if (SCRIPT_INTERFACE) - set (SCRIPT_FILES mscorePlugins pluginCreator.cpp qmledit.cpp pluginManager.cpp) - set (SCRIPT_UI pluginCreator.ui pluginManager.ui) + set (SCRIPT_FILES mscorePlugins pluginCreator.cpp qmledit.cpp pluginManager.cpp paletteShortcutManager.cpp) + set (SCRIPT_UI pluginCreator.ui pluginManager.ui paletteShortcutManager.ui) + #set (SCRIPT_FILES qmledit.cpp paletteShortcutManager.cpp) + #set (SCRIPT_UI paletteShortcutManager.ui) endif (SCRIPT_INTERFACE) +#if (SCRIPT_INTERFACE) +# set (SCRIPT_FILES qmledit.cpp paletteShortcutManager.cpp) +# set (SCRIPT_UI paletteShortcutManager.ui) +#endif (SCRIPT_INTERFACE) + QT5_WRAP_UI (ui_headers insertmeasuresdialog.ui editinstrument.ui editstyle.ui instrdialog.ui instrwidget.ui measuresdialog.ui pagesettings.ui mixer.ui playpanel.ui prefsdialog.ui measureproperties.ui diff --git a/mscore/menus.cpp b/mscore/menus.cpp index 26055b56a6432..cbbbca996efd3 100644 --- a/mscore/menus.cpp +++ b/mscore/menus.cpp @@ -1527,6 +1527,13 @@ Palette* MuseScore::newFretboardDiagramPalette() void MuseScore::setAdvancedPalette() { mscore->getPaletteBox(); + // get shortcut list before clearing palettebox + QList shortcuts; + for (Palette* p : paletteBox->palettes()) { + for (PaletteCell* cell : p->getCells()) { + shortcuts.append(cell->shortcut); + } + } paletteBox->clear(); paletteBox->addPalette(newClefsPalette(PaletteType::ADVANCED)); paletteBox->addPalette(newKeySigPalette(PaletteType::ADVANCED)); @@ -1553,6 +1560,18 @@ void MuseScore::setAdvancedPalette() paletteBox->addPalette(newBreaksPalette()); paletteBox->addPalette(newFramePalette()); paletteBox->addPalette(newBeamPalette(PaletteType::ADVANCED)); + // set shortcuts in new palettes + QList cells; + for (Palette* p : paletteBox->palettes()) { + for (PaletteCell* cell : p->getCells()) { + cells.append(cell); + //cell->shortcut = shortcuts[i]; + //i++; + } + } + for (int i = 0; i < shortcuts.size(); i++) { + cells[i]->shortcut = shortcuts[i]; + } } //--------------------------------------------------------- @@ -1562,6 +1581,12 @@ void MuseScore::setAdvancedPalette() void MuseScore::setBasicPalette() { mscore->getPaletteBox(); + QList shortcuts; + for (Palette* p : paletteBox->palettes()) { + for (PaletteCell* cell : p->getCells()) { + shortcuts.append(cell->shortcut); + } + } paletteBox->clear(); paletteBox->addPalette(newClefsPalette(PaletteType::BASIC)); paletteBox->addPalette(newKeySigPalette(PaletteType::BASIC)); @@ -1577,6 +1602,13 @@ void MuseScore::setBasicPalette() paletteBox->addPalette(newRepeatsPalette()); paletteBox->addPalette(newBreaksPalette()); paletteBox->addPalette(newBeamPalette(PaletteType::BASIC)); + int i = 0; + for (Palette* p : paletteBox->palettes()) { + for (PaletteCell* cell : p->getCells()) { + cell->shortcut = shortcuts[i]; + i++; + } + } } //--------------------------------------------------------- diff --git a/mscore/musescore.cpp b/mscore/musescore.cpp index 292cc1cbd761e..fefdc32bece62 100644 --- a/mscore/musescore.cpp +++ b/mscore/musescore.cpp @@ -36,7 +36,6 @@ #include "mixer.h" #include "selectionwindow.h" #include "palette.h" -#include "palettebox.h" #include "libmscore/part.h" #include "libmscore/drumset.h" #include "libmscore/instrtemplate.h" @@ -112,6 +111,8 @@ #include "startcenter.h" #include "help.h" #include "awl/aslider.h" +//#include "pluginCreator.h" +//#include "pluginManager.h" #ifdef USE_LAME #include "exportmp3.h" @@ -4234,6 +4235,59 @@ void MuseScore::showPluginManager() #endif } +//--------------------------------------------------------- +// showPaletteShortcutManager +//--------------------------------------------------------- + +void MuseScore::showPaletteShortcutManager() + { +#ifdef SCRIPT_INTERFACE + if (!paletteShortcutManager) + paletteShortcutManager = new PaletteShortcutManager(0); + paletteShortcutManager->init(); + paletteShortcutManager->show(); +#endif + } + +//--------------------------------------------------------- +// getPaletteShortcutManager +//--------------------------------------------------------- + +PaletteShortcutManager* MuseScore::getPaletteShortcutManager() + { +#ifdef SCRIPT_INTERFACE + if (!paletteShortcutManager) + paletteShortcutManager = new PaletteShortcutManager(0); + paletteShortcutManager->init1(); + return paletteShortcutManager; +#endif + } + +QMenuBar* MuseScore::getMenuBar() + { + return menuBar(); + } + +//--------------------------------------------------------- +// loadPaletteShortcuts +//--------------------------------------------------------- + +void MuseScore::loadPaletteShortcuts() + { + if (!paletteShortcutMapper) { + paletteShortcutMapper = new QSignalMapper(this); + connect(paletteShortcutMapper, SIGNAL(mapped(int)), SLOT(paletteShortcutTriggered(int))); + } + for (int i = 0; i < preferences.paletteCellListMaster.size(); ++i) { + PaletteCellDescription* d = &preferences.paletteCellListMaster[i]; + registerPaletteShortcut(d); + } + for (int i = 0; i < preferences.paletteCellList.size(); ++i) { + PaletteCellDescription* d = &preferences.paletteCellList[i]; + registerPaletteShortcut(d); + } + } + //--------------------------------------------------------- // showMediaDialog //--------------------------------------------------------- @@ -4933,6 +4987,21 @@ void MuseScore::cmd(QAction* a, const QString& cmd) showPluginCreator(a); else if (cmd == "plugin-manager") showPluginManager(); + else if (cmd == "palette-shortcut-manager") + showPaletteShortcutManager(); + else if (cmd == "set-palette-shortcut") { + PaletteBox* pb = mscore->getPaletteBox(); + for (Palette* p : pb->palettes()) { + if (p->getCurrentIdx() != -1) { + PaletteCell* c = p->getCells()[p->getCurrentIdx()]; + if (c == 0) + return; + PaletteShortcutManager* pm = getPaletteShortcutManager(); + pm->setShortcut(c, p->getCurrentIdx()); + return; + } + } + } else if(cmd == "resource-manager"){ ResourceManager r(0); r.exec(); @@ -5446,6 +5515,82 @@ SynthesizerState MuseScore::synthesizerState() return synti ? synti->state() : state; } +//--------------------------------------------------------- +// registerPaletteShortcut +//--------------------------------------------------------- + +void MuseScore::registerPaletteShortcut(PaletteCellDescription* p) + { + QString name = p->cell->name; + /*int paletteShortcutIdx = paletteShortcuts.indexOf(p->cell); + if (paletteShortcutIdx == -1) { + paletteShortcuts.append(p->cell); + paletteShortcutIdx = paletteShortcuts.size() - 1; + } + else { + paletteShortcuts.replace(paletteShortcutIdx, p->cell); + } + + QAction* a = p->shortcut.action(); + int i = paletteCellActions.indexOf(a); + paletteCellActions.removeAll(a); + //if (i == -1) + paletteCellActions.append(a); + //else + // paletteCellActions.replace(i, a); + i = paletteCellActions.indexOf(a); + + //int paletteShortcutIdx = paletteShortcuts.size() - 1; + if (!paletteShortcutMapper) { + paletteShortcutMapper = new QSignalMapper(this); + connect(paletteShortcutMapper, SIGNAL(mapped(int)), SLOT(paletteShortcutTriggered(int))); + } + + connect(a, SIGNAL(triggered()), paletteShortcutMapper, SLOT(map())); + //paletteShortcutMapper->setMapping(a, paletteShortcutIdx); + paletteShortcutMapper->removeMappings(a); + paletteShortcutMapper->setMapping(a, paletteShortcutIdx);*/ + paletteShortcuts.append(p->cell); + QAction* a = p->shortcut.action(); + paletteCellActions.append(a); + int paletteShortcutIdx = paletteShortcuts.size() - 1; + if (!paletteShortcutMapper) { + paletteShortcutMapper = new QSignalMapper(this); + connect(paletteShortcutMapper, SIGNAL(mapped(int)), SLOT(paletteShortcutTriggered(int))); + } + connect(a, SIGNAL(triggered()), paletteShortcutMapper, SLOT(map())); + paletteShortcutMapper->setMapping(a, paletteShortcutIdx); + } + +//--------------------------------------------------------- +// unregisterPaletteShortcut +//--------------------------------------------------------- + +void MuseScore::unregisterPaletteShortcut(PaletteCellDescription* p) + { + //QString s = p->cell->getParent()->name() + ":" + p->cell->cellName(); + paletteShortcuts.removeAll(p->cell); + QAction* a = p->shortcut.action(); + paletteCellActions.removeAll(a); + + disconnect(a, SIGNAL(triggered()), paletteShortcutMapper, SLOT(map())); + paletteShortcutMapper->removeMappings(a); + } + +//--------------------------------------------------------- +// paletteShortcutTriggered +//--------------------------------------------------------- + +void MuseScore::paletteShortcutTriggered(int i) + { + PaletteCell* c = paletteShortcuts[i]; + Palette* p = c->getParent(); + if (!p) + p = c->getParentMaster(); + + p->applyPaletteElement(c); + } + //--------------------------------------------------------- // canSaveMp3 //--------------------------------------------------------- diff --git a/mscore/musescore.h b/mscore/musescore.h index 51319a71f44ea..eaaa0a726893e 100644 --- a/mscore/musescore.h +++ b/mscore/musescore.h @@ -34,6 +34,10 @@ #include "libmscore/musescoreCore.h" #include "libmscore/score.h" #include "newwizard.h" +#include "preferences.h" +#include "paletteShortcutManager.h" +#include "pluginManager.h" +#include "pluginCreator.h" namespace Ms { @@ -91,6 +95,7 @@ class Sym; class MasterPalette; class PluginCreator; class PluginManager; +class PaletteShortcutManager; class MasterSynthesizer; class SynthesizerState; class Driver; @@ -101,6 +106,7 @@ class HelpBrowser; class ToolbarEditor; struct PluginDescription; +struct PaletteCellDescription; enum class SelState : char; enum class IconType : signed char; enum class MagIdx : char; @@ -277,6 +283,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { MasterPalette* masterPalette { 0 }; PluginCreator* _pluginCreator { 0 }; PluginManager* pluginManager { 0 }; + PaletteShortcutManager* paletteShortcutManager { 0 }; SelectionWindow* selectionWindow { 0 }; QMenu* menuFile; @@ -334,6 +341,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { bool _midiinEnabled { true }; QList plugins; + QList paletteShortcuts; ScriptEngine* se { 0 }; QString pluginPath; @@ -342,7 +350,9 @@ class MuseScore : public QMainWindow, public MuseScoreCore { QTimer* autoSaveTimer; QList pluginActions; + QList paletteCellActions; QSignalMapper* pluginMapper { 0 }; + QSignalMapper* paletteShortcutMapper { 0 }; PianorollEditor* pianorollEditor { 0 }; DrumrollEditor* drumrollEditor { 0 }; @@ -518,6 +528,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { void dirtyChanged(Score*); void setPos(int tick); void pluginTriggered(int); + void paletteShortcutTriggered(int); void handleMessage(const QString& message); void setCurrentScoreView(ScoreView*); void setCurrentScoreView(int); @@ -565,6 +576,12 @@ class MuseScore : public QMainWindow, public MuseScoreCore { void updateDrumTools(const Drumset* ds); void showPluginCreator(QAction*); void showPluginManager(); + void showPaletteShortcutManager(); + PaletteShortcutManager* getPaletteShortcutManager(); + bool paletteShortcutMapperNull() { return paletteShortcutMapper == 0; } + void clearPaletteShortcutMapper() { paletteShortcutMapper = 0; } + PreferenceDialog* getPreferenceDialog() { return preferenceDialog; } + void clearPaletteShortcuts() { paletteShortcuts.clear(); } // void updateTabNames(); QProgressBar* showProgressBar(); @@ -589,6 +606,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { virtual void setCurrentView(int tabIdx, int idx); void loadPlugins(); void unloadPlugins(); + void loadPaletteShortcuts(); ScoreState state() const { return _sstate; } void changeState(ScoreState); @@ -735,6 +753,9 @@ class MuseScore : public QMainWindow, public MuseScoreCore { void registerPlugin(PluginDescription*); void unregisterPlugin(PluginDescription*); + void registerPaletteShortcut(PaletteCellDescription*); + void unregisterPaletteShortcut(PaletteCellDescription*); + Q_INVOKABLE void showStartcenter(bool); void showPlayPanel(bool); @@ -742,6 +763,8 @@ class MuseScore : public QMainWindow, public MuseScoreCore { void saveDialogState(const char* name, QFileDialog* d); void restoreDialogState(const char* name, QFileDialog* d); + QMenuBar* getMenuBar(); + QPixmap extractThumbnail(const QString& name); void showLoginDialog(); diff --git a/mscore/palette.cpp b/mscore/palette.cpp index 5239613945f9c..fa98594f220b4 100644 --- a/mscore/palette.cpp +++ b/mscore/palette.cpp @@ -12,6 +12,7 @@ //============================================================================= #include "palette.h" +#include "palettebox.h" #include "musescore.h" #include "libmscore/element.h" #include "libmscore/style.h" @@ -45,6 +46,7 @@ #include "libmscore/slur.h" #include "paletteBoxButton.h" #include "palettebox.h" +#include "workspace.h" namespace Ms { @@ -53,6 +55,54 @@ PaletteCell::~PaletteCell() delete element; } +PaletteCell::PaletteCell(Palette* p) + { + parent = p; + shortcut.setDescr(name); + shortcut.setState(STATE_NORMAL | STATE_NOTE_ENTRY); + } + +//--------------------------------------------------------- +// getParentMaster +// returns the master palette to which the cell belongs +//--------------------------------------------------------- + +Palette* PaletteCell::getParentMaster() + { + Palette* parent = 0; + QList palettes = mscore->getPaletteShortcutManager()->getPalettes(); + for (Palette* p : palettes) { + for (PaletteCell* c : p->getCells()) { + if (c->cellName() == name) { + parent = p; + break; + } + } + } + return parent; + } + + +//--------------------------------------------------------- +// getParent +// returns the palette to which the cell belongs +//--------------------------------------------------------- + +Palette* PaletteCell::getParent() + { + Palette* parent = 0; + PaletteBox* pb = mscore->getPaletteBox(); + for (Palette* p : pb->palettes()) { + for (PaletteCell* c : p->getCells()) { + if (c->cellName() == name) { + parent = p; + break; + } + } + } + return parent; + } + //--------------------------------------------------------- // needsStaff // should a staff been drawn if e is used as icon in @@ -181,7 +231,7 @@ void Palette::setMoreElements(bool val) { _moreElements = val; if (val && (cells.isEmpty() || cells.back()->tag != "ShowMore")) { - PaletteCell* cell = new PaletteCell; + PaletteCell* cell = new PaletteCell(this); cell->name = "Show More"; cell->tag = "ShowMore"; cells.append(cell); @@ -249,6 +299,8 @@ void Palette::contextMenuEvent(QContextMenuEvent* event) contextAction->setEnabled(!_readOnly); QAction* moreAction = menu.addAction(tr("More Elements...")); moreAction->setEnabled(_moreElements); + QAction* setShortcutAction = menu.addAction(tr("Set Shortcut")); + QAction* clearShortcutAction = menu.addAction(tr("Clear Shortcut")); if (cellAt(i) && cellAt(i)->readOnly) clearAction->setEnabled(false); @@ -270,6 +322,23 @@ void Palette::contextMenuEvent(QContextMenuEvent* event) if (props.exec()) emit changed(); } + else if (action == setShortcutAction) { + PaletteCell* c = cellAt(i); + if (c == 0) + return; + PaletteShortcutManager* p = mscore->getPaletteShortcutManager(); + p->setShortcut(c, i); + emit changed(); + } + else if (action == clearShortcutAction) { + PaletteCell* c = cellAt(i); + if (c == 0) + return; + c->shortcut.clear(); + PaletteShortcutManager* p = mscore->getPaletteShortcutManager(); + p->clearShortcut(c); + emit changed(); + } else if (moreAction && (action == moreAction)) emit displayMore(_name); @@ -827,6 +896,7 @@ void Palette::leaveEvent(QEvent*) //--------------------------------------------------------- // nextPaletteElement //--------------------------------------------------------- + void Palette::nextPaletteElement() { PaletteBox* pb = mscore->getPaletteBox(); @@ -892,7 +962,7 @@ PaletteCell* Palette::append(Element* s, const QString& name, QString tag, qreal cells.append(0); return 0; } - PaletteCell* cell = new PaletteCell; + PaletteCell* cell = new PaletteCell(this); int idx; if (_moreElements) { cells.insert(cells.size() - 1, cell); @@ -920,7 +990,7 @@ PaletteCell* Palette::add(int idx, Element* s, const QString& name, QString tag, s->setReadPos(QPointF()); } - PaletteCell* cell = new PaletteCell; + PaletteCell* cell = new PaletteCell(this); if (idx < cells.size()) { delete cells[idx]; } @@ -1240,6 +1310,17 @@ void Palette::write(XmlWriter& xml) const if (cells[i]->mag != 1.0) xml.tag("mag", cells[i]->mag); cells[i]->element->write(xml); + // get shortcut for cell[i] + cells[i]->shortcut.write(xml); + + /*QList paletteShortcuts = preferences.paletteCellListMaster; + for (PaletteCellDescription d : paletteShorcuts) { + if (d.description == cells[i]->cellName()) { + Shortcut* s = d.shortcut; + if (!s->keys().isEmpty()) + s->write(); + } + }*/ xml.etag(); } xml.etag(); @@ -1465,7 +1546,7 @@ void Palette::read(XmlReader& e) else if (t == "drumPalette") // obsolete e.skipCurrentElement(); else if (t == "Cell") { - PaletteCell* cell = new PaletteCell; + PaletteCell* cell = new PaletteCell(this); cell->name = e.attribute("name"); bool add = true; while (e.readNextStartElement()) { @@ -1480,6 +1561,26 @@ void Palette::read(XmlReader& e) cell->mag = e.readDouble(); else if (t == "tag") cell->tag = e.readElementText(); + else if (t == "SC") { + Shortcut s; + s.read(e); + s.action()->setShortcuts(s.keys()); + mscore->addAction(s.action()); + cell->shortcut = s; + + //if (!Workspace::currentWorkspace->loaded()) { //&& !cell->shortcut.keys().isEmpty() + PaletteCellDescription pd; + pd.cell = cell; + pd.description = cell->cellName(); + pd.load = true; + pd.shortcut = cell->shortcut; + pd.shortcut.setDescr(cell->cellName()); + pd.shortcut.setState(STATE_NORMAL | STATE_NOTE_ENTRY); + mscore->registerPaletteShortcut(&pd); + mscore->getPaletteShortcutManager()->getPrefs().paletteCellList.append(pd); + // store idx in paletteCellList? + //} + } else { cell->element = Element::name2Element(t, gscore); if (cell->element == 0) { @@ -1500,6 +1601,7 @@ void Palette::read(XmlReader& e) add = false; // action is not valid, don't add it to the palette. } } + } } } @@ -1516,6 +1618,8 @@ void Palette::read(XmlReader& e) hgrid = 28; if (vgrid <= 0) vgrid = 28; + + mscore->loadPaletteShortcuts(); } //--------------------------------------------------------- diff --git a/mscore/palette.h b/mscore/palette.h index c2bf94a228f01..193eb1b2b3e17 100644 --- a/mscore/palette.h +++ b/mscore/palette.h @@ -24,6 +24,7 @@ #include "ui_palette.h" #include "ui_cellproperties.h" #include "libmscore/sym.h" +#include "shortcut.h" namespace Ms { @@ -39,10 +40,13 @@ class Palette; struct PaletteCell { ~PaletteCell(); + PaletteCell(Palette* p); Element* element { 0 }; QString name; // used for tool tip QString tag; + Palette* parent; + Shortcut shortcut; bool drawStaff { false }; double x { 0.0 }; @@ -51,6 +55,12 @@ struct PaletteCell { double yoffset { 0.0 }; // in spatium units of "gscore" qreal mag { 1.0 }; bool readOnly { false }; + QString cellName() { return name; } + Palette* getParentMaster(); + Palette* getParent(); + Element* getElement() { return element; } + void setShortcut(Shortcut s) { shortcut = s; } + Shortcut getShortcut() { return shortcut; } }; //--------------------------------------------------------- @@ -137,7 +147,6 @@ class Palette : public QWidget { virtual void leaveEvent(QEvent*) override; virtual bool event(QEvent*) override; virtual void resizeEvent(QResizeEvent*) override; - void applyPaletteElement(PaletteCell* cell); virtual void dragEnterEvent(QDragEnterEvent*) override; virtual void dragMoveEvent(QDragMoveEvent*) override; @@ -218,6 +227,8 @@ class Palette : public QWidget { virtual int heightForWidth(int) const; virtual QSize sizeHint() const; int idx(const QPoint&) const; + QList getCells() { return cells; } + void applyPaletteElement(PaletteCell* cell); }; diff --git a/mscore/paletteShortcutManager.cpp b/mscore/paletteShortcutManager.cpp new file mode 100644 index 0000000000000..ea2d295248dcb --- /dev/null +++ b/mscore/paletteShortcutManager.cpp @@ -0,0 +1,459 @@ +//============================================================================= +// MuseScore +// Music Composition & Notation +// $Id: palette.cpp 5576 2012-04-24 19:15:22Z wschweer $ +// +// Copyright (C) 2011 Werner Schweer and others +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 +// as published by the Free Software Foundation and appearing in +// the file LICENSE.GPL +//============================================================================= + +#include "paletteShortcutManager.h" +#include "shortcutcapturedialog.h" +#include "musescore.h" +#include "palette.h" +#include "palettebox.h" + + +namespace Ms { + +//--------------------------------------------------------- +// PaletteShortcutManager +//--------------------------------------------------------- + +PaletteShortcutManager::PaletteShortcutManager(QWidget *parent) : QDialog(parent) + { + setObjectName("PaletteShortcutManager"); + setupUi(this); + setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint); + connect(definePaletteShortcut, SIGNAL(clicked()), SLOT(definePaletteShortcutClicked())); + connect(clearPaletteShortcut, SIGNAL(clicked()), SLOT(clearPaletteShortcutClicked())); + readSettings(); + } + +void PaletteShortcutManager::addPaletteElements(Palette* p) + { + for (PaletteCell* c : p->getCells()) { + PaletteCellDescription d; + d.cell = c; + d.description = c->cellName(); + d.load = true; + d.shortcut = c->getShortcut(); + d.shortcut.setDescr(c->cellName()); + d.shortcut.setState(STATE_NORMAL | STATE_NOTE_ENTRY); + prefs.paletteCellListMaster.append(d); + } + } + +void PaletteShortcutManager::loadPaletteElements() + { + if (palettes.isEmpty()) { + palettes.append(mscore->newClefsPalette(PaletteType::MASTER)); + palettes.append(MuseScore::newKeySigPalette(PaletteType::MASTER)); + palettes.append(MuseScore::newTimePalette()); + palettes.append(MuseScore::newBracketsPalette()); + palettes.append(MuseScore::newAccidentalsPalette(PaletteType::MASTER)); + palettes.append(MuseScore::newArticulationsPalette(PaletteType::MASTER)); + palettes.append(MuseScore::newOrnamentsPalette()); + palettes.append(MuseScore::newBreathPalette()); + palettes.append(MuseScore::newGraceNotePalette(PaletteType::MASTER)); + palettes.append(MuseScore::newNoteHeadsPalette()); + palettes.append(MuseScore::newLinesPalette(PaletteType::MASTER)); + palettes.append(MuseScore::newBarLinePalette(PaletteType::MASTER)); + palettes.append(MuseScore::newArpeggioPalette()); + palettes.append(MuseScore::newTremoloPalette()); + palettes.append(MuseScore::newTextPalette()); + palettes.append(MuseScore::newTempoPalette(PaletteType::MASTER)); + palettes.append(MuseScore::newDynamicsPalette(PaletteType::MASTER)); + palettes.append(MuseScore::newFingeringPalette()); + palettes.append(MuseScore::newRepeatsPalette()); + palettes.append(MuseScore::newFretboardDiagramPalette()); + palettes.append(MuseScore::newBagpipeEmbellishmentPalette()); + palettes.append(MuseScore::newBreaksPalette()); + palettes.append(MuseScore::newFramePalette()); + palettes.append(MuseScore::newBeamPalette(PaletteType::MASTER)); + } + + if (prefs.paletteCellListMaster.isEmpty()) { + for (Palette* p : palettes) { + addPaletteElements(p); + } + } + } + +void PaletteShortcutManager::loadPaletteElements1() + { + if (prefs.paletteCellList.isEmpty()) { + PaletteBox* pb = mscore->getPaletteBox(); + for (Palette* p : pb->palettes()) { + for (PaletteCell* c : p->getCells()) { + PaletteCellDescription d; + d.cell = c; + d.description = c->cellName(); + d.load = true; + d.shortcut = c->getShortcut(); + d.shortcut.setDescr(c->cellName()); + d.shortcut.setState(STATE_NORMAL | STATE_NOTE_ENTRY); + prefs.paletteCellList.append(d); + } + } + } + } + +//--------------------------------------------------------- +// init +//--------------------------------------------------------- + +void PaletteShortcutManager::init() + { + // + // initialize local shortcut table + // we need a deep copy to be able to rewind all + // changes on "Abort" + // + + localShortcuts.clear(); + for (const Shortcut* s : Shortcut::shortcuts()) + localShortcuts[s->key()] = new Shortcut(*s); + shortcutsChanged = false; + + loadPaletteElements(); + loadPaletteElements1(); + + int n = prefs.paletteCellListMaster.size(); + paletteCellList->clear(); + for (int i = 0; i < n; ++i) { + PaletteCellDescription& d = prefs.paletteCellListMaster[i]; + Shortcut* s = &d.shortcut; + if (s->keys().isEmpty()) + localShortcuts[s->key()] = new Shortcut(*s); + else + localShortcuts[s->key()] = s; + + PaletteCell* cell = d.cell; + Palette* parent = 0; + for (Palette* p : palettes) { + for (PaletteCell* c : p->getCells()) { + if (c->cellName() == cell->cellName()) { + parent = p; + break; + } + } + } + + Q_ASSERT(parent != 0); + + QString itemName = parent->name() + ":" + cell->cellName(); + QListWidgetItem* item = new QListWidgetItem(itemName, paletteCellList); + item->setFlags(item->flags() | Qt::ItemIsEnabled); + item->setData(Qt::UserRole, i); + } + + mscore->loadPaletteShortcuts(); + + if (n) { + paletteCellList->setCurrentRow(0); + paletteCellListItemChanged(paletteCellList->item(0), 0); + } + connect(paletteCellList, SIGNAL(itemChanged(QListWidgetItem*)), SLOT(paletteCellLoadToggled(QListWidgetItem*))); + connect(paletteCellList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), + SLOT(paletteCellListItemChanged(QListWidgetItem*, QListWidgetItem*))); + + } + +//--------------------------------------------------------- +// init1 +//--------------------------------------------------------- + +void PaletteShortcutManager::init1() + { + // + // initialize local shortcut table + // we need a deep copy to be able to rewind all + // changes on "Abort" + // + + localShortcuts.clear(); + for (const Shortcut* s : Shortcut::shortcuts()) + localShortcuts[s->key()] = new Shortcut(*s); + shortcutsChanged = false; + loadPaletteElements1(); + loadPaletteElements(); + + mscore->loadPaletteShortcuts(); + } + + +//--------------------------------------------------------- +// apply +//--------------------------------------------------------- + +void PaletteShortcutManager::accept() + { + if (shortcutsChanged) { + shortcutsChanged = false; + for (const Shortcut* s : localShortcuts) { + Shortcut* os = Shortcut::getShortcut(s->key()); + if (os) { + if (!os->compareKeys(*s)) + os->setKeys(s->keys()); + } + } + Shortcut::dirty = true; + } + int n = prefs.paletteCellListMaster.size(); + for (int i = 0; i < n; ++i) { + PaletteCellDescription& d = prefs.paletteCellListMaster[i]; + mscore->registerPaletteShortcut(&d); + } + preferences = prefs; + preferences.write(); + disconnect(paletteCellList, SIGNAL(itemChanged(QListWidgetItem*))); + disconnect(paletteCellList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*))); + QDialog::accept(); + } + +//--------------------------------------------------------- +// closeEvent +//--------------------------------------------------------- + +void PaletteShortcutManager::closeEvent(QCloseEvent* ev) + { + emit closed(false); + QWidget::closeEvent(ev); + } + +//--------------------------------------------------------- +// paletteCellListItemChanged +//--------------------------------------------------------- + +void PaletteShortcutManager::paletteCellListItemChanged(QListWidgetItem* item, QListWidgetItem*) + { + if (!item) + return; + int idx = item->data(Qt::UserRole).toInt(); + const PaletteCellDescription& d = prefs.paletteCellListMaster[idx]; + paletteCellName->setText(d.cell->cellName()); + paletteShortcut->setText(d.shortcut.keysToString()); + paletteCellDescription->setText(d.description); + } + +//--------------------------------------------------------- +// paletteCellLoadToggled +//--------------------------------------------------------- + +void PaletteShortcutManager::paletteCellLoadToggled(QListWidgetItem* item) + { + int idx = item->data(Qt::UserRole).toInt(); + PaletteCellDescription* d = &prefs.paletteCellListMaster[idx]; + d->load = (item->checkState() == Qt::Checked); + prefs.dirty = true; + } + +//--------------------------------------------------------- +// definePaletteShortcutClicked +//--------------------------------------------------------- + +void PaletteShortcutManager::definePaletteShortcutClicked() + { + QListWidgetItem* item = paletteCellList->currentItem(); + if (!item) + return; + + for (Shortcut* s : Shortcut::shortcuts()) { + if (s->keys().isEmpty()) + localShortcuts[s->key()] = new Shortcut(*s); + else + localShortcuts[s->key()] = s; + } + int idx = item->data(Qt::UserRole).toInt(); + PaletteCellDescription* pd = &prefs.paletteCellListMaster[idx]; + Shortcut* s = &pd->shortcut; + s->setDescr(pd->description); + s->setState(STATE_NORMAL | STATE_NOTE_ENTRY); + ShortcutCaptureDialog sc(s, localShortcuts, this); + int rv = sc.exec(); + if (rv == 0) // abort + return; + if (rv == 2) // replace + s->clear(); + + s->addShortcut(sc.getKey()); + QAction* action = s->action(); + action->setShortcuts(s->keys()); + mscore->addAction(action); + prefs.paletteCellListMaster[idx] = *pd; + + for (Palette* p : mscore->getPaletteBox()->palettes()) { + for (PaletteCell* c : p->getCells()) { + if (c->name == pd->description) { + c->shortcut = pd->shortcut; + break; + } + } + } + + /*int n = prefs.paletteCellList.size(); + for (int i = 0; i < n; i++) { + PaletteCellDescription d = prefs.paletteCellList[i]; + if (d.description == pd->description) { + d.shortcut = pd->shortcut; + prefs.paletteCellList[i] = d; + mscore->registerPaletteShortcut(&d); + } + }*/ + + paletteShortcut->setText(s->keysToString()); + prefs.dirty = true; + } + +//--------------------------------------------------------- +// setShortcut +//--------------------------------------------------------- + +void PaletteShortcutManager::setShortcut(PaletteCell* cell, int i) + { + PaletteCellDescription* pd = 0; + int idxMaster = -1; + bool master = false; + + if (!cell) + return; + + for (int i = 0; i < prefs.paletteCellListMaster.size(); i++) { + PaletteCellDescription* d = &prefs.paletteCellListMaster[i]; + if (d->cell->cellName() == cell->cellName()) { + pd = d; + idxMaster = i; + master = true; + break; + } + } + + /*Shortcut s = cell->shortcut; + s.setState(STATE_NORMAL | STATE_NOTE_ENTRY); + cell->setShortcut(s);*/ + cell->shortcut.setState(STATE_NORMAL | STATE_NOTE_ENTRY); + //Shortcut s = cell->shortcut; + ShortcutCaptureDialog sc(&cell->shortcut, localShortcuts, this); + + int rv = sc.exec(); + if (rv == 0) // abort + return; + if (rv == 2) // replace + cell->shortcut.clear(); + + cell->shortcut.addShortcut(sc.getKey()); + QAction* action = cell->shortcut.action(); + action->setShortcuts(cell->shortcut.keys()); + mscore->addAction(action); + PaletteCellDescription* d; + if (pd) { + pd->shortcut = cell->shortcut; + pd->shortcut.setDescr(cell->cellName()); + d = pd; + prefs.paletteCellListMaster[idxMaster] = *pd; + /*Shortcut* s = &pd->shortcut; + s->setDescr(cell->cellName()); + s->setState(STATE_NORMAL | STATE_NOTE_ENTRY);*/ + } + else { + d->cell = cell; + d->description = cell->cellName(); + d->load = true; + d->shortcut = cell->shortcut; + d->shortcut.setDescr(cell->cellName()); + d->shortcut.setState(STATE_NORMAL | STATE_NOTE_ENTRY); + } + mscore->registerPaletteShortcut(d); + //cell->setShortcut(s); + paletteShortcut->setText(cell->shortcut.keysToString()); + prefs.dirty = true; + } + +//--------------------------------------------------------- +// clearShortcut +//--------------------------------------------------------- + +void PaletteShortcutManager::clearShortcut(PaletteCell* cell) + { + PaletteCellDescription* pd = 0; + int idx = -1, idxMaster = -1; + for (int i = 0; i < prefs.paletteCellList.size(); i++) { + PaletteCellDescription* d = &prefs.paletteCellList[i]; + if (d->description == cell->cellName()) { + pd = d; + idx = i; + break; + } + } + + if (pd) { + pd->shortcut.clear(); + mscore->unregisterPaletteShortcut(pd); + prefs.paletteCellList[idx] = *pd; + } + + if (prefs.paletteCellListMaster.isEmpty()) + loadPaletteElements(); + + for (int i = 0; i < prefs.paletteCellListMaster.size(); i++) { + PaletteCellDescription* d = &prefs.paletteCellListMaster[i]; + if (d->description == cell->cellName()) { + pd = d; + idxMaster = i; + break; + } + } + + if (pd && idxMaster != -1) { + pd->shortcut.clear(); + mscore->unregisterPaletteShortcut(pd); + prefs.paletteCellListMaster[idxMaster] = *pd; + } + + } + +//--------------------------------------------------------- +// clearPaletteShortcutClicked +//--------------------------------------------------------- + +void PaletteShortcutManager::clearPaletteShortcutClicked() + { + QListWidgetItem* item = paletteCellList->currentItem(); + if (!item) + return; + int idx = item->data(Qt::UserRole).toInt(); + PaletteCellDescription* pd = &prefs.paletteCellListMaster[idx]; + Shortcut* s = &pd->shortcut; + s->clear(); + + QAction* action = s->action(); + action->setShortcuts(s->keys()); + + paletteShortcut->setText(s->keysToString()); + prefs.dirty = true; + } + +//--------------------------------------------------------- +// writeSettings +//--------------------------------------------------------- + +void PaletteShortcutManager::writeSettings() + { + MuseScore::saveGeometry(this); + } + +//--------------------------------------------------------- +// readSettings +//--------------------------------------------------------- + +void PaletteShortcutManager::readSettings() + { + MuseScore::restoreGeometry(this); + } + +} diff --git a/mscore/paletteShortcutManager.h b/mscore/paletteShortcutManager.h new file mode 100644 index 0000000000000..1522d2ffbbc89 --- /dev/null +++ b/mscore/paletteShortcutManager.h @@ -0,0 +1,67 @@ +//============================================================================= +// MuseScore +// Music Composition & Notation +// $Id: palette.cpp 5576 2012-04-24 19:15:22Z wschweer $ +// +// Copyright (C) 2011 Werner Schweer and others +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 +// as published by the Free Software Foundation and appearing in +// the file LICENSE.GPL +//============================================================================= + +#ifndef __PALETTE_SHORTCUT_MANAGER_H__ +#define __PALETTE_SHORTCUT_MANAGER_H__ + +#include "ui_paletteShortcutManager.h" +#include "preferences.h" +#include "palette.h" + +namespace Ms { + +class Shortcut; + +//--------------------------------------------------------- +// PaletteShortcutManager +//--------------------------------------------------------- + +class PaletteShortcutManager : public QDialog, public Ui::PaletteShortcutManager { + Q_OBJECT + + QMap localShortcuts; + bool shortcutsChanged; + Preferences prefs; + QList palettes; + + void readSettings(); + + virtual void closeEvent(QCloseEvent*); + virtual void accept(); + + private slots: + void definePaletteShortcutClicked(); + void clearPaletteShortcutClicked(); + void paletteCellListItemChanged(QListWidgetItem*, QListWidgetItem*); + void paletteCellLoadToggled(QListWidgetItem*); + + signals: + void closed(bool); + + public: + PaletteShortcutManager(QWidget* parent = 0); + void writeSettings(); + void init(); + void init1(); + void setShortcut(PaletteCell* cell, int i); + void clearShortcut(PaletteCell* c); + Preferences getPrefs() { return prefs; } + void addPaletteElements(Palette* p); + void loadPaletteElements(); + void loadPaletteElements1(); + QList getPalettes() { return palettes; } + }; + + +} // namespace Ms +#endif diff --git a/mscore/paletteShortcutManager.ui b/mscore/paletteShortcutManager.ui new file mode 100644 index 0000000000000..b73d745b8ebe3 --- /dev/null +++ b/mscore/paletteShortcutManager.ui @@ -0,0 +1,231 @@ + + + PaletteShortcutManager + + + Qt::ApplicationModal + + + + 0 + 0 + 582 + 382 + + + + Palette Shortcut Manager + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Name: + + + + + + + false + + + true + + + + + + + false + + + true + + + + + + + false + + + true + + + + + + + Version: + + + + + + + true + + + + + + + false + + + true + + + + + + + Path: + + + + + + + Shortcut: + + + + + + + 0 + + + + + Define Shortcut + + + + + + + Clear Shortcut + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + 0 + 0 + + + + QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked + + + QAbstractItemView::SelectRows + + + QListView::Adjust + + + true + + + + + + + pluginList + paletteCellName + pluginPath + pluginVersion + paletteShortcut + paletteCellDescription + definePaletteShortcut + + + + + buttonBox + accepted() + PaletteShortcutManager + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + PaletteShortcutManager + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/mscore/palettebox.cpp b/mscore/palettebox.cpp index 68f16238f674a..7cb22cc7e1372 100644 --- a/mscore/palettebox.cpp +++ b/mscore/palettebox.cpp @@ -17,6 +17,7 @@ #include "preferences.h" #include "libmscore/xml.h" #include "workspace.h" +#include "shortcutcapturedialog.h" namespace Ms { @@ -86,6 +87,10 @@ PaletteBox::PaletteBox(QWidget* parent) connect(addWorkspaceButton, SIGNAL(clicked()), SLOT(newWorkspaceClicked())); connect(workspaceList, SIGNAL(activated(int)), SLOT(workspaceSelected(int))); + + //connect(definePaletteShortcut, SIGNAL(clicked()), SLOT(definePluginShortcutClicked())); + //connect(clearPaletteShortcut, SIGNAL(clicked()), SLOT(clearPluginShortcutClicked())); + retranslate(); } diff --git a/mscore/palettebox.h b/mscore/palettebox.h index c4ca0f5a92062..f526ab9b74d2a 100644 --- a/mscore/palettebox.h +++ b/mscore/palettebox.h @@ -15,12 +15,14 @@ #define __PALETTE_BOX_H__ #include "paletteBoxButton.h" +#include "preferences.h" namespace Ms { class XmlWriter; class XmlReader; class Palette; +class Shortcut; //--------------------------------------------------------- // PaletteBox @@ -81,6 +83,38 @@ class PaletteBoxScrollArea : public QScrollArea { virtual QSize sizeHint() const; }; +//--------------------------------------------------------- +// PaletteShortcutManager +//--------------------------------------------------------- + +/*class PaletteShortcutManager : public QDialog, public Ui::PaletteShortcutManager { + Q_OBJECT + + QMap localShortcuts; + bool shortcutsChanged; + Preferences prefs; + + void readSettings(); + + virtual void closeEvent(QCloseEvent*); + virtual void accept(); + + private slots: + void definePaletteShortcutClicked(); + void clearPaletteShortcutClicked(); + void paletteCellListItemChanged(QListWidgetItem*, QListWidgetItem*); + void paletteCellLoadToggled(QListWidgetItem*); + + signals: + void closed(bool); + + public: + PaletteShortcutManager(QWidget* parent = 0); + void writeSettings(); + void init(); + };*/ + + } // namespace Ms #endif diff --git a/mscore/preferences.cpp b/mscore/preferences.cpp index 7719d0dbfbe81..8b102fb898a9a 100644 --- a/mscore/preferences.cpp +++ b/mscore/preferences.cpp @@ -46,6 +46,8 @@ #include "mstyle/mconfig.h" #include "resourceManager.h" #include "synthesizer/msynthesizer.h" +//#include "palette.h" +//#include "palettebox.h" namespace Ms { @@ -698,6 +700,7 @@ PreferenceDialog::PreferenceDialog(QWidget* parent) connect(resetShortcut, SIGNAL(clicked()), SLOT(resetShortcutClicked())); connect(saveShortcutList, SIGNAL(clicked()), SLOT(saveShortcutListClicked())); connect(loadShortcutList, SIGNAL(clicked()), SLOT(loadShortcutListClicked())); + connect(showPaletteShortcutManager, SIGNAL(clicked()), SLOT(showPaletteShortcutManagerClicked())); connect(clearShortcut, SIGNAL(clicked()), SLOT(clearShortcutClicked())); connect(defineShortcut, SIGNAL(clicked()), SLOT(defineShortcutClicked())); connect(resetToDefault, SIGNAL(clicked()), SLOT(resetAllValues())); @@ -1171,6 +1174,11 @@ void PreferenceDialog::loadShortcutListClicked() } } +void PreferenceDialog::showPaletteShortcutManagerClicked() + { + mscore->showPaletteShortcutManager(); + } + //--------------------------------------------------------- // clearShortcutClicked //--------------------------------------------------------- @@ -1999,6 +2007,35 @@ void Preferences::updatePluginList() #endif } +//--------------------------------------------------------- +// updatePaletteCellList +//--------------------------------------------------------- + +/*void Preferences::updatePaletteCellList() + { + PaletteBox* pb = mscore->getPaletteBox(); + for (Palette* p : pb->palettes()) { + for (PaletteCell* cell : p->getCells()) { + bool alreadyInList = false; + for (PaletteCellDescription& d : paletteCellList) { + if (d.cell == cell) { + alreadyInList = true; + break; + } + } + if (alreadyInList) + continue; + + PaletteCellDescription d; + d.cell = cell; + d.description = cell->cellName(); + d.load = false; + paletteCellList.append(d); + } + } + }*/ + + //--------------------------------------------------------- // printShortcutsClicked //--------------------------------------------------------- diff --git a/mscore/preferences.h b/mscore/preferences.h index e24374614bd2a..052f3f83fa31a 100644 --- a/mscore/preferences.h +++ b/mscore/preferences.h @@ -28,6 +28,9 @@ namespace Ms { extern QString mscoreGlobalShare; +class PaletteCell; +//class Palette; +//class PaletteBox; enum class SessionStart : char { EMPTY, LAST, NEW, SCORE @@ -81,6 +84,20 @@ struct PluginDescription { QString menuPath; }; +//--------------------------------------------------------- +// PaletteCellDescription +//--------------------------------------------------------- + +struct PaletteCellDescription { + QString path; + QString version; + QString description; + bool load; + Shortcut shortcut; + QString menuPath; + PaletteCell* cell; + }; + //--------------------------------------------------------- // Preferences //--------------------------------------------------------- @@ -190,10 +207,13 @@ struct Preferences { bool dirty; QList pluginList; + QList paletteCellListMaster; + QList paletteCellList; bool readPluginList(); void writePluginList(); void updatePluginList(); + //void updatePaletteCellList(); Preferences(); void write(); diff --git a/mscore/prefsdialog.h b/mscore/prefsdialog.h index e65c618129f97..e1cd2f45944a7 100644 --- a/mscore/prefsdialog.h +++ b/mscore/prefsdialog.h @@ -61,6 +61,7 @@ class PreferenceDialog : public AbstractDialog, private Ui::PrefsDialogBase { void resetShortcutClicked(); void saveShortcutListClicked(); void loadShortcutListClicked(); + void showPaletteShortcutManagerClicked(); void clearShortcutClicked(); void defineShortcutClicked(); void portaudioApiActivated(int idx); @@ -92,6 +93,7 @@ class PreferenceDialog : public AbstractDialog, private Ui::PrefsDialogBase { PreferenceDialog(QWidget* parent); ~PreferenceDialog(); void setPreferences(const Preferences& p); + Preferences getPreferences() { return prefs; } void updateRemote(); }; diff --git a/mscore/prefsdialog.ui b/mscore/prefsdialog.ui index 2707c83668035..eef6c9f7e30c4 100644 --- a/mscore/prefsdialog.ui +++ b/mscore/prefsdialog.ui @@ -4000,6 +4000,19 @@ + + + + Displays the Palette Shortcut Manager + + + Displays the Palette Shortcut Manager + + + Palette Shortcut Manager + + + diff --git a/mscore/shortcut.cpp b/mscore/shortcut.cpp index dcda9f04d603c..eb998e4c22a2f 100644 --- a/mscore/shortcut.cpp +++ b/mscore/shortcut.cpp @@ -2781,6 +2781,26 @@ Shortcut Shortcut::_sc[] = { Icons::Invalid_ICON, Qt::ApplicationShortcut }, + { + MsWidget::MAIN_WINDOW, + STATE_ALL, + "palette-shortcut-manager", + QT_TRANSLATE_NOOP("action", "Palette Shortcut Manager..."), + QT_TRANSLATE_NOOP("action", "Palette Shortcut Manager"), + 0, + Icons::Invalid_ICON, + Qt::ApplicationShortcut + }, + { + MsWidget::MAIN_WINDOW, + STATE_ALL, + "set-palette-shortcut", + QT_TRANSLATE_NOOP("action", "Set palette shortcut"), + QT_TRANSLATE_NOOP("action", "Set palette shortcut"), + 0, + Icons::Invalid_ICON, + Qt::ApplicationShortcut + }, { MsWidget::MAIN_WINDOW, STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY | STATE_EDIT | STATE_FOTO, diff --git a/mscore/shortcut.h b/mscore/shortcut.h index 57bec93f5002d..0a1de7da1df31 100644 --- a/mscore/shortcut.h +++ b/mscore/shortcut.h @@ -139,6 +139,7 @@ class Shortcut { QString descr() const; QString text() const; QString help() const; + void setDescr(QString s) { _descr = s.toUtf8(); } MsWidget assignedWidget() const { return _assignedWidget; } void clear(); //! remove shortcuts void reset(); //! reset to buildin diff --git a/mscore/shortcutcapturedialog.cpp b/mscore/shortcutcapturedialog.cpp index 4e5c55be56007..d47e8854d9c04 100644 --- a/mscore/shortcutcapturedialog.cpp +++ b/mscore/shortcutcapturedialog.cpp @@ -22,7 +22,9 @@ #include "shortcutcapturedialog.h" #include "musescore.h" #include "shortcut.h" - +#include "prefsdialog.h" +#include "palette.h" +#include "palettebox.h" namespace Ms { //--------------------------------------------------------- @@ -136,6 +138,25 @@ void ShortcutCaptureDialog::keyPress(QKeyEvent* e) bool conflict = false; QString msgString; + QList menuShortcuts; + QList ol = mscore->getMenuBar()->children(); + for (QObject* o : ol) { + QMenu* menu = qobject_cast(o); + if (!menu) + continue; + QString menuName = (menu->objectName()); + if (menuName == "Format" || menuName == "Debug" || menuName == "") + continue; + + QString s = (menu->objectName()) + " Menu"; + QString shortcut = Shortcut::getMenuShortcutString(menu); + QKeySequence k = Shortcut::keySeqFromString(shortcut, QKeySequence::PortableText); // check seq format + Shortcut* sh = new Shortcut(MsWidget::MAIN_WINDOW, -1, s.toUtf8()); + sh->setDescr(s); + sh->addShortcut(k); + menuShortcuts.append(sh); + } + for (Shortcut* ss : localShortcuts) { if (s == ss) continue; @@ -163,6 +184,73 @@ void ShortcutCaptureDialog::keyPress(QKeyEvent* e) break; } + for (Shortcut* ss : menuShortcuts) { + if (s == ss) + continue; + if (!(s->state() & ss->state())) // no conflict if states do not overlap + continue; + + for (const QKeySequence& ks : ss->keys()) { + if (ks == key) { + if (s->descr() == ss->descr()) // check if cell name is unique + continue; + msgString = tr("Shortcut conflicts with ") + ss->key(); + conflict = true; + break; + } + } + if (conflict) + break; + } + + Preferences prefs = mscore->getPaletteShortcutManager()->getPrefs(); + if (prefs.paletteCellList.isEmpty()) + mscore->getPaletteShortcutManager()->init1(); + + for (PaletteCellDescription d : prefs.paletteCellList) { + Shortcut* ss = &d.shortcut; + if (s == ss) + continue; + if (!(s->state() & ss->state())) // no conflict if states do not overlap + continue; + + for (const QKeySequence& ks : ss->keys()) { + if (ks == key) { + if (s->descr() == ss->descr()) // check if cell name is unique + continue; + + msgString = tr("Shortcut conflicts with ") + ss->descr(); + conflict = true; + break; + } + } + if (conflict) + break; + } + + if (prefs.paletteCellListMaster.isEmpty()) + mscore->getPaletteShortcutManager()->init(); + + for (PaletteCellDescription d : prefs.paletteCellListMaster) { + Shortcut* ss = &d.shortcut; + if (s == ss) + continue; + if (!(s->state() & ss->state())) // no conflict if states do not overlap + continue; + + for (const QKeySequence& ks : ss->keys()) { + if (ks == key) { + if (s->descr() == ss->descr()) // check if cell name is unique + continue; + msgString = tr("Shortcut conflicts with ") + ss->descr(); + conflict = true; + break; + } + } + if (conflict) + break; + } + messageLabel->setText(msgString); if (conflict) { diff --git a/mscore/workspace.cpp b/mscore/workspace.cpp index 7af812cd58f23..158bf9f9de8fe 100644 --- a/mscore/workspace.cpp +++ b/mscore/workspace.cpp @@ -196,7 +196,7 @@ void MuseScore::changeWorkspace(QAction* a) preferences.workspace = Workspace::currentWorkspace->name(); preferences.dirty = true; PaletteBox* paletteBox = mscore->getPaletteBox(); - paletteBox->updateWorkspaces(); + paletteBox->updateWorkspaces(); return; } } @@ -210,7 +210,13 @@ void MuseScore::changeWorkspace(QAction* a) void MuseScore::changeWorkspace(Workspace* p) { Workspace::currentWorkspace->save(); - p->read(); + //if (p->path() == "Advanced" && !p->loaded()) + // p->read(); + //else + //if (!p->loaded()) + // p->read(); + //else + p->read1(); Workspace::currentWorkspace = p; } @@ -334,10 +340,10 @@ void Workspace::write() extern QString readRootFile(MQZipReader*, QList&); //--------------------------------------------------------- -// read +// read1 //--------------------------------------------------------- -void Workspace::read() +void Workspace::read1() { if (_path == "Advanced") { mscore->setAdvancedPalette(); @@ -353,6 +359,7 @@ void Workspace::read() p->setSystemPalette(true); mscore->setNoteInputMenuEntries(MuseScore::basicNoteInputMenuEntries()); mscore->populateNoteInputMenu(); + _loaded = true; return; } if (_path.isEmpty() || !QFile(_path).exists()) { @@ -361,7 +368,10 @@ void Workspace::read() return; } QFileInfo fi(_path); - _readOnly = !fi.isWritable(); + if (_path == "Basic" || _path == "Advanced") + _readOnly = true; + else + _readOnly = !fi.isWritable(); MQZipReader f(_path); QList images; @@ -390,6 +400,72 @@ void Workspace::read() } } } + if (!_loaded) + _loaded = true; + } + +//--------------------------------------------------------- +// read +//--------------------------------------------------------- + +void Workspace::read() + { + /*if (_path == "Advanced") { + mscore->setAdvancedPalette(); + for (Palette* p : mscore->getPaletteBox()->palettes()) + p->setSystemPalette(true); + mscore->setNoteInputMenuEntries(MuseScore::advancedNoteInputMenuEntries()); + mscore->populateNoteInputMenu(); + return; + } + if (_path == "Basic") { + mscore->setBasicPalette(); + for (Palette* p : mscore->getPaletteBox()->palettes()) + p->setSystemPalette(true); + mscore->setNoteInputMenuEntries(MuseScore::basicNoteInputMenuEntries()); + mscore->populateNoteInputMenu(); + return; + }*/ + if (_path.isEmpty() || !QFile(_path).exists()) { + qDebug("cannot read workspace <%s>", qPrintable(_path)); + mscore->setAdvancedPalette(); // set default palette + return; + } + QFileInfo fi(_path); + if (_path == "Basic" || _path == "Advanced") + _readOnly = true; + else + _readOnly = !fi.isWritable(); + + MQZipReader f(_path); + QList images; + QString rootfile = readRootFile(&f, images); + // + // load images + // + for (const QString& s : images) + imageStore.add(s, f.fileData(s)); + + if (rootfile.isEmpty()) { + qDebug("can't find rootfile in: %s", qPrintable(_path)); + return; + } + + QByteArray ba = f.fileData(rootfile); + XmlReader e(gscore, ba); + + while (e.readNextStartElement()) { + if (e.name() == "museScore") { + while (e.readNextStartElement()) { + if (e.name() == "Workspace") + read(e); + else + e.unknown(); + } + } + } + if (!_loaded) + _loaded = true; } void Workspace::read(XmlReader& e) @@ -447,8 +523,8 @@ void Workspace::read(XmlReader& e) void Workspace::save() { - if (_readOnly) - return; + //if (_readOnly) + // return; PaletteBox* pb = mscore->getPaletteBox(); if (pb) write(); diff --git a/mscore/workspace.h b/mscore/workspace.h index 60016db9bfa11..232f79f1f7f2e 100644 --- a/mscore/workspace.h +++ b/mscore/workspace.h @@ -40,6 +40,7 @@ class Workspace : public QObject { QString _path; bool _dirty; bool _readOnly; + bool _loaded { false }; // true if the workspace has been loaded once public slots: void setDirty(bool val = true) { _dirty = val; } @@ -59,6 +60,7 @@ class Workspace : public QObject { void write(); void read(XmlReader&); void read(); + void read1(); bool readOnly() const { return _readOnly; } void setReadOnly(bool val) { _readOnly = val; } @@ -68,6 +70,7 @@ class Workspace : public QObject { static Workspace* createNewWorkspace(const QString& name); static bool workspacesRead; static void writeBuiltinWorkspace(); + bool loaded() { return _loaded; } }; } #endif