2014-01-13 2 views
1

Я считаю, что мне нужен элемент, который содержит некоторый объем текста, который не имеет фиксированного размера (журнал предпринятых действий), где этот элемент имеет фиксированный размер. Делая очевидную вещь получает нежелательные результаты:Текст переполнения текста Elm: размер переполнения скрытый или прокрутка

http://ikeran.org/images/overflow2.png

Код, я использую:

renderLog w h log = 
    let rh = truncate ((toFloat h) * 0.2) 
     contents = map (\m -> Text.text <| Text.height 12 <| Text.toText m) log 
     d = flow down contents in 
    size w rh d 

Я бы ожидать, что «размер» вызов отрезать содержимое в этом размере. Это не так. Это неудивительно, когда вы достаточно знакомы с HTML - по умолчанию overflow - visible.

Если бы я использовал CSS, я мог бы просто установить overflow на hidden или scroll и продолжить свой весёлый путь. Есть ли рекомендуемый способ выполнения этого с Elm?

ответ

1

Единственный способ, которым я знаю, довольно низкоуровневый. То, что вы можете сделать, это вставить те строки текста в журнал, пока вы не закончите пространство, которое вы хотели использовать. I got this idea from the mailing list.

renderLog w h log = 
    let contents = map (\m -> width w <| Text.text <| Text.height 12 <| Text.toText m) log 
     heights = filter (\n -> n <= h) <| scanl1 (+) <| map heightOf contents 
     d = flow down <| take (length heights) contents 
    in height h d 

Что вы делаете, это заставить каждую часть текста уже иметь правильную ширину. Это гарантирует, что когда вы затем измеряете высоту, это будет высота, которую она имеет в журнале.
Затем вы измеряете каждую из высот и находите, когда сумма высот становится больше заданного параметра h. Принимая только текстовые элементы до того, когда это произойдет, вы убедитесь, что ваш журнал не переполняется.

Вот пример использования: http://share-elm.com/sprout/52da7873e4b06194fd2d4149

Смежные вопросы