Git Product home page Git Product logo

Comments (7)

markhuge avatar markhuge commented on August 16, 2024 2

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.

meowgorithm avatar meowgorithm commented on August 16, 2024

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.

TheApeMachine avatar TheApeMachine commented on August 16, 2024

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.

76creates avatar 76creates commented on August 16, 2024

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.

TheApeMachine avatar TheApeMachine commented on August 16, 2024

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.

TheApeMachine avatar TheApeMachine commented on August 16, 2024

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.

meowgorithm avatar meowgorithm commented on August 16, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.