summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorKevin Chabowski <kevin@kch42.de>2013-08-14 15:04:58 +0200
committerKevin Chabowski <kevin@kch42.de>2013-08-14 15:04:58 +0200
commite1227f703fc9e754fdb7f1ca8dce8dfb36ada368 (patch)
treebed1aa5832abacc76ee56c0f67682893adad161c /main.go
downloadbiomed-e1227f703fc9e754fdb7f1ca8dce8dfb36ada368.tar.gz
biomed-e1227f703fc9e754fdb7f1ca8dce8dfb36ada368.tar.bz2
biomed-e1227f703fc9e754fdb7f1ca8dce8dfb36ada368.zip
Initial commit
General idea of GUI is already there.
Diffstat (limited to 'main.go')
-rw-r--r--main.go236
1 files changed, 236 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..13f9ccf
--- /dev/null
+++ b/main.go
@@ -0,0 +1,236 @@
+package main
+
+import (
+ "fmt"
+ "github.com/kch42/gomcmap/mcmap"
+ "github.com/mattn/go-gtk/glib"
+ "github.com/mattn/go-gtk/gtk"
+)
+
+type tool int
+
+const (
+ ToolDraw tool = iota
+ ToolFill
+)
+
+type GUI struct {
+ window *gtk.Window
+ statusbar *gtk.Statusbar
+ showbiomes *gtk.CheckButton
+}
+
+func (g *GUI) openWorldDlg() {
+ dlg := gtk.NewFileChooserDialog("Open World (region directory)", g.window, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, "Open Region dir", gtk.RESPONSE_OK, "Cancel", gtk.RESPONSE_CANCEL)
+ if dlg.Run() == gtk.RESPONSE_OK {
+ g.openWorld(dlg.GetFilename())
+ }
+ dlg.Destroy()
+}
+
+func (g *GUI) openWorld(path string) {
+ fmt.Println(path)
+}
+
+func (g *GUI) aboutDlg() {
+ dlg := gtk.NewAboutDialog()
+ dlg.SetName("biome-editor")
+ dlg.SetVersion("α")
+ dlg.SetCopyright("© 2013 by Kevin Chabowski")
+ dlg.SetAuthors([]string{"Kevin Chabowski <kevin@kch42.de>"})
+ dlg.SetLicense(`Copyright (c) 2013 Kevin Chabowski
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+`)
+ dlg.Run()
+ dlg.Destroy()
+}
+
+func (g *GUI) mkMenuBar() *gtk.MenuBar {
+ menubar := gtk.NewMenuBar()
+
+ fileMenu := gtk.NewMenu()
+
+ open := gtk.NewMenuItemWithLabel("Open")
+ open.Connect("activate", g.openWorldDlg)
+ fileMenu.Append(open)
+
+ if quickopen, ok := g.mkQuickOpen(); ok {
+ quickopenItem := gtk.NewMenuItemWithLabel("Open Map")
+ quickopenItem.SetSubmenu(quickopen)
+ fileMenu.Append(quickopenItem)
+ }
+
+ save := gtk.NewMenuItemWithLabel("Save")
+ fileMenu.Append(save)
+
+ quit := gtk.NewMenuItemWithLabel("Quit")
+ quit.Connect("activate", g.exitApp)
+ fileMenu.Append(quit)
+
+ fileMenuItem := gtk.NewMenuItemWithLabel("File")
+ fileMenuItem.SetSubmenu(fileMenu)
+ menubar.Append(fileMenuItem)
+
+ helpMenu := gtk.NewMenu()
+
+ about := gtk.NewMenuItemWithLabel("About")
+ about.Connect("activate", g.aboutDlg)
+ helpMenu.Append(about)
+
+ helpMenuItem := gtk.NewMenuItemWithLabel("Help")
+ helpMenuItem.SetSubmenu(helpMenu)
+ menubar.Append(helpMenuItem)
+
+ return menubar
+}
+
+func (g *GUI) mkQuickOpen() (*gtk.Menu, bool) {
+ maps := allMaps()
+ if (maps == nil) || (len(maps) == 0) {
+ return nil, false
+ }
+
+ menu := gtk.NewMenu()
+ for name, p := range maps {
+ mitem := gtk.NewMenuItemWithLabel(name)
+ p2 := p
+ mitem.Connect("activate", func() { g.openWorld(p2) })
+ menu.Append(mitem)
+ }
+
+ return menu, true
+}
+
+func labelCustomFont(text, font string) *gtk.Label {
+ label := gtk.NewLabel(text)
+ label.ModifyFontEasy(font)
+ return label
+}
+
+func (g *GUI) mkToolbox() *gtk.ScrolledWindow {
+ vbox := gtk.NewVBox(false, 0)
+
+ vbox.PackStart(labelCustomFont("Tools", "Sans Bold 14"), false, false, 3)
+
+ g.showbiomes = gtk.NewCheckButtonWithLabel("Show Biomes")
+ g.showbiomes.SetActive(true)
+ g.showbiomes.Connect("toggled", g.showbiomesToggled)
+ vbox.PackStart(g.showbiomes, false, false, 3)
+
+ fill := gtk.NewRadioButtonWithLabel(nil, "Fill")
+ draw := gtk.NewRadioButtonWithLabel(fill.GetGroup(), "Draw")
+ fill.SetActive(true)
+ fill.Connect("toggled", g.mkUpdateToolFx(fill, ToolFill))
+ draw.Connect("toggled", g.mkUpdateToolFx(draw, ToolDraw))
+ vbox.PackStart(fill, false, false, 3)
+ vbox.PackStart(draw, false, false, 3)
+
+ vbox.PackStart(gtk.NewHSeparator(), false, false, 3)
+ vbox.PackStart(labelCustomFont("Biomes", "Sans Bold 14"), false, false, 3)
+
+ var grp *glib.SList
+ for _, bio := range bioList {
+ biohbox := gtk.NewHBox(false, 0)
+ cbox := colorBox(bioColors[bio])
+ cbox.SetSizeRequest(20, 20)
+ biohbox.PackStart(cbox, false, false, 3)
+ rbutton := gtk.NewRadioButtonWithLabel(grp, bio.String())
+ grp = rbutton.GetGroup()
+ rbutton.Connect("toggled", g.mkUpdateBiomeFx(rbutton, bio))
+ biohbox.PackEnd(rbutton, true, true, 3)
+ vbox.PackStart(biohbox, false, false, 3)
+ }
+
+ scrolled := gtk.NewScrolledWindow(nil, nil)
+ scrolled.SetPolicy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
+ scrolled.AddWithViewPort(vbox)
+ return scrolled
+}
+
+func (g *GUI) Init() {
+ g.window = gtk.NewWindow(gtk.WINDOW_TOPLEVEL)
+ g.window.SetTitle("Biome Editor")
+
+ menubar := g.mkMenuBar()
+ vbox := gtk.NewVBox(false, 0)
+ vbox.PackStart(menubar, false, false, 3)
+
+ hbox := gtk.NewHBox(false, 0)
+
+ // TODO: Drawing area thing missing...
+
+ toolbox := g.mkToolbox()
+ hbox.PackEnd(toolbox, false, false, 3)
+
+ vbox.PackStart(hbox, true, true, 3)
+
+ g.statusbar = gtk.NewStatusbar()
+ vbox.PackEnd(g.statusbar, false, false, 3)
+
+ g.window.Add(vbox)
+ g.window.SetDefaultSize(800, 600)
+
+ g.window.Connect("destroy", g.exitApp)
+}
+
+func (g *GUI) mkUpdateToolFx(rb *gtk.RadioButton, t tool) func() {
+ return func() {
+ if rb.GetActive() {
+ g.setTool(t)
+ }
+ }
+}
+
+func (g *GUI) mkUpdateBiomeFx(rb *gtk.RadioButton, bio mcmap.Biome) func() {
+ return func() {
+ if rb.GetActive() {
+ g.setBiome(bio)
+ }
+ }
+}
+
+func (g *GUI) setTool(t tool) {
+ fmt.Printf("Tool %d\n", t)
+}
+
+func (g *GUI) setBiome(bio mcmap.Biome) {
+ fmt.Println(bio)
+}
+
+func (g *GUI) showbiomesToggled() {
+ fmt.Printf("Show biomes: %v\n", g.showbiomes.GetActive())
+}
+
+func (g *GUI) Show() {
+ g.window.ShowAll()
+}
+
+func (g *GUI) exitApp() {
+ gtk.MainQuit()
+}
+
+func main() {
+ gtk.Init(nil)
+
+ gui := new(GUI)
+ gui.Init()
+ gui.Show()
+
+ gtk.Main()
+}