bf5e1aee70
The workspace now can save the following: - Palettes - Toolbars - Menubar - GUI preferences - GUI components Also, Basic and Advanced workspaces are no longer hard coded. See the following blog posts for more info: Project Description: https://musescore.org/en/user/1190941/blog/2018/04/26/gsoc-2018-beginner-mode-and-tutorial-creation-project-description Week 1: https://musescore.org/en/user/1190941/blog/2018/05/20/gsoc-2018-beginner-mode-and-tutorial-creation-week-1 Week 2: https://musescore.org/en/user/1190941/blog/2018/05/28/gsoc-2018-beginner-mode-and-tutorial-creation-week-2 Week 3: https://musescore.org/en/user/1190941/blog/2018/06/04/gsoc-2018-beginner-mode-and-tutorial-creation-week-3 Week 4: https://musescore.org/en/user/1190941/blog/2018/06/12/gsoc-2018-beginner-mode-and-tutorial-creation-week-4 Week 5: https://musescore.org/en/user/1190941/blog/2018/06/17/gsoc-2018-beginner-mode-and-tutorial-creation-week-5
280 lines
9.4 KiB
C++
280 lines
9.4 KiB
C++
//=============================================================================
|
|
// MuseScore
|
|
// Music Composition & Notation
|
|
//
|
|
// Copyright (C) 2016 Werner Schweer
|
|
//
|
|
// 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 LICENCE.GPL
|
|
//=============================================================================
|
|
|
|
#include "toolbarEditor.h"
|
|
#include "musescore.h"
|
|
#include "workspace.h"
|
|
|
|
namespace Ms {
|
|
|
|
static const char* toolbars[] = {
|
|
"Note Input",
|
|
"File Operations",
|
|
"Playback Controls"
|
|
};
|
|
|
|
//---------------------------------------------------------
|
|
// showToolbarEditor
|
|
//---------------------------------------------------------
|
|
|
|
void MuseScore::showToolbarEditor()
|
|
{
|
|
if (!editToolbars) {
|
|
editToolbars = new ToolbarEditor(this);
|
|
}
|
|
editToolbars->init();
|
|
editToolbars->show();
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// ToolbarEditor
|
|
//---------------------------------------------------------
|
|
|
|
ToolbarEditor::ToolbarEditor(QWidget* parent)
|
|
: QDialog(parent)
|
|
{
|
|
setObjectName("ToolbarEditor");
|
|
setupUi(this);
|
|
|
|
for (auto i : toolbars)
|
|
toolbarList->addItem(QString(i));
|
|
toolbarList->setCurrentRow(0);
|
|
|
|
new_toolbars = new std::vector<std::list<const char*>*>();
|
|
new_toolbars->push_back(mscore->noteInputMenuEntries());
|
|
new_toolbars->push_back(mscore->fileOperationEntries());
|
|
new_toolbars->push_back(mscore->playbackControlEntries());
|
|
|
|
connect(toolbarList, SIGNAL(currentRowChanged(int)), SLOT(toolbarChanged(int)));
|
|
connect(add, SIGNAL(clicked()), SLOT(addAction()));
|
|
connect(remove, SIGNAL(clicked()), SLOT(removeAction()));
|
|
connect(up, SIGNAL(clicked()), SLOT(upAction()));
|
|
connect(down, SIGNAL(clicked()), SLOT(downAction()));
|
|
connect(buttonBox, SIGNAL(accepted()), SLOT(accepted()));
|
|
|
|
MuseScore::restoreGeometry(this);
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// init
|
|
//---------------------------------------------------------
|
|
|
|
void ToolbarEditor::init()
|
|
{
|
|
QString name = Workspace::currentWorkspace->name();
|
|
bool writable = !Workspace::currentWorkspace->readOnly();
|
|
if (!writable) {
|
|
name += tr(" (not changeable)");
|
|
}
|
|
add->setEnabled(writable);
|
|
remove->setEnabled(writable);
|
|
up->setEnabled(writable);
|
|
down->setEnabled(writable);
|
|
workspaceName->setText(name);
|
|
|
|
// Syncs the editor with the current toolbars
|
|
new_toolbars->at(0) = mscore->noteInputMenuEntries();
|
|
new_toolbars->at(1) = mscore->fileOperationEntries();
|
|
new_toolbars->at(2) = mscore->playbackControlEntries();
|
|
toolbarChanged(toolbarList->currentRow()); // populate lists
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// accepted
|
|
//---------------------------------------------------------
|
|
|
|
void ToolbarEditor::accepted()
|
|
{
|
|
if (Workspace::currentWorkspace->readOnly())
|
|
return;
|
|
// Updates the toolbars
|
|
mscore->setNoteInputMenuEntries(*(new_toolbars->at(0)));
|
|
mscore->setFileOperationEntries(*(new_toolbars->at(1)));
|
|
mscore->setPlaybackControlEntries(*(new_toolbars->at(2)));
|
|
mscore->populateNoteInputMenu();
|
|
mscore->populateFileOperations();
|
|
mscore->populatePlaybackControls();
|
|
Workspace::currentWorkspace->setDirty(true);
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// populateLists
|
|
//---------------------------------------------------------
|
|
|
|
void ToolbarEditor::populateLists(const std::list<const char*>& all, std::list<const char*>* current)
|
|
{
|
|
actionList->clear();
|
|
availableList->clear();
|
|
for (auto i : *current) {
|
|
QAction* a = getAction(i);
|
|
QListWidgetItem* item;
|
|
QString actionName = QString(i);
|
|
if (a)
|
|
item = new QListWidgetItem(a->icon(), actionName);
|
|
else if (actionName.isEmpty())
|
|
item = new QListWidgetItem(tr("spacer"));
|
|
else
|
|
item = new QListWidgetItem(actionName);
|
|
item->setData(Qt::UserRole, QVariant::fromValue((void*)i));
|
|
actionList->addItem(item);
|
|
}
|
|
for (auto i : all) {
|
|
bool found = false;
|
|
for (auto k : *current) {
|
|
if (strcmp(k, i) == 0) {
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!found) {
|
|
QAction* a = getAction(i);
|
|
QListWidgetItem* item = 0;
|
|
QString actionName = QString(i);
|
|
if (a)
|
|
item = new QListWidgetItem(a->icon(), actionName);
|
|
else if (!actionName.isEmpty())
|
|
item = new QListWidgetItem(QString(i));
|
|
if (item) {
|
|
item->setData(Qt::UserRole, QVariant::fromValue((void*)i));
|
|
availableList->addItem(item);
|
|
}
|
|
}
|
|
}
|
|
QListWidgetItem* item = new QListWidgetItem(tr("spacer"));
|
|
item->setData(Qt::UserRole, QVariant::fromValue((void*)""));
|
|
availableList->addItem(item);
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// isSpacer
|
|
//---------------------------------------------------------
|
|
|
|
bool ToolbarEditor::isSpacer(QListWidgetItem* item) const
|
|
{
|
|
return !*(const char*)(item->data(Qt::UserRole).value<void*>());
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// addAction
|
|
//---------------------------------------------------------
|
|
|
|
void ToolbarEditor::addAction()
|
|
{
|
|
int cr = availableList->currentRow();
|
|
if (cr == -1)
|
|
return;
|
|
QListWidgetItem* item = availableList->item(cr);
|
|
|
|
if (isSpacer(item)) {
|
|
QListWidgetItem* nitem = new QListWidgetItem(item->text());
|
|
nitem->setData(Qt::UserRole, QVariant::fromValue((void*)""));
|
|
item = nitem;
|
|
}
|
|
else
|
|
item = availableList->takeItem(cr);
|
|
cr = actionList->currentRow();
|
|
if (cr == -1)
|
|
actionList->addItem(item);
|
|
else
|
|
actionList->insertItem(cr, item);
|
|
updateNewToolbar(toolbarList->currentRow());
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// removeAction
|
|
//---------------------------------------------------------
|
|
|
|
void ToolbarEditor::removeAction()
|
|
{
|
|
int cr = actionList->currentRow();
|
|
if (cr == -1)
|
|
return;
|
|
QListWidgetItem* item = actionList->takeItem(cr);
|
|
if (!isSpacer(item))
|
|
availableList->addItem(item);
|
|
updateNewToolbar(toolbarList->currentRow());
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// upAction
|
|
//---------------------------------------------------------
|
|
|
|
void ToolbarEditor::upAction()
|
|
{
|
|
int cr = actionList->currentRow();
|
|
if (cr <= 0)
|
|
return;
|
|
QListWidgetItem* item = actionList->takeItem(cr);
|
|
actionList->insertItem(cr - 1, item);
|
|
actionList->setCurrentRow(cr - 1);
|
|
updateNewToolbar(toolbarList->currentRow());
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// downAction
|
|
//---------------------------------------------------------
|
|
|
|
void ToolbarEditor::downAction()
|
|
{
|
|
int cr = actionList->currentRow();
|
|
if (cr == -1 || cr == actionList->count()-1)
|
|
return;
|
|
QListWidgetItem* item = actionList->takeItem(cr);
|
|
actionList->insertItem(cr + 1, item);
|
|
actionList->setCurrentRow(cr + 1);
|
|
updateNewToolbar(toolbarList->currentRow());
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// toolbarChanged
|
|
//---------------------------------------------------------
|
|
|
|
void ToolbarEditor::toolbarChanged(int tb)
|
|
{
|
|
switch (tb) {
|
|
case 0: // NoteInput
|
|
populateLists(MuseScore::allNoteInputMenuEntries(), new_toolbars->at(tb));
|
|
break;
|
|
case 1: //FileOperations
|
|
populateLists(MuseScore::allFileOperationEntries(), new_toolbars->at(tb));
|
|
break;
|
|
case 2: //PlaybackControls
|
|
populateLists(MuseScore::allPlaybackControlEntries(), new_toolbars->at(tb));
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// hideEvent
|
|
//---------------------------------------------------------
|
|
|
|
void ToolbarEditor::hideEvent(QHideEvent* event)
|
|
{
|
|
MuseScore::saveGeometry(this);
|
|
QWidget::hideEvent(event);
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// updateNewToolbar
|
|
//---------------------------------------------------------
|
|
|
|
void ToolbarEditor::updateNewToolbar(int toolbar_to_update) {
|
|
// Updates the current toolbar to the actionList
|
|
std::list<const char*> *toolbar_action_list = new std::list<const char*>();
|
|
for (int i = 0; i < actionList->count(); ++i) {
|
|
QListWidgetItem* a = actionList->item(i);
|
|
toolbar_action_list->push_back((const char*)(a->data(Qt::UserRole).value<void*>()));
|
|
}
|
|
new_toolbars->at(toolbar_to_update) = toolbar_action_list;
|
|
}
|
|
|
|
} // namespace Ms
|
|
|