diff --git a/zygrader/config/changelog.txt b/zygrader/config/changelog.txt index 3ca658b..b7c7a9a 100644 --- a/zygrader/config/changelog.txt +++ b/zygrader/config/changelog.txt @@ -5,6 +5,8 @@ * Make light theme consistent. * Draw borders on popups. * Show version number in header. +* Add commandline args to skip updates and install specific + versions. Run with --help for more info. 3.6 * Reformat zygrader source as a proper Python package. diff --git a/zygrader/config/shared.py b/zygrader/config/shared.py index cfdcd68..387fa7d 100644 --- a/zygrader/config/shared.py +++ b/zygrader/config/shared.py @@ -5,7 +5,7 @@ class SharedData: # Zygrader version - VERSION = LooseVersion("4.0.0") + VERSION = LooseVersion("4.0.1") # Current class code (shared) # TODO: Could this be per-user? diff --git a/zygrader/data/model.py b/zygrader/data/model.py index 59be47c..d137677 100644 --- a/zygrader/data/model.py +++ b/zygrader/data/model.py @@ -85,6 +85,20 @@ class SubmissionFlag(enum.Flag): class Submission: + # Implement the iterator interface so the message can be updated + # Throughout the grader popup's lifetime. + def __iter__(self): + self.current_line = 0 + return self + + def __next__(self): + if self.current_line < len(self.msg): + line = self.msg[self.current_line] + self.current_line += 1 + return line + else: + raise StopIteration + def get_part_identifier(self, part): """Some parts are not named, use ID in that case""" if part["name"]: diff --git a/zygrader/grader.py b/zygrader/grader.py index dc0c95c..2da6e7a 100644 --- a/zygrader/grader.py +++ b/zygrader/grader.py @@ -263,7 +263,7 @@ def student_callback(context: WinContext, lab, use_locks=True): if not (use_locks and submission.flag & data.model.SubmissionFlag.DIFF_PARTS): del options["Diff Parts"] - window.create_options_popup("Submission", submission.msg, + window.create_options_popup("Submission", submission, options, components.Popup.ALIGN_LEFT) SharedData.running_process = None diff --git a/zygrader/ui/components.py b/zygrader/ui/components.py index 7b391f9..afb8b41 100644 --- a/zygrader/ui/components.py +++ b/zygrader/ui/components.py @@ -47,22 +47,22 @@ def __calculate_size(self): self.y = (self.available_rows - self.rows) // 2 self.x = (self.available_cols - self.cols) // 2 - def __draw_message_left(self): - longest_line = max([len(l) for l in self.message]) + def __draw_message_left(self, message: list): + longest_line = max([len(l) for l in message]) message_x = self.cols // 2 - longest_line // 2 - message_y = self.rows // 2 - len(self.message) // 2 + message_y = self.rows // 2 - len(message) // 2 message_row = 0 - for line in self.message: + for line in message: line = line[:self.cols - Popup.PADDING] add_str(self.window, message_y + message_row, message_x, line) message_row += 1 - def __draw_message_center(self): - message_y = self.rows // 2 - len(self.message) // 2 + def __draw_message_center(self, message: list): + message_y = self.rows // 2 - len(message) // 2 message_row = 0 - for line in self.message: + for line in message: line = line[:self.cols - Popup.PADDING] message_x = self.cols // 2 - len(line) // 2 add_str(self.window, message_y + message_row, message_x, line) @@ -75,11 +75,16 @@ def draw_title(self): def draw_text(self): self.window.erase() + if not isinstance(self.message, list): + message = list(self.message) + else: + message = self.message + # Draw lines of message if self.align == Popup.ALIGN_CENTER: - self.__draw_message_center() + self.__draw_message_center(message) elif self.align == Popup.ALIGN_LEFT: - self.__draw_message_left() + self.__draw_message_left(message) self.draw_title()