dialog.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // Copyright 2012 The Walk Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. // +build windows
  5. package declarative
  6. import (
  7. "github.com/lxn/walk"
  8. )
  9. type Dialog struct {
  10. AssignTo **walk.Dialog
  11. Name string
  12. Enabled Property
  13. Visible Property
  14. Font Font
  15. MinSize Size
  16. MaxSize Size
  17. ContextMenuItems []MenuItem
  18. OnKeyDown walk.KeyEventHandler
  19. OnKeyPress walk.KeyEventHandler
  20. OnKeyUp walk.KeyEventHandler
  21. OnMouseDown walk.MouseEventHandler
  22. OnMouseMove walk.MouseEventHandler
  23. OnMouseUp walk.MouseEventHandler
  24. OnSizeChanged walk.EventHandler
  25. Title string
  26. Size Size
  27. DataBinder DataBinder
  28. Layout Layout
  29. Children []Widget
  30. DefaultButton **walk.PushButton
  31. CancelButton **walk.PushButton
  32. FixedSize bool
  33. }
  34. func (d Dialog) Create(owner walk.Form) error {
  35. var w *walk.Dialog
  36. var err error
  37. if d.FixedSize {
  38. w, err = walk.NewDialogWithFixedSize(owner)
  39. } else {
  40. w, err = walk.NewDialog(owner)
  41. }
  42. if err != nil {
  43. return err
  44. }
  45. tlwi := topLevelWindowInfo{
  46. Name: d.Name,
  47. Font: d.Font,
  48. ToolTipText: "",
  49. MinSize: d.MinSize,
  50. MaxSize: d.MaxSize,
  51. ContextMenuItems: d.ContextMenuItems,
  52. DataBinder: d.DataBinder,
  53. Layout: d.Layout,
  54. Children: d.Children,
  55. OnKeyDown: d.OnKeyDown,
  56. OnKeyPress: d.OnKeyPress,
  57. OnKeyUp: d.OnKeyUp,
  58. OnMouseDown: d.OnMouseDown,
  59. OnMouseMove: d.OnMouseMove,
  60. OnMouseUp: d.OnMouseUp,
  61. OnSizeChanged: d.OnSizeChanged,
  62. }
  63. var db *walk.DataBinder
  64. if d.DataBinder.AssignTo == nil {
  65. d.DataBinder.AssignTo = &db
  66. }
  67. builder := NewBuilder(nil)
  68. w.SetSuspended(true)
  69. builder.Defer(func() error {
  70. w.SetSuspended(false)
  71. return nil
  72. })
  73. return builder.InitWidget(tlwi, w, func() error {
  74. if err := w.SetTitle(d.Title); err != nil {
  75. return err
  76. }
  77. if err := w.SetSize(d.Size.toW()); err != nil {
  78. return err
  79. }
  80. if d.DefaultButton != nil {
  81. if err := w.SetDefaultButton(*d.DefaultButton); err != nil {
  82. return err
  83. }
  84. if db := *d.DataBinder.AssignTo; db != nil {
  85. if db.DataSource() != nil {
  86. (*d.DefaultButton).SetEnabled(db.CanSubmit())
  87. }
  88. db.CanSubmitChanged().Attach(func() {
  89. (*d.DefaultButton).SetEnabled(db.CanSubmit())
  90. })
  91. }
  92. }
  93. if d.CancelButton != nil {
  94. if err := w.SetCancelButton(*d.CancelButton); err != nil {
  95. return err
  96. }
  97. }
  98. if d.AssignTo != nil {
  99. *d.AssignTo = w
  100. }
  101. return nil
  102. })
  103. }
  104. func (d Dialog) Run(owner walk.Form) (int, error) {
  105. var w *walk.Dialog
  106. if d.AssignTo == nil {
  107. d.AssignTo = &w
  108. }
  109. if err := d.Create(owner); err != nil {
  110. return 0, err
  111. }
  112. return (*d.AssignTo).Run(), nil
  113. }