Index

lognestmonster / 0b71b72

A general-purpose single-header C logging library and parser for event-based logs. (Incomplete)

Latest Commit

{#}TimeHashSubjectAuthor#(+)(-)GPG?
9708 Sep 2019 17:46916c79cMove TUI display class into separate fileJosh Stockin11450N

Blob @ lognestmonster / parser / tui.py

application/x-python4011 bytesdownload raw
1# lognestmonster Copyright (c) 2019 Joshua 'joshuas3' Stockin
2# <https://github.com/JoshuaS3/lognestmonster/>.
3
4
5# This file is part of lognestmonster.
6
7# lognestmonster is free software: you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation, either version 3 of the License, or
10# (at your option) any later version.
11
12# lognestmonster is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16
17# You should have received a copy of the GNU General Public License
18# along with lognestmonster. If not, see <https://www.gnu.org/licenses/>.
19
20from utils import *
21from text import *
22
23class TUI:
24 screen = None
25 clines = None
26 ccols = None
27 lines = None
28 def __init__(self):
29 self.screen = curses_window()
30 self.get_size()
31
32 def get_size(self):
33 size = term_size()
34 self.clines = size[0]
35 self.ccols = size[1]
36
37 def redraw(self):
38 self.get_size()
39 curses_clear(self.screen)
40 l = 0
41 for line in self.lines:
42 if l == self.clines: break
43 self.screen.move(l, 0)
44 line_len = 0
45 for string in line:
46 # ("content string", "attributes string")
47 content = string[0]
48
49 self.screen.attrset(0)
50
51 try:
52 attr = string[1]
53 except:
54 attr = ""
55
56 if "RESET" in attr: # set curses attributes based on attributes string
57 self.screen.attron(curses.color_pair(0))
58 else:
59 if "BLACK" in attr:
60 self.screen.attron(curses.color_pair(1))
61 if "BLUE" in attr:
62 self.screen.attron(curses.color_pair(2))
63 if "CYAN" in attr:
64 self.screen.attron(curses.color_pair(3))
65 if "GREEN" in attr:
66 self.screen.attron(curses.color_pair(4))
67 if "MAGENTA" in attr:
68 self.screen.attron(curses.color_pair(5))
69 if "RED" in attr:
70 self.screen.attron(curses.color_pair(6))
71 if "WHITE" in attr:
72 self.screen.attron(curses.color_pair(7))
73 if "YELLOW" in attr:
74 self.screen.attron(curses.color_pair(8))
75 if "BOLD" in attr:
76 self.screen.attron(curses.A_BOLD)
77 if "STANDOUT" in attr:
78 self.screen.attron(curses.A_STANDOUT)
79 if "UNDERLINE" in attr:
80 self.screen.attron(curses.A_UNDERLINE)
81
82 out = content[:self.ccols - line_len]
83 self.screen.addstr(out)
84 self.screen.attrset(0)
85 line_len += len(out)
86 l += 1
87 curses_refresh(self.screen)
88
89 def get_input(self):
90 input = getch()
91 if input == UP: input = "up"
92 elif input == DOWN: input = "down"
93 elif input == LEFT: input = "left"
94 elif input == RIGHT: input = "right"
95 elif input == CTRLC: input = "exit"
96 else: input = input.decode("utf-8").lower()
97 return input
98
99 folder_name = "log_1565561768719"
100 divider = " | "
101 title = TITLE
102
103 def loop(self):
104 def tab(string, count=1):
105 return " "*count + string
106 input = None
107 try:
108 while True:
109 self.get_size()
110 screen_width = self.ccols
111
112 self.lines = [
113 [(self.title + " - ", "RESET"), (self.folder_name, "BOLD YELLOW")],
114 "Size: 235 bytes | Timestamp: 1565561768719",
115 "7 Statements | 2 Events | 0 Unsaved Data Trees",
116 pad(margin("STATEMENT 5"), ":", screen_width),
117 "",
118 "[[LOG START]]",
119 "v 7 ITEMS",
120 tab("1565561768752 - INFO - INIT - HELLO"),
121 tab("1565561768752 - INFO - INIT - HELLO"),
122 tab("v 4 ITEMS"),
123 tab("1565561768752 - INFO - INIT - HELLO", 2),
124 tab("1565561768752 - INFO - INIT - HELLO", 2),
125 "",
126 [(tab("1565561768752 - INFO - INIT - HELLO", 2), "BOLD")],
127 "",
128 tab("1565561768752 - INFO - INIT - HELLO", 2),
129 tab("1565561768752 - INFO - INIT - HELLO"),
130 "",
131 str(input),
132 "[[LOG END]",
133 "",
134 "",
135 "",
136 pad(margin(CONTROLS_MESSAGE), ":", screen_width)
137 ]
138 self.redraw()
139
140 input = self.get_input()
141
142 if input == "exit" or input == "q": # exit program on Ctrl + C or `q`
143 break;
144 finally:
145 curses_reset()
146