diff --git a/libmscore/score.h b/libmscore/score.h index cb933662172d..6de6ee255141 100644 --- a/libmscore/score.h +++ b/libmscore/score.h @@ -1005,6 +1005,8 @@ class Score : public QObject { void setAccessibleInfo(QString s) { accInfo = s.remove(":").remove(";"); } QString accessibleInfo() { return accInfo; } + QImage createThumbnail(); + friend class ChangeSynthesizerState; friend class Chord; }; @@ -1012,8 +1014,6 @@ class Score : public QObject { extern Score* gscore; extern void fixTicks(); -QPixmap extractThumbnail(const QString&); - Q_DECLARE_OPERATORS_FOR_FLAGS(LayoutFlags); } // namespace Ms diff --git a/libmscore/scorefile.cpp b/libmscore/scorefile.cpp index 183986139f5e..c1391beeb70a 100644 --- a/libmscore/scorefile.cpp +++ b/libmscore/scorefile.cpp @@ -464,6 +464,31 @@ void Score::saveCompressedFile(QFileInfo& info, bool onlySelection) fp.close(); } +//--------------------------------------------------------- +// createThumbnail +//--------------------------------------------------------- + +QImage Score::createThumbnail() + { + Page* page = pages().at(0); + QRectF fr = page->abbox(); + qreal mag = 256.0 / qMax(fr.width(), fr.height()); + int w = int(fr.width() * mag); + int h = int(fr.height() * mag); + + QImage pm(w, h, QImage::Format_ARGB32_Premultiplied); + pm.setDotsPerMeterX(lrint((mag * 1000) / INCH)); + pm.setDotsPerMeterY(lrint((mag * 1000) / INCH)); + pm.fill(0xffffffff); + QPainter p(&pm); + p.setRenderHint(QPainter::Antialiasing, true); + p.setRenderHint(QPainter::TextAntialiasing, true); + p.scale(mag, mag); + print(&p, 0); + p.end(); + return pm; + } + //--------------------------------------------------------- // saveCompressedFile // file is already opened @@ -505,23 +530,7 @@ void Score::saveCompressedFile(QIODevice* f, QFileInfo& info, bool onlySelection } // create thumbnail - { - Page* page = pages().at(0); - QRectF fr = page->abbox(); - qreal mag = 256.0 / qMax(fr.width(), fr.height()); - int w = int(fr.width() * mag); - int h = int(fr.height() * mag); - - QImage pm(w, h, QImage::Format_ARGB32_Premultiplied); - pm.setDotsPerMeterX(lrint((mag * 1000) / INCH)); - pm.setDotsPerMeterY(lrint((mag * 1000) / INCH)); - pm.fill(0xffffffff); - QPainter p(&pm); - p.setRenderHint(QPainter::Antialiasing, true); - p.setRenderHint(QPainter::TextAntialiasing, true); - p.scale(mag, mag); - print(&p, 0); - p.end(); + QImage pm = createThumbnail(); QByteArray ba; QBuffer b(&ba); @@ -530,8 +539,6 @@ void Score::saveCompressedFile(QIODevice* f, QFileInfo& info, bool onlySelection if (!pm.save(&b, "PNG")) qDebug("save failed"); uz.addFile("Thumbnails/thumbnail.png", ba); - printf("thumbnail %dx%d size %d mag %f\n", w, h, ba.size(), mag); - } #ifdef OMR // @@ -715,27 +722,6 @@ QString readRootFile(MQZipReader* uz, QList& images) return rootfile; } -//--------------------------------------------------------- -// extractThumbnail -//--------------------------------------------------------- - -QPixmap extractThumbnail(const QString& name) - { - QPixmap pm; // = icons[File_ICON].pixmap(QSize(100,140)); - if (!name.endsWith(".mscz")) - return pm; - MQZipReader uz(name); - if (!uz.exists()) { - qDebug("extractThumbnail: <%s> not found", qPrintable(name)); - return pm; - } - QByteArray ba = uz.fileData("Thumbnails/thumbnail.png"); - if (ba.isEmpty()) - return pm; - pm.loadFromData(ba, "PNG"); - return pm; - } - //--------------------------------------------------------- // loadCompressedMsc // return false on error diff --git a/mscore/file.cpp b/mscore/file.cpp index 403496182ba7..34044c411072 100644 --- a/mscore/file.cpp +++ b/mscore/file.cpp @@ -91,6 +91,7 @@ #include "diff/diff_match_patch.h" #include "libmscore/chordlist.h" #include "libmscore/mscore.h" +#include "thirdparty/qzip/qzipreader_p.h" extern Ms::Score::FileError importOve(Ms::Score*, const QString& name); @@ -2394,5 +2395,42 @@ bool MuseScore::saveSvg(Score* score, const QString& saveName) return true; } +//--------------------------------------------------------- +// createThumbnail +//--------------------------------------------------------- + +static QPixmap createThumbnail(const QString& name) + { + Score* score = new Score; + Score::FileError error = readScore(score, name, true); + if (error != Score::FileError::FILE_NO_ERROR) + return QPixmap(); + score->doLayout(); + QImage pm = score->createThumbnail(); + delete score; + return QPixmap::fromImage(std::move(pm)); + } + +//--------------------------------------------------------- +// extractThumbnail +//--------------------------------------------------------- + +QPixmap MuseScore::extractThumbnail(const QString& name) + { + QPixmap pm; // = icons[File_ICON].pixmap(QSize(100,140)); + if (!name.endsWith(".mscz")) + return createThumbnail(name); + MQZipReader uz(name); + if (!uz.exists()) { + qDebug("extractThumbnail: <%s> not found", qPrintable(name)); + return pm; + } + QByteArray ba = uz.fileData("Thumbnails/thumbnail.png"); + if (ba.isEmpty()) + return createThumbnail(name); + pm.loadFromData(ba, "PNG"); + return pm; + } + } diff --git a/mscore/musescore.cpp b/mscore/musescore.cpp index 4f7ad9a08a5b..b8121826a15e 100644 --- a/mscore/musescore.cpp +++ b/mscore/musescore.cpp @@ -4428,6 +4428,7 @@ QFileInfoList MuseScore::recentScores() const } return fil; } + } using namespace Ms; diff --git a/mscore/musescore.h b/mscore/musescore.h index bf2e8f35057b..dc29a7486784 100644 --- a/mscore/musescore.h +++ b/mscore/musescore.h @@ -667,6 +667,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { QFileInfoList recentScores() const; void saveDialogState(const char* name, QFileDialog* d); void restoreDialogState(const char* name, QFileDialog* d); + QPixmap extractThumbnail(const QString& name); }; extern MuseScore* mscore; diff --git a/mscore/scoreBrowser.cpp b/mscore/scoreBrowser.cpp index 3dcad5eb7764..854d7b26bd08 100644 --- a/mscore/scoreBrowser.cpp +++ b/mscore/scoreBrowser.cpp @@ -64,7 +64,7 @@ void ScoreBrowser::setScores(QFileInfoList s) { scoreList->clear(); for (const QFileInfo& fi : s) { - QPixmap pm = extractThumbnail(fi.filePath()); + QPixmap pm = mscore->extractThumbnail(fi.filePath()); if (pm.isNull()) pm = icons[int(Icons::file_ICON)]->pixmap(QSize(50,60)); ScoreInfo si(fi); diff --git a/mscore/scorePreview.cpp b/mscore/scorePreview.cpp index 04952da8c5e0..a7810520272f 100644 --- a/mscore/scorePreview.cpp +++ b/mscore/scorePreview.cpp @@ -12,6 +12,8 @@ #include "scorePreview.h" #include "libmscore/score.h" +#include "musescore.h" +#include "scoreInfo.h" namespace Ms { @@ -31,19 +33,18 @@ ScorePreview::ScorePreview(QWidget* parent) void ScorePreview::setScore(const QString& s) { - printf("setScore %s\n", qPrintable(s)); - QFileInfo fi(s); - name->setText(fi.baseName()); - creationDate->setText(fi.created().toString()); - fileSize->setText(QString("%1 KiB").arg(fi.size() / 1024)); + ScoreInfo fi(s); + fi.setPixmap(mscore->extractThumbnail(s)); + setScore(fi); + } + +void ScorePreview::setScore(const ScoreInfo& si) + { + creationDate->setText(si.created().toString()); + fileSize->setText(QString("%1 KiB").arg(si.size() / 1024)); creationDate->setEnabled(true); fileSize->setEnabled(true); - if (fi.suffix() == "mscz") { - QPixmap pm = extractThumbnail(s); - icon->setPixmap(pm); - } - else - icon->setPixmap(QPixmap()); + icon->setPixmap(si.pixmap()); } } diff --git a/mscore/scorePreview.h b/mscore/scorePreview.h index c9e057f0b5ca..f1aeef7788a3 100644 --- a/mscore/scorePreview.h +++ b/mscore/scorePreview.h @@ -17,6 +17,8 @@ namespace Ms { +class ScoreInfo; + //--------------------------------------------------------- // ScorePreview //--------------------------------------------------------- @@ -28,6 +30,7 @@ class ScorePreview : public QWidget, public Ui::ScorePreview public slots: void setScore(const QString&); + void setScore(const ScoreInfo&); public: ScorePreview(QWidget* parent = 0); diff --git a/mscore/startcenter.cpp b/mscore/startcenter.cpp index d9d0febc9e4c..6e26d59beb92 100644 --- a/mscore/startcenter.cpp +++ b/mscore/startcenter.cpp @@ -43,7 +43,7 @@ Startcenter::Startcenter() // setWindowFlags(Qt::WindowStaysOnTopHint | Qt::Popup); setWindowFlags(Qt::WindowStaysOnTopHint); setWindowModality(Qt::ApplicationModal); - connect(createNewScore, SIGNAL(clicked()), getAction("file-new"), SLOT(trigger())); + connect(createNewScore, SIGNAL(clicked()), getAction("file-new"), SLOT(trigger())); connect(recentScores, SIGNAL(toggled(bool)), SLOT(recentScoresToggled(bool))); connect(templates, SIGNAL(toggled(bool)), SLOT(templatesToggled(bool))); connect(demos, SIGNAL(toggled(bool)), SLOT(demosToggled(bool))); diff --git a/mscore/startcenter.ui b/mscore/startcenter.ui index fe0ce8133b08..0c4a28b7e0de 100644 --- a/mscore/startcenter.ui +++ b/mscore/startcenter.ui @@ -17,7 +17,7 @@ - Dialog + Startcenter