Go言語|walkでメモ帳を作る~ファイルを開く・保存する~

Go
田中太郎
田中太郎

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
}

解説

特になし

まとめ

メニューバーに機能(ファイルを開く・保存する)を追加しました。

コメント

タイトルとURLをコピーしました