nodeeditor 源码阅读 - NodeStyle节点风格类

目录

 NodeStyle.hpp

NodeStyle.cpp

默认风格设置


 NodeStyle.hpp

#pragma once

#include <QtGui/QColor>  // 包含 QColor 类的头文件

#include "Export.hpp"  // 导出宏的头文件,可能用于设置 DLL 的访问权限
#include "Style.hpp"   // 引入 Style 类的头文件,该类是 NodeStyle 的基类

namespace QtNodes {

// 使用 NODE_EDITOR_PUBLIC 宏,可能是用于控制类的导出和可见性
class NODE_EDITOR_PUBLIC NodeStyle : public Style
{
public:
    // 三个构造方法,分别用于创建 NodeStyle 对象的不同方式
    NodeStyle();      // 默认构造方法
    NodeStyle(QString jsonText);  // 带参数构造方法,接受 JSON 文本作为输入
    NodeStyle(QJsonObject const &json);  // 带参数构造方法,接受 JSON 对象作为输入
    
    // 使得能够调用默认的析构函数
    virtual ~NodeStyle() = default;

public:
    // 静态方法,用于设置节点风格,通过类名直接设置
    static void setNodeStyle(QString jsonText);

public:
    // 实现父类中的纯虚函数,用于加载节点样式的配置信息
    void loadJson(QJsonObject const &json) override;
    // 将 NodeStyle 对象转换为 QJsonObject 对象
    QJsonObject toJson() const override;

public:
    // 下面是一系列成员变量,用于表示节点样式的各种颜色属性
    QColor NormalBoundaryColor;  // 普通边界颜色
    QColor SelectedBoundaryColor;  // 选中边界颜色
    QColor GradientColor0;  // 渐变颜色0
    QColor GradientColor1;  // 渐变颜色1
    QColor GradientColor2;  // 渐变颜色2
    QColor GradientColor3;  // 渐变颜色3
    QColor ShadowColor;  // 阴影颜色
    QColor FontColor;    // 字体颜色
    QColor FontColorFaded;  // 淡化的字体颜色

    QColor ConnectionPointColor;  // 连接点颜色
    QColor FilledConnectionPointColor;  // 填充的连接点颜色

    QColor WarningColor;  // 警告颜色
    QColor ErrorColor;    // 错误颜色
    
    // 下面是一系列浮点数类型的成员变量,用于表示节点样式的各种属性值
    float PenWidth;            // 画笔宽度
    float HoveredPenWidth;     // 鼠标悬停时的画笔宽度
    
    float ConnectionPointDiameter;  // 连接点直径
    float Opacity;  // 不透明度
};
} // namespace QtNodes

NodeStyle.cpp

#include "NodeStyle.hpp"

#include <iostream>

#include <QtCore/QJsonArray>
#include <QtCore/QJsonObject>
#include <QtCore/QJsonValueRef>

#include <QtCore/QDebug>

#include "StyleCollection.hpp"   // 为了与样式配置的集合进行交互。

using QtNodes::NodeStyle;

// 用于初始化资源。内联函数通常用于定义非常简单的函数,以减少函数调用的开销。
// 在构造函数中调用
inline void initResources()
{
    Q_INIT_RESOURCE(resources);  // 调用了Qt的宏,可能用于初始化资源文件(如图标、样式表等)。
}

// 3种构造函数,给自身成员变量赋值

// 在构造函数中,进行了资源初始化并加载了默认的节点样式配置。
NodeStyle::NodeStyle()
{
    // Explicit resources inialization for preventing the static initialization
    // order fiasco: https://isocpp.org/wiki/faq/ctors#static-init-order
    initResources();

    // This configuration is stored inside the compiled unit and is loaded statically
    loadJsonFile(":DefaultStyle.json");
}

// 带参数构造函数的定义,接受一个字符串 jsonText,用于加载节点样式配置。
NodeStyle::NodeStyle(QString jsonText)
{
    loadJsonText(jsonText);  // 调用父类方法-》调用父类中被实现纯虚函数loadJson->给子类成员变量赋值
}

NodeStyle::NodeStyle(QJsonObject const &json)
{
    loadJson(json);
}

// setNodeStyle静态方法,调用风格管理类的静态方法,设置节点风格
void NodeStyle::setNodeStyle(QString jsonText)
{
    NodeStyle style(jsonText);

    StyleCollection::setNodeStyle(style);
}

// 根据预处理器中是否定义了 STYLE_DEBUG 宏来包含或排除其中的代码。
// 这是一种用于调试目的的编译指令。
#ifdef STYLE_DEBUG
#define NODE_STYLE_CHECK_UNDEFINED_VALUE(v, variable) \
    { \
        if (v.type() == QJsonValue::Undefined || v.type() == QJsonValue::Null) \
            qWarning() << "Undefined value for parameter:" << #variable; \
    }
#else
#define NODE_STYLE_CHECK_UNDEFINED_VALUE(v, variable)
#endif

// 这些宏用于处理节点样式配置中的各种属性值,例如颜色、浮点数等。
#define NODE_STYLE_READ_COLOR(values, variable) \
    { \
        auto valueRef = values[#variable]; \
        NODE_STYLE_CHECK_UNDEFINED_VALUE(valueRef, variable) \
        if (valueRef.isArray()) { \
            auto colorArray = valueRef.toArray(); \
            std::vector<int> rgb; \
            rgb.reserve(3); \
            for (auto it = colorArray.begin(); it != colorArray.end(); ++it) { \
                rgb.push_back((*it).toInt()); \
            } \
            variable = QColor(rgb[0], rgb[1], rgb[2]); \
        } else { \
            variable = QColor(valueRef.toString()); \
        } \
    }

#define NODE_STYLE_WRITE_COLOR(values, variable) \
    { \
        values[#variable] = variable.name(); \
    }

#define NODE_STYLE_READ_FLOAT(values, variable) \
    { \
        auto valueRef = values[#variable]; \
        NODE_STYLE_CHECK_UNDEFINED_VALUE(valueRef, variable) \
        variable = valueRef.toDouble(); \
    }

#define NODE_STYLE_WRITE_FLOAT(values, variable) \
    { \
        values[#variable] = variable; \
    }

// 关键成员函数,实现父类的纯虚函数
// 用于给自身成员变量赋值,即《节点》样式配置。
void NodeStyle::loadJson(QJsonObject const &json)
{
    QJsonValue nodeStyleValues = json["NodeStyle"];

    QJsonObject obj = nodeStyleValues.toObject();

    NODE_STYLE_READ_COLOR(obj, NormalBoundaryColor);
    NODE_STYLE_READ_COLOR(obj, SelectedBoundaryColor);
    NODE_STYLE_READ_COLOR(obj, GradientColor0);
    NODE_STYLE_READ_COLOR(obj, GradientColor1);
    NODE_STYLE_READ_COLOR(obj, GradientColor2);
    NODE_STYLE_READ_COLOR(obj, GradientColor3);
    NODE_STYLE_READ_COLOR(obj, ShadowColor);
    NODE_STYLE_READ_COLOR(obj, FontColor);
    NODE_STYLE_READ_COLOR(obj, FontColorFaded);
    NODE_STYLE_READ_COLOR(obj, ConnectionPointColor);
    NODE_STYLE_READ_COLOR(obj, FilledConnectionPointColor);
    NODE_STYLE_READ_COLOR(obj, WarningColor);
    NODE_STYLE_READ_COLOR(obj, ErrorColor);

    NODE_STYLE_READ_FLOAT(obj, PenWidth);
    NODE_STYLE_READ_FLOAT(obj, HoveredPenWidth);
    NODE_STYLE_READ_FLOAT(obj, ConnectionPointDiameter);

    NODE_STYLE_READ_FLOAT(obj, Opacity);
}

// 定义了一个成员函数,用于将节点样式配置转换为 QJsonObject 对象,以便保存到JSON格式。
QJsonObject NodeStyle::toJson() const
{
    QJsonObject obj;

    NODE_STYLE_WRITE_COLOR(obj, NormalBoundaryColor);
    NODE_STYLE_WRITE_COLOR(obj, SelectedBoundaryColor);
    NODE_STYLE_WRITE_COLOR(obj, GradientColor0);
    NODE_STYLE_WRITE_COLOR(obj, GradientColor1);
    NODE_STYLE_WRITE_COLOR(obj, GradientColor2);
    NODE_STYLE_WRITE_COLOR(obj, GradientColor3);
    NODE_STYLE_WRITE_COLOR(obj, ShadowColor);
    NODE_STYLE_WRITE_COLOR(obj, FontColor);
    NODE_STYLE_WRITE_COLOR(obj, FontColorFaded);
    NODE_STYLE_WRITE_COLOR(obj, ConnectionPointColor);
    NODE_STYLE_WRITE_COLOR(obj, FilledConnectionPointColor);
    NODE_STYLE_WRITE_COLOR(obj, WarningColor);
    NODE_STYLE_WRITE_COLOR(obj, ErrorColor);

    NODE_STYLE_WRITE_FLOAT(obj, PenWidth);
    NODE_STYLE_WRITE_FLOAT(obj, HoveredPenWidth);
    NODE_STYLE_WRITE_FLOAT(obj, ConnectionPointDiameter);

    NODE_STYLE_WRITE_FLOAT(obj, Opacity);

    QJsonObject root;
    root["NodeStyle"] = obj;

    return root;
}

默认风格设置

{
  "GraphicsViewStyle": {
    "BackgroundColor": [53, 53, 53],
    "FineGridColor": [60, 60, 60],
    "CoarseGridColor": [25, 25, 25]
  },
  "NodeStyle": {
    "NormalBoundaryColor": [255, 255, 255],
    "SelectedBoundaryColor": [255, 165, 0],
    "GradientColor0": "gray",
    "GradientColor1": [80, 80, 80],
    "GradientColor2": [64, 64, 64],
    "GradientColor3": [58, 58, 58],
    "ShadowColor": [20, 20, 20],
    "FontColor" : "white",
    "FontColorFaded" : "gray",
    "ConnectionPointColor": [169, 169, 169],
    "FilledConnectionPointColor": "cyan",
    "ErrorColor": "red",
    "WarningColor": [128, 128, 0],

    "PenWidth": 1.0,
    "HoveredPenWidth": 1.5,

    "ConnectionPointDiameter": 8.0,

    "Opacity": 0.8
  },
  "ConnectionStyle": {
    "ConstructionColor": "gray",
    "NormalColor": "darkcyan",
    "SelectedColor": [100, 100, 100],
    "SelectedHaloColor": "orange",
    "HoveredColor": "lightcyan",

    "LineWidth": 3.0,
    "ConstructionLineWidth": 2.0,
    "PointDiameter": 10.0,

    "UseDataDefinedColors": false
  }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值