summaryrefslogtreecommitdiff
path: root/src/libaudgui/util.cc
diff options
context:
space:
mode:
authorMateusz Łukasik <mati75@linuxmint.pl>2016-09-27 22:58:23 +0200
committerMateusz Łukasik <mati75@linuxmint.pl>2016-09-27 22:58:23 +0200
commite55b0d8a97d0be6be188d5d13f675da935c039ef (patch)
treece9d7834fc75cd1c072bceff614ef3b1eb39052c /src/libaudgui/util.cc
parentdf5213d83c2bf1abd97568cef5a1a763bc425926 (diff)
parent66d524c01720835a30716cb6861606f95629faea (diff)
fix conflict
Diffstat (limited to 'src/libaudgui/util.cc')
-rw-r--r--src/libaudgui/util.cc80
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)
{