//=============================================================================
//  MuseScore
//  Music Composition & Notation
//
//  Copyright (C) 2011-2016 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 "globals.h"
#include "shortcut.h"
#include "icons.h"
#include "libmscore/xml.h"

namespace Ms {
bool Shortcut::dirty = false;
QString Shortcut::source;
QHash<QByteArray, Shortcut*> Shortcut::_shortcuts;
extern QString dataPath;

//---------------------------------------------------------
//    initial list of shortcuts
//---------------------------------------------------------

Shortcut Shortcut::_sc[] = {
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "help",
        QT_TRANSLATE_NOOP("action","Online Handbook…"),    // Appears in menu
        QT_TRANSLATE_NOOP("action","Online handbook"),       // Appears in Edit > Preferences > Shortcuts
        QT_TRANSLATE_NOOP("action","Show online handbook"),  // Appears if you use Help > What's This?
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut,
        ShortcutFlags::NONE | ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_DISABLED | STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "file-open",
        QT_TRANSLATE_NOOP("action","Open…"),
        QT_TRANSLATE_NOOP("action","File > Open"),
        QT_TRANSLATE_NOOP("action","Load score from file"),
        Icons::fileOpen_ICON
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_LYRICS_EDIT
        | STATE_HARMONY_FIGBASS_EDIT | STATE_PLAY,
        "file-save",
        QT_TRANSLATE_NOOP("action","Save"),
        QT_TRANSLATE_NOOP("action","File > Save"),
        QT_TRANSLATE_NOOP("action","Save score to file"),
        Icons::fileSave_ICON
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "file-save-online",
        QT_TRANSLATE_NOOP("action","Save Online…"),
        QT_TRANSLATE_NOOP("action","File > Save online"),
        QT_TRANSLATE_NOOP("action","Save score on MuseScore.com"),
        Icons::fileSaveOnline_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_LYRICS_EDIT
        | STATE_HARMONY_FIGBASS_EDIT | STATE_PLAY,
        "file-save-as",
        QT_TRANSLATE_NOOP("action","Save As…"),
        QT_TRANSLATE_NOOP("action","File > Save as"),
        QT_TRANSLATE_NOOP("action","Save score under a new file name"),
        Icons::fileSaveAs_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "file-save-selection",
        QT_TRANSLATE_NOOP("action","Save Selection…"),
        QT_TRANSLATE_NOOP("action","Save selection"),
        QT_TRANSLATE_NOOP("action","Save current selection as new score"),
        Icons::fileSaveAs_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "file-save-a-copy",
        QT_TRANSLATE_NOOP("action","Save a Copy…"),
        QT_TRANSLATE_NOOP("action","File > Save a copy"),
        QT_TRANSLATE_NOOP("action","Save a copy of the score in addition to the current file"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "file-export",
        QT_TRANSLATE_NOOP("action","Export…"),
        QT_TRANSLATE_NOOP("action","Export score"),
        QT_TRANSLATE_NOOP("action","Save a copy of the score in various formats"),
        Icons::fileSave_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "file-part-export",
        QT_TRANSLATE_NOOP("action","Export Parts…"),
        QT_TRANSLATE_NOOP("action","Export parts"),
        QT_TRANSLATE_NOOP("action","Save a copy of the score's parts in various formats"),
        Icons::fileSave_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_DISABLED | STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "file-import-pdf",
        QT_TRANSLATE_NOOP("action","Import PDF…"),
        QT_TRANSLATE_NOOP("action","Import PDF"),
        QT_TRANSLATE_NOOP("action","Import a PDF file with an experimental service on musescore.com")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "file-close",
        QT_TRANSLATE_NOOP("action","Close"),
        QT_TRANSLATE_NOOP("action","File > Close"),
        QT_TRANSLATE_NOOP("action","Close current score")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_DISABLED | STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "file-new",
        QT_TRANSLATE_NOOP("action","New…"),
        QT_TRANSLATE_NOOP("action","File > New"),
        QT_TRANSLATE_NOOP("action","Create new score"),
        Icons::fileNew_ICON,
        Qt::ApplicationShortcut
    },
    {
        Ms::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "print",
        QT_TRANSLATE_NOOP("action","Print…"),
        QT_TRANSLATE_NOOP("action","Print"),
        QT_TRANSLATE_NOOP("action","Print score/part"),
        Icons::print_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_LYRICS_EDIT,
        "undo",
        QT_TRANSLATE_NOOP("action","Undo"),
        QT_TRANSLATE_NOOP("action","Undo"),
        QT_TRANSLATE_NOOP("action","Undo last change"),
        Icons::undo_ICON,
        Qt::ApplicationShortcut,
        ShortcutFlags::A_UNDO_REDO
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_LYRICS_EDIT,
        "redo",
        QT_TRANSLATE_NOOP("action","Redo"),
        QT_TRANSLATE_NOOP("action","Redo"),
        QT_TRANSLATE_NOOP("action","Redo last undo"),
        Icons::redo_ICON,
        Qt::ApplicationShortcut,
        ShortcutFlags::A_UNDO_REDO
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_LYRICS_EDIT
        | STATE_HARMONY_FIGBASS_EDIT,
        "cut",
        QT_TRANSLATE_NOOP("action","Cut"),
        0,
        0,
        Icons::cut_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_LYRICS_EDIT
        | STATE_HARMONY_FIGBASS_EDIT | STATE_FOTO,
        "copy",
        QT_TRANSLATE_NOOP("action","Copy"),
        0,
        0,
        Icons::copy_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_LYRICS_EDIT
        | STATE_HARMONY_FIGBASS_EDIT,
        "paste",
        QT_TRANSLATE_NOOP("action","Paste"),
        0,
        0,
        Icons::paste_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "paste-half",
        QT_TRANSLATE_NOOP("action","Paste Half Duration"),
        QT_TRANSLATE_NOOP("action","Paste half duration"),
        0,
        Icons::paste_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "paste-double",
        QT_TRANSLATE_NOOP("action","Paste Double Duration"),
        QT_TRANSLATE_NOOP("action","Paste double duration"),
        0,
        Icons::paste_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "paste-special",
        QT_TRANSLATE_NOOP("action","Paste Special"),
        QT_TRANSLATE_NOOP("action","Paste special"),
        0,
        Icons::paste_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_LYRICS_EDIT
        | STATE_HARMONY_FIGBASS_EDIT,
        "swap",
        QT_TRANSLATE_NOOP("action","Swap with Clipboard"),
        QT_TRANSLATE_NOOP("action","Swap with clipboard"),
        0,
        Icons::swap_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "instruments",
        QT_TRANSLATE_NOOP("action","Instruments…"),
        QT_TRANSLATE_NOOP("action","Show instruments dialog")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "note-input",
        QT_TRANSLATE_NOOP("action","Note Input"),
        QT_TRANSLATE_NOOP("action","Note input: Toggle Entry/Normal mode"),
        QT_TRANSLATE_NOOP("action","Enter notes with a mouse or keyboard"),
        Icons::noteEntry_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "note-input-steptime",
        QT_TRANSLATE_NOOP("action","Step-Time (Default)"),
        QT_TRANSLATE_NOOP("action","Note input: Enter Step-Time mode"),
        QT_TRANSLATE_NOOP("action","Enter notes in Step-time"),
        Icons::noteEntry_ICON,  // Icons::noteEntrySteptime_ICON (using normal icon for the time being.)
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "note-input-repitch",
        QT_TRANSLATE_NOOP("action","Re-Pitch"),
        QT_TRANSLATE_NOOP("action","Note input: Enter Re-Pitch mode"),
        QT_TRANSLATE_NOOP("action","Replace pitches without changing rhythms"),
        Icons::noteEntryRepitch_ICON,
        Qt::ApplicationShortcut,
        ShortcutFlags::A_CMD | ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "note-input-rhythm",
        QT_TRANSLATE_NOOP("action","Rhythm"),
        QT_TRANSLATE_NOOP("action","Note input: Enter Rhythm mode"),
        QT_TRANSLATE_NOOP("action","Enter durations with a single click or keypress"),
        Icons::noteEntryRhythm_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "note-input-realtime-auto",
        QT_TRANSLATE_NOOP("action","Real-Time (Automatic)"),
        QT_TRANSLATE_NOOP("action","Note input: Enter Real-Time (Automatic) mode"),
        QT_TRANSLATE_NOOP("action","Enter notes at a fixed tempo indicated by a metronome beat"),
        Icons::noteEntryRealtimeAuto_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "note-input-realtime-manual",
        QT_TRANSLATE_NOOP("action","Real-Time (Manual)"),
        QT_TRANSLATE_NOOP("action","Note input: Enter Real-Time (Manual) mode"),
        QT_TRANSLATE_NOOP("action","Enter notes while tapping a key or pedal to set the tempo"),
        Icons::noteEntryRealtimeManual_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "note-input-timewise",
        QT_TRANSLATE_NOOP("action","Insert"),
        QT_TRANSLATE_NOOP("action","Note input: Enter Insert mode"),
        QT_TRANSLATE_NOOP("action","Insert notes by increasing measure duration"),
        Icons::noteTimewise_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pitch-spell",
        QT_TRANSLATE_NOOP("action","Respell Pitches"),
        QT_TRANSLATE_NOOP("action","Respell pitches"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval1",
        QT_TRANSLATE_NOOP("action","Unison Above"),
        QT_TRANSLATE_NOOP("action","Enter unison above")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval2",
        QT_TRANSLATE_NOOP("action","Second Above"),
        QT_TRANSLATE_NOOP("action","Enter second above")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval3",
        QT_TRANSLATE_NOOP("action","Third Above"),
        QT_TRANSLATE_NOOP("action","Enter third above")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval4",
        QT_TRANSLATE_NOOP("action","Fourth Above"),
        QT_TRANSLATE_NOOP("action","Enter fourth above")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval5",
        QT_TRANSLATE_NOOP("action","Fifth Above"),
        QT_TRANSLATE_NOOP("action","Enter fifth above")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval6",
        QT_TRANSLATE_NOOP("action","Sixth Above"),
        QT_TRANSLATE_NOOP("action","Enter sixth above")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval7",
        QT_TRANSLATE_NOOP("action","Seventh Above"),
        QT_TRANSLATE_NOOP("action","Enter seventh above")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval8",
        QT_TRANSLATE_NOOP("action","Octave Above"),
        QT_TRANSLATE_NOOP("action","Enter octave above")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval9",
        QT_TRANSLATE_NOOP("action","Ninth Above"),
        QT_TRANSLATE_NOOP("action","Enter ninth above")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval-2",
        QT_TRANSLATE_NOOP("action","Second Below"),
        QT_TRANSLATE_NOOP("action","Enter second below")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval-3",
        QT_TRANSLATE_NOOP("action","Third Below"),
        QT_TRANSLATE_NOOP("action","Enter third below")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval-4",
        QT_TRANSLATE_NOOP("action","Fourth Below"),
        QT_TRANSLATE_NOOP("action","Enter fourth below")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval-5",
        QT_TRANSLATE_NOOP("action","Fifth Below"),
        QT_TRANSLATE_NOOP("action","Enter fifth below")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval-6",
        QT_TRANSLATE_NOOP("action","Sixth Below"),
        QT_TRANSLATE_NOOP("action","Enter sixth below")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval-7",
        QT_TRANSLATE_NOOP("action","Seventh Below"),
        QT_TRANSLATE_NOOP("action","Enter seventh below")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval-8",
        QT_TRANSLATE_NOOP("action","Octave Below"),
        QT_TRANSLATE_NOOP("action","Enter octave below")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "interval-9",
        QT_TRANSLATE_NOOP("action","Ninth Below"),
        QT_TRANSLATE_NOOP("action","Enter ninth below")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "note-a",
        QT_TRANSLATE_NOOP("action","A"),
        QT_TRANSLATE_NOOP("action","Enter note A")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "note-b",
        QT_TRANSLATE_NOOP("action","B"),
        QT_TRANSLATE_NOOP("action","Enter note B")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "note-c",
        QT_TRANSLATE_NOOP("action","C"),
        QT_TRANSLATE_NOOP("action","Enter note C")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "note-d",
        QT_TRANSLATE_NOOP("action","D"),
        QT_TRANSLATE_NOOP("action","Enter note D")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "note-e",
        QT_TRANSLATE_NOOP("action","E"),
        QT_TRANSLATE_NOOP("action","Enter note E")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "note-f",
        QT_TRANSLATE_NOOP("action","F"),
        QT_TRANSLATE_NOOP("action","Enter note F")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "note-g",
        QT_TRANSLATE_NOOP("action","G"),
        QT_TRANSLATE_NOOP("action","Enter note G")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "chord-a",
        QT_TRANSLATE_NOOP("action","Add A to Chord"),
        QT_TRANSLATE_NOOP("action","Add note A to chord")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "chord-b",
        QT_TRANSLATE_NOOP("action","Add B to Chord"),
        QT_TRANSLATE_NOOP("action","Add note B to chord")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "chord-c",
        QT_TRANSLATE_NOOP("action","Add C to Chord"),
        QT_TRANSLATE_NOOP("action","Add note C to chord")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "chord-d",
        QT_TRANSLATE_NOOP("action","Add D to Chord"),
        QT_TRANSLATE_NOOP("action","Add note D to chord")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "chord-e",
        QT_TRANSLATE_NOOP("action","Add E to Chord"),
        QT_TRANSLATE_NOOP("action","Add note E to chord")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "chord-f",
        QT_TRANSLATE_NOOP("action","Add F to Chord"),
        QT_TRANSLATE_NOOP("action","Add note F to chord")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "chord-g",
        QT_TRANSLATE_NOOP("action","Add G to Chord"),
        QT_TRANSLATE_NOOP("action","Add note G to chord")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "chord-tie",
        QT_TRANSLATE_NOOP("action","Add Tied Note to Chord"),
        QT_TRANSLATE_NOOP("action","Add tied note to chord")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "insert-a",
        QT_TRANSLATE_NOOP("action","Insert A"),
        QT_TRANSLATE_NOOP("action","Insert note A")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "insert-b",
        QT_TRANSLATE_NOOP("action","Insert B"),
        QT_TRANSLATE_NOOP("action","Insert note B")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "insert-c",
        QT_TRANSLATE_NOOP("action","Insert C"),
        QT_TRANSLATE_NOOP("action","Insert note C")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "insert-d",
        QT_TRANSLATE_NOOP("action","Insert D"),
        QT_TRANSLATE_NOOP("action","Insert note D")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "insert-e",
        QT_TRANSLATE_NOOP("action","Insert E"),
        QT_TRANSLATE_NOOP("action","Insert note E")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "insert-f",
        QT_TRANSLATE_NOOP("action","Insert F"),
        QT_TRANSLATE_NOOP("action","Insert note F")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "insert-g",
        QT_TRANSLATE_NOOP("action","Insert G"),
        QT_TRANSLATE_NOOP("action","Insert note G")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "rest",
        QT_TRANSLATE_NOOP("action","Rest"),
        QT_TRANSLATE_NOOP("action","Enter rest"),
        0,
        Icons::quartrest_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_METHOD_REALTIME_AUTO | STATE_NOTE_ENTRY_METHOD_REALTIME_MANUAL,
        "realtime-advance",
        QT_TRANSLATE_NOOP("action","Real-Time Advance"),
        QT_TRANSLATE_NOOP("action","Move the cursor forward in real-time input mode"),
        0,
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-staccato",
        QT_TRANSLATE_NOOP("action","Staccato"),
        QT_TRANSLATE_NOOP("action","Toggle staccato"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-up-bow",
        QT_TRANSLATE_NOOP("action","Up Bow"),
        QT_TRANSLATE_NOOP("action","Toggle up bow"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-down-bow",
        QT_TRANSLATE_NOOP("action","Down Bow"),
        QT_TRANSLATE_NOOP("action","Toggle down bow"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-tenuto",
        QT_TRANSLATE_NOOP("action","Tenuto"),
        QT_TRANSLATE_NOOP("action","Toggle tenuto"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-trill",
        QT_TRANSLATE_NOOP("action","Trill"),
        QT_TRANSLATE_NOOP("action","Toggle trill"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-marcato",
        QT_TRANSLATE_NOOP("action","Marcato"),
        QT_TRANSLATE_NOOP("action","Toggle marcato"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-sforzato",
        QT_TRANSLATE_NOOP("action","Accent"),
        QT_TRANSLATE_NOOP("action","Toggle accent"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "stretch+",
        QT_TRANSLATE_NOOP("action","Increase Layout Stretch"),
        QT_TRANSLATE_NOOP("action","Increase layout stretch"),
        QT_TRANSLATE_NOOP("action","Increase layout stretch factor of selected measures"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "stretch-",
        QT_TRANSLATE_NOOP("action","Decrease Layout Stretch"),
        QT_TRANSLATE_NOOP("action","Decrease layout stretch"),
        QT_TRANSLATE_NOOP("action","Decrease layout stretch factor of selected measures"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "reset-beammode",
        QT_TRANSLATE_NOOP("action","Reset Beams"),
        QT_TRANSLATE_NOOP("action","Reset beams"),
        QT_TRANSLATE_NOOP("action","Reset beams of selected measures"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "reset-style",
        QT_TRANSLATE_NOOP("action","Reset Style"),
        QT_TRANSLATE_NOOP("action","Reset style"),
        QT_TRANSLATE_NOOP("action","Reset all style values to default"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "reset-groupings",
        QT_TRANSLATE_NOOP("action","Regroup Rhythms"),
        QT_TRANSLATE_NOOP("action","Regroup rhythms"),
        QT_TRANSLATE_NOOP("action","Combine rests and tied notes from selection and resplit at rhythmical locations"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "flip",
        QT_TRANSLATE_NOOP("action","Flip Direction"),
        QT_TRANSLATE_NOOP("action","Flip direction"),
        0,
        Icons::flip_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "pitch-up",
        QT_TRANSLATE_NOOP("action","Up"),
        QT_TRANSLATE_NOOP("action","Pitch up or move text or articulation up"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pitch-up-diatonic",
        QT_TRANSLATE_NOOP("action","Diatonic Up"),
        QT_TRANSLATE_NOOP("action","Diatonic pitch up"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pitch-up-octave",
        QT_TRANSLATE_NOOP("action","Up Octave"),
        QT_TRANSLATE_NOOP("action","Pitch up octave"),
        QT_TRANSLATE_NOOP("action","Pitch up by an octave or move text or articulation up"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "up-chord",
        QT_TRANSLATE_NOOP("action","Up Note in Chord"),
        QT_TRANSLATE_NOOP("action","Go to higher pitched note in chord"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "top-chord",
        QT_TRANSLATE_NOOP("action","Top Note in Chord"),
        QT_TRANSLATE_NOOP("action","Go to top note in chord"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "move-up",
        QT_TRANSLATE_NOOP("action","Move Up"),
        QT_TRANSLATE_NOOP("action","Move up"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "pitch-down",
        QT_TRANSLATE_NOOP("action","Down"),
        QT_TRANSLATE_NOOP("action","Pitch down or move text or articulation down"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pitch-down-diatonic",
        QT_TRANSLATE_NOOP("action","Diatonic Down"),
        QT_TRANSLATE_NOOP("action","Diatonic pitch down"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pitch-down-octave",
        QT_TRANSLATE_NOOP("action","Down Octave"),
        QT_TRANSLATE_NOOP("action","Pitch down octave"),
        QT_TRANSLATE_NOOP("action","Pitch down by an octave or move text or articulation down"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "down-chord",
        QT_TRANSLATE_NOOP("action","Down Note in Chord"),
        QT_TRANSLATE_NOOP("action","Go to lower pitched note in chord"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "next-segment-element",
        QT_TRANSLATE_NOOP("action","Next Segment Element"),
        QT_TRANSLATE_NOOP("action","Accessibility: Next segment element"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "prev-segment-element",
        QT_TRANSLATE_NOOP("action","Previous Segment Element"),
        QT_TRANSLATE_NOOP("action","Accessibility: Previous segment element"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_TEXT_EDIT | STATE_HARMONY_FIGBASS_EDIT,
        "next-element",
        QT_TRANSLATE_NOOP("action","Next Element"),
        QT_TRANSLATE_NOOP("action","Accessibility: Next element"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_TEXT_EDIT | STATE_HARMONY_FIGBASS_EDIT,
        "prev-element",
        QT_TRANSLATE_NOOP("action","Previous Element"),
        QT_TRANSLATE_NOOP("action","Accessibility: Previous element"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "get-location",
        QT_TRANSLATE_NOOP("action","Get Location"),
        QT_TRANSLATE_NOOP("action","Accessibility: Get location"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "palette-search",
        QT_TRANSLATE_NOOP("action","Palette Search"),
        QT_TRANSLATE_NOOP("action","Palette Search"),
        QT_TRANSLATE_NOOP("action","Palette Search"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "apply-current-palette-element",
        QT_TRANSLATE_NOOP("action","Apply Current Palette Element"),
        QT_TRANSLATE_NOOP("action","Apply current palette element"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "first-element",
        QT_TRANSLATE_NOOP("action","First Element"),
        QT_TRANSLATE_NOOP("action","Go to the first element"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "last-element",
        QT_TRANSLATE_NOOP("action","Last Element"),
        QT_TRANSLATE_NOOP("action","Go to the last element"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "bottom-chord",
        QT_TRANSLATE_NOOP("action","Bottom Note in Chord"),
        QT_TRANSLATE_NOOP("action","Go to bottom note in chord"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "move-down",
        QT_TRANSLATE_NOOP("action","Move Down"),
        QT_TRANSLATE_NOOP("action","Move down"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "prev-chord",
        QT_TRANSLATE_NOOP("action","Previous Chord"),
        QT_TRANSLATE_NOOP("action","Go to previous chord or move text left")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "prev-measure",
        QT_TRANSLATE_NOOP("action","Previous Measure"),
        QT_TRANSLATE_NOOP("action","Go to previous measure or move text left")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "prev-track",
        QT_TRANSLATE_NOOP("action","Previous Staff or Voice"),
        QT_TRANSLATE_NOOP("action","Previous staff or voice")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "next-chord",
        QT_TRANSLATE_NOOP("action","Next Chord"),
        QT_TRANSLATE_NOOP("action","Go to next chord or move text right")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "next-measure",
        QT_TRANSLATE_NOOP("action","Next Measure"),
        QT_TRANSLATE_NOOP("action","Go to next measure or move text right")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "next-track",
        QT_TRANSLATE_NOOP("action","Next Staff or Voice"),
        QT_TRANSLATE_NOOP("action","Next staff or voice")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "select-prev-chord",
        QT_TRANSLATE_NOOP("action","Add Previous Chord to Selection"),
        QT_TRANSLATE_NOOP("action","Add previous chord to selection")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "select-prev-measure",
        QT_TRANSLATE_NOOP("action","Select to Beginning of Measure"),
        QT_TRANSLATE_NOOP("action","Select to beginning of measure")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "select-next-chord",
        QT_TRANSLATE_NOOP("action","Add Next Chord to Selection"),
        QT_TRANSLATE_NOOP("action","Add next chord to selection")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "select-section",
        QT_TRANSLATE_NOOP("action","Select Section"),
        QT_TRANSLATE_NOOP("action","Select section")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY,
        "move-right",
        QT_TRANSLATE_NOOP("action","Move Chord/Rest Right"),
        QT_TRANSLATE_NOOP("action","Move chord/rest right")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY,
        "move-left",
        QT_TRANSLATE_NOOP("action","Move Chord/Rest left"),
        QT_TRANSLATE_NOOP("action","Move chord/rest left")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "select-next-measure",
        QT_TRANSLATE_NOOP("action","Select to End of Measure"),
        QT_TRANSLATE_NOOP("action","Select to end of measure")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "select-begin-line",
        QT_TRANSLATE_NOOP("action","Select to Beginning of Line"),
        QT_TRANSLATE_NOOP("action","Select to beginning of line")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "select-end-line",
        QT_TRANSLATE_NOOP("action","Select to End of Line"),
        QT_TRANSLATE_NOOP("action","Select to end of line")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "select-begin-score",
        QT_TRANSLATE_NOOP("action","Select to Beginning of Score"),
        QT_TRANSLATE_NOOP("action","Select to beginning of score")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "select-end-score",
        QT_TRANSLATE_NOOP("action","Select to End of Score"),
        QT_TRANSLATE_NOOP("action","Select to end of score")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "select-staff-above",
        QT_TRANSLATE_NOOP("action","Add Staff Above to Selection"),
        QT_TRANSLATE_NOOP("action","Add staff above to selection")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "select-staff-below",
        QT_TRANSLATE_NOOP("action","Add Staff Below to Selection"),
        QT_TRANSLATE_NOOP("action","Add staff below to selection")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "scr-prev",
        QT_TRANSLATE_NOOP("action","Screen: Previous")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "scr-next",
        QT_TRANSLATE_NOOP("action","Screen: Next")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "page-prev",
        QT_TRANSLATE_NOOP("action","Page: Previous")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "page-next",
        QT_TRANSLATE_NOOP("action","Page: Next")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "page-top",
        QT_TRANSLATE_NOOP("action","Page: Top")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "page-end",
        QT_TRANSLATE_NOOP("action","Page: End")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-slur",
        QT_TRANSLATE_NOOP("action","Slur"),
        QT_TRANSLATE_NOOP("action","Add slur")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-hairpin",
        QT_TRANSLATE_NOOP("action","Crescendo"),
        QT_TRANSLATE_NOOP("action","Add crescendo"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-hairpin-reverse",
        QT_TRANSLATE_NOOP("action","Decrescendo"),
        QT_TRANSLATE_NOOP("action","Add decrescendo"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-8va",
        QT_TRANSLATE_NOOP("action","Ottava 8va alta"),
        QT_TRANSLATE_NOOP("action","Add ottava 8va alta"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-8vb",
        QT_TRANSLATE_NOOP("action","Ottava 8va bassa"),
        QT_TRANSLATE_NOOP("action","Add ottava 8va bassa"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_LYRICS_EDIT
        | STATE_HARMONY_FIGBASS_EDIT | STATE_PLAY | STATE_FOTO,
        "escape",
        QT_TRANSLATE_NOOP("action","Escape")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "delete",
        QT_TRANSLATE_NOOP("action","Delete"),
        QT_TRANSLATE_NOOP("action","Delete"),
        QT_TRANSLATE_NOOP("action","Delete the selected element(s)"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "full-measure-rest",
        QT_TRANSLATE_NOOP("action","Full Measure Rest"),
        QT_TRANSLATE_NOOP("action","Full measure rest"),
        QT_TRANSLATE_NOOP("action","Convert the measure to a full measure rest"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "time-delete",
        QT_TRANSLATE_NOOP("action","Remove Selected Range"),
        QT_TRANSLATE_NOOP("action","Remove selected range"),
        QT_TRANSLATE_NOOP("action","Remove element and duration"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "append-measure",
        QT_TRANSLATE_NOOP("action","Append One Measure"),
        QT_TRANSLATE_NOOP("action","Append one measure")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "append-measures",
        QT_TRANSLATE_NOOP("action","Append Measures…"),
        QT_TRANSLATE_NOOP("action","Append measures")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "insert-measure",
        QT_TRANSLATE_NOOP("action","Insert One Measure"),
        QT_TRANSLATE_NOOP("action","Insert one measure"),
        0,
        Icons::measure_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "insert-measures",
        QT_TRANSLATE_NOOP("action","Insert Measures…"),
        QT_TRANSLATE_NOOP("action","Insert measures")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "insert-hbox",
        QT_TRANSLATE_NOOP("action","Insert Horizontal Frame"),
        QT_TRANSLATE_NOOP("action","Insert horizontal frame"),
        0,
        Icons::hframe_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "insert-textframe",
        QT_TRANSLATE_NOOP("action","Insert Text Frame"),
        QT_TRANSLATE_NOOP("action","Insert text frame"),
        0,
        Icons::tframe_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "append-textframe",
        QT_TRANSLATE_NOOP("action","Append Text Frame"),
        QT_TRANSLATE_NOOP("action","Append text frame")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "insert-fretframe",
        QT_TRANSLATE_NOOP("action","Insert Fretboard Diagram Frame"),
        QT_TRANSLATE_NOOP("action","Insert fretboard diagram frame"),
        0,
        Icons::fframe_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "insert-vbox",
        QT_TRANSLATE_NOOP("action","Insert Vertical Frame"),
        QT_TRANSLATE_NOOP("action","Insert vertical frame"),
        0,
        Icons::vframe_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "append-hbox",
        QT_TRANSLATE_NOOP("action","Append Horizontal Frame"),
        QT_TRANSLATE_NOOP("action","Append horizontal frame")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "append-vbox",
        QT_TRANSLATE_NOOP("action","Append Vertical Frame"),
        QT_TRANSLATE_NOOP("action","Append vertical frame")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "duplet",
        QT_TRANSLATE_NOOP("action","Duplet")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "triplet",
        QT_TRANSLATE_NOOP("action","Triplet")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "quadruplet",
        QT_TRANSLATE_NOOP("action","Quadruplet")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "quintuplet",
        QT_TRANSLATE_NOOP("action","Quintuplet")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "sextuplet",
        QT_TRANSLATE_NOOP("action","Sextuplet")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "septuplet",
        QT_TRANSLATE_NOOP("action","Septuplet")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "octuplet",
        QT_TRANSLATE_NOOP("action","Octuplet")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "nonuplet",
        QT_TRANSLATE_NOOP("action","Nonuplet")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "tuplet-dialog",
        QT_TRANSLATE_NOOP("action","Other…"),
        QT_TRANSLATE_NOOP("action","Other tuplets")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "note-longa",
        QT_TRANSLATE_NOOP("action","Longa"),
        QT_TRANSLATE_NOOP("action","Note duration: Longa"),
        QT_TRANSLATE_NOOP("action","Longa"),
        Icons::longaUp_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "note-breve",
        QT_TRANSLATE_NOOP("action","Double Whole Note"),
        QT_TRANSLATE_NOOP("action","Note duration: Double whole"),
        QT_TRANSLATE_NOOP("action","Double whole note"),
        Icons::brevis_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-1",
        QT_TRANSLATE_NOOP("action","Whole Note"),
        QT_TRANSLATE_NOOP("action","Note duration: Whole"),
        QT_TRANSLATE_NOOP("action","Whole note"),
        Icons::note_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-2",
        QT_TRANSLATE_NOOP("action","Half Note"),
        QT_TRANSLATE_NOOP("action","Note duration: Half"),
        QT_TRANSLATE_NOOP("action","Half note"),
        Icons::note2_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-4",
        QT_TRANSLATE_NOOP("action","Quarter Note"),
        QT_TRANSLATE_NOOP("action","Note duration: Quarter"),
        QT_TRANSLATE_NOOP("action","Quarter note"),
        Icons::note4_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-8",
        QT_TRANSLATE_NOOP("action","Eighth Note"),
        QT_TRANSLATE_NOOP("action","Note duration: Eighth"),
        QT_TRANSLATE_NOOP("action","Eighth note"),
        Icons::note8_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-16",
        QT_TRANSLATE_NOOP("action","16th Note"),
        QT_TRANSLATE_NOOP("action","Note duration: 16th"),
        QT_TRANSLATE_NOOP("action","16th note"),
        Icons::note16_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-32",
        QT_TRANSLATE_NOOP("action","32nd Note"),
        QT_TRANSLATE_NOOP("action","Note duration: 32nd"),
        QT_TRANSLATE_NOOP("action","32nd note"),
        Icons::note32_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-64",
        QT_TRANSLATE_NOOP("action","64th Note"),
        QT_TRANSLATE_NOOP("action","Note duration: 64th"),
        QT_TRANSLATE_NOOP("action","64th note"),
        Icons::note64_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-128",
        QT_TRANSLATE_NOOP("action","128th Note"),
        QT_TRANSLATE_NOOP("action","Note duration: 128th"),
        QT_TRANSLATE_NOOP("action","128th note"),
        Icons::note128_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-256",
        QT_TRANSLATE_NOOP("action","256th Note"),
        QT_TRANSLATE_NOOP("action","Note duration: 256th"),
        QT_TRANSLATE_NOOP("action","256th note"),
        Icons::note256_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-512",
        QT_TRANSLATE_NOOP("action","512th Note"),
        QT_TRANSLATE_NOOP("action","Note duration: 512th"),
        QT_TRANSLATE_NOOP("action","512th note"),
        Icons::note512_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-note-1024",
        QT_TRANSLATE_NOOP("action","1024th Note"),
        QT_TRANSLATE_NOOP("action","Note duration: 1024th"),
        QT_TRANSLATE_NOOP("action","1024th note"),
        Icons::note1024_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY,
        "pad-note-increase",
        QT_TRANSLATE_NOOP("action","Increase Active Duration"),
        QT_TRANSLATE_NOOP("action","Increase active duration")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY,
        "pad-note-decrease",
        QT_TRANSLATE_NOOP("action","Decrease Active Duration"),
        QT_TRANSLATE_NOOP("action","Decrease active duration")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-dot",
        QT_TRANSLATE_NOOP("action","Augmentation Dot"),
        QT_TRANSLATE_NOOP("action","Note duration: Augmentation dot"),
        QT_TRANSLATE_NOOP("action","Augmentation dot"),
        Icons::dot_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-dotdot",
        QT_TRANSLATE_NOOP("action","Double Augmentation Dot"),
        QT_TRANSLATE_NOOP("action","Note duration: Double augmentation dot"),
        QT_TRANSLATE_NOOP("action","Double augmentation dot"),
        Icons::dotdot_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-dot3",
        QT_TRANSLATE_NOOP("action","Triple Augmentation Dot"),
        QT_TRANSLATE_NOOP("action","Note duration: Triple augmentation dot"),
        QT_TRANSLATE_NOOP("action","Triple augmentation dot"),
        Icons::dot3_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "pad-dot4",
        QT_TRANSLATE_NOOP("action","Quadruple Augmentation Dot"),
        QT_TRANSLATE_NOOP("action","Note duration: Quadruple augmentation dot"),
        QT_TRANSLATE_NOOP("action","Quadruple augmentation dot"),
        Icons::dot4_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "tie",
        QT_TRANSLATE_NOOP("action","Tie"),
        QT_TRANSLATE_NOOP("action","Note duration: Tie"),
        QT_TRANSLATE_NOOP("action","Tie"),
        Icons::tie_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "pad-rest",
        QT_TRANSLATE_NOOP("action","Rest"),
        QT_TRANSLATE_NOOP("action","Note input: Rest"),
        QT_TRANSLATE_NOOP("action","Rest"),
        Icons::quartrest_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "sharp2",
        QT_TRANSLATE_NOOP("action","Double ♯"),
        QT_TRANSLATE_NOOP("action","Note input: Double ♯"),
        QT_TRANSLATE_NOOP("action","Double ♯"),
        Icons::sharpsharp_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "sharp",
        QT_TRANSLATE_NOOP("action","♯"),
        QT_TRANSLATE_NOOP("action","Note input: ♯"),
        QT_TRANSLATE_NOOP("action","♯"),
        Icons::sharp_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "nat",
        QT_TRANSLATE_NOOP("action","♮"),
        QT_TRANSLATE_NOOP("action","Note input: ♮"),
        QT_TRANSLATE_NOOP("action","♮"),
        Icons::natural_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "flat",
        QT_TRANSLATE_NOOP("action","♭"),
        QT_TRANSLATE_NOOP("action","Note input: ♭"),
        QT_TRANSLATE_NOOP("action","♭"),
        Icons::flat_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "flat2",
        QT_TRANSLATE_NOOP("action","Double ♭"),
        QT_TRANSLATE_NOOP("action","Note input: Double ♭"),
        QT_TRANSLATE_NOOP("action","Double ♭"),
        Icons::flatflat_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "acciaccatura",
        QT_TRANSLATE_NOOP("action","Acciaccatura"),
        QT_TRANSLATE_NOOP("action","Add acciaccatura"),
        QT_TRANSLATE_NOOP("action","Acciaccatura"),
        Icons::acciaccatura_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "appoggiatura",
        QT_TRANSLATE_NOOP("action","Appoggiatura"),
        QT_TRANSLATE_NOOP("action","Add appoggiatura"),
        QT_TRANSLATE_NOOP("action","Appoggiatura"),
        Icons::appoggiatura_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        /* no stroke: 4th*/
        "grace4",
        QT_TRANSLATE_NOOP("action","Grace: Quarter"),
        QT_TRANSLATE_NOOP("action","Add quarter grace note"),
        QT_TRANSLATE_NOOP("action","Grace: quarter"),
        Icons::grace4_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        /* no stroke: 16th*/
        "grace16",
        QT_TRANSLATE_NOOP("action","Grace: 16th"),
        QT_TRANSLATE_NOOP("action","Add 16th grace note"),
        QT_TRANSLATE_NOOP("action","Grace: 16th"),
        Icons::grace16_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        /* no stroke: 32nd*/
        "grace32",
        QT_TRANSLATE_NOOP("action","Grace: 32nd"),
        QT_TRANSLATE_NOOP("action","Add 32nd grace note"),
        QT_TRANSLATE_NOOP("action","Grace: 32nd"),
        Icons::grace32_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        /* no stroke: Eighth*/
        "grace8after",
        QT_TRANSLATE_NOOP("action","Grace: Eighth After"),
        QT_TRANSLATE_NOOP("action","Add Eighth grace note after"),
        QT_TRANSLATE_NOOP("action","Grace: eighth after"),
        Icons::grace8after_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        /* no stroke: 16th*/
        "grace16after",
        QT_TRANSLATE_NOOP("action","Grace: 16th After"),
        QT_TRANSLATE_NOOP("action","Add 16th grace note after"),
        QT_TRANSLATE_NOOP("action","Grace: 16th after"),
        Icons::grace16after_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        /* no stroke: 32nd*/
        "grace32after",
        QT_TRANSLATE_NOOP("action","Grace: 32nd After"),
        QT_TRANSLATE_NOOP("action","Add 32nd grace note after"),
        QT_TRANSLATE_NOOP("action","Grace: 32nd after"),
        Icons::grace32after_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "voice-1",
        QT_TRANSLATE_NOOP("action","1"),
        QT_TRANSLATE_NOOP("action","Voice 1"),
        0,
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "voice-2",
        QT_TRANSLATE_NOOP("action","2"),
        QT_TRANSLATE_NOOP("action","Voice 2"),
        0,
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "voice-3",
        QT_TRANSLATE_NOOP("action","3"),
        QT_TRANSLATE_NOOP("action","Voice 3"),
        0,
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "voice-4",
        QT_TRANSLATE_NOOP("action","4"),
        QT_TRANSLATE_NOOP("action","Voice 4"),
        0,
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "midi-on",
        QT_TRANSLATE_NOOP("action","MIDI Input"),
        QT_TRANSLATE_NOOP("action","Toggle 'MIDI Input'"),
        0,
        Icons::midiin_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "beam-start",
        QT_TRANSLATE_NOOP("action","Beam Start"),
        QT_TRANSLATE_NOOP("action","Beam start"),
        0,
        Icons::sbeam_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "beam-mid",
        QT_TRANSLATE_NOOP("action","Beam Middle"),
        QT_TRANSLATE_NOOP("action","Beam middle"),
        0,
        Icons::mbeam_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "no-beam",
        QT_TRANSLATE_NOOP("action","No Beam"),
        QT_TRANSLATE_NOOP("action","No beam"),
        0,
        Icons::nbeam_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "beam32",
        QT_TRANSLATE_NOOP("action","Beam 16th Sub"),
        QT_TRANSLATE_NOOP("action","Beam 16th sub"),
        0,
        Icons::beam32_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD | ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "beam64",
        QT_TRANSLATE_NOOP("action","Beam 32nd Sub"),
        QT_TRANSLATE_NOOP("action","Beam 32nd sub"),
        0,
        Icons::beam64_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD | ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "auto-beam",
        QT_TRANSLATE_NOOP("action","Auto Beam"),
        QT_TRANSLATE_NOOP("action","Auto beam"),
        0,
        Icons::abeam_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD | ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "fbeam1",
        QT_TRANSLATE_NOOP("action","Feathered Beam, Slower"),
        QT_TRANSLATE_NOOP("action","Feathered beam, slower"),
        0,
        Icons::fbeam1_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "fbeam2",
        QT_TRANSLATE_NOOP("action","Feathered Beam, Faster"),
        QT_TRANSLATE_NOOP("action","Feathered beam, faster"),
        0,
        Icons::fbeam2_ICON
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "toggle-palette",
        QT_TRANSLATE_NOOP("action","Palettes"),
        QT_TRANSLATE_NOOP("action","Toggle 'Palettes'"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "toggle-playpanel",
        QT_TRANSLATE_NOOP("action","Play Panel"),
        QT_TRANSLATE_NOOP("action","Toggle 'Play Panel'"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "toggle-selection-window",
        QT_TRANSLATE_NOOP("action","Selection Filter"),
        QT_TRANSLATE_NOOP("action","Toggle 'Selection Filter'"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "toggle-navigator",
        QT_TRANSLATE_NOOP("action","Navigator"),
        QT_TRANSLATE_NOOP("action","Toggle 'Navigator'"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "toggle-timeline",
        QT_TRANSLATE_NOOP("action","Timeline"),
        QT_TRANSLATE_NOOP("action","Toggle 'Timeline'"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "toggle-midiimportpanel",
        QT_TRANSLATE_NOOP("action","MIDI Import Panel"),
        QT_TRANSLATE_NOOP("action","Toggle 'MIDI Import Panel'"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
#ifdef Q_OS_MAC
        //Avoid conflict with M in text
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
#else
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
#endif
        "toggle-mixer",
        QT_TRANSLATE_NOOP("action","Mixer"),
        QT_TRANSLATE_NOOP("action","Toggle 'Mixer'"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "toggle-fileoperations",
        QT_TRANSLATE_NOOP("action","File Operations"),
        QT_TRANSLATE_NOOP("action","Toggle 'File Operations' toolbar")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "toggle-transport",
        QT_TRANSLATE_NOOP("action","Playback Controls"),
        QT_TRANSLATE_NOOP("action","Toggle 'Playback Controls' toolbar")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "toggle-concertpitch",
        QT_TRANSLATE_NOOP("action","Concert Pitch"),
        QT_TRANSLATE_NOOP("action","Toggle 'Concert Pitch' toolbar")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "toggle-imagecapture",
        QT_TRANSLATE_NOOP("action","Image Capture"),
        QT_TRANSLATE_NOOP("action","Toggle 'Image Capture' toolbar")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "toggle-noteinput",
        QT_TRANSLATE_NOOP("action","Note Input"),
        QT_TRANSLATE_NOOP("action","Toggle 'Note Input' toolbar")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "toggle-feedback",
        QT_TRANSLATE_NOOP("action","Feedback"),
        QT_TRANSLATE_NOOP("action","Toggle 'Feedback' toolbar"),
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "toggle-workspaces-toolbar",
        QT_TRANSLATE_NOOP("action","Workspaces"),
        QT_TRANSLATE_NOOP("action","Toggle 'Workspaces' toolbar"),
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "toggle-statusbar",
        QT_TRANSLATE_NOOP("action","Status Bar"),
        QT_TRANSLATE_NOOP("action","Toggle 'Status Bar'")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "create-new-workspace",
        "+",
        QT_TRANSLATE_NOOP("action","Add new workspace"),
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_DISABLED | STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_TEXT_EDIT | STATE_PLAY | STATE_FOTO,
        "quit",
        QT_TRANSLATE_NOOP("action","Quit")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "mag",
        QT_TRANSLATE_NOOP("action","Zoom Canvas"),
        QT_TRANSLATE_NOOP("action","Zoom canvas")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "lyrics",
        QT_TRANSLATE_NOOP("action","Lyrics"),
        QT_TRANSLATE_NOOP("action","Add lyrics"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
//         ,ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "tempo",
        QT_TRANSLATE_NOOP("action","Tempo Marking"),
        QT_TRANSLATE_NOOP("action","Add tempo marking"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "system-text",
        QT_TRANSLATE_NOOP("action","System Text"),
        QT_TRANSLATE_NOOP("action","Add system text")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "staff-text",
        QT_TRANSLATE_NOOP("action","Staff Text"),
        QT_TRANSLATE_NOOP("action","Add staff text")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "expression-text",
        QT_TRANSLATE_NOOP("action","Expression Text"),
        QT_TRANSLATE_NOOP("action","Expression text")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "frame-text",
        QT_TRANSLATE_NOOP("action","Text"),
        QT_TRANSLATE_NOOP("action","Add frame text")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "title-text",
        QT_TRANSLATE_NOOP("action","Title"),
        QT_TRANSLATE_NOOP("action","Add title text")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "subtitle-text",
        QT_TRANSLATE_NOOP("action","Subtitle"),
        QT_TRANSLATE_NOOP("action","Add subtitle text")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "composer-text",
        QT_TRANSLATE_NOOP("action","Composer"),
        QT_TRANSLATE_NOOP("action","Add composer text")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "poet-text",
        QT_TRANSLATE_NOOP("action","Lyricist"),
        QT_TRANSLATE_NOOP("action","Add lyricist text")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "part-text",
        QT_TRANSLATE_NOOP("action","Part Name"),
        QT_TRANSLATE_NOOP("action","Add part name")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "chord-text",
        QT_TRANSLATE_NOOP("action","Chord Symbol"),
        QT_TRANSLATE_NOOP("action","Add chord symbol")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "roman-numeral-text",
        QT_TRANSLATE_NOOP("action","Roman Numeral Analysis"),
        QT_TRANSLATE_NOOP("action","Add Roman numeral analysis")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "nashville-number-text",
        QT_TRANSLATE_NOOP("action","Nashville Number"),
        QT_TRANSLATE_NOOP("action","Add Nashville number")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "rehearsalmark-text",
        QT_TRANSLATE_NOOP("action","Rehearsal Mark"),
        QT_TRANSLATE_NOOP("action","Add rehearsal mark")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "instrument-change-text",
        QT_TRANSLATE_NOOP("action","Instrument Change"),
        QT_TRANSLATE_NOOP("action","Add instrument change")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "fingering-text",
        QT_TRANSLATE_NOOP("action","Fingering"),
        QT_TRANSLATE_NOOP("action","Add fingering")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "sticking-text",
        QT_TRANSLATE_NOOP("action","Sticking"),
        QT_TRANSLATE_NOOP("action","Add sticking")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "picture",
        QT_TRANSLATE_NOOP("action","Image"),
        QT_TRANSLATE_NOOP("action","Add image")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "play",
        QT_TRANSLATE_NOOP("action","Play"),
        QT_TRANSLATE_NOOP("action","Player: play"),
        QT_TRANSLATE_NOOP("action","Start or stop playback"),
        Icons::play_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_PLAY,
        "play-prev-chord",
        QT_TRANSLATE_NOOP("action","Play Previous Chord"),
        QT_TRANSLATE_NOOP("action","Play previous chord"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_PLAY,
        "play-prev-measure",
        QT_TRANSLATE_NOOP("action","Play Previous Measure"),
        QT_TRANSLATE_NOOP("action","Play previous measure"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_PLAY,
        "play-next-chord",
        QT_TRANSLATE_NOOP("action","Play Next Chord"),
        QT_TRANSLATE_NOOP("action","Play next chord"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_PLAY,
        "play-next-measure",
        QT_TRANSLATE_NOOP("action","Play Next Measure"),
        QT_TRANSLATE_NOOP("action","Play next measure"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_PLAY,
        "seek-begin",
        QT_TRANSLATE_NOOP("action","Seek to Begin"),
        QT_TRANSLATE_NOOP("action","Player: seek to begin"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "rewind",
        QT_TRANSLATE_NOOP("action","Rewind"),
        QT_TRANSLATE_NOOP("action","Player: rewind"),
        QT_TRANSLATE_NOOP("action","Rewind to start position"),
        Icons::start_ICON
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_PLAY,
        "seek-end",
        QT_TRANSLATE_NOOP("action","Seek to End"),
        QT_TRANSLATE_NOOP("action","Player: seek to end")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL,
        "repeat",
        QT_TRANSLATE_NOOP("action","Play Repeats"),
        QT_TRANSLATE_NOOP("action","Toggle 'Play Repeats'"),
        QT_TRANSLATE_NOOP("action","Play repeats"),
        Icons::repeat_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE | ShortcutFlags::A_CHECKABLE | ShortcutFlags::A_CHECKED
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "pan",
        QT_TRANSLATE_NOOP("action","Pan Score"),
        QT_TRANSLATE_NOOP("action","Toggle 'Pan Score'"),
        QT_TRANSLATE_NOOP("action","Pan score automatically"),
        Icons::pan_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE | ShortcutFlags::A_CHECKABLE | ShortcutFlags::A_CHECKED
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "load-style",
        QT_TRANSLATE_NOOP("action","Load Style…"),
        QT_TRANSLATE_NOOP("action","Load style"),
        0,
        Icons::fileOpen_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "save-style",
        QT_TRANSLATE_NOOP("action","Save Style…"),
        QT_TRANSLATE_NOOP("action","Save style"),
        0,
        Icons::fileSave_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "select-all",
        QT_TRANSLATE_NOOP("action","Select All"),
        QT_TRANSLATE_NOOP("action","Select all"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL,
        "transpose",
        QT_TRANSLATE_NOOP("action","&Transpose…"),
        QT_TRANSLATE_NOOP("action","Transpose"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "clef-violin",
        QT_TRANSLATE_NOOP("action","Treble Clef"),
        QT_TRANSLATE_NOOP("action","Add treble clef"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "clef-bass",
        QT_TRANSLATE_NOOP("action","Bass Clef"),
        QT_TRANSLATE_NOOP("action","Add bass clef"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "voice-x12",
        QT_TRANSLATE_NOOP("action","Exchange Voice 1-2"),
        QT_TRANSLATE_NOOP("action","Exchange voice 1-2"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "voice-x13",
        QT_TRANSLATE_NOOP("action","Exchange Voice 1-3"),
        QT_TRANSLATE_NOOP("action","Exchange voice 1-3"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "voice-x14",
        QT_TRANSLATE_NOOP("action","Exchange Voice 1-4"),
        QT_TRANSLATE_NOOP("action","Exchange voice 1-4"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "voice-x23",
        QT_TRANSLATE_NOOP("action","Exchange Voice 2-3"),
        QT_TRANSLATE_NOOP("action","Exchange voice 2-3"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "voice-x24",
        QT_TRANSLATE_NOOP("action","Exchange Voice 2-4"),
        QT_TRANSLATE_NOOP("action","Exchange voice 2-4"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "voice-x34",
        QT_TRANSLATE_NOOP("action","Exchange Voice 3-4"),
        QT_TRANSLATE_NOOP("action","Exchange voice 3-4"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "concert-pitch",
        QT_TRANSLATE_NOOP("action","Concert Pitch"),
        QT_TRANSLATE_NOOP("action","Toggle 'Concert Pitch'"),
        QT_TRANSLATE_NOOP("action","Switch between concert/sounding pitch and transposing/written pitch"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "repeat-cmd",
        QT_TRANSLATE_NOOP("action","Repeat Last Command"),
        QT_TRANSLATE_NOOP("action","Repeat last command"),
        0,
        Icons::fileOpen_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "edit-info",
        QT_TRANSLATE_NOOP("action","Score Properties…"),
        QT_TRANSLATE_NOOP("action","Edit score properties"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "system-break",
        QT_TRANSLATE_NOOP("action","Toggle System Break"),
        QT_TRANSLATE_NOOP("action","Toggle 'System Break'"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "page-break",
        QT_TRANSLATE_NOOP("action","Toggle Page Break"),
        QT_TRANSLATE_NOOP("action","Toggle 'Page Break'"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "section-break",
        QT_TRANSLATE_NOOP("action","Toggle Section Break"),
        QT_TRANSLATE_NOOP("action","Toggle 'Section Break'"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "edit-element",
        QT_TRANSLATE_NOOP("action","Edit Element"),
        QT_TRANSLATE_NOOP("action","Edit element")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_EDIT,
        "reset",
        QT_TRANSLATE_NOOP("action","Reset Shapes and Positions"),
        QT_TRANSLATE_NOOP("action","Reset shapes and positions"),
        QT_TRANSLATE_NOOP("action","Reset shapes and positions of selected elements to their defaults")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "debugger",
        QT_TRANSLATE_NOOP("action","Debugger")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "reset-stretch",
        QT_TRANSLATE_NOOP("action","Reset Layout Stretch"),
        QT_TRANSLATE_NOOP("action","Reset layout stretch"),
        QT_TRANSLATE_NOOP("action","Reset layout stretch factor of selected measures or entire score"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "show-invisible",
        QT_TRANSLATE_NOOP("action","Show Invisible"),
        QT_TRANSLATE_NOOP("action","Show invisible"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE | ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "show-unprintable",
        QT_TRANSLATE_NOOP("action","Show Unprintable"),
        QT_TRANSLATE_NOOP("action","Show unprintable"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE | ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "show-frames",
        QT_TRANSLATE_NOOP("action","Show Frames"),
        QT_TRANSLATE_NOOP("action","Show frames"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE | ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "show-pageborders",
        QT_TRANSLATE_NOOP("action","Show Page Margins"),
        QT_TRANSLATE_NOOP("action","Show page margins"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE | ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "mark-irregular",
        QT_TRANSLATE_NOOP("action","Mark Irregular Measures"),
        QT_TRANSLATE_NOOP("action","Mark irregular measures"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE | ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_TEXT_EDIT | STATE_LYRICS_EDIT | STATE_HARMONY_FIGBASS_EDIT,
        "show-keys",
        QT_TRANSLATE_NOOP("action","Insert Special Characters…"),
        QT_TRANSLATE_NOOP("action","Insert special characters"),
        0,
        Icons::keys_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "rest-1",
        QT_TRANSLATE_NOOP("action","Whole Rest"),
        QT_TRANSLATE_NOOP("action","Note input: Whole rest")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "rest-2",
        QT_TRANSLATE_NOOP("action","Half Rest"),
        QT_TRANSLATE_NOOP("action","Note input: Half rest")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "rest-4",
        QT_TRANSLATE_NOOP("action","Quarter Rest"),
        QT_TRANSLATE_NOOP("action","Note input: Quarter rest")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "rest-8",
        QT_TRANSLATE_NOOP("action","Eighth Rest"),
        QT_TRANSLATE_NOOP("action","Note input: Eighth rest")
    },
    {                       // mapped to undo in note entry mode
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "backspace",
        QT_TRANSLATE_NOOP("action","Backspace"),
//         0,
//         0,
//         Icons::Invalid_ICON,
//         Qt::WindowShortcut,
//         ShortcutFlags::A_CMD
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "find",
        QT_TRANSLATE_NOOP("action","Find")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "zoomin",
        QT_TRANSLATE_NOOP("action","Zoom In"),
        QT_TRANSLATE_NOOP("action","Zoom in")
    },
    {
        MsWidget::MAIN_WINDOW,
        // conflicts with Ctrl+- in edit mode to enter lyrics hyphen
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "zoomout",
        QT_TRANSLATE_NOOP("action","Zoom Out"),
        QT_TRANSLATE_NOOP("action","Zoom out")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "zoom100",
        QT_TRANSLATE_NOOP("action","Zoom to 100%"),
        QT_TRANSLATE_NOOP("action","Zoom to 100%")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "mirror-note",
        QT_TRANSLATE_NOOP("action","Mirror Notehead"),
        QT_TRANSLATE_NOOP("action","Mirror notehead"),
        0,
        Icons::flip_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "edit-style",
        QT_TRANSLATE_NOOP("action","Style…"),
        QT_TRANSLATE_NOOP("action","Edit style"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "edit-harmony",
        QT_TRANSLATE_NOOP("action","Chord Symbols…"),
        QT_TRANSLATE_NOOP("action","Edit chord symbols style")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "select-similar",
        QT_TRANSLATE_NOOP("action","All Similar Elements"),
        QT_TRANSLATE_NOOP("action","Select all similar elements")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "select-similar-staff",
        QT_TRANSLATE_NOOP("action","All Similar Elements in Same Staff"),
        QT_TRANSLATE_NOOP("action","Select all similar elements in same staff")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "select-similar-range",
        QT_TRANSLATE_NOOP("action","All Similar Elements in Range Selection"),
        QT_TRANSLATE_NOOP("action","Select all similar elements in the range selection")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "select-dialog",
        QT_TRANSLATE_NOOP("action","All Similar Elements with More Options"),
        QT_TRANSLATE_NOOP("action","Select all similar elements with more options")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "synth-control",
        QT_TRANSLATE_NOOP("action","Synthesizer"),
        0,
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM /*| STATE_NOTE_ENTRY_TAB*/,
        "double-duration",
        QT_TRANSLATE_NOOP("action","Double Duration"),
        QT_TRANSLATE_NOOP("action","Double duration"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM /*| STATE_NOTE_ENTRY_TAB*/,
        "half-duration",
        QT_TRANSLATE_NOOP("action","Half Duration"),
        QT_TRANSLATE_NOOP("action","Half duration"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM /*| STATE_NOTE_ENTRY_TAB*/,
        "inc-duration-dotted",
        QT_TRANSLATE_NOOP("action","Increase Duration Dotted"),
        QT_TRANSLATE_NOOP("action","Increase duration dotted"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM /*| STATE_NOTE_ENTRY_TAB*/,
        "dec-duration-dotted",
        QT_TRANSLATE_NOOP("action","Decrease Duration Dotted"),
        QT_TRANSLATE_NOOP("action","Decrease duration dotted"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "repeat-sel",
        QT_TRANSLATE_NOOP("action","Repeat Selection"),
        QT_TRANSLATE_NOOP("action","Repeat selection"),
        0,
        Icons::fileOpen_ICON
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "follow",
        QT_TRANSLATE_NOOP("action","Pan Piano Roll"),
        QT_TRANSLATE_NOOP("action","Toggle pan piano roll"),
        QT_TRANSLATE_NOOP("action","Pan roll during playback"),
        Icons::pan_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE | ShortcutFlags::A_CHECKABLE | ShortcutFlags::A_CHECKED
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "split-h",
        QT_TRANSLATE_NOOP("action","Documents Side by Side"),
        QT_TRANSLATE_NOOP("action","Display documents side by side")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "split-v",
        QT_TRANSLATE_NOOP("action","Documents Stacked"),
        QT_TRANSLATE_NOOP("action","Display documents stacked")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "parts",
        QT_TRANSLATE_NOOP("action","Parts…"),
        QT_TRANSLATE_NOOP("action","Manage parts")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "enh-both",
        QT_TRANSLATE_NOOP("action","Change Enharmonic Spelling (Both Modes)"),
        QT_TRANSLATE_NOOP("action","Change enharmonic spelling (both modes)"),
        QT_TRANSLATE_NOOP("action","Change enharmonic note (alters the spelling in concert pitch and transposed mode)")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY_STAFF_PITCHED | STATE_NOTE_ENTRY_STAFF_DRUM,
        "enh-current",
        QT_TRANSLATE_NOOP("action","Change Enharmonic Spelling (Current Mode)"),
        QT_TRANSLATE_NOOP("action","Change enharmonic spelling (current mode)"),
        QT_TRANSLATE_NOOP("action","Change enharmonic note (alters the spelling in the current mode only)")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL,
        "revision",
        QT_TRANSLATE_NOOP("action","Create New Revision"),
        QT_TRANSLATE_NOOP("action","Create new revision")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_FOTO,
        "fotomode",
        QT_TRANSLATE_NOOP("action","Image Capture"),
        QT_TRANSLATE_NOOP("action","Toggle 'Image Capture'"),
        0,
        Icons::fotomode_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
#ifdef OMR
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "show-omr",
        QT_TRANSLATE_NOOP("action","Show PDF Image"),
        QT_TRANSLATE_NOOP("action","Show PDF image")
    },
#endif
    {
        MsWidget::MAIN_WINDOW,
        ~STATE_TEXT_EDIT,
        "fullscreen",
        QT_TRANSLATE_NOOP("action","Full Screen"),
        QT_TRANSLATE_NOOP("action","Full screen")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "hraster",
        QT_TRANSLATE_NOOP("action","Enable Snap to Horizontal Grid"),
        QT_TRANSLATE_NOOP("action","Enable snap to horizontal grid"),
        0,
        Icons::hraster_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "vraster",
        QT_TRANSLATE_NOOP("action","Enable Snap to Vertical Grid"),
        QT_TRANSLATE_NOOP("action","Enable snap to vertical grid"),
        0,
        Icons::vraster_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT,
        "config-raster",
        QT_TRANSLATE_NOOP("action","Configure Grid"),
        QT_TRANSLATE_NOOP("action","Configure grid")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY | STATE_FOTO | STATE_EDIT,
        "toggle-piano",
        QT_TRANSLATE_NOOP("action","Piano Keyboard"),
        QT_TRANSLATE_NOOP("action","Piano keyboard")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY | STATE_FOTO | STATE_EDIT,
        "toggle-scorecmp-tool",
        QT_TRANSLATE_NOOP("action","Score Comparison Tool"),
        QT_TRANSLATE_NOOP("action","Score comparison tool")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY | STATE_FOTO,
        "media",
        QT_TRANSLATE_NOOP("action","Additional Media…"),
        QT_TRANSLATE_NOOP("action","Show media dialog")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "split-measure",
        QT_TRANSLATE_NOOP("action","Split Measure Before Selected Note/Rest"),
        QT_TRANSLATE_NOOP("action","Split measure before selected note/rest")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "join-measures",
        QT_TRANSLATE_NOOP("action","Join Selected Measures"),
        QT_TRANSLATE_NOOP("action","Join selected measures")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY | STATE_FOTO,
        "page-settings",
        QT_TRANSLATE_NOOP("action","Page Settings…"),
        QT_TRANSLATE_NOOP("action","Page settings")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_DISABLED | STATE_NORMAL,
        "album",
        QT_TRANSLATE_NOOP("action","Album…"),
        QT_TRANSLATE_NOOP("action","Album"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL,
        "layer",
        QT_TRANSLATE_NOOP("action","Layers…"),
        QT_TRANSLATE_NOOP("action","Layers"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "next-score",
        QT_TRANSLATE_NOOP("action","Next Score"),
        QT_TRANSLATE_NOOP("action","Next score"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "previous-score",
        QT_TRANSLATE_NOOP("action","Previous Score"),
        QT_TRANSLATE_NOOP("action","Previous score"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        // conflicts with Ctrl+Shift-P when editing dynamics
        STATE_DISABLED | STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY | STATE_EDIT | STATE_FOTO,
        "plugin-creator",
        QT_TRANSLATE_NOOP("action", "Plugin Creator…"),
        QT_TRANSLATE_NOOP("action", "Plugin creator"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "plugin-manager",
        QT_TRANSLATE_NOOP("action", "Plugin Manager…"),
        QT_TRANSLATE_NOOP("action", "Plugin manager"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY | STATE_EDIT | STATE_FOTO | STATE_TEXT_EDIT,
        "inspector",
        QT_TRANSLATE_NOOP("action","Inspector"),
        QT_TRANSLATE_NOOP("action","Show inspector")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "resource-manager",
        QT_TRANSLATE_NOOP("action", "Resource Manager…"),
        QT_TRANSLATE_NOOP("action", "Resource manager"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
#ifdef OMR
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY | STATE_EDIT,
        "omr",
        QT_TRANSLATE_NOOP("action","PDF Transcribing Assistant"),
        QT_TRANSLATE_NOOP("action","Show PDF transcribing assistant")
    },
#endif
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "loop",
        QT_TRANSLATE_NOOP("action","Loop Playback"),
        QT_TRANSLATE_NOOP("action","Toggle 'Loop Playback'"),
        0,
        Icons::loop_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "loop-in",
        QT_TRANSLATE_NOOP("action","Loop In"),
        QT_TRANSLATE_NOOP("action","Set loop in position"),
        0,
        Icons::loopIn_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY,
        "loop-out",
        QT_TRANSLATE_NOOP("action","Loop Out"),
        QT_TRANSLATE_NOOP("action","Set loop out position"),
        0,
        Icons::loopOut_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY | STATE_EDIT,
        "metronome",
        QT_TRANSLATE_NOOP("action","Metronome"),
        QT_TRANSLATE_NOOP("action","Toggle metronome playback"),
        QT_TRANSLATE_NOOP("action","Play metronome during playback"),
        Icons::metronome_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY | STATE_PLAY | STATE_EDIT,
        "countin",
        QT_TRANSLATE_NOOP("action","Count-In"),
        QT_TRANSLATE_NOOP("action","Toggle 'Count-In' playback"),
        QT_TRANSLATE_NOOP("action","Play count-in at playback start"),
        Icons::countin_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "figured-bass",
        QT_TRANSLATE_NOOP("action","Figured Bass"),
        QT_TRANSLATE_NOOP("action","Add figured bass"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "transpose-up",
        QT_TRANSLATE_NOOP("action","Transpose Up"),
        QT_TRANSLATE_NOOP("action","Transpose up")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "transpose-down",
        QT_TRANSLATE_NOOP("action","Transpose Down"),
        QT_TRANSLATE_NOOP("action","Transpose down")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "masterpalette",
        QT_TRANSLATE_NOOP("action","Master Palette…"),
        QT_TRANSLATE_NOOP("action","Show master palette"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "key-signatures",
        QT_TRANSLATE_NOOP("action","Key Signatures…"),
        QT_TRANSLATE_NOOP("action","Show key signature palette"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "time-signatures",
        QT_TRANSLATE_NOOP("action","Time Signatures…"),
        QT_TRANSLATE_NOOP("action","Show time signature palette"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "symbols",
        QT_TRANSLATE_NOOP("action","Symbols…"),
        QT_TRANSLATE_NOOP("action","Show symbol palette"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL,
        "viewmode",
        QT_TRANSLATE_NOOP("action","Toggle View Mode"),
        QT_TRANSLATE_NOOP("action","Toggle 'View Mode'"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_LYRICS_EDIT,
        "next-lyric",
        QT_TRANSLATE_NOOP("action","Next Syllable"),
        QT_TRANSLATE_NOOP("action","Next syllable")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_LYRICS_EDIT,
        "prev-lyric",
        QT_TRANSLATE_NOOP("action","Previous Syllable"),
        QT_TRANSLATE_NOOP("action","Previous syllable")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "toggle-visible",
        QT_TRANSLATE_NOOP("action","Toggle Visibility"),
        QT_TRANSLATE_NOOP("action","Toggle 'Visibility'")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "set-visible",
        QT_TRANSLATE_NOOP("action","Set Visible"),
        QT_TRANSLATE_NOOP("action","Set visible")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "unset-visible",
        QT_TRANSLATE_NOOP("action","Set Invisible"),
        QT_TRANSLATE_NOOP("action","Set invisible")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-noteline",
        QT_TRANSLATE_NOOP("action","Note Anchored Line"),
        QT_TRANSLATE_NOOP("action","Note anchored line")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL | STATE_LOCK,
        "lock",
        QT_TRANSLATE_NOOP("action","Lock Score"),
        QT_TRANSLATE_NOOP("action","Lock score")
    },

    // TAB-specific actions
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,                      // use a STATE value which is never used: shortcut is never active
        "note-longa-TAB",
        QT_TRANSLATE_NOOP("action","Longa (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: Longa (TAB)"),
        QT_TRANSLATE_NOOP("action","Longa note"),
        Icons::longaUp_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "note-breve-TAB",
        QT_TRANSLATE_NOOP("action","Double Whole Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: Double whole (TAB)"),
        QT_TRANSLATE_NOOP("action","Double whole note"),
        Icons::brevis_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-1-TAB",
        QT_TRANSLATE_NOOP("action","Whole Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: Whole (TAB)"),
        QT_TRANSLATE_NOOP("action","Whole note"),
        Icons::note_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-2-TAB",
        QT_TRANSLATE_NOOP("action","Half Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: Half (TAB)"),
        QT_TRANSLATE_NOOP("action","Half note"),
        Icons::note2_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-4-TAB",
        QT_TRANSLATE_NOOP("action","Quarter Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: Quarter (TAB)"),
        QT_TRANSLATE_NOOP("action","Quarter note"),
        Icons::note4_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-8-TAB",
        QT_TRANSLATE_NOOP("action","Eighth Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: Eighth (TAB)"),
        QT_TRANSLATE_NOOP("action","Eighth note"),
        Icons::note8_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-16-TAB",
        QT_TRANSLATE_NOOP("action","16th Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: 16th (TAB)"),
        QT_TRANSLATE_NOOP("action","16th note"),
        Icons::note16_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-32-TAB",
        QT_TRANSLATE_NOOP("action","32nd Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: 32nd (TAB)"),
        QT_TRANSLATE_NOOP("action","32nd note"),
        Icons::note32_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-64-TAB",
        QT_TRANSLATE_NOOP("action","64th Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: 64th (TAB)"),
        QT_TRANSLATE_NOOP("action","64th note"),
        Icons::note64_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-128-TAB",
        QT_TRANSLATE_NOOP("action","128th Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: 128th (TAB)"),
        QT_TRANSLATE_NOOP("action","128th note"),
        Icons::note128_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-256-TAB",
        QT_TRANSLATE_NOOP("action","256th Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: 256th (TAB)"),
        QT_TRANSLATE_NOOP("action","256th note"),
        Icons::note256_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-512-TAB",
        QT_TRANSLATE_NOOP("action","512th Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: 512th (TAB)"),
        QT_TRANSLATE_NOOP("action","512th note"),
        Icons::note512_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NEVER,
        "pad-note-1024-TAB",
        QT_TRANSLATE_NOOP("action","1024th Note (TAB)"),
        QT_TRANSLATE_NOOP("action","Note duration: 1024th (TAB)"),
        QT_TRANSLATE_NOOP("action","1024th note"),
        Icons::note1024_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "pad-note-increase-TAB",
        QT_TRANSLATE_NOOP("action","Increase Active Duration (TAB)"),
        QT_TRANSLATE_NOOP("action","Increase active duration (TAB)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "pad-note-decrease-TAB",
        QT_TRANSLATE_NOOP("action","Decrease Active Duration (TAB)"),
        QT_TRANSLATE_NOOP("action","Decrease active duration (TAB)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "rest-TAB",
        QT_TRANSLATE_NOOP("action","Rest (TAB)"),
        QT_TRANSLATE_NOOP("action","Enter rest (TAB)"),
        0,
        Icons::quartrest_ICON
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "pad-rest-TAB",
        QT_TRANSLATE_NOOP("action","Rest (TAB)"),
        QT_TRANSLATE_NOOP("action","Note input: Rest (TAB)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "string-above",
        QT_TRANSLATE_NOOP("action","String Above (TAB)"),
        QT_TRANSLATE_NOOP("action","Select string above (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "string-below",
        QT_TRANSLATE_NOOP("action","String Below (TAB)"),
        QT_TRANSLATE_NOOP("action","Select string below (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-0",
        QT_TRANSLATE_NOOP("action","Fret 0 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 0 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-1",
        QT_TRANSLATE_NOOP("action","Fret 1 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 1 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-2",
        QT_TRANSLATE_NOOP("action","Fret 2 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 2 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-3",
        QT_TRANSLATE_NOOP("action","Fret 3 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 3 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-4",
        QT_TRANSLATE_NOOP("action","Fret 4 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 4 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-5",
        QT_TRANSLATE_NOOP("action","Fret 5 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 5 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-6",
        QT_TRANSLATE_NOOP("action","Fret 6 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 6 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-7",
        QT_TRANSLATE_NOOP("action","Fret 7 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 7 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-8",
        QT_TRANSLATE_NOOP("action","Fret 8 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 8 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-9",
        QT_TRANSLATE_NOOP("action","Fret 9 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 9 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-10",
        QT_TRANSLATE_NOOP("action","Fret 10 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 10 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-11",
        QT_TRANSLATE_NOOP("action","Fret 11 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 11 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-12",
        QT_TRANSLATE_NOOP("action","Fret 12 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 12 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-13",
        QT_TRANSLATE_NOOP("action","Fret 13 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 13 on current string (TAB only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NOTE_ENTRY_STAFF_TAB,
        "fret-14",
        QT_TRANSLATE_NOOP("action","Fret 14 (TAB)"),
        QT_TRANSLATE_NOOP("action","Add fret 14 on current string (TAB only)")
    },

    // HARMONY / FIGURED BASS specific actions

    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "advance-longa",
        QT_TRANSLATE_NOOP("action","Longa Advance (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Advance of a longa (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "advance-breve",
        QT_TRANSLATE_NOOP("action","Breve Advance (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Advance of a double whole note (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "advance-1",
        QT_TRANSLATE_NOOP("action","Whole Note Advance (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Advance of a whole note (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "advance-2",
        QT_TRANSLATE_NOOP("action","Half Note Advance (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Advance of a half note (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "advance-4",
        QT_TRANSLATE_NOOP("action","Quarter Note Advance (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Advance of a quarter note (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "advance-8",
        QT_TRANSLATE_NOOP("action","Eighth Note Advance (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Advance of an eighth note (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "advance-16",
        QT_TRANSLATE_NOOP("action","16th Note Advance (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Advance of a 16th note (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "advance-32",
        QT_TRANSLATE_NOOP("action","32nd Note Advance (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Advance of a 32nd note (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "advance-64",
        QT_TRANSLATE_NOOP("action","64th Note Advance (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Advance of a 64th note (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "prev-measure-TEXT",
        QT_TRANSLATE_NOOP("action","Previous Measure (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Previous measure (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "next-measure-TEXT",
        QT_TRANSLATE_NOOP("action","Next Measure (F.B./Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Next measure (Figured bass/Chord symbol only)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "prev-beat-TEXT",
        QT_TRANSLATE_NOOP("action","Previous Beat (Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Previous beat (Chord symbol)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_HARMONY_FIGBASS_EDIT,
        "next-beat-TEXT",
        QT_TRANSLATE_NOOP("action","Next Beat (Chord Symbol)"),
        QT_TRANSLATE_NOOP("action","Next beat (Chord symbol)")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-brackets",
        QT_TRANSLATE_NOOP("action","Add Brackets to Accidental"),
        QT_TRANSLATE_NOOP("action","Add brackets to accidental"),
        0,
        Icons::brackets_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "add-parentheses",
        QT_TRANSLATE_NOOP("action","Add Parentheses to Element"),
        QT_TRANSLATE_NOOP("action","Add parentheses to element"),
        0,
        Icons::parentheses_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "toggle-mmrest",
        QT_TRANSLATE_NOOP("action","Toggle 'Create Multimeasure Rest'"),
        QT_TRANSLATE_NOOP("action","Toggle 'Create Multimeasure Rest'"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "toggle-hide-empty",
        QT_TRANSLATE_NOOP("action","Toggle 'Hide Empty Staves'"),
        QT_TRANSLATE_NOOP("action","Toggle 'Hide Empty Staves'"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_TEXT_EDIT,
        "text-b",
        QT_TRANSLATE_NOOP("action","Bold Face"),
        QT_TRANSLATE_NOOP("action","Bold face")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_TEXT_EDIT,
        "text-i",
        QT_TRANSLATE_NOOP("action","Italic")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_TEXT_EDIT,
        "text-u",
        QT_TRANSLATE_NOOP("action","Underline")
    },
    {
        MsWidget::SCORE_TAB,
        STATE_TEXT_EDIT,
        "text-word-left",
        QT_TRANSLATE_NOOP("action","Move Word Left"),
        QT_TRANSLATE_NOOP("action","Move word left"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_TEXT_EDIT,
        "text-word-right",
        QT_TRANSLATE_NOOP("action","Move Word Right"),
        QT_TRANSLATE_NOOP("action","Move word right"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_SCORE
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "explode",
        QT_TRANSLATE_NOOP("action","Explode"),
        QT_TRANSLATE_NOOP("action","Explode"),
        QT_TRANSLATE_NOOP("action","Explode contents of top selected staff into staves below"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "realize-chord-symbols",
        QT_TRANSLATE_NOOP("action","Realize Chord Symbols"),
        QT_TRANSLATE_NOOP("action","Realize chord symbols"),
        QT_TRANSLATE_NOOP("action","Convert chord symbols into notes"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "implode",
        QT_TRANSLATE_NOOP("action","Implode"),
        QT_TRANSLATE_NOOP("action","Implode"),
        QT_TRANSLATE_NOOP("action","Implode contents of selected staves into top selected staff"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "slash-fill",
        QT_TRANSLATE_NOOP("action","Fill With Slashes"),
        QT_TRANSLATE_NOOP("action","Fill with slashes"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "slash-rhythm",
        QT_TRANSLATE_NOOP("action","Toggle Rhythmic Slash Notation"),
        QT_TRANSLATE_NOOP("action","Toggle 'Rhythmic Slash Notation'"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "add-remove-breaks",
        QT_TRANSLATE_NOOP("action","Add/Remove System Breaks…"),
        QT_TRANSLATE_NOOP("action","Add/remove system breaks"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "resequence-rehearsal-marks",
        QT_TRANSLATE_NOOP("action","Resequence Rehearsal Marks"),
        QT_TRANSLATE_NOOP("action","Resequence rehearsal marks"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL,
        "copy-lyrics-to-clipboard",
        QT_TRANSLATE_NOOP("action","Copy Lyrics to Clipboard"),
        QT_TRANSLATE_NOOP("action","Copy lyrics to clipboard"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CMD
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_DISABLED | STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "startcenter",
        QT_TRANSLATE_NOOP("action","Start Center…"),
        QT_TRANSLATE_NOOP("action","Start center"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL,
        "edit-toolbars",
        QT_TRANSLATE_NOOP("action","Customize Toolbars…"),
        QT_TRANSLATE_NOOP("action","Customize toolbars"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL,
        "del-empty-measures",
        QT_TRANSLATE_NOOP("action","Remove Empty Trailing Measures"),
        QT_TRANSLATE_NOOP("action","Remove empty trailing measures"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL,
        "unroll-repeats",
        QT_TRANSLATE_NOOP("action","Unroll Repeats"),
        QT_TRANSLATE_NOOP("action","Unroll Repeats"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_DISABLED | STATE_NORMAL | STATE_NOTE_ENTRY | STATE_EDIT | STATE_PLAY,
        "toggle-insert-mode",
        QT_TRANSLATE_NOOP("action","Toggle Insert Mode"),
        QT_TRANSLATE_NOOP("action","Toggle 'Insert Mode'"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "show-tours",
        QT_TRANSLATE_NOOP("action", "Show Tours"),
        QT_TRANSLATE_NOOP("action", "Show tours"),
        QT_TRANSLATE_NOOP("action", "Toggle display of tours"),
        Icons::Invalid_ICON,
        Qt::WindowShortcut,
        ShortcutFlags::A_CHECKABLE
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "reset-tours",
        QT_TRANSLATE_NOOP("action", "Reset Tours"),
        QT_TRANSLATE_NOOP("action", "Reset tours"),
        0,
        Icons::Invalid_ICON,
        Qt::WindowShortcut
    },
    {
        MsWidget::SCORE_TAB,
        STATE_NORMAL | STATE_NOTE_ENTRY,
        "toggle-autoplace",
        QT_TRANSLATE_NOOP("action","Toggle Automatic Placement"),
        QT_TRANSLATE_NOOP("action","Toggle 'Automatic Placement' for selected elements")
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "autoplace-enabled",
        QT_TRANSLATE_NOOP("action","Toggle Automatic Placement Globally"),
        QT_TRANSLATE_NOOP("action","Toggle 'Automatic Placement' globally"),
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "report-bug",
        QT_TRANSLATE_NOOP("action", "Report a Bug"),
        QT_TRANSLATE_NOOP("action", "Report a bug"),
        0,
        Icons::bug_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "leave-feedback",
        QT_TRANSLATE_NOOP("action", "Feedback"),
        QT_TRANSLATE_NOOP("action", "Leave feedback"),
        0,
        Icons::mail_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::PIANO_ROLL_EDITOR,
        STATE_ALL,
        "zoom-in-horiz-pre",
        QT_TRANSLATE_NOOP("action", "Zoom In Horizontally"),
        QT_TRANSLATE_NOOP("action", "Zoom in horizontal - piano roll editor"),
        0,
        Icons::Invalid_ICON
    },
    {
        MsWidget::PIANO_ROLL_EDITOR,
        STATE_ALL,
        "zoom-out-horiz-pre",
        QT_TRANSLATE_NOOP("action", "Zoom Out Horizontally"),
        QT_TRANSLATE_NOOP("action", "Zoom out horizontal - piano roll editor"),
        0,
        Icons::Invalid_ICON
    },
    {
        MsWidget::PIANO_ROLL_EDITOR,
        STATE_ALL,
        "zoom-in-vert-pre",
        QT_TRANSLATE_NOOP("action", "Zoom In Vertically"),
        QT_TRANSLATE_NOOP("action", "Zoom in vertical - piano roll editor"),
        0,
        Icons::Invalid_ICON
    },
    {
        MsWidget::PIANO_ROLL_EDITOR,
        STATE_ALL,
        "zoom-out-vert-pre",
        QT_TRANSLATE_NOOP("action", "Zoom Out Vertically"),
        QT_TRANSLATE_NOOP("action", "Zoom out vertical - piano roll editor"),
        0,
        Icons::Invalid_ICON
    },

#ifdef MSCORE_UNSTABLE
    {
        MsWidget::MAIN_WINDOW,
        STATE_NORMAL,
        "toggle-script-recorder",
        "Script Recorder",
        "Script recorder",
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
#endif
#ifndef NDEBUG
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "no-horizontal-stretch",
        "No Horizontal Stretch",
        "No horizontal stretch",
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "no-vertical-stretch",
        "No Vertical Stretch",
        "No vertical stretch",
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "show-segment-shapes",
        "Show Segment Shapes",
        "Show segment shapes",
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "show-skylines",
        "Show Skylines",
        "Show Skylines",
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "show-bounding-rect",
        "Show Bounding Rectangles",
        "Show bounding rectangles for selected elements",
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "show-system-bounding-rect",
        "Show System Bounding Rectangles",
        "Show bounding rectangles for systems",
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "show-corrupted-measures",
        "Show Corrupted Measures",
        "Show corrupted measures",
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL & ~STATE_TEXT_EDIT,
        "relayout",
        "Re-Layout",
        "Re-layout",
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
    {
        MsWidget::MAIN_WINDOW,
        STATE_ALL,
        "qml-reload-source",
        "Reload QML code",
        "Reload QML code",
        0,
        Icons::Invalid_ICON,
        Qt::ApplicationShortcut
    },
#endif
};

//---------------------------------------------------------
//   Shortcut
//---------------------------------------------------------

Shortcut::Shortcut(MsWidget assignedWidget, int s, const char* name,
                   const char* txt, const char* d, const char* h, Icons i, Qt::ShortcutContext cont, ShortcutFlags f)
{
    _assignedWidget = assignedWidget;
    _state       = s;
    _flags       = f;
    _key         = QByteArray(name);
    _context     = cont;
    if (txt) {
        _text = QByteArray(txt);
    }
    _descr       = d ? QByteArray(d) : _text;
    _help        = h ? QByteArray(h) : _descr;
    _icon        = i;
}

//---------------------------------------------------------
//   clear
//---------------------------------------------------------

void Shortcut::clear()
{
    _standardKey = QKeySequence::UnknownKey;
    _keys.clear();
    if (_action) {
        _action->setShortcuts(_keys);
    }
}

//---------------------------------------------------------
//   setKeys
//---------------------------------------------------------

void Shortcut::setKeys(const QList<QKeySequence>& ks)
{
    _standardKey = QKeySequence::UnknownKey;
    _keys = ks;
    if (_action) {
        _action->setShortcuts(_keys);
    }
}

//---------------------------------------------------------
//   setStandardKey
//---------------------------------------------------------

void Shortcut::setStandardKey(QKeySequence::StandardKey k)
{
    if (QKeySequence::keyBindings(k).empty()) { // make sure key binding is set for OS
        return;
    }

    _standardKey = k;
    if (_action && k != QKeySequence::UnknownKey) {
        _action->setShortcuts(_standardKey);
    }
}

//---------------------------------------------------------
//   setKeys
//    Copies keys from the other Shortcut object
//---------------------------------------------------------

void Shortcut::setKeys(const Shortcut& sc)
{
    setKeys(sc._keys);
    setStandardKey(sc._standardKey);
}

//---------------------------------------------------------
//   descr
//---------------------------------------------------------

QString Shortcut::descr() const
{
    return qApp->translate("action", _descr.data());
}

//---------------------------------------------------------
//   text
//---------------------------------------------------------

QString Shortcut::text() const
{
    return qApp->translate("action", _text.data());
}

//---------------------------------------------------------
//   help
//---------------------------------------------------------

QString Shortcut::help() const
{
    return qApp->translate("action", _help.data());
}

//---------------------------------------------------------
//   getShortcut
//---------------------------------------------------------

Shortcut* Shortcut::getShortcut(const char* id)
{
    Shortcut* s = _shortcuts.value(QByteArray(id));
    if (s == 0) {
        qDebug("Internal error: shortcut <%s> not found", id);
        return 0;
    }
    return s;
}

//---------------------------------------------------------
//   getAction
//    returns action for shortcut
//---------------------------------------------------------

QAction* getAction(const char* id)
{
    Shortcut* s = Shortcut::getShortcut(id);
    return s ? s->action() : 0;
}

//---------------------------------------------------------
//   aAction
//---------------------------------------------------------

QAction* Shortcut::action() const
{
    if (_action) {
        return _action;
    }

    if (_state == STATE_NEVER) {
        return 0;
    }

    _action = new QAction(0);
    _action->setData(_key);
    _action->setIconVisibleInMenu(false);
    if (isCheckable()) {
        _action->setCheckable(isCheckable());
        _action->setChecked(isChecked());
    }

    if (_keys.isEmpty()) {
        _action->setShortcuts(_standardKey);
    } else {
        _action->setShortcuts(_keys);
    }

    _action->setShortcutContext(_context);
    translateAction(_action);

    if (_icon != Icons::Invalid_ICON) {
        _action->setIcon(*icons[int(_icon)]);
    }

    return _action;
}

//---------------------------------------------------------
//   translateAction
//---------------------------------------------------------

void Shortcut::translateAction(QAction* action) const
{
    action->setText(text());
    if (!_help.isEmpty()) {
        action->setToolTip(help());
        action->setWhatsThis(help());
    } else {
        action->setToolTip(descr());
        action->setWhatsThis(descr());
    }
    action->setStatusTip(QString("action:%1").arg(_key.data()));
    QList<QKeySequence> kl = action->shortcuts();
    if (!kl.isEmpty()) {
        QString s(action->toolTip());
        s += " (";
        for (int i = 0; i < kl.size(); ++i) {
            if (i) {
                s += ",";
            }
            s += Shortcut::keySeqToString(kl[i], QKeySequence::NativeText);
        }
        s += ")";
        action->setToolTip(s);
    }
}

//---------------------------------------------------------
//   addShortcut
//---------------------------------------------------------

void Shortcut::addShortcut(const QKeySequence& ks)
{
    _keys.append(ks);
    if (_action) {
        _action->setShortcuts(_keys);
    }
    dirty = true;
}

//---------------------------------------------------------
//   keysToString
//---------------------------------------------------------

QString Shortcut::keysToString() const
{
    QString s;
    for (int i = 0; i < _keys.size(); ++i) {
        if (i) {
            s += "; ";
        }
        s += Shortcut::keySeqToString(_keys[i], QKeySequence::NativeText);
    }
    if (s.isEmpty() && _standardKey != QKeySequence::UnknownKey) {
        QList<QKeySequence> keySeqList = QKeySequence::keyBindings(_standardKey);
        for (int i = 0; i < keySeqList.size(); i++) {
            if (i) {
                s += "; ";
            }
            s += Shortcut::keySeqToString(keySeqList[i], QKeySequence::NativeText);
        }
    }
    return s;
}

//---------------------------------------------------------
//   getMenuShortcutString
//---------------------------------------------------------

QString Shortcut::getMenuShortcutString(const QMenu* menu)
{
    if (menu->title().isEmpty()) {
        return "";
    }
    int shortcutKeyPosition = menu->title().indexOf('&');
    if (shortcutKeyPosition < 0) {
        return "";
    }
    return QString("Alt+") + menu->title().at(shortcutKeyPosition + 1);
}

//---------------------------------------------------------
//   compareKeys
//    return true if keys are equal
//---------------------------------------------------------

bool Shortcut::compareKeys(const Shortcut& sc) const
{
    if (sc._keys.size() != _keys.size()) {
        return false;
    }
    for (int i = 0; i < _keys.size(); ++i) {
        if (sc._keys[i] != _keys[i]) {
            return false;
        }
    }
    return _standardKey == sc._standardKey;
}

//---------------------------------------------------------
//   initShortcuts
//---------------------------------------------------------

void Shortcut::init()
{
    //
    // initialize shortcut hash table
    //
    _shortcuts.clear();
    for (Shortcut& i : _sc) {
        _shortcuts.insert(i._key, &i);
    }
    if (!MScore::noGui) {
        load();
    }
}

//---------------------------------------------------------
//   retranslate
//---------------------------------------------------------

void Shortcut::retranslate()
{
    for (const Shortcut& i : _sc) {
        if (i._action) {
            i.translateAction(i._action);
        }
    }
}

void Shortcut::refreshIcons()
{
    for (Shortcut* s : _shortcuts) {
        QAction* a = s->action();
        if (a && s->icon() != Icons::Invalid_ICON) {
            a->setIcon(*icons[int(s->icon())]);
        }
    }
}

//---------------------------------------------------------
//   save
//---------------------------------------------------------

void Shortcut::save()
{
    QFile f(dataPath + "/shortcuts.xml");
    if (!f.open(QIODevice::WriteOnly)) {
        qDebug("cannot save shortcuts");
        return;
    }
    XmlWriter xml(0, &f);
    xml.header();
    xml.stag("Shortcuts");
    for (auto i : _sc) {
        i.write(xml);
    }
    xml.etag();
    f.close();
}

void Shortcut::saveToNewFile(QString fileLocation)
{
    QFile f(fileLocation);
    if (!f.open(QIODevice::WriteOnly)) {
        qDebug("cannot save shortcuts");
        return;
    }
    XmlWriter xml(0, &f);
    xml.header();
    xml.stag("Shortcuts");
    for (auto i : _sc) {
        i.write(xml);
    }
    xml.etag();
    f.close();
}

//---------------------------------------------------------
//   write
//---------------------------------------------------------

void Shortcut::write(XmlWriter& xml) const
{
    xml.stag("SC");
    xml.tag("key", _key.data());
    if (_standardKey != QKeySequence::UnknownKey) {
        xml.tag("std", QString("%1").arg(_standardKey));
    }
    for (QKeySequence ks : _keys) {
        xml.tag("seq", Shortcut::keySeqToString(ks, QKeySequence::PortableText, true));
    }
    xml.etag();
}

//---------------------------------------------------------
//   read
//---------------------------------------------------------

void Shortcut::read(XmlReader& e)
{
    while (e.readNextStartElement()) {
        const QStringRef& tag(e.name());
        if (tag == "key") {
            _key = e.readElementText().toLocal8Bit();
        } else if (tag == "std") {
            int i = e.readInt();
            if (!QKeySequence::keyBindings((QKeySequence::StandardKey(i))).empty()) {     // make sure key binding is set for OS
                _standardKey = QKeySequence::StandardKey(i);
            }
        } else if (tag == "seq") {
            QKeySequence seq  = Shortcut::keySeqFromString(e.readElementText(), QKeySequence::PortableText);
#ifndef NDEBUG
            for (const Shortcut& sc : _sc) {
                for (const QKeySequence s : sc._keys) {
                    if (s == seq) {
                        qDebug("Ambiguous shortcut for action <%s>", _key.data());
                    }
                }
            }
#endif
            _keys.append(seq);
        } else {
            e.unknown();
        }
    }
}

//---------------------------------------------------------
//   read
//---------------------------------------------------------

void Shortcut::load()
{
    QFile f(dataPath + "/shortcuts.xml");
    if (!f.exists()) {
        f.setFileName(defaultFileName);
    }
    if (!f.open(QIODevice::ReadOnly)) {
        qDebug("Cannot open shortcuts <%s>", qPrintable(f.fileName()));
        return;
    }
    if (MScore::debugMode) {
        qDebug("read shortcuts from <%s>", qPrintable(f.fileName()));
    }

    XmlReader e(&f);

    while (e.readNextStartElement()) {
        if (e.name() == "Shortcuts") {
            while (e.readNextStartElement()) {
                if (e.name() == "SC") {
                    Shortcut* sc = 0;
                    while (e.readNextStartElement()) {
                        const QStringRef& tag(e.name());
                        if (tag == "key") {
                            QString val(e.readElementText());
                            sc = getShortcut(qPrintable(val));
                            if (!sc) {
                                qDebug("cannot find shortcut <%s>", qPrintable(val));
                            } else {
                                sc->clear();
                            }
                        } else if (tag == "std") {
                            int i = e.readInt();
                            if (sc && !QKeySequence::keyBindings((QKeySequence::StandardKey(i))).empty()) {            // make sure key binding is set for OS
                                sc->_standardKey = QKeySequence::StandardKey(i);
                            }
                        } else if (tag == "seq") {
                            QString s = e.readElementText();
                            if (sc) {
                                sc->_keys.append(Shortcut::keySeqFromString(s, QKeySequence::PortableText));
                            }
                        } else {
                            e.unknown();
                        }
                    }
                } else {
                    e.unknown();
                }
            }
        } else {
            e.unknown();
        }
    }
    source = f.fileName();
    dirty = false;
}

//---------------------------------------------------------
//   Shortcut1
//---------------------------------------------------------

struct Shortcut1 {
    QByteArray key;
    QList<QKeySequence> keys;
    QKeySequence::StandardKey standardKey { QKeySequence::UnknownKey };
};

//---------------------------------------------------------
//   read
//---------------------------------------------------------

static QList<Shortcut1> loadShortcuts(QString fileLocation)
{
    QList<Shortcut1> list;
    QFile f(fileLocation);
    if (!f.open(QIODevice::ReadOnly)) {
        qDebug("Cannot open shortcuts");
        QMessageBox::critical(0, QObject::tr("Load Shortcuts"),
                              QObject::tr("Can't load shortcuts file: %1").arg(strerror(errno)));
        return list;
    }
    XmlReader e(&f);
    while (e.readNextStartElement()) {
        if (e.name() == "Shortcuts") {
            while (e.readNextStartElement()) {
                if (e.name() == "SC") {
                    Shortcut1 sc;
                    while (e.readNextStartElement()) {
                        const QStringRef& tag(e.name());
                        if (tag == "key") {
                            sc.key = e.readElementText().toLocal8Bit();
                        } else if (tag == "std") {
                            int i = e.readInt();
                            if (!QKeySequence::keyBindings(QKeySequence::StandardKey(i)).empty()) {             // make sure key binding is set for OS
                                sc.standardKey = QKeySequence::StandardKey(i);
                            }
                        } else if (tag == "seq") {
                            sc.keys.append(Shortcut::keySeqFromString(e.readElementText(), QKeySequence::PortableText));
                        } else {
                            e.unknown();
                        }
                    }
                    list.append(sc);
                } else {
                    e.unknown();
                }
            }
        } else {
            e.unknown();
        }
    }
    return list;
}

void Shortcut::loadFromNewFile(QString fileLocation)
{
    QList<Shortcut1> list = loadShortcuts(fileLocation);
    for (const Shortcut1& sc : list) {
        Shortcut* s = getShortcut(sc.key);
        if (s) {
            s->setKeys(sc.keys);
            s->setStandardKey(sc.standardKey);
        }
    }
    source = fileLocation;
    dirty = true;
}

//---------------------------------------------------------
//    getActionGroupForWidget
//---------------------------------------------------------

QActionGroup* Shortcut::getActionGroupForWidget(MsWidget w)
{
    QActionGroup* ag = new QActionGroup(NULL);
    ag->setExclusive(false);
    ag->setEnabled(true);
    for (Shortcut* s : Shortcut::shortcuts()) {
        if (s->assignedWidget() == w) {
            QAction* a = s->action();
            if (a) {
                ag->addAction(s->action());
            }
        }
    }
    return ag;
}

QActionGroup* Shortcut::getActionGroupForWidget(MsWidget w, Qt::ShortcutContext newShortcutContext)
{
    QActionGroup* ag = Shortcut::getActionGroupForWidget(w);
    for (QAction* a : ag->actions()) {
        a->setShortcutContext(newShortcutContext);
    }
    return ag;
}

//---------------------------------------------------------
//   resetToBuildin
//    reset all shortcuts to builtin values
//---------------------------------------------------------

void Shortcut::resetToDefault()
{
    QList<Shortcut1> sl = loadShortcuts(defaultFileName);
    for (const Shortcut1& sc : sl) {
        Shortcut* s = getShortcut(sc.key);
        if (s) {
            s->setKeys(sc.keys);
            s->setStandardKey(sc.standardKey);
        }
    }
    source = defaultFileName;
    dirty = true;
}

//---------------------------------------------------------
//   getShortcutByKeySequence
//---------------------------------------------------------

Shortcut* Shortcut::getShortcutByKeySequence(const QKeySequence& keySequence, const ScoreState state)
{
    for (Shortcut* shortcut : _shortcuts.values()) {
        if (!(shortcut->state() & state)) {
            continue;
        }

        QAction* action = shortcut->action();

        if (!action) {
            continue;
        }

        for (const QKeySequence& _keySequence : action->shortcuts()) {
            if (_keySequence == keySequence) {
                return shortcut;
            }
        }
    }

    return nullptr;
}

//---------------------------------------------------------
//   reset
//---------------------------------------------------------

void Shortcut::reset()
{
    _standardKey = QKeySequence::UnknownKey;
    _keys.clear();
    QList<Shortcut1> sl = loadShortcuts(defaultFileName);
    for (const Shortcut1& sc : sl) {
        if (sc.key == _key) {
            setKeys(sc.keys);
            setStandardKey(sc.standardKey);
            break;
        }
    }
    dirty = true;
}

//---------------------------------------------------------
//   keySeqToString / keySeqFromString
//---------------------------------------------------------

static const QString numPadPrefix("NumPad+");
static const int NUMPADPREFIX_SIZE = 7;         // the length in chars of the above string

QString Shortcut::keySeqToString(const QKeySequence& keySeq, QKeySequence::SequenceFormat fmt,
                                 bool escapeKeyStr /* = false */)
{
    QString s;
    for (int i = 0; i < KEYSEQ_SIZE; ++i) {
        int code;
        if ((code = keySeq[i]) == 0) {
            break;
        }
        if (i) {
            s += ",";
        }
        if (code & Qt::KeypadModifier) {
            s += numPadPrefix;
            code &= ~Qt::KeypadModifier;
        }
        QString kStr = QKeySequence(code).toString(fmt);
        if (escapeKeyStr) {
            kStr.replace("\\", "\\\\");
            kStr.replace(",", "\\,");
        }
        s += kStr;
    }
    return s;
}

//---------------------------------------------------------
//   keySeqFromString
//---------------------------------------------------------

QKeySequence Shortcut::keySeqFromString(const QString& str, QKeySequence::SequenceFormat fmt)
{
    int code[KEYSEQ_SIZE], i;
    for (i = 0; i < KEYSEQ_SIZE; ++i) {
        code[i] = 0;
    }

    QStringList strList = str.split(QRegularExpression("(?<!\\\\),|(?<=\\\\\\\\),"), QString::SkipEmptyParts);
    //split based on commas that are not preceded by a single slash; two is okay
    //original regex: (?<!\\),|(?<=\\\\),

    i = 0;
    for (const QString& s : strList) {
        QString keyStr = s.trimmed();
        if (keyStr.contains("\\")) {
            keyStr.remove(keyStr.length() - 2, 1);       //remove escaped characters which will always be second to last
        }
        if (keyStr.startsWith(numPadPrefix, Qt::CaseInsensitive)) {
            code[i] += Qt::KeypadModifier;
            keyStr.remove(0, NUMPADPREFIX_SIZE);
        }
        QKeySequence seq = QKeySequence::fromString(keyStr, fmt);
        code[i] += seq[0];
        if (++i >= KEYSEQ_SIZE) {
            break;
        }
    }
    QKeySequence keySeq(code[0], code[1], code[2], code[3]);
    return keySeq;
}
}
