new windows types
This commit is contained in:
@@ -6,81 +6,28 @@ module UI
|
||||
|
||||
# Game catalog browser. Left=titles, right=card with story + links.
|
||||
def games(app, services:)
|
||||
cols = app.cols
|
||||
rows = app.rows
|
||||
w = cols - 4
|
||||
h = rows - 6
|
||||
window = BBS::Window.new(title: ' Game Catalog ')
|
||||
window.layout(3, 3, w, h)
|
||||
window.theme = app.theme
|
||||
|
||||
games = services[:games].all
|
||||
|
||||
list = BBS::Widgets::ListBox.new(
|
||||
items: games,
|
||||
label: ->(g) { " #{g.title}".ljust(26) }
|
||||
BBS::Windows::MasterDetail.open(app,
|
||||
title: ' Game Catalog ',
|
||||
items: services[:games].all,
|
||||
item_label: ->(g) { g.title },
|
||||
list_width: 30,
|
||||
empty_message: ' (no games)',
|
||||
render_detail: ->(game, width) { game_card_lines(game, width) }
|
||||
)
|
||||
list_width = 30
|
||||
list.layout(window.bounds.x + 2, window.bounds.y + 2, list_width, h - 5)
|
||||
window.add(list)
|
||||
|
||||
card = BBS::Widgets::ScrollView.new(lines: [])
|
||||
card_x = window.bounds.x + list_width + 4
|
||||
card_w = w - list_width - 7
|
||||
card.layout(card_x, window.bounds.y + 2, card_w, h - 7)
|
||||
window.add(card)
|
||||
|
||||
load_card = lambda do
|
||||
game = list.selected_item
|
||||
if game.nil?
|
||||
card.lines = [' (no games)']
|
||||
next
|
||||
end
|
||||
lines = []
|
||||
lines << " \e[1;33m#{game.title}\e[0m"
|
||||
lines << " \e[0;36m#{game.platform} · #{game.author}\e[0m"
|
||||
lines << ''
|
||||
wrap_para(game.desc.to_s, card_w - 4).each { |l| lines << " #{l}" }
|
||||
lines << ''
|
||||
wrap_para(game.story.to_s, card_w - 4).each { |l| lines << " #{l}" }
|
||||
lines << ''
|
||||
game.external_links.each do |link|
|
||||
lines << " \e[0;37m#{link[:label].ljust(10)}\e[0m \e[1;36m#{link[:url]}\e[0m"
|
||||
end
|
||||
card.lines = lines
|
||||
card.scroll = 0
|
||||
end
|
||||
|
||||
list.on_select = ->(_, _) { load_card.call }
|
||||
|
||||
close = BBS::Widgets::Button.new(label: '&Close',
|
||||
on_click: ->(_) { app.close_window(window) })
|
||||
close.layout(window.bounds.x + w - 11, window.bounds.y + h - 2, 9, 1)
|
||||
window.add(close)
|
||||
|
||||
load_card.call
|
||||
window.reset_focus
|
||||
window.focus_manager.focus(list)
|
||||
app.open_window(window)
|
||||
window
|
||||
end
|
||||
|
||||
def wrap_para(text, width)
|
||||
return [] if text.empty?
|
||||
words = text.split
|
||||
def game_card_lines(game, width)
|
||||
lines = []
|
||||
cur = +''
|
||||
words.each do |w|
|
||||
if cur.empty?
|
||||
cur << w
|
||||
elsif cur.length + 1 + w.length <= width
|
||||
cur << ' ' << w
|
||||
else
|
||||
lines << cur.dup
|
||||
cur = +w
|
||||
end
|
||||
lines << " \e[1;33m#{game.title}\e[0m"
|
||||
lines << " \e[0;36m#{game.platform} · #{game.author}\e[0m"
|
||||
lines << ''
|
||||
BBS::FrameBuffer.wrap_ansi(game.desc.to_s, width - 4).each { |l| lines << " #{l}" }
|
||||
lines << ''
|
||||
BBS::FrameBuffer.wrap_ansi(game.story.to_s, width - 4).each { |l| lines << " #{l}" }
|
||||
lines << ''
|
||||
game.external_links.each do |link|
|
||||
lines << " \e[0;37m#{link[:label].ljust(10)}\e[0m \e[1;36m#{link[:url]}\e[0m"
|
||||
end
|
||||
lines << cur unless cur.empty?
|
||||
lines
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user