Allow move for image
This commit is contained in:
parent
e6ebb9a2fc
commit
48768c4fcb
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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(){
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue