diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerStyleDialog.cpp b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerStyleDialog.cpp index 7a7db8d..478301a 100644 --- a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerStyleDialog.cpp +++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerStyleDialog.cpp @@ -18,7 +18,7 @@ LayerStyleDialog::LayerStyleDialog( if (existedStyle) { - this->modifyingStyle = existedStyle->clonePtr(); + this->modifyingStyle = existedStyle->clone(); this->styleContainer = nullptr; this->styleWidget = modifyingStyle->getInputWidget(); diff --git a/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp b/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp index 77a75c7..9314fb3 100644 --- a/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp +++ b/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp @@ -47,16 +47,19 @@ PixelPath SimpleElement::getPaintObject(std::vector> PixelPath result; //Renderer::ElementStyleStrokeDemo demo(2); std::shared_ptr style; - if ((*styles).empty()) + if ((*styles).empty()) { style = std::make_shared(2); } else { style = (*styles)[0]; - qDebug() << std::dynamic_pointer_cast( + /*qDebug() << std::dynamic_pointer_cast( std::dynamic_pointer_cast(style)->materialStyles[0]->materialStroke - )->material.color.name(); + )->material.color.name();*/ + /*qDebug() << std::dynamic_pointer_cast( + std::dynamic_pointer_cast(style)->materialStyles[0]->materialStroke + )->materialMap[1.0].color;*/ } auto [img, mov] = renderer->drawElement(painterPath, *style, 1.0); //qDebug() << img << " ------"; diff --git a/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp b/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp index e4e18f1..4d88518 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp +++ b/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp @@ -1,10 +1,13 @@ #include "LayerStyle.h" +#include "./EditorWidgetComponent/StrokeStyleListView.h" +#include #include #include #include #include #include #include +#include const std::vector()>>> LayerStyle::types = { { @@ -20,10 +23,24 @@ const std::vector() std::vector StrokeElementLayerStyle::toBaseStyles() const { std::vector baseStyles; - for (auto materialStyle : materialStyles) + /*for (auto materialStyle : materialStyles) { baseStyles.push_back(Renderer::BaseStyle(std::make_shared(), materialStyle)); + }*/ + if (enableEachSideIndependent) + { + baseStyles.push_back(Renderer::BaseStyle(std::make_shared(), + strokePair.first)); + baseStyles.push_back(Renderer::BaseStyle(std::make_shared(), + strokePair.second)); + } + else + { + strokePair.first->strokeType = Renderer::StrokeType::kBothSides; + baseStyles.push_back(Renderer::BaseStyle(std::make_shared(), + strokePair.first)); + strokePair.first->strokeType = Renderer::StrokeType::kLeftSide; } return baseStyles; } @@ -35,34 +52,61 @@ QString StrokeElementLayerStyle::getStyleName() const QWidget* StrokeElementLayerStyle::getInputWidget() { - // TODO - if (this->materialStyles.empty()) + if (this->strokePair.first == nullptr) { - /*auto materialMap = std::map(); - materialMap[1.0] = Renderer::Material{ QColor(0,255,255), 1.0f, 1.0f }; - this->materialStyles.push_back(std::shared_ptr(new Renderer::MaterialStyleStroke( - 0, - Renderer::StrokeType::kBothSides, Renderer::StrokeEndType::kFlat, + auto materialMap = std::map(); + materialMap[0.3] = Renderer::Material{ QColor(0,255,255), 0.f, .8f }; + materialMap[1.0] = Renderer::Material{ QColor(80,25,255), 0.f, .8f }; + this->strokePair.first = std::shared_ptr(new Renderer::MaterialStyleStroke( + 15, + Renderer::StrokeType::kLeftSide, Renderer::StrokeEndType::kFlat, + std::shared_ptr(new Renderer::StrokeRadialGradient( + materialMap, false + )) + )); + } + if (this->strokePair.second == nullptr) + { + auto materialMap = std::map(); + materialMap[0.3] = Renderer::Material{ QColor(0,255,255), 0.f, .8f }; + materialMap[1.0] = Renderer::Material{ QColor(80,25,255), 0.f, .8f }; + this->strokePair.second = std::shared_ptr(new Renderer::MaterialStyleStroke( + 15, + Renderer::StrokeType::kRightSide, Renderer::StrokeEndType::kFlat, std::shared_ptr(new Renderer::StrokeRadialGradient( materialMap, false )) - )));*/ - this->materialStyles.push_back(std::make_shared( - 0, - Renderer::StrokeType::kBothSides, Renderer::StrokeEndType::kFlat, - std::make_shared(QColor::fromRgb(50, 50, 50), 0, 0.8) - )); + )); } QWidget* w = new QWidget; + QListView* materialList = new QListView; + QVBoxLayout* layout = new QVBoxLayout(w); layout->setMargin(0); - QLineEdit* r = new QLineEdit(w), * g = new QLineEdit(w), * b = new QLineEdit(w); - layout->addWidget(r); - layout->addWidget(g); - layout->addWidget(b); + + StrokeStyleListView* leftStrokeView = new StrokeStyleListView( + std::dynamic_pointer_cast(this->strokePair.first->materialStroke), w + ); + layout->addWidget(leftStrokeView); + + QtMaterialCheckBox* checkEachSideIndependent = new QtMaterialCheckBox(w); + checkEachSideIndependent->setText(QStringLiteral("启用两侧独立描边")); + checkEachSideIndependent->setChecked(enableEachSideIndependent); + layout->addWidget(checkEachSideIndependent); + + StrokeStyleListView* rightStrokeView = new StrokeStyleListView( + std::dynamic_pointer_cast(this->strokePair.second->materialStroke), w + ); + layout->addWidget(rightStrokeView); + rightStrokeView->setDisabled(!this->enableEachSideIndependent); + + QObject::connect(checkEachSideIndependent, &QtMaterialCheckBox::toggled, [this, rightStrokeView](bool toggled) { + this->enableEachSideIndependent = toggled; + rightStrokeView->setDisabled(!toggled); + }); //auto stroke = std::dynamic_pointer_cast(this->materialStyles[0]->materialStroke); //QColor* color = &(stroke->materialMap[1.0].color); - auto stroke = std::dynamic_pointer_cast(this->materialStyles[0]->materialStroke); + /*auto stroke = std::dynamic_pointer_cast(this->materialStyles[0]->materialStroke); QColor* color = &(stroke->material.color); r->setText(QString::number(color->red())); g->setText(QString::number(color->green())); @@ -84,7 +128,7 @@ QWidget* StrokeElementLayerStyle::getInputWidget() { color->setBlue(content.toInt()); } - }); + });*/ return w; } @@ -101,16 +145,16 @@ QWidget* StrokeElementLayerStyle::getListDisplayWidget() const StrokeElementLayerStyle::StrokeElementLayerStyle(const StrokeElementLayerStyle& other) { - materialStyles = std::vector>(other.materialStyles.size()); - for (size_t i = 0; i < other.materialStyles.size(); i++) - { - materialStyles[i] = std::dynamic_pointer_cast( - std::shared_ptr(std::move(other.materialStyles[i]->clone())) - ); - } + strokePair.first = std::dynamic_pointer_cast( + std::shared_ptr(std::move(other.strokePair.first->clone())) + ); + strokePair.second = std::dynamic_pointer_cast( + std::shared_ptr(std::move(other.strokePair.second->clone())) + ); + enableEachSideIndependent = other.enableEachSideIndependent; } -std::unique_ptr StrokeElementLayerStyle::clonePtr() const +std::unique_ptr StrokeElementLayerStyle::clone() const { return std::make_unique(StrokeElementLayerStyle(*this)); } @@ -153,7 +197,7 @@ FillElementLayerStyle::FillElementLayerStyle(const FillElementLayerStyle& other) } } -std::unique_ptr FillElementLayerStyle::clonePtr() const +std::unique_ptr FillElementLayerStyle::clone() const { return std::make_unique(FillElementLayerStyle(*this)); } diff --git a/ArchitectureColoredPainting/src/Editor/LayerStyle.h b/ArchitectureColoredPainting/src/Editor/LayerStyle.h index 6c3fb0d..3012ebe 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerStyle.h +++ b/ArchitectureColoredPainting/src/Editor/LayerStyle.h @@ -9,6 +9,8 @@ #include "../Renderer/Painting/MaterialStyleStroke.h" #include "../Renderer/Painting/MaterialStyleFill.h" +using Renderer::MaterialStyleStroke; + /** * 在进行Style的添加时,首先创建空对象,然后直接调用getInputWidget()方法 * 在进行Style的修改时,直接调用getInputWidget()方法 @@ -24,11 +26,14 @@ public: virtual QWidget* getInputWidget() = 0; virtual QWidget* getListDisplayWidget() const = 0; virtual ~LayerStyle() {}; - virtual std::unique_ptr clonePtr() const = 0; + virtual std::unique_ptr clone() const = 0; }; class StrokeElementLayerStyle : public LayerStyle { +private: + std::pair, std::shared_ptr> strokePair; + public: std::vector toBaseStyles() const override; QString getStyleName() const override; @@ -37,8 +42,9 @@ public: StrokeElementLayerStyle() = default; StrokeElementLayerStyle(const StrokeElementLayerStyle& other); ~StrokeElementLayerStyle() = default; - std::vector> materialStyles; - std::unique_ptr clonePtr() const override; + std::unique_ptr clone() const override; + + bool enableEachSideIndependent = false; }; class FillElementLayerStyle : public LayerStyle @@ -52,5 +58,5 @@ public: FillElementLayerStyle(const FillElementLayerStyle& other); ~FillElementLayerStyle() = default; std::vector> materialStyles; - std::unique_ptr clonePtr() const override; + std::unique_ptr clone() const override; }; \ No newline at end of file