diff --git a/locate2.py b/locate2.py new file mode 100644 index 0000000..bb2c941 --- /dev/null +++ b/locate2.py @@ -0,0 +1,124 @@ +class Screen: + def _check(self, x, o, name): + if not isinstance(x, int): + raise TypeError("{} is not an int object".format(name)) + elif x < 1: + raise ValueError("{} is lower than 1".format(name)) + if o is None: + o = 0 + elif x > o and o: + raise ValueError("{} is greater than the height of this object: {} > {}". + format(name, x, o)) + + def __init__(self, width=21, height=6, patern=" ", copy=None): + if isinstance(copy, Screen): + self._width = copy._width + self._height = copy._height + self._mat = copy._mat + else: + self._check(width, None, "width") + self._check(height, None, "height") + if not isinstance(patern, str): + raise TypeError("patern is not a string") + elif len(patern) > 1: + raise ValueError("patern is too long (length = {})".format(len(patern))) + self._width = width + self._height = height + self.fill(patern) + + def locate(self, x, y, string): + self._check(x, self._width, "x") + self._check(y, self._height, "y") + string = str(string) + i = -1 + for char in string: + if i + x < self._width: + self._mat[y - 1][x + i] = char + i += 1 + + def locate_v(self, x, y, string): + self._check(x, self._width, "x") + self._check(y, self._height, "y") + string = str(string) + i = -1 + for char in string: + if i + y < self._height: + self._mat[y + i][x - 1] = char + i += 1 + + def fill(self, patern=" "): + self._mat = [[patern[0] for i in range(self._width)] for i in range(self._height)] + + def refresh(self, ask_for_input=True, endl="\n"): + to_print = str() + for line in self._mat: + for cell in line: + to_print += cell + to_print += "\n" + to_print = to_print[:-1] + print(to_print) + if ask_for_input: + return input("> ") + else: + print("", end=endl) + return None + + def get_cell(self, x, y): + self._check(x, self._width, "x") + self._check(y, self._width, "y") + return self._mat[y - 1][x - 1] + + def get_dim(self): + return self._width, self._height + + def export(self): + result = str() + for line in self._mat: + for cell in line: + result += cell + return result + + def load(self, string): + if type(string) is not str: + raise TypeError("string is not a string type") + if len(string) != self._width * self._height: + raise ValueError("string lenght isn't equal to {}".format(self._width * self._height)) + i = 0 + s = 0 + while i != self._height: + self._mat[i] = list(string[s:s + self._width]) + i += 1 + s += self._width + + get_cell_content = get_cell # For retro-compability + +class Pad(Screen): + def refresh(self, x=1, y=1, width=21, height=6, ask_for_input=True, endl="\n"): + if width > self._width: + width = self._width + if height > self._height: + height = self._height + if x < 1: + x = 1 + if y < 1: + y = 1 + x -= 1 + y -= 1 + if x + width > self._width: + x = self._width - width + if y + height > self._height: + y = self._height - height + to_print = str() + for dy in range(y, height+y): + dy = dy + for dx in range(x, width+x): + print(dx, dy) + to_print += self._mat[dy][dx] + to_print += "\n" + to_print = to_print[:-1] + print(to_print) + if ask_for_input: + return input("> ") + else: + print("", end=endl) + return None