Make dialogs_show_prompt() more flexible to take up to three button/response code pairs to be shown.
Add a close button to the dialog when asking to Re-Save a deleted file (closes #2916954, based on a patch by Dominik Stadler, thanks). git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@4495 ea778897-0a13-0410-b9d1-a72fbfd435f5
This commit is contained in:
parent
d91e7b762b
commit
0be8ea8b8c
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
||||
2009-12-20 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
|
||||
|
||||
* src/dialog.c, src/dialogs.h, src/document.c, src/prefs.c:
|
||||
Make dialogs_show_prompt() more flexible to take up to three
|
||||
button/response code pairs to be shown.
|
||||
Add a close button to the dialog when asking to Re-Save a
|
||||
deleted file
|
||||
(closes #2916954, based on a patch by Dominik Stadler, thanks).
|
||||
|
||||
|
||||
2009-12-20 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
|
||||
|
||||
* src/editor.c:
|
||||
|
@ -1344,30 +1344,38 @@ void dialogs_show_file_properties(GeanyDocument *doc)
|
||||
|
||||
/* extra_text can be NULL; otherwise it is displayed below main_text.
|
||||
* if parent is NULL, main_widgets.window will be used
|
||||
* yes_btn, no_btn, apply_btn can be NULL.
|
||||
* returns GTK_RESPONSE_YES, GTK_RESPONSE_NO, GTK_RESPONSE_APPLY */
|
||||
* btn_1, btn_2, btn_3 can be NULL.
|
||||
* returns response_1, response_2 or response_3 */
|
||||
static gint show_prompt(GtkWidget *parent,
|
||||
const gchar *yes_btn, const gchar *no_btn, const gchar *apply_btn,
|
||||
const gchar *btn_1, GtkResponseType response_1,
|
||||
const gchar *btn_2, GtkResponseType response_2,
|
||||
const gchar *btn_3, GtkResponseType response_3,
|
||||
const gchar *question_text, const gchar *extra_text)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
GtkWidget *dialog;
|
||||
GtkWidget *btn;
|
||||
|
||||
if (!yes_btn)
|
||||
yes_btn = GTK_STOCK_YES;
|
||||
if (!no_btn)
|
||||
no_btn = GTK_STOCK_NO;
|
||||
if (btn_2 == NULL)
|
||||
{
|
||||
btn_2 = GTK_STOCK_NO;
|
||||
response_2 = GTK_RESPONSE_NO;
|
||||
}
|
||||
if (btn_3 == NULL)
|
||||
{
|
||||
btn_3 = GTK_STOCK_YES;
|
||||
response_3 = GTK_RESPONSE_YES;
|
||||
}
|
||||
|
||||
#ifdef G_OS_WIN32
|
||||
/* our native dialog code doesn't support custom buttons */
|
||||
if (yes_btn == GTK_STOCK_YES && no_btn == GTK_STOCK_NO && !apply_btn)
|
||||
if (btn_3 == GTK_STOCK_YES && btn_2 == GTK_STOCK_NO && btn_1 == NULL)
|
||||
{
|
||||
gchar *string = (extra_text == NULL) ? g_strdup(question_text) :
|
||||
g_strconcat(question_text, "\n\n", extra_text, NULL);
|
||||
|
||||
ret = win32_message_dialog(parent, GTK_MESSAGE_QUESTION, string);
|
||||
ret = ret ? GTK_RESPONSE_YES : GTK_RESPONSE_NO;
|
||||
ret = ret ? response_3 : response_2;
|
||||
g_free(string);
|
||||
return ret;
|
||||
}
|
||||
@ -1392,21 +1400,21 @@ static gint show_prompt(GtkWidget *parent,
|
||||
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
|
||||
"%s", extra_text);
|
||||
|
||||
if (apply_btn)
|
||||
gtk_dialog_add_button(GTK_DIALOG(dialog), apply_btn, GTK_RESPONSE_APPLY);
|
||||
if (btn_1 != NULL)
|
||||
gtk_dialog_add_button(GTK_DIALOG(dialog), btn_1, response_1);
|
||||
|
||||
/* For a cancel button, use cancel response so user can press escape to cancel */
|
||||
btn = gtk_dialog_add_button(GTK_DIALOG(dialog), no_btn,
|
||||
utils_str_equal(no_btn, GTK_STOCK_CANCEL) ? GTK_RESPONSE_CANCEL : GTK_RESPONSE_NO);
|
||||
btn = gtk_dialog_add_button(GTK_DIALOG(dialog), btn_2,
|
||||
utils_str_equal(btn_2, GTK_STOCK_CANCEL) ? GTK_RESPONSE_CANCEL : response_2);
|
||||
/* we don't want a default, but we need to override the apply button as default */
|
||||
gtk_widget_grab_default(btn);
|
||||
gtk_dialog_add_button(GTK_DIALOG(dialog), yes_btn, GTK_RESPONSE_YES);
|
||||
gtk_dialog_add_button(GTK_DIALOG(dialog), btn_3, response_3);
|
||||
|
||||
ret = gtk_dialog_run(GTK_DIALOG(dialog));
|
||||
gtk_widget_destroy(dialog);
|
||||
|
||||
if (ret == GTK_RESPONSE_CANCEL)
|
||||
ret = GTK_RESPONSE_NO;
|
||||
ret = response_2;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1430,7 +1438,11 @@ gboolean dialogs_show_question(const gchar *text, ...)
|
||||
va_start(args, text);
|
||||
g_vsnprintf(string, 511, text, args);
|
||||
va_end(args);
|
||||
return show_prompt(parent, GTK_STOCK_YES, GTK_STOCK_NO, NULL, string, NULL) == GTK_RESPONSE_YES;
|
||||
return show_prompt(parent,
|
||||
NULL, GTK_RESPONSE_NONE,
|
||||
GTK_STOCK_NO, GTK_RESPONSE_NO,
|
||||
GTK_STOCK_YES, GTK_RESPONSE_YES,
|
||||
string, NULL) == GTK_RESPONSE_YES;
|
||||
}
|
||||
|
||||
|
||||
@ -1446,16 +1458,22 @@ gboolean dialogs_show_question_full(GtkWidget *parent, const gchar *yes_btn, con
|
||||
va_start(args, main_text);
|
||||
g_vsnprintf(string, 511, main_text, args);
|
||||
va_end(args);
|
||||
return show_prompt(parent, yes_btn, no_btn, NULL, string, extra_text) == GTK_RESPONSE_YES;
|
||||
return show_prompt(parent,
|
||||
NULL, GTK_RESPONSE_NONE,
|
||||
no_btn, GTK_RESPONSE_NO,
|
||||
yes_btn, GTK_RESPONSE_YES,
|
||||
string, extra_text) == GTK_RESPONSE_YES;
|
||||
}
|
||||
|
||||
|
||||
/* extra_text can be NULL; otherwise it is displayed below main_text.
|
||||
* if parent is NULL, main_widgets.window will be used
|
||||
* yes_btn, no_btn, apply_btn can be NULL.
|
||||
* returns GTK_RESPONSE_YES, GTK_RESPONSE_NO, GTK_RESPONSE_APPLY */
|
||||
* btn_1, btn_2, btn_3 can be NULL.
|
||||
* returns response_1, response_2 or response_3 */
|
||||
gint dialogs_show_prompt(GtkWidget *parent,
|
||||
const gchar *yes_btn, const gchar *no_btn, const gchar *apply_btn,
|
||||
const gchar *btn_1, GtkResponseType response_1,
|
||||
const gchar *btn_2, GtkResponseType response_2,
|
||||
const gchar *btn_3, GtkResponseType response_3,
|
||||
const gchar *extra_text, const gchar *main_text, ...)
|
||||
{
|
||||
gchar string[512];
|
||||
@ -1464,7 +1482,8 @@ gint dialogs_show_prompt(GtkWidget *parent,
|
||||
va_start(args, main_text);
|
||||
g_vsnprintf(string, 511, main_text, args);
|
||||
va_end(args);
|
||||
return show_prompt(parent, yes_btn, no_btn, apply_btn, string, extra_text);
|
||||
return show_prompt(parent, btn_1, response_1, btn_2, response_2, btn_3, response_3,
|
||||
string, extra_text);
|
||||
}
|
||||
|
||||
|
||||
|
@ -59,8 +59,10 @@ gboolean dialogs_show_question_full(GtkWidget *parent, const gchar *yes_btn, con
|
||||
const gchar *extra_text, const gchar *main_text, ...) G_GNUC_PRINTF (5, 6);
|
||||
|
||||
gint dialogs_show_prompt(GtkWidget *parent,
|
||||
const gchar *yes_btn, const gchar *no_btn, const gchar *apply_btn,
|
||||
const gchar *extra_text, const gchar *main_text, ...) G_GNUC_PRINTF (6, 7);
|
||||
const gchar *btn_1, GtkResponseType response_1,
|
||||
const gchar *btn_2, GtkResponseType response_2,
|
||||
const gchar *btn_3, GtkResponseType response_3,
|
||||
const gchar *extra_text, const gchar *main_text, ...) G_GNUC_PRINTF (9, 10);
|
||||
|
||||
void dialogs_show_msgbox(GtkMessageType type, const gchar *text, ...) G_GNUC_PRINTF (2, 3);
|
||||
|
||||
|
@ -2946,19 +2946,29 @@ static gboolean monitor_reload_file(GeanyDocument *doc)
|
||||
static gboolean monitor_resave_missing_file(GeanyDocument *doc)
|
||||
{
|
||||
gboolean want_reload = FALSE;
|
||||
gint ret;
|
||||
|
||||
/* file is missing - set unsaved state */
|
||||
document_set_text_changed(doc, TRUE);
|
||||
/* don't prompt more than once */
|
||||
setptr(doc->real_path, NULL);
|
||||
|
||||
if (dialogs_show_question_full(NULL, GTK_STOCK_SAVE, GTK_STOCK_CANCEL,
|
||||
ret = dialogs_show_prompt(NULL,
|
||||
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
|
||||
_("Try to resave the file?"),
|
||||
_("File \"%s\" was not found on disk!"), doc->file_name))
|
||||
_("File \"%s\" was not found on disk!"), doc->file_name);
|
||||
if (ret == GTK_RESPONSE_ACCEPT)
|
||||
{
|
||||
dialogs_show_save_as();
|
||||
want_reload = TRUE;
|
||||
}
|
||||
else if (ret == GTK_RESPONSE_CLOSE)
|
||||
{
|
||||
document_close(doc);
|
||||
}
|
||||
|
||||
return want_reload;
|
||||
}
|
||||
|
||||
|
@ -1370,7 +1370,9 @@ static gboolean kb_find_duplicate(GeanyKeyBinding *search_kb,
|
||||
{
|
||||
gchar *label = keybindings_get_label(kb);
|
||||
gint ret = dialogs_show_prompt(main_widgets.window,
|
||||
_("_Override"), GTK_STOCK_CANCEL, _("_Allow"),
|
||||
_("_Allow"), GTK_RESPONSE_APPLY,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_NO,
|
||||
_("_Override"), GTK_RESPONSE_YES,
|
||||
_("Override that keybinding?"),
|
||||
_("The combination '%s' is already used for \"%s\"."),
|
||||
action, label);
|
||||
|
Loading…
x
Reference in New Issue
Block a user