[gegl] bin: add star command
- From: Øyvind "pippin" Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] bin: add star command
- Date: Wed, 10 Apr 2019 17:02:25 +0000 (UTC)
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]