From 48768c4fcb712030534ee72b16ba31c52219a862 Mon Sep 17 00:00:00 2001 From: daleclack Date: Mon, 22 Nov 2021 18:53:49 +0800 Subject: [PATCH] Allow move for image --- Gtk4/gtk118_imageviewer/CMakeLists.txt | 2 +- Gtk4/gtk118_imageviewer/res/MyImage.ui | 8 +++ Gtk4/gtk118_imageviewer/src/MyImage.cpp | 47 +++++++++++++++++ Gtk4/gtk118_imageviewer/src/MyImage.h | 4 ++ Gtk4/gtk118_imageviewer/src/MyWindow.cpp | 65 ++++++++++++++++++++++++ Gtk4/gtk118_imageviewer/src/MyWindow.h | 7 +++ Gtk4/gtk118_imageviewer/src/main.cpp | 41 ++------------- 7 files changed, 136 insertions(+), 38 deletions(-) create mode 100644 Gtk4/gtk118_imageviewer/src/MyWindow.cpp create mode 100644 Gtk4/gtk118_imageviewer/src/MyWindow.h diff --git a/Gtk4/gtk118_imageviewer/CMakeLists.txt b/Gtk4/gtk118_imageviewer/CMakeLists.txt index 9263ce6..7414db4 100644 --- a/Gtk4/gtk118_imageviewer/CMakeLists.txt +++ b/Gtk4/gtk118_imageviewer/CMakeLists.txt @@ -37,7 +37,7 @@ compile_gresources(RESOURCE_FILE add_custom_target(resource ALL DEPENDS ${RESOURCE_FILE}) #SOURCE FILES LIST -set(SOURCES src/main.cpp src/MyImage.cpp) +set(SOURCES src/main.cpp src/MyImage.cpp src/MyWindow.cpp) #For win32 platform,use rc resource and .ico icon if(WIN32) diff --git a/Gtk4/gtk118_imageviewer/res/MyImage.ui b/Gtk4/gtk118_imageviewer/res/MyImage.ui index 4a2c319..9efd0aa 100644 --- a/Gtk4/gtk118_imageviewer/res/MyImage.ui +++ b/Gtk4/gtk118_imageviewer/res/MyImage.ui @@ -27,5 +27,13 @@ + + + 1 + + + + + diff --git a/Gtk4/gtk118_imageviewer/src/MyImage.cpp b/Gtk4/gtk118_imageviewer/src/MyImage.cpp index b495dac..4fe6209 100644 --- a/Gtk4/gtk118_imageviewer/src/MyImage.cpp +++ b/Gtk4/gtk118_imageviewer/src/MyImage.cpp @@ -12,6 +12,10 @@ struct _MyImage{ float scale; GtkWidget * menu; + + GtkAdjustment * hadjustment, * vadjustment; + double start_x,start_y; + double hmax_value,vmax_value; }; struct _MyImageClass{ @@ -33,6 +37,38 @@ static void pressed_cb(GtkGestureClick * gesture,int n_press,double x,double y,M gtk_popover_popup(GTK_POPOVER(self->menu)); } +static void drag_start(GtkGestureDrag * self,double x,double y,MyImage * image){ + //Get Properties + image->start_x = x; + image->start_y = y; + image->hmax_value = gtk_adjustment_get_upper(image->hadjustment); + image->vmax_value = gtk_adjustment_get_upper(image->vadjustment); +} + +static void drag_update(GtkGestureDrag * self,double x,double y,MyImage * image){ + //Move Image + int hadj_value = gtk_adjustment_get_value(image->hadjustment); + int vadj_value = gtk_adjustment_get_value(image->vadjustment); + if(hadj_value - x >= 0 && - x <= image->hmax_value){ + gtk_adjustment_set_value(image->hadjustment,-x); + } + if(vadj_value - y >= 0 && - y <= image->vmax_value){ + gtk_adjustment_set_value(image->vadjustment,-y); + } +} + +static void drag_end(GtkGestureDrag * self,double x,double y,MyImage * image){ + //g_print("%f %f\n",x+image->start_x,y+image->start_y); + int hadj_value = gtk_adjustment_get_value(image->hadjustment); + int vadj_value = gtk_adjustment_get_value(image->vadjustment); + if(hadj_value - x >= 0 && - x <= image->hmax_value){ + gtk_adjustment_set_value(image->hadjustment,-x); + } + if(vadj_value - y >= 0 && - y <= image->vmax_value){ + gtk_adjustment_set_value(image->vadjustment,-y); + } +} + static void my_image_dispose(GObject * object){ //Deconstructer MyImage * self = MY_IMAGE(object); @@ -207,6 +243,17 @@ static void my_image_class_init(MyImageClass * self_class){ //Bind Childs gtk_widget_class_bind_template_child(GTK_WIDGET_CLASS(self_class),MyImage,menu); gtk_widget_class_bind_template_callback(self_class,pressed_cb); + gtk_widget_class_bind_template_callback(self_class,drag_start); + gtk_widget_class_bind_template_callback(self_class,drag_update); + gtk_widget_class_bind_template_callback(self_class,drag_end); +} + +void my_image_bind_adjustments(MyImage * self, + GtkAdjustment * hadjustment1, + GtkAdjustment * vadjustment1) +{ + self->hadjustment = hadjustment1; + self->vadjustment = vadjustment1; } GtkWidget * my_image_new(){ diff --git a/Gtk4/gtk118_imageviewer/src/MyImage.h b/Gtk4/gtk118_imageviewer/src/MyImage.h index fd2f2e3..7dd2173 100644 --- a/Gtk4/gtk118_imageviewer/src/MyImage.h +++ b/Gtk4/gtk118_imageviewer/src/MyImage.h @@ -7,3 +7,7 @@ G_DECLARE_FINAL_TYPE(MyImage,my_image,MY,IMAGE,GtkWidget) GtkWidget * my_image_new(); void my_image_set_pixbuf(MyImage * self, GdkPixbuf * pixbuf); + +void my_image_bind_adjustments(MyImage * self, + GtkAdjustment * hadjustment1, + GtkAdjustment * vadjustment1); diff --git a/Gtk4/gtk118_imageviewer/src/MyWindow.cpp b/Gtk4/gtk118_imageviewer/src/MyWindow.cpp new file mode 100644 index 0000000..f8c1222 --- /dev/null +++ b/Gtk4/gtk118_imageviewer/src/MyWindow.cpp @@ -0,0 +1,65 @@ +#include "MyWindow.h" +#include "MyImage.h" +#include "img7.xpm" + +struct _MyWindow{ + GtkApplicationWindow parent_instance; + GtkWidget * img_view; +}; + +G_DEFINE_TYPE(MyWindow,my_window,GTK_TYPE_APPLICATION_WINDOW) + +static void dialog_respone(GtkNativeDialog * dialog,int respone,MyWindow * window){} + +static void openfile_dialog(GtkWidget * widget,MyWindow * window){} + +static void my_window_init(MyWindow * window){ + GtkWidget * vbox, * sw, * scale, * btnbox, * btnopen; + + //Initalize window + gtk_window_set_default_size(GTK_WINDOW(window),800,450); + gtk_window_set_icon_name(GTK_WINDOW(window),"org.gtk.daleclack"); + + //Create Child widgets + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,5); + btnbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); + sw = gtk_scrolled_window_new(); + + //Add the image widget + window->img_view = my_image_new(); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw),window->img_view); + gtk_widget_set_vexpand(sw,TRUE); + gtk_box_append(GTK_BOX(vbox),sw); + my_image_bind_adjustments(MY_IMAGE(window->img_view), + gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(sw)), + gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(sw))); + + //Add a scale + scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,0.01,10.0,0.1); + gtk_range_set_value(GTK_RANGE(scale),1.0); + gtk_widget_set_hexpand(scale,TRUE); + gtk_box_append(GTK_BOX(btnbox),scale); + + //Add a button + btnopen = gtk_button_new_with_label("Open Image"); + gtk_box_append(GTK_BOX(btnbox),btnopen); + gtk_box_append(GTK_BOX(vbox),btnbox); + + //Bind the "value" property + g_object_bind_property(gtk_range_get_adjustment(GTK_RANGE(scale)),"value", + window->img_view,"scale", + G_BINDING_BIDIRECTIONAL); + + //Default Image + GdkPixbuf * pixbuf = gdk_pixbuf_new_from_xpm_data(img7); + my_image_set_pixbuf(MY_IMAGE(window->img_view),pixbuf); + g_object_unref(pixbuf); + + gtk_window_set_child(GTK_WINDOW(window),vbox); +} + +static void my_window_class_init(MyWindowClass * klass){} + +MyWindow * my_window_new(GtkApplication * application){ + return (MyWindow*)g_object_new(my_window_get_type(),"application",application,NULL); +} \ No newline at end of file diff --git a/Gtk4/gtk118_imageviewer/src/MyWindow.h b/Gtk4/gtk118_imageviewer/src/MyWindow.h new file mode 100644 index 0000000..c6d169c --- /dev/null +++ b/Gtk4/gtk118_imageviewer/src/MyWindow.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +G_DECLARE_FINAL_TYPE(MyWindow,my_window,MY,WINDOW,GtkApplicationWindow) + +MyWindow * my_window_new(GtkApplication * application); diff --git a/Gtk4/gtk118_imageviewer/src/main.cpp b/Gtk4/gtk118_imageviewer/src/main.cpp index de62b4e..3adbcac 100644 --- a/Gtk4/gtk118_imageviewer/src/main.cpp +++ b/Gtk4/gtk118_imageviewer/src/main.cpp @@ -1,41 +1,8 @@ -#include "MyImage.h" -#include "img7.xpm" +#include "MyWindow.h" static void gtkmain(GtkApplication * app,gpointer user_data){ - GtkWidget * window, * vbox, * sw, * scale; - - //Initalize window - window = gtk_application_window_new(app); - gtk_window_set_default_size(GTK_WINDOW(window),800,450); - gtk_window_set_icon_name(GTK_WINDOW(window),"org.gtk.daleclack"); - - //Create Child widgets - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,5); - sw = gtk_scrolled_window_new(); - - //Add the image widget - GtkWidget * img_view = my_image_new(); - gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw),img_view); - gtk_widget_set_vexpand(sw,TRUE); - gtk_box_append(GTK_BOX(vbox),sw); - - //Add a scale - scale = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL,0.01,10.0,0.1); - gtk_range_set_value(GTK_RANGE(scale),1.0); - gtk_box_append(GTK_BOX(vbox),scale); - - //Bind the "value" property - g_object_bind_property(gtk_range_get_adjustment(GTK_RANGE(scale)),"value", - img_view,"scale", - G_BINDING_BIDIRECTIONAL); - - //Default Image - GdkPixbuf * pixbuf = gdk_pixbuf_new_from_xpm_data(img7); - my_image_set_pixbuf(MY_IMAGE(img_view),pixbuf); - g_object_unref(pixbuf); - - gtk_window_set_child(GTK_WINDOW(window),vbox); - gtk_widget_show(window); + MyWindow * window = my_window_new(app); + gtk_widget_show(GTK_WIDGET(window)); } int main(int argc,char ** argv){ @@ -44,4 +11,4 @@ int main(int argc,char ** argv){ app = gtk_application_new("org.gtk.daleclack",G_APPLICATION_NON_UNIQUE); g_signal_connect(app,"activate",G_CALLBACK(gtkmain),NULL); return g_application_run(G_APPLICATION(app),argc,argv); -} \ No newline at end of file +}