From 214fa0f82f145a979d1389379d166e6669319ffa Mon Sep 17 00:00:00 2001 From: ArgonarioD Date: Thu, 23 Mar 2023 15:02:44 +0800 Subject: [PATCH] =?UTF-8?q?[editor]=20=E4=BF=AE=E6=94=B9=E4=BA=86style?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84=E4=B8=80=E4=BA=9B=E4=B8=9C=E8=A5=BF?= =?UTF-8?q?=20#30=20=20*=20=E5=B0=86LayerStyleContainer=E7=9A=84=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E8=BF=90=E7=AE=97=E7=AC=A6=E4=BB=8E<<=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E4=BA=86=20|=20=20*=20=E8=B0=83=E6=95=B4=E4=BA=86Laye?= =?UTF-8?q?rContainerListWidget=E7=9A=84UI=20=20*=20fix:=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E6=8F=8F=E8=BE=B9=E6=97=B6=E5=8F=AF=E8=83=BD=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=A9=BA=E6=8C=87=E9=92=88=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EditorLayerInfoWidget.ui | 4 +- .../LayerContainerListWidget.cpp | 53 ++++++++++++------- .../LayerContainerListWidget.h | 7 ++- .../StrokeStyleWidget.cpp | 6 +-- .../src/Editor/LayerStyle.cpp | 2 +- .../src/Editor/LayerStyle.h | 5 +- .../src/Editor/RightBar/InfoDisplayWidget.cpp | 1 + UnitTest/LayerStyleTest.cpp | 2 +- 8 files changed, 50 insertions(+), 30 deletions(-) diff --git a/ArchitectureColoredPainting/EditorLayerInfoWidget.ui b/ArchitectureColoredPainting/EditorLayerInfoWidget.ui index 5d1bca3..7e3b901 100644 --- a/ArchitectureColoredPainting/EditorLayerInfoWidget.ui +++ b/ArchitectureColoredPainting/EditorLayerInfoWidget.ui @@ -71,7 +71,7 @@ - + @@ -88,7 +88,7 @@ LayerContainerListWidget - QListWidget + QWidget
EditorWidgetComponent/LayerContainerListWidget.h
diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerContainerListWidget.cpp b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerContainerListWidget.cpp index 0a76cb3..c28a7e1 100644 --- a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerContainerListWidget.cpp +++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerContainerListWidget.cpp @@ -1,17 +1,28 @@ #include "LayerContainerListWidget.h" #include "LayerStyleDialog.h" +#include "../ColorHelper.hpp" #include #include +inline void initMaterialButton(QtMaterialRaisedButton* button) +{ + button->setFixedHeight(25); + button->setBackgroundColor(ColorHelper::instance().getPrimary1()); +} + LayerContainerListWidget::LayerContainerListWidget(QWidget* parent, const PLayerStyleContainer& styleContainer) - : QListWidget(parent), styleContainer(styleContainer) + : QWidget(parent), headerWidget(new QWidget(this)), styleList(new QListWidget(this)), styleContainer(styleContainer) { connect(this, &LayerContainerListWidget::addLayerStyle, this, &LayerContainerListWidget::onAddLayerStyle); connect(this, &LayerContainerListWidget::removeLayerStyle, this, &LayerContainerListWidget::onRemoveLayerStyle); + auto* widgetLayout = new QVBoxLayout(this); initHeader(); + widgetLayout->addWidget(this->headerWidget); + + widgetLayout->addWidget(this->styleList); setStyleContainer(styleContainer, true); } @@ -35,12 +46,7 @@ void LayerContainerListWidget::setStyleContainer(const PLayerStyleContainer& sty return; } - const int count = this->count(); - for (int i = 1; i < count; i++) - { - const auto* item = this->takeItem(1); - delete item; - } + styleList->clear(); if (!styleContainer) { @@ -49,11 +55,11 @@ void LayerContainerListWidget::setStyleContainer(const PLayerStyleContainer& sty this->styleContainer = styleContainer; - for (auto& style : *styleContainer | std::views::values) + for (const auto& style : *styleContainer | std::views::values) { - auto* item = new QListWidgetItem(this); + auto* item = new QListWidgetItem(styleList); item->setSizeHint(QSize(50, 40)); - this->setItemWidget(item, buildStyleListWidget(style)); + styleList->setItemWidget(item, buildStyleListWidget(style)); } resetAddButton(); } @@ -79,10 +85,10 @@ void LayerContainerListWidget::onAddLayerStyle(const std::shared_ptr { styleContainer->computeNewHash(); resetAddButton(); - auto* newItem = new QListWidgetItem(this); + auto* newItem = new QListWidgetItem(styleList); styleItemMap[style->getDisplayName()] = newItem; newItem->setSizeHint(QSize(50, 40)); - this->setItemWidget(newItem, buildStyleListWidget(style)); + styleList->setItemWidget(newItem, buildStyleListWidget(style)); } } @@ -93,22 +99,20 @@ void LayerContainerListWidget::onRemoveLayerStyle(const QString& styleName) styleContainer->computeNewHash(); auto* removedItem = styleItemMap.extract(styleName).mapped(); resetAddButton(); - delete this->takeItem(this->row(removedItem)); + delete styleList->takeItem(styleList->row(removedItem)); } } void LayerContainerListWidget::initHeader() { - this->headerWidget = new QWidget(this); auto* headerLayout = new QHBoxLayout; auto* headerLabel = new QLabel(headerWidget); headerLabel->setText(QStringLiteral("样式列表")); - headerLabel->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + headerLabel->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum)); - //auto* addStyleButton = new QtMaterialRaisedButton("+", headerWidget); - this->addButton = new QPushButton("+", headerWidget); - addButton->setFixedSize(QSize(20, 20)); + this->addButton = new QtMaterialRaisedButton("+", headerWidget); + initMaterialButton(addButton); connect(addButton, &QPushButton::clicked, [this] { auto* dialog = new LayerStyleDialog(this->styleContainer, nullptr, this); dialog->exec(); @@ -118,15 +122,24 @@ void LayerContainerListWidget::initHeader() } }); + this->copyButton = new QtMaterialRaisedButton(QStringLiteral("复制所有样式"), headerWidget); + initMaterialButton(copyButton); + // TODO: 实现复制 + + this->pasteButton = new QtMaterialRaisedButton(QStringLiteral("从剪贴板粘贴"), headerWidget); + initMaterialButton(pasteButton); + headerLayout->addWidget(headerLabel); headerLayout->addWidget(addButton); + headerLayout->addWidget(copyButton); + headerLayout->addWidget(pasteButton); headerLayout->setContentsMargins(5, 0, 5, 0); headerWidget->setLayout(headerLayout); - auto* headerItem = new QListWidgetItem(this); + /*auto* headerItem = new QListWidgetItem(this); headerItem->setFlags(Qt::NoItemFlags); this->addItem(headerItem); - this->setItemWidget(headerItem, headerWidget); + this->setItemWidget(headerItem, headerWidget);*/ } diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerContainerListWidget.h b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerContainerListWidget.h index 4536e46..819e747 100644 --- a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerContainerListWidget.h +++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerContainerListWidget.h @@ -4,13 +4,16 @@ #include #include "LayerStyle.h" -class LayerContainerListWidget : public QListWidget +class LayerContainerListWidget : public QWidget { Q_OBJECT using PLayerStyleContainer = LayerStyleContainer*; private: QWidget* headerWidget; - QPushButton* addButton; + QtMaterialRaisedButton* addButton; + QtMaterialRaisedButton* copyButton; + QtMaterialRaisedButton* pasteButton; + QListWidget* styleList; PLayerStyleContainer styleContainer; std::map styleItemMap; diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleWidget.cpp b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleWidget.cpp index a8699f9..a1717e5 100644 --- a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleWidget.cpp +++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/StrokeStyleWidget.cpp @@ -180,9 +180,9 @@ void StrokeStyleWidget::setTableRow(int row, float width, Renderer::Material& ma removeButton->setBackgroundColor(ColorHelper::instance().getPrimary1()); removeButton->setFixedSize(20, 20); strokeTable->setCellWidget(row, COLUMN_OPERATIONS, removeButton); - connect(removeButton, &QtMaterialRaisedButton::clicked, [this, row] { - radialStroke(this->stroke)->materialMap.erase(this->strokeTable->item(row, COLUMN_WIDTH)->text().toFloat()); - this->strokeTable->removeRow(row); + connect(removeButton, &QtMaterialRaisedButton::clicked, [this, widthItem] { + radialStroke(this->stroke)->materialMap.erase(widthItem->data(Qt::EditRole).toFloat()); + this->strokeTable->removeRow(widthItem->row()); }); } diff --git a/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp b/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp index aabc5de..fbf5486 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp +++ b/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp @@ -275,7 +275,7 @@ bool LayerStyleContainer::operator==(const LayerStyleContainer& other) const return std::ranges::equal(styles | std::views::values, other.styles | std::views::values); } -LayerStyleContainer LayerStyleContainer::operator<<(const LayerStyleContainer& other) const +LayerStyleContainer LayerStyleContainer::operator|(const LayerStyleContainer& other) const { LayerStyleContainer result = other; for (const auto& style : std::ranges::subrange(this->cbegin(), this->cend()) diff --git a/ArchitectureColoredPainting/src/Editor/LayerStyle.h b/ArchitectureColoredPainting/src/Editor/LayerStyle.h index f60cfd4..5dfa36c 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerStyle.h +++ b/ArchitectureColoredPainting/src/Editor/LayerStyle.h @@ -144,7 +144,10 @@ public: [[nodiscard]] size_t getHash() const; [[nodiscard]] bool operator==(const LayerStyleContainer& other) const; - [[nodiscard]] LayerStyleContainer operator<<(const LayerStyleContainer& other) const; + /** + * 类管道操作,后者覆盖前者,会返回一个新的LayerStyleContainer + */ + [[nodiscard]] LayerStyleContainer operator|(const LayerStyleContainer& other) const; /** * 需要在每次更改后手动调用 diff --git a/ArchitectureColoredPainting/src/Editor/RightBar/InfoDisplayWidget.cpp b/ArchitectureColoredPainting/src/Editor/RightBar/InfoDisplayWidget.cpp index c4e4256..588e17b 100644 --- a/ArchitectureColoredPainting/src/Editor/RightBar/InfoDisplayWidget.cpp +++ b/ArchitectureColoredPainting/src/Editor/RightBar/InfoDisplayWidget.cpp @@ -1,5 +1,6 @@ #include "InfoDisplayWidget.h" #include "./EditorWidgetComponent/LayerStyleDialog.h" +#include "../ColorHelper.hpp" #include #include #include diff --git a/UnitTest/LayerStyleTest.cpp b/UnitTest/LayerStyleTest.cpp index 3bc7622..5b76166 100644 --- a/UnitTest/LayerStyleTest.cpp +++ b/UnitTest/LayerStyleTest.cpp @@ -41,7 +41,7 @@ namespace UnitTest TEST_METHOD(ContainerCoverTest) { - const auto newContainer = containerParent << containerChild; + const auto& newContainer = containerParent | containerChild; Assert::IsTrue(newContainer.full()); Assert::AreEqual(newContainer.getHash(), containerChild.getHash()); }