From a12232f527666695c57a6014401c1a34c2fb6611 Mon Sep 17 00:00:00 2001 From: Kevin Chabowski Date: Sat, 17 Aug 2013 14:57:40 +0200 Subject: GUI is now locked on slow operations (e.g. Filling). --- mapwidget.go | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'mapwidget.go') diff --git a/mapwidget.go b/mapwidget.go index 29c5e0d..37a05d0 100644 --- a/mapwidget.go +++ b/mapwidget.go @@ -68,6 +68,9 @@ type MapWidget struct { reportFail func(msg string) updateInfo func(x, z int, bio mcmap.Biome) + setBusy func(bool) + + toolsEnabled bool isInit bool @@ -286,7 +289,27 @@ func (mw *MapWidget) compose() { } func (mw *MapWidget) useTool(x, z int) { - mw.tool.Do(mw.bio, mw, x, z) + gdk.ThreadsLeave() + defer gdk.ThreadsEnter() + + if !mw.toolsEnabled { + return + } + + if mw.tool.IsSlow() { + mw.toolsEnabled = false + mw.setBusy(true) + + go func() { + mw.tool.Do(mw.bio, mw, x, z) + mw.setBusy(false) + mw.toolsEnabled = true + + mw.redraw <- true + }() + } else { + mw.tool.Do(mw.bio, mw, x, z) + } } func (mw *MapWidget) movement(ctx *glib.CallbackContext) { @@ -475,15 +498,17 @@ func (mw *MapWidget) SetBiomeAt(x, z int, bio mcmap.Biome) { // Update tile if tile, ok := mw.biotiles[pos]; ok { + gdk.ThreadsEnter() drawable := tile.GetDrawable() gc := gdk.NewGC(drawable) gc.SetRgbFgColor(bioColors[bio]) drawable.DrawRectangle(gc, true, bx*zoom, bz*zoom, zoom, zoom) + gdk.ThreadsLeave() } } -func NewMapWidget(reportFail func(msg string), updateInfo func(x, z int, bio mcmap.Biome)) *MapWidget { - mw := &MapWidget{reportFail: reportFail, updateInfo: updateInfo} +func NewMapWidget(reportFail func(msg string), updateInfo func(x, z int, bio mcmap.Biome), setBusy func(bool)) *MapWidget { + mw := &MapWidget{reportFail: reportFail, updateInfo: updateInfo, setBusy: setBusy, toolsEnabled: true} mw.init() return mw } -- cgit v1.2.3-54-g00ecf