diff --git a/src/Lib/AbstractDocument.hh b/src/Lib/AbstractDocument.hh index 12780daa2c307d0f9c1fd32bdcd2bb56ba56e3ef..b561acfc284733abcbc49acb077152db40054867 100644 --- a/src/Lib/AbstractDocument.hh +++ b/src/Lib/AbstractDocument.hh @@ -16,9 +16,16 @@ class AbstractDocument : public QObject { Q_OBJECT VIVY_UNMOVABLE_OBJECT(AbstractDocument) +public: + enum class Type : quint64 { + Vivy = Utils::toUnderlying(Utils::DocumentType::Vivy), + Script = Utils::toUnderlying(Utils::DocumentType::VivyScript) + }; + protected: - AbstractDocument(const QString &documentName) - : name(documentName) + AbstractDocument(Type childType, const QString &documentName) + : type(childType) + , name(documentName) { } @@ -45,6 +52,7 @@ protected: return false; } + Type type; QString name{}; const Uuid uuid{}; @@ -52,6 +60,7 @@ public: virtual bool rename(const QString &) noexcept = 0; QString getName() const noexcept { return name; } + Type getType() const noexcept { return type; } Uuid getUuid() const noexcept { return uuid; } signals: diff --git a/src/Lib/Document/CRTPSubDocument.hh b/src/Lib/Document/CRTPSubDocument.hh index 43c7871a6423687119b6555e12f5fbad6d6141e6..eb6683d58a6b3eeddf3ed47bc1265b67791beee8 100644 --- a/src/Lib/Document/CRTPSubDocument.hh +++ b/src/Lib/Document/CRTPSubDocument.hh @@ -49,7 +49,6 @@ public: } inline Type getType() const noexcept { return fileType; } - inline QString getFilePath() const noexcept { return filePath; } }; diff --git a/src/Lib/Document/VivyDocument.cc b/src/Lib/Document/VivyDocument.cc index abced6795dc2dba14de48716defbf06ab82b8998..54c433721d31f10115ca7d3bd942adc88564e626 100644 --- a/src/Lib/Document/VivyDocument.cc +++ b/src/Lib/Document/VivyDocument.cc @@ -10,7 +10,7 @@ using namespace Vivy; VivyDocument::VivyDocument(const QString &documentPath, Options opt) - : AbstractDocument(documentPath) + : AbstractDocument(AbstractDocument::Type::Vivy, documentPath) , documentOptions(opt) { QFileInfo file(name); @@ -224,6 +224,7 @@ VivyDocument::getElementName() const noexcept { return getName(); } + QJsonDocument VivyDocument::getProperties() const noexcept { diff --git a/src/Lib/Script/ScriptDocument.cc b/src/Lib/Script/ScriptDocument.cc index 5b7c4a2701b077717e7a30508482b707b90dc6a3..2f4483e324d5ea3d03a5e8037a7d30306a89409e 100644 --- a/src/Lib/Script/ScriptDocument.cc +++ b/src/Lib/Script/ScriptDocument.cc @@ -5,7 +5,7 @@ using namespace Vivy; ScriptDocument::ScriptDocument(const QString &path) - : AbstractDocument(path) + : AbstractDocument(AbstractDocument::Type::Script, path) { const QFileInfo file(path); if (!file.exists()) diff --git a/src/Lib/Utils.hh b/src/Lib/Utils.hh index 20c60e04cb7ab4498c176a8c3edc101b2617cfe0..e8095145f4ed85b989f84e08ac03655115757cbf 100644 --- a/src/Lib/Utils.hh +++ b/src/Lib/Utils.hh @@ -62,6 +62,49 @@ const QString &getScriptFileSuffixFilter() noexcept; const QString &getVivyDocumentFileSuffixFilter() noexcept; const QString &getAnyDocumentFileSuffixFilter() noexcept; +static constexpr std::size_t pointerAlignement = alignof(void *); + +inline std::string & +ltrim(std::string &s, const char *t = " \t\n\r\f\v") +{ + s.erase(0, s.find_first_not_of(t)); + return s; +} + +inline std::string & +rtrim(std::string &s, const char *t = " \t\n\r\f\v") +{ + s.erase(s.find_last_not_of(t) + 1); + return s; +} + +inline std::string & +trim(std::string &s, const char *t = " \t\n\r\f\v") +{ + return ltrim(rtrim(s, t), t); +} + +template <typename T> inline void +uniqAndSort(std::vector<T> &vec) noexcept +{ + std::sort(std::begin(vec), std::end(vec)); + vec.erase(std::unique(std::begin(vec), std::end(vec)), std::end(vec)); +} + +// WARN: The V1 and V2 vectors need to be sorted before calling this function. +template <typename T> inline std::vector<T> +sortedSetDifference(const std::vector<T> &v1, const std::vector<T> &v2) +{ + std::vector<T> res{}; + + // Do V1 - V2 -> RES + std::set_difference(std::begin(v1), std::end(v1), // V1 + std::begin(v2), std::end(v2), // V2 + std::inserter(res, std::begin(res))); + + return res; +} + enum class DocumentType : quint64 { /* Basic types */ Vivy = (1 << 1), diff --git a/src/UI/AboutWindow.cc b/src/UI/AboutWindow.cc index fb916a803bfa4c78d420bb342a583a173cd1bbfc..90b25a0bf343da6bbe464ab2879a4cc50611f54f 100644 --- a/src/UI/AboutWindow.cc +++ b/src/UI/AboutWindow.cc @@ -69,9 +69,7 @@ AboutWindow::LicenceLabel::LicenceLabel(QWidget *parent, const QString &url, switch (format) { case Qt::PlainText: case Qt::RichText: setText(content.readAll()); break; - case Qt::MarkdownText: setMarkdown(content.readAll()); break; - case Qt::AutoText: qCritical() << "Invalid text format for LicenceLabel" << format; } } diff --git a/src/UI/AbstractDocumentView.hh b/src/UI/AbstractDocumentView.hh index 29d22aedd82fa099e04d75dd0e6e36bc7c765fca..7b1f4c807333e799fc4aa795b90fd548fc6f4eb3 100644 --- a/src/UI/AbstractDocumentView.hh +++ b/src/UI/AbstractDocumentView.hh @@ -25,9 +25,10 @@ public: Script = Utils::toUnderlying(Utils::DocumentType::VivyScript) }; -public: +protected: explicit AbstractDocumentView(Type, QWidget *parent = nullptr) noexcept; +public: virtual void closeDocument() noexcept = 0; virtual void openProperties() noexcept = 0; diff --git a/src/UI/DocumentViews/AssLinesModel.cc b/src/UI/DocumentViews/AssLinesModel.cc index 58616e134ffdde48daf4af9baa09c6f56544910b..c02396a50156529b246b2c7126e18424ab52dadd 100644 --- a/src/UI/DocumentViews/AssLinesModel.cc +++ b/src/UI/DocumentViews/AssLinesModel.cc @@ -69,16 +69,10 @@ AssLinesModel::data(const QModelIndex &index, int role) const noexcept if (Qt::DisplayRole == role) { switch (column) { case Item::Field::Text: return line->getLineText(); - - // We want a warning when adding a field so don"t use "default" case Item::Field::TotalFieldCount: qFatal("Unreachable"); } } - // Happily ignore the edit role for now - else if (Qt::EditRole == role) { - } - return QVariant(); } diff --git a/src/VivyApplication.cc b/src/VivyApplication.cc index b9c0dbfea0ae9086172ec5cdf0897512276dde84..f3e17144af99bdce902167f4f286bf1f7d7a1a92 100644 --- a/src/VivyApplication.cc +++ b/src/VivyApplication.cc @@ -57,8 +57,8 @@ VivyApplication::exec() noexcept setCursorFlashTime(0); // Show the main window - MainWindow mainWindow; - mainWindow.show(); + mainWindowPtr = std::make_unique<MainWindow>(); + mainWindowPtr->show(); // Main loop return QApplication::exec(); @@ -67,24 +67,35 @@ VivyApplication::exec() noexcept QFont VivyApplication::getApplicationFont(Font id) const noexcept { - switch (id) { - case Font::Monospace: - return QFont(QFontDatabase::applicationFontFamilies(fontIdMonospace).at(0)); - - case Font::MonospaceBold: - return QFont(QFontDatabase::applicationFontFamilies(fontIdMonospaceBold).at(0)); - - case Font::DefaultItalic: - return QFont(QFontDatabase::applicationFontFamilies(fontIdItalic).at(0)); + const auto getFontFromId = [](int fid) noexcept -> QFont { + return QFont(QFontDatabase::applicationFontFamilies(fid).at(0)); + }; - case Font::DefaultBoldItalic: - return QFont(QFontDatabase::applicationFontFamilies(fontIdBoldItalic).at(0)); - - case Font::DefaultBold: return QFont(QFontDatabase::applicationFontFamilies(fontIdBold).at(0)); - - case Font::Default: return QFont(QFontDatabase::applicationFontFamilies(fontIdRegular).at(0)); + switch (id) { + case Font::Monospace: return getFontFromId(fontIdMonospace); + case Font::MonospaceBold: return getFontFromId(fontIdMonospaceBold); + case Font::DefaultItalic: return getFontFromId(fontIdItalic); + case Font::DefaultBoldItalic: return getFontFromId(fontIdBoldItalic); + case Font::DefaultBold: return getFontFromId(fontIdBold); + case Font::Default: return getFontFromId(fontIdRegular); } // Let the program crash qFatal("UNREACHABLE"); } + +MainWindow * +VivyApplication::getMainWindow() const +{ + if (!mainWindowPtr) + throw std::logic_error("No main window in the graphic VivyApplication"); + return mainWindowPtr.get(); +} + +AbstractDocument * +VivyApplication::getCurrentDocument() const +{ + if (!mainWindowPtr) + throw std::logic_error("No main window in the graphic VivyApplication"); + return mainWindowPtr.get()->getCurrentDocument(); +} diff --git a/src/VivyApplication.hh b/src/VivyApplication.hh index a13719cda18f38253f0181147f9559f3ff776f34..757dcff18f8e029802675da3cff344b4147512a6 100644 --- a/src/VivyApplication.hh +++ b/src/VivyApplication.hh @@ -6,6 +6,9 @@ #define vivyApp static_cast<VivyApplication *>(QApplication::instance()) +#define currentVivyDocument() dynamic_cast<VivyDocument*>(vivyApp->getCurrentDocument()) +#define currentScriptDocument dynamic_cast<ScriptDocument*>(vivyApp->getCurrentDocument()) + // Only support dark theme for now #define VIVY_ICON_APP ":icons/vivy.png" #define VIVY_ICON_SCRIPT ":icons/lua.png" @@ -33,6 +36,9 @@ namespace Vivy { +class MainWindow; + +// Vivy application class class VivyApplication : public QApplication { Q_OBJECT @@ -46,14 +52,10 @@ public: Default, DefaultItalic, DefaultBold, - DefaultBoldItalic, + DefaultBoldItalic }; - enum class Theme { - System, - Dark, - Light, - }; + enum class Theme { System, Dark, Light }; private: int fontIdMonospace; @@ -63,12 +65,16 @@ private: int fontIdBold; int fontIdBoldItalic; + std::unique_ptr<MainWindow> mainWindowPtr{ nullptr }; + public: VivyApplication(int &argc, char **argv); int exec() noexcept; QFont getApplicationFont(Font) const noexcept; + [[nodiscard("handle-it")]] MainWindow *getMainWindow() const; + [[nodiscard("handle-it")]] AbstractDocument *getCurrentDocument() const; void setTheme(Theme) noexcept; };