MuseScore/src/plugins/api/util.cpp

242 lines
5.6 KiB
C++

/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA 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 3 as
* published by the Free Software Foundation.
*
* 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, see <https://www.gnu.org/licenses/>.
*/
#include <QDateTime>
#include "util.h"
#include "score.h"
#include "libmscore/measurebase.h"
#include "libmscore/page.h"
#include "libmscore/score.h"
#include "libmscore/system.h"
using namespace mu;
namespace mu::plugins::api {
//---------------------------------------------------------
// ScoreView
//---------------------------------------------------------
ScoreView::ScoreView(QQuickItem* parent)
: uicomponents::QuickPaintedView(parent)
{
setAcceptedMouseButtons(Qt::LeftButton);
score = 0;
}
//---------------------------------------------------------
// FileIO
//---------------------------------------------------------
FileIO::FileIO(QObject* parent)
: QObject(parent)
{
}
QString FileIO::read()
{
if (mSource.isEmpty()) {
emit error("source is empty");
return QString();
}
QUrl url(mSource);
QString source(mSource);
if (url.isValid() && url.isLocalFile()) {
source = url.toLocalFile();
}
QFile file(source);
QString fileContent;
if (file.open(QIODevice::ReadOnly)) {
QString line;
QTextStream t(&file);
do {
line = t.readLine();
fileContent += line + "\n";
} while (!line.isNull());
file.close();
} else {
emit error("Unable to open the file");
return QString();
}
return fileContent;
}
bool FileIO::write(const QString& data)
{
if (mSource.isEmpty()) {
return false;
}
QFile file(mSource);
if (!file.open(QFile::WriteOnly | QFile::Truncate)) {
return false;
}
QTextStream out(&file);
out << data;
file.close();
return true;
}
//---------------------------------------------------------
// remove
//---------------------------------------------------------
bool FileIO::remove()
{
if (mSource.isEmpty()) {
return false;
}
QFile file(mSource);
return file.remove();
}
bool FileIO::exists()
{
QFile file(mSource);
return file.exists();
}
int FileIO::modifiedTime()
{
if (mSource.isEmpty()) {
emit error("source is empty");
return 0;
}
QUrl url(mSource);
QString source(mSource);
if (url.isValid() && url.isLocalFile()) {
source = url.toLocalFile();
}
QFileInfo fileInfo(source);
return fileInfo.lastModified().toSecsSinceEpoch();
}
//---------------------------------------------------------
// setScore
//---------------------------------------------------------
void ScoreView::setScore(mu::plugins::api::Score* s)
{
mu::engraving::Score* newScore = s ? s->score() : nullptr;
setScore(newScore);
}
void ScoreView::setScore(mu::engraving::Score* s)
{
MuseScoreView::setScore(s);
_currentPage = 0;
score = s;
if (score) {
score->doLayout();
mu::engraving::Page* page = score->pages()[_currentPage];
RectF pr(page->abbox());
qreal m1 = width() / pr.width();
qreal m2 = height() / pr.height();
mag = qMax(m1, m2);
_boundingRect = QRectF(0.0, 0.0, pr.width() * mag, pr.height() * mag);
setWidth(pr.width() * mag);
setHeight(pr.height() * mag);
}
update();
}
//---------------------------------------------------------
// paint
//---------------------------------------------------------
void ScoreView::paint(QPainter* qp)
{
mu::draw::Painter p(qp, "plugins_scoreview");
p.setAntialiasing(true);
p.fillRect(mu::RectF(0.0, 0.0, width(), height()), _color);
if (!score) {
return;
}
p.scale(mag, mag);
mu::engraving::Page* page = score->pages()[_currentPage];
QList<const mu::engraving::EngravingItem*> el;
for (engraving::System* s : page->systems()) {
for (engraving::MeasureBase* m : s->measures()) {
m->scanElements(&el, mu::engraving::collectElements, false);
}
}
page->scanElements(&el, mu::engraving::collectElements, false);
foreach (const mu::engraving::EngravingItem* e, el) {
PointF pos(e->pagePos());
p.translate(pos);
e->draw(&p);
p.translate(-pos);
}
}
//---------------------------------------------------------
// setCurrentPage
//---------------------------------------------------------
void ScoreView::setCurrentPage(int n)
{
if (score == 0) {
return;
}
if (n < 0) {
n = 0;
}
int nn = static_cast<int>(score->pages().size());
if (nn == 0) {
return;
}
if (n >= nn) {
n = nn - 1;
}
_currentPage = n;
update();
}
//---------------------------------------------------------
// nextPage
//---------------------------------------------------------
void ScoreView::nextPage()
{
setCurrentPage(_currentPage + 1);
}
//---------------------------------------------------------
// prevPage
//---------------------------------------------------------
void ScoreView::prevPage()
{
setCurrentPage(_currentPage - 1);
}
} // namespace mu::plugins::api