diff --git a/src/desktop/docks/brushpalettedock.cpp b/src/desktop/docks/brushpalettedock.cpp index d91fe47f6..a7648916f 100644 --- a/src/desktop/docks/brushpalettedock.cpp +++ b/src/desktop/docks/brushpalettedock.cpp @@ -73,6 +73,7 @@ struct BrushPalette::Private { QAction *overwriteBrushAction; QAction *editBrushAction; QAction *resetBrushAction; + QAction *resetAllAction; QAction *deleteBrushAction; QMenu *iconSizeMenu; QMenu *tagMenu; @@ -129,6 +130,7 @@ BrushPalette::BrushPalette(QWidget *parent) d->tagMenu->addAction(QIcon::fromTheme("configure"), tr("&Edit Brush")); d->resetBrushAction = d->tagMenu->addAction( QIcon::fromTheme("view-refresh"), tr("&Reset Brush")); + d->resetAllAction = d->tagMenu->addAction(tr("Reset All &Brushes")); d->tagMenu->addSeparator(); d->newBrushAction = d->tagMenu->addAction(QIcon::fromTheme("list-add"), tr("&New Brush")); @@ -153,6 +155,7 @@ BrushPalette::BrushPalette(QWidget *parent) d->brushMenu = new QMenu(this); d->brushMenu->addAction(d->editBrushAction); d->brushMenu->addAction(d->resetBrushAction); + d->brushMenu->addAction(d->resetAllAction); d->brushMenu->addSeparator(); d->brushMenu->addAction(d->newBrushAction); d->brushMenu->addAction(d->overwriteBrushAction); @@ -240,6 +243,9 @@ BrushPalette::BrushPalette(QWidget *parent) connect( d->resetBrushAction, &QAction::triggered, this, &BrushPalette::resetCurrentPreset); + connect( + d->resetAllAction, &QAction::triggered, this, + &BrushPalette::resetAllPresets); connect( d->deleteBrushAction, &QAction::triggered, this, &BrushPalette::deleteCurrentPreset); @@ -401,6 +407,14 @@ void BrushPalette::overwriteCurrentPreset(QWidget *parent) box->show(); } +void BrushPalette::resetAllPresets() +{ + d->presetModel->resetAllPresetChanges(); + if(d->brushSettings) { + d->brushSettings->resetPresetsInAllSlots(); + } +} + void BrushPalette::importBrushes() { FileWrangler(this).openBrushPack( diff --git a/src/desktop/docks/brushpalettedock.h b/src/desktop/docks/brushpalettedock.h index c90f6f34d..a52d7f7a1 100644 --- a/src/desktop/docks/brushpalettedock.h +++ b/src/desktop/docks/brushpalettedock.h @@ -38,6 +38,7 @@ class BrushPalette final : public DockBase { void overwriteCurrentPreset(QWidget *parent); public slots: + void resetAllPresets(); void importBrushes(); void exportBrushes(); diff --git a/src/desktop/mainwindow.cpp b/src/desktop/mainwindow.cpp index 4dbba4ce0..efa987d7d 100644 --- a/src/desktop/mainwindow.cpp +++ b/src/desktop/mainwindow.cpp @@ -5126,6 +5126,12 @@ void MainWindow::setupActions() QAction *smallerbrush = makeAction("ensmallenbrush", tr("&Decrease Brush Size")).shortcut(Qt::Key_BracketLeft).autoRepeat(); QAction *biggerbrush = makeAction("embiggenbrush", tr("&Increase Brush Size")).shortcut(Qt::Key_BracketRight).autoRepeat(); QAction *reloadPreset = makeAction("reloadpreset", tr("&Reset Brush")).icon("view-refresh").shortcut("Shift+P"); + QAction *reloadPresetSlots = + makeAction("reloadpresetslots", tr("Reset All Brush &Slots")) + .noDefaultShortcut(); + QAction *reloadAllPresets = + makeAction("reloadallpresets", tr("Reset All &Brushes")) + .shortcut("Shift+Alt+P"); smallerbrush->setAutoRepeat(true); biggerbrush->setAutoRepeat(true); @@ -5140,6 +5146,14 @@ void MainWindow::setupActions() connect(smallerbrush, &QAction::triggered, this, [this]() { m_dockToolSettings->stepAdjustCurrent1(false); }); connect(biggerbrush, &QAction::triggered, this, [this]() { m_dockToolSettings->stepAdjustCurrent1(true); }); connect(reloadPreset, &QAction::triggered, m_dockToolSettings->brushSettings(), &tools::BrushSettings::resetPreset); + connect( + reloadPresetSlots, &QAction::triggered, + m_dockToolSettings->brushSettings(), + &tools::BrushSettings::resetPresetsInAllSlots); + connect( + reloadAllPresets, &QAction::triggered, + m_dockBrushPalette, + &docks::BrushPalette::resetAllPresets); toolshortcuts->addAction(currentEraseMode); toolshortcuts->addAction(currentRecolorMode); @@ -5150,6 +5164,8 @@ void MainWindow::setupActions() toolshortcuts->addAction(smallerbrush); toolshortcuts->addAction(biggerbrush); toolshortcuts->addAction(reloadPreset); + toolshortcuts->addAction(reloadPresetSlots); + toolshortcuts->addAction(reloadAllPresets); m_toolBarDraw = new QToolBar(tr("Drawing tools")); m_toolBarDraw->setObjectName("drawtoolsbar"); @@ -5183,7 +5199,8 @@ void MainWindow::setupActions() } } - m_dockToolSettings->brushSettings()->setActions(reloadPreset); + m_dockToolSettings->brushSettings()->setActions( + reloadPreset, reloadPresetSlots, reloadAllPresets); m_smallScreenSpacer = new QWidget; m_smallScreenSpacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); diff --git a/src/desktop/toolwidgets/brushsettings.cpp b/src/desktop/toolwidgets/brushsettings.cpp index 194b95e10..57d617e96 100644 --- a/src/desktop/toolwidgets/brushsettings.cpp +++ b/src/desktop/toolwidgets/brushsettings.cpp @@ -142,6 +142,8 @@ struct BrushSettings::Private { QAction *editBrushAction; QAction *resetBrushAction; + QAction *resetSlotPresetsAction; + QAction *resetAllPresetsAction; QAction *newBrushAction; QAction *overwriteBrushAction; QAction *deleteBrushAction; @@ -243,9 +245,20 @@ BrushSettings::~BrushSettings() delete d; } -void BrushSettings::setActions(QAction *reloadPreset) +void BrushSettings::setActions( + QAction *reloadPreset, QAction *reloadPresetSlots, + QAction *reloadAllPresets) { d->ui.reloadButton->setDefaultAction(reloadPreset); + connect( + d->resetBrushAction, &QAction::triggered, reloadPreset, + &QAction::trigger); + connect( + d->resetSlotPresetsAction, &QAction::triggered, reloadPresetSlots, + &QAction::trigger); + connect( + d->resetAllPresetsAction, &QAction::triggered, reloadAllPresets, + &QAction::trigger); } void BrushSettings::connectBrushPresets(brushes::BrushPresetModel *brushPresets) @@ -314,9 +327,8 @@ QWidget *BrushSettings::createUiWidget(QWidget *parent) d->resetBrushAction = menu->addAction(QIcon::fromTheme("view-refresh"), tr("&Reset Brush")); - connect( - d->resetBrushAction, &QAction::triggered, this, - &BrushSettings::resetPreset); + d->resetSlotPresetsAction = menu->addAction(tr("Reset All Brush &Slots")); + d->resetAllPresetsAction = menu->addAction(tr("Reset All &Brushes")); menu->addSeparator(); @@ -691,7 +703,7 @@ void BrushSettings::setBrushPresetsAttach(bool brushPresetsAttach) if(preset.attached) { d->ui.preview->setPreset( preset.effectiveThumbnail(), preset.hasChanges()); - updateChangesInBrushPresets(); + updateChangesInCurrentBrushPreset(); } } } else if(d->current == i) { @@ -720,40 +732,52 @@ void BrushSettings::setBrushPresetsAttach(bool brushPresetsAttach) void BrushSettings::setCurrentBrushDetached(const brushes::ActiveBrush &brush) { - brushes::Preset p; - p.originalBrush = brush; - setCurrentBrushPreset(p); + setBrushDetachedInSlot(brush, d->current); } void BrushSettings::setCurrentBrushPreset(const brushes::Preset &p) { - brushes::ActiveBrush brush = changeCurrentBrushInternal(p.effectiveBrush()); - Preset &preset = d->currentPreset(); - if(p.id <= 0) { - preset = Preset::makeDetached(brush); - emit presetIdChanged(0); - } else if(d->presetsAttach) { - preset = Preset::makeAttached(p); - preset.changeBrush(brush, isCurrentEraserSlot()); - emit presetIdChanged(p.id); - } else { - preset = Preset::makeDetached(p.originalBrush, true, p.id); - } - updateMenuActions(); - updateUi(); - updateChangesInBrushPresets(); + setBrushPresetInSlot(p, d->current); +} + +void BrushSettings::setBrushDetachedInSlot( + const brushes::ActiveBrush &brush, int i) +{ + brushes::Preset p; + p.originalBrush = brush; + setBrushPresetInSlot(p, i); } void BrushSettings::changeCurrentBrush(const brushes::ActiveBrush &brush) { - changePresetBrush(changeCurrentBrushInternal(brush)); + changePresetBrush(changeBrushInSlot(brush, d->current)); updateUi(); } -brushes::ActiveBrush -BrushSettings::changeCurrentBrushInternal(const brushes::ActiveBrush &brush) +void BrushSettings::setBrushPresetInSlot(const brushes::Preset &p, int i) { - return changeBrushInSlot(brush, d->current); + brushes::ActiveBrush brush = changeBrushInSlot(p.effectiveBrush(), i); + Preset &preset = d->presetAt(i); + bool isCurrent = i == d->current; + if(p.id <= 0) { + preset = Preset::makeDetached(brush); + if(isCurrent) { + emit presetIdChanged(0); + } + } else if(d->presetsAttach) { + preset = Preset::makeAttached(p); + preset.changeBrush(brush, i == ERASER_SLOT_INDEX); + if(isCurrent) { + emit presetIdChanged(p.id); + } + } else { + preset = Preset::makeDetached(p.originalBrush, true, p.id); + } + if(isCurrent) { + updateMenuActions(); + updateUi(); + } + updateChangesInBrushPresetInSlot(i); } brushes::ActiveBrush @@ -847,7 +871,7 @@ void BrushSettings::selectBrushSlot(int i) const Preset &preset = d->currentPreset(); updateMenuActions(); emit presetIdChanged(preset.effectiveId()); - updateChangesInBrushPresets(); + updateChangesInCurrentBrushPreset(); } void BrushSettings::toggleEraserMode() @@ -886,16 +910,28 @@ void BrushSettings::toggleRecolorMode() void BrushSettings::resetPreset() { - Preset &preset = d->currentPreset(); + resetBrushInSlot(d->current); +} + +void BrushSettings::resetPresetsInAllSlots() +{ + for(int i = 0; i < TOTAL_SLOT_COUNT; ++i) { + resetBrushInSlot(i); + } +} + +void BrushSettings::resetBrushInSlot(int i) +{ + Preset &preset = d->presetAt(i); if(preset.valid) { if(preset.attached) { preset.changedName = {}; preset.changedDescription = {}; preset.changedThumbnail = {}; preset.changedBrush = {}; - setCurrentBrushPreset(preset); + setBrushPresetInSlot(preset, i); } else { - setCurrentBrushDetached(preset.originalBrush); + setBrushDetachedInSlot(preset.originalBrush, i); } } } @@ -905,7 +941,7 @@ void BrushSettings::changeCurrentPresetName(const QString &name) Preset &preset = d->currentPreset(); if(preset.changeName(name)) { d->ui.preview->setPresetChanged(preset.hasChanges()); - updateChangesInBrushPresets(); + updateChangesInCurrentBrushPreset(); } } @@ -914,7 +950,7 @@ void BrushSettings::changeCurrentPresetDescription(const QString &description) Preset &preset = d->currentPreset(); if(preset.changeDescription(description)) { d->ui.preview->setPresetChanged(preset.hasChanges()); - updateChangesInBrushPresets(); + updateChangesInCurrentBrushPreset(); } } @@ -924,7 +960,7 @@ void BrushSettings::changeCurrentPresetThumbnail(const QPixmap &thumbnail) if(preset.changeThumbnail(thumbnail)) { d->ui.preview->setPresetThumbnail(thumbnail); d->ui.preview->setPresetChanged(preset.hasChanges()); - updateChangesInBrushPresets(); + updateChangesInCurrentBrushPreset(); } } @@ -1360,17 +1396,22 @@ void BrushSettings::changePresetBrush(const brushes::ActiveBrush &brush) if(preset.isAttached()) { d->ui.preview->setPresetChanged(preset.hasChanges()); } - updateChangesInBrushPresets(); + updateChangesInCurrentBrushPreset(); } -void BrushSettings::updateChangesInBrushPresets() +void BrushSettings::updateChangesInCurrentBrushPreset() { - const Preset &preset = d->currentPreset(); + updateChangesInBrushPresetInSlot(d->current); +} + +void BrushSettings::updateChangesInBrushPresetInSlot(int i) +{ + const Preset &preset = d->presetAt(i); if(d->brushPresets && preset.isAttached()) { d->brushPresets->changePreset( preset.id, preset.changedName, preset.changedDescription, preset.changedThumbnail, preset.changedBrush, - isCurrentEraserSlot()); + i == ERASER_SLOT_INDEX); } } diff --git a/src/desktop/toolwidgets/brushsettings.h b/src/desktop/toolwidgets/brushsettings.h index 65d52113b..fe155288d 100644 --- a/src/desktop/toolwidgets/brushsettings.h +++ b/src/desktop/toolwidgets/brushsettings.h @@ -26,7 +26,9 @@ class BrushSettings final : public ToolSettings { BrushSettings(ToolController *ctrl, QObject *parent = nullptr); ~BrushSettings() override; - void setActions(QAction *reloadPreset); + void setActions( + QAction *reloadPreset, QAction *reloadPresetSlots, + QAction *reloadAllPresets); void connectBrushPresets(brushes::BrushPresetModel *brushPresets); QString toolType() const override { return QStringLiteral("brush"); } @@ -56,6 +58,8 @@ class BrushSettings final : public ToolSettings { void setCurrentBrushDetached(const brushes::ActiveBrush &brush); void setCurrentBrushPreset(const brushes::Preset &p); void changeCurrentBrush(const brushes::ActiveBrush &brush); + void setBrushDetachedInSlot(const brushes::ActiveBrush &brush, int i); + void setBrushPresetInSlot(const brushes::Preset &p, int i); brushes::ActiveBrush currentBrush() const; int currentPresetId() const; const QString ¤tPresetName() const; @@ -88,6 +92,7 @@ public slots: void toggleRecolorMode() override; void setEraserMode(bool erase); void resetPreset(); + void resetPresetsInAllSlots(); void changeCurrentPresetName(const QString &name); void changeCurrentPresetDescription(const QString &description); @@ -129,10 +134,10 @@ private slots: enum class Lock { None, MyPaintPermission, MyPaintCompat, IndirectCompat }; void changePresetBrush(const brushes::ActiveBrush &brush); - void updateChangesInBrushPresets(); + void updateChangesInCurrentBrushPreset(); + void updateChangesInBrushPresetInSlot(int i); - brushes::ActiveBrush - changeCurrentBrushInternal(const brushes::ActiveBrush &brush); + void resetBrushInSlot(int i); brushes::ActiveBrush changeBrushInSlot(brushes::ActiveBrush brush, int i); void updateMenuActions(); diff --git a/src/libclient/brushes/brushpresetmodel.cpp b/src/libclient/brushes/brushpresetmodel.cpp index b93303755..784899b71 100644 --- a/src/libclient/brushes/brushpresetmodel.cpp +++ b/src/libclient/brushes/brushpresetmodel.cpp @@ -348,6 +348,18 @@ class BrushPresetTagModel::Private { } } + bool resetAllPresetChanges() + { + DRAWPILE_FS_PERSIST_SCOPE(scopedFsSync); + QMutexLocker locker(&m_mutex); + QSqlQuery query(m_db); + return exec( + query, + QStringLiteral("update preset set changed_description = null, " + "changed_thumbnail = null, changed_type = null, " + "changed_data = null")); + } + bool deletePresetById(int id) { QMutexLocker locker{&m_mutex}; @@ -470,6 +482,17 @@ class BrushPresetTagModel::Private { refreshPresetCacheInternal(); } + void resetAllPresetsInCache() + { + QMutexLocker locker(&m_mutex); + for(CachedPreset &cp : m_presetCache) { + cp.changedName = {}; + cp.changedDescription = {}; + cp.changedThumbnail = {}; + cp.changedBrush = {}; + } + } + int presetCacheSize() const { return m_presetCache.size(); } CachedPreset &getCachedPreset(int index) { return m_presetCache[index]; } @@ -556,6 +579,12 @@ class BrushPresetTagModel::Private { } } + void discardPresetChanges() + { + m_presetChangeTimer.stop(); + m_presetChanges.clear(); + } + private: bool createOrUpdateStateInternal( QSqlQuery &query, const QString &key, const QVariant &value) @@ -2037,6 +2066,15 @@ void BrushPresetModel::changePreset( d->enqueuePresetChange(presetId, {name, description, thumbnail, brush}); } +void BrushPresetModel::resetAllPresetChanges() +{ + beginResetModel(); + d->discardPresetChanges(); + d->resetAllPresetChanges(); + d->resetAllPresetsInCache(); + endResetModel(); +} + void BrushPresetModel::writePresetChanges() { d->writePresetChanges(); diff --git a/src/libclient/brushes/brushpresetmodel.h b/src/libclient/brushes/brushpresetmodel.h index 9d2a77de4..d3db4a0ee 100644 --- a/src/libclient/brushes/brushpresetmodel.h +++ b/src/libclient/brushes/brushpresetmodel.h @@ -266,6 +266,7 @@ class BrushPresetModel final : public QAbstractItemModel { const std::optional &thumbnail = {}, const std::optional &brush = {}, bool inEraserSlot = false); + void resetAllPresetChanges(); void writePresetChanges(); int countNames(const QString &name) const;