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 |