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)