Working on Zooming

presentation
Andreas Butti 7 years ago
parent 5563c1a991
commit 071c47d945
  1. 76
      src/control/zoom/ZoomControl.cpp
  2. 4
      src/control/zoom/ZoomControl.h
  3. 14
      src/control/zoom/ZoomGesture.cpp
  4. 5
      src/control/zoom/ZoomGesture.h
  5. 10
      src/gui/MainWindow.cpp
  6. 2
      src/gui/MainWindow.h
  7. 21
      src/gui/inputdevices/InputSequence.cpp

@ -51,16 +51,8 @@ void ZoomControl::startZoomSequence(double centerX, double centerY)
zoomSequenceStart = this->zoom;
// if (centerX == -1 || centerY == -1)
// {
// this->zoomCenterX = gtk_widget_get_allocated_width(widget) / 2;
// this->zoomCenterY = gtk_widget_get_allocated_height(widget) / 2;
// }
// else
// {
this->zoomCenterX = centerX;
this->zoomCenterY = centerY;
// }
this->zoomCenterX = centerX;
this->zoomCenterY = centerY;
}
/**
@ -97,20 +89,22 @@ void ZoomControl::scrollToZoomPosition(XojPageView* view)
{
Layout* layout = gtk_xournal_get_layout(this->view->getWidget());
if (this->zoomCenterX == -1 || this->zoomCenterY == -1)
{
// get margins for relative scroll calculation
double marginLeft = (double) view->layout.getMarginLeft();
double marginTop = (double) view->layout.getMarginTop();
int visX = (int) ((zoomCenterX - marginLeft) * (this->zoom / zoomSequenceStart - 1));
int visY = (int) ((zoomCenterY - marginTop) * (this->zoom / zoomSequenceStart - 1));
layout->scrollAbs(zoomSequenceRectangle.x + visX, zoomSequenceRectangle.y + visY);
}
else
{
printf("ZoomPos: %lf / %lf\n", this->zoomCenterX, this->zoomCenterY);
// if (this->zoomCenterX == -1 || this->zoomCenterY == -1)
// {
// // get margins for relative scroll calculation
// double marginLeft = (double) view->layout.getMarginLeft();
// double marginTop = (double) view->layout.getMarginTop();
//
// int visX = (int) ((zoomCenterX - marginLeft) * (this->zoom / zoomSequenceStart - 1));
// int visY = (int) ((zoomCenterY - marginTop) * (this->zoom / zoomSequenceStart - 1));
// layout->scrollAbs(zoomSequenceRectangle.x + visX, zoomSequenceRectangle.y + visY);
// }
// else
// {
layout->scrollAbs(zoomSequenceRectangle.x * this->zoom, zoomSequenceRectangle.y * this->zoom);
}
// }
}
@ -283,42 +277,28 @@ bool ZoomControl::onScrolledwindowMainScrollEvent(GdkEventScroll* event)
if (state & GDK_CONTROL_MASK)
{
GtkWidget* topLevel = gtk_widget_get_toplevel(view->getWidget());
int wx = 0;
int wy = 0;
gtk_widget_translate_coordinates(view->getWidget(), topLevel, 0, 0, &wx, &wy);
printf("event: %lf / %lf (%lf / %lf)\n", event->x, event->y,
event->x_root, event->y_root
);
if (event->direction == GDK_SCROLL_UP ||
(event->direction == GDK_SCROLL_SMOOTH && event->delta_y > 0))
{
zoomIn(event->x, event->y);
zoomOut(event->x - wx, event->y - wy);
}
else if (event->direction == GDK_SCROLL_DOWN ||
(event->direction == GDK_SCROLL_SMOOTH && event->delta_y < 0))
{
zoomOut(event->x, event->y);
zoomIn(event->x - wx, event->y - wy);
}
return true;
}
// Shift + Wheel scrolls the in the perpendicular direction
if (state & GDK_SHIFT_MASK)
{
if (event->direction == GDK_SCROLL_UP)
{
event->direction = GDK_SCROLL_LEFT;
}
else if (event->direction == GDK_SCROLL_LEFT)
{
event->direction = GDK_SCROLL_UP;
}
else if (event->direction == GDK_SCROLL_DOWN)
{
event->direction = GDK_SCROLL_RIGHT;
}
else if (event->direction == GDK_SCROLL_RIGHT)
{
event->direction = GDK_SCROLL_DOWN;
}
event->state &= ~GDK_SHIFT_MASK;
state &= ~GDK_SHIFT_MASK;
}
return false;
}

@ -106,8 +106,8 @@ private:
double zoomFitValue;
// Current zoom center
gdouble zoomCenterX;
gdouble zoomCenterY;
double zoomCenterX;
double zoomCenterY;
/**
* Zoom at zoom sequence start

@ -2,7 +2,8 @@
#include "ZoomControl.h"
ZoomGesture::ZoomGesture(GtkWidget* parent, ZoomControl* zoomControl)
: zoomControl(zoomControl)
: zoomControl(zoomControl),
gestureActive(false)
{
XOJ_INIT_TYPE(ZoomGesture);
@ -42,10 +43,19 @@ ZoomGesture::~ZoomGesture()
XOJ_RELEASE_TYPE(ZoomGesture);
}
bool ZoomGesture::isGestureActive()
{
XOJ_CHECK_TYPE(ZoomGesture);
return gestureActive;
}
void ZoomGesture::zoomBegin()
{
XOJ_CHECK_TYPE(ZoomGesture);
gestureActive = true;
double x = 0;
double y = 0;
// get center of bounding box
@ -65,5 +75,7 @@ void ZoomGesture::zoomEnd()
{
XOJ_CHECK_TYPE(ZoomGesture);
gestureActive = false;
zoomControl->endZoomSequence();
}

@ -23,6 +23,9 @@ public:
ZoomGesture(GtkWidget* parent, ZoomControl* zoomControl);
virtual ~ZoomGesture();
public:
bool isGestureActive();
private:
void zoomBegin();
void zoomChanged(double zoom);
@ -33,4 +36,6 @@ private:
ZoomControl* zoomControl;
GtkGesture* gesture;
bool gestureActive;
};

@ -158,8 +158,14 @@ Layout* MainWindow::getLayout()
{
XOJ_CHECK_TYPE(MainWindow);
Layout* layout = gtk_xournal_get_layout(GTK_WIDGET(this->xournal->getWidget()));
return layout;
return gtk_xournal_get_layout(GTK_WIDGET(this->xournal->getWidget()));
}
bool MainWindow::isGestureActive()
{
XOJ_CHECK_TYPE(MainWindow);
return zoomGesture->isGestureActive();
}
bool cancellable_cancel(GCancellable* cancel)

@ -87,6 +87,8 @@ public:
Layout* getLayout();
bool isGestureActive();
private:
void createToolbarAndMenu();

@ -1,6 +1,7 @@
#include "InputSequence.h"
#include "NewGtkInputDevice.h"
#include "control/Control.h"
#include "control/settings/ButtonConfig.h"
#include "control/settings/Settings.h"
#include "control/tools/EditSelection.h"
@ -210,11 +211,10 @@ bool InputSequence::actionMoved()
inputHandler->getView()->penActionDetected();
}
printf("actionMoved()*************\n");
// if (xournal->view->zoom_gesture_active)
// {
// return false;
// }
if (xournal->view->getControl()->getWindow()->isGestureActive())
{
return false;
}
if (h->getToolType() == TOOL_HAND)
{
@ -418,12 +418,11 @@ void InputSequence::actionEnd()
Cursor* cursor = xournal->view->getCursor();
ToolHandler* h = inputHandler->getToolHandler();
printf("actionEnd()*************\n");
// if (xournal->view->zoom_gesture_active)
// {
// stopInput();
// return;
// }
if (xournal->view->getControl()->getWindow()->isGestureActive())
{
stopInput();
return;
}
cursor->setMouseDown(false);

Loading…
Cancel
Save