- more work on typebuffer
authorcodewarrior <codewarrior>
Tue, 8 Nov 2005 00:00:30 +0000 (00:00 +0000)
committercodewarrior <codewarrior@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Tue, 8 Nov 2005 00:00:30 +0000 (00:00 +0000)
- you can do things like '*a*' or 'A*' and they will get selected.
- todo:
 * replace TEXT part with something better (size limitations)
 * add more logic to typebuffer

SVN revision: 18366

data/themes/default_fileman.edc
data/themes/images/Makefile.am
src/bin/e_fileman_smart.c

index 63df701..caa6664 100644 (file)
@@ -188,9 +188,13 @@ group {
         description {
            state: "default" 0.0;
            min: 96 64;
-           max: 384 64;            
-           visible: 0;
+           max: 384 64;
+           /* if we enable this, then we will zoom in / out */
+           //min: 24 16;
+           //max: 24 16;
+           visible: 1;
            align: 0.5 0.5;
+           color: 255 255 255 0;
            image {
               normal: "e17_fileman_typebuf.png";
               border: 17 17 17 17;
@@ -199,31 +203,60 @@ group {
         description {
            state: "shown" 0.0;
            inherit: "default" 0.0;
+           min: 96 64;
+           max: 384 64;
            visible: 1;
+           color: 255 255 255 255;
         }
-      }     
-   }
-   
-   programs {   
-      program {
-        name: "typebuf_show";
-        signal: "typebuf_show";
-        source: "";
-        action: STATE_SET "shown" 0.0;
-        transition: LINEAR 0.2;
-        target: "typebuffer";
       }
-      program {
-        name: "typebuf_hide";
-        signal: "typebuf_hide";
-        source: "";
-        action: STATE_SET "default" 0.0;
-        transition: LINEAR 0.2;
-        target: "typebuffer";
+      part {
+        name:          "text";
+        type:          TEXT;
+        effect:        SHADOW;
+        description {
+           state: "default" 0.0;
+           fixed: 1 1;
+           align: 0.5 0.5;
+           color: 0 0 0 0;
+           color3: 255 255 255 0;
+           text {
+              text:     "No Title";
+              size:     12;
+              font:     "Edje-Vera";
+              align:    0.5 0.5;
+              elipsis:  0.0;
+              min: 1 1;
+           }       
+        }
+        description {
+           state: "shown" 0.0;
+           inherit: "default" 0.0;
+           color: 0 0 0 255;
+           color3: 255 255 255 128;
+        }          
+      }         
+      programs {   
+        program {
+           name: "typebuf_show";
+           signal: "typebuf_show";
+           source: "";
+           action: STATE_SET "shown" 0.0;
+           transition: LINEAR 0.2;
+           target: "typebuffer";
+           target: "text";
+        }
+        program {
+           name: "typebuf_hide";
+           signal: "typebuf_hide";
+           source: "";
+           action: STATE_SET "default" 0.0;
+           transition: LINEAR 0.2;
+           target: "typebuffer";
+           target: "text";         
+        }
       }
    }
 }
-        
 
 group {
    name: "fileman/main";
index d74599d..0466efa 100644 (file)
@@ -332,6 +332,7 @@ e17_fileman_bg.png \
 e17_fileman_bg_shadow.png \
 e17_fileman_rubberband.png \
 e17_fileman_thumb_bg.png \
+e17_fileman_typebuf.png \
 e17_icon_fileman_c.png \
 e17_icon_fileman_file.png \
 e17_icon_fileman_file_clicked.png \
index 52b7abc..6fcc601 100644 (file)
@@ -8,6 +8,7 @@
 #include <dirent.h>
 #include <pwd.h>
 #include <grp.h>
+#include <regex.h>
 
 /* TODO:
  *
@@ -238,7 +239,7 @@ static void                _e_fm_icon_mouse_out_cb  (void *data, Evas *e, Evas_O
 static void                _e_fm_icon_mouse_move_cb (void *data, Evas *e, Evas_Object *obj, void *event_info);
 static int                 _e_fm_win_mouse_up_cb    (void *data, int type, void *event);
 
-static void                _e_fm_icon_goto_key(E_Fm_Smart_Data *sd, char *c);
+static void                _e_fm_icon_select_regex(E_Fm_Smart_Data *sd, char *glob);
 static void                _e_fm_icon_select_up(E_Fm_Smart_Data *sd);
 static void                _e_fm_icon_select_down(E_Fm_Smart_Data *sd);
 static void                _e_fm_icon_select_left(E_Fm_Smart_Data *sd);
@@ -1468,9 +1469,9 @@ _e_fm_dir_files_get(void *data)
       sd->files = evas_list_sort(sd->files, 
                                 evas_list_count(sd->files),
                                 _e_fm_files_sort_name_cb);
-      e_icon_layout_sort(sd->layout, _e_fm_files_sort_layout_name_cb);
+//      e_icon_layout_sort(sd->layout, _e_fm_files_sort_layout_name_cb);
+
 
-/*
       e_icon_layout_freeze(sd->layout);      
       e_icon_layout_reset(sd->layout);
       
@@ -1480,7 +1481,7 @@ _e_fm_dir_files_get(void *data)
           e_icon_layout_pack(sd->layout, icon->icon_object);
        }
       e_icon_layout_thaw(sd->layout);
-*/      
+      
       sd->timer = NULL;
       return 0;
    }
@@ -2258,11 +2259,104 @@ _e_fm_win_mouse_up_cb(void *data, int type, void *event)
    return 0;
 }
 
+static void 
+_e_fm_string_replace(const char *src, const char *key, const char *replacement, char *result, size_t resultsize)
+{
+   size_t resultlen;
+   size_t keylen;
+   
+   if(resultsize < 0) return;
+   
+   /* special case to prevent infinite loop if key==replacement=="" */
+   if(strcmp(key, replacement) == 0)
+     {
+       snprintf(result, resultsize, "%s", src);
+       return;
+     }
+   
+   keylen = strlen(key);
+   
+   resultlen = 0;
+   while(*src != '\0' && resultlen+1 < resultsize)
+     {
+       if(strncmp(src, key, keylen) == 0)
+         {
+            snprintf(result+resultlen, resultsize-resultlen, "%s", replacement);
+            resultlen += strlen(result+resultlen);
+            src += keylen;
+         }
+       else
+         {
+            result[resultlen++] = *src++;
+         }
+     }
+   result[resultlen] = '\0';
+}
+
+
+static void
+_e_fm_icon_select_regex(E_Fm_Smart_Data *sd, char *glob)
+{
+   E_Fm_Icon *icon;
+   Evas_List *l;
+   char *regex, *tregex;
+   regex_t reg, *creg;
+   int stars, i;
+   
+   stars = 0;
+   for(i = 0; i < strlen(glob); i++)
+     if(glob[i] == '*')
+       stars++;
+         
+   tregex = calloc(strlen(glob) + stars + 1, sizeof(char));
+   _e_fm_string_replace(glob, "*", ".*", tregex, (strlen(glob) + stars + 1)*sizeof(char));
+   regex = calloc(strlen(tregex) + 3, sizeof(char));
+   snprintf(regex, (strlen(tregex) + 3)*sizeof(char), "^%s$", tregex);
+   regcomp(&reg, regex, REG_NOSUB | REG_EXTENDED);   
+   _e_fm_selections_clear(sd);   
+   for (l = sd->files; l; l = l->next)
+     {
+       icon = l->data;
+       creg = &reg;
+       if(!regexec(creg, icon->file->name, 0, NULL, 0))
+         {          
+            _e_fm_selections_add(l->data, l);       
+         }
+     }
+
+   return;
+#if 0   
+position:
+     { 
+       Evas_Coord x, y, w, h;
+       icon = l->data;
+       evas_object_geometry_get(icon->icon_object, &x, &y, &w, &h);
+       if(!E_CONTAINS(sd->x, sd->y, sd->w, sd->h, x, y, w, h))
+         {
+            E_Event_Fm_Reconfigure *ev;
+
+            ev = E_NEW(E_Event_Fm_Reconfigure, 1);
+            if (ev)
+              {                            
+                 ev->object = sd->object;
+                 ev->x = sd->x;
+                 ev->y = sd->child.y - (sd->y - (y - sd->icon_info.y_space));
+                 ev->w = sd->w;
+                 ev->h = sd->h;
+                 ecore_event_add(E_EVENT_FM_RECONFIGURE, ev, NULL, NULL);
+              }
+         }
+     }
+#endif   
+}
+
 static void
-_e_fm_icon_goto_key(E_Fm_Smart_Data *sd, char *c)
+__e_fm_icon_goto_key(E_Fm_Smart_Data *sd, char *c)
 {
    E_Fm_Icon *icon;
    Evas_List *l;
+
+   return;
    
    if(sd->selection.current.ptr)   
      {
@@ -2624,8 +2718,6 @@ _e_fm_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
    
    ev = event_info;
    sd = data;   
-
-   edje_object_signal_emit(sd->object, "typebuf_show", "");
    
    if (!strcmp(ev->keyname, "Up"))
      _e_fm_icon_select_up(sd);
@@ -2635,23 +2727,81 @@ _e_fm_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
      _e_fm_icon_select_left(sd);
    else if (!strcmp(ev->keyname, "Right"))
      _e_fm_icon_select_right(sd);
+   else if (!strcmp(ev->keyname, "Escape"))
+     {
+       if(!strcmp(edje_object_part_state_get(sd->edje_obj, "typebuffer", NULL), "shown"))
+         {
+            edje_object_signal_emit(sd->edje_obj, "typebuf_hide", "");      
+            edje_object_part_text_set(sd->edje_obj, "text", "");
+         }
+     }
    else if (!strcmp(ev->keyname, "Return"))
-     _e_fm_icon_run(sd);
+     {
+       if(!strcmp(edje_object_part_state_get(sd->edje_obj, "typebuffer", NULL), "shown"))
+         {
+            char *buf;
+            
+            edje_object_signal_emit(sd->edje_obj, "typebuf_hide", "");
+            buf = strdup(edje_object_part_text_get(sd->edje_obj, "text"));
+            edje_object_part_text_set(sd->edje_obj, "text", "");
+            if(strcmp(buf, ""))
+              _e_fm_icon_select_regex(sd, buf);
+         }
+       else
+         _e_fm_icon_run(sd);
+     }
    else if (!strcmp(ev->keyname, "BackSpace"))
      {
-       char *fullname;
-       
-       fullname = _e_fm_dir_pop(sd->dir);
-       if (fullname)
+       if(!strcmp(edje_object_part_state_get(sd->edje_obj, "typebuffer", NULL), "shown"))
          {
-            if (sd->win)
-              e_win_title_set(sd->win, fullname);
-            _e_fm_dir_set(sd, fullname);
-            free(fullname);
-         }     
+            char *str;
+            str = NULL;
+            str = edje_object_part_text_get(sd->edje_obj, "text");
+            if(str)
+              {
+                 char *buf;
+                 int size;
+                 size = strlen(str);
+                 buf = calloc(size , sizeof(char));
+                 snprintf(buf, size, "%s", str);
+                 edje_object_part_text_set(sd->edje_obj, "text", buf);
+              }             
+         }
+       else
+         {
+            char *fullname;
+            
+            fullname = _e_fm_dir_pop(sd->dir);
+            if (fullname)
+              {
+                 if (sd->win)
+                   e_win_title_set(sd->win, fullname);
+                 _e_fm_dir_set(sd, fullname);
+                 free(fullname);
+              }
+         }
      }
    else if(strlen(ev->keyname) == 1)
-     _e_fm_icon_goto_key(sd, ev->string);
+     {
+       char *str;
+       str = NULL;
+       str = edje_object_part_text_get(sd->edje_obj, "text");
+       if(str)
+         {
+            char *buf;
+            int size;
+            size = strlen(str) + strlen(ev->string) + 2;
+            buf = calloc(size, sizeof(char));
+            snprintf(buf, size, "%s%s", str, ev->string);
+            edje_object_part_text_set(sd->edje_obj, "text", buf);
+         }
+       else
+         {
+            edje_object_part_text_set(sd->edje_obj, "text", ev->key);       
+         }
+       if(strcmp(edje_object_part_state_get(sd->edje_obj, "typebuffer", NULL), "shown"))
+         edje_object_signal_emit(sd->edje_obj, "typebuf_show", "");
+     }   
 }
 
  static int