mirror of https://github.com/aristocratos/bpytop
Changed: Size constraints now adapts to currently shown boxes
parent
97bf3a3a3a
commit
3685a27522
67
bpytop.py
67
bpytop.py
|
@ -639,30 +639,49 @@ class Term:
|
||||||
mouse_direct_on = "\033[?1003h" #* Enable reporting of mouse position at any movement
|
mouse_direct_on = "\033[?1003h" #* Enable reporting of mouse position at any movement
|
||||||
mouse_direct_off = "\033[?1003l" #* Disable direct mouse reporting
|
mouse_direct_off = "\033[?1003l" #* Disable direct mouse reporting
|
||||||
winch = threading.Event()
|
winch = threading.Event()
|
||||||
|
old_boxes: List = []
|
||||||
|
min_width: int = 0
|
||||||
|
min_height: int = 0
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def refresh(cls, *args, force: bool = False):
|
def refresh(cls, *args, force: bool = False):
|
||||||
"""Update width, height and set resized flag if terminal has been resized"""
|
"""Update width, height and set resized flag if terminal has been resized"""
|
||||||
|
if Init.running: cls.resized = False; return
|
||||||
if cls.resized: cls.winch.set(); return
|
if cls.resized: cls.winch.set(); return
|
||||||
cls._w, cls._h = os.get_terminal_size()
|
cls._w, cls._h = os.get_terminal_size()
|
||||||
if (cls._w, cls._h) == (cls.width, cls.height) and not force: return
|
if (cls._w, cls._h) == (cls.width, cls.height) and cls.old_boxes == Box.boxes and not force: return
|
||||||
if force: Collector.collect_interrupt = True
|
if force: Collector.collect_interrupt = True
|
||||||
while (cls._w, cls._h) != (cls.width, cls.height) or (cls._w < 80 or cls._h < 24):
|
if cls.old_boxes != Box.boxes:
|
||||||
|
w_p = h_p = 0
|
||||||
|
cls.min_width = cls.min_height = 0
|
||||||
|
cls.old_boxes = Box.boxes.copy()
|
||||||
|
for box_class in Box.__subclasses__():
|
||||||
|
for box_name in Box.boxes:
|
||||||
|
if box_name in str(box_class).capitalize():
|
||||||
|
if not (box_name == "cpu" and "proc" in Box.boxes) and not (box_name == "net" and "mem" in Box.boxes) and w_p + box_class.width_p <= 100:
|
||||||
|
w_p += box_class.width_p
|
||||||
|
cls.min_width += getattr(box_class, "min_w", 0)
|
||||||
|
if not (box_name in ["mem", "net"] and "proc" in Box.boxes) and h_p + box_class.height_p <= 100:
|
||||||
|
h_p += box_class.height_p
|
||||||
|
cls.min_height += getattr(box_class, "min_h", 0)
|
||||||
|
while (cls._w, cls._h) != (cls.width, cls.height) or (cls._w < cls.min_width or cls._h < cls.min_height):
|
||||||
if Init.running: Init.resized = True
|
if Init.running: Init.resized = True
|
||||||
CpuBox.clock_block = True
|
CpuBox.clock_block = True
|
||||||
cls.resized = True
|
cls.resized = True
|
||||||
Collector.collect_interrupt = True
|
Collector.collect_interrupt = True
|
||||||
cls.width, cls.height = cls._w, cls._h
|
cls.width, cls.height = cls._w, cls._h
|
||||||
Draw.now(Term.clear)
|
Draw.now(Term.clear)
|
||||||
Draw.now(f'{create_box(cls._w // 2 - 25, cls._h // 2 - 2, 50, 3, "resizing", line_color=Colors.green, title_color=Colors.white)}',
|
box_width = min(50, cls._w - 2)
|
||||||
f'{Mv.r(12)}{Colors.default}{Colors.black_bg}{Fx.b}Width : {cls._w} Height: {cls._h}{Fx.ub}{Term.bg}{Term.fg}')
|
Draw.now(f'{create_box(cls._w // 2 - box_width // 2, cls._h // 2 - 2, 50, 3, "resizing", line_color=Colors.green, title_color=Colors.white)}',
|
||||||
|
f'{Mv.r(box_width // 4)}{Colors.default}{Colors.black_bg}{Fx.b}Width : {cls._w} Height: {cls._h}{Fx.ub}{Term.bg}{Term.fg}')
|
||||||
if cls._w < 80 or cls._h < 24:
|
if cls._w < 80 or cls._h < 24:
|
||||||
while cls._w < 80 or cls._h < 24:
|
while cls._w < cls.min_width or cls._h < cls.min_height:
|
||||||
Draw.now(Term.clear)
|
Draw.now(Term.clear)
|
||||||
Draw.now(f'{create_box(cls._w // 2 - 25, cls._h // 2 - 2, 50, 4, "warning", line_color=Colors.red, title_color=Colors.white)}',
|
box_width = min(50, cls._w - 2)
|
||||||
f'{Mv.r(12)}{Colors.default}{Colors.black_bg}{Fx.b}Width: {Colors.red if cls._w < 80 else Colors.green}{cls._w} ',
|
Draw.now(f'{create_box(cls._w // 2 - box_width // 2, cls._h // 2 - 2, box_width, 4, "warning", line_color=Colors.red, title_color=Colors.white)}',
|
||||||
f'{Colors.default}Height: {Colors.red if cls._h < 24 else Colors.green}{cls._h}{Term.bg}{Term.fg}',
|
f'{Mv.r(box_width // 4)}{Colors.default}{Colors.black_bg}{Fx.b}Width: {Colors.red if cls._w < cls.min_width else Colors.green}{cls._w} ',
|
||||||
f'{Mv.to(cls._h // 2, cls._w // 2 - 23)}{Colors.default}{Colors.black_bg}Width and Height needs to be at least 80 x 24 !{Fx.ub}{Term.bg}{Term.fg}')
|
f'{Colors.default}Height: {Colors.red if cls._h < cls.min_height else Colors.green}{cls._h}{Term.bg}{Term.fg}',
|
||||||
|
f'{Mv.d(1)}{Mv.l(25)}{Colors.default}{Colors.black_bg}Current config need: {cls.min_width} x {cls.min_height}{Fx.ub}{Term.bg}{Term.fg}')
|
||||||
cls.winch.wait(0.3)
|
cls.winch.wait(0.3)
|
||||||
cls.winch.clear()
|
cls.winch.clear()
|
||||||
cls._w, cls._h = os.get_terminal_size()
|
cls._w, cls._h = os.get_terminal_size()
|
||||||
|
@ -674,7 +693,6 @@ class Term:
|
||||||
Key.mouse = {}
|
Key.mouse = {}
|
||||||
Box.calc_sizes()
|
Box.calc_sizes()
|
||||||
Collector.proc_counter = 1
|
Collector.proc_counter = 1
|
||||||
if Init.running: cls.resized = False; return
|
|
||||||
if Menu.active: Menu.resized = True
|
if Menu.active: Menu.resized = True
|
||||||
Box.draw_bg(now=False)
|
Box.draw_bg(now=False)
|
||||||
cls.resized = False
|
cls.resized = False
|
||||||
|
@ -1685,9 +1703,10 @@ class Box:
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def empty_bg(cls) -> str:
|
def empty_bg(cls) -> str:
|
||||||
return (f'{Term.clear}{Banner.draw(Term.height // 2 - 10, center=True)}'
|
return (f'{Term.clear}' +
|
||||||
|
(f'{Banner.draw(Term.height // 2 - 10, center=True)}'
|
||||||
f'{Mv.d(1)}{Mv.l(46)}{Colors.black_bg}{Colors.default}{Fx.b}[esc] Menu'
|
f'{Mv.d(1)}{Mv.l(46)}{Colors.black_bg}{Colors.default}{Fx.b}[esc] Menu'
|
||||||
f'{Mv.r(25)}{Fx.i}Version: {VERSION}{Fx.ui}'
|
f'{Mv.r(25)}{Fx.i}Version: {VERSION}{Fx.ui}' if Term.height > 22 else "") +
|
||||||
f'{Mv.d(1)}{Mv.l(34)}{Fx.b}All boxes hidden!'
|
f'{Mv.d(1)}{Mv.l(34)}{Fx.b}All boxes hidden!'
|
||||||
f'{Mv.d(1)}{Mv.l(17)}{Fx.b}[1] {Fx.ub}Toggle CPU box'
|
f'{Mv.d(1)}{Mv.l(17)}{Fx.b}[1] {Fx.ub}Toggle CPU box'
|
||||||
f'{Mv.d(1)}{Mv.l(18)}{Fx.b}[2] {Fx.ub}Toggle MEM box'
|
f'{Mv.d(1)}{Mv.l(18)}{Fx.b}[2] {Fx.ub}Toggle MEM box'
|
||||||
|
@ -1723,6 +1742,8 @@ class CpuBox(Box, SubBox):
|
||||||
y = 1
|
y = 1
|
||||||
height_p = 32
|
height_p = 32
|
||||||
width_p = 100
|
width_p = 100
|
||||||
|
min_w: int = 60
|
||||||
|
min_h: int = 8
|
||||||
resized: bool = True
|
resized: bool = True
|
||||||
redraw: bool = False
|
redraw: bool = False
|
||||||
buffer: str = "cpu"
|
buffer: str = "cpu"
|
||||||
|
@ -1905,7 +1926,7 @@ class CpuBox(Box, SubBox):
|
||||||
out += f'{Mv.to(y, x)}{Graphs.cpu["up"](None if cls.resized else cpu.cpu_upper[-1])}'
|
out += f'{Mv.to(y, x)}{Graphs.cpu["up"](None if cls.resized else cpu.cpu_upper[-1])}'
|
||||||
if mid_line:
|
if mid_line:
|
||||||
out += (f'{Mv.to(y+hh, x-1)}{THEME.cpu_box(Symbol.title_right)}{THEME.div_line}{Symbol.h_line * (w - bw - 3)}{THEME.div_line(Symbol.title_left)}'
|
out += (f'{Mv.to(y+hh, x-1)}{THEME.cpu_box(Symbol.title_right)}{THEME.div_line}{Symbol.h_line * (w - bw - 3)}{THEME.div_line(Symbol.title_left)}'
|
||||||
f'{Mv.to(y+hh, x+((w-bw)//2)-((len(CONFIG.cpu_graph_upper)+len(CONFIG.cpu_graph_lower))//2))}{THEME.main_fg}{CONFIG.cpu_graph_upper}{Mv.r(1)}▲▼{Mv.r(1)}{CONFIG.cpu_graph_lower}')
|
f'{Mv.to(y+hh, x+((w-bw)//2)-((len(CONFIG.cpu_graph_upper)+len(CONFIG.cpu_graph_lower))//2)-4)}{THEME.main_fg}{CONFIG.cpu_graph_upper}{Mv.r(1)}▲▼{Mv.r(1)}{CONFIG.cpu_graph_lower}')
|
||||||
if not CONFIG.cpu_single_graph and Graphs.cpu.get("down"):
|
if not CONFIG.cpu_single_graph and Graphs.cpu.get("down"):
|
||||||
out += f'{Mv.to(y + hh + (1 * mid_line), x)}{Graphs.cpu["down"](None if cls.resized else cpu.cpu_lower[-1])}'
|
out += f'{Mv.to(y + hh + (1 * mid_line), x)}{Graphs.cpu["down"](None if cls.resized else cpu.cpu_lower[-1])}'
|
||||||
out += (f'{THEME.main_fg}{Mv.to(by + cy, bx + cx)}{Fx.b}{"CPU "}{Fx.ub}{Meters.cpu(cpu.cpu_usage[0][-1])}'
|
out += (f'{THEME.main_fg}{Mv.to(by + cy, bx + cx)}{Fx.b}{"CPU "}{Fx.ub}{Meters.cpu(cpu.cpu_usage[0][-1])}'
|
||||||
|
@ -1967,6 +1988,8 @@ class MemBox(Box):
|
||||||
num = 2
|
num = 2
|
||||||
height_p = 38
|
height_p = 38
|
||||||
width_p = 45
|
width_p = 45
|
||||||
|
min_w: int = 36
|
||||||
|
min_h: int = 10
|
||||||
x = 1
|
x = 1
|
||||||
y = 1
|
y = 1
|
||||||
mem_meter: int = 0
|
mem_meter: int = 0
|
||||||
|
@ -2008,6 +2031,7 @@ class MemBox(Box):
|
||||||
|
|
||||||
cls.width = round(Term.width * width_p / 100)
|
cls.width = round(Term.width * width_p / 100)
|
||||||
cls.height = round(Term.height * height_p / 100) + 1
|
cls.height = round(Term.height * height_p / 100) + 1
|
||||||
|
if cls.height + Box._b_cpu_h > Term.height: cls.height = Term.height - Box._b_cpu_h
|
||||||
Box._b_mem_h = cls.height
|
Box._b_mem_h = cls.height
|
||||||
cls.y = Box._b_cpu_h + 1
|
cls.y = Box._b_cpu_h + 1
|
||||||
if CONFIG.show_disks:
|
if CONFIG.show_disks:
|
||||||
|
@ -2157,6 +2181,7 @@ class MemBox(Box):
|
||||||
|
|
||||||
big_mem: bool = cls.mem_width > 21
|
big_mem: bool = cls.mem_width > 21
|
||||||
for name in cls.mem_names:
|
for name in cls.mem_names:
|
||||||
|
if cy > h - 1: break
|
||||||
if Collector.collect_interrupt: return
|
if Collector.collect_interrupt: return
|
||||||
if cls.mem_size > 2:
|
if cls.mem_size > 2:
|
||||||
out += (f'{Mv.to(y+cy, x+cx)}{gli}{name.capitalize()[:None if big_mem else 5]+":":<{1 if big_mem else 6.6}}{Mv.to(y+cy, x+cx + cls.mem_width - 3 - (len(mem.string[name])))}{Fx.trans(mem.string[name])}'
|
out += (f'{Mv.to(y+cy, x+cx)}{gli}{name.capitalize()[:None if big_mem else 5]+":":<{1 if big_mem else 6.6}}{Mv.to(y+cy, x+cx + cls.mem_width - 3 - (len(mem.string[name])))}{Fx.trans(mem.string[name])}'
|
||||||
|
@ -2174,6 +2199,7 @@ class MemBox(Box):
|
||||||
out += f'{Mv.to(y+cy, x+cx)}{THEME.title}{Fx.b}Swap:{mem.swap_string["total"]:>{cls.mem_width - 8}}{Fx.ub}{THEME.main_fg}'
|
out += f'{Mv.to(y+cy, x+cx)}{THEME.title}{Fx.b}Swap:{mem.swap_string["total"]:>{cls.mem_width - 8}}{Fx.ub}{THEME.main_fg}'
|
||||||
cy += 1
|
cy += 1
|
||||||
for name in cls.swap_names:
|
for name in cls.swap_names:
|
||||||
|
if cy > h - 1: break
|
||||||
if Collector.collect_interrupt: return
|
if Collector.collect_interrupt: return
|
||||||
if cls.mem_size > 2:
|
if cls.mem_size > 2:
|
||||||
out += (f'{Mv.to(y+cy, x+cx)}{gli}{name.capitalize()[:None if big_mem else 5]+":":<{1 if big_mem else 6.6}}{Mv.to(y+cy, x+cx + cls.mem_width - 3 - (len(mem.swap_string[name])))}{Fx.trans(mem.swap_string[name])}'
|
out += (f'{Mv.to(y+cy, x+cx)}{gli}{name.capitalize()[:None if big_mem else 5]+":":<{1 if big_mem else 6.6}}{Mv.to(y+cy, x+cx + cls.mem_width - 3 - (len(mem.swap_string[name])))}{Fx.trans(mem.swap_string[name])}'
|
||||||
|
@ -2255,6 +2281,8 @@ class NetBox(Box, SubBox):
|
||||||
num = 3
|
num = 3
|
||||||
height_p = 30
|
height_p = 30
|
||||||
width_p = 45
|
width_p = 45
|
||||||
|
min_w: int = 36
|
||||||
|
min_h: int = 6
|
||||||
x = 1
|
x = 1
|
||||||
y = 1
|
y = 1
|
||||||
resized: bool = True
|
resized: bool = True
|
||||||
|
@ -2360,6 +2388,8 @@ class ProcBox(Box):
|
||||||
num = 4
|
num = 4
|
||||||
height_p = 68
|
height_p = 68
|
||||||
width_p = 55
|
width_p = 55
|
||||||
|
min_w: int = 44
|
||||||
|
min_h: int = 16
|
||||||
x = 1
|
x = 1
|
||||||
y = 1
|
y = 1
|
||||||
current_y: int = 0
|
current_y: int = 0
|
||||||
|
@ -3925,6 +3955,9 @@ class Menu:
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def main(cls):
|
def main(cls):
|
||||||
|
if Term.width < 80 or Term.height < 24:
|
||||||
|
errlog.warning(f'The menu system only works on a terminal size of 80x24 or above!')
|
||||||
|
return
|
||||||
out: str = ""
|
out: str = ""
|
||||||
banner: str = ""
|
banner: str = ""
|
||||||
redraw: bool = True
|
redraw: bool = True
|
||||||
|
@ -4028,6 +4061,9 @@ class Menu:
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def help(cls):
|
def help(cls):
|
||||||
|
if Term.width < 80 or Term.height < 24:
|
||||||
|
errlog.warning(f'The menu system only works on a terminal size of 80x24 or above!')
|
||||||
|
return
|
||||||
out: str = ""
|
out: str = ""
|
||||||
out_misc : str = ""
|
out_misc : str = ""
|
||||||
redraw: bool = True
|
redraw: bool = True
|
||||||
|
@ -4165,6 +4201,9 @@ class Menu:
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def options(cls):
|
def options(cls):
|
||||||
|
if Term.width < 80 or Term.height < 24:
|
||||||
|
errlog.warning(f'The menu system only works on a terminal size of 80x24 or above!')
|
||||||
|
return
|
||||||
out: str = ""
|
out: str = ""
|
||||||
out_misc : str = ""
|
out_misc : str = ""
|
||||||
redraw: bool = True
|
redraw: bool = True
|
||||||
|
@ -5422,7 +5461,7 @@ def main():
|
||||||
#? Switch to alternate screen, clear screen, hide cursor, enable mouse reporting and disable input echo
|
#? Switch to alternate screen, clear screen, hide cursor, enable mouse reporting and disable input echo
|
||||||
Draw.now(Term.alt_screen, Term.clear, Term.hide_cursor, Term.mouse_on, Term.title("BpyTOP"))
|
Draw.now(Term.alt_screen, Term.clear, Term.hide_cursor, Term.mouse_on, Term.title("BpyTOP"))
|
||||||
Term.echo(False)
|
Term.echo(False)
|
||||||
Term.refresh(force=True)
|
#Term.refresh(force=True)
|
||||||
|
|
||||||
#? Start a thread checking for updates while running init
|
#? Start a thread checking for updates while running init
|
||||||
if CONFIG.update_check: UpdateChecker.run()
|
if CONFIG.update_check: UpdateChecker.run()
|
||||||
|
|
Loading…
Reference in New Issue