diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj
index 8624824..a0e5563 100644
--- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj
+++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj
@@ -104,6 +104,7 @@
+
@@ -145,12 +146,14 @@
+
+
@@ -186,12 +189,14 @@
+
+
diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters
index 9363673..e019bc3 100644
--- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters
+++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters
@@ -59,9 +59,18 @@
{96f98afe-4250-44cb-a505-682a1d5932c3}
+
+ {2a8e109f-7791-46ad-8c86-fe22a651cbe7}
+
{7ead1a66-586a-4584-ae80-9e7a4e667364}
+
+ {be3f4585-c8ba-410f-8619-2adcd4349f02}
+
+
+ {b9732a33-aa2e-4f8d-886f-1b1730c66519}
+
@@ -108,9 +117,6 @@
Source Files\Renderer
-
- Source Files
-
Source Files\Renderer\Painting
@@ -153,12 +159,6 @@
Source Files\Renderer\Painting
-
- Source Files
-
-
- Source Files
-
Source Files\Renderer\Painting
@@ -183,8 +183,8 @@
Source Files\Editor\util
-
- Source Files
+
+ Source Files\Renderer\Preview
Source Files\Renderer
@@ -210,11 +210,29 @@
Source Files\Editor\util
-
- Source Files
+
+ Source Files\Editor\Style
- Source Files
+ Source Files\Editor\Style
+
+
+ Source Files\Editor\Style
+
+
+ Source Files\Editor
+
+
+ Source Files\Editor
+
+
+ Source Files\Editor
+
+
+ Source Files\Editor
+
+
+ Source Files\Editor
@@ -227,35 +245,41 @@
Header Files\Renderer
-
- Header Files
-
-
- Header Files
-
Header Files\Editor
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
Header Files\Editor
Header Files
-
- Header Files
+
+ Header Files\Editor\Style
- Header Files
+ Header Files\Editor\Style
+
+
+ Header Files\Editor
+
+
+ Header Files\Editor
+
+
+ Header Files\Editor
+
+
+ Header Files\Editor
+
+
+ Header Files\Editor
+
+
+ Header Files\Editor
+
+
+ Header Files\Editor
@@ -451,7 +475,7 @@
Header Files\Editor\util
- Header Files\Editor
+ Header Files\Editor\Style
diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/ColorPicker.cpp b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/ColorPicker.cpp
new file mode 100644
index 0000000..7010ae4
--- /dev/null
+++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/ColorPicker.cpp
@@ -0,0 +1,38 @@
+#include "ColorPicker.h"
+#include
+
+QString getStyleSheet(const QColor& color)
+{
+ return
+ "QPushButton#colorPicker {"
+ " border-style: solid;"
+ " border-width: 1px;"
+ " border-color: black;"
+ " background-color: " + color.name() + ";"
+ "}";
+}
+
+ColorPicker::ColorPicker(const QColor& color, QWidget* parent) : QPushButton(parent), color(color)
+{
+ this->setObjectName("colorPicker");
+ this->setStyleSheet(getStyleSheet(color));
+ connect(this, &QPushButton::clicked, this, &ColorPicker::onClicked);
+}
+
+QColor ColorPicker::getColor() const
+{
+ return color;
+}
+
+void ColorPicker::onClicked()
+{
+ QColorDialog dialog(this->color, this);
+ dialog.exec();
+ QColor newColor = dialog.selectedColor();
+ if (newColor.isValid() && this->color != newColor)
+ {
+ this->color = newColor;
+ this->setStyleSheet(getStyleSheet(newColor));
+ emit colorChanged(newColor);
+ }
+}
\ No newline at end of file
diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/ColorPicker.h b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/ColorPicker.h
new file mode 100644
index 0000000..aca00ea
--- /dev/null
+++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/ColorPicker.h
@@ -0,0 +1,16 @@
+#pragma once
+#include
+class ColorPicker : public QPushButton
+{
+ Q_OBJECT
+private:
+ QColor color;
+public:
+ ColorPicker(const QColor& color, QWidget* parent = nullptr);
+ QColor getColor() const;
+public slots:
+ void onClicked();
+signals:
+ void colorChanged(QColor newColor);
+};
+
diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleListView.cpp b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleListView.cpp
new file mode 100644
index 0000000..5cb0e9b
--- /dev/null
+++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleListView.cpp
@@ -0,0 +1,95 @@
+#include "StrokeStyleListView.h"
+#include "ColorPicker.h"
+
+constexpr int COLUMN_WIDTH = 0;
+constexpr int COLUMN_COLOR = 1;
+constexpr int COLUMN_METALLIC = 2;
+constexpr int COLUMN_ROUGHNESS = 3;
+
+StrokeStyleListView::StrokeStyleListView(
+ std::shared_ptr stroke,
+ QWidget* parent
+) : QTableWidget(parent), stroke(stroke)
+{
+ this->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContentsOnFirstShow);
+ this->setColumnCount(4);
+ this->setRowCount(stroke->materialMap.size());
+ QStringList headers;
+ headers.append(QStringLiteral("总线宽占比"));
+ headers.append(QStringLiteral("颜色"));
+ headers.append(QStringLiteral("金属度"));
+ headers.append(QStringLiteral("粗糙度"));
+ this->setHorizontalHeaderLabels(headers);
+ for (int row = 0; auto& strokePair : stroke->materialMap)
+ {
+ QTableWidgetItem* widthItem = new QTableWidgetItem;
+ widthItem->setData(Qt::EditRole, strokePair.first);
+ this->setItem(row, COLUMN_WIDTH, widthItem);
+
+ QColor* colorPtr = &(strokePair.second.color);
+ QTableWidgetItem* colorItem = new QTableWidgetItem;
+ colorItem->setData(Qt::DisplayRole, *colorPtr);
+ this->setItem(row, COLUMN_COLOR, colorItem);
+ ColorPicker* colorPicker = new ColorPicker(*colorPtr, this);
+ this->setCellWidget(row, COLUMN_COLOR, colorPicker);
+ connect(colorPicker, &ColorPicker::colorChanged, [this, colorPtr](QColor color) {
+ *colorPtr = color;
+ this->update();
+ });
+
+ QTableWidgetItem* metallicItem = new QTableWidgetItem;
+ metallicItem->setData(Qt::EditRole, strokePair.second.metallic);
+ this->setItem(row, COLUMN_METALLIC, metallicItem);
+
+ QTableWidgetItem* roughnessItem = new QTableWidgetItem;
+ roughnessItem->setData(Qt::EditRole, strokePair.second.roughness);
+ this->setItem(row, COLUMN_ROUGHNESS, roughnessItem);
+
+ row++;
+ }
+ connect(this, &StrokeStyleListView::currentItemChanged, this, &StrokeStyleListView::onCurrentItemChanged);
+ connect(this, &StrokeStyleListView::cellChanged, this, &StrokeStyleListView::onCellChanged);
+ this->adjustSize();
+}
+
+void StrokeStyleListView::onCurrentItemChanged(QTableWidgetItem* current, QTableWidgetItem* previous)
+{
+ int column = current->column();
+ if (column != COLUMN_COLOR)
+ {
+ this->currentItemValue = current->text();
+ }
+}
+
+void StrokeStyleListView::onCellChanged(int row, int column)
+{
+ auto changedItem = this->item(row, column);
+ auto changedItemValue = changedItem->text().toFloat();
+ if (changedItemValue < 0 || 1 < changedItemValue)
+ {
+ changedItem->setData(Qt::EditRole, this->currentItemValue.toFloat());
+ return;
+ }
+ auto changedWidth = this->item(row, COLUMN_WIDTH)->text().toFloat();
+ switch (row)
+ {
+ case COLUMN_WIDTH:
+ {
+ float oldWidth = this->currentItemValue.toFloat();
+ auto node = stroke->materialMap.extract(oldWidth);
+ node.key() = changedWidth;
+ stroke->materialMap.insert(std::move(node));
+ break;
+ }
+ case COLUMN_METALLIC:
+ {
+ stroke->materialMap[changedWidth].metallic = changedItemValue;
+ break;
+ }
+ case COLUMN_ROUGHNESS:
+ {
+ stroke->materialMap[changedWidth].roughness = changedItemValue;
+ break;
+ }
+ }
+}
\ No newline at end of file
diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleListView.h b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleListView.h
new file mode 100644
index 0000000..f12e400
--- /dev/null
+++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleListView.h
@@ -0,0 +1,21 @@
+#pragma once
+#include "LayerStyle.h"
+#include "../Renderer/Painting/MaterialStyleStroke.h"
+#include
+#include
+#include
+class StrokeStyleListView : public QTableWidget
+{
+ Q_OBJECT
+private:
+ QString currentItemValue;
+
+public:
+ StrokeStyleListView(std::shared_ptr stroke, QWidget* parent = nullptr);
+ std::shared_ptr stroke;
+
+protected slots:
+ void onCurrentItemChanged(QTableWidgetItem* current, QTableWidgetItem* previous);
+ void onCellChanged(int row, int column);
+};
+