imageviewer.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // Copyright 2010 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. package main
  5. import (
  6. "log"
  7. "path"
  8. "strings"
  9. )
  10. import (
  11. "github.com/lxn/walk"
  12. . "github.com/lxn/walk/declarative"
  13. )
  14. func main() {
  15. mw := new(MyMainWindow)
  16. var openAction *walk.Action
  17. if _, err := (MainWindow{
  18. AssignTo: &mw.MainWindow,
  19. Title: "Walk Image Viewer Example",
  20. MenuItems: []MenuItem{
  21. Menu{
  22. Text: "&File",
  23. Items: []MenuItem{
  24. Action{
  25. AssignTo: &openAction,
  26. Text: "&Open",
  27. Image: "../img/open.png",
  28. OnTriggered: mw.openAction_Triggered,
  29. },
  30. Separator{},
  31. Action{
  32. Text: "Exit",
  33. OnTriggered: func() { mw.Close() },
  34. },
  35. },
  36. },
  37. Menu{
  38. Text: "&Help",
  39. Items: []MenuItem{
  40. Action{
  41. Text: "About",
  42. OnTriggered: mw.aboutAction_Triggered,
  43. },
  44. },
  45. },
  46. },
  47. ToolBarItems: []MenuItem{
  48. ActionRef{&openAction},
  49. },
  50. MinSize: Size{320, 240},
  51. Size: Size{800, 600},
  52. Layout: VBox{MarginsZero: true},
  53. Children: []Widget{
  54. TabWidget{
  55. AssignTo: &mw.tabWidget,
  56. },
  57. },
  58. }.Run()); err != nil {
  59. log.Fatal(err)
  60. }
  61. }
  62. type MyMainWindow struct {
  63. *walk.MainWindow
  64. tabWidget *walk.TabWidget
  65. prevFilePath string
  66. }
  67. func (mw *MyMainWindow) openAction_Triggered() {
  68. if err := mw.openImage(); err != nil {
  69. log.Print(err)
  70. }
  71. }
  72. func (mw *MyMainWindow) openImage() error {
  73. dlg := new(walk.FileDialog)
  74. dlg.FilePath = mw.prevFilePath
  75. dlg.Filter = "Image Files (*.emf;*.bmp;*.exif;*.gif;*.jpeg;*.jpg;*.png;*.tiff)|*.emf;*.bmp;*.exif;*.gif;*.jpeg;*.jpg;*.png;*.tiff"
  76. dlg.Title = "Select an Image"
  77. if ok, err := dlg.ShowOpen(mw); err != nil {
  78. return err
  79. } else if !ok {
  80. return nil
  81. }
  82. mw.prevFilePath = dlg.FilePath
  83. img, err := walk.NewImageFromFile(dlg.FilePath)
  84. if err != nil {
  85. return err
  86. }
  87. var succeeded bool
  88. defer func() {
  89. if !succeeded {
  90. img.Dispose()
  91. }
  92. }()
  93. page, err := walk.NewTabPage()
  94. if err != nil {
  95. return err
  96. }
  97. if page.SetTitle(path.Base(strings.Replace(dlg.FilePath, "\\", "/", -1))); err != nil {
  98. return err
  99. }
  100. page.SetLayout(walk.NewHBoxLayout())
  101. defer func() {
  102. if !succeeded {
  103. page.Dispose()
  104. }
  105. }()
  106. imageView, err := walk.NewImageView(page)
  107. if err != nil {
  108. return err
  109. }
  110. defer func() {
  111. if !succeeded {
  112. imageView.Dispose()
  113. }
  114. }()
  115. if err := imageView.SetImage(img); err != nil {
  116. return err
  117. }
  118. if err := mw.tabWidget.Pages().Add(page); err != nil {
  119. return err
  120. }
  121. if err := mw.tabWidget.SetCurrentIndex(mw.tabWidget.Pages().Len() - 1); err != nil {
  122. return err
  123. }
  124. succeeded = true
  125. return nil
  126. }
  127. func (mw *MyMainWindow) aboutAction_Triggered() {
  128. walk.MsgBox(mw, "About", "Walk Image Viewer Example", walk.MsgBoxIconInformation)
  129. }