这是indexloc提供的服务,不要输入任何密码
Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
197d5ad
Milestone: Make ToolSettings for storing tool settings
MrStevns Mar 9, 2025
ac09299
ToolSettings: Handle invalid cases in identifier
MrStevns Mar 11, 2025
9a6f55c
Remove stroke dependency to BucketTool
MrStevns Mar 13, 2025
aa5eb1d
Let the tool, not the widget decide what settings should be shown.
MrStevns Mar 13, 2025
a8e19f4
StrokeTool: add default values and insert instead of set
MrStevns Mar 13, 2025
a03c772
WIP: More ToolSettings rework
MrStevns Mar 15, 2025
92fb230
ToolSettings simplification
MrStevns Mar 15, 2025
3969b45
ToolOptionWidget: get connections back
MrStevns Mar 15, 2025
a912528
Fix settings not being fetched from PolylineSettings
MrStevns Mar 16, 2025
ee37cdf
Implement more robust way to create settings
MrStevns Mar 16, 2025
52784e7
Remove global ToolProperty logic
MrStevns Mar 16, 2025
000d474
All tools should now declare which properties should be shown
MrStevns Mar 16, 2025
0c2d898
BucketOptionsWidget: hook up connections from model to UI
MrStevns Mar 16, 2025
3141842
Remove use of ToolPropertyType
MrStevns Mar 17, 2025
fd14f5c
BucketOptionsWidget: Use min/max values from PropertyInfo
MrStevns Mar 17, 2025
d926ddc
PropertyInfo: Fix min/max bugs
MrStevns Mar 17, 2025
545b989
BrushOptionsWidget: Remove obsolete connects
MrStevns Mar 17, 2025
8512330
Fix Qt5 failure: missing QSet import
MrStevns Mar 17, 2025
d7090cd
Implement TransformTool and TransformOptionsWidget
MrStevns Mar 20, 2025
e4768f1
SpinSlider: remove unused VALUE_TYPE
MrStevns Mar 23, 2025
397e17a
StrokeOptions: use min/max from StrokeSettings
MrStevns Mar 23, 2025
82f03ec
Fix bool naming inconsistency
MrStevns Mar 24, 2025
143df9c
PenTool: add missing load settings
MrStevns Mar 29, 2025
cefabad
Add migration logic
MrStevns Mar 29, 2025
31ddf70
Fix spin slider having wrong value
MrStevns Mar 29, 2025
8ffa7f1
StrokeOptionsWidget: refactor
MrStevns Mar 29, 2025
db6bb97
Remove obslete fields in PencilSettings
MrStevns Mar 30, 2025
ebe82c6
Remove old tool property references
MrStevns Mar 30, 2025
25209b2
ToolManager: update UI when resetting tools
MrStevns Mar 30, 2025
cdf8b91
Fix wrong info for feather
MrStevns Mar 30, 2025
73398c1
Introduce BaseWidget to simplify child widget UI updates
MrStevns Mar 30, 2025
c290e8b
Tool settings: Refactor signal/slots
MrStevns Mar 30, 2025
9fd36a5
PropertyInfo: rename and cleanup
MrStevns Mar 30, 2025
776ba63
CameraTool: Apply more refactoring
MrStevns Mar 30, 2025
ba45197
Cleanup settings initialization
MrStevns Mar 30, 2025
c24a40d
Merge remote-tracking branch 'pencil2d/master' into task/rework-toolp…
MrStevns Apr 3, 2025
912783f
TransformOptionsWidget: Add Anti-aliasing checkbox
MrStevns Apr 3, 2025
3541497
StrokeOptions: Fix anti-aliasing not being shown
MrStevns Apr 3, 2025
c423a67
Merge branch 'master' into task/rework-toolproperties
MrStevns Apr 21, 2025
097c998
Merge branch 'master' into task/rework-toolproperties
MrStevns Jun 5, 2025
b4d82c5
Merge branch 'master' into task/rework-toolproperties
MrStevns Jun 5, 2025
d80bf23
Fix casing
MrStevns Jun 7, 2025
5894b03
Fix width and feather is reporting out of bound values
MrStevns Jun 13, 2025
2eef347
Fix not setting a default feather value for pencil
MrStevns Jun 14, 2025
f55026d
Fix assertion when holding down multiple modifiers
MrStevns Jun 14, 2025
ad18451
ToolSettings: Separate loading and setting default properties
MrStevns Jun 14, 2025
7bc4cef
Refactor mStrokeSettings -> mSettings
MrStevns Jun 14, 2025
45821c8
Add assertion when calling load before setDefaults
MrStevns Jun 14, 2025
fa59083
Merge remote-tracking branch 'pencil2d/master' into task/rework-toolp…
MrStevns Jun 14, 2025
f7c3e64
Update defaults for stroke tool children rather than replacing
MrStevns Jun 14, 2025
1964e0f
Fix eraser tool never called load tool settings
MrStevns Jun 14, 2025
60e51dc
Implement Tests
MrStevns Jun 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions app/app.pro
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ PRECOMPILED_HEADER = src/app-pch.h
HEADERS += \
src/addtransparencytopaperdialog.h \
src/app-pch.h \
src/basewidget.h \
src/appearance.h \
src/buttonappearancewatcher.h \
src/importlayersdialog.h \
Expand All @@ -91,6 +92,7 @@ HEADERS += \
src/filespage.h \
src/generalpage.h \
src/shortcutspage.h \
src/strokeoptionswidget.h \
src/timelinepage.h \
src/toolboxwidget.h \
src/toolspage.h \
Expand Down Expand Up @@ -127,10 +129,12 @@ HEADERS += \
src/commandlineexporter.h \
src/statusbar.h \
src/elidedlabel.h \
src/cameraoptionswidget.h
src/cameraoptionswidget.h \
src/transformoptionswidget.h

SOURCES += \
src/addtransparencytopaperdialog.cpp \
src/basewidget.cpp \
src/buttonappearancewatcher.cpp \
src/importlayersdialog.cpp \
src/importpositiondialog.cpp \
Expand All @@ -146,6 +150,7 @@ SOURCES += \
src/filespage.cpp \
src/generalpage.cpp \
src/shortcutspage.cpp \
src/strokeoptionswidget.cpp \
src/timelinepage.cpp \
src/toolboxwidget.cpp \
src/toolspage.cpp \
Expand Down Expand Up @@ -182,9 +187,12 @@ SOURCES += \
src/commandlineexporter.cpp \
src/statusbar.cpp \
src/elidedlabel.cpp \
src/cameraoptionswidget.cpp
src/cameraoptionswidget.cpp \
src/transformoptionswidget.cpp

FORMS += \
src/transformoptionswidget.ui \
ui/strokeoptionswidget.ui \
ui/addtransparencytopaperdialog.ui \
ui/cameraoptionswidget.ui \
ui/camerapropertiesdialog.ui \
Expand Down
30 changes: 30 additions & 0 deletions app/src/basewidget.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*

Pencil2D - Traditional Animation Software
Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
Copyright (C) 2012-2020 Matthew Chiawen Chang

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

*/

#include "basewidget.h"

BaseWidget::BaseWidget(QWidget* parent) : QWidget(parent)
{
}

void BaseWidget::initUI()
{
}

void BaseWidget::updateUI()
{
}
32 changes: 32 additions & 0 deletions app/src/basewidget.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*

Pencil2D - Traditional Animation Software
Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
Copyright (C) 2012-2020 Matthew Chiawen Chang

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

*/

#ifndef BASEWIDGET_H
#define BASEWIDGET_H

#include <QWidget>

class BaseWidget : public QWidget
{
public:
BaseWidget(QWidget* parent = nullptr);

virtual void initUI();
virtual void updateUI();
};

#endif // BASEWIDGET_H
237 changes: 132 additions & 105 deletions app/src/bucketoptionswidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,34 +20,38 @@ GNU General Public License for more details.
#include <QDebug>

#include "spinslider.h"
#include "pencilsettings.h"

#include "layer.h"
#include "editor.h"
#include "layermanager.h"
#include "toolmanager.h"
#include "util.h"

#include "stroketool.h"
#include "buckettool.h"

BucketOptionsWidget::BucketOptionsWidget(Editor* editor, QWidget* parent) :
QWidget(parent),
BaseWidget(parent),
ui(new Ui::BucketOptionsWidget),
mEditor(editor)
{
ui->setupUi(this);

ui->colorToleranceSlider->init(tr("Color tolerance"), SpinSlider::GROWTH_TYPE::LINEAR, SpinSlider::VALUE_TYPE::INTEGER, 0, MAX_COLOR_TOLERANCE);
ui->expandSlider->init(tr("Expand fill"), SpinSlider::GROWTH_TYPE::LINEAR, SpinSlider::VALUE_TYPE::INTEGER, 0, MAX_EXPAND);
ui->strokeThicknessSlider->init(tr("Stroke thickness"), SpinSlider::GROWTH_TYPE::LOG, SpinSlider::VALUE_TYPE::FLOAT, 1, MAX_STROKE_THICKNESS);
mBucketTool = static_cast<BucketTool*>(mEditor->tools()->getTool(BUCKET));
mSettings = static_cast<const BucketSettings*>(mBucketTool->settings());

QSettings settings(PENCIL2D, PENCIL2D);
auto toleranceInfo = mSettings->getInfo(BucketSettings::COLORTOLERANCE_VALUE);
auto expandInfo = mSettings->getInfo(BucketSettings::FILLEXPAND_VALUE);
auto thicknessInfo = mSettings->getInfo(BucketSettings::FILLTHICKNESS_VALUE);

ui->colorToleranceCheckbox->setChecked(settings.value(SETTING_BUCKET_TOLERANCE_ON, true).toBool());
ui->expandCheckbox->setChecked(settings.value(SETTING_BUCKET_FILL_EXPAND_ON, true).toBool());
ui->colorToleranceSlider->init(tr("Color tolerance"), SpinSlider::GROWTH_TYPE::LINEAR, toleranceInfo.minInt(), toleranceInfo.maxInt());
ui->expandSlider->init(tr("Expand fill"), SpinSlider::GROWTH_TYPE::LINEAR, expandInfo.minInt(), expandInfo.maxInt());
ui->strokeThicknessSlider->init(tr("Stroke thickness"), SpinSlider::GROWTH_TYPE::LOG, thicknessInfo.minReal(), thicknessInfo.maxReal());

ui->expandSpinBox->setMaximum(MAX_EXPAND);
ui->strokeThicknessSpinBox->setMaximum(MAX_STROKE_THICKNESS);
ui->colorToleranceSpinbox->setMaximum(MAX_COLOR_TOLERANCE);
ui->strokeThicknessSpinBox->setMinimum(1);
ui->expandSpinBox->setMaximum(expandInfo.maxInt());
ui->strokeThicknessSpinBox->setMaximum(thicknessInfo.maxReal());
ui->strokeThicknessSpinBox->setMinimum(thicknessInfo.minReal());
ui->colorToleranceSpinbox->setMaximum(toleranceInfo.maxInt());

ui->referenceLayerComboBox->addItem(tr("Current layer", "Reference Layer Options"), 0);
ui->referenceLayerComboBox->addItem(tr("All layers", "Reference Layer Options"), 1);
Expand All @@ -58,29 +62,8 @@ BucketOptionsWidget::BucketOptionsWidget(Editor* editor, QWidget* parent) :
ui->blendModeComboBox->addItem(tr("Behind", "Blend Mode dropdown option"), 2);
ui->blendModeComboBox->setToolTip(tr("Defines how the fill will behave when the new color is not opaque"));

connect(ui->colorToleranceSlider, &SpinSlider::valueChanged, mEditor->tools(), &ToolManager::setTolerance);
connect(ui->colorToleranceSpinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), mEditor->tools(), &ToolManager::setTolerance);
connect(ui->colorToleranceCheckbox, &QCheckBox::toggled, mEditor->tools(), &ToolManager::setBucketColorToleranceEnabled);

connect(ui->expandSlider, &SpinSlider::valueChanged, mEditor->tools(), &ToolManager::setBucketFillExpand);
connect(ui->expandSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), mEditor->tools(), &ToolManager::setBucketFillExpand);
connect(ui->expandCheckbox, &QCheckBox::toggled, mEditor->tools(), &ToolManager::setBucketFillExpandEnabled);

connect(ui->strokeThicknessSlider, &SpinSlider::valueChanged, mEditor->tools(), &ToolManager::setWidth);
connect(ui->strokeThicknessSpinBox, static_cast<void (QDoubleSpinBox::*)(qreal)>(&QDoubleSpinBox::valueChanged), mEditor->tools(), &ToolManager::setWidth);

connect(mEditor->tools(), &ToolManager::toolPropertyChanged, this, &BucketOptionsWidget::onPropertyChanged);
connect(mEditor->layers(), &LayerManager::currentLayerChanged, this, &BucketOptionsWidget::onLayerChanged);

connect(ui->referenceLayerComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), mEditor->tools(), &ToolManager::setBucketFillReferenceMode);
connect(ui->blendModeComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), mEditor->tools(), &ToolManager::setFillMode);

ui->expandSlider->setValue(settings.value(SETTING_BUCKET_FILL_EXPAND, 2).toInt());
ui->expandSpinBox->setValue(settings.value(SETTING_BUCKET_FILL_EXPAND, 2).toInt());
ui->colorToleranceSlider->setValue(settings.value(SETTING_BUCKET_TOLERANCE, 50).toInt());
ui->colorToleranceSpinbox->setValue(settings.value(SETTING_BUCKET_TOLERANCE, 50).toInt());
ui->referenceLayerComboBox->setCurrentIndex(settings.value(SETTING_BUCKET_FILL_REFERENCE_MODE, 0).toInt());
ui->blendModeComboBox->setCurrentIndex(settings.value(SETTING_FILL_MODE, 0).toInt());
makeConnectionsFromUIToModel();
makeConnectionsFromModelToUI();

clearFocusOnFinished(ui->colorToleranceSpinbox);
clearFocusOnFinished(ui->expandSpinBox);
Expand All @@ -93,82 +76,126 @@ BucketOptionsWidget::~BucketOptionsWidget()
delete ui;
}

void BucketOptionsWidget::updatePropertyVisibility()
void BucketOptionsWidget::makeConnectionsFromModelToUI()
{
connect(mBucketTool, &BucketTool::toleranceChanged, this, [=](int value) {
setColorTolerance(value);
});

connect(mBucketTool, &BucketTool::toleranceEnabledChanged, this, [=](bool enabled) {
setColorToleranceEnabled(enabled);
});

connect(mBucketTool, &BucketTool::fillExpandChanged, this, [=](int value) {
setFillExpand(value);
});

connect(mBucketTool, &BucketTool::fillExpandEnabledChanged, this, [=](bool enabled) {
setFillExpandEnabled(enabled);
});

connect(mBucketTool, &BucketTool::fillReferenceModeChanged, this, [=](int value) {
setFillReferenceMode(value);
});

connect(mBucketTool, &BucketTool::fillModeChanged, this, [=](int value) {
setFillMode(value);
});

connect(mBucketTool, &BucketTool::strokeThicknessChanged, this, [=](qreal value) {
setStrokeWidth(value);
});
}

void BucketOptionsWidget::makeConnectionsFromUIToModel()
{
connect(ui->colorToleranceSlider, &SpinSlider::valueChanged, [=](int value) {
mBucketTool->setColorTolerance(value);
});
connect(ui->colorToleranceSpinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), [=](int value) {
mBucketTool->setColorTolerance(value);
});

connect(ui->colorToleranceCheckbox, &QCheckBox::toggled, [=](bool enabled) {
mBucketTool->setColorToleranceEnabled(enabled);
});

connect(ui->expandSlider, &SpinSlider::valueChanged, [=](int value) {
mBucketTool->setFillExpand(value);
});

connect(ui->expandSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), [=](int value) {
mBucketTool->setFillExpand(value);
});

connect(ui->expandCheckbox, &QCheckBox::toggled, [=](bool enabled) {
mBucketTool->setFillExpandEnabled(enabled);
});

connect(ui->referenceLayerComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int value) {
mBucketTool->setFillReferenceMode(value);
});

connect(ui->blendModeComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int value) {
mBucketTool->setFillMode(value);
});

connect(ui->strokeThicknessSlider, &SpinSlider::valueChanged, [=](qreal value) {
mBucketTool->setStrokeThickness(value);
});

connect(ui->strokeThicknessSpinBox, static_cast<void (QDoubleSpinBox::*)(qreal)>(&QDoubleSpinBox::valueChanged), [=](qreal value) {
mBucketTool->setStrokeThickness(value);
});
}

void BucketOptionsWidget::updateUI()
{
Layer* layer = mEditor->layers()->currentLayer();

Q_ASSERT(layer != nullptr);

switch (layer->type()) {
case Layer::VECTOR:
ui->strokeThicknessSlider->show();
ui->strokeThicknessSpinBox->show();

ui->colorToleranceCheckbox->hide();
ui->colorToleranceSlider->hide();
ui->colorToleranceSpinbox->hide();
ui->expandCheckbox->hide();
ui->expandSlider->hide();
ui->expandSpinBox->hide();
ui->referenceLayerComboBox->hide();
ui->referenceLayerDescLabel->hide();
ui->blendModeComboBox->hide();
ui->blendModeLabel->hide();
break;
case Layer::BITMAP: {
ui->strokeThicknessSlider->hide();
ui->strokeThicknessSpinBox->hide();

ui->referenceLayerComboBox->show();
ui->referenceLayerDescLabel->show();
ui->colorToleranceCheckbox->show();
ui->colorToleranceSlider->show();
ui->colorToleranceSpinbox->show();
ui->expandCheckbox->show();
ui->expandSlider->show();
ui->expandSpinBox->show();
ui->blendModeComboBox->show();
ui->blendModeLabel->show();
break;
updatePropertyVisibility();

if (mBucketTool->isPropertyEnabled(BucketSettings::FILLTHICKNESS_VALUE)) {
mBucketTool->setStrokeThickness(mSettings->fillThickness());
}
default:
ui->strokeThicknessSlider->hide();
ui->strokeThicknessSpinBox->hide();
ui->colorToleranceCheckbox->hide();
ui->colorToleranceSlider->hide();
ui->colorToleranceSpinbox->hide();
ui->expandCheckbox->hide();
ui->expandSlider->hide();
ui->expandSpinBox->hide();
ui->referenceLayerComboBox->hide();
ui->referenceLayerDescLabel->hide();
ui->blendModeComboBox->hide();
ui->blendModeLabel->hide();

if (mBucketTool->isPropertyEnabled(BucketSettings::FILLEXPAND_ENABLED)) {
mBucketTool->setFillExpandEnabled(mSettings->fillExpandEnabled());
}

if (mBucketTool->isPropertyEnabled(BucketSettings::FILLEXPAND_VALUE)) {
mBucketTool->setFillExpand(mSettings->fillExpandAmount());
}

if (mBucketTool->isPropertyEnabled(BucketSettings::FILLLAYERREFERENCEMODE_VALUE)) {
mBucketTool->setFillReferenceMode(mSettings->fillReferenceMode());
}

if (mBucketTool->isPropertyEnabled(BucketSettings::FILLMODE_VALUE)) {
mBucketTool->setFillMode(mSettings->fillMode());
}

if (mBucketTool->isPropertyEnabled(BucketSettings::COLORTOLERANCE_VALUE)) {
mBucketTool->setColorTolerance(mSettings->tolerance());
}

if (mBucketTool->isPropertyEnabled(BucketSettings::COLORTOLERANCE_ENABLED)) {
mBucketTool->setColorToleranceEnabled(mSettings->colorToleranceEnabled());
}
}

void BucketOptionsWidget::onPropertyChanged(ToolType, ToolPropertyType propertyType)
void BucketOptionsWidget::updatePropertyVisibility()
{
const Properties& p = mEditor->tools()->currentTool()->properties;
switch (propertyType)
{
case ToolPropertyType::TOLERANCE:
setColorTolerance(static_cast<int>(p.tolerance)); break;
case ToolPropertyType::USETOLERANCE:
setColorToleranceEnabled(p.toleranceEnabled); break;
case ToolPropertyType::WIDTH:
setStrokeWidth(static_cast<int>(p.width)); break;
case ToolPropertyType::BUCKETFILLEXPAND:
setFillExpand(static_cast<int>(p.bucketFillExpand)); break;
case ToolPropertyType::USEBUCKETFILLEXPAND:
setFillExpandEnabled(p.bucketFillExpandEnabled); break;
case ToolPropertyType::BUCKETFILLLAYERREFERENCEMODE:
setFillReferenceMode(p.bucketFillReferenceMode); break;
case ToolPropertyType::FILL_MODE:
setFillMode(p.fillMode); break;
default:
break;
}
ui->strokeThicknessSlider->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::FILLTHICKNESS_VALUE));
ui->strokeThicknessSpinBox->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::FILLTHICKNESS_VALUE));
ui->colorToleranceCheckbox->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::COLORTOLERANCE_ENABLED));
ui->colorToleranceSlider->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::COLORTOLERANCE_VALUE));
ui->colorToleranceSpinbox->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::COLORTOLERANCE_VALUE));
ui->expandCheckbox->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::FILLEXPAND_ENABLED));
ui->expandSlider->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::FILLEXPAND_VALUE));
ui->expandSpinBox->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::FILLEXPAND_VALUE));
ui->referenceLayerComboBox->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::FILLLAYERREFERENCEMODE_VALUE));
ui->referenceLayerDescLabel->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::FILLLAYERREFERENCEMODE_VALUE));
ui->blendModeComboBox->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::FILLMODE_VALUE));
ui->blendModeLabel->setVisible(mBucketTool->isPropertyEnabled(BucketSettings::FILLMODE_VALUE));
}

void BucketOptionsWidget::onLayerChanged(int)
Expand Down
Loading
Loading