田中太郎
lxn/walkを使ってGo言語(golang)でメモ帳アプリを作成します
ファイルの開く・保存する機能を追加します
前回の話
前回はメモ帳にメニューバーを追加しました
今回はメニューバーにファイルを開く・保存するする機能を持たせます
ファイルを開く・保存する機能を追加する
完成イメージ
サンプルコード
main.go
package main
import (
"log"
"github.com/lxn/walk"
. "github.com/lxn/walk/declarative"
)
func main() {
app := &MyMainWindow{}
if _, err := (MainWindow{
Title: "NotePad",
MinSize: Size{300, 200},
Layout: VBox{},
Children: []Widget{
TextEdit{
AssignTo: &app.textedit,
Font: Font{PointSize: 14},
},
},
MenuItems: []MenuItem{
Menu{
Text: "ファイル",
Items: []MenuItem{
Action{
Text: "開く",
Shortcut: Shortcut{
Key: walk.KeyO,
Modifiers: walk.ModControl,
},
OnTriggered: app.menuOpen,
},
Separator{},
Action{
Text: "保存",
Shortcut: Shortcut{
Key: walk.KeyS,
Modifiers: walk.ModControl,
},
OnTriggered: app.menuSave,
},
Action{
Text: "名前を付けて保存",
Shortcut: Shortcut{
Key: walk.KeyA,
Modifiers: walk.ModControl,
},
OnTriggered: app.menuSaveAs,
},
},
},
},
}).Run(); err != nil {
log.Fatal(err)
}
}
func.go
package main
import (
"io/ioutil"
"os"
"github.com/lxn/walk"
)
type MyMainWindow struct {
main *walk.MainWindow
textedit *walk.TextEdit
path string
}
// ファイルを開く
func (app *MyMainWindow) menuOpen() {
dlg := new(walk.FileDialog)
dlg.FilePath = app.path
dlg.Title = "ファイルを選択"
dlg.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"
if ok, err := dlg.ShowOpen(nil); err != nil {
_ = walk.MsgBox(nil, "エラー", err.Error(), walk.MsgBoxIconError)
} else if ok {
app.path = dlg.FilePath
if data, err := ioutil.ReadFile(app.path); err == nil {
if err = app.textedit.SetText(string(data)); err != nil {
_ = walk.MsgBox(nil, "エラー", err.Error(), walk.MsgBoxIconError)
}
} else {
_ = walk.MsgBox(nil, "エラー", err.Error(), walk.MsgBoxIconError)
}
}
return
}
// 名前を付けて保存する
func (app *MyMainWindow) menuSaveAs() {
dlg := new(walk.FileDialog)
dlg.FilePath = app.path
dlg.Title = "ファイルを選択"
dlg.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"
if ok, err := dlg.ShowSave(nil); err != nil {
_ = walk.MsgBox(nil, "エラー", err.Error(), walk.MsgBoxIconError)
} else if ok {
app.path = dlg.FilePath
if err := ioutil.WriteFile(app.path, []byte(app.textedit.Text()), 0664); err != nil {
_ = walk.MsgBox(nil, "エラー", err.Error(), walk.MsgBoxIconError)
}
}
return
}
// ファイルが存在するか判定する
func Exists(filename string) bool {
_, err := os.Stat(filename)
return err == nil
}
// 上書き保存(ファイルがないときは名前を付けて保存する)
func (app *MyMainWindow) menuSave() {
// ファイルが存在するかチェック
if val := Exists(app.path); val {
// 上書き保存
if err := ioutil.WriteFile(app.path, []byte(app.textedit.Text()), 0664); err != nil {
_ = walk.MsgBox(nil, "エラー", err.Error(), walk.MsgBoxIconError)
}
} else {
// 名前を付けて保存
app.menuSaveAs()
}
return
}
解説
特になし
まとめ
メニューバーに機能(ファイルを開く・保存する)を追加しました。
コメント