From 28df3d47c5d8ab14fc1eb1198cc57333ad58f897 Mon Sep 17 00:00:00 2001 From: ArgonarioD Date: Tue, 14 Mar 2023 17:57:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86ColorPicker=E7=B1=BB?= =?UTF-8?q?=E5=92=8CStrokeStyleListView=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ArchitectureColoredPainting.vcxproj | 5 + ...rchitectureColoredPainting.vcxproj.filters | 90 +++++++++++------- .../EditorWidgetComponent/ColorPicker.cpp | 38 ++++++++ .../EditorWidgetComponent/ColorPicker.h | 16 ++++ .../StrokeStyleListView.cpp | 95 +++++++++++++++++++ .../StrokeStyleListView.h | 21 ++++ 6 files changed, 232 insertions(+), 33 deletions(-) create mode 100644 ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/ColorPicker.cpp create mode 100644 ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/ColorPicker.h create mode 100644 ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleListView.cpp create mode 100644 ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleListView.h 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); +}; +