Ir para o conteúdo

 Voltar a Linguagem Lua
Tela cheia

Caixa de texto em NCLua

29 de Abril de 2013, 10:19 , por Desconhecido - | 1 Pessoa seguindo este artigo.
Visualizado 79 vezes

Prezados amigos do Fórum,

Desculpe-me se a questão for demasiadamente simples, mas estou com dificuldades em aplicar um recurso que estou desenvolvendo em NCLua.

Teria como por exemplo um texto exibido na tela pela função drawText obedecer alguns limitadores de espaços, formatando uma espécie de caixa de texto, onde faria automaticamente a quebra de linhas quando esta se completaria?

Alguém por gentileza poderia expor suas soluções, caso já enfrentou este tipo de problema?

Obrigado pela atenção.

Autor: Alysson Carvalho


55 comentários

  • 145ea1662b45b86a90b987f094279123?only path=false&size=50&d=404Guilherme Lima(usuário não autenticado)
    30 de Abril de 2013, 18:42

     

    Segue o algoritmo mais simples possivel -- na minha opiniao.

    Para cada linha:
    Se a linha cabe na caixa, imprime a linha.
    Senao, acha o maior prefixo que caiba e chama a funcao recursivamente,
    para o prefixo e para o restante da linha.

    O seguinte codigo, dump.lua, usa esse algoritmo para imprimir o conteudo do
    arquivo `file.txt' na regiao do NCLua. Note que, para achar o prefixo otimo,
    a funcao `output' varre todos os prefixos da linha. Uma forma de melhorar isso
    eh usar busca binaria.

    -- dump.lua
    canvas:attrColor ('white')
    canvas:attrFont ('vera', 18)

    local screen_w, screen_h = canvas:attrSize ()
    local offset = 0
    function output (line)
    if offset > screen_h then return end
    local line_w, line_h = canvas:measureText (line)
    if line_w ):lines () do
    output (line)
    end

    • 700e223ecfe69510f7bf29cd7187966b?only path=false&size=50&d=404Alysson Carvalho(usuário não autenticado)
      2 de Maio de 2013, 17:53

       

      Obrigado Guilherme!

      Sua dica irá ajudar muito no desenvolvimento da minha aplicação. Muito obrigado mesmo!

      Um grande abraço e até mais!

       Alysson Carvalho

       

  • 1e29d0095154ec9fed26313e9afb8f36?only path=false&size=50&d=404Manoel Campos da Silva Filho(usuário não autenticado)
    24 de Maio de 2013, 16:16

     

    Eu uso uma solução baseada em uma quantidade aproximada
    de caracteres que cabem por linha, pegando uma string
    e gerando uma tabela lua onde, cada item contém
    uma parte da string que se encaixa na largura
    da área que vc tem.
    O código se preocupa em não quebrar palavras no meio.
    A partir da tabela gerada você define
    o que fará, podendo fazer um for e usar o canvas
    para exibir isso. Pode também, a partir do total de linhas da tabela,
    calcular quantas linhas cabem verticalmente na área
    e implementar um recurso de paginação.
    Não tenho um exemplo completo e pronto.
    O que tenho está assim, meio solto.

    Veja a função breakString do módulo em https://gist.github.com/manoelcampos/5645864. 

    Ela recebe uma string, vc especifica o máximo de caracteres

    que a mesma deve ter, e ela retorna uma tabela (vetor) onde cada 

    item será uma linha da string.

    Usando o código abaixo vc descobre a largura de uma caractere qualquer.

    Assim, usei o W pois é um caractere largo, assim, se tenho uma largura X e divido

    pela largura do W (a largura é considerada para o estilo e tamanho de fonte atual),

    saberei quantos caracteres caberão no máximo na região definida:

    --largura e algura do canvas (região do lua)

    local w, h = canvas:attrSize()

    --largura e altura de um caractere qualquer (pode trocar o 

    --caractere para tentar ajustar melhor)

    local tw, th = canvas:measureText("W")

    --descubro quantos caracteres caberá na região

    --(pode subtrair um valor desejado para definir bordas.

    --substraia valores até ajustar como deseja)

    local totalCharPorLinha = (w / tw)

    Agora é só chamar a função:

    linhas = util.breakString(texto, totalCharPorLinha)

    --imprimi as linhas depois de quebrar

    for i, linha in ipairs(linhas) do

        print(linha) --poderia usar canvas aqui para imprimir cada linha

    end

    Para saber quantas linhas vai caber na área, e

    assim descobrir quantas páginas terá,

    usará fórmula semelhante a que mostrei acima

    (os valores de altura e largura do canvas e de um caractere

    já tem em w, h, tw, th ).

    • 700e223ecfe69510f7bf29cd7187966b?only path=false&size=50&d=404Alysson Carvalho(usuário não autenticado)
      23 de Junho de 2013, 23:28

       

      Grande Manoel, desculpe-me pelo atraso na resposta. Venho para agradecer a sua colaboração.

      Gostaria de aproveitar para citar que já conheço o seu trabalho através do seu site. Possui muitas soluções interessantes. Gostaria de parabenizá-lo também.

      Tudo de bom para você e para todos que me auxiliaram nesta dúvida. Um grande abraço.

Concurso ITU-T de Aplicações para IPTV 2012

13 de Agosto de 2012, 19:38, por Desconhecido

Gostaríamos de lembrar aos possíveis interessados que o prazo de registro para participação no Concurso ITU-T de Aplicações para IPTV 2012 (IPTV Application Challenge) se encerra nesta semana, dia 15 de agosto de 2012. Já o prazo para a submissão de aplicações se encerra no dia 07 de setembro de 2012.



NCL Eclipse 1.6 disponível

10 de Janeiro de 2012, 21:19, por Desconhecido

Caros membros da Comunidade Ginga,



Concursos de Aplicações Ginga-NCL

22 de Setembro de 2011, 3:22, por Desconhecido

    Gostaríamos de relembra-los de que há dois concursos de aplicações Ginga-NCL com inscrições ainda abertas. O convite é aberto a toda a comunidade de desenvolvedores de aplicações para o Middleware Ginga-NCL, em nível internacional. São os seguintes concursos:



Novas versões: Ginga e Ginga-NCL Virtual Set-top Box (v.0.12.3)

1 de Agosto de 2011, 20:58, por Desconhecido



Algumas Boas Notícias da Comunidade Ginga

28 de Julho de 2011, 21:31, por Desconhecido

Autor: Roberto Azevedo