diff options
Diffstat (limited to 'xmake/modules/utils')
| -rw-r--r-- | xmake/modules/utils/progress.lua | 101 | ||||
| -rw-r--r-- | xmake/modules/utils/waiting_indicator.lua | 83 |
2 files changed, 128 insertions, 56 deletions
diff --git a/xmake/modules/utils/progress.lua b/xmake/modules/utils/progress.lua index 60066ddc5..b6201d5cc 100644 --- a/xmake/modules/utils/progress.lua +++ b/xmake/modules/utils/progress.lua @@ -20,63 +20,23 @@ -- imports import("core.base.option") -import("core.base.object") import("core.base.colors") import("core.base.tty") import("core.base.scheduler") import("core.theme.theme") import("core.project.project") --- define module -local progress = progress or object { _init = { "_RUNNING", "_INDEX", "_STREAM", "_OPT" } } - -- cache color strings local COLOR_SUPERSLOW = "${color.build.progress_superslow}" local COLOR_VERYSLOW = "${color.build.progress_veryslow}" local COLOR_SLOW = "${color.build.progress_slow}" --- stop the progress indicator, clear written frames -function progress:stop() - if self._RUNNING ~= 0 then - self:clear() - self._RUNNING = 0 - self._INDEX = 0 - end -end - -function progress:_clear() - if self._RUNNING == 1 then - tty.erase_line_to_end() - self._RUNNING = 2 - return true - end -end - --- clear previous frame of the progress indicator -function progress:clear() - if self:_clear() then - self._STREAM:flush() - end -end - --- write next frame of the progress indicator -function progress:write() - local chars = self._OPT.chars[self._INDEX % #self._OPT.chars + 1] - tty.cursor_and_attrs_save() - self._STREAM:write(chars) - self._STREAM:flush() - tty.cursor_and_attrs_restore() - self._INDEX = self._INDEX + 1 - self._RUNNING = 1 -end - --- check if the progress indicator is running -function progress:running() - return self._RUNNING and true or false -end - -- is scroll output? function _is_scroll() + -- if style is forced, use it + if _g.forced_style then + return _g.forced_style == "scroll" + end local is_scroll = _g.is_scroll if is_scroll == nil then local style = project.policy("build.progress_style") or theme.get("text.build.progress_style") or "scroll" @@ -90,6 +50,10 @@ end -- is multi-row refresh output? function _is_multirow_refresh() + -- if style is forced, use it + if _g.forced_style then + return _g.forced_style == "multirow" + end local is_multirow_refresh = _g.is_multirow_refresh if is_multirow_refresh == nil then local style = project.policy("build.progress_style") or theme.get("text.build.progress_style") @@ -103,6 +67,10 @@ end -- is single-row refresh output? function _is_singlerow_refresh() + -- if style is forced, use it + if _g.forced_style then + return _g.forced_style == "singlerow" + end local is_singlerow_refresh = _g.is_singlerow_refresh if is_singlerow_refresh == nil then local style = project.policy("build.progress_style") or theme.get("text.build.progress_style") @@ -114,6 +82,39 @@ function _is_singlerow_refresh() return is_singlerow_refresh end +-- set progress style (temporarily override the current style) +-- @param style "scroll", "singlerow", or "multirow" +function set_style(style) + -- save the original style if not already saved + if not _g.saved_style then + -- get current effective style + if _is_multirow_refresh() then + _g.saved_style = "multirow" + elseif _is_singlerow_refresh() then + _g.saved_style = "singlerow" + else + _g.saved_style = "scroll" + end + end + + -- set forced style + _g.forced_style = style + -- clear cached flags to force recalculation + _g.is_scroll = nil + _g.is_multirow_refresh = nil + _g.is_singlerow_refresh = nil +end + +-- restore progress style (restore the original style from project policy) +function restore_style() + _g.forced_style = nil + _g.saved_style = nil + -- clear cached flags to force recalculation + _g.is_scroll = nil + _g.is_multirow_refresh = nil + _g.is_singlerow_refresh = nil +end + -- get progress prefix function _get_progress_prefix() if not _g.progress_prefix then @@ -475,15 +476,3 @@ function text(progress, format, ...) end end --- build a progress indicator --- @params stream - stream to write to, will use io.stdout if not provided --- @params opt - options --- - chars - an array of chars for progress indicator -function new(stream, opt) - stream = stream or io.stdout - opt = opt or {} - if opt.chars == nil or #opt.chars == 0 then - opt.chars = theme.get("text.spinner.chars") - end - return progress {_OPT = opt, _STREAM = stream, _RUNNING = 0, _INDEX = 0} -end diff --git a/xmake/modules/utils/waiting_indicator.lua b/xmake/modules/utils/waiting_indicator.lua new file mode 100644 index 000000000..afa5cfb6d --- /dev/null +++ b/xmake/modules/utils/waiting_indicator.lua @@ -0,0 +1,83 @@ +--!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 waiting_indicator.lua +-- + +-- imports +import("core.base.object") +import("core.base.tty") +import("core.theme.theme") + +-- define module +local waiting_indicator = waiting_indicator or object { _init = { "_RUNNING", "_INDEX", "_STREAM", "_OPT" } } + +-- stop the waiting indicator, clear written frames +function waiting_indicator:stop() + if self._RUNNING ~= 0 then + self:clear() + self._RUNNING = 0 + self._INDEX = 0 + end +end + +function waiting_indicator:_clear() + if self._RUNNING == 1 then + tty.erase_line_to_end() + self._RUNNING = 2 + return true + end +end + +-- clear previous frame of the waiting indicator +function waiting_indicator:clear() + if self:_clear() then + self._STREAM:flush() + end +end + +-- write next frame of the waiting indicator +function waiting_indicator:write() + local chars = self._OPT.chars[self._INDEX % #self._OPT.chars + 1] + tty.cursor_and_attrs_save() + self._STREAM:write(chars) + self._STREAM:flush() + tty.cursor_and_attrs_restore() + self._INDEX = self._INDEX + 1 + self._RUNNING = 1 +end + +-- check if the waiting indicator is running +function waiting_indicator:running() + return self._RUNNING and true or false +end + +-- build a waiting indicator +-- @params stream - stream to write to, will use io.stdout if not provided +-- @params opt - options +-- - chars - an array of chars for waiting indicator +function new(stream, opt) + stream = stream or io.stdout + opt = opt or {} + if opt.chars == nil or #opt.chars == 0 then + opt.chars = theme.get("text.spinner.chars") + end + return waiting_indicator {_OPT = opt, _STREAM = stream, _RUNNING = 0, _INDEX = 0} +end + +return {new = new} + |
