Start implementing common widgets for lua screens.
parent
33bd8103de
commit
abfe2754fb
@ -0,0 +1,80 @@
|
||||
-- Simple widgets for screens
|
||||
|
||||
local _ENV = mkmodule('gui.widgets')
|
||||
|
||||
local gui = require('gui')
|
||||
local utils = require('utils')
|
||||
|
||||
local dscreen = dfhack.screen
|
||||
|
||||
------------
|
||||
-- Widget --
|
||||
------------
|
||||
|
||||
Widget = defclass(Widget, gui.View)
|
||||
|
||||
Widget.ATTRS {
|
||||
frame = DEFAULT_NIL,
|
||||
frame_inset = DEFAULT_NIL,
|
||||
frame_background = DEFAULT_NIL,
|
||||
}
|
||||
|
||||
function Widget:computeFrame(parent_rect)
|
||||
local sw, sh = parent_rect.width, parent_rect.height
|
||||
return gui.compute_frame_body(sw, sh, self.frame, self.frame_inset)
|
||||
end
|
||||
|
||||
function Widget:render(dc)
|
||||
if self.frame_background then
|
||||
dc:fill(self.frame_rect, self.frame_background)
|
||||
end
|
||||
|
||||
Widget.super.render(self, dc)
|
||||
end
|
||||
|
||||
----------------
|
||||
-- Edit field --
|
||||
----------------
|
||||
|
||||
EditField = defclass(EditField, Widget)
|
||||
|
||||
EditField.ATTRS{
|
||||
text = '',
|
||||
text_pen = DEFAULT_NIL,
|
||||
on_char = DEFAULT_NIL,
|
||||
on_change = DEFAULT_NIL,
|
||||
}
|
||||
|
||||
function EditField:onRenderBody(dc)
|
||||
dc:pen(self.text_pen or COLOR_LIGHTCYAN):fill(0,0,dc.width-1,0)
|
||||
|
||||
local cursor = '_'
|
||||
if not self.active or gui.blink_visible(300) then
|
||||
cursor = ' '
|
||||
end
|
||||
local txt = self.text .. cursor
|
||||
if #txt > dc.width then
|
||||
txt = string.char(27)..string.sub(txt, #txt-dc.width+2)
|
||||
end
|
||||
dc:string(txt)
|
||||
end
|
||||
|
||||
function EditField:onInput(keys)
|
||||
if keys._STRING then
|
||||
local old = self.text
|
||||
if keys._STRING == 0 then
|
||||
self.text = string.sub(old, 1, #old-1)
|
||||
else
|
||||
local cv = string.char(keys._STRING)
|
||||
if not self.on_char or self.on_char(cv, old) then
|
||||
self.text = old .. cv
|
||||
end
|
||||
end
|
||||
if self.on_change and self.text ~= old then
|
||||
self.on_change(self.text, old)
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return _ENV
|
Loading…
Reference in New Issue