X-Git-Url: https://git.donarmstrong.com/?p=xournal.git;a=blobdiff_plain;f=src%2Fxo-misc.c;fp=src%2Fxo-misc.c;h=bd65f1afbede9a8a3a9cde569a3c0a197a1cb581;hp=bc4747cd35e28d75c26f1738610c599e13fada41;hb=bc1db27c7eef7de6d5097a5e708d2de540d35b88;hpb=dbcc72baab610c58a36586f75b7ce7e17a0d4f41 diff --git a/src/xo-misc.c b/src/xo-misc.c index bc4747c..bd65f1a 100644 --- a/src/xo-misc.c +++ b/src/xo-misc.c @@ -31,6 +31,7 @@ #include "xo-file.h" #include "xo-paint.h" #include "xo-shapes.h" +#include "xo-image.h" // some global constants @@ -104,6 +105,31 @@ struct Page *new_page_with_bg(struct Background *bg, double width, double height return pg; } +// change the current page if necessary for pointer at pt +void set_current_page(gdouble *pt) +{ + gboolean page_change; + struct Page *tmppage; + + page_change = FALSE; + tmppage = ui.cur_page; + while (ui.view_continuous && (pt[1] < - VIEW_CONTINUOUS_SKIP)) { + if (ui.pageno == 0) break; + page_change = TRUE; + ui.pageno--; + tmppage = g_list_nth_data(journal.pages, ui.pageno); + pt[1] += tmppage->height + VIEW_CONTINUOUS_SKIP; + } + while (ui.view_continuous && (pt[1] > tmppage->height + VIEW_CONTINUOUS_SKIP)) { + if (ui.pageno == journal.npages-1) break; + pt[1] -= tmppage->height + VIEW_CONTINUOUS_SKIP; + page_change = TRUE; + ui.pageno++; + tmppage = g_list_nth_data(journal.pages, ui.pageno); + } + if (page_change) do_switch_page(ui.pageno, FALSE, FALSE); +} + void realloc_cur_path(int n) { if (n <= ui.cur_path_storage_alloc) return; @@ -156,6 +182,11 @@ void clear_redo_stack(void) g_free(redo->item->font_name); g_free(redo->item); } + else if (redo->type == ITEM_IMAGE) { + g_object_unref(redo->item->image); + g_free(redo->item->image_png); + g_free(redo->item); + } else if (redo->type == ITEM_ERASURE || redo->type == ITEM_RECOGNIZER) { for (list = redo->erasurelist; list!=NULL; list=list->next) { erasure = (struct UndoErasureData *)list->data; @@ -232,6 +263,10 @@ void clear_undo_stack(void) } if (erasure->item->type == ITEM_TEXT) { g_free(erasure->item->text); g_free(erasure->item->font_name); } + if (erasure->item->type == ITEM_IMAGE) { + g_object_unref(erasure->item->image); + g_free(erasure->item->image_png); + } g_free(erasure->item); g_list_free(erasure->replacement_items); g_free(erasure); @@ -316,6 +351,10 @@ void delete_layer(struct Layer *l) if (item->type == ITEM_TEXT) { g_free(item->font_name); g_free(item->text); } + if (item->type == ITEM_IMAGE) { + g_object_unref(item->image); + g_free(item->image_png); + } // don't need to delete the canvas_item, as it's part of the group destroyed below g_free(item); l->items = g_list_delete_link(l->items, l->items); @@ -370,6 +409,17 @@ void get_pointer_coords(GdkEvent *event, gdouble *ret) ret[1] -= ui.cur_page->voffset; } +void get_current_pointer_coords(gdouble *ret) +{ + gint wx, wy, sx, sy; + + gtk_widget_get_pointer((GtkWidget *)canvas, &wx, &wy); + gnome_canvas_get_scroll_offsets(canvas, &sx, &sy); + gnome_canvas_window_to_world(canvas, (double)(wx + sx), (double)(wy + sy), ret, ret+1); + ret[0] -= ui.cur_page->hoffset; + ret[1] -= ui.cur_page->voffset; +} + void fix_xinput_coords(GdkEvent *event) { double *axes, *px, *py, axis_width; @@ -533,6 +583,16 @@ void make_canvas_item_one(GnomeCanvasGroup *group, struct Item *item) "text", item->text, NULL); update_item_bbox(item); } + if (item->type == ITEM_IMAGE) { + item->canvas_item = gnome_canvas_item_new(group, + gnome_canvas_pixbuf_get_type(), + "pixbuf", item->image, + "x", item->bbox.left, "y", item->bbox.top, + "width", item->bbox.right - item->bbox.left, + "height", item->bbox.bottom - item->bbox.top, + "width-set", TRUE, "height-set", TRUE, + NULL); + } } void make_canvas_items(void) @@ -881,6 +941,10 @@ void update_tool_buttons(void) gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonText")), TRUE); break; + case TOOL_IMAGE: + gtk_toggle_tool_button_set_active( + GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonImage")), TRUE); + break; case TOOL_SELECTREGION: gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(GET_COMPONENT("buttonSelectRegion")), TRUE); @@ -929,6 +993,10 @@ void update_tool_menu(void) gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(GET_COMPONENT("toolsText")), TRUE); break; + case TOOL_IMAGE: + gtk_check_menu_item_set_active( + GTK_CHECK_MENU_ITEM(GET_COMPONENT("toolsImage")), TRUE); + break; case TOOL_SELECTREGION: gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(GET_COMPONENT("toolsSelectRegion")), TRUE); @@ -1159,6 +1227,10 @@ void update_mappings_menu(void) gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(GET_COMPONENT("button2Text")), TRUE); break; + case TOOL_IMAGE: + gtk_check_menu_item_set_active( + GTK_CHECK_MENU_ITEM(GET_COMPONENT("button2Image")), TRUE); + break; case TOOL_SELECTREGION: gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(GET_COMPONENT("button2SelectRegion")), TRUE); @@ -1189,6 +1261,10 @@ void update_mappings_menu(void) gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(GET_COMPONENT("button3Text")), TRUE); break; + case TOOL_IMAGE: + gtk_check_menu_item_set_active( + GTK_CHECK_MENU_ITEM(GET_COMPONENT("button3Image")), TRUE); + break; case TOOL_SELECTREGION: gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(GET_COMPONENT("button3SelectRegion")), TRUE); @@ -1743,7 +1819,8 @@ void move_journal_items_by(GList *itemlist, double dx, double dy, if (item->type == ITEM_STROKE) for (pt=item->path->coords, i=0; ipath->num_points; i++, pt+=2) { pt[0] += dx; pt[1] += dy; } - if (item->type == ITEM_STROKE || item->type == ITEM_TEXT || item->type == ITEM_TEMP_TEXT) { + if (item->type == ITEM_STROKE || item->type == ITEM_TEXT || + item->type == ITEM_TEMP_TEXT || item->type == ITEM_IMAGE) { item->bbox.left += dx; item->bbox.right += dx; item->bbox.top += dy; @@ -1826,6 +1903,22 @@ void resize_journal_items_by(GList *itemlist, double scaling_x, double scaling_y item->bbox.left = item->bbox.left*scaling_x + offset_x; item->bbox.top = item->bbox.top*scaling_y + offset_y; } + if (item->type == ITEM_IMAGE) { + item->bbox.left = item->bbox.left*scaling_x + offset_x; + item->bbox.right = item->bbox.right*scaling_x + offset_x; + item->bbox.top = item->bbox.top*scaling_y + offset_y; + item->bbox.bottom = item->bbox.bottom*scaling_y + offset_y; + if (item->bbox.left > item->bbox.right) { + temp = item->bbox.left; + item->bbox.left = item->bbox.right; + item->bbox.right = temp; + } + if (item->bbox.top > item->bbox.bottom) { + temp = item->bbox.top; + item->bbox.top = item->bbox.bottom; + item->bbox.bottom = temp; + } + } // redraw the item if (item->canvas_item!=NULL) { group = (GnomeCanvasGroup *) item->canvas_item->parent;