summaryrefslogtreecommitdiff
path: root/vendor/0xacab.org/leap/go-dialog/dlgs_linux.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/0xacab.org/leap/go-dialog/dlgs_linux.go')
-rw-r--r--vendor/0xacab.org/leap/go-dialog/dlgs_linux.go122
1 files changed, 122 insertions, 0 deletions
diff --git a/vendor/0xacab.org/leap/go-dialog/dlgs_linux.go b/vendor/0xacab.org/leap/go-dialog/dlgs_linux.go
new file mode 100644
index 0000000..ea8ac3d
--- /dev/null
+++ b/vendor/0xacab.org/leap/go-dialog/dlgs_linux.go
@@ -0,0 +1,122 @@
+package dialog
+
+import (
+ "os"
+ "path/filepath"
+
+ "github.com/gotk3/gotk3/gdk"
+ "github.com/gotk3/gotk3/glib"
+ "github.com/gotk3/gotk3/gtk"
+)
+
+func closeDialog(dlg *gtk.Dialog) {
+ dlg.Destroy()
+}
+
+func (b *MsgBuilder) yesNo() bool {
+ ch := make(chan bool)
+ _, err := glib.IdleAdd(b._yesNo, ch)
+ if err != nil {
+ return false
+ }
+ return <-ch
+}
+
+func (b *MsgBuilder) _yesNo(ch chan bool) bool {
+ dlg := gtk.MessageDialogNew(nil, 0, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, "%s", b.Msg)
+ dlg.SetTitle(firstOf(b.Dlg.Title, "Confirm?"))
+ b.setIcon(dlg)
+ defer closeDialog(&dlg.Dialog)
+ ch <- dlg.Run() == gtk.RESPONSE_YES
+ return false
+}
+
+func (b *MsgBuilder) info() {
+ ch := make(chan bool)
+ glib.IdleAdd(b._info, ch)
+ <-ch
+}
+
+func (b *MsgBuilder) _info(ch chan bool) {
+ dlg := gtk.MessageDialogNew(nil, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, "%s", b.Msg)
+ dlg.SetTitle(firstOf(b.Dlg.Title, "Information"))
+ b.setIcon(dlg)
+ defer closeDialog(&dlg.Dialog)
+ dlg.Run()
+ ch <- true
+}
+
+func (b *MsgBuilder) error() {
+ ch := make(chan bool)
+ glib.IdleAdd(b._info, ch)
+ <-ch
+}
+
+func (b *MsgBuilder) _error() {
+ dlg := gtk.MessageDialogNew(nil, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "%s", b.Msg)
+ dlg.SetTitle(firstOf(b.Dlg.Title, "Error"))
+ b.setIcon(dlg)
+ defer closeDialog(&dlg.Dialog)
+ dlg.Run()
+}
+
+func (b *MsgBuilder) setIcon(dlg *gtk.MessageDialog) {
+ if b.IconPath == "" {
+ return
+ }
+
+ pixbuf, err := gdk.PixbufNewFromFile(b.IconPath)
+ if err != nil {
+ return
+ }
+ dlg.SetIcon(pixbuf)
+}
+
+func (b *FileBuilder) load() (string, error) {
+ return chooseFile("Load", gtk.FILE_CHOOSER_ACTION_OPEN, b)
+}
+
+func (b *FileBuilder) save() (string, error) {
+ f, err := chooseFile("Save", gtk.FILE_CHOOSER_ACTION_SAVE, b)
+ if err != nil {
+ return "", err
+ }
+ _, err = os.Stat(f)
+ if !os.IsNotExist(err) && !Message("%s already exists, overwrite?", filepath.Base(f)).yesNo() {
+ return "", Cancelled
+ }
+ return f, nil
+}
+
+func chooseFile(title string, action gtk.FileChooserAction, b *FileBuilder) (string, error) {
+ dlg, err := gtk.FileChooserDialogNewWith2Buttons(firstOf(b.Dlg.Title, title), nil, action, "Ok", gtk.RESPONSE_ACCEPT, "Cancel", gtk.RESPONSE_CANCEL)
+ if err != nil {
+ return "", err
+ }
+
+ for _, filt := range b.Filters {
+ filter, err := gtk.FileFilterNew()
+ if err != nil {
+ return "", err
+ }
+
+ filter.SetName(filt.Desc)
+ for _, ext := range filt.Extensions {
+ filter.AddPattern("*." + ext)
+ }
+ dlg.AddFilter(filter)
+ }
+ if b.StartDir != "" {
+ dlg.SetCurrentFolder(b.StartDir)
+ }
+ r := dlg.Run()
+ defer closeDialog(&dlg.Dialog)
+ if r == gtk.RESPONSE_ACCEPT {
+ return dlg.GetFilename(), nil
+ }
+ return "", Cancelled
+}
+
+func (b *DirectoryBuilder) browse() (string, error) {
+ return chooseFile("Open Directory", gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, &FileBuilder{Dlg: b.Dlg})
+}