diff --git a/src/control/settings/Settings.cpp b/src/control/settings/Settings.cpp index cfe24974..5d683f68 100644 --- a/src/control/settings/Settings.cpp +++ b/src/control/settings/Settings.cpp @@ -107,6 +107,8 @@ void Settings::loadDefault() this->selectionColor = 0xff0000; + this->backgroundColor = 0xDCDAD5; + this->eventCompression = true; this->pageTemplate = "xoj/template\ncopyLastPageSettings=true\nsize=595.275591x841.889764\nbackgroundType=lined\nbackgroundColor=#ffffff\n"; @@ -372,6 +374,10 @@ void Settings::parseItem(xmlDocPtr doc, xmlNodePtr cur) { this->selectionColor = g_ascii_strtoll((const char*) value, NULL, 10); } + else if (xmlStrcmp(name, (const xmlChar*) "backgroundColor") == 0) + { + this->backgroundColor = g_ascii_strtoll((const char*) value, NULL, 10); + } else if (xmlStrcmp(name, (const xmlChar*) "addVerticalSpace") == 0) { this->addVerticalSpace = xmlStrcmp(value, (const xmlChar*) "true") ? false : true; @@ -723,6 +729,7 @@ void Settings::save() "If you have input problems, you can turn it of with false."); WRITE_INT_PROP(selectionColor); + WRITE_INT_PROP(backgroundColor); WRITE_INT_PROP(pdfPageCacheSize); WRITE_COMMENT("The count of rendered PDF pages which will be cached."); @@ -1500,13 +1507,6 @@ void Settings::setPresentationHideElements(string elements) save(); } -int Settings::getSelectionColor() -{ - XOJ_CHECK_TYPE(Settings); - - return this->selectionColor; -} - int Settings::getPdfPageCacheSize() { XOJ_CHECK_TYPE(Settings); @@ -1526,6 +1526,13 @@ void Settings::setPdfPageCacheSize(int size) save(); } +int Settings::getSelectionColor() +{ + XOJ_CHECK_TYPE(Settings); + + return this->selectionColor; +} + void Settings::setSelectionColor(int color) { XOJ_CHECK_TYPE(Settings); @@ -1538,6 +1545,25 @@ void Settings::setSelectionColor(int color) save(); } +int Settings::getBackgroundColor() +{ + XOJ_CHECK_TYPE(Settings); + + return this->backgroundColor; +} + +void Settings::setBackgroundColor(int color) +{ + XOJ_CHECK_TYPE(Settings); + + if (this->backgroundColor == color) + { + return; + } + this->backgroundColor = color; + save(); +} + XojFont& Settings::getFont() { XOJ_CHECK_TYPE(Settings); diff --git a/src/control/settings/Settings.h b/src/control/settings/Settings.h index 1fba7916..850ef5c8 100644 --- a/src/control/settings/Settings.h +++ b/src/control/settings/Settings.h @@ -256,6 +256,9 @@ public: int getSelectionColor(); void setSelectionColor(int color); + int getBackgroundColor(); + void setBackgroundColor(int color); + int getPdfPageCacheSize(); void setPdfPageCacheSize(int size); @@ -491,6 +494,11 @@ private: */ int selectionColor; + /** + * The color for Xournal page background + */ + int backgroundColor; + /** * Whether event compression should be enabled */ diff --git a/src/gui/Layout.cpp b/src/gui/Layout.cpp index 1ba4b385..bd824475 100644 --- a/src/gui/Layout.cpp +++ b/src/gui/Layout.cpp @@ -8,19 +8,18 @@ Layout::Layout(XournalView* _view, - GtkAdjustment* _adjHorizontal, - GtkAdjustment* _adjVertical) - : view(_view), - adjHorizontal(_adjHorizontal), - adjVertical(_adjVertical), - lastWidgetWidth(0), - layoutWidth(0), - layoutHeight(0) + GtkAdjustment* adjHorizontal, + GtkAdjustment* adjVertical) + : view(_view), + adjHorizontal(adjHorizontal), + adjVertical(adjVertical), + lastWidgetWidth(0), + layoutWidth(0), + layoutHeight(0) { XOJ_INIT_TYPE(Layout); g_signal_connect(adjHorizontal, "value-changed", G_CALLBACK(adjustmentValueChanged), this); - g_signal_connect(adjVertical, "value-changed", G_CALLBACK(adjustmentValueChanged), this); } @@ -131,6 +130,22 @@ Rectangle Layout::getVisibleRect() gtk_adjustment_get_page_size(adjVertical)); } +/** + * Returns the height of the entire Layout + */ +double Layout::getLayoutHeight() +{ + return layoutHeight; +} + +/** + * Returns the width of the entire Layout + */ +double Layout::getLayoutWidth() +{ + return layoutWidth; +} + /** * Padding outside the pages, including shadow */ @@ -150,8 +165,8 @@ void Layout::layoutPages() int len = this->view->viewPagesLen; Settings* settings = this->view->getControl()->getSettings(); - bool verticalSpace = settings->getAddVerticalSpace(), - horizontalSpace = settings->getAddHorizontalSpace(); + bool verticalSpace = settings->getAddVerticalSpace(); + bool horizontalSpace = settings->getAddHorizontalSpace(); bool dualPage = settings->isShowTwoPages(); int size[2] = { 0, 0 }; diff --git a/src/gui/Layout.h b/src/gui/Layout.h index 7dcf23cb..c47a84f0 100644 --- a/src/gui/Layout.h +++ b/src/gui/Layout.h @@ -60,18 +60,12 @@ public: /** * Returns the height of the entire Layout */ - double getLayoutHeight() - { - return layoutHeight; - } + double getLayoutHeight(); /** * Returns the width of the entire Layout */ - double getLayoutWidth() - { - return layoutWidth; - } + double getLayoutWidth(); /** * Returns the Rectangle which is currently visible diff --git a/src/gui/XournalView.cpp b/src/gui/XournalView.cpp index eadcabe0..359449a7 100644 --- a/src/gui/XournalView.cpp +++ b/src/gui/XournalView.cpp @@ -866,18 +866,7 @@ void XournalView::repaintSelection(bool evenWithoutSelection) return; } - // Redrawable * red = selection->getView(); - // double zoom = getZoom(); - // int x0 = red->getX(); - // int y0 = red->getY(); - // int x = selection->getX() * zoom; - // int y = selection->getY() * zoom; - // int w = selection->getWidth() * zoom; - // int h = selection->getHeight() * zoom; - // - // gtk_xournal_repaint_area(this->widget, x0 + x - 10, y0 + y - 10, w + 20, h + 20); - - // TODO OPTIMIZE ? + // repaint always the whole widget gtk_widget_queue_draw(this->widget); } diff --git a/src/gui/dialog/SettingsDialog.cpp b/src/gui/dialog/SettingsDialog.cpp index ed150927..fb3f08cb 100644 --- a/src/gui/dialog/SettingsDialog.cpp +++ b/src/gui/dialog/SettingsDialog.cpp @@ -169,6 +169,9 @@ void SettingsDialog::load() GdkRGBA color; Util::apply_rgb_togdkrgba(color, settings->getSelectionColor()); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(get("colorBorder")), &color); + Util::apply_rgb_togdkrgba(color, settings->getBackgroundColor()); + gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(get("colorBackground")), &color); + bool hideFullscreenMenubar = false; bool hideFullscreenSidebar = false; @@ -308,13 +311,13 @@ void SettingsDialog::save() } settings->setScrollbarHideType((ScrollbarHideType)scrollbarHideType); - GtkWidget* colorBorder = get("colorBorder"); - GdkRGBA color; - gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(colorBorder), &color); - int selectionColor = Util::gdkrgba_to_hex(color); + gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(get("colorBorder")), &color); + settings->setSelectionColor(Util::gdkrgba_to_hex(color)); + + gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(get("colorBackground")), &color); + settings->setBackgroundColor(Util::gdkrgba_to_hex(color)); - settings->setSelectionColor(selectionColor); bool hideFullscreenMenubar = getCheckbox("cbHideFullscreenMenubar"); bool hideFullscreenSidebar = getCheckbox("cbHideFullscreenSidebar"); diff --git a/src/gui/widgets/XournalWidget.cpp b/src/gui/widgets/XournalWidget.cpp index 56a795a0..3ff539d1 100644 --- a/src/gui/widgets/XournalWidget.cpp +++ b/src/gui/widgets/XournalWidget.cpp @@ -358,12 +358,12 @@ gboolean gtk_xournal_button_press_event(GtkWidget* widget, GdkEventButton* event { GtkXournal* xournal = GTK_XOURNAL(widget); Settings* settings = xournal->view->getControl()->getSettings(); - //gtk_gesture_is_recognized is always false (bug, programming error?) - //workaround with additional variable zoom_gesture_active - if (xournal->view->zoom_gesture_active) - { - return TRUE; - } + //gtk_gesture_is_recognized is always false (bug, programming error?) + //workaround with additional variable zoom_gesture_active + if (xournal->view->zoom_gesture_active) + { + return TRUE; + } if (event->type != GDK_BUTTON_PRESS) { return FALSE; // this event is not handled here @@ -380,16 +380,17 @@ gboolean gtk_xournal_button_press_event(GtkWidget* widget, GdkEventButton* event if (xournal->currentInputPage) { GdkEventButton ev = *event; - xournal->currentInputPage->translateEvent((GdkEvent*) &ev, xournal->x, - xournal->y); + xournal->currentInputPage->translateEvent((GdkEvent*) &ev, xournal->x, xournal->y); xournal->currentInputPage->onButtonReleaseEvent(widget, &ev); } ToolHandler* h = xournal->view->getControl()->getToolHandler(); // Change the tool depending on the key or device - if(change_tool(settings, event, xournal)) + if (change_tool(settings, event, xournal)) + { return TRUE; + } // hand tool don't change the selection, so you can scroll e.g. // with your touchscreen without remove the selection @@ -398,9 +399,9 @@ gboolean gtk_xournal_button_press_event(GtkWidget* widget, GdkEventButton* event Cursor* cursor = xournal->view->getCursor(); cursor->setMouseDown(true); xournal->inScrolling = true; - //set reference - xournal->lastMousePositionX=event->x_root; - xournal->lastMousePositionY=event->y_root; + //set reference + xournal->lastMousePositionX = event->x_root; + xournal->lastMousePositionY = event->y_root; return TRUE; } @@ -411,12 +412,11 @@ gboolean gtk_xournal_button_press_event(GtkWidget* widget, GdkEventButton* event XojPageView* view = selection->getView(); GdkEventButton ev = *event; view->translateEvent((GdkEvent*) &ev, xournal->x, xournal->y); - CursorSelectionType selType = selection->getSelectionTypeForPos(ev.x, ev.y, - xournal->view->getZoom()); + CursorSelectionType selType = selection->getSelectionTypeForPos(ev.x, ev.y, xournal->view->getZoom()); if (selType) { - if(selType == CURSOR_SELECTION_MOVE && event->button == 3) + if (selType == CURSOR_SELECTION_MOVE && event->button == 3) { selection->copySelection(); } @@ -428,13 +428,14 @@ gboolean gtk_xournal_button_press_event(GtkWidget* widget, GdkEventButton* event else { xournal->view->clearSelection(); - if(change_tool(settings, event, xournal)) + if (change_tool(settings, event, xournal)) + { return TRUE; + } } } - XojPageView* pv = gtk_xournal_get_page_view_for_pos_cached(xournal, event->x, - event->y); + XojPageView* pv = gtk_xournal_get_page_view_for_pos_cached(xournal, event->x, event->y); current_view = pv; @@ -450,8 +451,7 @@ gboolean gtk_xournal_button_press_event(GtkWidget* widget, GdkEventButton* event return FALSE; // not handled } -gboolean gtk_xournal_button_release_event(GtkWidget* widget, - GdkEventButton* event) +gboolean gtk_xournal_button_release_event(GtkWidget* widget, GdkEventButton* event) { if (event->button > 3) // scroll wheel events { @@ -464,10 +464,10 @@ gboolean gtk_xournal_button_release_event(GtkWidget* widget, Cursor* cursor = xournal->view->getCursor(); ToolHandler* h = xournal->view->getControl()->getToolHandler(); - if (xournal->view->zoom_gesture_active) - { - return TRUE; - } + if (xournal->view->zoom_gesture_active) + { + return TRUE; + } cursor->setMouseDown(false); @@ -482,8 +482,7 @@ gboolean gtk_xournal_button_release_event(GtkWidget* widget, bool res = false; if (xournal->currentInputPage) { - xournal->currentInputPage->translateEvent((GdkEvent*) event, xournal->x, - xournal->y); + xournal->currentInputPage->translateEvent((GdkEvent*) event, xournal->x, xournal->y); res = xournal->currentInputPage->onButtonReleaseEvent(widget, event); xournal->currentInputPage = NULL; } @@ -657,12 +656,7 @@ static void gtk_xournal_realize(GtkWidget* widget) attributes_mask = GDK_WA_X | GDK_WA_Y; gtk_widget_set_window(widget, gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask)); - gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, >k_widget_get_style(widget)->dark[GTK_STATE_NORMAL]); - gdk_window_set_user_data(gtk_widget_get_window(widget), widget); - - gtk_widget_style_attach(widget); - gtk_style_set_background(gtk_widget_get_style(widget), gtk_widget_get_window(widget), GTK_STATE_NORMAL); } static void gtk_xournal_draw_shadow(GtkXournal* xournal, cairo_t* cr, int left, @@ -736,10 +730,13 @@ static gboolean gtk_xournal_draw(GtkWidget* widget, cairo_t* cr) cairo_clip_extents(cr, &x1, &y1, &x2, &y2); - Rectangle clippingRect(x1 - 10, - y1 - 10, - x2 - x1 + 20, - y2 - y1 + 20); + // Draw background + Settings* settings = xournal->view->getControl()->getSettings(); + Util::cairo_set_source_rgbi(cr, settings->getBackgroundColor()); + cairo_rectangle(cr, x1, y1, x2 - x1, y2 - y1); + cairo_fill(cr); + + Rectangle clippingRect(x1 - 10, y1 - 10, x2 - x1 + 20, y2 - y1 + 20); while (it.hasNext()) { @@ -750,14 +747,12 @@ static gboolean gtk_xournal_draw(GtkWidget* widget, cairo_t* cr) int pw = pv->getDisplayWidth(); int ph = pv->getDisplayHeight(); - if(!clippingRect.intersects(pv->getRect())) + if (!clippingRect.intersects(pv->getRect())) { continue; } - gtk_xournal_draw_shadow(xournal, cr, - px, py, pw, ph, - pv->isSelected()); + gtk_xournal_draw_shadow(xournal, cr, px, py, pw, ph, pv->isSelected()); cairo_save(cr); cairo_translate(cr, px, py); @@ -766,7 +761,7 @@ static gboolean gtk_xournal_draw(GtkWidget* widget, cairo_t* cr) cairo_restore(cr); } - if(xournal->selection) + if (xournal->selection) { double zoom = xournal->view->getZoom(); @@ -793,16 +788,5 @@ static void gtk_xournal_destroy(GtkWidget* object) delete xournal->layout; xournal->layout = NULL; - - /* - * TODO: Do we need this? - GtkXournalClass* klass = (GtkXournalClass*) gtk_type_class( - gtk_widget_get_type()); - - if (GTK_OBJECT_CLASS(klass)->destroy) - { - (*GTK_OBJECT_CLASS(klass)->destroy)(object); - } - */ } diff --git a/ui/settings.glade b/ui/settings.glade index 6886d2a1..d030aa69 100644 --- a/ui/settings.glade +++ b/ui/settings.glade @@ -1122,7 +1122,7 @@ Here you can disable your touchscreen.</i> True False - <b>Selection Border</b> + <b>Colors</b> True 0 @@ -1145,55 +1145,62 @@ Here you can disable your touchscreen.</i> True False - + True False - vertical - + True False - - - True - False - Border color for current page and other selections: - right - 0 - - - True - True - 0 - - - - - True - True - True - Border color - - - False - True - 5 - 1 - - + True + Border color for current page and other selections: + right + 0 - False - True - 0 + 0 + 0 + + + + + True + True + True + Border color + + + 1 + 0 + + + + + True + False + Background color for window Background + 0 + + + 0 + 1 + + + + + True + True + True + + + 1 + 1 True True - 10 - end 0