xA/xW: dehighlight current buffer appropriately
This commit is contained in:
150
xA/xA.go
150
xA/xA.go
@@ -363,61 +363,6 @@ func bufferByName(name string) *buffer {
|
||||
return nil
|
||||
}
|
||||
|
||||
func bufferActivate(name string) {
|
||||
relaySend(RelayCommandData{
|
||||
Variant: &RelayCommandDataBufferActivate{BufferName: name},
|
||||
}, nil)
|
||||
}
|
||||
|
||||
func bufferToggleUnimportant(name string) {
|
||||
relaySend(RelayCommandData{
|
||||
Variant: &RelayCommandDataBufferToggleUnimportant{BufferName: name},
|
||||
}, nil)
|
||||
}
|
||||
|
||||
func bufferPushLine(b *buffer, line bufferLine) {
|
||||
b.lines = append(b.lines, line)
|
||||
|
||||
// Fyne's text layouting is extremely slow.
|
||||
// The limit could be made configurable,
|
||||
// and we could use a ring buffer approach to storing the lines.
|
||||
if len(b.lines) > 100 {
|
||||
b.lines = slices.Delete(b.lines, 0, 1)
|
||||
}
|
||||
}
|
||||
|
||||
// --- Current buffer ----------------------------------------------------------
|
||||
|
||||
func bufferToggleLogFinish(err string, response *RelayResponseDataBufferLog) {
|
||||
if response == nil {
|
||||
showErrorMessage(err)
|
||||
return
|
||||
}
|
||||
|
||||
wLog.SetText(string(response.Log))
|
||||
wLog.Show()
|
||||
wRichScroll.Hide()
|
||||
}
|
||||
|
||||
func bufferToggleLog() {
|
||||
if wLog.Visible() {
|
||||
wRichScroll.Show()
|
||||
wLog.Hide()
|
||||
wLog.SetText("")
|
||||
return
|
||||
}
|
||||
|
||||
name := bufferCurrent
|
||||
relaySend(RelayCommandData{Variant: &RelayCommandDataBufferLog{
|
||||
BufferName: name,
|
||||
}}, func(err string, response *RelayResponseData) {
|
||||
if bufferCurrent == name {
|
||||
bufferToggleLogFinish(
|
||||
err, response.Variant.(*RelayResponseDataBufferLog))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func bufferAtBottom() bool {
|
||||
return wRichScroll.Offset.Y >=
|
||||
wRichScroll.Content.Size().Height-wRichScroll.Size().Height
|
||||
@@ -432,22 +377,31 @@ func bufferScrollToBottom() {
|
||||
refreshStatus()
|
||||
}
|
||||
|
||||
func bufferPushLine(b *buffer, line bufferLine) {
|
||||
b.lines = append(b.lines, line)
|
||||
|
||||
// Fyne's text layouting is extremely slow.
|
||||
// The limit could be made configurable,
|
||||
// and we could use a ring buffer approach to storing the lines.
|
||||
if len(b.lines) > 100 {
|
||||
b.lines = slices.Delete(b.lines, 0, 1)
|
||||
}
|
||||
}
|
||||
|
||||
// --- UI state refresh --------------------------------------------------------
|
||||
|
||||
func refreshIcon() {
|
||||
highlighted := false
|
||||
resource := resourceIconNormal
|
||||
for _, b := range buffers {
|
||||
if b.highlighted {
|
||||
highlighted = true
|
||||
resource = resourceIconHighlighted
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if highlighted {
|
||||
wWindow.SetIcon(resourceIconHighlighted)
|
||||
} else {
|
||||
wWindow.SetIcon(resourceIconNormal)
|
||||
}
|
||||
// Prevent deadlocks (though it might have a race condition).
|
||||
// https://github.com/fyne-io/fyne/issues/5266
|
||||
go func() { wWindow.SetIcon(resource) }()
|
||||
}
|
||||
|
||||
func refreshTopic(topic []bufferLineItem) {
|
||||
@@ -515,6 +469,63 @@ func refreshStatus() {
|
||||
wStatus.SetText(status)
|
||||
}
|
||||
|
||||
func recheckHighlighted() {
|
||||
// Corresponds to the logic toggling the bool on.
|
||||
if b := bufferByName(bufferCurrent); b != nil &&
|
||||
b.highlighted && bufferAtBottom() &&
|
||||
inForeground && !wLog.Visible() {
|
||||
b.highlighted = false
|
||||
refreshIcon()
|
||||
refreshBufferList()
|
||||
}
|
||||
}
|
||||
|
||||
// --- Buffer actions ----------------------------------------------------------
|
||||
|
||||
func bufferActivate(name string) {
|
||||
relaySend(RelayCommandData{
|
||||
Variant: &RelayCommandDataBufferActivate{BufferName: name},
|
||||
}, nil)
|
||||
}
|
||||
|
||||
func bufferToggleUnimportant(name string) {
|
||||
relaySend(RelayCommandData{
|
||||
Variant: &RelayCommandDataBufferToggleUnimportant{BufferName: name},
|
||||
}, nil)
|
||||
}
|
||||
|
||||
func bufferToggleLogFinish(err string, response *RelayResponseDataBufferLog) {
|
||||
if response == nil {
|
||||
showErrorMessage(err)
|
||||
return
|
||||
}
|
||||
|
||||
wLog.SetText(string(response.Log))
|
||||
wLog.Show()
|
||||
wRichScroll.Hide()
|
||||
}
|
||||
|
||||
func bufferToggleLog() {
|
||||
if wLog.Visible() {
|
||||
wRichScroll.Show()
|
||||
wLog.Hide()
|
||||
wLog.SetText("")
|
||||
|
||||
recheckHighlighted()
|
||||
return
|
||||
}
|
||||
|
||||
name := bufferCurrent
|
||||
relaySend(RelayCommandData{Variant: &RelayCommandDataBufferLog{
|
||||
BufferName: name,
|
||||
}}, func(err string, response *RelayResponseData) {
|
||||
if bufferCurrent == name {
|
||||
bufferToggleLogFinish(
|
||||
err, response.Variant.(*RelayResponseDataBufferLog))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// --- RichText formatting -----------------------------------------------------
|
||||
|
||||
func defaultBufferLineItem() bufferLineItem { return bufferLineItem{} }
|
||||
@@ -756,6 +767,7 @@ func refreshBuffer(b *buffer) {
|
||||
bufferPrintAndWatchTrailingDateChanges()
|
||||
wRichText.Refresh()
|
||||
bufferScrollToBottom()
|
||||
recheckHighlighted()
|
||||
}
|
||||
|
||||
// --- Event processing --------------------------------------------------------
|
||||
@@ -1374,6 +1386,9 @@ func (l *customLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) {
|
||||
}
|
||||
if toBottom {
|
||||
bufferScrollToBottom()
|
||||
} else {
|
||||
recheckHighlighted()
|
||||
refreshStatus()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1497,11 +1512,7 @@ func main() {
|
||||
a.Lifecycle().SetOnEnteredForeground(func() {
|
||||
// TODO(p): Does this need locking?
|
||||
inForeground = true
|
||||
if b := bufferByName(bufferCurrent); b != nil {
|
||||
b.highlighted = false
|
||||
refreshIcon()
|
||||
refreshBufferList()
|
||||
}
|
||||
recheckHighlighted()
|
||||
})
|
||||
a.Lifecycle().SetOnExitedForeground(func() {
|
||||
inForeground = false
|
||||
@@ -1542,7 +1553,10 @@ func main() {
|
||||
wRichText = widget.NewRichText()
|
||||
wRichText.Wrapping = fyne.TextWrapWord
|
||||
wRichScroll = container.NewVScroll(wRichText)
|
||||
wRichScroll.OnScrolled = func(position fyne.Position) { refreshStatus() }
|
||||
wRichScroll.OnScrolled = func(position fyne.Position) {
|
||||
recheckHighlighted()
|
||||
refreshStatus()
|
||||
}
|
||||
wLog = newLogEntry()
|
||||
wLog.Wrapping = fyne.TextWrapWord
|
||||
wLog.Hide()
|
||||
|
||||
Reference in New Issue
Block a user