Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewrite temporary tool handling #1675

Merged
merged 1 commit into from
Nov 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 1 addition & 8 deletions app/src/statusbar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,14 +100,7 @@ void StatusBar::updateToolStatus(ToolType tool)
mToolLabel->setText(tr("Click and drag to create or modify a selection. Hold Alt to modify its contents or press Backspace to clear them."));
break;
case MOVE:
if (mEditor->getScribbleArea()->isTemporaryTool())
{
mToolLabel->setText(tr("Click and drag to move an object."));
}
else
{
mToolLabel->setText(tr("Click and drag to move an object. Hold Ctrl to rotate."));
}
mToolLabel->setText(tr("Click and drag to move an object. Hold Ctrl to rotate."));
break;
case HAND:
mToolLabel->setText(tr("Click and drag to pan. Hold Ctrl to zoom or Alt to rotate."));
Expand Down
126 changes: 35 additions & 91 deletions core_lib/src/interface/scribblearea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -353,8 +353,9 @@ void ScribbleArea::setModified(int layerNumber, int frameNumber)

bool ScribbleArea::event(QEvent *event)
{
if (event->type() == QEvent::WindowDeactivate) {
setPrevTool();
if (event->type() == QEvent::WindowDeactivate)
{
editor()->tools()->clearTemporaryTool();
}
return QWidget::event(event);
}
Expand All @@ -371,27 +372,29 @@ void ScribbleArea::keyPressEvent(QKeyEvent *event)
mKeyboardInUse = true;

if (isPointerInUse()) { return; } // prevents shortcuts calls while drawing
if (mInstantTool) { return; } // prevents shortcuts calls while using instant tool

if (currentTool()->keyPressEvent(event))
{
return; // has been handled by tool
}

// --- fixed control key shortcuts ---
if (event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier))
if (event->modifiers() == (Qt::ControlModifier | Qt::ShiftModifier) &&
editor()->tools()->setTemporaryTool(ERASER, 0, event->modifiers()))
{
setTemporaryTool(ERASER);
return;
}

// ---- fixed normal keys ----

auto selectMan = mEditor->select();
bool isSomethingSelected = selectMan->somethingSelected();
if (isSomethingSelected) {
if (isSomethingSelected)
{
keyEventForSelection(event);
} else {
}
else
{
keyEvent(event);
}
}
Expand All @@ -404,37 +407,40 @@ void ScribbleArea::keyEventForSelection(QKeyEvent* event)
case Qt::Key_Right:
selectMan->translate(QPointF(1, 0));
paintTransformedSelection();
break;
return;
case Qt::Key_Left:
selectMan->translate(QPointF(-1, 0));
paintTransformedSelection();
break;
return;
case Qt::Key_Up:
selectMan->translate(QPointF(0, -1));
paintTransformedSelection();
break;
return;
case Qt::Key_Down:
selectMan->translate(QPointF(0, 1));
paintTransformedSelection();
break;
return;
case Qt::Key_Return:
applyTransformedSelection();
mEditor->deselectAll();
break;
return;
case Qt::Key_Escape:
cancelTransformedSelection();
mEditor->deselectAll();
break;
return;
case Qt::Key_Backspace:
deleteSelection();
mEditor->deselectAll();
break;
return;
case Qt::Key_Space:
setTemporaryTool(HAND); // just call "setTemporaryTool()" to activate temporarily any tool
if (editor()->tools()->setTemporaryTool(HAND, Qt::Key_Space, Qt::NoModifier)) {
return;
}
break;
default:
event->ignore();
break;
}
event->ignore();
}

void ScribbleArea::keyEvent(QKeyEvent* event)
Expand All @@ -443,29 +449,26 @@ void ScribbleArea::keyEvent(QKeyEvent* event)
{
case Qt::Key_Right:
mEditor->scrubForward();
event->ignore();
break;
case Qt::Key_Left:
mEditor->scrubBackward();
event->ignore();
break;
case Qt::Key_Up:
mEditor->layers()->gotoNextLayer();
event->ignore();
break;
case Qt::Key_Down:
mEditor->layers()->gotoPreviouslayer();
event->ignore();
break;
case Qt::Key_Return:
event->ignore();
break;
case Qt::Key_Space:
setTemporaryTool(HAND); // just call "setTemporaryTool()" to activate temporarily any tool
if(editor()->tools()->setTemporaryTool(HAND, Qt::Key_Space, Qt::NoModifier))
{
return;
}
break;
default:
event->ignore();
break;
}
event->ignore();
}

void ScribbleArea::keyReleaseEvent(QKeyEvent *event)
Expand All @@ -478,14 +481,10 @@ void ScribbleArea::keyReleaseEvent(QKeyEvent *event)

mKeyboardInUse = false;

editor()->tools()->tryClearTemporaryTool(event->key());

if (isPointerInUse()) { return; }

if (mInstantTool) // temporary tool
{
currentTool()->keyReleaseEvent(event);
setPrevTool();
return;
}
if (currentTool()->keyReleaseEvent(event))
{
// has been handled by tool
Expand Down Expand Up @@ -622,10 +621,10 @@ void ScribbleArea::pointerPressEvent(PointerEvent* event)
}
}

if (event->buttons() & (Qt::MidButton | Qt::RightButton))
if (event->buttons() & (Qt::MidButton | Qt::RightButton) &&
editor()->tools()->setTemporaryTool(HAND, event->buttons()))
{
setTemporaryTool(HAND);
getTool(HAND)->pointerPressEvent(event);
currentTool()->pointerPressEvent(event);
}

const bool isPressed = event->buttons() & Qt::LeftButton;
Expand Down Expand Up @@ -659,13 +658,6 @@ void ScribbleArea::pointerMoveEvent(PointerEvent* event)
}
}

if (event->buttons() == Qt::RightButton)
{
setCursor(getTool(HAND)->cursor());
getTool(HAND)->pointerMoveEvent(event);
event->accept();
return;
}
currentTool()->pointerMoveEvent(event);
}

Expand All @@ -687,11 +679,7 @@ void ScribbleArea::pointerReleaseEvent(PointerEvent* event)
//qDebug() << "release event";
currentTool()->pointerReleaseEvent(event);

// ---- last check (at the very bottom of mouseRelease) ----
if (mInstantTool && !mKeyboardInUse) // temp tool and released all keys ?
{
setPrevTool();
}
editor()->tools()->tryClearTemporaryTool(event->button());
}

void ScribbleArea::handleDoubleClick()
Expand Down Expand Up @@ -1630,48 +1618,13 @@ BaseTool* ScribbleArea::getTool(ToolType eToolType)
return editor()->tools()->getTool(eToolType);
}

// TODO: check this method
void ScribbleArea::setCurrentTool(ToolType eToolMode)
{
if (currentTool() != nullptr && eToolMode != currentTool()->type())
{
//qDebug() << "Set Current Tool" << BaseTool::TypeName(eToolMode);
if (BaseTool::TypeName(eToolMode) == "")
{
// tool does not exist
//Q_ASSERT_X( false, "", "" );
return;
}

if (currentTool()->type() == MOVE)
{
paintTransformedSelection();
mEditor->deselectAll();
}
else if (currentTool()->type() == POLYLINE)
{
mEditor->deselectAll();
}
}

mPrevToolType = currentTool()->type();
Q_UNUSED(eToolMode)

// change cursor
setCursor(currentTool()->cursor());
updateCanvasCursor();
//qDebug() << "fn: setCurrentTool " << "call: setCursor()" << "current tool" << currentTool()->typeName();
}

void ScribbleArea::setTemporaryTool(ToolType eToolMode)
{
// Only switch to temporary tool if not already in this state
// and temporary tool is not already the current tool.
if (!mInstantTool && currentTool()->type() != eToolMode)
{
mInstantTool = true; // used to return to previous tool when finished (keyRelease).
mPrevTemporalToolType = currentTool()->type();
editor()->tools()->setCurrentTool(eToolMode);
}
}

void ScribbleArea::deleteSelection()
Expand Down Expand Up @@ -1735,15 +1688,6 @@ void ScribbleArea::clearImage()
setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
}

void ScribbleArea::setPrevTool()
{
if (mInstantTool)
{
editor()->tools()->setCurrentTool(mPrevTemporalToolType);
mInstantTool = false;
}
}

void ScribbleArea::paletteColorChanged(QColor color)
{
Q_UNUSED(color)
Expand Down
8 changes: 0 additions & 8 deletions core_lib/src/interface/scribblearea.h
Original file line number Diff line number Diff line change
Expand Up @@ -137,15 +137,12 @@ class ScribbleArea : public QWidget
BaseTool* currentTool() const;
BaseTool* getTool(ToolType eToolMode);
void setCurrentTool(ToolType eToolMode);
void setTemporaryTool(ToolType eToolMode);
void setPrevTool();

void floodFillError(int errorType);

bool isMouseInUse() const { return mMouseInUse; }
bool isTabletInUse() const { return mTabletInUse; }
bool isPointerInUse() const { return mMouseInUse || mTabletInUse; }
bool isTemporaryTool() const { return mInstantTool; }

void keyEvent(QKeyEvent* event);
void keyEventForSelection(QKeyEvent* event);
Expand Down Expand Up @@ -245,8 +242,6 @@ public slots:
VectorImage* currentVectorImage(Layer* layer) const;

MoveMode mMoveMode = MoveMode::NONE;
ToolType mPrevTemporalToolType = ERASER;
ToolType mPrevToolType = PEN; // previous tool (except temporal)

BitmapImage mBitmapSelection; // used to temporary store a transformed portion of a bitmap image

Expand Down Expand Up @@ -283,9 +278,6 @@ public slots:
QPoint mCursorCenterPos;
QPointF mTransformedCursorPos;

//instant tool (temporal eg. eraser)
bool mInstantTool = false; //whether or not using temporal tool

PreferenceManager* mPrefs = nullptr;

QPixmap mCanvas;
Expand Down
Loading