GTK app to change pic on click

2008-03-18 Thread Midhun A
Hi All,

  I am very new to GTK+ (started out yesterday). I am writing a simple
application which will show pictures one by one on button click.
Although I am able to get my first picture, the picture does not
change on click of the button (next or previous). The full code is as
below.

#include 
#include 
#include 
#include 
#include 
#include 

GtkWidget *image2;
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *prev_button, *next_button;



gchar *files[6] =
{
"/home/pics/1.jpg",
"/home/pics/2.jpg",
"/home/pics/3.jpg",
"/home/pics/4.jpg",
"/home/pics/5.jpg",
"/home/pics/6.jpg"
};

typedef struct{
gint data;
} data;

void prev_callback (GtkWidget *widget, data *v )
{
gint cnt = v->data;
if (cnt == 0)
cnt = 5;
else
cnt = cnt - 1;

image2 = gtk_image_new_from_file (files[cnt]);
}

void next_callback (GtkWidget *widget, data *v)
{
int cnt = v->data;
if (cnt == 5)
cnt = 0;
else
cnt = cnt + 1;

image2 = gtk_image_new_from_file (files[cnt]);
}


int main (int argc, char *argv[])
{

data *w = g_slice_new(data);
w->data = 0;

gtk_init(&argc,&argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_maximize (window);

vbox = gtk_vbox_new(FALSE, 1);

image2 = gtk_image_new_from_file (files[w->data]);
gtk_container_add(GTK_CONTAINER(vbox), image2);

prev_button = gtk_button_new_with_mnemonic ("Previous");
next_button = gtk_button_new_with_mnemonic ("Next");

gtk_widget_set_name(prev_button,"prev_button");
gtk_widget_set_name(next_button,"next_button"); 

gtk_container_add(GTK_CONTAINER(vbox), prev_button);
gtk_container_add(GTK_CONTAINER(vbox), next_button);
gtk_container_add(GTK_CONTAINER(window), vbox); 

g_signal_connect (G_OBJECT (prev_button), "clicked", G_CALLBACK
(prev_callback),(gpointer)w);
g_signal_connect (G_OBJECT (next_button), "clicked", G_CALLBACK
(next_callback),(gpointer)w);

gtk_widget_show (image2);
gtk_widget_show (prev_button);
gtk_widget_show (next_button);  
gtk_widget_show (vbox); 
gtk_widget_show (window);

gtk_main();
return 0;
}


This is very primitive code to test the functionality.  Whats wrong
with the code? I would like to see the previous picture on click of
previous button and the next picture on click of next button.


Any help would be appreciated,
Thanks,
Midhun.
___
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list


Re: GTK app to change pic on click

2008-03-18 Thread Tomas Carnecky
Midhun A wrote:
> Hi All,
> 
>   I am very new to GTK+ (started out yesterday). I am writing a simple
> application which will show pictures one by one on button click.
> Although I am able to get my first picture, the picture does not
> change on click of the button (next or previous). The full code is as
> below.
> 
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
> 
> GtkWidget *image2;
> GtkWidget *window;
> GtkWidget *vbox;
> GtkWidget *prev_button, *next_button;
> 
> 
> 
> gchar *files[6] =
> {
> "/home/pics/1.jpg",
> "/home/pics/2.jpg",
> "/home/pics/3.jpg",
> "/home/pics/4.jpg",
> "/home/pics/5.jpg",
> "/home/pics/6.jpg"
> };
> 
> typedef struct{
> gint data;
> } data;
> 
> void prev_callback (GtkWidget *widget, data *v )
> {
>   gint cnt = v->data;
>   if (cnt == 0)
>   cnt = 5;
>   else
>   cnt = cnt - 1;
>   
>   image2 = gtk_image_new_from_file (files[cnt]);
> }

This callback only creates the new image, it doesn't display it in the 
window. You seem to lack basic C understanding, especially about pointers.

To replace the current image, you have to remove the image widget from 
the vbox and replace it with the new image. Like this:

> void next_callback (GtkWidget *widget, data *v)
> {
>   int cnt = v->data;
>   if (cnt == 5)
>   cnt = 0;
>   else
>   cnt = cnt + 1;
>   
gtk_container_remove(GTK_CONTAINER(vbox), image2);
>   image2 = gtk_image_new_from_file (files[cnt]);
gtk_container_add(GTK_CONTAINER(vbox), image2);
> }
> 
> 
> int main (int argc, char *argv[])
> {
> 
>   data *w = g_slice_new(data);
>   w->data = 0;
> 
>   gtk_init(&argc,&argv);
>   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
>   gtk_window_maximize (window);
>   
>   vbox = gtk_vbox_new(FALSE, 1);
> 
>   image2 = gtk_image_new_from_file (files[w->data]);
>   gtk_container_add(GTK_CONTAINER(vbox), image2);
>   
>   prev_button = gtk_button_new_with_mnemonic ("Previous");
>   next_button = gtk_button_new_with_mnemonic ("Next");
> 
>   gtk_widget_set_name(prev_button,"prev_button");
>   gtk_widget_set_name(next_button,"next_button"); 
> 
>   gtk_container_add(GTK_CONTAINER(vbox), prev_button);
>   gtk_container_add(GTK_CONTAINER(vbox), next_button);
>   gtk_container_add(GTK_CONTAINER(window), vbox); 
> 
>   g_signal_connect (G_OBJECT (prev_button), "clicked", G_CALLBACK
> (prev_callback),(gpointer)w);
>   g_signal_connect (G_OBJECT (next_button), "clicked", G_CALLBACK
> (next_callback),(gpointer)w);
> 
>   gtk_widget_show (image2);
>   gtk_widget_show (prev_button);
>   gtk_widget_show (next_button);  
>   gtk_widget_show (vbox); 
>   gtk_widget_show (window);
>   
>   gtk_main();
>   return 0;
> }
> 
> 
> This is very primitive code to test the functionality.  Whats wrong
> with the code? I would like to see the previous picture on click of
> previous button and the next picture on click of next button.
> 

tom
___
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list