diff --git a/dfssd/gui/application.qrc b/dfssd/gui/application.qrc
index af8a564b3633a8ccf5d4e4a77bd69f69ef277c5e..65c5cfcd87581ab614c456eab60d777c2a797f3e 100644
--- a/dfssd/gui/application.qrc
+++ b/dfssd/gui/application.qrc
@@ -1,4 +1,5 @@
+ widget.ui
diff --git a/dfssd/gui/widget.ui b/dfssd/gui/widget.ui
new file mode 100644
index 0000000000000000000000000000000000000000..207beb568fed08a8a802062dd6ca8d661e5b5d13
--- /dev/null
+++ b/dfssd/gui/widget.ui
@@ -0,0 +1,187 @@
+
+
+ CalculatorForm
+
+
+ true
+
+
+
+ 0
+ 0
+ 751
+ 595
+
+
+
+
+ 0
+ 0
+
+
+
+ Calculator Builder
+
+
+
+ 9
+
+
+ 6
+
+ -
+
+
-
+
+
+
+ 700
+ 300
+
+
+
+
+ -
+
+
+ 5
+
+
+ 5
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Play
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Replay
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Quantum:
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ us
+
+
+ 1
+
+
+ 1000000
+
+
+ 100
+
+
+ 1000
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Speed:
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Qt::Horizontal
+
+
+ QSlider::TicksBothSides
+
+
+ 5
+
+
+
+
+
+ -
+
+
+
+ 16777215
+ 200
+
+
+
+
+ Courier
+ 10
+
+
+
+ Qt::ScrollBarAlwaysOn
+
+
+ false
+
+
+ true
+
+
+ false
+
+
+
+
+
+
+
+
+
+
diff --git a/dfssd/gui/window.go b/dfssd/gui/window.go
new file mode 100644
index 0000000000000000000000000000000000000000..a4aa9aef09f945dad9f18e5102442c1b07e91574
--- /dev/null
+++ b/dfssd/gui/window.go
@@ -0,0 +1,54 @@
+package gui
+
+import (
+ "dfss"
+ "github.com/visualfc/goqt/ui"
+)
+
+type Window struct {
+ *ui.QMainWindow
+
+ logField *ui.QTextEdit
+}
+
+func NewWindow() *Window {
+ file := ui.NewFileWithName(":/widget.ui")
+ loader := ui.NewUiLoader()
+ widget := loader.Load(file)
+
+ // Init main window
+ window := ui.NewMainWindow()
+ window.SetCentralWidget(widget)
+ window.SetWindowTitle("DFSS Demonstrator v" + dfss.Version)
+
+ w := &Window{
+ QMainWindow: window,
+ }
+
+ // Load dynamic elements from driver
+ w.logField = ui.NewTextEditFromDriver(widget.FindChild("logField"))
+
+ // Add actions
+ w.addActions()
+
+ w.StatusBar().ShowMessage("Ready")
+ return w
+}
+
+func (w *Window) Log(str string) {
+ w.logField.Append(str)
+ w.logField.EnsureCursorVisible()
+}
+
+func (w *Window) addActions() {
+ openAct := ui.NewActionWithTextParent("&Open", w)
+ openAct.SetShortcuts(ui.QKeySequence_Open)
+ openAct.SetStatusTip("Open a demonstration file")
+
+ saveAct := ui.NewActionWithTextParent("&Save", w)
+ saveAct.SetShortcuts(ui.QKeySequence_Save)
+ saveAct.SetStatusTip("Save a demonstration file")
+
+ w.MenuBar().AddAction(openAct)
+ w.MenuBar().AddAction(saveAct)
+}
diff --git a/dfssd/main.go b/dfssd/main.go
index 85c0aaa3a173b16385a0e2ee8dbd9f5594a1747c..6be4fd8864356e8922d66042b64f76a018a189d6 100644
--- a/dfssd/main.go
+++ b/dfssd/main.go
@@ -9,6 +9,8 @@ import (
"dfss"
"dfss/dfssd/server"
+ "dfss/dfssd/gui"
+ "github.com/visualfc/goqt/ui"
)
var (
@@ -49,10 +51,23 @@ func main() {
case "version":
fmt.Println("v"+dfss.Version, runtime.GOOS, runtime.GOARCH)
case "nogui":
- err := server.Listen("0.0.0.0:" + strconv.Itoa(port))
+ lfn := func(str string) {
+ fmt.Println(str)
+ }
+ err := server.Listen("0.0.0.0:" + strconv.Itoa(port), lfn)
if err != nil {
os.Exit(1)
}
default:
+ ui.Run(func() {
+ window := gui.NewWindow()
+ go func() {
+ err := server.Listen("0.0.0.0:" + strconv.Itoa(port), window.Log)
+ if err != nil {
+ window.Log("!! " + err.Error())
+ }
+ }()
+ window.Show()
+ })
}
}
diff --git a/dfssd/server/server.go b/dfssd/server/server.go
index 4132a10424ccb739c75692a0cefa7b85faba2d13..cf0a4841de5c62bb2ae692fc1ea2996986eaf6c1 100644
--- a/dfssd/server/server.go
+++ b/dfssd/server/server.go
@@ -1,7 +1,6 @@
package server
import (
- "log"
"net"
api "dfss/dfssd/api"
@@ -21,17 +20,17 @@ func (s *Server) SendLog(ctx context.Context, in *api.Log) (*api.Ack, error) {
}
// Listen with gRPG service
-func Listen(addrPort string) error {
+func Listen(addrPort string, lfn func(string)) error {
// open tcp socket
lis, err := net.Listen("tcp", addrPort)
if err != nil {
grpclog.Fatalf("Failed to open tcp socket: %v", err)
return err
}
- log.Printf("Server listening on %s", addrPort)
+ lfn("Server listening on " + addrPort)
// log display manager
- go displayHandler()
+ go displayHandler(lfn)
// bootstrap gRPC service !
grpcServer := grpc.NewServer()
diff --git a/dfssd/server/storage.go b/dfssd/server/storage.go
index 654698a7b851154cb9102d955d3bb54cfeab3511..b2e4e0c5da45ee901a89eb44ebfd35124ce93f69 100644
--- a/dfssd/server/storage.go
+++ b/dfssd/server/storage.go
@@ -1,7 +1,7 @@
package server
import (
- "log"
+ "fmt"
"sort"
"sync"
"time"
@@ -23,7 +23,7 @@ func addMessage(msg *api.Log) {
}
// display logs that are more than since (ms) old
-func display(since int64) {
+func display(since int64, lfn func(string)) {
var out []*api.Log // sorted messages to display
var recycled []*api.Log // messages too recent to be displayed
@@ -45,15 +45,15 @@ func display(since int64) {
sort.Sort(ByTimestamp(out))
for _, v := range out {
- log.Printf("[%d] %s:: %s", v.Timestamp, v.Identifier, v.Log)
+ lfn(fmt.Sprintf("[%d] %s:: %s", v.Timestamp, v.Identifier, v.Log))
}
}
// refresh every second
-func displayHandler() {
+func displayHandler(lfn func(string)) {
ticker := time.NewTicker(time.Second)
for range ticker.C {
- display(1000)
+ display(1000, lfn)
}
}