docthemes: Save themes def. to a file when added to ColorSets
Color themes will be written to the user folder. Change-Id: I58e650550044bd35a5054a303ce41789d3d51d32 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180542 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
This commit is contained in:
committed by
Tomaž Vajngerl
parent
1412f02354
commit
89c27a63a7
@@ -19,6 +19,8 @@ class SVXCORE_DLLPUBLIC ColorSets
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
std::vector<model::ColorSet> maColorSets;
|
std::vector<model::ColorSet> maColorSets;
|
||||||
|
OUString maUserFolder;
|
||||||
|
|
||||||
ColorSets();
|
ColorSets();
|
||||||
void init();
|
void init();
|
||||||
public:
|
public:
|
||||||
@@ -38,6 +40,8 @@ public:
|
|||||||
model::ColorSet const* getColorSet(std::u16string_view rName) const;
|
model::ColorSet const* getColorSet(std::u16string_view rName) const;
|
||||||
|
|
||||||
void insert(model::ColorSet const& rColorSet, IdenticalNameAction eAction);
|
void insert(model::ColorSet const& rColorSet, IdenticalNameAction eAction);
|
||||||
|
void writeToUserFolder(model::ColorSet const& rNewColorSet);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end of namespace svx
|
} // end of namespace svx
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
#include <rtl/ustring.hxx>
|
#include <rtl/ustring.hxx>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <deque>
|
||||||
#include <osl/file.hxx>
|
#include <osl/file.hxx>
|
||||||
|
|
||||||
namespace vcl
|
namespace vcl
|
||||||
@@ -20,6 +21,7 @@ namespace vcl
|
|||||||
namespace file
|
namespace file
|
||||||
{
|
{
|
||||||
VCL_DLLPUBLIC bool readFileStatus(osl::FileStatus& rStatus, const OUString& rFile);
|
VCL_DLLPUBLIC bool readFileStatus(osl::FileStatus& rStatus, const OUString& rFile);
|
||||||
|
VCL_DLLPUBLIC void splitPathString(std::u16string_view aPathString, std::deque<OUString>& rPaths);
|
||||||
}
|
}
|
||||||
|
|
||||||
class VCL_DLLPUBLIC UserResourceScanner
|
class VCL_DLLPUBLIC UserResourceScanner
|
||||||
|
@@ -15,12 +15,14 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <docmodel/theme/ColorSet.hxx>
|
#include <docmodel/theme/ColorSet.hxx>
|
||||||
|
#include <docmodel/theme/ThemeColorType.hxx>
|
||||||
#include <o3tl/numeric.hxx>
|
#include <o3tl/numeric.hxx>
|
||||||
#include <tools/stream.hxx>
|
#include <tools/stream.hxx>
|
||||||
#include <tools/XmlWalker.hxx>
|
#include <tools/XmlWalker.hxx>
|
||||||
|
#include <tools/XmlWriter.hxx>
|
||||||
#include <vcl/UserResourceScanner.hxx>
|
#include <vcl/UserResourceScanner.hxx>
|
||||||
#include <unotools/pathoptions.hxx>
|
#include <unotools/pathoptions.hxx>
|
||||||
#include <docmodel/theme/ThemeColorType.hxx>
|
#include <o3tl/enumrange.hxx>
|
||||||
#include <frozen/bits/defines.h>
|
#include <frozen/bits/defines.h>
|
||||||
#include <frozen/bits/elsa_std.h>
|
#include <frozen/bits/elsa_std.h>
|
||||||
#include <frozen/unordered_map.h>
|
#include <frozen/unordered_map.h>
|
||||||
@@ -150,8 +152,15 @@ ColorSets& ColorSets::get()
|
|||||||
void ColorSets::init()
|
void ColorSets::init()
|
||||||
{
|
{
|
||||||
SvtPathOptions aPathOptions;
|
SvtPathOptions aPathOptions;
|
||||||
|
OUString aURLString = aPathOptions.GetDocumentThemePath();
|
||||||
|
|
||||||
DocumentThemeScanner aScanner(maColorSets);
|
DocumentThemeScanner aScanner(maColorSets);
|
||||||
aScanner.addPaths(aPathOptions.GetDocumentThemePath());
|
aScanner.addPaths(aURLString);
|
||||||
|
|
||||||
|
std::deque<OUString> aURLs;
|
||||||
|
vcl::file::splitPathString(aURLString, aURLs);
|
||||||
|
if (aURLs.size() > 0)
|
||||||
|
maUserFolder = aURLs[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
model::ColorSet const* ColorSets::getColorSet(std::u16string_view rName) const
|
model::ColorSet const* ColorSets::getColorSet(std::u16string_view rName) const
|
||||||
@@ -200,6 +209,7 @@ void ColorSets::insert(model::ColorSet const& rNewColorSet, IdenticalNameAction
|
|||||||
}
|
}
|
||||||
// color set not found, so insert it
|
// color set not found, so insert it
|
||||||
maColorSets.push_back(rNewColorSet);
|
maColorSets.push_back(rNewColorSet);
|
||||||
|
writeToUserFolder(rNewColorSet);
|
||||||
}
|
}
|
||||||
else if (eAction == IdenticalNameAction::AutoRename)
|
else if (eAction == IdenticalNameAction::AutoRename)
|
||||||
{
|
{
|
||||||
@@ -211,10 +221,58 @@ void ColorSets::insert(model::ColorSet const& rNewColorSet, IdenticalNameAction
|
|||||||
|
|
||||||
model::ColorSet aNewColorSet = rNewColorSet;
|
model::ColorSet aNewColorSet = rNewColorSet;
|
||||||
aNewColorSet.setName(aName);
|
aNewColorSet.setName(aName);
|
||||||
|
|
||||||
maColorSets.push_back(aNewColorSet);
|
maColorSets.push_back(aNewColorSet);
|
||||||
|
writeToUserFolder(aNewColorSet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ColorSets::writeToUserFolder(model::ColorSet const& rNewColorSet)
|
||||||
|
{
|
||||||
|
static constexpr auto constThemeColorTypeToName = frozen::make_unordered_map<model::ThemeColorType, std::string_view>({
|
||||||
|
{ model::ThemeColorType::Dark1, "dark1" },
|
||||||
|
{ model::ThemeColorType::Light1, "light1" },
|
||||||
|
{ model::ThemeColorType::Dark2, "dark2" },
|
||||||
|
{ model::ThemeColorType::Light2, "light2" },
|
||||||
|
{ model::ThemeColorType::Accent1, "accent1" },
|
||||||
|
{ model::ThemeColorType::Accent2, "accent2" },
|
||||||
|
{ model::ThemeColorType::Accent3, "accent3" },
|
||||||
|
{ model::ThemeColorType::Accent4, "accent4" },
|
||||||
|
{ model::ThemeColorType::Accent5, "accent5" },
|
||||||
|
{ model::ThemeColorType::Accent6, "accent6" },
|
||||||
|
{ model::ThemeColorType::Hyperlink, "hyperlink" },
|
||||||
|
{ model::ThemeColorType::FollowedHyperlink, "followed-hyperlink" }
|
||||||
|
});
|
||||||
|
|
||||||
|
SvFileStream aFileStream(maUserFolder + "/" + rNewColorSet.getName() + ".theme", StreamMode::WRITE | StreamMode::TRUNC);
|
||||||
|
|
||||||
|
tools::XmlWriter aWriter(&aFileStream);
|
||||||
|
aWriter.startDocument();
|
||||||
|
aWriter.startElement("theme");
|
||||||
|
aWriter.attribute("name", rNewColorSet.getName());
|
||||||
|
|
||||||
|
aWriter.startElement("theme-colors");
|
||||||
|
aWriter.attribute("name", rNewColorSet.getName());
|
||||||
|
|
||||||
|
for (auto eThemeColorType : o3tl::enumrange<model::ThemeColorType>())
|
||||||
|
{
|
||||||
|
auto iterator = constThemeColorTypeToName.find(eThemeColorType);
|
||||||
|
if (iterator != constThemeColorTypeToName.end())
|
||||||
|
{
|
||||||
|
Color aColor = rNewColorSet.getColor(eThemeColorType);
|
||||||
|
aWriter.startElement("color");
|
||||||
|
aWriter.attribute("name", OString(iterator->second));
|
||||||
|
aWriter.attribute("color", "#"_ostr + aColor.AsRGBHexString().toUtf8());
|
||||||
|
aWriter.endElement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
aWriter.endElement();
|
||||||
|
|
||||||
|
aWriter.endElement();
|
||||||
|
aWriter.endDocument();
|
||||||
|
}
|
||||||
|
|
||||||
} // end of namespace svx
|
} // end of namespace svx
|
||||||
|
|
||||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||||
|
@@ -37,15 +37,6 @@ OUString convertToAbsolutePath(const OUString& path)
|
|||||||
}
|
}
|
||||||
return resolver.m_aStatus.getFileURL();
|
return resolver.m_aStatus.getFileURL();
|
||||||
}
|
}
|
||||||
|
|
||||||
void splitPathString(std::u16string_view aPathString, std::deque<OUString>& rPaths)
|
|
||||||
{
|
|
||||||
sal_Int32 nIndex = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
rPaths.push_front(OUString(o3tl::getToken(aPathString, 0, ';', nIndex)));
|
|
||||||
} while (nIndex >= 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace file
|
namespace file
|
||||||
@@ -68,6 +59,15 @@ bool readFileStatus(osl::FileStatus& status, const OUString& file)
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void splitPathString(std::u16string_view aPathString, std::deque<OUString>& rPaths)
|
||||||
|
{
|
||||||
|
sal_Int32 nIndex = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
rPaths.push_front(OUString(o3tl::getToken(aPathString, 0, ';', nIndex)));
|
||||||
|
} while (nIndex >= 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UserResourceScanner::UserResourceScanner() = default;
|
UserResourceScanner::UserResourceScanner() = default;
|
||||||
@@ -75,7 +75,7 @@ UserResourceScanner::UserResourceScanner() = default;
|
|||||||
void UserResourceScanner::addPaths(std::u16string_view aPathString)
|
void UserResourceScanner::addPaths(std::u16string_view aPathString)
|
||||||
{
|
{
|
||||||
std::deque<OUString> aPaths;
|
std::deque<OUString> aPaths;
|
||||||
splitPathString(aPathString, aPaths);
|
vcl::file::splitPathString(aPathString, aPaths);
|
||||||
|
|
||||||
for (const auto& path : aPaths)
|
for (const auto& path : aPaths)
|
||||||
{
|
{
|
||||||
@@ -86,8 +86,8 @@ void UserResourceScanner::addPaths(std::u16string_view aPathString)
|
|||||||
|
|
||||||
if (!aFileStatus.isDirectory())
|
if (!aFileStatus.isDirectory())
|
||||||
{
|
{
|
||||||
SAL_INFO("vcl.app",
|
SAL_INFO("vcl.app", "Cannot search for resaource files in '"
|
||||||
"Cannot search for icon themes in '" << path << "'. It is not a directory.");
|
<< path << "'. It is not a directory.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ void UserResourceScanner::addPaths(std::u16string_view aPathString)
|
|||||||
if (aResourcePaths.empty())
|
if (aResourcePaths.empty())
|
||||||
{
|
{
|
||||||
SAL_WARN("vcl.app",
|
SAL_WARN("vcl.app",
|
||||||
"Could not find any icon themes in the provided directory ('" << path << "'.");
|
"Could not find any file in the provided directory ('" << path << "'.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user