Comments (7)
For anyone reading this who just wants a popup overlay, here's a quick and dirty text compositor example.
If you're using lipgloss you'll probably need to tweak this so it plays nice with the ANSI control codes.
I invested about 15 mins into writing this so YMMV, no warranty, good luck, etc.
package main
import (
"fmt"
"strings"
)
func composite(main, overlay string, xoffset, yoffset int) string {
doc := strings.Builder{}
m := strings.Split(main, "\n")
o := strings.Split(overlay, "\n")
for i, row := range m {
for j, char := range row {
if j < xoffset || i < yoffset || i >= len(o)+yoffset || j >= len(o[i-yoffset])+xoffset {
doc.WriteRune(char)
continue
}
doc.WriteByte(o[i-yoffset][j-xoffset])
}
doc.WriteString("\n")
}
return doc.String()
}
const (
A = `_______________________________________________________________
_______________________________________________________________
_______________________________________________________________
_______________________________________________________________
_______________________________________________________________
_______________________________________________________________
_______________________________________________________________
_______________________________________________________________
_______________________________________________________________`
B = `OOOOOOOOOO
OOOOOOOOOO
OOOOOOOOOO
OOOOOOOOOO`
)
func main() {
fmt.Println(composite(A, B, 10, 3))
}
from bubbletea.
Hi! So this essentially comes down to writing a compositor and matching renderer, which is something we'd like to do, however we can't provide a timeline as it's a fairly large endeavor.
from bubbletea.
Hmm, not sure if I am either understanding the requirement wrong, or I am doing something I should not be doing. I was trying to figure out sort of similar behavior, where I want to have bubbles (I guess is what we call them?) dynamically load and unload. Just now I did a little experiment just using a goroutine for each bubble, and that seems to work fine. Is this bad? What I was thinking was to wrap each bubble in another object that contains an in and out channel (or something, I just discovered this project (which I love by the way, been looking for this) and I hardly know anything about it.) and use my "layout" object to orchestrate messaging between them, but that's just an idea...
layout.models = []tea.Model{
NewStatus(),
NewPager(),
}
for _, sub := range layout.models
go func(sub tea.Model) {
tea.NewProgram(sub).Start()
}(sub)
}
ui := ""
for _, sub := range layout.models {
ui += sub.View()
}
I suppose if you wanted to do this with string manipulation you could just have some sort of template variable substitution and redraw the entire screen? Not sure either...
from bubbletea.
Hmm, not sure if I am either understanding the requirement wrong, or I am doing something I should not be doing. I was trying to figure out sort of similar behavior, where I want to have bubbles (I guess is what we call them?) dynamically load and unload. Just now I did a little experiment just using a goroutine for each bubble, and that seems to work fine. Is this bad? What I was thinking was to wrap each bubble in another object that contains an in and out channel (or something, I just discovered this project (which I love by the way, been looking for this) and I hardly know anything about it.) and use my "layout" object to orchestrate messaging between them, but that's just an idea...
layout.models = []tea.Model{ NewStatus(), NewPager(), } for _, sub := range layout.models go func(sub tea.Model) { tea.NewProgram(sub).Start() }(sub) } ui := "" for _, sub := range layout.models { ui += sub.View() }I suppose if you wanted to do this with string manipulation you could just have some sort of template variable substitution and redraw the entire screen? Not sure either...
Nice hack, unfortunately listening for events becomes impossible ⚡
from bubbletea.
Why? It's been a while since I have worked on this so forgive me if I do not see the obvious, but there must be a way to collate all of the events over a shared channel right? Or better still, implement some pub/sub queue kind of thing?
from bubbletea.
Especially since in my previous example I did not halt the main goroutine yet, so the queue could do that.
So something like:
eventBus := make(chan tea.Msg)
queue := NewQueue(eventBus)
layout.models = []tea.Model{
NewStatus(queue, eventBus),
NewPager(queue, eventBus),
}
for _, sub := range layout.models
go func(sub tea.Model) {
tea.NewProgram(sub).Start()
}(sub)
}
ui := ""
for _, sub := range layout.models {
ui += sub.View()
}
queue.Start()
Then inside the model, something like:
func (m model) Init() tea.Cmd {
queue.registerListener('someEvent', someFunctor);
// Just return `nil`, which means "no I/O right now, please."
return nil
}
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.eventBus <- msg // Or just do something locally, but this is event listening/sharing across components I think?
}
// Sort of like a callback.
func (m Model) someFunctor() {}
Really you don't even need to separate the eventBus, just have an exposed method on Queue to call to add an event to the stack and distribute it to all the listeners. Then inject the queue into all the components, or leave it an ambient context if that makes sense.
from bubbletea.
Just an update here: given that Bubblezone is a thing now, the solution here will will most likely only need to be implemented in Lip Gloss.
from bubbletea.
Related Issues (20)
- Part of the screen is not rendering when the view is exactly the size of the screen HOT 3
- Proposal: Model v2, program context HOT 2
- Exiting fullscreen glitch when also removing a line in output HOT 2
- Proposal: use x/input to handle input events HOT 1
- `tea.unknownCSISequenceMsg: unknown message type` panics HOT 3
- The visible area in viewport may seem incorrect when content exceed the viewport.Width HOT 10
- Flickering on Windows when using bubbletea >=0.26.0 HOT 2
- SetWindowTitle panic after upgrade from v0.26.2 -> v0.26.3 HOT 1
- When a large update is performed, it will cause a flash. HOT 1
- PR #1033 broke the tabs example HOT 2
- View() gets stuck rendering a lipgloss.AdaptiveColor style (in an oddly specific situation) HOT 4
- Pager example with high performance rendering loses first line on resize HOT 3
- Bubbletea table and Lip Gloss color do not work with ssh.Channel. HOT 1
- Overriding the default help view
- mouse: KeyMsg emitted when dragging the mouse with `tea.WithMouseCellMotion()` enabled HOT 1
- Suspend/Resume
- v2: `ctx.WindowSize()` panics if used in `Model.Init()`
- unrelated
- Tab width top border
- tui-daemon-combo example output is not aligned correctly in daemon mode HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from bubbletea.