2626#include " palettecreator.h"
2727#include " ../palettetypes.h"
2828
29+ #include " engraving/dom/masterscore.h"
2930#include " engraving/rw/xmlreader.h"
3031#include " engraving/rw/xmlwriter.h"
3132
@@ -39,7 +40,7 @@ using namespace muse::workspace;
3940
4041static const AsciiStringView PALETTE_XML_TAG (" PaletteBox" );
4142
42- static PaletteTreePtr readPalette (const ByteArray& data, const muse::modularity::ContextPtr& iocCtx)
43+ PaletteTreePtr PaletteWorkspaceSetup:: readPalette (const ByteArray& data, const muse::modularity::ContextPtr& iocCtx)
4344{
4445 ByteArray ba = ByteArray::fromRawData (data.constData (), data.size ());
4546 Buffer buf (&ba);
@@ -50,6 +51,17 @@ static PaletteTreePtr readPalette(const ByteArray& data, const muse::modularity:
5051 reader.readNextStartElement ();
5152
5253 if (reader.name () == PALETTE_XML_TAG) {
54+ int mscVersion = 0 ;
55+ if (reader.hasAttribute (" version" )) {
56+ const String version = reader.attribute (" version" );
57+ const StringList sl = version.split (u' .' );
58+ mscVersion = sl.size () == 2 ? sl[0 ].toInt () * 100 + sl[1 ].toInt () : 0 ;
59+ } else {
60+ // Versioning workspace palette files started in 4.7. All unversioned files should be treated like 4.6 files
61+ mscVersion = 460 ;
62+ }
63+ engraving::gpaletteScore->setMscVersion (mscVersion);
64+
5365 PaletteTreePtr tree = std::make_shared<PaletteTree>();
5466 tree->read (reader, false , iocCtx);
5567 return tree;
@@ -59,7 +71,7 @@ static PaletteTreePtr readPalette(const ByteArray& data, const muse::modularity:
5971 return nullptr ;
6072}
6173
62- static void writePalette (const PaletteTreePtr& tree, QByteArray& data)
74+ void PaletteWorkspaceSetup:: writePalette (const PaletteTreePtr& tree, QByteArray& data)
6375{
6476 Buffer buf;
6577 buf.open (IODevice::WriteOnly);
@@ -77,16 +89,18 @@ void PaletteWorkspaceSetup::setup()
7789
7890 paletteProvider ()->setDefaultPaletteTree (PaletteCreator (iocContext ()).newDefaultPaletteTree ());
7991
80- paletteProvider ()-> userPaletteTreeChanged (). onNotify ( this , [this ]() {
92+ auto saveData = [this ]() {
8193 PaletteTreePtr tree = paletteProvider ()->userPaletteTree ();
8294
8395 QByteArray newData;
8496 writePalette (tree, newData);
8597
8698 workspacesDataProvider ()->setRawData (WS_Palettes, newData);
87- });
99+ };
100+
101+ paletteProvider ()->userPaletteTreeChanged ().onNotify (this , saveData);
88102
89- auto loadData = [this ]() {
103+ auto loadData = [this , saveData ]() {
90104 RetVal<QByteArray> data = workspacesDataProvider ()->rawData (WS_Palettes);
91105 PaletteTreePtr tree;
92106 if (data.ret && !data.val .isEmpty ()) {
@@ -98,6 +112,12 @@ void PaletteWorkspaceSetup::setup()
98112 tree = PaletteCreator (iocContext ()).newDefaultPaletteTree ();
99113 }
100114 paletteProvider ()->setUserPaletteTree (tree);
115+
116+ if (engraving::gpaletteScore->mscVersion () < engraving::Constants::MSC_VERSION) {
117+ LOGD () << " Workspace file found with palette file version " << engraving::gpaletteScore->mscVersion () <<
118+ " . Migrating palette file to " << engraving::Constants::MSC_VERSION;
119+ saveData ();
120+ }
101121 };
102122
103123 workspacesDataProvider ()->workspaceChanged ().onNotify (this , loadData);
0 commit comments