better desktop file editor, presents more space in less space!

* use toolbook and segment all information to different pages

 * icon got its own page, with bigger view

 * labels on one line, entries on the next: more consistency, better
   alignment, takes less horizontal space and allows entries to show
   more characters.

 * editing new desktop files (Settings > Apps > New Application) will
   use a dynamically created name based on application name, instead
   of falling back to a numeric based _new_app-%d.desktop.



SVN revision: 46902
This commit is contained in:
Gustavo Sverzut Barbieri 2010-03-06 00:42:09 +00:00
parent bf01f9d9c1
commit 9e35127d35
2 changed files with 327 additions and 162 deletions

View File

@ -23,6 +23,15 @@ struct _E_Config_Dialog_Data
int show_in_menus;
E_Desktop_Edit *editor;
char *orig_path; /* informational only */
Evas_Object *orig_path_entry; /* to set when info changes */
/* speed up check_changed tests */
Eina_Bool changed_categories;
Eina_Bool changed_mimes;
Eina_Bool edited_categories;
Eina_Bool edited_mimes;
};
/* local subsystem functions */
@ -32,9 +41,8 @@ static void _e_desktop_edit_free(E_Desktop_Edit *editor);
static void *_e_desktop_edit_create_data(E_Config_Dialog *cfd);
static void _e_desktop_edit_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *data);
static int _e_desktop_edit_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *data);
static int _e_desktop_edit_advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *data);
static int _e_desktop_edit_basic_check_changed(E_Config_Dialog *cfd, E_Config_Dialog_Data *data);
static Evas_Object *_e_desktop_edit_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *data);
static Evas_Object *_e_desktop_edit_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *data);
static void _e_desktop_editor_cb_icon_select(void *data1, void *data2);
static void _e_desktop_edit_cb_icon_select_destroy(void *obj);
static void _e_desktop_edit_cb_icon_select_ok(void *data, E_Dialog *dia);
@ -208,8 +216,7 @@ _e_desktop_edit_view_create(E_Desktop_Edit *editor, E_Container *con)
v->free_cfdata = _e_desktop_edit_free_data;
v->basic.apply_cfdata = _e_desktop_edit_basic_apply_data;
v->basic.create_widgets = _e_desktop_edit_basic_create_widgets;
v->advanced.apply_cfdata = _e_desktop_edit_advanced_apply_data;
v->advanced.create_widgets = _e_desktop_edit_advanced_create_widgets;
v->basic.check_changed = _e_desktop_edit_basic_check_changed;
editor->cfd =
e_config_dialog_new(con, _("Desktop Entry Editor"), "E",
@ -296,11 +303,12 @@ _e_desktop_edit_create_data(E_Config_Dialog *cfd)
if (!desktop) desktop = cfdata->desktop;
IFDUP(desktop->name, cfdata->name);
IFDUP(desktop->name, cfdata->generic_name);
IFDUP(desktop->generic_name, cfdata->generic_name);
IFDUP(desktop->comment, cfdata->comment);
IFDUP(desktop->exec, cfdata->exec);
IFDUP(desktop->try_exec, cfdata->try_exec);
IFDUP(desktop->startup_wm_class, cfdata->startup_wm_class);
IFDUP(desktop->orig_path, cfdata->orig_path);
if (desktop->categories)
cfdata->categories = efreet_desktop_string_list_join(desktop->categories);
@ -320,7 +328,7 @@ _e_desktop_edit_create_data(E_Config_Dialog *cfd)
* Frees the config dialog data
*/
static void
_e_desktop_edit_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
_e_desktop_edit_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
if (cfdata->editor->tmp_image_path)
{
@ -342,6 +350,7 @@ _e_desktop_edit_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
IFFREE(cfdata->categories);
IFFREE(cfdata->icon);
IFFREE(cfdata->mimes);
IFFREE(cfdata->orig_path);
if (cfdata->editor->icon_fsel_dia)
e_object_del(E_OBJECT(cfdata->editor->icon_fsel_dia));
@ -350,11 +359,73 @@ _e_desktop_edit_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
free(cfdata);
}
static void
_e_desktop_edit_user_local_desktop_filename_generate(E_Config_Dialog_Data *cfdata, char *path)
{
char basename[PATH_MAX];
const char *name;
unsigned int i;
int prefix;
if ((cfdata->name) && (cfdata->name[0]))
name = cfdata->name;
else if ((cfdata->desktop) && (cfdata->desktop->name) &&
(cfdata->desktop->name[0]))
name = cfdata->name;
else
name = NULL;
if (name)
{
const char *s = name;
for (i = 0; i < sizeof(basename) && s[i]; i++)
{
if (isalnum(s[i]))
basename[i] = s[i];
else
basename[i] = '_';
}
basename[i] = '\0';
}
else
eina_strlcpy(basename, "unnamed_desktop", sizeof(basename));
i = snprintf(path, PATH_MAX, "%s/applications/%s.desktop",
efreet_data_home_get(), basename);
if (i >= PATH_MAX)
{
path[0] = '\0';
return;
}
prefix = i - (sizeof(".desktop") - 1);
for (i = 0; ecore_file_exists(path); i++)
snprintf(path + prefix, PATH_MAX - prefix, "-%u.desktop", i);
}
static void
_e_desktop_edit_update_orig_path(E_Config_Dialog_Data *cfdata)
{
const char *orig_path;
char path[PATH_MAX];
if ((cfdata->desktop->orig_path) && (cfdata->desktop->orig_path[0]))
orig_path = cfdata->desktop->orig_path;
else
{
_e_desktop_edit_user_local_desktop_filename_generate(cfdata, path);
orig_path = cfdata->orig_path = strdup(path);
}
if (cfdata->orig_path_entry)
e_widget_entry_text_set(cfdata->orig_path_entry, orig_path);
}
/**
* Apply the basic config dialog
*/
static int
_e_desktop_edit_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
_e_desktop_edit_basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
E_Desktop_Edit *editor;
char *str;
@ -393,155 +464,279 @@ _e_desktop_edit_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfd
cfdata->editor->saved = efreet_desktop_save(cfdata->desktop);
else
{
/* find a suitable name to save the desktop as */
char basename[PATH_MAX];
char path[PATH_MAX];
int i;
if ((cfdata->desktop->name) && (cfdata->desktop->name[0]))
{
const char *s = cfdata->desktop->name;
i = 0;
while (i < sizeof(basename) && s[i])
{
if (isalnum(s[i]))
basename[i] = s[i];
else
basename[i] = '_';
i++;
}
basename[i] = '\0';
}
else
eina_strlcpy(basename, "unnamed_desktop", sizeof(basename));
i = 0;
snprintf(path, sizeof(path), "%s/applications/%s.desktop",
efreet_data_home_get(), basename);
while (ecore_file_exists(path))
{
snprintf(path, sizeof(path), "%s/applications/%s-%d.desktop",
efreet_data_home_get(), basename, i);
i++;
}
cfdata->editor->saved = efreet_desktop_save_as(cfdata->desktop, path);
_e_desktop_edit_update_orig_path(cfdata);
cfdata->editor->saved = efreet_desktop_save_as
(cfdata->desktop, cfdata->orig_path);
}
return 1;
}
/**
* Apply the advanced config dialog
*/
static int
_e_desktop_edit_advanced_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
_e_desktop_edit_basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
{
return _e_desktop_edit_basic_apply_data(cfd, cfdata);
int ret;
if ((cfdata->startup_notify != cfdata->desktop->startup_notify) ||
(cfdata->terminal != cfdata->desktop->terminal) ||
(cfdata->show_in_menus != !cfdata->desktop->no_display))
return 1;
#define CHECK(k) \
do \
{ \
const char *__k; \
if (cfdata->desktop->k) \
__k = cfdata->desktop->k; \
else if ((cfdata->editor) && (cfdata->editor->desktop)) \
__k = cfdata->editor->desktop->k; \
else \
__k = NULL; \
if ((cfdata->k && !__k) || (!cfdata->k && __k) || \
(cfdata->k && __k && strcmp(cfdata->k, __k) != 0)) \
return 1; \
} \
while (0)
CHECK(name);
CHECK(exec);
CHECK(comment);
CHECK(generic_name);
CHECK(try_exec);
CHECK(startup_wm_class);
CHECK(icon);
#undef CHECK
ret = 0;
if (cfdata->edited_categories)
{
const char *str;
Eina_List *lst, *old_lst;
cfdata->edited_categories = EINA_FALSE;
cfdata->changed_categories = EINA_FALSE;
if (cfdata->desktop->categories)
old_lst = cfdata->desktop->categories;
else if ((cfdata->editor) && (cfdata->editor->desktop))
old_lst = cfdata->editor->desktop->categories;
else
old_lst = NULL;
lst = efreet_desktop_string_list_parse(cfdata->categories);
if (eina_list_count(lst) != eina_list_count(old_lst))
cfdata->changed_categories = EINA_TRUE;
EINA_LIST_FREE(lst, str)
{
if (!cfdata->changed_categories)
{
Eina_List *n;
const char *old;
Eina_Bool found = EINA_FALSE;
EINA_LIST_FOREACH(old_lst, n, old)
{
if (strcmp(str, old) == 0)
{
found = EINA_TRUE;
break;
}
}
if (!found)
cfdata->changed_categories = EINA_TRUE;
}
eina_stringshare_del(str);
}
}
ret |= cfdata->changed_categories;
if (!ret)
{
if (cfdata->edited_mimes)
{
const char *str;
Eina_List *lst, *old_lst;
cfdata->edited_mimes = EINA_FALSE;
cfdata->changed_mimes = EINA_FALSE;
if (cfdata->desktop->mime_types)
old_lst = cfdata->desktop->mime_types;
else if ((cfdata->editor) && (cfdata->editor->desktop))
old_lst = cfdata->editor->desktop->mime_types;
else
old_lst = NULL;
lst = efreet_desktop_string_list_parse(cfdata->mimes);
if (eina_list_count(lst) != eina_list_count(old_lst))
cfdata->changed_mimes = EINA_TRUE;
EINA_LIST_FREE(lst, str)
{
if (!cfdata->changed_mimes)
{
Eina_List *n;
const char *old;
Eina_Bool found = EINA_FALSE;
EINA_LIST_FOREACH(old_lst, n, old)
{
if (strcmp(str, old) == 0)
{
found = EINA_TRUE;
break;
}
}
if (!found)
cfdata->changed_mimes = EINA_TRUE;
}
eina_stringshare_del(str);
}
}
ret |= cfdata->changed_mimes;
}
return ret;
}
/**
* Generate the gui for the basic dialog
*/
static Evas_Object *
_e_desktop_edit_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
static void
_e_desktop_editor_name_changed(void *data, Evas_Object *obj __UNUSED__)
{
E_Desktop_Edit *editor;
Evas_Object *ol, *o;
Evas_Object *entry;
E_Config_Dialog_Data *cfdata = data;
_e_desktop_edit_update_orig_path(cfdata);
}
static void
_e_desktop_editor_categories_changed(void *data, Evas_Object *obj __UNUSED__)
{
E_Config_Dialog_Data *cfdata = data;
cfdata->edited_categories = EINA_TRUE;
}
static void
_e_desktop_editor_mimes_changed(void *data, Evas_Object *obj __UNUSED__)
{
E_Config_Dialog_Data *cfdata = data;
cfdata->edited_mimes = EINA_TRUE;
}
static Evas_Object *
_e_desktop_edit_basic_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
{
E_Desktop_Edit *editor = cfdata->editor;
Evas_Object *otb, *ol, *o, *oh;
Evas_Coord mw, mh;
editor = cfdata->editor;
editor->evas = evas;
ol = e_widget_table_add(evas, 0);
otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
o = e_widget_frametable_add(evas, _("Icon"), 0);
editor->img_widget =
e_widget_button_add(evas, "", NULL, _e_desktop_editor_cb_icon_select,
cfdata, editor);
ol = e_widget_list_add(evas, 0, 0);
o = e_widget_label_add(evas, _("Name"));
e_widget_size_min_get(o, &mw, &mh);
if (mw < 220) mw = 220;
e_widget_size_min_set(o, mw, mh);
e_widget_list_object_append(ol, o, 1, 0, 0.0);
o = e_widget_entry_add(evas, &(cfdata->name), NULL, NULL, NULL);
if ((!cfdata->desktop->orig_path) || (!cfdata->desktop->orig_path[0]))
e_widget_on_change_hook_set(o, _e_desktop_editor_name_changed, cfdata);
e_widget_list_object_append(ol, o, 1, 0, 0.0);
o = e_widget_label_add(evas, _("Executable"));
e_widget_list_object_append(ol, o, 1, 0, 0.0);
oh = e_widget_list_add(evas, 0, 1);
editor->entry_widget = e_widget_entry_add
(evas, &(cfdata->exec), NULL, NULL, NULL);
e_widget_list_object_append(oh, editor->entry_widget, 1, 1, 0.5);
o = e_widget_button_add
(evas, "...", NULL, _e_desktop_editor_cb_exec_select, cfdata, editor);
e_widget_list_object_append(oh, o, 0, 0, 0.5);
e_widget_list_object_append(ol, oh, 1, 0, 0.0);
o = e_widget_label_add(evas, _("Comment"));
e_widget_list_object_append(ol, o, 1, 0, 0.0);
o = e_widget_entry_add(evas, &(cfdata->comment), NULL, NULL, NULL);
e_widget_list_object_append(ol, o, 1, 0, 0.0);
e_widget_toolbook_page_append
(otb, NULL, _("Basic"), ol, 1, 0, 1, 0, 0.5, 0.0);
e_widget_size_min_get(ol, &mw, &mh);
editor->img_widget = e_widget_button_add
(evas, "", NULL, _e_desktop_editor_cb_icon_select, cfdata, editor);
_e_desktop_editor_icon_update(cfdata);
e_widget_size_min_set(editor->img_widget, 48, 48);
e_widget_frametable_object_append(o, editor->img_widget,
0, 0, 1, 1, 0, 0, 1, 1);
e_widget_table_object_append(ol, o, 0, 0, 1, 1, 1 ,1, 1, 1);
e_widget_size_min_set(editor->img_widget, 128, 128);
o = e_widget_frametable_add(evas, _("Basic Info"), 0);
e_widget_frametable_object_append(o, e_widget_label_add(evas, _("Name")),
0, 0, 1, 1, 1, 1, 1, 0);
e_widget_toolbook_page_append
(otb, NULL, _("Icon"), editor->img_widget, 0, 0, 0, 0, 0.5, 0.5);
entry = e_widget_entry_add(evas, &(cfdata->name), NULL, NULL, NULL);
e_widget_size_min_set(entry, 100, 1);
e_widget_frametable_object_append(o, entry, 1, 0, 1, 1, 1, 1, 1, 0);
e_widget_frametable_object_append(o, e_widget_label_add(evas, _("Executable")),
0, 1, 1, 1, 1, 1, 1, 0);
editor->entry_widget = e_widget_entry_add(evas, &(cfdata->exec), NULL, NULL, NULL);
e_widget_frametable_object_append(o, editor->entry_widget,
1, 1, 1, 1, 1, 1, 1, 0);
e_widget_frametable_object_append(o, e_widget_button_add(evas, "...", NULL,
_e_desktop_editor_cb_exec_select, cfdata, editor),
2, 1, 1, 1, 1, 1, 0, 0);
e_widget_frametable_object_append(o, e_widget_label_add(evas, _("Comment")),
0, 2, 1, 1, 1, 1, 1, 0);
e_widget_frametable_object_append(o, e_widget_entry_add(evas, &(cfdata->comment), NULL, NULL, NULL),
1, 2, 1, 1, 1, 1, 1, 0);
e_widget_table_object_append(ol, o, 1, 0, 1, 1, 1 ,1, 1, 1);
return ol;
}
/**
* Generate the gui for the advanced dialog
*/
static Evas_Object *
_e_desktop_edit_advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
{
E_Desktop_Edit *editor;
Evas_Object *ol, *o;
Evas_Object *entry;
Evas_Object *fn;
ol = e_widget_list_add(evas, 0, 0);
editor = cfdata->editor;
o = e_widget_label_add(evas, _("Generic Name"));
e_widget_list_object_append(ol, o, 1, 0, 0.0);
ol = _e_desktop_edit_basic_create_widgets(cfd, evas, cfdata);
o = e_widget_entry_add(evas, &(cfdata->generic_name), NULL, NULL, NULL);
e_widget_list_object_append(ol, o, 1, 0, 0.0);
o = e_widget_frametable_add(evas, _("General"), 0);
o = e_widget_label_add(evas, _("Window Class"));
e_widget_list_object_append(ol, o, 1, 0, 0.0);
/*- general info -*/
e_widget_frametable_object_append(o, e_widget_label_add(evas, _("Generic Name")),
0, 0, 1, 1, 1, 1, 0, 1);
entry = e_widget_entry_add(evas, &(cfdata->generic_name), NULL, NULL, NULL);
e_widget_frametable_object_append(o, entry, 1, 0, 2, 1, 1, 1, 1, 1);
o = e_widget_entry_add(evas, &(cfdata->startup_wm_class), NULL, NULL, NULL);
e_widget_list_object_append(ol, o, 1, 0, 0.0);
e_widget_frametable_object_append(o, e_widget_label_add(evas, _("Window Class")),
0, 1, 1, 1, 1, 1, 0, 1);
e_widget_frametable_object_append(o, e_widget_entry_add(evas, &(cfdata->startup_wm_class), NULL, NULL, NULL),
1, 1, 2, 1, 1, 1, 1, 1);
e_widget_frametable_object_append(o, e_widget_label_add(evas, _("Categories")),
0, 2, 1, 1, 1, 1, 0, 1);
e_widget_frametable_object_append(o, e_widget_entry_add(evas, &(cfdata->categories), NULL, NULL, NULL),
1, 2, 2, 1, 1, 1, 1, 1);
e_widget_frametable_object_append(o, e_widget_label_add(evas, _("Mime Types")),
0, 3, 1, 1, 1, 1, 0, 1);
e_widget_frametable_object_append(o, e_widget_entry_add(evas, &(cfdata->mimes), NULL, NULL, NULL),
1, 3, 2, 1, 1, 1, 1, 1);
e_widget_table_object_append(ol, o, 0, 1, 2, 1, 1 ,1, 1, 1);
o = e_widget_label_add(evas, _("Categories"));
e_widget_list_object_append(ol, o, 1, 0, 0.0);
o = e_widget_frametable_add(evas, _("Options"), 0);
e_widget_frametable_object_append(o, e_widget_check_add(evas, _("Startup Notify"), &(cfdata->startup_notify)),
0, 0, 2, 1, 1, 1, 1, 1);
e_widget_frametable_object_append(o, e_widget_check_add(evas, _("Run in Terminal"), &(cfdata->terminal)),
0, 1, 2, 1, 1, 1, 1, 1);
e_widget_frametable_object_append(o, e_widget_check_add(evas, _("Show in Menus"), &(cfdata->show_in_menus)),
0, 2, 2, 1, 1, 1, 1, 1);
e_widget_table_object_append(ol, o, 0, 2, 2, 1, 1 ,1, 1, 1);
o = e_widget_entry_add(evas, &(cfdata->categories), NULL, NULL, NULL);
e_widget_on_change_hook_set(o, _e_desktop_editor_categories_changed, cfdata);
e_widget_list_object_append(ol, o, 1, 0, 0.0);
o = e_widget_frametable_add(evas, _("Desktop file"), 0);
e_widget_frametable_object_append(o, e_widget_label_add(evas, _("Filename")),
0, 0, 1, 1, 0, 0, 0, 0);
fn = e_widget_entry_add(evas, &(cfdata->editor->desktop->orig_path), NULL, NULL, NULL);
e_widget_frametable_object_append(o, fn, 1, 0, 2, 1, 1, 1, 1, 1);
e_widget_disabled_set(fn, 1);
e_widget_table_object_append(ol, o, 0, 3, 2, 1, 1 ,1, 1, 1);
o = e_widget_label_add(evas, _("Mime Types"));
e_widget_list_object_append(ol, o, 1, 0, 0.0);
return ol;
o = e_widget_entry_add(evas, &(cfdata->mimes), NULL, NULL, NULL);
e_widget_on_change_hook_set(o, _e_desktop_editor_mimes_changed, cfdata);
e_widget_list_object_append(ol, o, 1, 0, 0.0);
o = e_widget_label_add(evas, _("Desktop file"));
e_widget_list_object_append(ol, o, 1, 0, 0.0);
o = e_widget_entry_add(evas, NULL, NULL, NULL, NULL);
e_widget_list_object_append(ol, o, 1, 0, 0.0);
e_widget_disabled_set(o, 1);
cfdata->orig_path_entry = o;
_e_desktop_edit_update_orig_path(cfdata);
e_widget_toolbook_page_append
(otb, NULL, _("General"), ol, 1, 0, 1, 0, 0.5, 0.0);
ol = e_widget_list_add(evas, 0, 0);
o = e_widget_check_add(evas, _("Startup Notify"), &(cfdata->startup_notify));
e_widget_list_object_append(ol, o, 1, 0, 0.0);
o = e_widget_check_add(evas, _("Run in Terminal"), &(cfdata->terminal));
e_widget_list_object_append(ol, o, 1, 0, 0.0);
o = e_widget_check_add(evas, _("Show in Menus"), &(cfdata->show_in_menus));
e_widget_list_object_append(ol, o, 1, 0, 0.0);
e_widget_toolbook_page_append
(otb, NULL, _("Options"), ol, 1, 0, 1, 0, 0.5, 0.0);
e_widget_toolbook_page_show(otb, 0);
e_dialog_resizable_set(cfd->dia, 1);
e_util_win_auto_resize_fill(cfd->dia->win);
e_win_centered_set(cfd->dia->win, 1);
return otb;
}
static void

View File

@ -58,37 +58,7 @@ e_int_config_apps_favs(E_Container *con, const char *params __UNUSED__)
E_Config_Dialog *
e_int_config_apps_add(E_Container *con, const char *params __UNUSED__)
{
E_Desktop_Edit *ed;
Efreet_Desktop *de = NULL;
char path[PATH_MAX];
const char *desktop_dir;
desktop_dir = e_user_desktop_dir_get();
if (desktop_dir)
{
int i;
for (i = 1; i < 65536; i++)
{
snprintf(path, sizeof(path), "%s/_new_app-%i.desktop",
desktop_dir, i);
if (!ecore_file_exists(path))
{
de = efreet_desktop_empty_new(path);
break;
}
}
if (!de)
{
snprintf(path, sizeof(path), "%s/_rename_me-%i.desktop",
desktop_dir, (int)ecore_time_get());
de = efreet_desktop_empty_new(NULL);
}
}
else
de = efreet_desktop_empty_new(NULL);
if (!de) return NULL;
ed = e_desktop_edit(con, de);
E_Desktop_Edit *ed = e_desktop_edit(con, NULL);
if (!ed) return NULL;
return ed->cfd;
}