Guest User

mainwin.c

a guest
Jun 15th, 2010
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.93 KB | None | 0 0
  1. #include "mainwin.h"
  2. #include "utils.h"
  3.  
  4. #include <glib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <glib/gstdio.h>
  8.  
  9. #define LOAD_BUFFER_SIZE 65536
  10.  
  11. static ImageList* image_list;
  12. static GdkPixbufAnimation* animation;
  13. static GtkAnimView* aview;
  14. static GdkPixbufLoader* loader;
  15. static GCancellable* generator_cancellable = NULL;
  16.  
  17. static void main_win_init( MainWin*mw );
  18. static void main_win_finalize( GObject* obj );
  19.  
  20. static void on_prev(MainWin* mw );
  21. static void full_screen(MainWin *mw);
  22.  
  23.  
  24. /* signal handlers */
  25. static gboolean on_delete_event( GtkWidget* widget, GdkEventAny* evt );
  26.  
  27. // Begin of GObject-related stuff
  28. G_DEFINE_TYPE( MainWin, main_win, GTK_TYPE_WINDOW)
  29.  
  30. void
  31. main_win_class_init( MainWinClass* klass )
  32. {
  33.     GObjectClass * obj_class;
  34.     GtkWidgetClass *widget_class;
  35.    
  36.     obj_class = ( GObjectClass * ) klass;
  37.     obj_class->finalize = main_win_finalize;
  38.    
  39.     widget_class = GTK_WIDGET_CLASS ( klass );
  40.     widget_class->delete_event = on_delete_event;
  41. }
  42.  
  43. void main_win_finalize( GObject* obj )
  44. {
  45.     MainWin *mw = (MainWin*)obj;
  46.     main_win_close(mw);
  47.  
  48.     if( G_LIKELY(image_list) )
  49.         image_list_free(image_list );
  50.    
  51.     gtk_main_quit();
  52. }
  53.  
  54. GtkWindow*
  55. main_win_new()
  56. {
  57.     return (GtkWindow*)g_object_new (MAIN_WIN_TYPE, NULL);
  58. }
  59.  
  60. gchar *ui_info =
  61.       "<ui>"
  62.         "<toolbar name = 'ToolBar'>"
  63.            "<toolitem action='Go Back'/>"
  64.            "<toolitem  action='FullScreen'/>"
  65.         "</toolbar>"
  66.       "</ui>";
  67.  
  68. static const GtkActionEntry entries[] = {
  69.     {"Go Back",GTK_STOCK_GO_BACK, "Go Back",
  70.       "<control>b","Go Back", G_CALLBACK(on_prev)
  71.     },
  72.     {"FullScreen",GTK_STOCK_FULLSCREEN, "Full screen",
  73.      "<control>r","Show the image in FULL SCREEN",G_CALLBACK(full_screen)
  74.     },
  75. };
  76.  
  77. static guint n_entries = G_N_ELEMENTS (entries);
  78.  
  79. void
  80. main_win_close( MainWin* mw )
  81. {
  82.     gtk_main_quit ();
  83. }
  84.  
  85. void
  86. main_win_init( MainWin *mw )
  87. {
  88.     GError *error = NULL;
  89.    
  90.     aview  =    gtk_anim_view_new();
  91.     image_list = image_list_new();
  92.    
  93.     gtk_window_set_default_size((GtkWindow*)mw, 670, 480 );
  94.     gtk_window_set_position((GtkWindow*)mw, GTK_WIN_POS_CENTER);
  95.    
  96.     mw->max_width = gdk_screen_width () * 0.7;
  97.     mw->max_height = gdk_screen_height () * 0.7;
  98.    
  99.     mw->box = gtk_vbox_new(FALSE, 0);
  100.     mw->img_box = gtk_vbox_new(FALSE, 0);
  101.  
  102.     mw->scroll = GTK_IMAGE_SCROLL_WIN (gtk_image_scroll_win_new (aview));
  103.    
  104.     gtk_box_pack_start(GTK_BOX(mw->box), mw->img_box, TRUE, TRUE,0);
  105.     gtk_box_pack_start(GTK_BOX(mw->img_box),mw->scroll,TRUE,TRUE,0);
  106.    
  107.     gtk_box_pack_start(GTK_BOX(mw->box), gtk_hseparator_new(), FALSE, TRUE,0);
  108.    
  109.     //gtkuimanager
  110.     mw->actions = gtk_action_group_new ("Actions");
  111.     mw->uimanager = gtk_ui_manager_new();
  112.    
  113.     gtk_ui_manager_insert_action_group (mw->uimanager, mw->actions, 0);
  114.     gtk_action_group_add_actions (mw->actions, entries, n_entries, (GtkWindow*)mw);
  115.     gtk_window_add_accel_group (GTK_WINDOW (mw),
  116.                     gtk_ui_manager_get_accel_group (mw->uimanager));
  117.     gtk_box_pack_end(GTK_BOX (mw->box), gtk_ui_manager_get_widget(mw->uimanager, "/ToolBar"), FALSE, TRUE,0);
  118.     gtk_toolbar_set_style(gtk_ui_manager_get_widget(mw->uimanager, "/ToolBar"), GTK_TOOLBAR_ICONS);
  119.     //end gtuimanager
  120.    
  121.     gtk_container_add((GtkContainer*)mw, mw->box);
  122.     gtk_widget_show(mw->box);
  123.     gtk_widget_show_all(mw);   
  124.  
  125.     g_object_unref(mw->uimanager);
  126.     g_signal_connect (G_OBJECT (mw), "destroy",
  127.                       G_CALLBACK (gtk_main_quit), NULL);
  128.        
  129.     gtk_widget_grab_focus(aview);      
  130. }
  131.  
  132. gboolean
  133. main_win_open( MainWin* mw, const char* file_path)
  134. {      
  135.     GError *error;
  136.     GInputStream* input_stream;
  137.     GFile *file = g_file_new_for_path(file_path);
  138.    
  139.         loader =    gdk_pixbuf_loader_new();
  140.     animation = gdk_pixbuf_animation_new_from_file(file_path,error);
  141.    
  142.     gssize n_read;
  143.     gboolean res;
  144.     guchar buffer[LOAD_BUFFER_SIZE];
  145.    
  146.     input_stream = g_file_read(file,generator_cancellable ,NULL);
  147.    
  148.     res = TRUE;
  149.     while (1){
  150.         n_read = g_input_stream_read(input_stream, buffer, sizeof (buffer),generator_cancellable,error);
  151.        
  152.         if (n_read < 0) {
  153.                         res = FALSE;
  154.                         error = NULL;
  155.                         break;
  156.                 }
  157.    
  158.     if (n_read == 0)
  159.         break;
  160.    
  161.     if (!gdk_pixbuf_loader_write(loader, buffer, sizeof(buffer), error)){
  162.        res = FALSE;
  163.        break;
  164.        }
  165.     }
  166.    
  167.     if (res){      
  168.         animation = gdk_pixbuf_loader_get_animation((loader));
  169.         gtk_anim_view_set_anim (aview,animation);  
  170.        
  171.         char* dir_path = g_path_get_dirname( file_path );
  172.         image_list_open_dir(image_list, dir_path, NULL );
  173.         image_list_sort_by_name( image_list, GTK_SORT_ASCENDING );
  174.         image_list_sort_by_name( image_list, GTK_SORT_DESCENDING );
  175.         g_free( dir_path );
  176.        
  177.         char* base_name = g_path_get_basename( file_path );
  178.         image_list_set_current( image_list, base_name );
  179.  
  180.         char* disp_name = g_filename_display_name( base_name );
  181.        
  182.         g_free( base_name );
  183.         g_free( disp_name );   
  184.        
  185.         gdk_pixbuf_loader_close(loader,NULL);
  186.     }
  187.     else
  188.     {
  189.         res = FALSE;
  190.         error = NULL;
  191.         g_object_unref (input_stream);
  192.         g_object_unref (file);
  193.         g_object_unref (generator_cancellable);    
  194.         return;
  195.     }
  196. }
  197.  
  198. // error window
  199. void
  200. main_win_show_error( MainWin* mw, const char* message )
  201. {
  202.     GtkWidget* dlg = gtk_message_dialog_new( (GtkWindow*)mw,
  203.                                               GTK_DIALOG_MODAL,
  204.                                               GTK_MESSAGE_ERROR,
  205.                                               GTK_BUTTONS_OK,
  206.                                               "%s", message );
  207.     gtk_dialog_run( (GtkDialog*)dlg );
  208.     gtk_widget_destroy( dlg );
  209. }
  210.  
  211. gboolean
  212. on_delete_event( GtkWidget* widget, GdkEventAny* evt )
  213. {  
  214.     gtk_widget_destroy( widget );
  215.     return TRUE;
  216. }
  217.  
  218. static void
  219. full_screen(MainWin* mw)
  220. {  
  221.     gtk_window_fullscreen(GTK_WINDOW(mw));
  222. }
Advertisement
Add Comment
Please, Sign In to add comment