MuseScore/mscore/symboldialog.cpp

150 lines
4.5 KiB
C++

//=============================================================================
// MusE Score
// Linux Music Score Editor
//
// Copyright (C) 2007-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.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//=============================================================================
#include "symboldialog.h"
#include "menus.h"
#include "palette.h"
#include "musescore.h"
#include "libmscore/score.h"
#include "libmscore/sym.h"
#include "libmscore/style.h"
#include "libmscore/element.h"
#include "libmscore/symbol.h"
#include "preferences.h"
namespace Ms {
extern MasterScore* gscore;
//---------------------------------------------------------
// createSymbolPalette
//---------------------------------------------------------
void SymbolDialog::createSymbolPalette()
{
sp = new Palette();
createSymbols();
}
//---------------------------------------------------------
// createSymbols
//---------------------------------------------------------
void SymbolDialog::createSymbols()
{
int currentIndex = fontList->currentIndex();
const ScoreFont* f = &ScoreFont::scoreFonts()[currentIndex];
// init the font if not done yet
ScoreFont::fontFactory(f->name());
sp->clear();
for (auto name : (*smuflRanges())[range]) {
SymId id = Sym::name2id(name);
if (search->text().isEmpty()
|| Sym::id2userName(id).contains(search->text(), Qt::CaseInsensitive)) {
Symbol* s = new Symbol(gscore);
s->setSym(SymId(id), f);
sp->append(s, Sym::id2userName(SymId(id)));
}
}
}
//---------------------------------------------------------
// SymbolDialog
//---------------------------------------------------------
SymbolDialog::SymbolDialog(const QString& s, QWidget* parent)
: QWidget(parent, Qt::WindowFlags(Qt::Dialog | Qt::Window))
{
setupUi(this);
range = s; // smufl symbol range
int idx = 0;
int currentIndex = 0;
for (const ScoreFont& f : ScoreFont::scoreFonts()) {
fontList->addItem(f.name());
if (f.name() == "Bravura")
currentIndex = idx;
++idx;
}
fontList->setCurrentIndex(currentIndex);
QLayout* l = new QVBoxLayout();
frame->setLayout(l);
createSymbolPalette();
QScrollArea* sa = new PaletteScrollArea(sp);
l->addWidget(sa);
sp->setAcceptDrops(false);
sp->setDrawGrid(true);
sp->setSelectable(true);
connect(systemFlag, SIGNAL(stateChanged(int)), SLOT(systemFlagChanged(int)));
connect(fontList, SIGNAL(currentIndexChanged(int)), SLOT(systemFontChanged(int)));
sa->setWidget(sp);
}
//---------------------------------------------------------
// systemFlagChanged
//---------------------------------------------------------
void SymbolDialog::systemFlagChanged(int state)
{
bool sysFlag = state == Qt::Checked;
for (int i = 0; i < sp->size(); ++i) {
Element* e = sp->element(i);
if (e && e->type() == ElementType::SYMBOL)
static_cast<Symbol*>(e)->setSystemFlag(sysFlag);
}
}
//---------------------------------------------------------
// systemFontChanged
//---------------------------------------------------------
void SymbolDialog::systemFontChanged(int)
{
createSymbols();
}
void SymbolDialog::on_search_textChanged(const QString &searchPhrase)
{
Q_UNUSED(searchPhrase);
createSymbols();
}
void SymbolDialog::on_clearSearch_clicked()
{
search->clear();
createSymbols();
}
//---------------------------------------------------------
// changeEvent
//---------------------------------------------------------
void SymbolDialog::changeEvent(QEvent *event)
{
QWidget::changeEvent(event);
if (event->type() == QEvent::LanguageChange)
retranslate();
}
}