Skip to content

Commit

Permalink
update list
Browse files Browse the repository at this point in the history
  • Loading branch information
waruqi committed Apr 9, 2024
1 parent 285053d commit 184fb85
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 86 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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")
Expand Down
6 changes: 3 additions & 3 deletions rockspec/ltui-2.7-1.rockspec → rockspec/ltui-2.8-1.rockspec
Original file line number Diff line number Diff line change
@@ -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 = [[
Expand Down Expand Up @@ -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",
Expand Down
171 changes: 94 additions & 77 deletions src/ltui/base/dlist.lua → src/ltui/base/list.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
4 changes: 2 additions & 2 deletions src/ltui/panel.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 = {}
Expand Down

0 comments on commit 184fb85

Please sign in to comment.