Compare commits
2 Commits
1ef08dc49e
...
0aa69195b3
Author | SHA1 | Date |
---|---|---|
ArgonarioD | 0aa69195b3 | |
ArgonarioD | 21aeb0832b |
|
@ -3,7 +3,9 @@
|
||||||
#include "../ColorHelper.hpp"
|
#include "../ColorHelper.hpp"
|
||||||
#include <qtmaterialraisedbutton.h>
|
#include <qtmaterialraisedbutton.h>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <array>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
constexpr int COLUMN_WIDTH = 0;
|
constexpr int COLUMN_WIDTH = 0;
|
||||||
constexpr int COLUMN_COLOR = 1;
|
constexpr int COLUMN_COLOR = 1;
|
||||||
|
@ -16,8 +18,13 @@ inline Renderer::Material newMaterial()
|
||||||
return {ColorHelper::instance().getPrimary1()};
|
return {ColorHelper::instance().getPrimary1()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool isClosedStroke(const std::shared_ptr<MaterialStyleStroke>& stroke)
|
||||||
|
{
|
||||||
|
return stroke->endType == Renderer::StrokeEndType::kClosed;
|
||||||
|
}
|
||||||
|
|
||||||
StrokeStyleWidget::StrokeStyleWidget(
|
StrokeStyleWidget::StrokeStyleWidget(
|
||||||
std::shared_ptr<MaterialStyleStroke> stroke,
|
const std::shared_ptr<MaterialStyleStroke>& stroke,
|
||||||
QWidget* parent
|
QWidget* parent
|
||||||
) : QWidget(parent), stroke(stroke)
|
) : QWidget(parent), stroke(stroke)
|
||||||
{
|
{
|
||||||
|
@ -37,7 +44,10 @@ StrokeStyleWidget::StrokeStyleWidget(
|
||||||
|
|
||||||
strokeProperties->setLayout(strokePropertiesLayout);
|
strokeProperties->setLayout(strokePropertiesLayout);
|
||||||
strokePropertiesLayout->addWidget(enableGradual);
|
strokePropertiesLayout->addWidget(enableGradual);
|
||||||
strokePropertiesLayout->addWidget(endTypeBox);
|
if (!isClosedStroke(stroke))
|
||||||
|
{
|
||||||
|
strokePropertiesLayout->addWidget(endTypeBox);
|
||||||
|
}
|
||||||
|
|
||||||
viewLayout->addWidget(strokeProperties);
|
viewLayout->addWidget(strokeProperties);
|
||||||
viewLayout->addWidget(widthField);
|
viewLayout->addWidget(widthField);
|
||||||
|
@ -60,30 +70,23 @@ void StrokeStyleWidget::initStrokeSettings()
|
||||||
radialStroke(this->stroke)->gradual = checked;
|
radialStroke(this->stroke)->gradual = checked;
|
||||||
});
|
});
|
||||||
|
|
||||||
#define endTypeBoxLabel(start, end) QStringLiteral(start##" -> "##end)
|
if (!isClosedStroke(stroke))
|
||||||
this->endTypeBox = new QComboBox(this);
|
{
|
||||||
endTypeBox->addItem(endTypeBoxLabel("Բͷ", "Բͷ")); // kRound
|
this->endTypeBox = new QComboBox(this);
|
||||||
endTypeBox->addItem(endTypeBoxLabel("ƽͷ", "Բͷ")); // kFlatRound
|
for (const auto& displayName : MaterialStyleStroke::strokeEndTypeNames | std::views::keys)
|
||||||
endTypeBox->addItem(endTypeBoxLabel("Բͷ", "ƽͷ")); // kRoundFlat
|
|
||||||
endTypeBox->addItem(endTypeBoxLabel("ƽͷ", "ƽͷ")); // kFlat
|
|
||||||
endTypeBox->setCurrentIndex(static_cast<int>(this->stroke->endType));
|
|
||||||
connect(endTypeBox, QOverload<int>::of(&QComboBox::currentIndexChanged), [this](int index) {
|
|
||||||
switch (index)
|
|
||||||
{
|
{
|
||||||
case 0:
|
endTypeBox->addItem(displayName);
|
||||||
this->stroke->endType = Renderer::StrokeEndType::kRound;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
this->stroke->endType = Renderer::StrokeEndType::kFlatRound;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
this->stroke->endType = Renderer::StrokeEndType::kRoundFlat;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
this->stroke->endType = Renderer::StrokeEndType::kFlat;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
});
|
endTypeBox->setCurrentIndex(static_cast<int>(this->stroke->endType));
|
||||||
|
connect(endTypeBox, QOverload<int>::of(&QComboBox::currentIndexChanged), [this](int index) {
|
||||||
|
const auto& [displayName, endType] = MaterialStyleStroke::strokeEndTypeNames[index];
|
||||||
|
this->stroke->endType = endType;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->endTypeBox = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
this->widthField = new QtMaterialTextField(this);
|
this->widthField = new QtMaterialTextField(this);
|
||||||
widthField->setLabel(QStringLiteral("±¾²àÃè±ß¿í¶È"));
|
widthField->setLabel(QStringLiteral("±¾²àÃè±ß¿í¶È"));
|
||||||
|
@ -99,7 +102,7 @@ void StrokeStyleWidget::initStrokeSettings()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void StrokeStyleWidget::initTable(std::shared_ptr<Renderer::StrokeRadialGradient> materialStroke)
|
void StrokeStyleWidget::initTable(const std::shared_ptr<Renderer::StrokeRadialGradient>& materialStroke)
|
||||||
{
|
{
|
||||||
this->strokeTable = new QTableWidget(this);
|
this->strokeTable = new QTableWidget(this);
|
||||||
strokeTable->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContentsOnFirstShow);
|
strokeTable->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContentsOnFirstShow);
|
||||||
|
@ -132,22 +135,22 @@ void StrokeStyleWidget::initAddButton()
|
||||||
addButton->setBackgroundColor(ColorHelper::instance().getPrimary1());
|
addButton->setBackgroundColor(ColorHelper::instance().getPrimary1());
|
||||||
connect(addButton, &QtMaterialRaisedButton::clicked, [this] {
|
connect(addButton, &QtMaterialRaisedButton::clicked, [this] {
|
||||||
handlingRowInsert = true;
|
handlingRowInsert = true;
|
||||||
auto materialMap = &radialStroke(this->stroke)->materialMap;
|
auto& materialMap = radialStroke(this->stroke)->materialMap;
|
||||||
float newWidth;
|
float newWidth;
|
||||||
if (materialMap->empty())
|
if (materialMap.empty())
|
||||||
{
|
{
|
||||||
newWidth = 1.f;
|
newWidth = 1.f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const auto firstPair = materialMap->begin();
|
const auto firstPair = materialMap.begin();
|
||||||
newWidth = firstPair->first / 2;
|
newWidth = firstPair->first / 2;
|
||||||
}
|
}
|
||||||
const Renderer::Material newMaterial(ColorHelper::instance().getPrimary1());
|
const Renderer::Material newMaterial(ColorHelper::instance().getPrimary1());
|
||||||
(*materialMap)[newWidth] = newMaterial;
|
materialMap[newWidth] = newMaterial;
|
||||||
int newRow = this->strokeTable->rowCount();
|
const int newRow = this->strokeTable->rowCount();
|
||||||
this->strokeTable->insertRow(newRow);
|
this->strokeTable->insertRow(newRow);
|
||||||
setTableRow(newRow, newWidth, (*materialMap)[newWidth]);
|
setTableRow(newRow, newWidth, materialMap[newWidth]);
|
||||||
this->strokeTable->update();
|
this->strokeTable->update();
|
||||||
handlingRowInsert = false;
|
handlingRowInsert = false;
|
||||||
});
|
});
|
||||||
|
@ -166,7 +169,7 @@ void StrokeStyleWidget::setTableRow(int row, float width, Renderer::Material& ma
|
||||||
auto* colorPicker = new ColorPicker(*colorPtr, strokeTable);
|
auto* colorPicker = new ColorPicker(*colorPtr, strokeTable);
|
||||||
strokeTable->setCellWidget(row, COLUMN_COLOR, colorPicker);
|
strokeTable->setCellWidget(row, COLUMN_COLOR, colorPicker);
|
||||||
connect(colorPicker, &ColorPicker::colorChanged, [this, colorPtr](QColor color) {
|
connect(colorPicker, &ColorPicker::colorChanged, [this, colorPtr](QColor color) {
|
||||||
*colorPtr = color;
|
*colorPtr = std::move(color);
|
||||||
this->strokeTable->update();
|
this->strokeTable->update();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -191,7 +194,7 @@ void StrokeStyleWidget::setTableRow(int row, float width, Renderer::Material& ma
|
||||||
void StrokeStyleWidget::onCurrentItemChanged(QTableWidgetItem* current, QTableWidgetItem* previous)
|
void StrokeStyleWidget::onCurrentItemChanged(QTableWidgetItem* current, QTableWidgetItem* previous)
|
||||||
{
|
{
|
||||||
if (!current) return;
|
if (!current) return;
|
||||||
int column = current->column();
|
const int column = current->column();
|
||||||
if (column != COLUMN_COLOR && column != COLUMN_OPERATIONS)
|
if (column != COLUMN_COLOR && column != COLUMN_OPERATIONS)
|
||||||
{
|
{
|
||||||
this->currentItemValue = current->data(Qt::EditRole);
|
this->currentItemValue = current->data(Qt::EditRole);
|
||||||
|
@ -201,14 +204,14 @@ void StrokeStyleWidget::onCurrentItemChanged(QTableWidgetItem* current, QTableWi
|
||||||
void StrokeStyleWidget::onCellChanged(int row, int column)
|
void StrokeStyleWidget::onCellChanged(int row, int column)
|
||||||
{
|
{
|
||||||
if (handlingRowInsert) return;
|
if (handlingRowInsert) return;
|
||||||
auto changedItem = strokeTable->item(row, column);
|
const auto changedItem = strokeTable->item(row, column);
|
||||||
auto changedItemValue = changedItem->text().toFloat();
|
const auto changedItemValue = changedItem->text().toFloat();
|
||||||
if (changedItemValue < 0 || 1 < changedItemValue)
|
if (changedItemValue < 0 || 1 < changedItemValue)
|
||||||
{
|
{
|
||||||
changedItem->setData(Qt::EditRole, this->currentItemValue.toFloat());
|
changedItem->setData(Qt::EditRole, this->currentItemValue.toFloat());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto changedWidth = strokeTable->item(row, COLUMN_WIDTH)->data(Qt::EditRole).toFloat();
|
const auto changedWidth = strokeTable->item(row, COLUMN_WIDTH)->data(Qt::EditRole).toFloat();
|
||||||
switch (column)
|
switch (column)
|
||||||
{
|
{
|
||||||
case COLUMN_WIDTH:
|
case COLUMN_WIDTH:
|
||||||
|
|
|
@ -21,12 +21,12 @@ private:
|
||||||
bool handlingRowInsert = false;
|
bool handlingRowInsert = false;
|
||||||
|
|
||||||
void initStrokeSettings();
|
void initStrokeSettings();
|
||||||
void initTable(std::shared_ptr<Renderer::StrokeRadialGradient> materialStroke);
|
void initTable(const std::shared_ptr<Renderer::StrokeRadialGradient>& materialStroke);
|
||||||
void initAddButton();
|
void initAddButton();
|
||||||
void setTableRow(int row, float width, Renderer::Material& material);
|
void setTableRow(int row, float width, Renderer::Material& material);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StrokeStyleWidget(std::shared_ptr<MaterialStyleStroke> stroke, QWidget* parent = nullptr);
|
StrokeStyleWidget(const std::shared_ptr<MaterialStyleStroke>& stroke, QWidget* parent = nullptr);
|
||||||
std::shared_ptr<MaterialStyleStroke> stroke;
|
std::shared_ptr<MaterialStyleStroke> stroke;
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
|
|
|
@ -248,18 +248,18 @@ std::unique_ptr<StrokeElementLayerStyle> StrokeElementLayerStyle::fromJson(const
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
StrokeElementLayerStyle::StrokeElementLayerStyle()
|
StrokeElementLayerStyle::StrokeElementLayerStyle(bool isClosed)
|
||||||
{
|
{
|
||||||
const auto materialMap = std::map<float, Renderer::Material>();
|
const auto materialMap = std::map<float, Renderer::Material>();
|
||||||
this->strokePair.first = std::make_shared<MaterialStyleStroke>(
|
this->strokePair.first = std::make_shared<MaterialStyleStroke>(
|
||||||
7,
|
7,
|
||||||
Renderer::StrokeType::kLeftSide, Renderer::StrokeEndType::kFlat,
|
Renderer::StrokeType::kLeftSide, isClosed ? Renderer::StrokeEndType::kClosed : Renderer::StrokeEndType::kFlat,
|
||||||
std::make_shared<Renderer::StrokeRadialGradient>(materialMap, false)
|
std::make_shared<Renderer::StrokeRadialGradient>(materialMap, false)
|
||||||
);
|
);
|
||||||
|
|
||||||
this->strokePair.second = std::make_shared<MaterialStyleStroke>(
|
this->strokePair.second = std::make_shared<MaterialStyleStroke>(
|
||||||
7,
|
7,
|
||||||
Renderer::StrokeType::kRightSide, Renderer::StrokeEndType::kFlat,
|
Renderer::StrokeType::kRightSide, isClosed ? Renderer::StrokeEndType::kClosed : Renderer::StrokeEndType::kFlat,
|
||||||
std::make_shared<Renderer::StrokeRadialGradient>(materialMap, false)
|
std::make_shared<Renderer::StrokeRadialGradient>(materialMap, false)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ public:
|
||||||
STYLE_NAME("Ãè±ß", "stroke")
|
STYLE_NAME("Ãè±ß", "stroke")
|
||||||
static std::unique_ptr<StrokeElementLayerStyle> fromJson(const QJsonObject& json);
|
static std::unique_ptr<StrokeElementLayerStyle> fromJson(const QJsonObject& json);
|
||||||
|
|
||||||
StrokeElementLayerStyle();
|
StrokeElementLayerStyle(bool isClosed);
|
||||||
StrokeElementLayerStyle(const PMaterialStyleStroke& left, const PMaterialStyleStroke& right = nullptr);
|
StrokeElementLayerStyle(const PMaterialStyleStroke& left, const PMaterialStyleStroke& right = nullptr);
|
||||||
StrokeElementLayerStyle(const StrokeElementLayerStyle& other);
|
StrokeElementLayerStyle(const StrokeElementLayerStyle& other);
|
||||||
~StrokeElementLayerStyle() override = default;
|
~StrokeElementLayerStyle() override = default;
|
||||||
|
@ -88,17 +88,23 @@ public:
|
||||||
class LayerStyleContainer : public Renderer::ElementStyle
|
class LayerStyleContainer : public Renderer::ElementStyle
|
||||||
{
|
{
|
||||||
using DisplayNameWithSupplier = std::map<QString, std::function<std::unique_ptr<LayerStyle>()>>;
|
using DisplayNameWithSupplier = std::map<QString, std::function<std::unique_ptr<LayerStyle>()>>;
|
||||||
private:
|
|
||||||
|
|
||||||
inline const static DisplayNameWithSupplier commonStyles = { {
|
private:
|
||||||
|
inline const static DisplayNameWithSupplier commonStyles = { };
|
||||||
|
inline const static DisplayNameWithSupplier closedOnlyStyles = {
|
||||||
|
{
|
||||||
|
FillElementLayerStyle::displayName(),
|
||||||
|
[] { return std::make_unique<FillElementLayerStyle>(); }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
StrokeElementLayerStyle::displayName(),
|
||||||
|
[] { return std::make_unique<StrokeElementLayerStyle>(true); }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
inline const static DisplayNameWithSupplier unclosedOnlyStyles = { {
|
||||||
StrokeElementLayerStyle::displayName(),
|
StrokeElementLayerStyle::displayName(),
|
||||||
[] { return std::make_unique<StrokeElementLayerStyle>(); }
|
[] { return std::make_unique<StrokeElementLayerStyle>(false); }
|
||||||
} };
|
} };
|
||||||
inline const static DisplayNameWithSupplier closedOnlyStyles = { {
|
|
||||||
FillElementLayerStyle::displayName(),
|
|
||||||
[] { return std::make_unique<FillElementLayerStyle>(); }
|
|
||||||
} };
|
|
||||||
inline const static DisplayNameWithSupplier unclosedOnlyStyles = { };
|
|
||||||
|
|
||||||
DisplayNameWithSupplier unusedStyles;
|
DisplayNameWithSupplier unusedStyles;
|
||||||
DisplayNameWithSupplier usedStyles;
|
DisplayNameWithSupplier usedStyles;
|
||||||
|
|
Loading…
Reference in New Issue