Allow move for image

This commit is contained in:
daleclack 2021-11-22 18:53:49 +08:00
parent e6ebb9a2fc
commit 48768c4fcb
7 changed files with 136 additions and 38 deletions

View File

@ -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)

View File

@ -27,5 +27,13 @@
<signal name="pressed" handler="pressed_cb"/>
</object>
</child>
<child>
<object class="GtkGestureDrag">
<property name="button">1</property>
<signal name="drag-begin" handler="drag_start"/>
<signal name="drag-update" handler="drag_update"/>
<signal name="drag-end" handler="drag_end"/>
</object>
</child>
</template>
</interface>

View File

@ -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(){

View File

@ -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);

View File

@ -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);
}

View File

@ -0,0 +1,7 @@
#pragma once
#include <gtk/gtk.h>
G_DECLARE_FINAL_TYPE(MyWindow,my_window,MY,WINDOW,GtkApplicationWindow)
MyWindow * my_window_new(GtkApplication * application);

View File

@ -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);
}
}