[gegl] bin: add star command



commit 6da824cad4b565faa6c4131afa4a46d810bfe67e
Author: Øyvind Kolås <pippin gimp org>
Date:   Wed Apr 10 05:58:46 2019 +0200

    bin: add star command
    
    This command uses the newly added meta data API to give an integer score to an
    image by pressing the corresponding digit in viewer and collection view.
    
    Later sorting/filtering based on stars and more meta-data will be added.

 bin/lua/init.lua    | 117 ++++++++++++++++++++++++++++++++++++++++++++++++----
 bin/lua/viewer.lua  |  22 ++++++++++
 bin/ui-collection.c |  33 ++++++++++++---
 bin/ui-core.c       |  58 ++++++++++++++++++++------
 bin/ui-viewer.c     |   8 +++-
 bin/ui.h            |   4 +-
 6 files changed, 213 insertions(+), 29 deletions(-)
---
diff --git a/bin/lua/init.lua b/bin/lua/init.lua
index 1c1a9cc9c..205b8f4fd 100644
--- a/bin/lua/init.lua
+++ b/bin/lua/init.lua
@@ -117,9 +117,6 @@ struct _GeState {
 
 typedef struct _GeState GeState;
 
-const char *ge_state_get_path (GeState *state, int no);
-int         ge_state_get_n_paths (GeState *state);
-
 float hypotf (float a, float b);
 GeState *app_state(void);
 int argvs_eval (const char *str);
@@ -134,17 +131,121 @@ void   ui_load_path        (GeState *o);
 void   ui_contrasty_stroke (cairo_t *cr);
 
 
+
+void        meta_set_key (GeState    *state,
+                          const char *path,
+                          const char *key,
+                          const char *value);
+
+const char *meta_get_key (GeState    *state, const char *path, const char *key);
+
+void        meta_set_key_int (GeState    *state, const char *path, const char *key, int value);
+int         meta_get_key_int (GeState    *state, const char *path, const char *key); 
+void        meta_set_key_float (GeState *state, const char *path, const char *key, float value);
+float       meta_get_key_float (GeState *state, const char *path, const char *key);
+
+int
+meta_get_attribute_int (GeState    *state,
+                        const char *path,
+                        int         child_no,
+                        // also have child name
+                        const char *attribute);
+
+float
+meta_get_attribute_float (GeState    *state,
+                          const char *path,
+                          int         child_no,
+                          // also have child name
+                          const char *attribute);
+
+void
+meta_set_attribute_float (GeState    *state,
+                          const char *path,
+                          int         child_no,
+                          // also have child name
+                          const char *attribute,
+                          float       detail);
+
+void
+meta_set_attribute_int (GeState    *state,
+                        const char *path,
+                        int         child_no,
+                        // also have child name
+                        const char *attribute,
+                        int         detail);
+
+/* --- the display order is overrides, then dirlist.. this
+ *     should be configurable
+ *
+ * the display order should be a second list of
+ */
+
+void
+meta_set_attribute (GeState    *state,
+                    const char *path,
+                    int         child_no,
+                    const char *attribute,
+                    const char *detail);
+const char *
+meta_get_attribute (GeState    *state,
+                    const char *path,
+                    int         child_no,
+                    const char *attribute);
+int
+meta_has_attribute (GeState    *state,
+                    const char *path,
+                    int         child_no,
+                    const char *attribute);
+void
+meta_unset_attribute (GeState    *state,
+                      const char *path,
+                      int         child_no,
+                      const char *attribute);
+
+/* for now - not supporting multivalue on attribute/details  */
+
+char *
+meta_get_child (GeState    *state,
+                const char *path,
+                int         child_no);
+
+void
+meta_insert_child (GeState    *state,
+                   const char *path,
+                   int         child_no,
+                   const char *child_name);
+int
+meta_remove_child (GeState    *state,
+                   const char *path,
+                   int         child_no,
+                   const char *child_name);
+
+void
+meta_replace_child (GeState    *state,
+                    const char *path,
+                    int         old_child_no,
+                    const char *old_child_name,
+                    const char *new_child_name);
+
+void
+meta_swap_children (GeState    *state,
+                    const char *path,
+                    int         child_no1,
+                    const char *child_name1,
+                    int         child_no2,
+                    const char *child_name2);
+
+char *meta_child_no_path (GeState *o, const char *path, int child_no);
+
+
 ]]
 
 o = ffi.C.app_state()
 mrg = o.mrg
 
 ffi.metatype('GeState', {__index = {
-   get_path = function(...) local ret = ffi.C.ge_state_get_path(...)
-                              if ret ~= nil then return ffi.string(ret) end
-                              return nil
-                            end;
-   get_n_paths = function(...) return ffi.C.get_state_get_n_paths(...) end;
+   get_key_int = function(...) return ffi.C.meta_get_key_int(...) end;
+   --get_n_paths = function(...) return ffi.C.get_state_get_n_paths(...) end;
  }})
 
 function touch_point(x, y)
diff --git a/bin/lua/viewer.lua b/bin/lua/viewer.lua
index a8070935f..a27b0eaa2 100644
--- a/bin/lua/viewer.lua
+++ b/bin/lua/viewer.lua
@@ -391,4 +391,26 @@ mrg:add_binding("control-y", NULL, "toggle display profile",
 mrg:add_binding("control-delete", NULL, "discard",
   function() ffi.C.argvs_eval ("discard") end)
 
+if o.commandline[0] == 0 then
+  mrg:add_binding("1", NULL, "give one star",
+    function() ffi.C.argvs_eval ("star 1") end)
+  mrg:add_binding("2", NULL, "give two stars",
+    function() ffi.C.argvs_eval ("star 2") end)
+  mrg:add_binding("3", NULL, "give three stars",
+    function() ffi.C.argvs_eval ("star 3") end)
+  mrg:add_binding("4", NULL, "give four stars",
+    function() ffi.C.argvs_eval ("star 4") end)
+  mrg:add_binding("5", NULL, "give five stars",
+    function() ffi.C.argvs_eval ("star 5") end)
+  mrg:add_binding("0", NULL, "give no stars",
+    function() ffi.C.argvs_eval ("star 0") end)
+end
+
+local stars = o:get_key_int(o.path, "stars")
+
+if stars >= 0 then
+  mrg:print('' .. stars)
+end
+
+
 cr:restore()
diff --git a/bin/ui-collection.c b/bin/ui-collection.c
index 7ab72ea4f..49713359c 100644
--- a/bin/ui-collection.c
+++ b/bin/ui-collection.c
@@ -178,7 +178,7 @@ static void on_dir_drag (MrgEvent *e, void *data1, void *data2)
 
     /* auto-center */
     {
-      int count = g_list_length (o->paths) + g_list_length (o->index);
+      int count = ui_items_count (o);
       if (o->v < 0)
         o->v = 0;
       if (o->v > count/hack_cols * hack_dim - mrg_height(e->mrg)/2)
@@ -233,7 +233,7 @@ static void on_dir_scroll_drag (MrgEvent *e, void *data1, void *data2)
       break;
     case MRG_DRAG_MOTION:
       {
-        int count = g_list_length (o->paths) + g_list_length (o->index);
+        int count = ui_items_count (o);
         float height = mrg_height (e->mrg);
 #if 0
         y = height * ( o->v / (count/hack_cols * hack_dim) )
@@ -273,7 +273,7 @@ void ui_collection (GeState *o)
   cols = hack_cols;
   dim = hack_dim;
 
-  count = g_list_length (o->paths) + g_list_length (o->index);
+  count = ui_items_count (o);
 
   cairo_save (cr);
   cairo_translate (cr, 0, -(int)o->v);
@@ -426,6 +426,19 @@ void ui_collection (GeState *o)
       {
         mrg_set_xy (mrg, x, y + dim - mrg_em(mrg));
         mrg_printf (mrg, "%s\n", lastslash+1);
+        {
+          int stars = meta_get_key_int (o, path, "stars");
+          if (stars >= 0)
+          {
+            mrg_start (mrg, "div.collstars", NULL);
+            mrg_set_xy (mrg, x, y + mrg_em(mrg) * 1.5);
+            for (int i = 0; i < stars; i ++)
+            {
+              mrg_printf (mrg, "★", lastslash+1);
+            }
+            mrg_end (mrg);
+          }
+        }
       }
       cairo_new_path (mrg_cr(mrg));
       cairo_rectangle (mrg_cr(mrg), x, y, dim, dim);
@@ -490,6 +503,14 @@ void ui_collection (GeState *o)
     mrg_add_binding (mrg, "+", NULL, NULL, ui_run_command, "zoom in");
     mrg_add_binding (mrg, "=", NULL, NULL, ui_run_command, "zoom in");
     mrg_add_binding (mrg, "-", NULL, NULL, ui_run_command, "zoom out");
+
+
+    mrg_add_binding (mrg, "0", NULL, NULL, ui_run_command, "star 0");
+    mrg_add_binding (mrg, "1", NULL, NULL, ui_run_command, "star 1");
+    mrg_add_binding (mrg, "2", NULL, NULL, ui_run_command, "star 2");
+    mrg_add_binding (mrg, "3", NULL, NULL, ui_run_command, "star 3");
+    mrg_add_binding (mrg, "4", NULL, NULL, ui_run_command, "star 4");
+    mrg_add_binding (mrg, "5", NULL, NULL, ui_run_command, "star 5");
   }
   mrg_add_binding (mrg, "escape", NULL, "parent folder", ui_run_command, "parent");
   mrg_add_binding (mrg, "control-delete", NULL, NULL,  ui_run_command, "discard");
@@ -512,7 +533,7 @@ int cmd_collection (COMMAND_ARGS); /* "collection", -1, "<up|left|right|down|fir
   }
   else if (!strcmp(argv[1], "last"))
   {
-    o->entry_no = g_list_length (o->paths) + g_list_length (o->index)-1;
+    o->entry_no = ui_items_count (o)-1;
   }
   else if (!strcmp(argv[1], "right"))
   {
@@ -534,8 +555,8 @@ int cmd_collection (COMMAND_ARGS); /* "collection", -1, "<up|left|right|down|fir
   if (o->entry_no < -1)
     o->entry_no = -1;
 
-  if (o->entry_no >= (int)(g_list_length (o->paths) + g_list_length (o->index)))
-    o->entry_no = g_list_length (o->paths) + g_list_length (o->index)-1;
+  if (o->entry_no >= ui_items_count (o))
+    o->entry_no = ui_items_count (o)-1;
 
   ui_center_active_entry (o);
 
diff --git a/bin/ui-core.c b/bin/ui-core.c
index 90a22f548..f2defa4cd 100644
--- a/bin/ui-core.c
+++ b/bin/ui-core.c
@@ -30,6 +30,7 @@
 #define font_size_scale  0.020
 
 const char *css =
+"div.collstars {color: yellow; background: transparent;};"
 "div.lui { font-size: 2.0vh; color: white; padding-left:1em; padding-bottom: 1em; position: absolute; top: 
0; right: 1em; width:20em; background-color:rgba(1,0,0,0.0);}\n"
 "div.properties { color: blue; padding-left:1em; padding-bottom: 1em; position: absolute; top: 0; right: 
1em; width:20em; background-color:rgba(1,0,0,0.75);}\n"
 "div.property   { color: white; margin-top: -.5em; background:transparent;}\n"
@@ -290,6 +291,11 @@ GeState *ge_state_new (void)
   return g_object_new (GE_STATE_TYPE, NULL);
 }
 
+int ui_items_count (GeState *o)
+{
+  return g_list_length (o->index) +
+         g_list_length (o->paths);
+}
 
 /* gets the node which is the direct consumer, and not a clone.
  *
@@ -6438,6 +6444,44 @@ cmd_toggle (COMMAND_ARGS)
   return 0;
 }
 
+  int cmd_star (COMMAND_ARGS);
+int cmd_star (COMMAND_ARGS) /* "star", -1, "", "query or set number of stars"*/
+{
+  GeState *o = global_state;
+  char *path = NULL;
+  if (o->is_dir)
+  {
+    path = meta_child_no_path (o, NULL, o->entry_no);
+    if (g_file_test (path, G_FILE_TEST_IS_DIR))
+    {
+      g_free (path);
+      return -1;
+    }
+  }
+  else
+  {
+    path = g_strdup (o->path);
+  }
+
+  if (argv[1])
+  {
+    meta_set_key_int (o, path, "stars", atoi(argv[1]));
+  }
+  else
+  {
+    int stars = meta_get_key_int (o, path, "stars");
+    if (stars >= 0)
+      printf ("%s has %i stars\n", path, stars);
+    else
+      printf ("stars have not been set on %s\n", path);
+  }
+  g_free (path);
+  mrg_queue_draw (o->mrg, NULL);
+
+  return 0;
+}
+
+
   int cmd_discard (COMMAND_ARGS);
 int cmd_discard (COMMAND_ARGS) /* "discard", 0, "", "moves the current image to a .discard subfolder"*/
 {
@@ -6458,7 +6502,7 @@ int cmd_discard (COMMAND_ARGS) /* "discard", 0, "", "moves the current image to
 
   if (!o->is_dir)
   {
-  if (o->entry_no == g_list_length (o->index) + g_list_length(o->paths)-1)
+  if (o->entry_no == ui_items_count (o) - 1)
    {
      argvs_eval ("prev");
    }
@@ -6798,7 +6842,7 @@ int cmd_next (COMMAND_ARGS) /* "next", 0, "", "next sibling element in current c
   if (o->rev)
     argvs_eval ("save");
 
-  if (o->entry_no >= (int)(g_list_length(o->index)+g_list_length(o->paths))-1)
+  if (o->entry_no >= ui_items_count (o) -1)
     return 0;
   o->entry_no ++;
     //o->entry_no = 0;
@@ -7421,16 +7465,6 @@ cmd_todo (COMMAND_ARGS)
   return 0;
 }
 
-const char *ge_state_get_path (GeState *state, int no)
-{
-  return g_list_nth_data (state->paths, no);
-}
-
-int ge_state_get_n_paths (GeState *state)
-{
-  return g_list_length (state->paths);
-}
-
 void
 meta_set_key (GeState *state,const char *path, const char *key, const char *value)
 {
diff --git a/bin/ui-viewer.c b/bin/ui-viewer.c
index 210b77690..8f8ddd2e1 100644
--- a/bin/ui-viewer.c
+++ b/bin/ui-viewer.c
@@ -501,8 +501,14 @@ void ui_viewer (GeState *o)
    mrg_add_binding (mrg, "+", NULL, NULL, ui_run_command, "zoom in");
    mrg_add_binding (mrg, "=", NULL, NULL, ui_run_command, "zoom in");
    mrg_add_binding (mrg, "-", NULL, NULL, ui_run_command, "zoom out");
-   mrg_add_binding (mrg, "0", NULL, "pixel for pixel", ui_run_command, "zoom 1.0");
+   mrg_add_binding (mrg, "8", NULL, "pixel for pixel", ui_run_command, "zoom 1.0");
    mrg_add_binding (mrg, "9", NULL, NULL, ui_run_command, "zoom fit");
+   mrg_add_binding (mrg, "0", NULL, NULL, ui_run_command, "star 0");
+   mrg_add_binding (mrg, "1", NULL, NULL, ui_run_command, "star 1");
+   mrg_add_binding (mrg, "2", NULL, NULL, ui_run_command, "star 2");
+   mrg_add_binding (mrg, "3", NULL, NULL, ui_run_command, "star 3");
+   mrg_add_binding (mrg, "4", NULL, NULL, ui_run_command, "star 4");
+   mrg_add_binding (mrg, "5", NULL, NULL, ui_run_command, "star 5");
  }
 
  mrg_add_binding (mrg, "control-m", NULL, NULL, ui_run_command, "toggle mipmap");
diff --git a/bin/ui.h b/bin/ui.h
index 9445e03a5..d87440d06 100644
--- a/bin/ui.h
+++ b/bin/ui.h
@@ -153,7 +153,7 @@ void        ui_load_path           (GeState *o);
 void        ui_center_active_entry (GeState *o);
 
 
-
+int         ui_items_count         (GeState *o);
 
 void        meta_set_key (GeState    *state,
                           const char *path,
@@ -163,7 +163,7 @@ void        meta_set_key (GeState    *state,
 const char *meta_get_key (GeState    *state, const char *path, const char *key);
 
 void        meta_set_key_int (GeState    *state, const char *path, const char *key, int value);
-int         meta_get_key_int (GeState    *state, const char *path, const char *key); 
+int         meta_get_key_int (GeState    *state, const char *path, const char *key);
 void        meta_set_key_float (GeState *state, const char *path, const char *key, float value);
 float       meta_get_key_float (GeState *state, const char *path, const char *key);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]