From e1227f703fc9e754fdb7f1ca8dce8dfb36ada368 Mon Sep 17 00:00:00 2001 From: Kevin Chabowski Date: Wed, 14 Aug 2013 15:04:58 +0200 Subject: Initial commit General idea of GUI is already there. --- main.go | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 main.go (limited to 'main.go') 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 "}) + 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() +} -- cgit v1.2.3-54-g00ecf