func setupPropertyCheckboxes(tv *gtk.TextView, outer *gtk.Box, props []*BoolProperty) { box, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0) for _, prop := range props { chk, _ := gtk.CheckButtonNewWithLabel(prop.Name) // initialize the checkbox with the property's current value chk.SetActive(prop.Get()) p := prop // w/o this all the checkboxes will toggle the last property in props chk.Connect("toggled", func() { p.Set(chk.GetActive()) }) box.PackStart(chk, true, true, 0) } outer.PackStart(box, false, false, 0) }
func createNewWalletDialog() (*gtk.Dialog, error) { dialog, err := gtk.DialogNew() if err != nil { return nil, err } dialog.SetTitle("New wallet") dialog.AddButton("_OK", gtk.RESPONSE_OK) dialog.SetDefaultGeometry(500, 100) grid, err := gtk.GridNew() if err != nil { return nil, err } grid.SetHExpand(true) grid.SetVExpand(true) b, err := dialog.GetContentArea() if err != nil { return nil, err } b.Add(grid) // Because the label will wrap and the final minimum heights // and widths will be absurdly large, first give a size request and // show the grid (allocating space for the requested size). This will // make text wrapping labels size nicely inside the grid. grid.SetSizeRequest(500, 100) grid.Show() l, err := gtk.LabelNew("") if err != nil { return nil, err } l.SetLineWrap(true) l.SetMarkup(newWalletMessage) l.SetAlignment(0, 0) grid.Attach(l, 0, 0, 2, 1) b.SetHExpand(true) b.SetVExpand(true) l, err = gtk.LabelNew("Enter passphrase:") if err != nil { return nil, err } l.SetAlignment(1.0, 0.5) grid.Attach(l, 0, 1, 1, 1) passphrase, err := gtk.EntryNew() if err != nil { return nil, err } passphrase.SetVisibility(false) passphrase.SetHExpand(true) passphrase.Connect("activate", func() { dialog.Emit("response", gtk.RESPONSE_OK, nil) }) grid.Attach(passphrase, 1, 1, 1, 1) l, err = gtk.LabelNew("Confirm passphrase:") if err != nil { return nil, err } l.SetAlignment(1.0, 0.5) grid.Attach(l, 0, 2, 1, 1) repeated, err := gtk.EntryNew() if err != nil { return nil, err } repeated.SetVisibility(false) repeated.SetVAlign(gtk.ALIGN_START) repeated.Connect("activate", func() { dialog.Emit("response", gtk.RESPONSE_OK, nil) }) grid.Attach(repeated, 1, 2, 1, 1) showEntryText, err := gtk.CheckButtonNewWithLabel("Show passphrase") if err != nil { return nil, err } showEntryText.Connect("toggled", func() { active := showEntryText.GetActive() passphrase.SetVisibility(active) repeated.SetVisibility(active) }) grid.Attach(showEntryText, 1, 3, 2, 1) dialog.SetTransientFor(mainWindow) dialog.SetPosition(gtk.WIN_POS_CENTER_ON_PARENT) dialog.ShowAll() dialog.Connect("response", func(_ *glib.Object, rt gtk.ResponseType) { switch rt { case gtk.RESPONSE_OK: pStr, err := passphrase.GetText() if err != nil { log.Print(err) return } rStr, err := repeated.GetText() if err != nil { log.Print(err) return } if len(pStr) == 0 { mDialog := gtk.MessageDialogNew(dialog, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "A passphrase must be entered to create a wallet.") mDialog.SetTitle("Wallet creation failed") mDialog.Run() mDialog.Destroy() return } if pStr == rStr { go func() { triggers.newWallet <- &NewWalletParams{ passphrase: pStr, } if err := <-triggerReplies.walletCreationErr; err != nil { glib.IdleAdd(func() { mDialog := gtk.MessageDialogNew(dialog, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, err.Error()) mDialog.SetTitle("Wallet creation failed") mDialog.Run() mDialog.Destroy() }) } else { glib.IdleAdd(func() { dialog.Destroy() }) } }() } else { msg := "The supplied passphrases do not match." mDialog := gtk.MessageDialogNew(dialog, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, msg) mDialog.SetTitle("Wallet creation failed") mDialog.Run() mDialog.Destroy() } case gtk.RESPONSE_CANCEL: dialog.Destroy() } }) dialog.Connect("delete-event", func() { mDialog := gtk.MessageDialogNew(mainWindow, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, "btcgui cannot be used without a wallet and will now close.") mDialog.Show() mDialog.Run() mDialog.Destroy() gtk.MainQuit() }) return dialog, nil }