Rewrite the import dialog. Should behave better now
authorChristopher Michael <cpmichael1@comcast.net>
Mon, 23 Jan 2006 02:56:01 +0000 (02:56 +0000)
committerChristopher Michael <cpmichael1@comcast.net>
Mon, 23 Jan 2006 02:56:01 +0000 (02:56 +0000)
SVN revision: 19976

src/bin/e_int_config_background.c
src/bin/e_int_config_background_import.c
src/bin/e_int_config_background_import.h

index 3e383cd..26e7833 100644 (file)
@@ -3,6 +3,7 @@
  */
 
 #include "e.h"
+//#include <Ecore_X.h>
 
 #define BG_SET_DEFAULT_DESK 0
 #define BG_SET_THIS_DESK 1
@@ -21,6 +22,9 @@ static void         _bg_config_dialog_cb_import (void *data, void *data2);
 static int          _bg_dialog_close            (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
 static void         _bg_file_added              (void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event, const char *path);
 
+static void _import_cb_closed(void *obj);
+static int import_open = 0;
+
 static Ecore_File_Monitor *_bg_file_monitor;
 
 struct _E_Config_Dialog_Data
@@ -28,8 +32,9 @@ struct _E_Config_Dialog_Data
    char *bg, *current_bg;
    int bg_method;
    E_Config_Dialog *cfd;
-   E_Config_Dialog *import;
    Evas_Object *il;
+   
+   E_Win *import;
 };
 
 EAPI E_Config_Dialog *
@@ -406,13 +411,23 @@ static void
 _bg_config_dialog_cb_import(void *data, void *data2) 
 {
    E_Config_Dialog *parent;
-   E_Config_Dialog *import;
+   E_Win *import;
    
    parent = data;
    if (!parent) return;
 
    import = e_int_config_background_import(parent);
-   parent->cfdata->import = import;
+   if (import) 
+     {         
+       parent->cfdata->import = import;
+       import_open = 1;
+       e_object_del_attach_func_set(E_OBJECT(import), _import_cb_closed);
+     }
+   else 
+     {
+       parent->cfdata->import = NULL;
+       import_open = 0;
+     }
 }
 
 static void 
@@ -452,19 +467,18 @@ _bg_file_added(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event,
 
 static int
 _bg_dialog_close(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) 
-{   
-   E_Dialog *dia;
-   E_Border *bd;
-   
+{
    if (!cfd) return 0;
    if (!cfdata) return 0;
    if (!cfdata->import) return 1;
-   if (!cfdata->import->dia) return 1;
-   
-   dia = cfdata->import->dia;
-   bd = e_border_find_by_window(dia->win->evas_win);
-   if (!bd) return 1;
+   if (!import_open) return 1;
    
-   e_object_del(E_OBJECT(cfdata->import->dia));   
+   e_object_del(E_OBJECT(cfdata->import));        
    return 1;
 }
+
+static void
+_import_cb_closed(void *obj) 
+{
+   import_open = 0;
+}
index 316363a..dd7559f 100644 (file)
 
 static Ecore_Event_Handler *_edj_exe_exit_handler = NULL;
 
-static void        *_create_data               (E_Config_Dialog *cfd);
-static void         _free_data                 (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
-static int          _basic_apply_data          (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
-static Evas_Object *_basic_create_widgets      (E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
-static void         _fill_data                 (E_Config_Dialog_Data *cfdata);
 static void         _efm_hilite_cb             (Evas_Object *obj, char *file, void *data);
 static void         _bg_edj_gen                (Evas *evas, char *filename, int method);
 static int          _edj_exe_exit_cb           (void *data, int type, void *event);
 
+static void _import_cb_delete(E_Win *win);
+static void _import_cb_resize(E_Win *win);
+static void _import_cb_close(void *data, void *data2);
+static void _import_cb_ok(void *data, void *data2);
+static void _import_cb_wid_on_focus(void *data, Evas_Object *obj);
+static void _import_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event);
+
+typedef struct _Bg_Import_Window Bg_Import_Window;
+struct _Bg_Import_Window 
+{
+   E_Config_Dialog *parent;
+   E_Config_Dialog_Data *cfdata;
+   
+   Evas_Object *bg_obj;
+   Evas_Object *box_obj;
+   Evas_Object *event_obj;
+   Evas_Object *content_obj;
+   
+   Evas_Object *ok_obj;
+   Evas_Object *close_obj;
+   
+   E_Win *win;
+};
+
 struct _E_Config_Dialog_Data 
 {
    char *file;   
    int method;
 };
 
-EAPI E_Config_Dialog *
+EAPI E_Win *
 e_int_config_background_import(E_Config_Dialog *parent)
 {
-   E_Config_Dialog *cfd;
-   E_Config_Dialog_View *v;
+   Evas *evas;
+   E_Win *win;
+   Bg_Import_Window *import;
+   Evas_Object *o, *of, *ofm, *ord;
+   E_Radio_Group *rg;
+   Evas_Coord w, h;
+   E_Config_Dialog_Data *cfdata;
+   Evas_Modifier_Mask mask;
    
-   /* Create A New Import Dialog */
-   v = E_NEW(E_Config_Dialog_View, 1);
+   import = E_NEW(Bg_Import_Window, 1);
+   if (!import) return NULL;
    
-   v->create_cfdata           = _create_data;
-   v->free_cfdata             = _free_data;
-   v->basic.apply_cfdata      = _basic_apply_data;
-   v->basic.create_widgets    = _basic_create_widgets;
+   win = e_win_new(parent->con);
+   if (!win) 
+     { 
+       free(import);
+       return NULL;    
+     }
    
-   cfd = e_config_dialog_new(parent->con, _("Import An Image"), NULL, 0, v, NULL);
-   e_dialog_resizable_set(cfd->dia, 1);
-   ecore_x_icccm_transient_for_set(cfd->dia->win->evas_win, parent->dia->win->evas_win);
-   return cfd;
-}
-
-static void *
-_create_data(E_Config_Dialog *cfd) 
-{
-   E_Config_Dialog_Data *cfdata;
-
    cfdata = E_NEW(E_Config_Dialog_Data, 1);
-   cfd->cfdata = cfdata;
-   _fill_data(cfdata);
-   return cfdata;   
-}
-
-static void
-_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) 
-{
-   free(cfdata);
-}
-
-static int
-_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) 
-{  
-   E_Fm_File *f;
-   Evas *evas;
+   cfdata->method = 0;
+   import->cfdata = cfdata;
+   import->win = win;
    
-   if (!cfdata->file[0]) return 0;
-
-   f = e_fm_file_new(cfdata->file);
-   if (!f) return 0;
-      
-   if (!e_fm_file_is_image(f)) return 0;
-   free(f);
+   evas = e_win_evas_get(win);
    
-   evas = e_win_evas_get(cfd->dia->win);
-   _bg_edj_gen(evas, cfdata->file, cfdata->method);
-   return 1;
-}
+   import->parent = parent;
 
-static Evas_Object *
-_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) 
-{
-   Evas_Object *o, *of, *ofm, *ol;
-   E_Dialog *dia;
-   E_Radio_Group *rg;
+   e_win_title_set(win, _("Import An Image"));
+   e_win_delete_callback_set(win, _import_cb_delete);
+   e_win_resize_callback_set(win, _import_cb_resize);
+   e_win_dialog_set(win, 1);
+   e_win_name_class_set(win, "E", "_dialog");
+
+   o = edje_object_add(evas);
+   import->bg_obj = o;
+   e_theme_edje_object_set(o, "base/theme/dialog", "widgets/dialog/main");
+   evas_object_move(o, 0, 0);
+   evas_object_show(o);
+   
+   o = e_widget_list_add(evas, 1, 1);
+   e_widget_on_focus_hook_set(o, _import_cb_wid_on_focus, import);
+   import->box_obj = o;
+   edje_object_part_swallow(import->bg_obj, "buttons_swallow", o);
    
-   _fill_data(cfdata);
+   o = evas_object_rectangle_add(evas);
+   import->event_obj = o;
+   mask = 0;
+   evas_object_key_grab(o, "Tab", mask, ~mask, 0);
+   mask = evas_key_modifier_mask_get(evas, "Shift");
+   evas_object_key_grab(o, "Tab", mask, ~mask, 0);
+   mask = 0;
+   evas_object_key_grab(o, "Return", mask, ~mask, 0);
+   mask = 0;
+   evas_object_key_grab(o, "KP_Enter", mask, ~mask, 0);
+   mask = 0;
+   evas_object_key_grab(o, "Space", mask, ~mask, 0);
+   mask = 0;
+   evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, _import_cb_key_down, import);
    
-   dia = cfd->dia;
+   o = e_widget_list_add(evas, 0, 0);   
+   import->content_obj = o;
 
-   ol = e_widget_list_add(evas, 0, 0);
-   of = e_widget_framelist_add(evas, _("Image To Import"), 0);   
    ofm = e_widget_fileman_add(evas, (&(cfdata->file)));
-   e_widget_fileman_hilite_callback_add(ofm, _efm_hilite_cb, dia);
-   e_widget_framelist_object_append(of, ofm);   
-   e_widget_list_object_append(ol, of, 1, 1, 0.5);
-   
+   e_widget_fileman_hilite_callback_add(ofm, _efm_hilite_cb, import);
+   e_widget_list_object_append(o, ofm, 1, 1, 0.5);
+
    of = e_widget_frametable_add(evas, _("Options"), 0);
    rg = e_widget_radio_group_new(&cfdata->method);
-   o = e_widget_radio_add(evas, _("Center"), E_BG_CENTER, rg);
-   e_widget_frametable_object_append(of, o, 0, 0, 1, 1, 1, 0, 1, 0);
-   o = e_widget_radio_add(evas, _("Scale"), E_BG_SCALE, rg);
-   e_widget_frametable_object_append(of, o, 0, 1, 1, 1, 1, 0, 1, 0);
-   o = e_widget_radio_add(evas, _("Tile"), E_BG_TILE, rg);
-   e_widget_frametable_object_append(of, o, 0, 2, 1, 1, 1, 0, 1, 0);
-
-   e_widget_list_object_append(ol, of, 1, 1, 0.5);
-   return ol;
-}
+   ord = e_widget_radio_add(evas, _("Center Image"), E_BG_CENTER, rg);
+   e_widget_frametable_object_append(of, ord, 0, 0, 1, 1, 1, 0, 1, 0);
+   ord = e_widget_radio_add(evas, _("Scale Image"), E_BG_SCALE, rg);
+   e_widget_frametable_object_append(of, ord, 0, 1, 1, 1, 1, 0, 1, 0);
+   ord = e_widget_radio_add(evas, _("Tile Image"), E_BG_TILE, rg);
+   e_widget_frametable_object_append(of, ord, 0, 2, 1, 1, 1, 0, 1, 0);
+   
+   e_widget_list_object_append(o, of, 1, 1, 0.5);
+   
+   e_widget_min_size_get(o, &w, &h);
+   edje_extern_object_min_size_set(o, w, h);
+   edje_object_part_swallow(import->bg_obj, "content_swallow", o);
+   evas_object_show(o);
+   
+   import->ok_obj = e_widget_button_add(evas, _("Import"), NULL, _import_cb_ok, win, cfdata);
+   e_widget_disabled_set(import->ok_obj, 1);
+   e_widget_list_object_append(import->box_obj, import->ok_obj, 1, 0, 0.5);
 
-static void
-_fill_data(E_Config_Dialog_Data *cfdata)
-{
-   cfdata->method = E_BG_SCALE;
+   import->close_obj = e_widget_button_add(evas, _("Close"), NULL, _import_cb_close, win, NULL);
+   e_widget_list_object_append(import->box_obj, import->close_obj, 1, 0, 0.5);
+   
+   e_win_centered_set(win, 1);
+   
+   o = import->box_obj;
+   e_widget_min_size_get(o, &w, &h);
+   edje_extern_object_min_size_set(o, w, h);
+   edje_object_part_swallow(import->bg_obj, "buttons_swallow", o);
+   
+   edje_object_size_min_calc(import->bg_obj, &w, &h);
+   evas_object_resize(import->bg_obj, w, h);
+   e_win_resize(win, w, h);
+   e_win_size_min_set(win, w, h);
+   e_win_size_max_set(win, 99999, 99999);
+   e_win_show(win);
+   
+   if (!e_widget_focus_get(import->bg_obj))
+     e_widget_focus_set(import->box_obj, 1);
+   
+   win->data = import;
+   return win;
 }
 
 static void 
 _efm_hilite_cb(Evas_Object *obj, char *file, void *data) 
 {
-   E_Dialog *dia;
    E_Fm_File *f;
+   Bg_Import_Window *import;
    
-   dia = (E_Dialog *)data;
-   if (!dia) return;
-
    f = e_fm_file_new(file);
    if (!f) return;
    
+   import = data;
+   if (!import) return;
+   
    if (e_fm_file_is_image(f)) 
-     {
-       e_dialog_button_disable_num_set(dia, 0, 0);   
-       e_dialog_button_disable_num_set(dia, 1, 0);     
-     }
+     e_widget_disabled_set(import->ok_obj, 0);
+   else 
+     e_widget_disabled_set(import->ok_obj, 1); 
+   
    free(f);
 }
 
@@ -289,8 +329,133 @@ _edj_exe_exit_cb(void *data, int type, void *event)
    
    x = NULL;
    ecore_event_handler_del(_edj_exe_exit_handler);
-
+   _edj_exe_exit_handler = NULL;
+   
    unlink(data);   
-
    return 0;
 }
+
+static void 
+_import_cb_delete(E_Win *win) 
+{
+   Bg_Import_Window *import;
+   
+   import = win->data;
+   if (import) free(import);
+   e_object_del(E_OBJECT(win));
+}
+
+static void 
+_import_cb_resize(E_Win *win) 
+{
+   Bg_Import_Window *import;
+   
+   import = win->data;
+   if (!import) return;
+   evas_object_resize(import->bg_obj, win->w, win->h);
+}
+
+static void 
+_import_cb_close(void *data, void *data2) 
+{
+   Bg_Import_Window *import;
+   E_Win *win;
+   
+   win = data;   
+   import = win->data;
+   if (import) free(import);
+   e_object_del(E_OBJECT(win));
+}
+
+static void 
+_import_cb_ok(void *data, void *data2) 
+{
+   E_Fm_File *f;
+   Evas *evas;
+   E_Win *win;
+   E_Config_Dialog_Data *cfdata;
+   
+   win = data;   
+   cfdata = data2;
+   
+   if (!cfdata->file[0]) return;
+
+   f = e_fm_file_new(cfdata->file);
+   if (!f) return;
+   if (!e_fm_file_is_image(f)) return;
+   free(f);
+
+   evas = e_win_evas_get(win);
+   _bg_edj_gen(evas, cfdata->file, cfdata->method);
+}
+
+static void 
+_import_cb_wid_on_focus(void *data, Evas_Object *obj) 
+{
+   Bg_Import_Window *import;
+   
+   import = data;
+   if (obj == import->content_obj)
+     e_widget_focused_object_clear(import->box_obj);
+   else if (import->content_obj)
+     e_widget_focused_object_clear(import->content_obj);
+}
+
+static void 
+_import_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event) 
+{
+   Evas_Event_Key_Down *ev;
+   Bg_Import_Window *dia;
+
+   ev = event;
+   dia = data;
+   if (!strcmp(ev->keyname, "Tab"))
+     {
+       if (evas_key_modifier_is_set(evas_key_modifier_get(e_win_evas_get(dia->win)), "Shift"))
+         {
+            if (e_widget_focus_get(dia->box_obj))
+              {
+                 if (!e_widget_focus_jump(dia->box_obj, 0))
+                   {
+                      e_widget_focus_set(dia->content_obj, 0);
+                      if (!e_widget_focus_get(dia->content_obj))
+                        e_widget_focus_set(dia->box_obj, 0);
+                   }
+              }
+            else
+              {
+                 if (!e_widget_focus_jump(dia->content_obj, 0))
+                   e_widget_focus_set(dia->box_obj, 0);
+              }
+         }
+       else
+         {
+            if (e_widget_focus_get(dia->box_obj))
+              {
+                 if (!e_widget_focus_jump(dia->box_obj, 1))
+                   {
+                      e_widget_focus_set(dia->content_obj, 1);
+                      if (!e_widget_focus_get(dia->content_obj))
+                        e_widget_focus_set(dia->box_obj, 1);
+                   }
+              }
+            else
+              {
+                 if (!e_widget_focus_jump(dia->content_obj, 1))
+                   e_widget_focus_set(dia->box_obj, 1);
+              }
+         }
+     }
+   else if (((!strcmp(ev->keyname, "Return")) || 
+            (!strcmp(ev->keyname, "KP_Enter")) || 
+            (!strcmp(ev->keyname, "space"))))
+     {
+       Evas_Object *o = NULL;
+       
+       if ((dia->content_obj) && (e_widget_focus_get(dia->content_obj)))
+         o = e_widget_focused_object_get(dia->content_obj);
+       else
+         o = e_widget_focused_object_get(dia->box_obj);
+       if (o) e_widget_activate(o);
+     }   
+}
index 74f7dbe..b8259b4 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef E_INT_CONFIG_BACKGROUND_IMPORT_H
 #define E_INT_CONFIG_BACKGROUND_IMPORT_H
 
-EAPI E_Config_Dialog *e_int_config_background_import(E_Config_Dialog *parent);
+EAPI E_Win *e_int_config_background_import(E_Config_Dialog *parent);
 
 #endif
 #endif