Source code for schrodinger.ui.qt.tasks.taskbarwidgets

import re

from schrodinger.models import advanced_mappers
from schrodinger.Qt import QtWidgets
from schrodinger.tasks import taskmanager
from schrodinger.tasks import tasks
from schrodinger.ui.qt import utils
from schrodinger.ui.qt.standard_widgets import buttons


[docs]class TaskWidgetMixin(advanced_mappers.MultiModelClassMapperMixin): model_classes = (tasks.AbstractTask, taskmanager.TaskManager)
[docs] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._setupMapperMixin()
[docs] def makeInitialModel(self): # Must always be mapped to a real task, so as a performance # optimization, don't instantiate an AbstractTask return None
def _getCurrentTask(self): if isinstance(self.model, taskmanager.TaskManager): return self.model.nextTask() else: return self.model
[docs] def setTask(self, task): self.setModel(task)
[docs]class NameLineEdit(TaskWidgetMixin, QtWidgets.QLineEdit):
[docs] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.textChanged.connect(self._onTextChanged) self.editingFinished.connect(self._onEditingFinished)
def _onTextChanged(self): # We can update non-blank text immediately if self.text(): self._getCurrentTask().name = self.text() def _onEditingFinished(self): task = self._getCurrentTask() if task is None: return # For blank text, we defer the update in case the user plans on typing # some more text if not self.text(): if self.model_class is taskmanager.TaskManager: self.model.resetBaseName() else: task.name = self.text() else: if self.model_class is taskmanager.TaskManager: reg = r'(.+)_[\d]+' match = re.match(reg, self.text()) if match: new_base_name = match.group(1) else: new_base_name = self.text() if new_base_name != self.model.namer.base_name: self.model.setCustomBaseName(new_base_name) task.name = self.text()
[docs] def setModel(self, model): if isinstance(self.model, taskmanager.TaskManager): old_t = self.model.nextTask() old_t.nameChanged.disconnect(self._onTaskNameChanged) super().setModel(model) if model is None: return if isinstance(self.model, taskmanager.TaskManager): new_t = model.nextTask() new_t.nameChanged.connect(self._onTaskNameChanged) self.setText(self._getCurrentTask().name)
[docs] def getSignalsAndSlots(self, model): if self.model_class is taskmanager.TaskManager: return [(model.newTaskLoaded, self._onTaskLoaded), (model.taskStarted, self._onTaskStarted)] else: return [(model.nameChanged, self.setText)]
def _onTaskLoaded(self, task): task.nameChanged.connect(self._onTaskNameChanged) self.setText(task.name) def _onTaskStarted(self, task): task.nameChanged.disconnect(self._onTaskNameChanged) def _onTaskNameChanged(self, new_name): if self.text() != new_name: self.setText(new_name)
[docs]class StyledAcceptsFocusPushButton(utils.ButtonAcceptsFocusMixin, buttons.StyledButton): """ A StyledButton that also accepts focus on click """ pass