Source code for transphire.statuscontainer

    TranSPHIRE is supposed to help with the cryo-EM data collection
    Copyright (C) 2017 Markus Stabrin

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <>.
import os
from PyQt5.QtWidgets import QHBoxLayout, QVBoxLayout, QWidget, QLabel
from PyQt5.QtGui import QImage
from PyQt5.QtCore import pyqtSlot, pyqtSignal
from . import transphire_utils as tu
from . import logviewer as lv

[docs]class StatusContainer(QWidget): """ Container for status widgets Inherits: QWidget Signals: sig_refresh_quota - Connected to change the quota text (no object) """ sig_refresh_quota = pyqtSignal() def __init__(self, content, content_mount, content_pipeline, mount_worker, process_worker, content_font, parent=None, **kwargs): """ Layout for the status container. Arguments: content - Content to fill the statuscontainer content_mount - Content for the mount points content_pipeline - Content for the pipeline settings mount_worker - MountWorker object process_worker - ProcessWorker object parent - Parent widget (default None) Returns: None """ super(StatusContainer, self).__init__(parent) # Layout central_layout = QVBoxLayout(self) central_layout.setContentsMargins(0, 0, 0, 0) central_widget = QWidget(self) central_widget.setObjectName('central_black') central_layout.addWidget(central_widget) layout_v1 = QVBoxLayout(central_widget) for entry in content: for widget in entry: for key in widget: if key == 'Image': image = widget[key][0] # Global content self.content = {} # Add em-transfer quota self.content['scratch'] = StatusWidget(name='scratch', default_name='Connected', default_quota='-- / --') layout_v1.addWidget(self.content['scratch']) # Add em-transfer quota self.content['project'] = StatusWidget(name='project', default_name='Connected', default_quota='-- / --') layout_v1.addWidget(self.content['project']) content_temp = [] for entry in content_mount: my_content = {} for widget in entry: for key in widget: my_content[key] = widget[key] content_temp.append(my_content) # Content for entry in content_temp: key = entry['Mount name'][0] if not key: continue elif key == 'HDD': max_iter = 6 else: max_iter = 1 for i in range(max_iter): if max_iter == 1: key_name = key key_device = key.replace(' ', '_') else: key_name = '{0} {1}'.format(key, i) key_device = key_name.replace(' ', '_') mount_worker.sig_add_save.emit( key_device, entry['SSH address'][0], entry['Quota command'][0], entry['Is df giving the right quota?'][0], entry['Quota / TB'][0] ) self.content[key_device] = StatusWidget( name=key_name, default_name='Not connected', default_quota='-- / --' ) self.content[key_device].setVisible(False) layout_v1.addWidget(self.content[key_device]) # Add a visual separator layout_v1.addWidget(Separator(typ='horizontal', color='grey', parent=self)) self.content['Feedbacks'] = StatusWidget(name='Feedbacks', default_name='00|00', default_quota='Not running') layout_v1.addWidget(self.content['Feedbacks']) # Add process status widgets for entry in content_pipeline[0]: for key in entry: if 'WIDGETS' in key: continue basename = key name = basename self.content[name] = StatusWidget(name=name, default_name='00|00', default_quota='Not running') layout_v1.addWidget(self.content[name]) layout_v1.addWidget(Separator(typ='horizontal', color='grey', parent=self)) self.log_viewer = lv.LogViewer( show_indicators=True, file_name='', parent=self ) layout_v1.addWidget(self.log_viewer, stretch=1) # Add picture if image and os.path.exists(image): pass else: image = os.path.join(os.path.dirname(__file__), 'images', 'Transphire.png') qimage = QImage(image) image_height = float(content_font[0][0]['Font'][0]) * 150 / 10 try: image_width = image_height * qimage.width() / qimage.height() except ZeroDivisionError: tu.message('Chosen picture: "{0}" - No longer available!'.format(image)) self.log_viewer.appendPlainText('Chosen picture: "{0}" - No longer available!'.format(image)) else: pic_label = QLabel(self) pic_label.setObjectName('picture') pic_label.setStyleSheet('border-image: url("{0}")'.format(image)) pic_label.setMaximumHeight(image_height) pic_label.setMinimumHeight(image_height) pic_label.setMaximumWidth(image_width) pic_label.setMinimumWidth(image_width) layout_image = QHBoxLayout() layout_image.addStretch(1) layout_image.addWidget(pic_label) layout_image.addStretch(1) layout_v1.addLayout(layout_image) # Reset quota warning mount_worker.quota_warning = True # Events mount_worker.sig_success.connect(self._mount_success) mount_worker.sig_error.connect(self._mount_error) mount_worker.sig_info.connect(self._mount_info) mount_worker.sig_quota.connect(self.refresh_quota) process_worker.sig_status.connect(self._process_success) process_worker.sig_set_project_directory.connect(self.log_viewer.set_project_path) process_worker.sig_error.connect(self._process_error) self.sig_refresh_quota.connect(mount_worker.refresh_quota) @pyqtSlot(str, str, str) def _mount_success(self, text, device, color): """ Mount was successfull. Arguments: text - Text to show device - Device name color - Color of the text Returns: None """ self.content[device].sig_change_info_name.emit(text, color) if color == 'white': mount_type = 'Unmount' self.content[device].setVisible(False) else: mount_type = 'Mount' self.content[device].setVisible(True) if device != 'scratch' and device != 'project': self.log_viewer.appendPlainText('{0} {1} successfull!'.format(device, mount_type)) #tu.message('{0} Mount/Unmount successfull!'.format(device)) else: pass @pyqtSlot(str, str) def _mount_error(self, text, device): """ Mount was not successfull Arguments: text - Text to show device - Device name Returns: None """ if device != 'None': self.content[device].sig_change_info_name.emit('Not connected', 'red') self.log_viewer.appendPlainText(text) #tu.message(text) @pyqtSlot(str) def _mount_info(self, text): """ Information for the user Arguments: text - Text to show Returns: None """ self.log_viewer.appendPlainText(text) #tu.message(text) @pyqtSlot(str, object, str, str) def _process_success(self, text, numbers, device, color): """ Success in a process Arguments: text - Text to show device - Device name color - Color of the text Returns: None """ text = text.split() quota_list = [] for entry in numbers: try: entry = '{0:.0f}'.format(entry) except: entry = entry quota_list.append(entry) self.content[device].sig_change_info_name.emit(' '.join(text), color) self.content[device].sig_change_info_quota.emit(' | '.join(quota_list), color) self.sig_refresh_quota.emit() @pyqtSlot(str) def _process_error(self, text): """ Error in a process Arguments: text - Text to show Returns: None """ self.log_viewer.appendPlainText(text, indicator='error') self.sig_refresh_quota.emit()
[docs] @pyqtSlot(str, str, str) def refresh_quota(self, text, device, color): """ Refresh the quota Arguments: text - Text to show device - Device name color - Color of the text Returns: None """ self.content[device].sig_change_info_quota.emit(text, color)
from .statuswidget import StatusWidget from .separator import Separator