Sfoglia il codice sorgente

Implemented GUI watchers for rapid reload. Implements #46

Maran 11 anni fa
parent
commit
0cf617ef0c
2 ha cambiato i file con 69 aggiunte e 3 eliminazioni
  1. 9 3
      ethereal/ui/ext_app.go
  2. 60 0
      ethereal/ui/html_container.go

+ 9 - 3
ethereal/ui/ext_app.go

@@ -18,14 +18,16 @@ type AppContainer interface {
 	NewBlock(*ethchain.Block)
 	ObjectChanged(*ethchain.StateObject)
 	StorageChanged(*ethchain.StorageState)
+	NewWatcher(chan bool)
 }
 
 type ExtApplication struct {
 	*ethpub.PEthereum
 
-	blockChan  chan ethutil.React
-	changeChan chan ethutil.React
-	quitChan   chan bool
+	blockChan       chan ethutil.React
+	changeChan      chan ethutil.React
+	quitChan        chan bool
+	watcherQuitChan chan bool
 
 	container        AppContainer
 	lib              *UiLib
@@ -38,6 +40,7 @@ func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication {
 		make(chan ethutil.React, 1),
 		make(chan ethutil.React, 1),
 		make(chan bool),
+		make(chan bool),
 		container,
 		lib,
 		nil,
@@ -66,6 +69,8 @@ func (app *ExtApplication) run() {
 	reactor := app.lib.eth.Reactor()
 	reactor.Subscribe("newBlock", app.blockChan)
 
+	app.container.NewWatcher(app.watcherQuitChan)
+
 	win := app.container.Window()
 	win.Show()
 	win.Wait()
@@ -83,6 +88,7 @@ func (app *ExtApplication) stop() {
 
 	// Kill the main loop
 	app.quitChan <- true
+	app.watcherQuitChan <- true
 
 	close(app.blockChan)
 	close(app.quitChan)

+ 60 - 0
ethereal/ui/html_container.go

@@ -6,6 +6,12 @@ import (
 	"github.com/ethereum/eth-go/ethpub"
 	"github.com/ethereum/eth-go/ethutil"
 	"github.com/go-qml/qml"
+	"github.com/howeyc/fsnotify"
+	"io/ioutil"
+	"log"
+	"net/url"
+	"os"
+	"path"
 	"path/filepath"
 )
 
@@ -15,6 +21,7 @@ type HtmlApplication struct {
 	engine  *qml.Engine
 	lib     *UiLib
 	path    string
+	watcher *fsnotify.Watcher
 }
 
 func NewHtmlApplication(path string, lib *UiLib) *HtmlApplication {
@@ -47,6 +54,59 @@ func (app *HtmlApplication) Create() error {
 	return nil
 }
 
+func (app *HtmlApplication) RootFolder() string {
+	folder, err := url.Parse(app.path)
+	if err != nil {
+		return ""
+	}
+	return path.Dir(folder.RequestURI())
+}
+func (app *HtmlApplication) RecursiveFolders() []os.FileInfo {
+	files, _ := ioutil.ReadDir(app.RootFolder())
+	var folders []os.FileInfo
+	for _, file := range files {
+		if file.IsDir() {
+			folders = append(folders, file)
+		}
+	}
+	return folders
+}
+
+func (app *HtmlApplication) NewWatcher(quitChan chan bool) {
+	var err error
+
+	app.watcher, err = fsnotify.NewWatcher()
+	if err != nil {
+		return
+	}
+	err = app.watcher.Watch(app.RootFolder())
+	if err != nil {
+		log.Fatal(err)
+	}
+	for _, folder := range app.RecursiveFolders() {
+		fullPath := app.RootFolder() + "/" + folder.Name()
+		app.watcher.Watch(fullPath)
+	}
+
+	go func() {
+	out:
+		for {
+			select {
+			case <-quitChan:
+				app.watcher.Close()
+				break out
+			case <-app.watcher.Event:
+				//ethutil.Config.Log.Debugln("Got event:", ev)
+				app.webView.Call("reload")
+			case err := <-app.watcher.Error:
+				// TODO: Do something here
+				ethutil.Config.Log.Infoln("Watcher error:", err)
+			}
+		}
+	}()
+
+}
+
 func (app *HtmlApplication) Engine() *qml.Engine {
 	return app.engine
 }