From f3cc4b5ebdf42efcdbe25442fc4d562603a32f03 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 25 Jan 2022 20:58:29 +1100 Subject: [PATCH] Support message dialog --- v2/internal/frontend/desktop/linux/dialog.go | 9 ++- v2/internal/frontend/desktop/linux/window.go | 73 ++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/v2/internal/frontend/desktop/linux/dialog.go b/v2/internal/frontend/desktop/linux/dialog.go index 91c9122f7..c0d9158e5 100644 --- a/v2/internal/frontend/desktop/linux/dialog.go +++ b/v2/internal/frontend/desktop/linux/dialog.go @@ -21,6 +21,7 @@ const ( ) var openFileResults = make(chan []string) +var messageDialogResult = make(chan string) func (f *Frontend) OpenFileDialog(dialogOptions frontend.OpenDialogOptions) (result string, err error) { f.mainWindow.OpenFileDialog(dialogOptions, 0, GTK_FILE_CHOOSER_ACTION_OPEN) @@ -64,7 +65,8 @@ func (f *Frontend) SaveFileDialog(dialogOptions frontend.SaveDialogOptions) (str } func (f *Frontend) MessageDialog(dialogOptions frontend.MessageDialogOptions) (string, error) { - panic("implement me") + f.mainWindow.MessageDialog(dialogOptions) + return <-messageDialogResult, nil } //export processOpenFileResult @@ -80,3 +82,8 @@ func processOpenFileResult(carray **C.char) { } openFileResults <- result } + +//export processMessageDialogResult +func processMessageDialogResult(result *C.char) { + messageDialogResult <- C.GoString(result) +} diff --git a/v2/internal/frontend/desktop/linux/window.go b/v2/internal/frontend/desktop/linux/window.go index 817815ee2..f27733f75 100644 --- a/v2/internal/frontend/desktop/linux/window.go +++ b/v2/internal/frontend/desktop/linux/window.go @@ -200,6 +200,59 @@ void ExecuteOnMainThread(void* f, gpointer jscallback) { g_idle_add((GSourceFunc)f, (gpointer)jscallback); } +void extern processMessageDialogResult(char*); + +typedef struct MessageDialogOptions { + void* window; + char* title; + char* message; + int messageType; +} MessageDialogOptions; + +void messageDialog(gpointer data) { + + GtkDialogFlags flags; + GtkMessageType messageType; + MessageDialogOptions *options = (MessageDialogOptions*) data; + if( options->messageType == 0 ) { + messageType = GTK_MESSAGE_INFO; + flags = GTK_BUTTONS_OK; + } else if( options->messageType == 1 ) { + messageType = GTK_MESSAGE_ERROR; + flags = GTK_BUTTONS_OK; + } else if( options->messageType == 2 ) { + messageType = GTK_MESSAGE_QUESTION; + flags = GTK_BUTTONS_YES_NO; + } else { + messageType = GTK_MESSAGE_WARNING; + flags = GTK_BUTTONS_OK; + } + + GtkWidget *dialog; + dialog = gtk_message_dialog_new(GTK_WINDOW(options->window), + GTK_DIALOG_DESTROY_WITH_PARENT, + messageType, + flags, + options->message, NULL); + gtk_window_set_title(GTK_WINDOW(dialog), options->title); + GtkResponseType result = gtk_dialog_run(GTK_DIALOG(dialog)); + if ( result == GTK_RESPONSE_YES ) { + processMessageDialogResult("Yes"); + } else if ( result == GTK_RESPONSE_NO ) { + processMessageDialogResult("No"); + } else if ( result == GTK_RESPONSE_OK ) { + processMessageDialogResult("OK"); + } else if ( result == GTK_RESPONSE_CANCEL ) { + processMessageDialogResult("Cancel"); + } else { + processMessageDialogResult(""); + } + + gtk_widget_destroy(dialog); + free(options->title); + free(options->message); +} + void extern processOpenFileResult(void*); typedef struct OpenFileDialogOptions { @@ -603,3 +656,23 @@ func (w *Window) OpenFileDialog(dialogOptions frontend.OpenDialogOptions, multip C.ExecuteOnMainThread(C.opendialog, C.gpointer(&data)) } + +func (w *Window) MessageDialog(dialogOptions frontend.MessageDialogOptions) { + + data := C.MessageDialogOptions{ + window: w.gtkWindow, + title: C.CString(dialogOptions.Title), + message: C.CString(dialogOptions.Message), + } + switch dialogOptions.Type { + case frontend.InfoDialog: + data.messageType = C.int(0) + case frontend.ErrorDialog: + data.messageType = C.int(1) + case frontend.QuestionDialog: + data.messageType = C.int(2) + case frontend.WarningDialog: + data.messageType = C.int(3) + } + C.ExecuteOnMainThread(C.messageDialog, C.gpointer(&data)) +}