Skip to content

Commit 9316314

Browse files
committed
Initial Commit
0 parents  commit 9316314

File tree

8 files changed

+999
-0
lines changed

8 files changed

+999
-0
lines changed

.gitignore

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Binaries for programs and plugins
2+
*.exe
3+
*.exe~
4+
*.dll
5+
*.so
6+
*.dylib
7+
8+
# Test binary, built with `go test -c`
9+
*.test
10+
11+
# Output of the go coverage tool, specifically when used with LiteIDE
12+
*.out
13+
14+
# Dependency directories (remove the comment below to include it)
15+
# vendor/
16+
17+
.idea

Makefile

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
BINARY_NAME=MarkDown.exe
2+
APP_NAME=MarkDown
3+
VERSION=1.0.0
4+
5+
## build: build binary and package app
6+
build:
7+
rm -rf ${BINARY_NAME}
8+
rm -f fyne-md
9+
fyne package -appVersion ${VERSION} -name ${APP_NAME} --appID MarkDown1.0 -release
10+
11+
## run: builds and runs the application
12+
run:
13+
go run .
14+
15+
## clean: runs go clean and deletes binaries
16+
clean:
17+
@echo "Cleaning..."
18+
@go clean
19+
@rm -rf ${BINARY_NAME}
20+
@echo "Cleaned!"
21+
22+
## test: runs all tests
23+
test:
24+
go test -v ./...

go.mod

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
module fynemd
2+
3+
go 1.19
4+
5+
require fyne.io/fyne/v2 v2.3.0
6+
7+
require (
8+
fyne.io/systray v1.10.1-0.20221115204952-d16a6177e6f1 // indirect
9+
github.com/benoitkugler/textlayout v0.3.0 // indirect
10+
github.com/davecgh/go-spew v1.1.1 // indirect
11+
github.com/fredbi/uri v0.1.0 // indirect
12+
github.com/fsnotify/fsnotify v1.5.4 // indirect
13+
github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect
14+
github.com/fyne-io/glfw-js v0.0.0-20220120001248-ee7290d23504 // indirect
15+
github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 // indirect
16+
github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
17+
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20221017161538-93cebf72946b // indirect
18+
github.com/go-text/typesetting v0.0.0-20221212183139-1eb938670a1f // indirect
19+
github.com/godbus/dbus/v5 v5.1.0 // indirect
20+
github.com/goki/freetype v0.0.0-20220119013949-7a161fd3728c // indirect
21+
github.com/gopherjs/gopherjs v1.17.2 // indirect
22+
github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect
23+
github.com/pmezard/go-difflib v1.0.0 // indirect
24+
github.com/srwiley/oksvg v0.0.0-20220731023508-a61f04f16b76 // indirect
25+
github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780 // indirect
26+
github.com/stretchr/testify v1.8.0 // indirect
27+
github.com/tevino/abool v1.2.0 // indirect
28+
github.com/yuin/goldmark v1.4.0 // indirect
29+
golang.org/x/image v0.0.0-20220601225756-64ec528b34cd // indirect
30+
golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee // indirect
31+
golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4 // indirect
32+
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
33+
golang.org/x/text v0.3.7 // indirect
34+
gopkg.in/yaml.v3 v3.0.1 // indirect
35+
honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect
36+
)

go.sum

Lines changed: 667 additions & 0 deletions
Large diffs are not rendered by default.

icon.png

15.5 KB
Loading

main.go

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
package main
2+
3+
import (
4+
"fyne.io/fyne/v2"
5+
"fyne.io/fyne/v2/app"
6+
"fyne.io/fyne/v2/container"
7+
"fyne.io/fyne/v2/dialog"
8+
"fyne.io/fyne/v2/storage"
9+
"fyne.io/fyne/v2/widget"
10+
"io/ioutil"
11+
"strings"
12+
)
13+
14+
type config struct {
15+
EditWidget *widget.Entry
16+
PreviewWidget *widget.RichText
17+
CurrentFile fyne.URI
18+
SaveMenuItem *fyne.MenuItem
19+
}
20+
21+
var cfg config
22+
23+
func main() {
24+
// create a fyne app
25+
a := app.New()
26+
27+
// use custom theme
28+
a.Settings().SetTheme(&myTheme{})
29+
30+
// create a window for the app
31+
win := a.NewWindow("Markdown")
32+
33+
// get the user interface
34+
edit, preview := cfg.makeUI()
35+
cfg.createMenuItems(win)
36+
37+
// set the content of the window
38+
win.SetContent(container.NewHSplit(edit, preview))
39+
40+
// show window and run app
41+
win.Resize(fyne.Size{Width: 800, Height: 500})
42+
win.CenterOnScreen()
43+
win.ShowAndRun()
44+
}
45+
46+
// makeUI will create the user interface with the entry and rich text widgets
47+
func (app *config) makeUI() (*widget.Entry, *widget.RichText) {
48+
// add a new multi line input widget
49+
edit := widget.NewMultiLineEntry()
50+
51+
// create a preview pane that allows for Rich Text generated by Markdown
52+
preview := widget.NewRichTextFromMarkdown("")
53+
54+
app.EditWidget = edit
55+
app.PreviewWidget = preview
56+
57+
// when editing with Markdown in the Edit window, automatically show the output in the Preview pane as Rich Text
58+
edit.OnChanged = preview.ParseMarkdown
59+
60+
return edit, preview
61+
}
62+
63+
// createMenuItems will create the dropdown menus
64+
func (app *config) createMenuItems(win fyne.Window) {
65+
openMenuItem := fyne.NewMenuItem("Open...", app.openFunc(win))
66+
67+
saveMenuItem := fyne.NewMenuItem("Save", app.saveFunc(win))
68+
app.SaveMenuItem = saveMenuItem
69+
app.SaveMenuItem.Disabled = true
70+
71+
saveAsMenuItem := fyne.NewMenuItem("Save As...", app.saveAsFunc(win))
72+
73+
fileMenu := fyne.NewMenu("File", openMenuItem, saveMenuItem, saveAsMenuItem)
74+
75+
menu := fyne.NewMainMenu(fileMenu)
76+
77+
win.SetMainMenu(menu)
78+
79+
}
80+
81+
var filter = storage.NewExtensionFileFilter([]string{".md", ".MD"})
82+
83+
func (app *config) saveFunc(win fyne.Window) func() {
84+
return func() {
85+
if app.CurrentFile != nil {
86+
write, err := storage.Writer(app.CurrentFile)
87+
if err != nil {
88+
dialog.ShowError(err, win)
89+
return
90+
}
91+
write.Write([]byte(app.EditWidget.Text))
92+
defer write.Close()
93+
}
94+
}
95+
}
96+
97+
func (app *config) saveAsFunc(win fyne.Window) func() {
98+
return func() {
99+
saveDialog := dialog.NewFileSave(func(write fyne.URIWriteCloser, err error) {
100+
if err != nil {
101+
dialog.ShowError(err, win)
102+
return
103+
}
104+
105+
if write == nil {
106+
// user cancelled
107+
return
108+
}
109+
110+
if !strings.HasSuffix(strings.ToLower(write.URI().String()), ".md") {
111+
dialog.ShowInformation("Error", "Please name your file with a .md extension!", win)
112+
return
113+
}
114+
115+
// save the file
116+
write.Write([]byte(app.EditWidget.Text))
117+
app.CurrentFile = write.URI()
118+
119+
defer write.Close()
120+
121+
// update window title
122+
win.SetTitle(win.Title() + " - " + write.URI().Name())
123+
app.SaveMenuItem.Disabled = false
124+
}, win)
125+
saveDialog.SetFileName("untitled.md")
126+
saveDialog.SetFilter(filter)
127+
saveDialog.Show()
128+
}
129+
}
130+
131+
func (app *config) openFunc(win fyne.Window) func() {
132+
return func() {
133+
openDialog := dialog.NewFileOpen(func(read fyne.URIReadCloser, err error) {
134+
if err != nil {
135+
dialog.ShowError(err, win)
136+
return
137+
}
138+
139+
if read == nil {
140+
return
141+
}
142+
143+
defer read.Close()
144+
145+
data, err := ioutil.ReadAll(read)
146+
147+
if err != nil {
148+
dialog.ShowError(err, win)
149+
return
150+
}
151+
152+
app.EditWidget.SetText(string(data))
153+
154+
app.CurrentFile = read.URI()
155+
win.SetTitle(win.Title() + " - " + read.URI().Name())
156+
app.SaveMenuItem.Disabled = false
157+
158+
}, win)
159+
160+
openDialog.SetFilter(filter)
161+
openDialog.Show()
162+
}
163+
}

main_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package main
2+
3+
import (
4+
"fyne.io/fyne/v2/container"
5+
"fyne.io/fyne/v2/test"
6+
"testing"
7+
)
8+
9+
func Test_makeUI(t *testing.T) {
10+
var testCfg config
11+
12+
edit, preview := testCfg.makeUI()
13+
14+
test.Type(edit, "Hello")
15+
16+
if preview.String() != "Hello" {
17+
t.Errorf("Failed -- did not find expected value in preview")
18+
}
19+
}
20+
21+
func Test_RunApp(t *testing.T) {
22+
var testCfg config
23+
24+
testApp := test.NewApp()
25+
26+
testWin := testApp.NewWindow("Test MarkDown")
27+
28+
edit, preview := testCfg.makeUI()
29+
30+
testCfg.createMenuItems(testWin)
31+
32+
testWin.SetContent(container.NewHSplit(edit, preview))
33+
34+
testApp.Run()
35+
36+
test.Type(edit, "Some Text")
37+
38+
if preview.String() != "Some Text" {
39+
t.Errorf("Test Failed")
40+
}
41+
42+
}

theme.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package main
2+
3+
import (
4+
"fyne.io/fyne/v2"
5+
"fyne.io/fyne/v2/theme"
6+
"image/color"
7+
)
8+
9+
type myTheme struct{}
10+
11+
func (m *myTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color {
12+
switch n {
13+
case theme.ColorNameBackground:
14+
if v == theme.VariantLight {
15+
return &color.NRGBA{R: 0xF0, G: 0xE9, B: 0x9B, A: 0xFF}
16+
}
17+
return &color.NRGBA{R: 0x37, G: 0x2B, B: 0x09, A: 0xFF}
18+
case theme.ColorNameForeground:
19+
if v == theme.VariantLight {
20+
return &color.NRGBA{R: 0x46, G: 0x3A, B: 0x11, A: 0xFF}
21+
}
22+
return &color.NRGBA{R: 0xF0, G: 0xE9, B: 0x9B, A: 0xFF}
23+
case theme.ColorNamePrimary:
24+
return &color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xAA}
25+
case theme.ColorNameFocus:
26+
return &color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0x66}
27+
case theme.ColorNameInputBackground:
28+
// removes background from entry
29+
return color.Transparent
30+
//return &color.RGBA{R: 198, G: 210, B: 16, A: 75}
31+
}
32+
33+
return theme.DefaultTheme().Color(n, v)
34+
}
35+
36+
func (m *myTheme) Font(s fyne.TextStyle) fyne.Resource {
37+
return theme.DefaultTheme().Font(s)
38+
}
39+
40+
func (m *myTheme) Icon(n fyne.ThemeIconName) fyne.Resource {
41+
return theme.DefaultTheme().Icon(n)
42+
}
43+
44+
func (m *myTheme) Size(n fyne.ThemeSizeName) float32 {
45+
if n == theme.SizeNameText {
46+
return theme.DefaultTheme().Size(n) + 2
47+
}
48+
49+
return theme.DefaultTheme().Size(n)
50+
}

0 commit comments

Comments
 (0)