From 639f2d62ea9ff9c95dd7174461f96dc927378b70 Mon Sep 17 00:00:00 2001 From: Andreas Butti Date: Sun, 20 Jan 2019 16:48:09 +0100 Subject: [PATCH] Touch / Scrollbar --- src/gui/MainWindow.cpp | 81 +++++++++++++++------- src/gui/MainWindow.h | 2 +- src/gui/XournalView.cpp | 4 +- src/gui/XournalView.h | 3 +- src/gui/inputdevices/NewGtkInputDevice.cpp | 7 +- src/gui/widgets/XournalWidget.cpp | 24 ++----- src/gui/widgets/XournalWidget.h | 21 +++++- 7 files changed, 92 insertions(+), 50 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 60148783..f216dcaf 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -208,26 +208,57 @@ void MainWindow::initXournalWidget() { XOJ_CHECK_TYPE(MainWindow); - winXournal = gtk_scrolled_window_new(NULL, NULL); + bool customScrollable = true; - gtk_container_add(GTK_CONTAINER(get("boxContents")), winXournal); + GtkWidget* boxContents = get("boxContents"); - GtkWidget* vpXournal = gtk_viewport_new(NULL, NULL); + if (customScrollable) + { + GtkWidget* box1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add(GTK_CONTAINER(boxContents), box1); - gtk_container_add(GTK_CONTAINER(winXournal), vpXournal); + GtkWidget* box2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_container_add(GTK_CONTAINER(box1), box2); + XojScrollbars scrollbar; + scrollbar.adjHorizontal = gtk_adjustment_new(0, 0, 100, 5, 10, 10); + scrollbar.adjVertical = gtk_adjustment_new(0, 0, 100, 5, 10, 10); - this->xournal = new XournalView(vpXournal, control); + this->xournal = new XournalView(box2, control, scrollbar); - if (control->getSettings()->isZoomGesturesEnabled()) - { - this->zoomGesture = new ZoomGesture(winXournal, control->getZoomControl()); + if (control->getSettings()->isZoomGesturesEnabled()) + { + this->zoomGesture = new ZoomGesture(winXournal, control->getZoomControl()); + } + + gtk_container_add(GTK_CONTAINER(box2), gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, scrollbar.adjVertical)); + gtk_container_add(GTK_CONTAINER(box1), gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, scrollbar.adjHorizontal)); + + + gtk_widget_show_all(box1); } else { - this->zoomGesture = NULL; - } + winXournal = gtk_scrolled_window_new(NULL, NULL); + + gtk_container_add(GTK_CONTAINER(boxContents), winXournal); + + GtkWidget* vpXournal = gtk_viewport_new(NULL, NULL); + + gtk_container_add(GTK_CONTAINER(winXournal), vpXournal); - gtk_widget_show_all(winXournal); + XojScrollbars scrollbar; + scrollbar.adjHorizontal = gtk_scrollable_get_hadjustment(GTK_SCROLLABLE(vpXournal)); + scrollbar.adjVertical = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(vpXournal)); + + this->xournal = new XournalView(vpXournal, control, scrollbar); + + if (control->getSettings()->isZoomGesturesEnabled()) + { + this->zoomGesture = new ZoomGesture(winXournal, control->getZoomControl()); + } + + gtk_widget_show_all(winXournal); + } } /** @@ -415,24 +446,26 @@ void MainWindow::updateScrollbarSidebarPosition() XOJ_CHECK_TYPE(MainWindow); GtkWidget* panelMainContents = get("panelMainContents"); - GtkScrolledWindow* scrolledWindow = GTK_SCROLLED_WINDOW(winXournal); - - ScrollbarHideType type = this->getControl()->getSettings()->getScrollbarHideType(); - bool scrollbarOnLeft = control->getSettings()->isScrollbarOnLeft(); - if (scrollbarOnLeft) - { - gtk_scrolled_window_set_placement(scrolledWindow, GTK_CORNER_TOP_RIGHT); - } - else + if (winXournal != NULL) { - gtk_scrolled_window_set_placement(scrolledWindow, GTK_CORNER_TOP_LEFT); - } + GtkScrolledWindow* scrolledWindow = GTK_SCROLLED_WINDOW(winXournal); - gtk_widget_set_visible(gtk_scrolled_window_get_hscrollbar(scrolledWindow), !(type & SCROLLBAR_HIDE_HORIZONTAL)); - gtk_widget_set_visible(gtk_scrolled_window_get_vscrollbar(scrolledWindow), !(type & SCROLLBAR_HIDE_VERTICAL)); + ScrollbarHideType type = this->getControl()->getSettings()->getScrollbarHideType(); + bool scrollbarOnLeft = control->getSettings()->isScrollbarOnLeft(); + if (scrollbarOnLeft) + { + gtk_scrolled_window_set_placement(scrolledWindow, GTK_CORNER_TOP_RIGHT); + } + else + { + gtk_scrolled_window_set_placement(scrolledWindow, GTK_CORNER_TOP_LEFT); + } + gtk_widget_set_visible(gtk_scrolled_window_get_hscrollbar(scrolledWindow), !(type & SCROLLBAR_HIDE_HORIZONTAL)); + gtk_widget_set_visible(gtk_scrolled_window_get_vscrollbar(scrolledWindow), !(type & SCROLLBAR_HIDE_VERTICAL)); + } GtkWidget* sidebar = get("sidebar"); GtkWidget* boxContents = get("boxContents"); diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index 30742ce2..3ec3c6b8 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -135,7 +135,7 @@ private: XournalView* xournal = NULL; GtkWidget* winXournal = NULL; - ZoomGesture* zoomGesture; + ZoomGesture* zoomGesture = NULL; // Toolbars ToolMenuHandler* toolbar; diff --git a/src/gui/XournalView.cpp b/src/gui/XournalView.cpp index 84e17f82..49805965 100644 --- a/src/gui/XournalView.cpp +++ b/src/gui/XournalView.cpp @@ -23,7 +23,7 @@ #include -XournalView::XournalView(GtkWidget* parent, Control* control) +XournalView::XournalView(GtkWidget* parent, Control* control, XojScrollbars scrollbar) { XOJ_INIT_TYPE(XournalView); @@ -31,7 +31,7 @@ XournalView::XournalView(GtkWidget* parent, Control* control) this->cache = new PdfCache(control->getSettings()->getPdfPageCacheSize()); registerListener(control); - this->widget = gtk_xournal_new(this, GTK_SCROLLABLE(parent)); + this->widget = gtk_xournal_new(this, scrollbar); // we need to refer widget here, because we unref it somewhere twice!? g_object_ref(this->widget); diff --git a/src/gui/XournalView.h b/src/gui/XournalView.h index e8418d55..76363d70 100644 --- a/src/gui/XournalView.h +++ b/src/gui/XournalView.h @@ -14,6 +14,7 @@ #include "control/zoom/ZoomListener.h" #include "model/DocumentListener.h" #include "model/PageRef.h" +#include "widgets/XournalWidget.h" #include @@ -35,7 +36,7 @@ class TouchHelper; class XournalView : public DocumentListener, public ZoomListener { public: - XournalView(GtkWidget* parent, Control* control); + XournalView(GtkWidget* parent, Control* control, XojScrollbars scrollbar); virtual ~XournalView(); public: diff --git a/src/gui/inputdevices/NewGtkInputDevice.cpp b/src/gui/inputdevices/NewGtkInputDevice.cpp index 12972666..3192e006 100644 --- a/src/gui/inputdevices/NewGtkInputDevice.cpp +++ b/src/gui/inputdevices/NewGtkInputDevice.cpp @@ -133,13 +133,16 @@ void NewGtkInputDevice::initWidget() GDK_SCROLL_MASK | // Touch / Pen / Mouse + + // Disable touch +// GDK_TOUCH_MASK | + GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_SMOOTH_SCROLL_MASK | GDK_ENTER_NOTIFY_MASK | - GDK_LEAVE_NOTIFY_MASK | - GDK_TOUCH_MASK); + GDK_LEAVE_NOTIFY_MASK); g_signal_connect(widget, "event", G_CALLBACK(event_cb), this); } diff --git a/src/gui/widgets/XournalWidget.cpp b/src/gui/widgets/XournalWidget.cpp index 09d7e0d7..0d2f687f 100644 --- a/src/gui/widgets/XournalWidget.cpp +++ b/src/gui/widgets/XournalWidget.cpp @@ -71,18 +71,16 @@ GType gtk_xournal_get_type(void) return gtk_xournal_type; } -GtkWidget* gtk_xournal_new(XournalView* view, GtkScrollable* parent) +GtkWidget* gtk_xournal_new(XournalView* view, XojScrollbars scrollbar) { GtkXournal* xoj = GTK_XOURNAL(g_object_new(gtk_xournal_get_type(), NULL)); xoj->view = view; - xoj->parent = parent; + xoj->scrollbar = scrollbar; xoj->scrollX = 0; xoj->scrollY = 0; xoj->x = 0; xoj->y = 0; - xoj->layout = new Layout(view, - gtk_scrollable_get_hadjustment(parent), - gtk_scrollable_get_vadjustment(parent)); + xoj->layout = new Layout(view, scrollbar.adjHorizontal, scrollbar.adjVertical); xoj->pagePositionCache = new PagePositionCache(); xoj->selection = NULL; @@ -118,8 +116,8 @@ Rectangle* gtk_xournal_get_visible_area(GtkWidget* widget, XojPageView* p) GtkXournal* xournal = GTK_XOURNAL(widget); GdkRectangle r2; - GtkAdjustment* vadj = gtk_scrollable_get_vadjustment(xournal->parent); - GtkAdjustment* hadj = gtk_scrollable_get_hadjustment(xournal->parent); + GtkAdjustment* vadj = xournal->scrollbar.adjVertical; + GtkAdjustment* hadj = xournal->scrollbar.adjHorizontal; r2.x = (int)gtk_adjustment_get_lower(hadj); r2.y = (int)gtk_adjustment_get_lower(vadj); r2.width = (int)gtk_adjustment_get_page_size(hadj); @@ -160,23 +158,15 @@ static void gtk_xournal_init(GtkXournal* xournal) gtk_widget_set_can_focus(widget, TRUE); } -static void -gtk_xournal_get_preferred_width(GtkWidget *widget, - gint *minimal_width, - gint *natural_width) +static void gtk_xournal_get_preferred_width(GtkWidget* widget, gint* minimal_width, gint* natural_width) { GtkXournal* xournal = GTK_XOURNAL(widget); - *minimal_width = *natural_width = xournal->layout->getLayoutWidth(); } -static void -gtk_xournal_get_preferred_height(GtkWidget *widget, - gint *minimal_height, - gint *natural_height) +static void gtk_xournal_get_preferred_height(GtkWidget* widget, gint* minimal_height, gint* natural_height) { GtkXournal* xournal = GTK_XOURNAL(widget); - *minimal_height = *natural_height = xournal->layout->getLayoutHeight(); } diff --git a/src/gui/widgets/XournalWidget.h b/src/gui/widgets/XournalWidget.h index 126497d4..bebc20f4 100644 --- a/src/gui/widgets/XournalWidget.h +++ b/src/gui/widgets/XournalWidget.h @@ -27,6 +27,21 @@ class PagePositionCache; class Rectangle; class XournalView; + +typedef struct +{ + /** + * Horizontal scrollbar + */ + GtkAdjustment* adjHorizontal; + + /** + * Vertical scrollbar + */ + GtkAdjustment* adjVertical; +} XojScrollbars; + + typedef struct _GtkXournal GtkXournal; typedef struct _GtkXournalClass GtkXournalClass; @@ -40,9 +55,9 @@ struct _GtkXournal XournalView* view; /** - * Scrollabel container + * Scrollbar */ - GtkScrollable* parent; + XojScrollbars scrollbar; /** * Visible area @@ -75,7 +90,7 @@ struct _GtkXournalClass GType gtk_xournal_get_type(); -GtkWidget* gtk_xournal_new(XournalView* view, GtkScrollable* parent); +GtkWidget* gtk_xournal_new(XournalView* view, XojScrollbars scrollbar); Layout* gtk_xournal_get_layout(GtkWidget* widget);