Skip to content

Commit

Permalink
Move eraser mode action to toolbar
Browse files Browse the repository at this point in the history
  • Loading branch information
callaa committed Apr 20, 2017
1 parent 29ffe71 commit 8b446aa
Show file tree
Hide file tree
Showing 10 changed files with 83 additions and 117 deletions.
1 change: 1 addition & 0 deletions ChangeLog
@@ -1,6 +1,7 @@
2014-0?-?? Version 2.0.4
* Added support for room codes and private listings
* Reverted pressure controls back to checkboxes
* Moved eraser mode toggle action to toolbar

2017-04-17 Version 2.0.3
* Restored some tablet and smoother improvements from stable branch
Expand Down
7 changes: 5 additions & 2 deletions src/desktop/docks/toolsettingsdock.cpp
Expand Up @@ -64,7 +64,7 @@ struct ToolSettings::Private {
return pages[currentTool].settings.data();
}

Private(tools::ToolController *ctrl)
Private(tools::ToolController *ctrl, ToolSettings *dock)
: ctrl(ctrl),
widgetStack(nullptr),
colorDialog(nullptr),
Expand All @@ -79,6 +79,9 @@ struct ToolSettings::Private {
// Create tool pages
auto brush = QSharedPointer<tools::ToolSettings>(new tools::BrushSettings(ctrl));
auto sel = QSharedPointer<tools::ToolSettings>(new tools::SelectionSettings(ctrl));

connect(static_cast<tools::BrushSettings*>(brush.data()), &tools::BrushSettings::eraseModeChanged, dock, &ToolSettings::eraserModeChanged);

pages[tools::Tool::FREEHAND] = {
brush,
"freehand",
Expand Down Expand Up @@ -138,7 +141,7 @@ struct ToolSettings::Private {
};

ToolSettings::ToolSettings(tools::ToolController *ctrl, QWidget *parent)
: QDockWidget(parent), d(new Private(ctrl))
: QDockWidget(parent), d(new Private(ctrl, this))
{
setStyleSheet(defaultDockStylesheet());

Expand Down
3 changes: 3 additions & 0 deletions src/desktop/docks/toolsettingsdock.h
Expand Up @@ -94,6 +94,9 @@ public slots:
//! This signal is emitted when tool subpixel drawing mode is changed
void subpixelModeChanged(bool subpixel);

//! Brush eraser mode changed
void eraserModeChanged(bool erase);

//! Current foreground color selection changed
void foregroundColorChanged(const QColor &color);

Expand Down
51 changes: 28 additions & 23 deletions src/desktop/mainwindow.cpp
Expand Up @@ -587,7 +587,7 @@ void MainWindow::updateTitle()

void MainWindow::setDrawingToolsEnabled(bool enable)
{
_drawingtools->setEnabled(enable && m_doc->canvas());
m_drawingtools->setEnabled(enable && m_doc->canvas());
}

/**
Expand Down Expand Up @@ -805,7 +805,7 @@ bool MainWindow::event(QEvent *event)
if(!e->isAutoRepeat()) {
if(_tempToolSwitchShortcut->isShortcutSent()) {
// Return from temporary tool change
for(const QAction *act : _drawingtools->actions()) {
for(const QAction *act : m_drawingtools->actions()) {
const QKeySequence &seq = act->shortcut();
if(seq.count()==1 && e->key() == seq[0]) {
_dock_toolsettings->setPreviousTool();
Expand Down Expand Up @@ -1603,7 +1603,7 @@ void MainWindow::setFreezeDocks(bool freeze)
void MainWindow::selectTool(QAction *tool)
{
// Note. Actions must be in the same order in the enum and the group
int idx = _drawingtools->actions().indexOf(tool);
int idx = m_drawingtools->actions().indexOf(tool);
Q_ASSERT(idx>=0);
if(idx<0)
return;
Expand All @@ -1619,7 +1619,7 @@ void MainWindow::selectTool(QAction *tool)
*/
void MainWindow::toolChanged(tools::Tool::Type tool)
{
QAction *toolaction = _drawingtools->actions().at(int(tool));
QAction *toolaction = m_drawingtools->actions().at(int(tool));
toolaction->setChecked(true);

// When using the annotation tool, highlight all text boxes
Expand All @@ -1644,7 +1644,7 @@ void MainWindow::selectionRemoved()
if(_lastToolBeforePaste>=0) {
// Selection was just removed and we had just pasted an image
// so restore the previously used tool
QAction *toolaction = _drawingtools->actions().at(_lastToolBeforePaste);
QAction *toolaction = m_drawingtools->actions().at(_lastToolBeforePaste);
toolaction->trigger();
}
}
Expand Down Expand Up @@ -1910,8 +1910,8 @@ void MainWindow::setupActions()
m_docadmintools->setExclusive(false);
m_docadmintools->setEnabled(false);

_drawingtools = new QActionGroup(this);
connect(_drawingtools, SIGNAL(triggered(QAction*)), this, SLOT(selectTool(QAction*)));
m_drawingtools = new QActionGroup(this);
connect(m_drawingtools, SIGNAL(triggered(QAction*)), this, SLOT(selectTool(QAction*)));

QMenu *toggletoolbarmenu = new QMenu(this);
QMenu *toggledockmenu = new QMenu(this);
Expand Down Expand Up @@ -2321,6 +2321,7 @@ void MainWindow::setupActions()
//
// Tools menu and toolbar
//
QAction *erasertoggle = makeAction("erasertoggle", "draw-eraser", tr("Eraser mode"), QString(), QKeySequence("E"), true);
QAction *freehandtool = makeAction("toolbrush", "draw-brush", tr("Freehand"), tr("Freehand brush tool"), QKeySequence("B"), true);
QAction *linetool = makeAction("toolline", "draw-line", tr("&Line"), tr("Draw straight lines"), QKeySequence("U"), true);
QAction *recttool = makeAction("toolrect", "draw-rectangle", tr("&Rectangle"), tr("Draw unfilled squares and rectangles"), QKeySequence("R"), true);
Expand All @@ -2336,25 +2337,25 @@ void MainWindow::setupActions()

connect(markertool, SIGNAL(triggered()), this, SLOT(markSpotForRecording()));

_drawingtools->addAction(freehandtool);
_drawingtools->addAction(linetool);
_drawingtools->addAction(recttool);
_drawingtools->addAction(ellipsetool);
_drawingtools->addAction(filltool);
_drawingtools->addAction(annotationtool);
_drawingtools->addAction(pickertool);
_drawingtools->addAction(lasertool);
_drawingtools->addAction(selectiontool);
_drawingtools->addAction(lassotool);
m_drawingtools->addAction(freehandtool);
m_drawingtools->addAction(linetool);
m_drawingtools->addAction(recttool);
m_drawingtools->addAction(ellipsetool);
m_drawingtools->addAction(filltool);
m_drawingtools->addAction(annotationtool);
m_drawingtools->addAction(pickertool);
m_drawingtools->addAction(lasertool);
m_drawingtools->addAction(selectiontool);
m_drawingtools->addAction(lassotool);

QMenu *toolsmenu = menuBar()->addMenu(tr("&Tools"));
toolsmenu->addActions(_drawingtools->actions());
toolsmenu->addActions(m_drawingtools->actions());
toolsmenu->addAction(markertool);
toolsmenu->addSeparator();
toolsmenu->addAction(erasertoggle);

QMenu *toolshortcuts = toolsmenu->addMenu(tr("&Shortcuts"));

QAction *erasertoggle = makeAction("erasertoggle", 0, tr("Eraser Mode"), QString(), QKeySequence("E"));
QAction *swapcolors = makeAction("swapcolors", 0, tr("Swap Last Colors"), QString(), QKeySequence("X"));
QAction *smallerbrush = makeAction("ensmallenbrush", 0, tr("&Decrease Brush Size"), QString(), Qt::Key_BracketLeft);
QAction *biggerbrush = makeAction("embiggenbrush", 0, tr("&Increase Brush Size"), QString(), Qt::Key_BracketRight);
Expand All @@ -2366,13 +2367,13 @@ void MainWindow::setupActions()
biggerbrush->setAutoRepeat(true);

connect(erasertoggle, &QAction::triggered, _dock_toolsettings, &docks::ToolSettings::toggleEraserMode);
connect(_dock_toolsettings, &docks::ToolSettings::eraserModeChanged, erasertoggle, &QAction::setChecked);
connect(swapcolors, &QAction::triggered, _dock_colors, &docks::ColorBox::swapLastUsedColors);
connect(smallerbrush, &QAction::triggered, this, [this]() { _dock_toolsettings->quickAdjustCurrent1(-1); });
connect(biggerbrush, &QAction::triggered, this, [this]() { _dock_toolsettings->quickAdjustCurrent1(1); });
connect(layerUpAct, &QAction::triggered, _dock_layers, &docks::LayerList::selectAbove);
connect(layerDownAct, &QAction::triggered, _dock_layers, &docks::LayerList::selectBelow);

toolshortcuts->addAction(erasertoggle);
toolshortcuts->addAction(swapcolors);
toolshortcuts->addAction(smallerbrush);
toolshortcuts->addAction(biggerbrush);
Expand All @@ -2384,8 +2385,12 @@ void MainWindow::setupActions()
drawtools->setObjectName("drawtoolsbar");
toggletoolbarmenu->addAction(drawtools->toggleViewAction());

// Add a separator before color picker to separate brushes from non-destructive tools
for(QAction *dt : _drawingtools->actions()) {
// Eraser tool toggle in its own group
drawtools->addAction(erasertoggle);
drawtools->addSeparator();

for(QAction *dt : m_drawingtools->actions()) {
// Add a separator before color picker to separate brushes from non-destructive tools
if(dt == pickertool)
drawtools->addSeparator();
drawtools->addAction(dt);
Expand Down Expand Up @@ -2436,7 +2441,7 @@ void MainWindow::setupActions()
});

// Add temporary tool change shortcut detector
for(QAction *act : _drawingtools->actions())
for(QAction *act : m_drawingtools->actions())
act->installEventFilter(_tempToolSwitchShortcut);

for(QAction *act : m_brushSlots->actions())
Expand Down
2 changes: 1 addition & 1 deletion src/desktop/mainwindow.h
Expand Up @@ -234,7 +234,7 @@ private slots:
QActionGroup *_currentdoctools; // actions relating to the currently open document
QActionGroup *m_admintools; // session operator actions
QActionGroup *m_docadmintools; // current document related operator actions
QActionGroup *_drawingtools; // drawing tool selection
QActionGroup *m_drawingtools; // drawing tool selection
QActionGroup *m_brushSlots; // tool slot shortcuts

int _lastToolBeforePaste; // Last selected tool before Paste was used
Expand Down
52 changes: 29 additions & 23 deletions src/desktop/toolwidgets/brushsettings.cpp
Expand Up @@ -30,11 +30,11 @@ using widgets::GroupedToolButton;

#include "ui_brushdock.h"

#include <QMenu>
#include <QKeyEvent>
#include <QPainter>
#include <QMimeData>
#include <QSettings>
#include <QStandardItemModel>

namespace tools {

Expand Down Expand Up @@ -135,7 +135,7 @@ static const int BRUSH_COUNT = 5;
struct BrushSettings::Private {
Ui_BrushDock ui;

QMenu *blendModes, *eraseModes;
QStandardItemModel *blendModes, *eraseModes;
BrushSettings *basicSettings;
BrushPresetModel *presets;

Expand All @@ -158,21 +158,24 @@ struct BrushSettings::Private {
return currentTool().value(toolprop::COLOR, QColor(Qt::black)).value<QColor>();
}

Private()
Private(BrushSettings *b)
: current(0), updateInProgress(false)
{
blendModes = new QMenu;
blendModes = new QStandardItemModel(0, 1, b);
for(const auto bm : paintcore::getBlendModeNames(paintcore::BlendMode::BrushMode)) {
QAction *a = blendModes->addAction(bm.second);
a->setProperty("blendmode", QVariant(bm.first));
auto item = new QStandardItem(bm.second);
item->setData(bm.first, Qt::UserRole);
blendModes->appendRow(item);
}

eraseModes = new QMenu;
QAction *e1 = eraseModes->addAction(QApplication::tr("Erase"));
e1->setProperty("blendmode", QVariant(paintcore::BlendMode::MODE_ERASE));
eraseModes = new QStandardItemModel(0, 1, b);
auto erase1 = new QStandardItem(QApplication::tr("Erase"));
erase1->setData(QVariant(paintcore::BlendMode::MODE_ERASE), Qt::UserRole);
eraseModes->appendRow(erase1);

QAction *e2 = eraseModes->addAction(QApplication::tr("Color erase"));
e2->setProperty("blendmode", QVariant(paintcore::BlendMode::MODE_COLORERASE));
auto erase2 = new QStandardItem(QApplication::tr("Color Erase"));
erase2->setData(QVariant(paintcore::BlendMode::MODE_COLORERASE), Qt::UserRole);
eraseModes->appendRow(erase2);
}

void updateBrush()
Expand Down Expand Up @@ -200,7 +203,7 @@ struct BrushSettings::Private {
};

BrushSettings::BrushSettings(ToolController *ctrl, QObject *parent)
: ToolSettings(ctrl, parent), d(new Private)
: ToolSettings(ctrl, parent), d(new Private(this))
{
d->basicSettings = this;
d->presets = BrushPresetModel::getSharedInstance();
Expand Down Expand Up @@ -229,9 +232,7 @@ QWidget *BrushSettings::createUiWidget(QWidget *parent)
connect(d->ui.preview, &BrushPreview::brushChanged, controller(), &ToolController::setActiveBrush);

// Internal updates
connect(d->blendModes, &QMenu::triggered, this, &BrushSettings::selectBlendMode);
connect(d->eraseModes, &QMenu::triggered, this, &BrushSettings::selectBlendMode);
connect(d->ui.erasermode, &QToolButton::toggled, this, &BrushSettings::setEraserMode);
connect(d->ui.blendmode, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, &BrushSettings::selectBlendMode);

connect(d->ui.hardedgeMode, &QToolButton::clicked, this, &BrushSettings::updateFromUi);
connect(d->ui.hardedgeMode, &QToolButton::clicked, this, &BrushSettings::updateUi);
Expand Down Expand Up @@ -305,14 +306,14 @@ void BrushSettings::setEraserMode(bool erase)
updateUi();
}

void BrushSettings::selectBlendMode(QAction *modeSelectionAction)
void BrushSettings::selectBlendMode(int modeIndex)
{
QString prop;
if(d->currentTool().boolValue(toolprop::USE_ERASEMODE, false))
prop = toolprop::ERASEMODE;
else
prop = toolprop::BLENDMODE;
d->currentTool().setValue(prop, modeSelectionAction->property("blendmode"));
d->currentTool().setValue(prop, d->ui.blendmode->model()->index(modeIndex,0).data(Qt::UserRole).toInt());
updateUi();
}

Expand Down Expand Up @@ -359,16 +360,21 @@ void BrushSettings::updateUi()

// Show correct blending mode
int blendmode;
if(tool.boolValue(toolprop::USE_ERASEMODE, false)) {
d->ui.blendmode->setMenu(d->eraseModes);
d->ui.erasermode->setChecked(true);
const bool erasemode = tool.boolValue(toolprop::USE_ERASEMODE, false);
if(erasemode) {
d->ui.blendmode->setModel(d->eraseModes);
blendmode = tool.intValue(toolprop::ERASEMODE, paintcore::BlendMode::MODE_ERASE);
} else {
d->ui.blendmode->setMenu(d->blendModes);
d->ui.erasermode->setChecked(false);
d->ui.blendmode->setModel(d->blendModes);
blendmode = tool.intValue(toolprop::BLENDMODE, paintcore::BlendMode::MODE_NORMAL);
}
d->ui.blendmode->setText(QApplication::tr(paintcore::findBlendMode(blendmode).name));
for(int i=0;i<d->ui.blendmode->model()->rowCount();++i) {
if(d->ui.blendmode->model()->index(i,0).data(Qt::UserRole) == blendmode) {
d->ui.blendmode->setCurrentIndex(i);
break;
}
}
emit eraseModeChanged(erasemode);

// Set values
d->ui.brushsize->setValue(brush.intValue(brushprop::SIZE, 1));
Expand Down
3 changes: 2 additions & 1 deletion src/desktop/toolwidgets/brushsettings.h
Expand Up @@ -65,12 +65,13 @@ public slots:

signals:
void colorChanged(const QColor &color);
void eraseModeChanged(bool erase);

protected:
QWidget *createUiWidget(QWidget *parent) override;

private slots:
void selectBlendMode(QAction *modeSelectionAction);
void selectBlendMode(int);
void updateUi();
void updateFromUi();

Expand Down
15 changes: 0 additions & 15 deletions src/desktop/toolwidgets/toolsettings.cpp
Expand Up @@ -20,24 +20,9 @@
#include "toolsettings.h"
#include "tools/toolproperties.h"
#include "tools/toolcontroller.h"
#include "widgets/brushpreview.h"

#include "core/blendmodes.h"

#include <QComboBox>

namespace tools {

void populateBlendmodeBox(QComboBox *box, widgets::BrushPreview *preview) {
for(const auto bm : paintcore::getBlendModeNames(paintcore::BlendMode::BrushMode))
box->addItem(bm.second, bm.first);

preview->setBlendingMode(paintcore::BlendMode::MODE_NORMAL);
box->connect(box, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [box,preview](int) {
preview->setBlendingMode(paintcore::BlendMode::Mode(box->currentData().toInt()));
});
}

QWidget *ToolSettings::createUi(QWidget *parent)
{
Q_ASSERT(m_widget==0);
Expand Down
8 changes: 0 additions & 8 deletions src/desktop/toolwidgets/toolsettings.h
Expand Up @@ -126,14 +126,6 @@ class ToolSettings : public QObject {
QWidget *m_widget;
};

/**
* \brief Add the available brush blending modes to a dropdown box
*
* This function also connects the combobox's change event to the brush preview
* widget's setBlendingMode function.
*/
void populateBlendmodeBox(QComboBox *box, widgets::BrushPreview *preview);

}

#endif
Expand Down

0 comments on commit 8b446aa

Please sign in to comment.