"""
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
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
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 <http://www.gnu.org/licenses/>.
"""
from PyQt5.QtWidgets import (
QWidget,
QVBoxLayout,
QPushButton,
QLabel,
QHBoxLayout,
QLineEdit
)
from PyQt5.QtCore import pyqtSlot
from . import transphire_utils as tu
[docs]class FrameContainer(QWidget):
"""
FrameContainer widget.
Inherits from:
QWidget
Buttons:
Add - Add FrameWidget widget to the layout
LineEdit:
First frame - First frame to use for a smaller amount of dose
Last frame - Last frame to use for a smaller amount of dose
"""
def __init__(self, parent=None, **kwargs):
"""
Setup the layout for the widget
Arguments:
parent - Parent widget (default None)
Return:
None
"""
super(FrameContainer, self).__init__(parent)
# Variables
kwargs = kwargs
self.content = []
self.content_frames = []
# Setup layout
layout_v = QVBoxLayout(self)
layout_v.setContentsMargins(0, 0, 0, 0)
# Static layout
layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout_v.addLayout(layout)
# First frame textedit
first = QLabel('First frame:', self)
first.setObjectName('frame')
layout.addWidget(first)
self.first = QLineEdit('1', self)
self.first.setObjectName('frame')
layout.addWidget(self.first)
# Last frame textedit
last = QLabel('Last frame:', self)
last.setObjectName('frame')
layout.addWidget(last)
self.last = QLineEdit('20', self)
self.last.setObjectName('frame')
layout.addWidget(self.last)
# Stretch between edits and add button
layout.addStretch(1)
# Add button
self.button = QPushButton('Add', self)
self.button.setObjectName('frame')
self.button.clicked.connect(self.add_widget)
layout.addWidget(self.button)
# Seperator between static layout and dynamic layout
layout_v.addWidget(Separator(typ='horizontal', color='grey'))
# Dynamic layout
self.layout = QVBoxLayout()
self.layout.setContentsMargins(0, 0, 0, 0)
layout_v.addLayout(self.layout)
# Stretch in the end
layout_v.addStretch(1)
# First default entry
widget = FrameWidget(
first=1,
last=-1,
dose_weight=True,
default=True
)
self.layout.addWidget(widget)
self.content.append(widget)
self.content_frames.append('1,-1')
def _reset(self):
"""
Reset the dynamic layout.
Arguments:
None
Returns:
None
"""
for entry in self.content:
self.layout.removeWidget(entry)
entry.setParent(None)
self.content = []
self.content_frames = []
@pyqtSlot(object)
def _del_widget(self, widget):
"""
Delete widget from the dynamic layout.
Called when the Del button of a FramEntry is clicked.
Arguments:
widget - FrameWidget instance
Returns:
None
"""
settings = widget.get_settings()
self.content_frames.remove(
'{0},{1}'.format(settings['first'], settings['last'])
)
self.content.remove(widget)
self.layout.removeWidget(widget)
widget.setParent(None)
[docs] def get_settings(self):
"""
Get settings of all FrameWidget widgets.
Arguments:
None
Returns:
settings - List of FrameWidget settings
"""
settings = []
for entry in self.content:
settings.append(entry.get_settings())
return settings
[docs] def set_settings(self, settings):
"""
Add FrameWidget widgets to the dynamic layout
based on setting entries.
Arguments:
settings - List of FrameWidget settings.
Returns:
None
"""
self._reset()
for entry in settings:
first = entry['first']
last = entry['last']
dose_weight = bool(entry['dw'] == 'True')
default = bool(entry['default'] == 'True')
widget = FrameWidget(
first=first,
last=last,
dose_weight=dose_weight,
default=default,
parent=self
)
self.layout.addWidget(widget)
self.content.append(widget)
self.content_frames.append('{0},{1}'.format(first, last))
if not default:
widget.delete.connect(self._del_widget)
else:
pass
[docs] def enable(self, var, use_all):
"""
Enable or disable the buttons and widgets.
Arguments:
var - State of buttons (True or False)
use_all - Disable all buttons (True) or only some (False)
Return:
None
"""
if use_all:
pass
else:
pass
self.first.setEnabled(var)
self.last.setEnabled(var)
self.button.setEnabled(var)
for entry in self.content:
entry.setEnabled(var)
from .framewidget import FrameWidget
from .separator import Separator