import curses import threading from .globals import CURSES_LOCK def format_time(t): t = int(t/1000 + 0.5) h = (t // 3600) m = t % 3600 s = m % 60 m = m // 60 if not m and not h: return "%2ds" % s elif not h: return "%2dm%2ds" % (m, s) return "%dh%2dm%2ds" % (h, m, s) class AudioView: def set_dim(self, height, width): with CURSES_LOCK, self._lock: if (height, width) != (self._height, self._width): self.win.erase() self.win.refresh() self.win.resize(height, width) self.win.redrawwin() self._height = height self._width = width self._refresh() self.win.refresh() def set_pos(self, y, x): with self._lock: if (y, x) != (self._y, self._x): with CURSES_LOCK: self.win.mvwin(y, x) self._put_title() self.win.refresh() @property def audio(self): return self._audio @audio.setter def audio(self, v): with self._lock: self._audio = v self._refresh() @property def title(self): return self._title @title.setter def title(self, value): with self._lock: self._title = value self._put_title() self.win.refresh() @property def highlight(self): return self._highlight @highlight.setter def highlight(self, value): with self._lock: self._highlight = value self._put_title() self.win.refresh() def _put_title(self): self.win.border() pos = min(self._width-2-len(self._title), (3*self._width)//4 - (len(self._title) // 2)) self.win.addstr(self._height-1, pos, self._title, curses.A_REVERSE if self._highlight else 0) def _refresh(self): with CURSES_LOCK: self.win.erase() if self._audio is not None: self.win.addstr(1, 1, "Filename: "+str(self._audio.filename)) self.win.addstr(2, 1, " Fade in: "+str(self._audio.fade_in)+"ms") self.win.addstr(3, 1, "Duration: "+str(format_time(self._audio.duration))) self.win.addstr(4, 1, "Fade out: "+str(self._audio.fade_out)+"ms") self._put_title() self.win.refresh() def __init__(self, y, x, height, width): with CURSES_LOCK: self.win = curses.newwin(height, width, y, x) self.win.leaveok(True) self.win.keypad(True) self._lock = threading.RLock() self._highlight = False self._title = "Audio" self._height = height self._width = width self._y = -1 self._x = -1 self._audio = None self.set_pos(y, x) self.set_dim(height, width)