1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-11-03 19:37:16 -05:00

Dont allow unsaved form windows to be closed

This commit is contained in:
James Booth 2014-09-15 22:31:15 +01:00
parent 529b4f175b
commit c5b697dba7
6 changed files with 39 additions and 5 deletions

View File

@ -1,7 +1,5 @@
Split out form management commands from /room to /form command
Autocompelte values for field types on set
Don't allow form windows to be closed without submitting/cancelling
Help command for form fields Help command for form fields
Command to show current form Command to show current form
Handle error on form submit Handle error on form submit
Show field after setting/adding/removing Show field after setting/adding/removing
Autocompelte values for set/add/remove

View File

@ -2490,6 +2490,17 @@ cmd_close(gchar **args, struct cmd_help_t help)
return TRUE; return TRUE;
} }
// check for unsaved form
if (ui_win_has_unsaved_form(index)) {
ProfWin *window = wins_get_current();
if (wins_is_current(window)) {
ui_current_print_line("You have unsaved changes, use /form submit or /form cancel");
} else {
cons_show("Cannot close form window with unsaved changes, use /form submit or /form cancel");
}
return TRUE;
}
// handle leaving rooms, or chat // handle leaving rooms, or chat
if (conn_status == JABBER_CONNECTED) { if (conn_status == JABBER_CONNECTED) {
ui_close_connected_win(index); ui_close_connected_win(index);

View File

@ -632,7 +632,7 @@ _ui_close_all_wins(void)
while (curr != NULL) { while (curr != NULL) {
int num = GPOINTER_TO_INT(curr->data); int num = GPOINTER_TO_INT(curr->data);
if (num != 1) { if ((num != 1) && (!ui_win_has_unsaved_form(num))) {
if (conn_status == JABBER_CONNECTED) { if (conn_status == JABBER_CONNECTED) {
ui_close_connected_win(num); ui_close_connected_win(num);
} }
@ -659,7 +659,7 @@ _ui_close_read_wins(void)
while (curr != NULL) { while (curr != NULL) {
int num = GPOINTER_TO_INT(curr->data); int num = GPOINTER_TO_INT(curr->data);
if ((num != 1) && (ui_win_unread(num) == 0)) { if ((num != 1) && (ui_win_unread(num) == 0) && (!ui_win_has_unsaved_form(num))) {
if (conn_status == JABBER_CONNECTED) { if (conn_status == JABBER_CONNECTED) {
ui_close_connected_win(num); ui_close_connected_win(num);
} }
@ -675,6 +675,20 @@ _ui_close_read_wins(void)
return count; return count;
} }
static gboolean
_ui_win_has_unsaved_form(int num)
{
ProfWin *window = wins_get_by_num(num);
if (window->type != WIN_MUC_CONFIG) {
return FALSE;
}
if (window->form == NULL) {
return FALSE;
}
return window->form->modified;
}
GString * GString *
_get_recipient_string(ProfWin *window) _get_recipient_string(ProfWin *window)
{ {
@ -2295,4 +2309,5 @@ ui_init_module(void)
ui_room_destroyed = _ui_room_destroyed; ui_room_destroyed = _ui_room_destroyed;
ui_handle_room_configuration = _ui_handle_room_configuration; ui_handle_room_configuration = _ui_handle_room_configuration;
ui_handle_room_config_submit_result = _ui_handle_room_config_submit_result; ui_handle_room_config_submit_result = _ui_handle_room_config_submit_result;
ui_win_has_unsaved_form = _ui_win_has_unsaved_form;
} }

View File

@ -201,6 +201,8 @@ void (*ui_create_xmlconsole_win)(void);
gboolean (*ui_xmlconsole_exists)(void); gboolean (*ui_xmlconsole_exists)(void);
void (*ui_open_xmlconsole_win)(void); void (*ui_open_xmlconsole_win)(void);
gboolean (*ui_win_has_unsaved_form)(int num);
// console window actions // console window actions
void (*cons_show)(const char * const msg, ...); void (*cons_show)(const char * const msg, ...);
void (*cons_about)(void); void (*cons_about)(void);

View File

@ -192,6 +192,7 @@ form_create(xmpp_stanza_t * const form_stanza)
form->var_to_tag = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); form->var_to_tag = g_hash_table_new_full(g_str_hash, g_str_equal, free, free);
form->tag_to_var = g_hash_table_new_full(g_str_hash, g_str_equal, free, free); form->tag_to_var = g_hash_table_new_full(g_str_hash, g_str_equal, free, free);
form->tag_ac = autocomplete_new(); form->tag_ac = autocomplete_new();
form->modified = FALSE;
int tag_num = 1; int tag_num = 1;
@ -430,10 +431,12 @@ _form_set_value(DataForm *form, const char * const tag, char *value)
if (g_strcmp0(field->var, var) == 0) { if (g_strcmp0(field->var, var) == 0) {
if (g_slist_length(field->values) == 0) { if (g_slist_length(field->values) == 0) {
field->values = g_slist_append(field->values, strdup(value)); field->values = g_slist_append(field->values, strdup(value));
form->modified = TRUE;
return; return;
} else if (g_slist_length(field->values) == 1) { } else if (g_slist_length(field->values) == 1) {
free(field->values->data); free(field->values->data);
field->values->data = strdup(value); field->values->data = strdup(value);
form->modified = TRUE;
return; return;
} }
} }
@ -452,6 +455,7 @@ _form_add_value(DataForm *form, const char * const tag, char *value)
FormField *field = curr->data; FormField *field = curr->data;
if (g_strcmp0(field->var, var) == 0) { if (g_strcmp0(field->var, var) == 0) {
field->values = g_slist_append(field->values, strdup(value)); field->values = g_slist_append(field->values, strdup(value));
form->modified = TRUE;
return; return;
} }
curr = g_slist_next(curr); curr = g_slist_next(curr);
@ -477,6 +481,7 @@ _form_add_unique_value(DataForm *form, const char * const tag, char *value)
} }
field->values = g_slist_append(field->values, strdup(value)); field->values = g_slist_append(field->values, strdup(value));
form->modified = TRUE;
return TRUE; return TRUE;
} }
curr = g_slist_next(curr); curr = g_slist_next(curr);
@ -500,6 +505,7 @@ _form_remove_value(DataForm *form, const char * const tag, char *value)
free(found->data); free(found->data);
found->data = NULL; found->data = NULL;
field->values = g_slist_delete_link(field->values, found); field->values = g_slist_delete_link(field->values, found);
form->modified = TRUE;
return TRUE; return TRUE;
} else { } else {
return FALSE; return FALSE;
@ -527,6 +533,7 @@ _form_remove_text_multi_value(DataForm *form, const char * const tag, int index)
free(item->data); free(item->data);
item->data = NULL; item->data = NULL;
field->values = g_slist_delete_link(field->values, item); field->values = g_slist_delete_link(field->values, item);
form->modified = TRUE;
return TRUE; return TRUE;
} else { } else {
return FALSE; return FALSE;

View File

@ -125,6 +125,7 @@ typedef struct data_form_t {
GHashTable *var_to_tag; GHashTable *var_to_tag;
GHashTable *tag_to_var; GHashTable *tag_to_var;
Autocomplete tag_ac; Autocomplete tag_ac;
gboolean modified;
} DataForm; } DataForm;
void jabber_init_module(void); void jabber_init_module(void);