102 lines
2.4 KiB
Lua
102 lines
2.4 KiB
Lua
--!A cross-platform terminal ui library based on Lua
|
|
--
|
|
-- Licensed under the Apache License, Version 2.0 (the "License");
|
|
-- you may not use this file except in compliance with the License.
|
|
-- You may obtain a copy of the License at
|
|
--
|
|
-- http://www.apache.org/licenses/LICENSE-2.0
|
|
--
|
|
-- Unless required by applicable law or agreed to in writing, software
|
|
-- distributed under the License is distributed on an "AS IS" BASIS,
|
|
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
-- See the License for the specific language governing permissions and
|
|
-- limitations under the License.
|
|
--
|
|
-- Copyright (C) 2015 - 2018, TBOOX Open Source Group.
|
|
--
|
|
-- @author ruki
|
|
-- @file button.lua
|
|
--
|
|
|
|
-- load modules
|
|
local log = require("ltui/base/log")
|
|
local view = require("ltui/view")
|
|
local event = require("ltui/event")
|
|
local label = require("ltui/label")
|
|
local action = require("ltui/action")
|
|
local curses = require("ltui/curses")
|
|
|
|
-- define module
|
|
local button = button or label()
|
|
|
|
-- init button
|
|
function button:init(name, bounds, text, on_action)
|
|
|
|
-- init label
|
|
label.init(self, name, bounds, text)
|
|
|
|
-- mark as selectable
|
|
self:option_set("selectable", true)
|
|
|
|
-- show cursor
|
|
self:cursor_show(true)
|
|
|
|
-- init action
|
|
self:action_set(action.ac_on_enter, on_action)
|
|
end
|
|
|
|
-- draw button
|
|
function button:draw(transparent)
|
|
|
|
-- draw background
|
|
view.draw(self, transparent)
|
|
|
|
-- strip text string
|
|
local str = self:text()
|
|
if str and #str > 0 then
|
|
str = string.sub(str, 1, self:width())
|
|
end
|
|
if not str or #str == 0 then
|
|
return
|
|
end
|
|
|
|
-- get the text attribute value
|
|
local textattr = self:textattr_val()
|
|
|
|
-- selected?
|
|
if self:state("selected") and self:state("focused") then
|
|
textattr = {textattr, "reverse"}
|
|
end
|
|
|
|
-- draw text
|
|
self:canvas():attr(textattr):move(0, 0):putstr(str)
|
|
end
|
|
|
|
-- on event
|
|
function button:on_event(e)
|
|
|
|
-- selected?
|
|
if not self:state("selected") then
|
|
return
|
|
end
|
|
|
|
-- enter this button?
|
|
if e.type == event.ev_keyboard then
|
|
if e.key_name == "Enter" then
|
|
self:action_on(action.ac_on_enter)
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
|
|
-- set state
|
|
function button:state_set(name, enable)
|
|
if name == "focused" and self:state(name) ~= enable then
|
|
self:invalidate()
|
|
end
|
|
return view.state_set(self, name, enable)
|
|
end
|
|
|
|
-- return module
|
|
return button
|