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 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)