detailview - do more item types

This commit is contained in:
Carsten Haitzler 2023-10-20 19:48:44 +01:00
parent 6b9cc3fa07
commit 7b83f16e4e
6 changed files with 176 additions and 43 deletions

View File

@ -59,19 +59,16 @@
* Streamline detail mode
* Std detail mode keep
* Above format would be a type per col. Types to support:
* progressbar
* check
* slider
* graph
* solid
* line
* bars
* multiple graphs
* icon (re-use efm_icon)
* entry
* slider
* range (slider 2 val)
* button
* segmentcontrol
* hoversel
* color dot (use named colorclass)
## Medium term

View File

@ -126,15 +126,15 @@ D="detail-format=text,text,progress,checkview,timestamp,size"
e_cmd "file-add path="${F}" "${M}" "${D}\
" detail1=one detail2=two detail3=noval,55/100 detail4=0 detail5=1696332215 detail6=16384/65536"
D="detail-format=text,text,text,checkview,timestamp,size"
D="detail-format=icon,check,circle,checkview,timestamp,size"
e_val_escape F ${DIR}"g h i"
e_cmd "file-add path="${F}" "${M}" "${D}\
" detail1=one detail2=two detail3=three detail4=true detail5=1696322215 detail6=65535/65536"
" detail1=std:dialog-error detail2=true detail3=cc::selected detail4=true detail5=1696322215 detail6=65535/65536"
D="detail-format=text,text,text,checkview,timestamp,size"
D="detail-format=icon,check,circle,checkview,timestamp,size"
e_val_escape F ${DIR}"z~"
e_cmd "file-add path="${F}" "${M}" "${D}\
" detail1=one detail2=two detail3=three detail4=false detail5=1296332215 detail6=7823/65536"
" detail1=dance.gif detail2=false detail3=#ff665580 detail4=false detail5=1296332215 detail6=7823/65536"
# end initial listing of files
e_cmd "list-end"
}
@ -184,6 +184,9 @@ function handle_cmd() {
;;
file-rename )
;;
file-detail-change )
e_err "file-detail-change" ${ARGS[0]} ${ARGS[1]} ${ARGS[2]} ${ARGS[3]} ${ARGS[4]} ${ARGS[5]}
;;
esac
}

View File

@ -721,6 +721,7 @@ _add_overlay_objects(Smart_Data *sd)
_cb_overlay_detail_mouse_move, sd);
sd->o_list_detail_swallow[i] = o = evas_object_rectangle_add(e);
evas_object_pass_events_set(o, EINA_TRUE);
snprintf(buf, sizeof(buf), "e.swallow.detail%i", i + 1);
evas_object_size_hint_min_set(
o, sd->config.detail_min_w[i] * _scale_get(sd), 0);

View File

@ -25,16 +25,17 @@ struct _Smart_Data
Eina_Stringshare *video; // video path
Ecore_Timer *anim_timer; // timer for animation frame flipping
int load_size; // the sie we want to load now
int orig_w, orig_h; // the sie of the img we loaded
int frame; // current frame to display
int frame_count; // number of frames in anim
double video_ratio; // aspect ratio for videos
Evas_Image_Animated_Loop_Hint loop_type; // animated loop type
Eina_Bool alpha : 1; // does the img have alpha
Eina_Bool svg : 1; // is the img a svg
Eina_Bool newfile : 1; // did we just set a new file
Eina_Bool animated : 1; // is this animated?
int load_size; // the sz we want to load now
int orig_w, orig_h; // the sz of the img we loaded
int frame; // current frame to display
int frame_count; // number of frames in anim
double video_ratio; // aspect ratio for videos
Evas_Image_Animated_Loop_Hint loop_type; // animated loop type
Eina_Bool alpha : 1; // does the img have alpha
Eina_Bool svg : 1; // is the img a svg
Eina_Bool newfile : 1; // did we just set a new file
Eina_Bool animated : 1; // is this animated?
Eina_Bool keep_aspect : 1; // keep aspect within obj
Eina_Bool vid_stream : 1; // is this video (has video frames?)
Eina_Bool audio : 1; // is this audio (has audo)
Eina_Bool mono_thumb : 1; // is thumb of mono white alpha img
@ -51,6 +52,7 @@ static void _wakeup(Smart_Data *sd);
static void _image_file_set(Smart_Data *sd);
static void _image_thumb_set(Smart_Data *sd);
static void _image_resized(Smart_Data *sd);
static void _image_update(Smart_Data *sd);
static Eina_Bool _cb_settle_timer(void *data);
static void _cb_image_preload(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED,
@ -227,6 +229,9 @@ _cb_vid_resize(void *data, Evas_Object *obj EINA_UNUSED,
}
else // already playing the file - not new, si resized
evas_object_smart_callback_call(sd->o_smart, "resized", NULL);
_image_resized(sd);
_image_update(sd);
evas_object_smart_changed(sd->o_smart);
}
static void
@ -407,6 +412,9 @@ _cb_image_preload(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
else if (sd->frame_count < 2) sd->animated = EINA_FALSE;
}
if (sd->animated) _handle_frame(sd);
_image_resized(sd);
_image_update(sd);
evas_object_smart_changed(sd->o_smart);
evas_object_show(sd->o_image);
}
@ -493,20 +501,63 @@ _smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
evas_object_smart_changed(obj);
}
static void
_size_get(Smart_Data *sd, int *w, int *h)
{
if ((sd->o_video) && (sd->video_ratio > 0.0))
{
int vid_w, vid_h;
vid_w = ((double)sd->orig_h + 0.5) * sd->video_ratio;
vid_h = sd->orig_h;
if (w) *w = vid_w;
if (h) *h = vid_h;
}
else
{
if (w) *w = sd->orig_w;
if (h) *h = sd->orig_h;
}
}
static void
_smart_calculate(Evas_Object *obj)
{ // recalce position/size
Eina_Rectangle geom;
ENTRY;
geom = sd->geom;
if (sd->keep_aspect)
{
int w, h, nw, nh;
_size_get(sd, &w, &h);
if ((w > 0) && (h > 0))
{
nw = (w * geom.h) / h;
nh = geom.h;
if (nw > geom.w)
{
nh = (h * geom.w) / w;
nw = geom.w;
}
}
else
{
nw = 0;
nh = 0;
}
geom.x = geom.x + ((geom.w - nw) / 2);
geom.y = geom.y + ((geom.h - nh) / 2);
geom.w = nw;
geom.h = nw;
}
if (sd->o_image)
evas_object_geometry_set(sd->o_image, sd->geom.x, sd->geom.y, sd->geom.w,
sd->geom.h);
evas_object_geometry_set(sd->o_image, geom.x, geom.y, geom.w, geom.h);
if (sd->o_image2)
evas_object_geometry_set(sd->o_image2, sd->geom.x, sd->geom.y, sd->geom.w,
sd->geom.h);
evas_object_geometry_set(sd->o_image2, geom.x, geom.y, geom.w, geom.h);
if (sd->o_video)
evas_object_geometry_set(sd->o_video, sd->geom.x, sd->geom.y, sd->geom.w,
sd->geom.h);
evas_object_geometry_set(sd->o_video, geom.x, geom.y, geom.w, geom.h);
_image_update(sd);
}
@ -629,25 +680,22 @@ efm_icon_video_set(Evas_Object *obj, const char *video)
_image_video_set(sd);
}
void
efm_icon_keep_aspect_set(Evas_Object *obj, Eina_Bool keep_aspect)
{
ENTRY;
if (sd->keep_aspect == keep_aspect) return;
sd->keep_aspect = keep_aspect;
_image_resized(sd);
}
void
efm_icon_size_get(Evas_Object *obj, int *w, int *h)
{ // get image pixel size
ENTRY;
if ((sd->o_video) && (sd->video_ratio > 0.0))
{
int vid_w, vid_h;
vid_w = ((double)sd->orig_h + 0.5) * sd->video_ratio;
vid_h = sd->orig_h;
if (w) *w = vid_w;
if (h) *h = vid_h;
}
else
{
if (w) *w = sd->orig_w;
if (h) *h = sd->orig_h;
}
_size_get(sd, w, h);
}
Eina_Bool

View File

@ -8,6 +8,7 @@ void efm_icon_orig_set(Evas_Object *obj, const char *orig);
void efm_icon_file_set(Evas_Object *obj, const char *file);
void efm_icon_thumb_set(Evas_Object *obj, const char *thumb);
void efm_icon_video_set(Evas_Object *obj, const char *video);
void efm_icon_keep_aspect_set(Evas_Object *obj, Eina_Bool keep_aspect);
void efm_icon_size_get(Evas_Object *obj, int *w, int *h);
Eina_Bool efm_icon_alpha_get(Evas_Object *obj);
Eina_Bool efm_icon_mono_get(Evas_Object *obj);

View File

@ -1196,6 +1196,7 @@ _icon_detail_rectangle_add(Icon *icon, Smart_Data *sd, Evas *e, int col,
snprintf(buf, sizeof(buf), "e.text.detail%i", col + 1);
if (detail) edje_object_part_text_set(icon->o_base, buf, detail);
icon->o_list_detail_swallow[col] = o = evas_object_rectangle_add(e);
evas_object_pass_events_set(o, EINA_TRUE);
evas_object_color_set(o, 0, 0, 0, 0);
evas_object_size_hint_min_set
(o, sd->config.detail_min_w[col] * _scale_get(sd), 0);
@ -1232,6 +1233,7 @@ _icon_detail_grid_sub_edje_add(Icon *icon, Evas *e,
if (icon->selected) edje_object_signal_emit(o, "e,state,selected", "e");
else edje_object_signal_emit(o, "e,state,unselected", "e");
elm_grid_pack(icon->o_list_detail_swallow[col], o, 0, 0, 1, 1);
evas_object_pass_events_set(o, EINA_TRUE);
evas_object_show(o);
return o;
}
@ -1249,12 +1251,31 @@ _cb_progress_noval(double v EINA_UNUSED)
return "";
}
static void
_cb_icon_detail_check_changed(void *data, Evas_Object *o,
void *info EINA_UNUSED)
{
Icon *icon = data;
Eina_Strbuf *buf = cmd_strbuf_new("file-detail-change");
const char *state = "false";
char detail[32];
int v;
_icon_path_cmd_strbuf_append(buf, "path", icon->sd, icon);
v = (int)(unsigned long)evas_object_data_get(o, "detail");
snprintf(detail, sizeof(detail), "detail%i", v);
cmd_strbuf_append(buf, "detail", detail);
if (elm_check_state_get(o)) state = "true";
cmd_strbuf_append(buf, "state", state);
cmd_strbuf_exe_consume(buf, icon->sd->exe_open);
}
static void
_icon_detail_add(Icon *icon, Smart_Data *sd, Evas *e,
const char *theme_edj_file, int col, const char *detail,
const char *format)
{
Evas_Object *o;
Evas_Object *o, *o2;
char buf[128];
if (!detail) detail = "";
@ -1285,7 +1306,6 @@ _icon_detail_add(Icon *icon, Smart_Data *sd, Evas *e,
edje_object_part_text_set(o, "e.text.unit", buf);
snprintf(buf, sizeof(buf), "%i", (int)size);
edje_object_part_text_set(o, "e.text.label", buf);
edje_object_message_signal_process(o);
}
free(*plist);
free(plist);
@ -1309,7 +1329,7 @@ _icon_detail_add(Icon *icon, Smart_Data *sd, Evas *e,
eina_strftime("%H:%M:%S", info));
}
else if (!strcmp(format, "checkview"))
{ // format: 1284924 - time_in_seconds_since_epoch
{ // format: true/yes/1 vs false/no/0
o = _icon_detail_grid_add(icon, sd, col);
o = _icon_detail_grid_sub_edje_add(icon, e, theme_edj_file, col,
"e/fileman/default/check");
@ -1324,6 +1344,7 @@ _icon_detail_add(Icon *icon, Smart_Data *sd, Evas *e,
o = _icon_detail_grid_add(icon, sd, col);
o = elm_progressbar_add(o);
evas_object_pass_events_set(o, EINA_TRUE);
elm_progressbar_horizontal_set(o, EINA_TRUE);
elm_progressbar_span_size_set(o, 1);
elm_grid_pack(icon->o_list_detail_swallow[col], o, 0, 0, 1, 1);
@ -1340,6 +1361,67 @@ _icon_detail_add(Icon *icon, Smart_Data *sd, Evas *e,
elm_progressbar_value_set(o, (double)val / (double)max);
evas_object_show(o);
}
else if (!strcmp(format, "circle"))
{
Edje_Message_String msg;
msg.str = (char *)detail;
o = _icon_detail_grid_add(icon, sd, col);
o = _icon_detail_grid_sub_edje_add(icon, e, theme_edj_file, col,
"e/fileman/default/circle");
edje_object_message_send(o, EDJE_MESSAGE_STRING, 1, &msg);
edje_object_message_signal_process(o);
}
else if (!strcmp(format, "icon"))
{ // format: std:clock or /path/x.png or path/x.gif or x.gif
o = _icon_detail_grid_add(icon, sd, col);
if (!strncmp(detail, "std:", 4))
{
o = elm_icon_add(o);
evas_object_pass_events_set(o, EINA_TRUE);
elm_icon_standard_set(o, detail + 4);
elm_grid_pack(icon->o_list_detail_swallow[col], o, 0, 0, 1, 1);
evas_object_show(o);
}
else
{
o = efm_icon_add(o);
efm_icon_keep_aspect_set(o, EINA_TRUE);
evas_object_pass_events_set(o, EINA_TRUE);
if (detail[0] == '/')
efm_icon_file_set(o, detail);
else
{
Eina_Strbuf *strbuf = eina_strbuf_new();
eina_strbuf_append(strbuf, sd->config.path);
eina_strbuf_append(strbuf, detail);
efm_icon_file_set(o, eina_strbuf_string_get(strbuf));
eina_strbuf_free(strbuf);
}
elm_grid_pack(icon->o_list_detail_swallow[col], o, 0, 0, 1, 1);
evas_object_show(o);
}
}
else if (!strcmp(format, "check"))
{ // format: true/yes/1 vs false/no/0
o = _icon_detail_grid_add(icon, sd, col);
// use table to pack check into to force centering and put it in the grid
o2 = elm_table_add(o);
elm_grid_pack(icon->o_list_detail_swallow[col], o2, 0, 0, 1, 1);
o = elm_check_add(o);
elm_object_focus_allow_set(o, EINA_FALSE);
evas_object_data_set(o, "detail", (void *)(unsigned long)(col + 1));
evas_object_propagate_events_set(o, EINA_FALSE);
elm_table_pack(o2, o, 0, 0, 1, 1);
if ((!strcasecmp(detail, "1")) || (!strcasecmp(detail, "on"))
|| (!strcasecmp(detail, "true")) || (!strcasecmp(detail, "yes")))
elm_check_state_set(o, EINA_TRUE);
evas_object_smart_callback_add(o, "changed",
_cb_icon_detail_check_changed, icon);
evas_object_show(o2);
evas_object_show(o);
}
else fprintf(stderr,
"Uknown format for file '%s' column %i format '%s'\n",
icon->info.file, col, format);
@ -1501,6 +1583,7 @@ _icon_object_add(Icon *icon, Smart_Data *sd, Evas *e,
o2, sd->config.detail_min_w[5] * _scale_get(sd), 0);
edje_object_part_swallow(icon->o_base, "e.swallow.detail6", o2);
icon->o_list_detail_swallow2[5] = o2 = edje_object_add(e);
evas_object_pass_events_set(o2, EINA_TRUE);
edje_object_file_set(o2, theme_edj_file,
"e/fileman/default/fileperms");
evas_object_data_set(o2, "is_edje", o2);