class TaskEntryDialog(QDialog): def __init__(self, task_data, task=None, parent=None): QDialog.__init__(self, parent, Qt.WindowTitleHint) self._task = task self.setWindowTitle("Add New Task") self.task_data = task_data category_label = QLabel("Category") self.category_entry = QComboBox() task_label = QLabel("Task") self.task_entry = QLineEdit() self.task_entry.setMinimumWidth(500) status_label = QLabel("Status") self.status_entry = QComboBox() self.status_entry.setMaximumWidth(100) priority_label = QLabel("Priority") self.priority_entry = QComboBox() self.priority_entry.setMaximumWidth(100) entry_date_label = QLabel("Entry Date") self.entry_date_entry = QLineEdit() self.entry_date_entry.setMaximumWidth(100) self.entry_date_entry.setReadOnly(True) due_date_label = QLabel("Due Date") self.due_date_entry = QDateEdit() self.due_date_entry.setCalendarPopup(True) self.due_date_entry.setDate(datetime.datetime.now()) expected_effort_label = QLabel("Expected Effort") expected_hours_label = QLabel("Hours") self.expected_hours_entry = QLineEdit() self.expected_hours_entry.setMaximumWidth(50) expected_minutes_label = QLabel("Minutes") self.expected_minutes_entry = QLineEdit() self.expected_minutes_entry.setMaximumWidth(50) add_button = QPushButton("Add Task") cancel_button = QPushButton("Cancel") button_layout = QHBoxLayout() button_layout.addStretch(1) button_layout.addWidget(add_button) button_layout.addWidget(cancel_button) layout = QGridLayout() layout.addWidget(category_label, 0, 0) layout.addWidget(self.category_entry, 0, 1) layout.addWidget(task_label, 1, 0) layout.addWidget(self.task_entry, 1, 1, 1, 7) layout.addWidget(status_label, 2, 0) layout.addWidget(self.status_entry, 2, 1, 1, 1) layout.addWidget(priority_label, 3, 0) layout.addWidget(self.priority_entry, 3, 1, 1, 1) layout.addWidget(entry_date_label, 4, 0) layout.addWidget(self.entry_date_entry, 4, 1, 1, 1) layout.addWidget(due_date_label, 5, 0) layout.addWidget(self.due_date_entry, 5, 1, 1, 1) layout.addWidget(expected_effort_label, 5, 3, 1, 1) layout.addWidget(self.expected_hours_entry, 5, 4, 1, 1) layout.addWidget(expected_hours_label, 5, 5, 1, 1) layout.addWidget(self.expected_minutes_entry, 5, 6, 1, 1) layout.addWidget(expected_minutes_label, 5, 7, 1, 1) layout.addLayout(button_layout, 6, 0, 1, 8) self.setLayout(layout) status_list = task_data.get_status_list() for status in status_list: self.status_entry.addItem(status.get_description(), status) priority_list = task_data.get_priority_list() for priority in priority_list: self.priority_entry.addItem(priority.get_description(), priority) category_list = task_data.get_category_list() self.category_entry.addItem("", None) enabled_category_list = [category for category in category_list if category.get_enabled()] for category in enabled_category_list: self.category_entry.addItem(category.get_description(), category) if self._task is not None: self.task_entry.setText(self._task.get_description()) index = self.status_entry.findText(self._task.get_status().get_description()) self.status_entry.setCurrentIndex(index) index = self.priority_entry.findText(self._task.get_priority().get_description()) self.priority_entry.setCurrentIndex(index) if self._task.get_category() is not None: index = self.category_entry.findText(self._task.get_category().get_description()) self.category_entry.setCurrentIndex(index) self.expected_hours_entry.setText(str(self._task.get_expected_hours())) self.expected_minutes_entry.setText(str(self._task.get_expected_minutes())) self.setWindowTitle("Edit Task") add_button.setText("Edit Task") self.entry_date_entry.setText(self._task.get_entry_date().strftime("%Y-%m-%d")) if self._task.get_due_date() is not None: self.due_date_entry.setDate(self._task.get_due_date()) else: self.entry_date_entry.setText(datetime.datetime.now().strftime("%Y-%m-%d")) add_button.clicked.connect(self.new_task_accepted) cancel_button.clicked.connect(self.new_task_rejected) def new_task_accepted(self): if self._task is None: self._task = Task() self._task.set_description(self.task_entry.text()) index = self.status_entry.currentIndex() self._task.set_status(self.status_entry.itemData(index)) index = self.priority_entry.currentIndex() self._task.set_priority(self.priority_entry.itemData(index)) index = self.category_entry.currentIndex() self._task.set_category(self.category_entry.itemData(index)) self._task.set_due_date(self.due_date_entry.date().toPyDate()) if self.expected_hours_entry.text().isdigit(): self._task.set_expected_hours(int(self.expected_hours_entry.text())) else: self._task.set_expected_hours(0) if self.expected_minutes_entry.text().isdigit(): self._task.set_expected_minutes(int(self.expected_minutes_entry.text())) else: self._task.set_expected_minutes(0) self.accept() def new_task_rejected(self): self._task = None self.reject() def get_task(self): return self._task