From 846f334d5431768a280704359b8700a6463fc165 Mon Sep 17 00:00:00 2001 From: ArgonarioD Date: Fri, 10 Mar 2023 13:57:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90style=E7=9A=84=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E6=9E=84=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Editor/LayerStyle.cpp | 31 +++++--- .../src/Editor/LayerStyle.h | 8 +- .../src/Editor/LayerStyleDialog.cpp | 47 ++++++++--- .../src/Editor/LayerStyleDialog.h | 5 +- .../src/Editor/RightBar/InfoDisplayWidget.cpp | 77 ++++++++++++------- 5 files changed, 113 insertions(+), 55 deletions(-) diff --git a/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp b/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp index 5938023..d8bd001 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp +++ b/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp @@ -16,24 +16,19 @@ const std::vector() } }; -//const std::vector>> LayerStyle::types = { -// { -// QStringLiteral("宙円"), -// []() { return new StrokeElementLayerStyle; } -// }, -// { -// QStringLiteral("野割"), -// []() { return new FillElementLayerStyle; } -// } -//}; - std::vector StrokeElementLayerStyle::toBaseStyles() const { return std::vector(); } +QString StrokeElementLayerStyle::getStyleName() const +{ + return QStringLiteral("宙円"); +} + QWidget* StrokeElementLayerStyle::getInputWidget() const { + // TODO QLabel* le = new QLabel; le->setText(QStringLiteral("宙円")); return le; @@ -55,8 +50,14 @@ std::vector FillElementLayerStyle::toBaseStyles() const return std::vector(); } +QString FillElementLayerStyle::getStyleName() const +{ + return QStringLiteral("野割"); +} + QWidget* FillElementLayerStyle::getInputWidget() const { + // TODO QLineEdit* name = new QLineEdit; name->setText(QStringLiteral("野割")); return name; @@ -64,5 +65,11 @@ QWidget* FillElementLayerStyle::getInputWidget() const QWidget* FillElementLayerStyle::getListDisplayWidget() const { - return nullptr; + QWidget* w = new QWidget; + QLabel* name = new QLabel(w); + name->setText(QStringLiteral("野割")); + QHBoxLayout* layout = new QHBoxLayout(w); + layout->setMargin(0); + layout->addWidget(name); + return w; } \ No newline at end of file diff --git a/ArchitectureColoredPainting/src/Editor/LayerStyle.h b/ArchitectureColoredPainting/src/Editor/LayerStyle.h index 43b9d04..1d3730b 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerStyle.h +++ b/ArchitectureColoredPainting/src/Editor/LayerStyle.h @@ -20,7 +20,7 @@ class LayerStyle { public: const static std::vector()>>> types; - //const static std::vector>> types; + virtual QString getStyleName() const = 0; virtual QWidget* getInputWidget() const = 0; virtual QWidget* getListDisplayWidget() const = 0; virtual ~LayerStyle() {}; @@ -30,20 +30,22 @@ class StrokeElementLayerStyle : public Renderer::ElementStyle, public LayerStyle { public: std::vector toBaseStyles() const override; + QString getStyleName() const override; QWidget* getInputWidget() const override; QWidget* getListDisplayWidget() const override; StrokeElementLayerStyle() = default; ~StrokeElementLayerStyle() = default; - std::vector> materialStyles; + std::vector> materialStyles; }; class FillElementLayerStyle : public Renderer::ElementStyle, public LayerStyle { public: std::vector toBaseStyles() const override; + QString getStyleName() const override; QWidget* getInputWidget() const override; QWidget* getListDisplayWidget() const override; FillElementLayerStyle() = default; ~FillElementLayerStyle() = default; - std::vector> materialStyles; + std::vector> materialStyles; }; \ No newline at end of file diff --git a/ArchitectureColoredPainting/src/Editor/LayerStyleDialog.cpp b/ArchitectureColoredPainting/src/Editor/LayerStyleDialog.cpp index 53c6b49..dfa7e5a 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerStyleDialog.cpp +++ b/ArchitectureColoredPainting/src/Editor/LayerStyleDialog.cpp @@ -3,8 +3,13 @@ #include #include #include +#include -LayerStyleDialog::LayerStyleDialog(QWidget* parent, std::shared_ptr existedStyle) : QDialog(parent) +LayerStyleDialog::LayerStyleDialog( + QWidget* parent, + std::shared_ptr existedStyle, + std::vector>* excludeStyles +) : QDialog(parent) { QVBoxLayout* dialogLayout = new QVBoxLayout(this); dialogLayout->setAlignment(Qt::AlignmentFlag::AlignHCenter); @@ -21,20 +26,38 @@ LayerStyleDialog::LayerStyleDialog(QWidget* parent, std::shared_ptr } else { - this->layerStyle = LayerStyle::types[0].second(); + std::unordered_set excludeStyleNames; + for(auto &style : *excludeStyles) + { + excludeStyleNames.insert(style->getStyleName()); + } QComboBox* typeSelector = new QComboBox(this); - for (auto& pair : LayerStyle::types) { - typeSelector->addItem(pair.first); - } - dialogLayout->addWidget(typeSelector); - this->styleContainer = new QGridLayout(this); - dialogLayout->addLayout(styleContainer); - this->styleWidget = this->layerStyle->getInputWidget(); - this->styleWidget->setParent(this); - this->styleContainer->addWidget(styleWidget); - connect(typeSelector, QOverload::of(&QComboBox::currentIndexChanged), this, &LayerStyleDialog::onStyleTypeSelectorChanged); + for (auto& pair : LayerStyle::types) + { + if (!excludeStyleNames.contains(pair.first)) + { + typeSelector->addItem(pair.first); + if (!this->layerStyle) + { + this->layerStyle = pair.second(); + } + } + } + + if (typeSelector->count() > 0) + { + dialogLayout->addWidget(typeSelector); + this->styleContainer = new QGridLayout(this); + dialogLayout->addLayout(styleContainer); + + this->styleWidget = this->layerStyle->getInputWidget(); + this->styleWidget->setParent(this); + this->styleContainer->addWidget(styleWidget); + connect(typeSelector, QOverload::of(&QComboBox::currentIndexChanged), + this, &LayerStyleDialog::onStyleTypeSelectorChanged); + } } } diff --git a/ArchitectureColoredPainting/src/Editor/LayerStyleDialog.h b/ArchitectureColoredPainting/src/Editor/LayerStyleDialog.h index 7f73672..d96d448 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerStyleDialog.h +++ b/ArchitectureColoredPainting/src/Editor/LayerStyleDialog.h @@ -10,7 +10,10 @@ private: QWidget* styleWidget; QGridLayout* styleContainer; public: - LayerStyleDialog(QWidget* parent = nullptr, std::shared_ptr existedStyle = nullptr); + LayerStyleDialog( + QWidget* parent = nullptr, + std::shared_ptr existedStyle = nullptr, + std::vector>* excludeStyles = nullptr); std::shared_ptr layerStyle; private slots: void onStyleTypeSelectorChanged(int index); diff --git a/ArchitectureColoredPainting/src/Editor/RightBar/InfoDisplayWidget.cpp b/ArchitectureColoredPainting/src/Editor/RightBar/InfoDisplayWidget.cpp index 7f0e3b3..21bffff 100644 --- a/ArchitectureColoredPainting/src/Editor/RightBar/InfoDisplayWidget.cpp +++ b/ArchitectureColoredPainting/src/Editor/RightBar/InfoDisplayWidget.cpp @@ -3,10 +3,11 @@ #include #include #include -#include #include #include #include +#include +#include void InfoDisplayWidget::setLayer(LayerWrapper *layer) { @@ -88,12 +89,27 @@ void InfoDisplayWidget::generateLayerForm() headerLabel->setText("桁茵"); headerLabel->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + //QtMaterialRaisedButton* addStyleButton = new QtMaterialRaisedButton("+", headerWidget); QPushButton* addStyleButton = new QPushButton("+", headerWidget); addStyleButton->setFixedSize(QSize(20, 20)); - connect(addStyleButton, &QPushButton::clicked, [this]() { - QDialog* dialog = new LayerStyleDialog(this); + if (leafP->styles.size() >= LayerStyle::types.size()) + { + addStyleButton->setDisabled(true); + } + else + { + connect(addStyleButton, &QPushButton::clicked, [&, leafP]() { + LayerStyleDialog* dialog = new LayerStyleDialog(nullptr, nullptr, &(leafP->styles)); dialog->exec(); - }); + if (dialog->layerStyle) + { + leafP->styles.push_back(dialog->layerStyle); + emit requireRefreshPreview(); + emit requireSelfRefresh(); + } + dialog->deleteLater(); + }); + } headerLayout->addWidget(headerLabel); headerLayout->addWidget(addStyleButton); @@ -153,53 +169,60 @@ void InfoDisplayWidget::generateLayerForm() // for (int i = 0; i < styleNames.size(); i++) // createStyleItem(i); - if (leafP->styles.empty()) + /*if (leafP->styles.empty()) { leafP->styles.push_back(std::shared_ptr(new StrokeElementLayerStyle())); - } - for (auto& style : leafP->styles) + }*/ + std::vector>* styles = &(leafP->styles); + for (auto styleIterator = styles->begin(); styleIterator != styles->end(); styleIterator++) { QListWidgetItem* item = new QListWidgetItem; QWidget* w = new QWidget; item->setSizeHint(QSize(50, 40)); QHBoxLayout* layout = new QHBoxLayout; layout->setAlignment(Qt::AlignmentFlag::AlignRight); + //QtMaterialFlatButton* detailButton = new QtMaterialFlatButton(w); + //QtMaterialFlatButton* removeButton = new QtMaterialFlatButton(w); QPushButton* detailButton = new QPushButton(w); - QPushButton* deleteButton = new QPushButton(w); + QPushButton* removeButton = new QPushButton(w); detailButton->setText("..."); detailButton->setFixedSize(QSize(20, 20)); - deleteButton->setText(""); - deleteButton->setFixedSize(QSize(20, 20)); + removeButton->setText(""); + removeButton->setFixedSize(QSize(20, 20)); - connect(detailButton, &QPushButton::clicked, [this, &style]() { - LayerStyleDialog* dialog = new LayerStyleDialog(this, style); - /*dialog->setAttribute(Qt::WA_DeleteOnClose); - QVBoxLayout* layout = new QVBoxLayout(dialog); + connect(detailButton, &QPushButton::clicked, this, + [=]() + { + LayerStyleDialog* dialog = new LayerStyleDialog(nullptr, *styleIterator); + dialog->exec(); - QComboBox* typeSelector = new QComboBox(dialog); - for (auto &pair : LayerStyle::types) { - typeSelector->addItem(pair.first); - } - - layout->addWidget(typeSelector); - QWidget* styleWidget = style->getInputWidget(); - styleWidget->setParent(dialog); - layout->addWidget(styleWidget);*/ - dialog->exec(); + if (dialog->layerStyle) + { + emit requireRefreshPreview(); + emit requireSelfRefresh(); + } + dialog->deleteLater(); }); - QWidget* styleDisplayWidget = style->getListDisplayWidget(); + connect(removeButton, &QPushButton::clicked, this, + [this, styleIterator, styles]() + { + styles->erase(styleIterator); + emit requireRefreshPreview(); + emit requireSelfRefresh(); + }); + + QWidget* styleDisplayWidget = (*styleIterator)->getListDisplayWidget(); styleDisplayWidget->setParent(w); styleDisplayWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); layout->addWidget(styleDisplayWidget); layout->addWidget(detailButton); - layout->addWidget(deleteButton); + layout->addWidget(removeButton); w->setLayout(layout); styleList->addItem(item); styleList->setItemWidget(item, w); - //style->addListItem(styleList); } layout->addRow(styleList); }