Source code for obci.control.gui.obci_log_engine

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui

from . import obci_log_model

from .obci_launcher_constants import STATUS_COLORS


[docs]class LogEngine(QtCore.QObject): def __init__(self, tab_widget): QtCore.QObject.__init__(self) self.tab_widget = tab_widget self.tab_widget.tabCloseRequested.connect(self.tab_closed) self.tab_widget.currentChanged.connect(self.tab_changed) self._model = obci_log_model.LogModel() self._prev_model = self._model self._init_tab_shortcut()
[docs] def show(self, experiment): """Called from obci.gui when scenario`s moules panel is being refreshed, eg. when user clicks some new scenario or gui is autmatically being refreshed""" if self._prev_model != experiment.log_model: self._prev_model = self._model self._model = experiment.log_model self._exp = experiment.exp self._prev_model.set_emmiting(False) self._rebuild_tab_widget() self._model.set_emmiting(True) if self._exp.status.status_name in ['launching', 'running'] and \ not self._model.is_running(): self._model.connect_running(self._exp)
[docs] def tab_closed(self, tab_id): """Called on tab_closed event from GUI""" if tab_id > 0: self._model.remove_peer(tab_id - 1) self.tab_widget.removeTab(tab_id)
[docs] def tab_changed(self, tab_id): """Called on tab_changed event from GUI""" if tab_id > 0: t = self.tab_widget.widget(tab_id) t.verticalScrollBar().setSliderPosition(t.verticalScrollBar().maximum())
[docs] def update_user_interface(self): """Called from gui on refresh_gui request. Update tabs status in case module`s status has changed.""" self._update_tab_status()
[docs] def update_log(self, log): try: ind = self._model.get_peer_ind(log['peer_id']) w = self.tab_widget.widget(ind + 1) w.append('\n'.join([str(l) for l in log['logs']])) except ValueError: pass
[docs] def show_log(self, peer_id, scenario_id): """Called from gui when user requests peer_id module`s log. Lets create and show it...""" # TODO - create model.socket if needed try: ind = self._model.get_peer_ind(peer_id) + 1 self._show_tab(ind) except ValueError: # this tab is not opened yet self._model.add_peer(peer_id) self.tab_widget.addTab(self._get_log_widget(), peer_id) self._update_tab_status() self._show_tab(len(self._model.get_peers()))
[docs] def experiment_stopped(self): print('experiment stopped')
[docs] def experiment_started(self): print('experiment started')
# self._model.start_running(self._exp)
[docs] def on_experiment_start(self, exp): self._model.start_running(self._exp)
def _rebuild_tab_widget(self): scenario = self.tab_widget.widget(0) self.tab_widget.clear() self.tab_widget.addTab(scenario, "Scenario") for t in self._model.get_peers(): self.tab_widget.addTab(self._get_log_widget(), t) self._request_update_log() self._update_tab_status() def _init_tab_shortcut(self): self.m = QtCore.QSignalMapper(self) self.shortcuts = [] for i in range(9): s = QtGui.QShortcut(QtGui.QKeySequence("Alt+" + str(i + 1)), self.tab_widget) s.connect(s, QtCore.SIGNAL('activated()'), self.m, QtCore.SLOT('map()')) self.m.setMapping(s, i) self.shortcuts.append(s) self.connect(self.m, QtCore.SIGNAL('mapped(int)'), self, QtCore.SLOT('_show_tab(int)')) def _update_tab_status(self): for i, peer_id in enumerate(self._model.get_peers()): st = self._exp.status.peer_status(str(peer_id)).status_name c = STATUS_COLORS[st] p = QtGui.QPixmap(16, 16) p.fill(QtGui.QColor(c)) ic = QtGui.QIcon() ic.addPixmap(p) self.tab_widget.setTabIcon(i + 1, ic) @QtCore.pyqtSlot('int') def _show_tab(self, tab_id): self.tab_widget.setCurrentIndex(tab_id) def _request_update_log(self): self._model.emit_logs() def _get_log_widget(self): w = QtGui.QTextEdit(self.tab_widget) w.setReadOnly(True) return w