You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.1 KiB
84 lines
2.1 KiB
// |
|
// Created by ulrich on 06.04.19. |
|
// |
|
|
|
#include "AbstractInputHandler.h" |
|
|
|
#include "gui/XournalppCursor.h" |
|
|
|
#include "InputContext.h" |
|
#include <cmath> |
|
|
|
AbstractInputHandler::AbstractInputHandler(InputContext* inputContext) { this->inputContext = inputContext; } |
|
|
|
AbstractInputHandler::~AbstractInputHandler() = default; |
|
|
|
void AbstractInputHandler::block(bool block) { |
|
this->blocked = block; |
|
if (!block) { |
|
this->onUnblock(); |
|
} else { |
|
this->onBlock(); |
|
} |
|
} |
|
|
|
auto AbstractInputHandler::isBlocked() const -> bool { return this->blocked; } |
|
|
|
auto AbstractInputHandler::handle(InputEvent const& event) -> bool { |
|
if (!this->blocked) { |
|
this->inputContext->getXournal()->view->getCursor()->setInputDeviceClass(event.deviceClass); |
|
return this->handleImpl(event); |
|
} |
|
return true; |
|
} |
|
|
|
/** |
|
* Get Page at current position |
|
* |
|
* @return page or nullptr if none |
|
*/ |
|
auto AbstractInputHandler::getPageAtCurrentPosition(InputEvent const& event) -> XojPageView* { |
|
if (!event) { |
|
return nullptr; |
|
} |
|
|
|
gdouble eventX = event.relativeX; |
|
gdouble eventY = event.relativeY; |
|
|
|
GtkXournal* xournal = this->inputContext->getXournal(); |
|
|
|
double x = eventX + xournal->x; |
|
double y = eventY + xournal->y; |
|
|
|
return xournal->layout->getPageViewAt(x, y); |
|
} |
|
|
|
/** |
|
* Get input data relative to current input page |
|
*/ |
|
auto AbstractInputHandler::getInputDataRelativeToCurrentPage(XojPageView* page, InputEvent const& event) |
|
-> PositionInputData { |
|
g_assert(page != nullptr); |
|
GtkXournal* xournal = inputContext->getXournal(); |
|
|
|
gdouble eventX = event.relativeX; |
|
gdouble eventY = event.relativeY; |
|
|
|
PositionInputData pos = {}; |
|
pos.x = eventX - page->getX() - xournal->x; |
|
pos.y = eventY - page->getY() - xournal->y; |
|
pos.pressure = Point::NO_PRESSURE; |
|
|
|
if (this->inputContext->getSettings()->isPressureSensitivity()) { |
|
pos.pressure = 1-exp(- event.pressure/0.2); |
|
} |
|
|
|
pos.state = this->inputContext->getModifierState(); |
|
pos.timestamp = event.timestamp; |
|
|
|
return pos; |
|
} |
|
|
|
void AbstractInputHandler::onBlock() {} |
|
|
|
void AbstractInputHandler::onUnblock() {}
|
|
|