ui/gtk/image.c

changeset 530
7992a44fe719
parent 529
0a4a6b0d1c82
child 532
80a6d8923d75
equal deleted inserted replaced
529:0a4a6b0d1c82 530:7992a44fe719
67 UiObject *current = uic_current_obj(obj); 67 UiObject *current = uic_current_obj(obj);
68 68
69 GtkWidget *drawingarea = gtk_drawing_area_new(); 69 GtkWidget *drawingarea = gtk_drawing_area_new();
70 GtkWidget *toplevel; 70 GtkWidget *toplevel;
71 GtkWidget *widget = drawingarea; 71 GtkWidget *widget = drawingarea;
72 72
73 gtk_widget_set_size_request(drawingarea, 100, 100); 73 gtk_widget_set_size_request(drawingarea, 100, 100);
74 74
75 #if GTK_MAJOR_VERSION < 4 75 #if GTK_MAJOR_VERSION < 4
76 GtkWidget *eventbox = gtk_event_box_new(); 76 GtkWidget *eventbox = gtk_event_box_new();
77 gtk_container_add(GTK_CONTAINER(eventbox), drawingarea); 77 gtk_container_add(GTK_CONTAINER(eventbox), drawingarea);
100 imgviewer->padding_bottom = args.image_padding_bottom; 100 imgviewer->padding_bottom = args.image_padding_bottom;
101 } 101 }
102 imgviewer->adjustsize = args.adjustsize; 102 imgviewer->adjustsize = args.adjustsize;
103 imgviewer->autoscale = args.autoscale; 103 imgviewer->autoscale = args.autoscale;
104 imgviewer->useradjustable = args.useradjustable; 104 imgviewer->useradjustable = args.useradjustable;
105 imgviewer->zoom_scale = 20;
105 106
106 g_object_set_data_full(G_OBJECT(drawingarea), "uiimageviewer", imgviewer, (GDestroyNotify)imageviewer_destroy); 107 g_object_set_data_full(G_OBJECT(drawingarea), "uiimageviewer", imgviewer, (GDestroyNotify)imageviewer_destroy);
107 108
108 UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_GENERIC); 109 UiVar *var = uic_widget_var(obj->ctx, current->ctx, args.value, args.varname, UI_VAR_GENERIC);
109 imgviewer->var = var; 110 imgviewer->var = var;
126 gtk_drawing_area_set_draw_func( 127 gtk_drawing_area_set_draw_func(
127 GTK_DRAWING_AREA(drawingarea), 128 GTK_DRAWING_AREA(drawingarea),
128 imageviewer_draw, 129 imageviewer_draw,
129 imgviewer, 130 imgviewer,
130 NULL); 131 NULL);
132
133 if(args.useradjustable) {
134 gtk_widget_set_focusable(drawingarea, TRUE);
135 }
136
137 GtkEventController *scrollcontroller = gtk_event_controller_scroll_new(GTK_EVENT_CONTROLLER_SCROLL_VERTICAL);
138 g_signal_connect(scrollcontroller, "scroll", G_CALLBACK(ui_imageviewer_scroll), imgviewer);
139 gtk_widget_add_controller(GTK_WIDGET(drawingarea), GTK_EVENT_CONTROLLER(scrollcontroller));
140
141 GtkGesture *drag = gtk_gesture_drag_new();
142 g_signal_connect(drag, "drag-begin", G_CALLBACK(ui_imageviewer_drag_begin_cb), imgviewer);
143 g_signal_connect(drag, "drag-end", G_CALLBACK(ui_imageviewer_drag_end_cb), imgviewer);
144 g_signal_connect(drag, "drag-update", G_CALLBACK(ui_imageviewer_drag_update_cb), imgviewer);
145 gtk_widget_add_controller(GTK_WIDGET(drawingarea), GTK_EVENT_CONTROLLER(drag));
146
131 #elif GTK_MAJOR_VERSION == 3 147 #elif GTK_MAJOR_VERSION == 3
132 g_signal_connect( 148 g_signal_connect(
133 drawingarea, 149 drawingarea,
134 "draw", 150 "draw",
135 G_CALLBACK(imageviewer_draw), 151 G_CALLBACK(imageviewer_draw),
136 imgviewer); 152 imgviewer);
153
154 gtk_widget_add_events(eventbox, GDK_SCROLL_MASK);
155
156 g_signal_connect(
157 eventbox,
158 "scroll-event",
159 G_CALLBACK(ui_imageviewer_scroll_event),
160 imgviewer);
161 g_signal_connect(
162 eventbox,
163 "button-press-event",
164 G_CALLBACK(ui_imageviewer_button_press_event),
165 imgviewer);
166 g_signal_connect(
167 eventbox,
168 "button-release-event",
169 G_CALLBACK(ui_imageviewer_button_release_event),
170 imgviewer);
137 171
138 #endif 172 #endif
139 173
140 if(args.contextmenu) { 174 if(args.contextmenu) {
141 UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, widget); 175 UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, widget);
142 ui_widget_set_contextmenu(widget, menu); 176 ui_widget_set_contextmenu(widget, menu);
143 } 177 }
144 178
145 UI_APPLY_LAYOUT1(current, args); 179 UI_APPLY_LAYOUT1(current, args);
146 current->container->add(current->container, toplevel, TRUE); 180 current->container->add(current->container, toplevel, TRUE);
147 181
148 return toplevel; 182 return toplevel;
149 } 183 }
158 double dpixwidth = (double)gdk_pixbuf_get_width(pixbuf); 192 double dpixwidth = (double)gdk_pixbuf_get_width(pixbuf);
159 double dpixheight = (double)gdk_pixbuf_get_height(pixbuf); 193 double dpixheight = (double)gdk_pixbuf_get_height(pixbuf);
160 194
161 double dwidth = width; 195 double dwidth = width;
162 double dheight = height; 196 double dheight = height;
197 double scale = 1;
163 if(imgviewer->autoscale) { 198 if(imgviewer->autoscale) {
164 double scale = dwidth / dpixwidth; 199 scale = dwidth / dpixwidth;
165 if(dpixheight * scale > dheight) { 200 if(dpixheight * scale > dheight) {
166 scale = dheight / dpixheight; 201 scale = dheight / dpixheight;
167 } 202 }
168
169 dpixwidth *= scale;
170 dpixheight *= scale;
171 double x = (dwidth - dpixwidth) / 2;
172 double y = (dheight - dpixheight) / 2;
173 cairo_translate(cr, x, y);
174 cairo_scale(cr, scale, scale);
175 } else { 203 } else {
176 double x = (dwidth - dpixwidth) / 2; 204 scale = 1 + ((double)imgviewer->zoom / (double)imgviewer->zoom_scale);
177 double y = (dheight - dpixheight) / 2; 205 }
178 if(x < 0) { 206
179 x = 0; 207 dpixwidth *= scale;
180 } 208 dpixheight *= scale;
181 if(y < 0) { 209 double x = (dwidth - dpixwidth) / 2;
182 y = 0; 210 double y = (dheight - dpixheight) / 2;
183 } 211
184 cairo_translate(cr, (int)x, (int)y); 212 x += imgviewer->transx;
185 } 213 y += imgviewer->transy;
214
215 cairo_translate(cr, x, y);
216 cairo_scale(cr, scale, scale);
186 217
187 gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0); 218 gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0);
188 cairo_paint(cr); 219 cairo_paint(cr);
220
221 imgviewer->prev_scale = scale;
189 } 222 }
190 223
191 void* ui_imageviewer_get(UiGeneric *g) { 224 void* ui_imageviewer_get(UiGeneric *g) {
192 UiImageViewer *imgviewer = g->obj; 225 UiImageViewer *imgviewer = g->obj;
193 g->value = imgviewer->pixbuf; 226 g->value = imgviewer->pixbuf;
238 obj->value = pixbuf; 271 obj->value = pixbuf;
239 } 272 }
240 273
241 return 0; 274 return 0;
242 } 275 }
276
277 #if GTK_MAJOR_VERSION >= 4
278
279 gboolean ui_imageviewer_scroll(
280 GtkEventControllerScroll *widget,
281 gdouble dx,
282 gdouble dy,
283 gpointer userdata)
284 {
285 UiImageViewer *imgviewer = userdata;
286 if(imgviewer->useradjustable) {
287 imgviewer->zoom -= dy;
288 if(imgviewer->zoom < -imgviewer->zoom_scale) {
289 imgviewer->zoom = -imgviewer->zoom_scale;
290 }
291 gtk_widget_queue_draw(imgviewer->widget);
292 return TRUE;
293 }
294 return FALSE;
295 }
296
297 void ui_imageviewer_drag_begin_cb(
298 GtkGestureDrag* self,
299 gdouble start_x,
300 gdouble start_y,
301 gpointer userdata)
302 {
303 UiImageViewer *imgviewer = userdata;
304 imgviewer->begin_transx = imgviewer->transx;
305 imgviewer->begin_transy = imgviewer->transy;
306 }
307
308 void ui_imageviewer_drag_end_cb(
309 GtkGestureDrag* self,
310 gdouble x,
311 gdouble y,
312 gpointer userdata)
313 {
314
315 }
316
317 void ui_imageviewer_drag_update_cb(
318 GtkGestureDrag* self,
319 gdouble x,
320 gdouble y,
321 gpointer userdata)
322 {
323 UiImageViewer *imgviewer = userdata;
324 if(imgviewer->useradjustable) {
325 imgviewer->transx = imgviewer->begin_transx + x;
326 imgviewer->transy = imgviewer->begin_transy + y;
327 gtk_widget_queue_draw(imgviewer->widget);
328 }
329 }
330
331 #else
332
333 gboolean ui_imageviewer_scroll_event(
334 GtkWidget *widget,
335 GdkEventScroll event,
336 gpointer userdata)
337 {
338 printf("scroll event\n");
339 return FALSE;
340 }
341
342 gboolean ui_imageviewer_button_press_event(
343 GtkWidget *widget,
344 GdkEventButton event,
345 gpointer userdata)
346 {
347 printf("button pressed\n");
348 }
349
350 gboolean ui_imageviewer_button_release_event(
351 GtkWidget *widget,
352 GdkEventButton event,
353 gpointer userdata)
354 {
355 printf("button released\n");
356 }
357
358 #endif

mercurial