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) } }