299 lines
10 KiB
C++
299 lines
10 KiB
C++
|
//=============================================================================
|
||
|
// MuseScore
|
||
|
// Music Composition & Notation
|
||
|
// $Id: palette.cpp 5576 2012-04-24 19:15:22Z wschweer $
|
||
|
//
|
||
|
// Copyright (C) 2011 Werner Schweer and others
|
||
|
//
|
||
|
// This program is free software; you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU General Public License version 2
|
||
|
// as published by the Free Software Foundation and appearing in
|
||
|
// the file LICENSE.GPL
|
||
|
//=============================================================================
|
||
|
|
||
|
#include "palette.h"
|
||
|
#include "musescore.h"
|
||
|
#include "preferences.h"
|
||
|
#include "libmscore/xml.h"
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// PaletteBox
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
PaletteBox::PaletteBox(QWidget* parent)
|
||
|
: QDockWidget(tr("Palettes"), parent)
|
||
|
{
|
||
|
setObjectName("palette-box");
|
||
|
setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
|
||
|
|
||
|
QScrollArea* sa = new QScrollArea;
|
||
|
sa->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
|
||
|
sa->setContextMenuPolicy(Qt::CustomContextMenu);
|
||
|
sa->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||
|
sa->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
|
||
|
sa->setWidgetResizable(true);
|
||
|
setWidget(sa);
|
||
|
|
||
|
QWidget* paletteList = new QWidget;
|
||
|
sa->setWidget(paletteList);
|
||
|
vbox = new QVBoxLayout;
|
||
|
paletteList->setLayout(vbox);
|
||
|
_dirty = false;
|
||
|
vbox->setMargin(0);
|
||
|
vbox->setSpacing(1);
|
||
|
vbox->addStretch();
|
||
|
paletteList->show();
|
||
|
|
||
|
// connect(sa, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(contextMenu(const QPoint&)));
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
//---------------------------------------------------------
|
||
|
// contextMenu
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
void PaletteBox::contextMenu(const QPoint& pt)
|
||
|
{
|
||
|
QMenu menu(this);
|
||
|
menu.setSeparatorsCollapsible(false);
|
||
|
QAction* titel = menu.addSeparator();
|
||
|
titel->setText(tr("Palette Operations"));
|
||
|
|
||
|
QAction* b = menu.addAction(tr("Single Palette Mode"));
|
||
|
b->setCheckable(true);
|
||
|
b->setChecked(preferences.singlePalette);
|
||
|
|
||
|
QAction* a = menu.addAction(tr("Reset to factory defaults"));
|
||
|
QAction* ra = menu.exec(mapToGlobal(pt));
|
||
|
if (a == ra) {
|
||
|
clear();
|
||
|
mscore->populatePalette(); // hack
|
||
|
_dirty = true; // save profile
|
||
|
}
|
||
|
else if (b == ra) {
|
||
|
preferences.singlePalette = b->isChecked();
|
||
|
preferences.dirty = true;
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// clear
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
void PaletteBox::clear()
|
||
|
{
|
||
|
int n = vbox->count() - 1; // do not delete stretch item
|
||
|
while (n--) {
|
||
|
QLayoutItem* item = vbox->takeAt(0);
|
||
|
if (item->widget())
|
||
|
item->widget()->hide();
|
||
|
delete item;
|
||
|
}
|
||
|
vbox->invalidate();
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// addPalette
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
void PaletteBox::addPalette(Palette* w)
|
||
|
{
|
||
|
PaletteBoxButton* b = new PaletteBoxButton(w);
|
||
|
|
||
|
int slotIdx = vbox->count() - 1; // insert before stretch
|
||
|
b->setId(slotIdx);
|
||
|
|
||
|
vbox->insertWidget(slotIdx, b);
|
||
|
vbox->insertWidget(slotIdx+1, w, 1000);
|
||
|
|
||
|
connect(b, SIGNAL(paletteCmd(int,int)), SLOT(paletteCmd(int,int)));
|
||
|
connect(b, SIGNAL(closeAll()), SLOT(closeAll()));
|
||
|
connect(w, SIGNAL(changed()), SLOT(setDirty()));
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// newPalette
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
Palette* PaletteBox::newPalette(const QString& name, int slot)
|
||
|
{
|
||
|
Palette* p = new Palette;
|
||
|
p->setReadOnly(false);
|
||
|
p->setName(name);
|
||
|
PaletteBoxButton* b = new PaletteBoxButton(p);
|
||
|
vbox->insertWidget(slot, b);
|
||
|
vbox->insertWidget(slot+1, p, 1000);
|
||
|
connect(b, SIGNAL(paletteCmd(int,int)), SLOT(paletteCmd(int,int)));
|
||
|
connect(p, SIGNAL(changed()), SLOT(setDirty()));
|
||
|
for (int i = 0; i < (vbox->count() - 1) / 2; ++i)
|
||
|
static_cast<PaletteBoxButton*>(vbox->itemAt(i * 2)->widget())->setId(i*2);
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// paletteCmd
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
void PaletteBox::paletteCmd(int cmd, int slot)
|
||
|
{
|
||
|
QLayoutItem* item = vbox->itemAt(slot);
|
||
|
PaletteBoxButton* b = static_cast<PaletteBoxButton*>(item->widget());
|
||
|
Palette* palette = static_cast<Palette*>(vbox->itemAt(slot+1)->widget());
|
||
|
|
||
|
switch(cmd) {
|
||
|
case PALETTE_DELETE:
|
||
|
{
|
||
|
vbox->removeItem(item);
|
||
|
b->deleteLater(); // this is the button widget
|
||
|
delete item;
|
||
|
item = vbox->itemAt(slot);
|
||
|
vbox->removeItem(item);
|
||
|
delete item->widget();
|
||
|
delete item;
|
||
|
for (int i = 0; i < (vbox->count() - 1) / 2; ++i)
|
||
|
static_cast<PaletteBoxButton*>(vbox->itemAt(i * 2)->widget())->setId(i*2);
|
||
|
}
|
||
|
break;
|
||
|
case PALETTE_SAVE:
|
||
|
{
|
||
|
QString path = mscore->getPaletteFilename(false);
|
||
|
if (!path.isEmpty())
|
||
|
palette->write(path);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PALETTE_LOAD:
|
||
|
{
|
||
|
QString path = mscore->getPaletteFilename(true);
|
||
|
if (!path.isEmpty()) {
|
||
|
QFileInfo fi(path);
|
||
|
Palette* palette = newPalette(fi.baseName(), slot);
|
||
|
palette->read(path);
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PALETTE_NEW:
|
||
|
newPalette(tr("new Palette"), slot);
|
||
|
// fall through
|
||
|
|
||
|
case PALETTE_EDIT:
|
||
|
{
|
||
|
PaletteProperties pp(palette, 0);
|
||
|
int rv = pp.exec();
|
||
|
if (rv == 1) {
|
||
|
_dirty = true;
|
||
|
b->setText(palette->name());
|
||
|
palette->update();
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case PALETTE_UP:
|
||
|
if (slot) {
|
||
|
QLayoutItem* i1 = vbox->itemAt(slot);
|
||
|
QLayoutItem* i2 = vbox->itemAt(slot+1);
|
||
|
vbox->removeItem(i1);
|
||
|
vbox->removeItem(i2);
|
||
|
vbox->insertWidget(slot-2, i2->widget());
|
||
|
vbox->insertWidget(slot-2, i1->widget());
|
||
|
delete i1;
|
||
|
delete i2;
|
||
|
for (int i = 0; i < (vbox->count() - 1) / 2; ++i)
|
||
|
static_cast<PaletteBoxButton*>(vbox->itemAt(i * 2)->widget())->setId(i*2);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PALETTE_DOWN:
|
||
|
if (slot < (vbox->count() - 3)) {
|
||
|
QLayoutItem* i1 = vbox->itemAt(slot);
|
||
|
QLayoutItem* i2 = vbox->itemAt(slot+1);
|
||
|
vbox->removeItem(i1);
|
||
|
vbox->removeItem(i2);
|
||
|
vbox->insertWidget(slot+2, i2->widget());
|
||
|
vbox->insertWidget(slot+2, i1->widget());
|
||
|
delete i1;
|
||
|
delete i2;
|
||
|
for (int i = 0; i < (vbox->count() - 1) / 2; ++i)
|
||
|
static_cast<PaletteBoxButton*>(vbox->itemAt(i * 2)->widget())->setId(i*2);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
_dirty = true;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// closeEvent
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
void PaletteBox::closeEvent(QCloseEvent* ev)
|
||
|
{
|
||
|
emit paletteVisible(false);
|
||
|
QWidget::closeEvent(ev);
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// closeAll
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
void PaletteBox::closeAll()
|
||
|
{
|
||
|
for (int i = 0; i < (vbox->count() - 1); i += 2) {
|
||
|
PaletteBoxButton* b = static_cast<PaletteBoxButton*> (vbox->itemAt(i)->widget() );
|
||
|
b->showPalette(false);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// write
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
void PaletteBox::write(Xml& xml)
|
||
|
{
|
||
|
xml.stag("PaletteBox");
|
||
|
for (int i = 0; i < (vbox->count() - 1); i += 2) {
|
||
|
QLayoutItem* item = vbox->itemAt(i);
|
||
|
PaletteBoxButton* b = static_cast<PaletteBoxButton*>(item->widget());
|
||
|
Palette* palette = static_cast<Palette*>(vbox->itemAt(i+1)->widget());
|
||
|
palette->write(xml, b->text());
|
||
|
}
|
||
|
xml.etag();
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// read
|
||
|
// return false on error
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
bool PaletteBox::read(XmlReader& e)
|
||
|
{
|
||
|
while (e.readNextStartElement()) {
|
||
|
const QStringRef& tag(e.name());
|
||
|
if (tag == "Palette") {
|
||
|
Palette* p = new Palette();
|
||
|
QString name = e.attribute("name");
|
||
|
p->setName(name);
|
||
|
p->read(e);
|
||
|
addPalette(p);
|
||
|
p->setMoreElements(true);
|
||
|
connect(p, SIGNAL(displayMore(const QString&)),
|
||
|
SLOT(displayMore(const QString&)));
|
||
|
}
|
||
|
else
|
||
|
e.unknown();
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
// displayMore
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
void PaletteBox::displayMore(const QString& s)
|
||
|
{
|
||
|
mscore->showMasterPalette(s);
|
||
|
}
|
||
|
|