aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ui/logdialog.go
diff options
context:
space:
mode:
authorAlexander Neumann <alexander.neumann@picos-software.com>2019-04-17 18:12:57 +0200
committerAlexander Neumann <alexander.neumann@picos-software.com>2019-04-23 11:05:00 +0200
commit3ce4677289c67be45453ae2505bf520f76cf2eb1 (patch)
tree850bbc0d9484d4e55e4fc3a8d3ab25cba60fff4b /ui/logdialog.go
parentui: simplify sorting of TunnelModel (diff)
downloadwireguard-windows-3ce4677289c67be45453ae2505bf520f76cf2eb1.tar.xz
wireguard-windows-3ce4677289c67be45453ae2505bf520f76cf2eb1.zip
ui: some log dialog improvements
requires https://github.com/lxn/walk/commit/bf929d66e944e31cd3f7cd802a697c62bc5b2006 Signed-off-by: Alexander Neumann <alexander.neumann@picos-software.com>
Diffstat (limited to 'ui/logdialog.go')
-rw-r--r--ui/logdialog.go44
1 files changed, 32 insertions, 12 deletions
diff --git a/ui/logdialog.go b/ui/logdialog.go
index 6cc176e1..a2f23903 100644
--- a/ui/logdialog.go
+++ b/ui/logdialog.go
@@ -46,6 +46,7 @@ func runLogDialog(owner walk.Form, logger *ringlogger.Ringlogger) {
dlg.SetTitle("WireGuard Log")
dlg.SetLayout(walk.NewVBoxLayout())
+ dlg.Layout().SetMargins(walk.Margins{18, 18, 18, 18})
dlg.SetMinMaxSize(walk.Size{600, 400}, walk.Size{})
if dlg.logView, err = walk.NewTableView(dlg); showError(err) {
@@ -67,10 +68,11 @@ func runLogDialog(owner walk.Form, logger *ringlogger.Ringlogger) {
dlg.logView.Columns().Add(msgCol)
dlg.logView.SetModel(dlg.model)
- dlg.logView.SetCurrentIndex(len(dlg.model.items) - 1)
+ dlg.scrollToBottom()
buttonsContainer, err := walk.NewComposite(dlg)
buttonsContainer.SetLayout(walk.NewHBoxLayout())
+ buttonsContainer.Layout().SetMargins(walk.Margins{0, 12, 0, 0})
saveButton, err := walk.NewPushButton(buttonsContainer)
saveButton.SetText("Save")
@@ -80,7 +82,7 @@ func runLogDialog(owner walk.Form, logger *ringlogger.Ringlogger) {
closeButton, err := walk.NewPushButton(buttonsContainer)
closeButton.SetText("Close")
- closeButton.Clicked().Attach(dlg.onCloseButtonClicked)
+ closeButton.Clicked().Attach(dlg.Accept)
dlg.SetDefaultButton(closeButton)
dlg.SetCancelButton(closeButton)
@@ -97,6 +99,14 @@ type LogDialog struct {
model *logModel
}
+func (dlg *LogDialog) isAtBottom() bool {
+ return dlg.logView.ItemVisible(len(dlg.model.items) - 1)
+}
+
+func (dlg *LogDialog) scrollToBottom() {
+ dlg.logView.EnsureItemVisible(len(dlg.model.items) - 1)
+}
+
func (dlg *LogDialog) onSaveButtonClicked() {
fd := walk.FileDialog{
Filter: "Text Files (*.txt)|*.txt|All Files (*.*)|*.*",
@@ -122,10 +132,6 @@ func (dlg *LogDialog) onSaveButtonClicked() {
})
}
-func (dlg *LogDialog) onCloseButtonClicked() {
- dlg.Accept()
-}
-
type logModel struct {
walk.ReflectTableModelBase
dlg *LogDialog
@@ -136,7 +142,13 @@ type logModel struct {
func newLogModel(dlg *LogDialog, logger *ringlogger.Ringlogger) *logModel {
mdl := &logModel{dlg: dlg, quit: make(chan bool), logger: logger}
- mdl.items, _ = logger.FollowFromCursor(ringlogger.CursorAll)
+ var lastCursor uint32
+ mdl.items, lastCursor = logger.FollowFromCursor(ringlogger.CursorAll)
+
+ var lastStamp time.Time
+ if len(mdl.items) > 0 {
+ lastStamp = mdl.items[len(mdl.items)-1].Stamp
+ }
go func() {
ticker := time.NewTicker(time.Second)
@@ -144,17 +156,25 @@ func newLogModel(dlg *LogDialog, logger *ringlogger.Ringlogger) *logModel {
for {
select {
case <-ticker.C:
- items, _ := mdl.logger.FollowFromCursor(ringlogger.CursorAll)
+ items, cursor := mdl.logger.FollowFromCursor(ringlogger.CursorAll)
+
+ var stamp time.Time
+ if len(items) > 0 {
+ stamp = items[len(items)-1].Stamp
+ }
+
+ if cursor != lastCursor || stamp.After(lastStamp) {
+ lastCursor = cursor
+ lastStamp = stamp
- if len(items) > 0 && (len(mdl.items) == 0 || items[len(items)-1].Stamp.After(mdl.items[len(mdl.items)-1].Stamp)) {
mdl.dlg.Synchronize(func() {
- scrollToMostRecent := mdl.dlg.logView.CurrentIndex() == len(mdl.items)-1
+ isAtBottom := mdl.dlg.isAtBottom()
mdl.items = items
mdl.PublishRowsReset()
- if scrollToMostRecent {
- mdl.dlg.logView.SetCurrentIndex(len(mdl.items) - 1)
+ if isAtBottom {
+ mdl.dlg.scrollToBottom()
}
})
}