From 74d252c5c0a26d3267fbd4e315150ac062e94bb9 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 5 May 2020 22:12:15 +1000 Subject: [PATCH] nodes: use defined categories rather than arbitrary string based --- app/node/audio/pan/pan.cpp | 6 +-- app/node/audio/pan/pan.h | 2 +- app/node/audio/volume/volume.cpp | 4 +- app/node/audio/volume/volume.h | 2 +- app/node/block/block.cpp | 4 +- app/node/block/block.h | 2 +- .../block/transition/externaltransition.cpp | 2 +- .../block/transition/externaltransition.h | 2 +- app/node/external.cpp | 2 +- app/node/external.h | 2 +- app/node/factory.cpp | 39 +++++++------------ app/node/generator/matrix/matrix.cpp | 4 +- app/node/generator/matrix/matrix.h | 2 +- app/node/input/media/media.cpp | 4 +- app/node/input/media/media.h | 2 +- app/node/input/time/timeinput.cpp | 4 +- app/node/input/time/timeinput.h | 2 +- app/node/math/math/math.cpp | 4 +- app/node/math/math/math.h | 2 +- app/node/math/trigonometry/trigonometry.cpp | 4 +- app/node/math/trigonometry/trigonometry.h | 2 +- app/node/metareader.cpp | 18 +++++++-- app/node/metareader.h | 5 ++- app/node/node.cpp | 35 ++++++++++++++--- app/node/node.h | 23 ++++++++++- app/node/output/track/track.cpp | 4 +- app/node/output/track/track.h | 2 +- app/node/output/viewer/viewer.cpp | 4 +- app/node/output/viewer/viewer.h | 2 +- app/shaders/alphaover.xml | 2 +- app/shaders/blur.xml | 2 +- app/shaders/crossdissolve.xml | 2 +- app/shaders/diptoblack.xml | 2 +- 33 files changed, 123 insertions(+), 75 deletions(-) diff --git a/app/node/audio/pan/pan.cpp b/app/node/audio/pan/pan.cpp index baa9f4123..c9ef24520 100644 --- a/app/node/audio/pan/pan.cpp +++ b/app/node/audio/pan/pan.cpp @@ -49,9 +49,9 @@ QString PanNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.pan"); } -QString PanNode::Category() const +QList PanNode::Category() const { - return tr("Audio"); + return {kCategoryChannels}; } QString PanNode::Description() const @@ -64,7 +64,7 @@ Node::Capabilities PanNode::GetCapabilities(const NodeValueDatabase &) const return kSampleProcessor; } -NodeInput *PanNode::ProcessesSamplesFrom(const NodeValueDatabase &value) const +NodeInput *PanNode::ProcessesSamplesFrom(const NodeValueDatabase &) const { return samples_input_; } diff --git a/app/node/audio/pan/pan.h b/app/node/audio/pan/pan.h index b5e15b452..d4392ff9f 100644 --- a/app/node/audio/pan/pan.h +++ b/app/node/audio/pan/pan.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; virtual Capabilities GetCapabilities(const NodeValueDatabase&) const override; diff --git a/app/node/audio/volume/volume.cpp b/app/node/audio/volume/volume.cpp index 5d1c90b4f..9d815b19a 100644 --- a/app/node/audio/volume/volume.cpp +++ b/app/node/audio/volume/volume.cpp @@ -48,9 +48,9 @@ QString VolumeNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.volume"); } -QString VolumeNode::Category() const +QList VolumeNode::Category() const { - return tr("Audio"); + return {kCategoryFilter}; } QString VolumeNode::Description() const diff --git a/app/node/audio/volume/volume.h b/app/node/audio/volume/volume.h index db1f781af..71149f0bf 100644 --- a/app/node/audio/volume/volume.h +++ b/app/node/audio/volume/volume.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; virtual Capabilities GetCapabilities(const NodeValueDatabase&) const override; diff --git a/app/node/block/block.cpp b/app/node/block/block.cpp index 06e0237f6..98c716678 100644 --- a/app/node/block/block.cpp +++ b/app/node/block/block.cpp @@ -63,9 +63,9 @@ Block::Block() : set_length_and_media_out(1); } -QString Block::Category() const +QList Block::Category() const { - return tr("Block"); + return {kCategoryTimeline}; } const rational &Block::in() const diff --git a/app/node/block/block.h b/app/node/block/block.h index a36f91754..ca3c6b613 100644 --- a/app/node/block/block.h +++ b/app/node/block/block.h @@ -49,7 +49,7 @@ public: virtual Type type() const = 0; - virtual QString Category() const override; + virtual QList Category() const override; const rational& in() const; const rational& out() const; diff --git a/app/node/block/transition/externaltransition.cpp b/app/node/block/transition/externaltransition.cpp index 74bbf817d..798ae5b74 100644 --- a/app/node/block/transition/externaltransition.cpp +++ b/app/node/block/transition/externaltransition.cpp @@ -50,7 +50,7 @@ QString ExternalTransition::id() const return meta_.id(); } -QString ExternalTransition::Category() const +QList ExternalTransition::Category() const { return meta_.Category(); } diff --git a/app/node/block/transition/externaltransition.h b/app/node/block/transition/externaltransition.h index 91cbd0ca9..5962ecf9d 100644 --- a/app/node/block/transition/externaltransition.h +++ b/app/node/block/transition/externaltransition.h @@ -37,7 +37,7 @@ public: virtual QString Name() const override; virtual QString ShortName() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/external.cpp b/app/node/external.cpp index 6d6a20ac9..eddcf43be 100644 --- a/app/node/external.cpp +++ b/app/node/external.cpp @@ -52,7 +52,7 @@ QString ExternalNode::id() const return meta_.id(); } -QString ExternalNode::Category() const +QList ExternalNode::Category() const { return meta_.Category(); } diff --git a/app/node/external.h b/app/node/external.h index b9a50a313..046539534 100644 --- a/app/node/external.h +++ b/app/node/external.h @@ -41,7 +41,7 @@ public: virtual QString Name() const override; virtual QString ShortName() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/factory.cpp b/app/node/factory.cpp index 09791c6a5..fe7361389 100644 --- a/app/node/factory.cpp +++ b/app/node/factory.cpp @@ -73,34 +73,25 @@ Menu *NodeFactory::CreateMenu(QWidget* parent) // Make sure nodes are up-to-date with the current translation n->Retranslate(); - QStringList path = n->Category().split('/'); + Menu* destination = nullptr; - Menu* destination = menu; + QString category_name = Node::GetCategoryName(n->Category().isEmpty() + ? Node::kCategoryUnknown + : n->Category().first()); - // Find destination menu based on category hierarchy - foreach (const QString& dir_name, path) { - // Ignore an empty directory - if (dir_name.isEmpty()) { - continue; + // See if a menu with this category name already exists + QList menu_actions = menu->actions(); + foreach (QAction* action, menu_actions) { + if (action->menu() && action->menu()->title() == category_name) { + destination = static_cast(action->menu()); + break; } + } - // See if a menu with this dir_name already exists - bool found_cat = false; - QList menu_actions = destination->actions(); - foreach (QAction* action, menu_actions) { - if (action->menu() && action->menu()->title() == dir_name) { - destination = static_cast(action->menu()); - found_cat = true; - break; - } - } - - // Create menu here if it doesn't exist - if (!found_cat) { - Menu* new_category = new Menu(dir_name, destination); - destination->InsertAlphabetically(new_category); - destination = new_category; - } + // Create menu here if it doesn't exist + if (!destination) { + destination = new Menu(category_name, menu); + menu->InsertAlphabetically(destination); } // Add entry to menu diff --git a/app/node/generator/matrix/matrix.cpp b/app/node/generator/matrix/matrix.cpp index ac406d47f..29871b6f8 100644 --- a/app/node/generator/matrix/matrix.cpp +++ b/app/node/generator/matrix/matrix.cpp @@ -69,9 +69,9 @@ QString MatrixGenerator::id() const return QStringLiteral("org.olivevideoeditor.Olive.transform"); } -QString MatrixGenerator::Category() const +QList MatrixGenerator::Category() const { - return tr("Generator"); + return {kCategoryGenerator, kCategoryMath}; } QString MatrixGenerator::Description() const diff --git a/app/node/generator/matrix/matrix.h b/app/node/generator/matrix/matrix.h index 7f723e4ab..88e8caeb4 100644 --- a/app/node/generator/matrix/matrix.h +++ b/app/node/generator/matrix/matrix.h @@ -36,7 +36,7 @@ public: virtual QString Name() const override; virtual QString ShortName() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/input/media/media.cpp b/app/node/input/media/media.cpp index b7bad0efc..b3a3697f0 100644 --- a/app/node/input/media/media.cpp +++ b/app/node/input/media/media.cpp @@ -35,9 +35,9 @@ MediaInput::MediaInput() : AddInput(footage_input_); } -QString MediaInput::Category() const +QList MediaInput::Category() const { - return tr("Input"); + return {kCategoryInput}; } StreamPtr MediaInput::footage() diff --git a/app/node/input/media/media.h b/app/node/input/media/media.h index a7c15e37b..ba89f3168 100644 --- a/app/node/input/media/media.h +++ b/app/node/input/media/media.h @@ -35,7 +35,7 @@ class MediaInput : public Node public: MediaInput(); - virtual QString Category() const override; + virtual QList Category() const override; StreamPtr footage(); void SetFootage(StreamPtr f); diff --git a/app/node/input/time/timeinput.cpp b/app/node/input/time/timeinput.cpp index fa15de735..fee052c3c 100644 --- a/app/node/input/time/timeinput.cpp +++ b/app/node/input/time/timeinput.cpp @@ -41,9 +41,9 @@ QString TimeInput::id() const return QStringLiteral("org.olivevideoeditor.Olive.time"); } -QString TimeInput::Category() const +QList TimeInput::Category() const { - return tr("Input"); + return {kCategoryInput}; } QString TimeInput::Description() const diff --git a/app/node/input/time/timeinput.h b/app/node/input/time/timeinput.h index b912ed4b1..e79d1b333 100644 --- a/app/node/input/time/timeinput.h +++ b/app/node/input/time/timeinput.h @@ -35,7 +35,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; virtual NodeValueTable Value(NodeValueDatabase& value) const override; diff --git a/app/node/math/math/math.cpp b/app/node/math/math/math.cpp index 93e802481..9f2f4ca3e 100644 --- a/app/node/math/math/math.cpp +++ b/app/node/math/math/math.cpp @@ -61,9 +61,9 @@ QString MathNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.math"); } -QString MathNode::Category() const +QList MathNode::Category() const { - return tr("Math"); + return {kCategoryMath}; } QString MathNode::Description() const diff --git a/app/node/math/math/math.h b/app/node/math/math/math.h index 1909c4bd5..4327bb36a 100644 --- a/app/node/math/math/math.h +++ b/app/node/math/math/math.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/math/trigonometry/trigonometry.cpp b/app/node/math/trigonometry/trigonometry.cpp index af073c3c5..7ab8ddb3a 100644 --- a/app/node/math/trigonometry/trigonometry.cpp +++ b/app/node/math/trigonometry/trigonometry.cpp @@ -48,9 +48,9 @@ QString TrigonometryNode::id() const return QStringLiteral("org.olivevideoeditor.Olive.trigonometry"); } -QString TrigonometryNode::Category() const +QList TrigonometryNode::Category() const { - return tr("Math"); + return {kCategoryMath}; } QString TrigonometryNode::Description() const diff --git a/app/node/math/trigonometry/trigonometry.h b/app/node/math/trigonometry/trigonometry.h index c999104eb..9af68472f 100644 --- a/app/node/math/trigonometry/trigonometry.h +++ b/app/node/math/trigonometry/trigonometry.h @@ -34,7 +34,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; virtual void Retranslate() override; diff --git a/app/node/metareader.cpp b/app/node/metareader.cpp index 007d7ec7b..e09386df4 100644 --- a/app/node/metareader.cpp +++ b/app/node/metareader.cpp @@ -71,9 +71,9 @@ const QString &NodeMetaReader::id() const return id_; } -QString NodeMetaReader::Category() const +QList NodeMetaReader::Category() const { - return GetStringForCurrentLanguage(&categories_); + return categories_; } QString NodeMetaReader::Description() const @@ -187,7 +187,19 @@ void NodeMetaReader::XMLReadEffect(QXmlStreamReader* reader) XMLReadLanguageString(reader, &short_names_); } else if (reader->name() == QStringLiteral("category")) { // Pick up category - XMLReadLanguageString(reader, &categories_); + QStringList category_ids = reader->readElementText().split(':'); + + foreach (const QString& id, category_ids) { + bool ok; + + int try_parse = id.toInt(&ok); + + if (!ok || try_parse < 0 || try_parse >= Node::kCategoryCount) { + continue; + } + + categories_.append(static_cast(try_parse)); + } } else if (reader->name() == QStringLiteral("description")) { // Pick up description XMLReadLanguageString(reader, &descriptions_); diff --git a/app/node/metareader.h b/app/node/metareader.h index 13c965a87..9efb6441d 100644 --- a/app/node/metareader.h +++ b/app/node/metareader.h @@ -26,6 +26,7 @@ #include #include "input.h" +#include "node/node.h" OLIVE_NAMESPACE_ENTER @@ -37,7 +38,7 @@ public: QString Name() const; QString ShortName() const; const QString& id() const; - QString Category() const; + QList Category() const; QString Description() const; const QString& filename() const; @@ -70,7 +71,7 @@ private: LanguageMap names_; LanguageMap short_names_; LanguageMap descriptions_; - LanguageMap categories_; + QList categories_; QMap param_names_; QMap > combo_names_; QMap > combo_descriptions_; diff --git a/app/node/node.cpp b/app/node/node.cpp index 49c48cfdb..7a149d3ad 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -127,12 +127,6 @@ QString Node::ShortName() const return Name(); } -QString Node::Category() const -{ - // Return an empty category for any nodes that don't use one - return QString(); -} - QString Node::Description() const { // Return an empty string by default @@ -560,6 +554,35 @@ void Node::DisconnectAll() } } +QString Node::GetCategoryName(const CategoryID &c) +{ + switch (c) { + case kCategoryInput: + return tr("Input"); + case kCategoryOutput: + return tr("Output"); + case kCategoryGeneral: + return tr("General"); + case kCategoryMath: + return tr("Math"); + case kCategoryColor: + return tr("Color"); + case kCategoryFilter: + return tr("Filter"); + case kCategoryTimeline: + return tr("Timeline"); + case kCategoryGenerator: + return tr("Generator"); + case kCategoryChannels: + return tr("Channel"); + case kCategoryUnknown: + case kCategoryCount: + break; + } + + return tr("Uncategorized"); +} + QList Node::TransformTimeTo(const TimeRange &time, Node *target, NodeParam::Type direction) { QList paths_found; diff --git a/app/node/node.h b/app/node/node.h index 3b5d09f09..f9f64898d 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -61,6 +61,22 @@ public: kSampleProcessor = 0x2 }; + enum CategoryID { + kCategoryUnknown = -1, + + kCategoryInput, + kCategoryOutput, + kCategoryGenerator, + kCategoryMath, + kCategoryFilter, + kCategoryColor, + kCategoryGeneral, + kCategoryTimeline, + kCategoryChannels, + + kCategoryCount + }; + Node(); virtual ~Node() override; @@ -115,7 +131,7 @@ public: * interpreted as an empty string category. This value should be run through a translator as its largely user * oriented. */ - virtual QString Category() const; + virtual QList Category() const = 0; /** * @brief Return a description of this node's purpose (optional for subclassing, but recommended) @@ -241,6 +257,11 @@ public: */ void DisconnectAll(); + /** + * @brief Get the human-readable name for any category + */ + static QString GetCategoryName(const CategoryID &c); + /** * @brief Transforms time from this node through the connections it takes to get to the specified node */ diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index da545cd6e..9d6f75b53 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -80,9 +80,9 @@ QString TrackOutput::id() const return QStringLiteral("org.olivevideoeditor.Olive.track"); } -QString TrackOutput::Category() const +QList TrackOutput::Category() const { - return tr("Output"); + return {kCategoryTimeline}; } QString TrackOutput::Description() const diff --git a/app/node/output/track/track.h b/app/node/output/track/track.h index 0922d54fc..781c4eb96 100644 --- a/app/node/output/track/track.h +++ b/app/node/output/track/track.h @@ -44,7 +44,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; QString GetTrackName(); diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index e06c5443d..445598cb0 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -72,9 +72,9 @@ QString ViewerOutput::id() const return QStringLiteral("org.olivevideoeditor.Olive.vieweroutput"); } -QString ViewerOutput::Category() const +QList ViewerOutput::Category() const { - return tr("Output"); + return {kCategoryOutput}; } QString ViewerOutput::Description() const diff --git a/app/node/output/viewer/viewer.h b/app/node/output/viewer/viewer.h index 57101b67a..3a5b3fa78 100644 --- a/app/node/output/viewer/viewer.h +++ b/app/node/output/viewer/viewer.h @@ -49,7 +49,7 @@ public: virtual QString Name() const override; virtual QString id() const override; - virtual QString Category() const override; + virtual QList Category() const override; virtual QString Description() const override; NodeInput* texture_input() const; diff --git a/app/shaders/alphaover.xml b/app/shaders/alphaover.xml index e9df1a47b..0f98ea7f0 100644 --- a/app/shaders/alphaover.xml +++ b/app/shaders/alphaover.xml @@ -4,7 +4,7 @@ Alpha Over - Blend + 3 diff --git a/app/shaders/blur.xml b/app/shaders/blur.xml index 2d49a43b6..6942d8749 100644 --- a/app/shaders/blur.xml +++ b/app/shaders/blur.xml @@ -4,7 +4,7 @@ Blur - Blur + 4 diff --git a/app/shaders/crossdissolve.xml b/app/shaders/crossdissolve.xml index 7e7c1855f..3338f6e86 100644 --- a/app/shaders/crossdissolve.xml +++ b/app/shaders/crossdissolve.xml @@ -4,7 +4,7 @@ Cross Dissolve - Transition + diff --git a/app/shaders/diptoblack.xml b/app/shaders/diptoblack.xml index 7a4127ded..1bca1af4e 100644 --- a/app/shaders/diptoblack.xml +++ b/app/shaders/diptoblack.xml @@ -4,7 +4,7 @@ Dip to Black - Transition +