1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
--!A cross-platform build utility 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-present, Xmake Open Source Community.
--
-- @author ruki
-- @file canvas.lua
--
-- load modules
local log = require("ui/log")
local point = require("ui/point")
local object = require("ui/object")
local curses = require("ui/curses")
-- define module
local line = line or object()
local canvas = canvas or object()
-- new canvas instance
function canvas:new(view, window)
-- create instance
self = self()
-- save view and window
self._view = view
self._window = window
assert(view and window, "cannot new canvas instance without view and window!")
-- set the default attributes
self:attr()
-- done
return self
end
-- clear canvas
function canvas:clear()
self._window:clear()
return self
end
-- move canvas to the given position
function canvas:move(x, y)
self._window:move(y, x)
return self
end
-- get the current position
function canvas:pos()
local y, x = self._window:getyx()
return x, y
end
-- get the canvas size
function canvas:size()
local y, x = self._window:getmaxyx()
return point {x + 1, y + 1}
end
-- get the canvas width
function canvas:width()
local _, x = self._window:getmaxyx()
return x + 1
end
-- get the canvas height
function canvas:height()
local y, _ = self._window:getmaxyx()
return y + 1
end
-- put character to canvas
function canvas:putchar(ch, n, vertical)
-- acs character?
if type(ch) == "string" and #ch > 1 then
ch = curses.acs(ch)
end
-- draw characters
n = n or 1
if vertical then
local x, y = self:pos()
while n > 0 do
self:move(x, y)
self._window:addch(ch)
n = n - 1
y = y + 1
end
else
while n > 0 do
self._window:addch(ch)
n = n - 1
end
end
return self
end
-- put a string to canvas
function canvas:putstr(str)
self._window:addstr(str)
return self
end
-- put strings to canvas
function canvas:putstrs(strs, startline)
-- draw strings
local sy, sx = self._window:getyx()
local ey, _ = self._window:getmaxyx()
for idx = startline or 1, #strs do
local _, y = self:pos()
self._window:addstr(strs[idx])
if y + 1 < ey and idx < #strs then
self:move(sx, y + 1)
else
break
end
end
return self
end
-- set canvas attributes
--
-- set attr: canvas:attr("bold")
-- add attr: canvas:attr("bold", true)
-- remove attr: canvas:attr("bold", false)
--
function canvas:attr(attrs, modify)
-- calculate the attributes
local attr = curses.calc_attr(attrs)
if modify == nil then
self._window:attrset(attr)
elseif modify == false then
self._window:attroff(attr)
else
self._window:attron(attr)
end
return self
end
-- return module
return canvas
|