diff --git a/README.md b/README.md index 073bb36..8e1534a 100644 --- a/README.md +++ b/README.md @@ -37,9 +37,9 @@ ## Introduction ([中文](/README_zh.md)) -LTUI is a cross-platform terminal ui library based on Lua. +LTUI is a cross-platform terminal ui library based on Lua. -This framework originated from the requirements of graphical menu configuration in [xmake](https://github.com/xmake-io/xmake). +This framework originated from the requirements of graphical menu configuration in [xmake](https://github.com/xmake-io/xmake). Similar to the linux kernel's menuconf to configure the compilation parameters, so using curses and lua to implement a cross-platform character terminal ui library. Refer to kconfig-frontends for style rendering. Of course, users can customize different ui styles. @@ -113,13 +113,13 @@ end demo:run() ``` -#### Label +#### Label ```lua local lab = label:new("title", rect {0, 0, 12, 1}, "hello ltui!"):textattr_set("white") ``` -#### Button +#### Button ```lua local btn = button:new("yes", rect {0, 1, 7, 2}, "< Yes >"):textattr_set("white") diff --git a/rockspec/ltui-2.7-1.rockspec b/rockspec/ltui-2.8-1.rockspec similarity index 96% rename from rockspec/ltui-2.7-1.rockspec rename to rockspec/ltui-2.8-1.rockspec index 4e79bb2..a55f89f 100644 --- a/rockspec/ltui-2.7-1.rockspec +++ b/rockspec/ltui-2.8-1.rockspec @@ -1,8 +1,8 @@ package = "ltui" -version = "2.7-1" +version = "2.8-1" source = { url = "git://github.com/tboox/ltui", - tag = "v2.7" + tag = "v8.7" } description = { detailed = [[ @@ -34,7 +34,7 @@ build = { ["ltui.action"] = "src/ltui/action.lua", ["ltui.application"] = "src/ltui/application.lua", ["ltui.base.bit"] = "src/ltui/base/bit.lua", - ["ltui.base.dlist"] = "src/ltui/base/dlist.lua", + ["ltui.base.list"] = "src/ltui/base/list.lua", ["ltui.base.log"] = "src/ltui/base/log.lua", ["ltui.base.os"] = "src/ltui/base/os.lua", ["ltui.base.path"] = "src/ltui/base/path.lua", diff --git a/src/ltui/base/dlist.lua b/src/ltui/base/list.lua similarity index 76% rename from src/ltui/base/dlist.lua rename to src/ltui/base/list.lua index adcc8d4..498581e 100644 --- a/src/ltui/base/dlist.lua +++ b/src/ltui/base/list.lua @@ -15,41 +15,26 @@ -- Copyright (C) 2015-2020, TBOOX Open Source Group. -- -- @author ruki --- @file dlist.lua +-- @file list.lua -- -- load modules local object = require("ltui/object") -- define module -local dlist = dlist or object { _init = {"_length"} } {0} +local list = list or object { _init = {"_length"} } {0} -- clear list -function dlist:clear() +function list:clear() self._length = 0 self._first = nil self._last = nil end --- push item to tail -function dlist:push(t) - assert(t) - if self._last then - self._last._next = t - t._prev = self._last - self._last = t - else - self._first = t - self._last = t - end - self._length = self._length + 1 -end - -- insert item after the given item -function dlist:insert(t, after) - assert(t) +function list:insert(t, after) if not after then - return self:push(t) + return self:insert_last(t) end assert(t ~= after) if after._next then @@ -63,41 +48,8 @@ function dlist:insert(t, after) self._length = self._length + 1 end --- pop item from tail -function dlist:pop() - if not self._last then return end - local t = self._last - if t._prev then - t._prev._next = nil - self._last = t._prev - t._prev = nil - else - self._first = nil - self._last = nil - end - self._length = self._length - 1 - return t -end - --- shift item: 1 2 3 <- 2 3 -function dlist:shift() - if not self._first then return end - local t = self._first - if t._next then - t._next._prev = nil - self._first = t._next - t._next = nil - else - self._first = nil - self._last = nil - end - self._length = self._length - 1 - return t -end - --- unshift item: 1 2 -> t 1 2 -function dlist:unshift(t) - assert(t) +-- insert the first item in head +function list:insert_first(t) if self._first then self._first._prev = t t._next = self._first @@ -109,9 +61,21 @@ function dlist:unshift(t) self._length = self._length + 1 end +-- insert the last item in tail +function list:insert_last(t) + if self._last then + self._last._next = t + t._prev = self._last + self._last = t + else + self._first = t + self._last = t + end + self._length = self._length + 1 +end + -- remove item -function dlist:remove(t) - assert(t) +function list:remove(t) if t._next then if t._prev then t._next._prev = t._prev @@ -136,18 +100,74 @@ function dlist:remove(t) return t end +-- remove the first item +function list:remove_first() + if not self._first then + return + end + local t = self._first + if t._next then + t._next._prev = nil + self._first = t._next + t._next = nil + else + self._first = nil + self._last = nil + end + self._length = self._length - 1 + return t +end + +-- remove last item +function list:remove_last() + if not self._last then + return + end + local t = self._last + if t._prev then + t._prev._next = nil + self._last = t._prev + t._prev = nil + else + self._first = nil + self._last = nil + end + self._length = self._length - 1 + return t +end + +-- push item to tail +function list:push(t) + self:insert_last(t) +end + +-- pop item from tail +function list:pop() + self:remove_last() +end + +-- shift item: 1 2 3 <- 2 3 +function list:shift() + self:remove_first() +end + +-- unshift item: 1 2 -> t 1 2 +function list:unshift(t) + self:insert_first(t) +end + -- get first item -function dlist:first() +function list:first() return self._first end -- get last item -function dlist:last() +function list:last() return self._last end -- get next item -function dlist:next(last) +function list:next(last) if last then return last._next else @@ -156,7 +176,7 @@ function dlist:next(last) end -- get the previous item -function dlist:prev(last) +function list:prev(last) if last then return last._prev else @@ -165,45 +185,42 @@ function dlist:prev(last) end -- get list size -function dlist:size() +function list:size() return self._length end -- is empty? -function dlist:empty() +function list:empty() return self:size() == 0 end -- get items -- --- .e.g +-- e.g. -- --- for item in dlist:items() do +-- for item in list:items() do -- print(item) -- end -- -function dlist:items() - - -- init iterator +function list:items() local iter = function (list, item) return list:next(item) end - - -- return iterator and initialized state return iter, self, nil end -- get reverse items -function dlist:ritems() - - -- init iterator +function list:ritems() local iter = function (list, item) return list:prev(item) end - - -- return iterator and initialized state return iter, self, nil end --- return module: dlist -return dlist +-- new list +function list.new() + return list() +end + +-- return module: list +return list diff --git a/src/ltui/panel.lua b/src/ltui/panel.lua index 87c22dd..47df195 100644 --- a/src/ltui/panel.lua +++ b/src/ltui/panel.lua @@ -25,7 +25,7 @@ local rect = require("ltui/rect") local event = require("ltui/event") local point = require("ltui/point") local curses = require("ltui/curses") -local dlist = require("ltui/base/dlist") +local list = require("ltui/base/list") local action = require("ltui/action") -- define module @@ -44,7 +44,7 @@ function panel:init(name, bounds) self:option_set("selectable", true) -- init child views - self._VIEWS = dlist() + self._VIEWS = list() -- init views cache self._VIEWS_CACHE = {}