From 74d252c5c0a26d3267fbd4e315150ac062e94bb9 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 5 May 2020 22:12:15 +1000 Subject: [PATCH 1/3] 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 + From 0628ddb901db15e3facd02d8458291ae4019f09a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 5 May 2020 23:24:00 +1000 Subject: [PATCH 2/3] nodes: use different colors from config based on category --- app/config/config.cpp | 10 ++++++++++ app/render/color.cpp | 5 +++++ app/render/color.h | 4 ++++ app/widget/colorwheel/colorswatchwidget.cpp | 4 +--- app/widget/nodeview/nodeviewitem.cpp | 14 ++++++++++++-- app/widget/nodeview/nodeviewitem.h | 7 ------- 6 files changed, 32 insertions(+), 12 deletions(-) diff --git a/app/config/config.cpp b/app/config/config.cpp index 6870ad296..a5d031c47 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -83,6 +83,16 @@ void Config::SetDefaults() config_map_["DropWithoutSequenceBehavior"] = TimelineWidget::kDWSAsk; config_map_["Loop"] = false; + config_map_["NodeCatColor0"] = QVariant::fromValue(Color(0.25, 0.25, 0.65)); + config_map_["NodeCatColor1"] = QVariant::fromValue(Color(0.6, 0.6, 0.85)); + config_map_["NodeCatColor2"] = QVariant::fromValue(Color(0.75, 0.75, 0.45)); + config_map_["NodeCatColor3"] = QVariant::fromValue(Color(0.25, 0.5, 0.25)); + config_map_["NodeCatColor4"] = QVariant::fromValue(Color(0.25, 0.65, 0.25)); + config_map_["NodeCatColor5"] = QVariant::fromValue(Color(0.35, 0.35, 0.35)); + config_map_["NodeCatColor6"] = QVariant::fromValue(Color(0.45, 0.45, 0.45)); + config_map_["NodeCatColor7"] = QVariant::fromValue(Color(0.7, 0.3, 0.7)); + config_map_["NodeCatColor8"] = QVariant::fromValue(Color(0.85, 0.65, 0.4)); + config_map_["AudioOutput"] = QString(); config_map_["AudioInput"] = QString(); diff --git a/app/render/color.cpp b/app/render/color.cpp index 14f7e62e1..1a520b175 100644 --- a/app/render/color.cpp +++ b/app/render/color.cpp @@ -207,6 +207,11 @@ QColor Color::toQColor() const return c; } +float Color::GetRoughLuminance() const +{ + return (2*red()+blue()+3*green())/6.0f; +} + const Color &Color::operator+=(const Color &rhs) { for (int i=0;i 0.66) { + if (GetSelectedColor().GetRoughLuminance() > 0.66) { return Qt::black; } else { return Qt::white; diff --git a/app/widget/nodeview/nodeviewitem.cpp b/app/widget/nodeview/nodeviewitem.cpp index 45eafa7e2..763b10281 100644 --- a/app/widget/nodeview/nodeviewitem.cpp +++ b/app/widget/nodeview/nodeviewitem.cpp @@ -28,6 +28,7 @@ #include "common/flipmodifiers.h" #include "common/qtutils.h" +#include "config/config.h" #include "core.h" #include "nodeview.h" #include "nodeviewscene.h" @@ -260,8 +261,11 @@ void NodeViewItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti // Draw the titlebar if (!hide_titlebar_ && node_) { + Color node_color = Config::Current()[QStringLiteral("NodeCatColor%1") + .arg(node_->Category().first())].value(); + painter->setPen(Qt::black); - painter->setBrush(css_proxy_.TitleBarColor()); + painter->setBrush(node_color.toQColor()); painter->drawRect(title_bar_rect_); @@ -293,6 +297,12 @@ void NodeViewItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti } } + if (node_color.GetRoughLuminance() > 0.66) { + painter->setPen(Qt::black); + } else { + painter->setPen(Qt::white); + } + // Draw the text in a rect (the rect is sized around text already in the constructor) painter->drawText(title_bar_rect_, Qt::AlignCenter, @@ -307,7 +317,7 @@ void NodeViewItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *opti if (option->state & QStyle::State_Selected) { border_pen.setColor(app_pal.color(QPalette::Highlight)); } else { - border_pen.setColor(css_proxy_.BorderColor()); + border_pen.setColor(Qt::black); } painter->setPen(border_pen); diff --git a/app/widget/nodeview/nodeviewitem.h b/app/widget/nodeview/nodeviewitem.h index 0a02b7e3e..226929872 100644 --- a/app/widget/nodeview/nodeviewitem.h +++ b/app/widget/nodeview/nodeviewitem.h @@ -130,13 +130,6 @@ private: */ QList node_inputs_; - /** - * @brief A QWidget that can receive CSS properties that NodeViewItem can use - * - * \see NodeViewItemWidget - */ - NodeViewItemWidget css_proxy_; - /** * @brief Rectangle of the Node's title bar (equal to rect() when collapsed) */ From af994cd1b6d8d1784434fa3d9c243d87ea26895b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 5 May 2020 23:47:03 +1000 Subject: [PATCH 3/3] preferences: added preference for node color scheme --- .../tabs/preferencesappearancetab.cpp | 57 ++++++++++++++++++- .../tabs/preferencesappearancetab.h | 11 ++++ app/render/color.cpp | 8 +++ app/render/color.h | 2 + 4 files changed, 75 insertions(+), 3 deletions(-) diff --git a/app/dialog/preferences/tabs/preferencesappearancetab.cpp b/app/dialog/preferences/tabs/preferencesappearancetab.cpp index 0324fc661..4078c1f0f 100644 --- a/app/dialog/preferences/tabs/preferencesappearancetab.cpp +++ b/app/dialog/preferences/tabs/preferencesappearancetab.cpp @@ -20,10 +20,14 @@ #include "preferencesappearancetab.h" +#include #include #include +#include #include -#include + +#include "node/node.h" +#include "widget/colorbutton/colorbutton.h" OLIVE_NAMESPACE_ENTER @@ -44,7 +48,7 @@ PreferencesAppearanceTab::PreferencesAppearanceTab() style_list_ = StyleManager::ListInternal(); - foreach (StyleDescriptor s, style_list_) { + foreach (const StyleDescriptor& s, style_list_) { style_->addItem(s.name(), s.path()); if (s.path() == StyleManager::GetStyle()) { @@ -52,10 +56,34 @@ PreferencesAppearanceTab::PreferencesAppearanceTab() } } - appearance_layout->addWidget(style_, row, 1, 1, 2); + appearance_layout->addWidget(style_, row, 1); row++; + { + QGroupBox* color_group = new QGroupBox(); + color_group->setTitle(tr("Node Color Scheme")); + + QGridLayout* color_layout = new QGridLayout(color_group); + + for (int i=0; i(i)); + color_layout->addWidget(new QLabel(cat_name), i, 0); + + Color c = Config::Current()[QStringLiteral("NodeCatColor%1").arg(i)].value(); + colors_.append(c.toQColor()); + + QPushButton* color_btn = new QPushButton(); + connect(color_btn, &QPushButton::clicked, this, &PreferencesAppearanceTab::ColorButtonClicked); + color_layout->addWidget(color_btn, i, 1); + color_btns_.append(color_btn); + + UpdateButtonColor(i); + } + + appearance_layout->addWidget(color_group, row, 0, 1, 2); + } + layout->addStretch(); } @@ -67,6 +95,29 @@ void PreferencesAppearanceTab::Accept() StyleManager::SetStyle(style_path); Config::Current()["Style"] = style_path; } + + for (int i=0;isetStyleSheet(QStringLiteral("background: %1;") + .arg(colors_.at(index).name())); +} + +void PreferencesAppearanceTab::ColorButtonClicked() +{ + int index = color_btns_.indexOf(static_cast(sender())); + + QColor new_color = QColorDialog::getColor(colors_.at(index), this); + + if (new_color.isValid()) { + colors_.replace(index, new_color); + + UpdateButtonColor(index); + } } OLIVE_NAMESPACE_EXIT diff --git a/app/dialog/preferences/tabs/preferencesappearancetab.h b/app/dialog/preferences/tabs/preferencesappearancetab.h index cf3b97d71..1ab267eb5 100644 --- a/app/dialog/preferences/tabs/preferencesappearancetab.h +++ b/app/dialog/preferences/tabs/preferencesappearancetab.h @@ -23,6 +23,7 @@ #include #include +#include #include "preferencestab.h" #include "ui/style/style.h" @@ -43,6 +44,8 @@ private: */ void BrowseForCSS(); + void UpdateButtonColor(int index); + /** * @brief UI widget for selecting the current UI style */ @@ -54,6 +57,14 @@ private: QList style_list_; QString custom_style_path_; + + QList colors_; + + QList color_btns_; + +private slots: + void ColorButtonClicked(); + }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/color.cpp b/app/render/color.cpp index 1a520b175..e0b20d6e2 100644 --- a/app/render/color.cpp +++ b/app/render/color.cpp @@ -78,6 +78,14 @@ Color::Color(const char *data, const PixelFormat::Format &format) } } +Color::Color(const QColor &c) +{ + set_red(c.redF()); + set_green(c.greenF()); + set_blue(c.blueF()); + set_alpha(c.alphaF()); +} + void Color::toHsv(float *hue, float *sat, float *val) const { float fCMax = qMax(qMax(red(), green()), blue()); diff --git a/app/render/color.h b/app/render/color.h index 385a26932..f2e6070d8 100644 --- a/app/render/color.h +++ b/app/render/color.h @@ -52,6 +52,8 @@ public: Color(const char *data, const PixelFormat::Format &format); + Color(const QColor& c); + /** * @brief Creates a Color struct from hue/saturation/value *