diff options
author | Mateusz Łukasik <mati75@linuxmint.pl> | 2016-09-27 22:58:23 +0200 |
---|---|---|
committer | Mateusz Łukasik <mati75@linuxmint.pl> | 2016-09-27 22:58:23 +0200 |
commit | e55b0d8a97d0be6be188d5d13f675da935c039ef (patch) | |
tree | ce9d7834fc75cd1c072bceff614ef3b1eb39052c /src/libaudgui/util.cc | |
parent | df5213d83c2bf1abd97568cef5a1a763bc425926 (diff) | |
parent | 66d524c01720835a30716cb6861606f95629faea (diff) |
fix conflict
Diffstat (limited to 'src/libaudgui/util.cc')
-rw-r--r-- | src/libaudgui/util.cc | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/libaudgui/util.cc b/src/libaudgui/util.cc index 54e1c74..98307e5 100644 --- a/src/libaudgui/util.cc +++ b/src/libaudgui/util.cc @@ -125,6 +125,86 @@ EXPORT GtkWidget * audgui_button_new (const char * text, const char * icon, return button; } +struct FileEntryData { + GtkFileChooserAction action; + String title; +}; + +static void entry_response_cb (GtkWidget * dialog, int response, GtkWidget * entry) +{ + if (response == GTK_RESPONSE_ACCEPT) + { + char * uri = gtk_file_chooser_get_uri ((GtkFileChooser *) dialog); + if (uri) + { + audgui_file_entry_set_uri (entry, uri); + g_free (uri); + } + } + + gtk_widget_destroy (dialog); +} + +static void entry_browse_cb (GtkWidget * entry, GtkEntryIconPosition pos, + GdkEvent * event, const FileEntryData * data) +{ + GtkWidget * dialog = gtk_file_chooser_dialog_new (data->title, nullptr, + data->action, _("Open"), GTK_RESPONSE_ACCEPT, _("Cancel"), + GTK_RESPONSE_REJECT, nullptr); + + gtk_file_chooser_set_local_only ((GtkFileChooser *) dialog, false); + + String uri = audgui_file_entry_get_uri (entry); + if (uri) + gtk_file_chooser_set_uri ((GtkFileChooser *) dialog, uri); + + g_signal_connect (dialog, "response", (GCallback) entry_response_cb, entry); + g_signal_connect_object (entry, "destroy", (GCallback) gtk_widget_destroy, + dialog, G_CONNECT_SWAPPED); + + gtk_widget_show (dialog); +} + +EXPORT GtkWidget * audgui_file_entry_new (GtkFileChooserAction action, const char * title) +{ + GtkWidget * entry = gtk_entry_new (); + + auto data = new FileEntryData {action, String (title)}; + auto destroy_cb = [] (void * data) { delete (FileEntryData *) data; }; + g_object_set_data_full ((GObject *) entry, "file-entry-data", data, destroy_cb); + + gtk_entry_set_icon_from_icon_name ((GtkEntry *) entry, + GTK_ENTRY_ICON_SECONDARY, "document-open"); + g_signal_connect (entry, "icon-press", (GCallback) entry_browse_cb, data); + + return entry; +} + +EXPORT String audgui_file_entry_get_uri (GtkWidget * entry) +{ + const char * text = gtk_entry_get_text ((GtkEntry *) entry); + + if (! text[0]) + return String (); + else if (strstr (text, "://")) + return String (text); + else + return String (filename_to_uri (filename_normalize (filename_expand (str_copy (text))))); +} + +EXPORT void audgui_file_entry_set_uri (GtkWidget * entry, const char * uri) +{ + if (! uri || ! uri[0]) + { + gtk_entry_set_text ((GtkEntry *) entry, ""); + return; + } + + StringBuf path = uri_to_filename (uri, false); + gtk_entry_set_text ((GtkEntry *) entry, path ? filename_contract (std::move (path)) : uri); + gtk_editable_set_position ((GtkEditable *) entry, -1); +} + EXPORT GtkWidget * audgui_dialog_new (GtkMessageType type, const char * title, const char * text, GtkWidget * button1, GtkWidget * button2) { |