diff --git a/src/public/streammultiversion.cpp b/src/public/streammultiversion.cpp index dbf1750..24feccb 100644 --- a/src/public/streammultiversion.cpp +++ b/src/public/streammultiversion.cpp @@ -22,4 +22,16 @@ char StreamMultiversion::readVersion(QDataStream &stream) { return version; } + +char StreamMultiversion::versionHeader(char, QDataStream &stream) { + return readVersion(stream); +} + +char StreamMultiversion::versionHeader(char version, QDataStream &stream) const { + saveVersion(version, stream); + return version; + +} + + } diff --git a/src/public/streammultiversion.h b/src/public/streammultiversion.h index 0030335..9fc1616 100644 --- a/src/public/streammultiversion.h +++ b/src/public/streammultiversion.h @@ -23,15 +23,20 @@ namespace QH { * class myClass: public StreamMultiversion { * protected: * QDataStream &fromStream(QDataStream &stream) override { - * char version = readVersion(); + * char version = versionHeader(0, stream); + * readWrite(stream, data); * return stream; * } * * QDataStream &toStream(QDataStream &stream) const override { - * saveVersion(1, stream); + * char version = versionHeader(0, stream); + * readWrite(stream, data); * return stream; * } * + * private: + * int data; + * * } * */ @@ -43,6 +48,8 @@ class HEARTSHARED_EXPORT StreamMultiversion: public StreamBase ~StreamMultiversion(); // StreamBase interface +protected: + /** * @brief saveVersion save version of the object to the stream. * @param version - version of the object. @@ -62,6 +69,42 @@ class HEARTSHARED_EXPORT StreamMultiversion: public StreamBase */ char readVersion(QDataStream &stream); + /** + * @brief versionHeader this is new function that automaticaly choose what shuld be to-do (read/wirte). + * @param version this is a version of object. + * @param stream this is stream cheenel to save or read. + * @return version of object. + */ + char versionHeader(char version, QDataStream &stream); + + /** + * @brief versionHeader this is new function that automaticaly choose what shuld be to-do (read/wirte). + * @param version this is a version of object. + * @param stream this is stream cheenel to save or read. + * @return version of object. + */ + char versionHeader(char version, QDataStream &stream) const; + + /** + * @brief readWrite this method automaticaly choose what we need to-do read or write. + * @param stream + * @param data + */ + template + void readWrite(QDataStream &stream, const T& data) const { + stream << data; + } + + /** + * @brief readWrite this method automaticaly choose what we need to-do read or write. + * @param stream + * @param data + */ + template + void readWrite(QDataStream &stream, T& data) { + stream >> data; + + } }; } diff --git a/src/public/translatablestring.cpp b/src/public/translatablestring.cpp new file mode 100644 index 0000000..d561377 --- /dev/null +++ b/src/public/translatablestring.cpp @@ -0,0 +1,79 @@ +//# +//# Copyright (C) 2025-2025 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + +#include "translatablestring.h" +#include "crc32constexper.h" +namespace QH { + +TranslatableString::TranslatableString(const QString& data, bool isKey) { + _data = data; + _isKey = isKey; +} + +bool TranslatableString::operator==(const TranslatableString &other) const { + return _data == other._data && _isKey == other._isKey && _args == other._args; +} + +bool TranslatableString::isValid() const { + return true; +} + +bool TranslatableString::isEmpty() const { + return _data.isEmpty(); +} + +QString TranslatableString::text() const { + if (_isKey) { + QString result = QObject::tr(_data.toLatin1()); + for (const auto& arg: _args) { + result = result.arg(arg.text()); + } + + return result; + } + + return _data; +} + +const QString &TranslatableString::rawText() const { + return _data; +} + +int TranslatableString::calcCrc32Hash() const { + return QuasarAppUtils::calculateCrc32(_data.toLatin1(), _data.size()); +} + +TranslatableString TranslatableString::tr(const QString &source) { + return {source, true}; +} + +QDataStream &TranslatableString::fromStream(QDataStream &stream) { + versionHeader(0, stream); + + readWrite(stream, _isKey); + readWrite(stream, _data); + readWrite(stream, _args); + + return stream; +} + +QDataStream &TranslatableString::toStream(QDataStream &stream) const { + versionHeader(0, stream); + + readWrite(stream, _isKey); + readWrite(stream, _data); + readWrite(stream, _args); + + return stream; +} + +TranslatableString &TranslatableString::setArgs(const QList &newArgs) { + _args = newArgs; + + return *this; +} +} diff --git a/src/public/translatablestring.h b/src/public/translatablestring.h new file mode 100644 index 0000000..48d156f --- /dev/null +++ b/src/public/translatablestring.h @@ -0,0 +1,92 @@ +//# +//# Copyright (C) 2025-2025 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + + + +#ifndef TRANSLATABLESTRING_H +#define TRANSLATABLESTRING_H +#include + + +namespace QH { + +/** + * @brief The TranslatableString class is a wrapper for The QString with boolean flag isKey. + * @note ise this class if you want to save text into file and want to get correct translations after reading. + */ +class HEARTSHARED_EXPORT TranslatableString: public StreamMultiversion +{ +public: + TranslatableString(const QString& data = "", + bool isKey = false); + + TranslatableString(const TranslatableString &) = default; + TranslatableString(TranslatableString &&) = default; + TranslatableString &operator=(const TranslatableString &) = default; + TranslatableString &operator=(TranslatableString &&) = default; + + bool operator==(const TranslatableString& other) const; + + // ValidableObject interface + bool isValid() const override; + + bool isEmpty() const; + + /** + * @brief text this method return translated text. + * @return + */ + QString text() const; + + /** + * @brief rawText return raw key source. + * @return source text (key if object created with the qtTrId method) + */ + const QString& rawText() const; + + /** + * @brief calcCrc32Hash this method calc hash from raw text. + * @return + */ + int calcCrc32Hash() const; + + /** + * @brief tr this method create a string translation wrapper and save translation key for lupdate tool + * @param source this is text source. + * @return + */ + static TranslatableString tr(const QString& source); + + /** + * @brief qtTrId this method create a string translation wrapper and save translation key for lupdate tool + * @param source this is a source text. + * @return translatable string. + * @see https://doc.qt.io/qt-6/qttranslation.html#qtTrId + */ + static TranslatableString qtTrId(const QString& source); + + /** + * @brief setArgs this method set args for translation. + * @param newArgs this is a list of args. + * @return this object. + */ + TranslatableString& setArgs(const QList &newArgs); + +protected: + QDataStream &fromStream(QDataStream &stream) override; + QDataStream &toStream(QDataStream &stream) const override; + +private: + QString _data; + bool _isKey = false; + QList _args; + +}; +} + + +#endif // TRANSLATABLESTRING_H diff --git a/submodules/QuasarAppLib b/submodules/QuasarAppLib index 36adbce..6f0d7a8 160000 --- a/submodules/QuasarAppLib +++ b/submodules/QuasarAppLib @@ -1 +1 @@ -Subproject commit 36adbced12a51229d17bd90d2a2252f537eb9f17 +Subproject commit 6f0d7a827c738d35c8ed419fdecb0f19e058a456