[geany/geany] c04fd6: Add support for user-defined labels for custom commands
Colomban Wendling
git-noreply at xxxxx
Thu Jul 26 00:04:22 UTC 2012
Branch: refs/heads/document-messages
Author: Colomban Wendling <ban at herbesfolles.org>
Committer: Colomban Wendling <ban at herbesfolles.org>
Date: Mon, 14 May 2012 20:22:29
Commit: c04fd65a8fe5812735768fec6fb5990ecbac589e
https://github.com/geany/geany/commit/c04fd65a8fe5812735768fec6fb5990ecbac589e
Log Message:
-----------
Add support for user-defined labels for custom commands
This allows the user to define a label to be displayed in the menu in
place of the command to be run. This can be very useful if e.g. a
custom command is too complex to be easily read in the menu, or if two
custom commands are so similar could be confounded.
Modified Paths:
--------------
src/keyfile.c
src/main.c
src/tools.c
src/ui_utils.h
Modified: src/keyfile.c
30 files changed, 30 insertions(+), 0 deletions(-)
===================================================================
@@ -567,6 +567,8 @@ static void save_ui_prefs(GKeyFile *config)
{
g_key_file_set_string_list(config, PACKAGE, "custom_commands",
(const gchar**) ui_prefs.custom_commands, g_strv_length(ui_prefs.custom_commands));
+ g_key_file_set_string_list(config, PACKAGE, "custom_commands_labels",
+ (const gchar**) ui_prefs.custom_commands_labels, g_strv_length(ui_prefs.custom_commands_labels));
}
}
@@ -915,6 +917,34 @@ static void load_ui_prefs(GKeyFile *config)
ui_prefs.fullscreen = utils_get_setting_boolean(config, PACKAGE, "fullscreen", FALSE);
ui_prefs.custom_date_format = utils_get_setting_string(config, PACKAGE, "custom_date_format", "");
ui_prefs.custom_commands = g_key_file_get_string_list(config, PACKAGE, "custom_commands", NULL, NULL);
+ ui_prefs.custom_commands_labels = g_key_file_get_string_list(config, PACKAGE, "custom_commands_labels", NULL, NULL);
+
+ /* sanitize custom commands labels */
+ if (ui_prefs.custom_commands || ui_prefs.custom_commands_labels)
+ {
+ guint i;
+ guint cc_len = ui_prefs.custom_commands ? g_strv_length(ui_prefs.custom_commands) : 0;
+ guint cc_labels_len = ui_prefs.custom_commands_labels ? g_strv_length(ui_prefs.custom_commands_labels) : 0;
+
+ /* not enough items, resize and fill */
+ if (cc_labels_len < cc_len)
+ {
+ ui_prefs.custom_commands_labels = g_realloc(ui_prefs.custom_commands_labels,
+ (cc_len + 1) * sizeof *ui_prefs.custom_commands_labels);
+ for (i = cc_labels_len; i < cc_len; i++)
+ ui_prefs.custom_commands_labels[i] = g_strdup("");
+ ui_prefs.custom_commands_labels[cc_len] = NULL;
+ }
+ /* too many items, cut off */
+ else if (cc_labels_len > cc_len)
+ {
+ for (i = cc_len; i < cc_labels_len; i++)
+ {
+ g_free(ui_prefs.custom_commands_labels[i]);
+ ui_prefs.custom_commands_labels[i] = NULL;
+ }
+ }
+ }
scribble_text = utils_get_setting_string(config, PACKAGE, "scribble_text",
_("Type here what you want, use it as a notice/scratch board"));
Modified: src/main.c
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -1221,6 +1221,7 @@ void main_quit()
g_free(printing_prefs.external_print_cmd);
g_free(printing_prefs.page_header_datefmt);
g_strfreev(ui_prefs.custom_commands);
+ g_strfreev(ui_prefs.custom_commands_labels);
queue_free(ui_prefs.recent_queue);
queue_free(ui_prefs.recent_projects_queue);
Modified: src/tools.c
89 files changed, 66 insertions(+), 23 deletions(-)
===================================================================
@@ -57,6 +57,7 @@ enum
CC_COLUMN_STATUS,
CC_COLUMN_TOOLTIP,
CC_COLUMN_CMD,
+ CC_COLUMN_LABEL,
CC_COLUMN_COUNT
};
@@ -123,14 +124,19 @@ static void cc_dialog_update_row_status(GtkListStore *store, GtkTreeIter *iter,
static void cc_dialog_add_command(struct cc_dialog *cc, gint idx, gboolean start_editing)
{
GtkTreeIter iter;
- const gchar *cmd;
+ const gchar *cmd = NULL;
+ const gchar *label = NULL;
guint id = cc->count;
- cmd = (idx >= 0) ? ui_prefs.custom_commands[idx] : NULL;
+ if (idx >= 0)
+ {
+ cmd = ui_prefs.custom_commands[idx];
+ label = ui_prefs.custom_commands_labels[idx];
+ }
cc->count++;
gtk_list_store_append(cc->store, &iter);
- gtk_list_store_set(cc->store, &iter, CC_COLUMN_ID, id, CC_COLUMN_CMD, cmd, -1);
+ gtk_list_store_set(cc->store, &iter, CC_COLUMN_ID, id, CC_COLUMN_CMD, cmd, CC_COLUMN_LABEL, label, -1);
cc_dialog_update_row_status(cc->store, &iter, cmd);
if (start_editing)
@@ -412,6 +418,16 @@ static void cc_dialog_on_command_edited(GtkCellRendererText *renderer, gchar *pa
}
+static void cc_dialog_on_label_edited(GtkCellRendererText *renderer, gchar *path, gchar *text,
+ struct cc_dialog *cc)
+{
+ GtkTreeIter iter;
+
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(cc->store), &iter, path);
+ gtk_list_store_set(cc->store, &iter, CC_COLUMN_LABEL, text, -1);
+}
+
+
/* re-compute IDs to reflect the current store state */
static void cc_dialog_update_ids(struct cc_dialog *cc)
{
@@ -510,7 +526,7 @@ static void cc_show_dialog_custom_commands(void)
cc.count = 1;
cc.store = gtk_list_store_new(CC_COLUMN_COUNT, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING,
- G_TYPE_STRING);
+ G_TYPE_STRING, G_TYPE_STRING);
cc.view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(cc.store));
gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(cc.view), CC_COLUMN_TOOLTIP);
gtk_tree_view_set_reorderable(GTK_TREE_VIEW(cc.view), TRUE);
@@ -520,8 +536,7 @@ static void cc_show_dialog_custom_commands(void)
column = gtk_tree_view_column_new_with_attributes(_("ID"), renderer, "text", CC_COLUMN_ID, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(cc.view), column);
/* command column, holding status and command display */
- column = gtk_tree_view_column_new();
- gtk_tree_view_column_set_title(column, _("Command"));
+ column = g_object_new(GTK_TYPE_TREE_VIEW_COLUMN, "title", _("Command"), "expand", TRUE, "resizable", TRUE, NULL);
renderer = gtk_cell_renderer_pixbuf_new();
gtk_tree_view_column_pack_start(column, renderer, FALSE);
gtk_tree_view_column_set_attributes(column, renderer, "stock-id", CC_COLUMN_STATUS, NULL);
@@ -532,6 +547,13 @@ static void cc_show_dialog_custom_commands(void)
gtk_tree_view_column_set_attributes(column, renderer, "text", CC_COLUMN_CMD, NULL);
cc.edit_column = column;
gtk_tree_view_append_column(GTK_TREE_VIEW(cc.view), column);
+ /* label column */
+ renderer = gtk_cell_renderer_text_new();
+ g_object_set(renderer, "editable", TRUE, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+ g_signal_connect(renderer, "edited", G_CALLBACK(cc_dialog_on_label_edited), &cc);
+ column = gtk_tree_view_column_new_with_attributes(_("Label"), renderer, "text", CC_COLUMN_LABEL, NULL);
+ g_object_set(column, "expand", TRUE, "resizable", TRUE, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(cc.view), column);
scroll = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC,
@@ -591,9 +613,11 @@ static void cc_show_dialog_custom_commands(void)
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
{
- GSList *result_list = NULL;
+ GSList *cmd_list = NULL;
+ GSList *lbl_list = NULL;
gint len = 0;
- gchar **result = NULL;
+ gchar **commands = NULL;
+ gchar **labels = NULL;
GtkTreeIter iter;
if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(cc.store), &iter))
@@ -601,40 +625,54 @@ static void cc_show_dialog_custom_commands(void)
do
{
gchar *cmd;
+ gchar *lbl;
- gtk_tree_model_get(GTK_TREE_MODEL(cc.store), &iter, CC_COLUMN_CMD, &cmd, -1);
+ gtk_tree_model_get(GTK_TREE_MODEL(cc.store), &iter, CC_COLUMN_CMD, &cmd, CC_COLUMN_LABEL, &lbl, -1);
if (NZV(cmd))
{
- result_list = g_slist_prepend(result_list, cmd);
+ cmd_list = g_slist_prepend(cmd_list, cmd);
+ lbl_list = g_slist_prepend(lbl_list, lbl);
len++;
}
else
+ {
g_free(cmd);
+ g_free(lbl);
+ }
}
while (gtk_tree_model_iter_next(GTK_TREE_MODEL(cc.store), &iter));
}
- result_list = g_slist_reverse(result_list);
+ cmd_list = g_slist_reverse(cmd_list);
+ lbl_list = g_slist_reverse(lbl_list);
/* create a new null-terminated array but only if there is any commands defined */
if (len > 0)
{
gint j = 0;
- GSList *node;
+ GSList *cmd_node, *lbl_node;
- result = g_new(gchar*, len + 1);
- foreach_list(node, result_list)
+ commands = g_new(gchar*, len + 1);
+ labels = g_new(gchar*, len + 1);
+ /* walk commands and labels lists */
+ for (cmd_node = cmd_list, lbl_node = lbl_list; cmd_node != NULL; cmd_node = cmd_node->next, lbl_node = lbl_node->next)
{
- result[j] = (gchar*) node->data;
+ commands[j] = (gchar*) cmd_node->data;
+ labels[j] = (gchar*) lbl_node->data;
j++;
}
- result[j] = NULL; /* null-terminate the array */
+ /* null-terminate the arrays */
+ commands[j] = NULL;
+ labels[j] = NULL;
}
- /* set the new array */
+ /* set the new arrays */
g_strfreev(ui_prefs.custom_commands);
- ui_prefs.custom_commands = result;
+ ui_prefs.custom_commands = commands;
+ g_strfreev(ui_prefs.custom_commands_labels);
+ ui_prefs.custom_commands_labels = labels;
/* rebuild the menu items */
tools_create_insert_custom_command_menu_items();
- g_slist_free(result_list);
+ g_slist_free(cmd_list);
+ g_slist_free(lbl_list);
}
gtk_widget_destroy(dialog);
}
@@ -662,7 +700,7 @@ static void cc_on_custom_command_activate(GtkMenuItem *menuitem, gpointer user_d
}
-static void cc_insert_custom_command_items(GtkMenu *me, gchar *label, gint idx)
+static void cc_insert_custom_command_items(GtkMenu *me, const gchar *label, const gchar *tooltip, gint idx)
{
GtkWidget *item;
gint key_idx = -1;
@@ -676,6 +714,7 @@ static void cc_insert_custom_command_items(GtkMenu *me, gchar *label, gint idx)
}
item = gtk_menu_item_new_with_label(label);
+ gtk_widget_set_tooltip_text(item, tooltip);
if (key_idx != -1)
{
kb = keybindings_lookup_item(GEANY_KEY_GROUP_FORMAT, key_idx);
@@ -715,9 +754,13 @@ void tools_create_insert_custom_command_menu_items(void)
len = g_strv_length(ui_prefs.custom_commands);
for (i = 0; i < len; i++)
{
- if (ui_prefs.custom_commands[i][0] != '\0') /* skip empty fields */
+ const gchar *label = ui_prefs.custom_commands_labels[i];
+
+ if (! NZV(label))
+ label = ui_prefs.custom_commands[i];
+ if (NZV(label)) /* skip empty items */
{
- cc_insert_custom_command_items(menu_edit, ui_prefs.custom_commands[i], idx);
+ cc_insert_custom_command_items(menu_edit, label, ui_prefs.custom_commands[i], idx);
idx++;
}
}
@@ -728,7 +771,7 @@ void tools_create_insert_custom_command_menu_items(void)
gtk_container_add(GTK_CONTAINER(menu_edit), item);
gtk_widget_show(item);
- cc_insert_custom_command_items(menu_edit, _("Set Custom Commands"), -1);
+ cc_insert_custom_command_items(menu_edit, _("Set Custom Commands"), NULL, -1);
}
Modified: src/ui_utils.h
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -110,6 +110,7 @@
GQueue *recent_projects_queue;
gchar *custom_date_format;
gchar **custom_commands;
+ gchar **custom_commands_labels;
}
UIPrefs;
@@ Diff output truncated at 100000 characters. @@
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: TBD).
More information about the Commits
mailing list