def setup_control_panel(self): """ Inicjalizuje panel kontrolny. """ self.control_panel_top.clear() self.control_panel_bottom.clear() self.description_button = self.control_panel_top.add_button( "Opis", Paths.icon("bookmark.png")) self.description_button.clicked.connect(self.show_description) self.description_button.set_hint("Wyświetlenie opisu algorytmu.") self.visualisation_button = self.control_panel_top.add_button( "Wizualizacja", Paths.icon("eye.png")) self.visualisation_button.clicked.connect(self.show_visualisation) self.visualisation_button.set_hint( "Wizualizacja podstawowych operacji na rzecz danego algorytmu.") self.codes_button = self.control_panel_top.add_button( "Kody źródłowe", Paths.icon("code.png")) self.codes_button.clicked.connect(self.show_codes) self.codes_button.set_hint("Przejście do panelu z kodami źródłowymi.") self.questions_button = self.control_panel_top.add_button( "Pytania", Paths.icon("question_mark.png")) self.questions_button.clicked.connect(self.show_questions) self.questions_button.set_hint( "Panel weryfikujący zdobytą przez użytkownika wiedzę.") self.questions_button = self.control_panel_top.add_button( "Ustawienia", Paths.icon("settings.png")) self.questions_button.clicked.connect(self.show_settings) self.questions_button.set_hint( "Panel pozwalający dostosować użytkowanie aplikacji.")
def setup_control_panel(self): """ Inicjalizuje panel kontrolny. """ self.center.set_widget(self.algorithm.visualization_widget) description = DescriptionLabel(self.center) description.set_text( "Skorzystaj z panelu po prawej stronie, aby rozpocząć wizualizację." ) self.center.set_bottom_widget(description) self.description_widget = self.center.bottom_widget for control in self.algorithm.controls: control_type = control[0] if control_type == "BUTTON": title, callback, icon, hint, update = control[1:] button = self.control_panel_bottom.add_button(title, icon) button.clicked.connect(callback) if update: button.clicked.connect(self.on_click_last_snapshot) button.clicked.connect(self.clear_textboxes) button.set_hint(hint) self.internal_widgets.append(button) elif control_type == "TEXTBOX": label_text, callback, hint, update = control[1:] label = self.control_panel_bottom.add_label(label_text) textbox = self.control_panel_bottom.add_text_box(hint) textbox.textChanged.connect(callback) if update: textbox.textChanged.connect(self.on_click_last_snapshot) self.internal_widgets.append(label) self.internal_widgets.append(textbox) else: print("Unknown control type") self.icon_panel = self.control_panel_bottom.add_icon_panel() self.first_step_button = self.icon_panel.add_button( Paths.icon("first.png"), "Uruchomienie pierwszego kroku.") self.first_step_button.clicked.connect(self.on_click_first_step) self.previous_step_button = self.icon_panel.add_button( Paths.icon("backward.png"), "Uruchomienie poprzedniego kroku.") self.previous_step_button.clicked.connect(self.on_click_previous_step) self.play_button = self.icon_panel.add_button(Paths.icon("play.png")) self.play_button.clicked.connect(self.on_click_play) self.next_step_button = self.icon_panel.add_button( Paths.icon("forward.png"), "Uruchomienie następnego kroku.") self.next_step_button.clicked.connect(self.on_click_next_step) self.last_snapshot_button = self.icon_panel.add_button( Paths.icon("last.png"), "Uruchomienie ostatniego kroku.") self.last_snapshot_button.clicked.connect(self.on_click_last_snapshot)
def setup_ui(self): """ Inicjalizacja interfejsu użytkownika. """ self.setObjectName("TestScoreWindow") self.setSizePolicy(self.get_size_policy()) self.setMinimumSize(QSize(500, 110)) self.setWindowTitle(self.window_title) self.setWindowIcon(QIcon(Paths.icon("window_icon.png"))) self.setStyleSheet(Styles.test_score_window_style) shadow = QGraphicsDropShadowEffect() shadow.setXOffset(0) shadow.setYOffset(5) shadow.setBlurRadius(10) self.control_panel = ControlPanel(self, Qt.AlignTop) self.score_label = self.control_panel.add_label(self.score) self.score_label.setStyleSheet( Styles.test_score_window_label_score_style + self.score_color_style) self.score_label.setGraphicsEffect(shadow) self.hint_label = self.control_panel.add_label(self.hint) self.hint_label.setStyleSheet( Styles.test_score_window_label_hint_style) self.setCentralWidget(self.control_panel)
def show_question(self, question: TestQuestion, algorithm, show_explanation=False): """ Wyświetla pytanie. Parametry: parent - widget rodzic. question - pytanie, obiekt klasy TestQuestion. algorithm - nazwa algorytmu show_explanation - określa czy wyświetlić uzasadnienie. """ self.question.setText(question.question) image_path = Paths.test_question_image(algorithm, question.image) if not os.path.isfile(image_path): image_path = Paths.icon("question_mark.png") pixels = QPixmap(image_path) self.image.setPixmap(pixels) self.image.resize(pixels.width(), pixels.height()) if show_explanation: self.explanation.setText(question.explanation) for index, answer in enumerate(question.answers): button = self.answers[index] button.set_text(answer)
def setup_ui(self): """ Inicjalizacja interfejsu użytkownika. """ self.image = QLabel(self) self.image.setAlignment(Qt.AlignCenter) self.widget_layout.addWidget(self.image) self.question = QLabel(self) self.question.setWordWrap(True) self.question.setAlignment(Qt.AlignCenter) self.widget_layout.addWidget(self.question) self.explanation = QLabel(self) self.explanation.setWordWrap(True) self.explanation.setAlignment(Qt.AlignCenter) self.widget_layout.addWidget(self.explanation) for l in ["A", "B", "C", "D"]: answer = AnswerButton(self) answer.set_icon(Paths.icon("letter_%s.png" % l.lower())) answer.set_hint("Odpowiedź %s" % l) self.answers.append(answer) self.widget_layout.addWidget(answer) self.setStyleSheet(Styles.description_background)
def __init__(self): QMainWindow.__init__(self) self.setObjectName("WelcomeWindow") self.resize(WINDOW_SIZE_X, WINDOW_SIZE_Y) self.setMinimumSize(QSize(WINDOW_SIZE_X, WINDOW_SIZE_Y)) self.setMaximumSize(QSize(WINDOW_SIZE_X, WINDOW_SIZE_Y)) self.setWindowTitle("WAWI ZUT") self.setStyleSheet(Styles.welcome_background) self.setWindowIcon(QIcon(Paths.icon("window_icon.png"))) self.central_widget = QWidget() self.layout = QVBoxLayout() self.setCentralWidget(self.central_widget) self.centralWidget().setLayout(self.layout) self.logo = QLabel(self) self.logo.setPixmap(QPixmap(Paths.icon("logo.png"))) self.logo.setAlignment(Qt.AlignCenter) self.layout.addWidget(self.logo, 10) self.layout.addWidget( add_label("\nWizualizacja Algorytmów", 12, False, Qt.AlignCenter), 10) self.layout.addWidget( add_label( "Wydział Informatyki \nZachodniopomorski Uniwersytet Technologiczny w Szczecinie\n", 10, False, Qt.AlignCenter), 1) self.layout.addWidget( add_label( "Oprogramowanie zrealizowane w ramach przedmiotu \nInżynierski Projekt Zespołowy 1", 10, False, Qt.AlignCenter), 1) self.layout.addWidget( add_label( "Autorzy: Marcin Jakubowski, Aliaksei Kavaliou, Piotr Podleżański, \nMateusz Smolarkiewicz, Łukasz Więckowski, Mykhailo Yelmikheiev", 10, False, Qt.AlignLeft), 1) self.layout.addWidget( add_label("Opiekun projektu: dr hab.inż. Imed El Fray", 10, False, Qt.AlignLeft), 1) self.layout.addWidget( add_label( "Konsultacja merytoryczna: dr hab.inż. Imed El Fray, \nmgr inż. Włodzimierz Chocianowicz, mgr inż. Gerard Wawrzyniak", 10, False, Qt.AlignLeft), 1)
def from_file(path: str): """ Wczytuje obiekt Code z pliku. Nazwa pliku do pierwszej kropki jest interpretowana jako nazwa języka. Parametry: path - ścieżka do pliku. Powrót: obiekt klasy Code Przykład: >>> code = Code.fromFile("algorithm/example/c++.cpp") """ code = Code() code.path = path code.url = QUrl.fromLocalFile(code.path) code.language = os.path.basename(path).split(".")[0] icon_file = code.language + ".png" code.icon = Paths.icon(icon_file) if not os.path.isfile(code.icon): code.icon = Paths.icon("code.png") return code
def __init__(self, main_widget: QWidget, algorithm: Algorithm): self.algorithm = algorithm self.main_widget = main_widget self.control_panel_bottom = self.main_widget.middle_widget.right_widget.bottom_control_panel self.center = self.main_widget.middle_widget.left_widget self.description_widget = None self.internal_widgets = [] self.play_icon = Paths.icon("play.png") self.pause_icon = Paths.icon("pause.png") self.text_box_label = None self.text_box = None self.icon_panel = None self.first_step_button = None self.previous_step_button = None self.next_step_button = None self.last_snapshot_button = None self.play_button = None self.slider = None self.is_playing = False self.setup_control_panel() self.current_snapshot_index = 0 self.update_playing_button()
def load_controls(self): """ Metoda tworząca klawisze oraz pola tekstowe odpowiedzialne za manipulację wizualizacją. """ self.add_textbox("Wartość elementu:", self.on_value_change, hint="Tutaj możesz wpisać dowolną wartość.") self.add_button("Dodaj", lambda: self.add_element(self.textbox_value), icon=Paths.icon("plus.png"), hint="Dodanie nowego elementu na koniec tablicy.") self.add_button( "Usuń", lambda: self.remove_element(self.textbox_value), icon=Paths.icon("minus.png"), hint="Usunięcie pierwszego napotkanego elementu o podanej wartości." ) self.add_button( "Usuń wszystkie", lambda: self.remove_all_elements(self.textbox_value), icon=Paths.icon("minus.png"), hint= "Usunięcie wszystkich napotkanych elementów o podanej wartości.") self.add_button( "Wyczyść", self.clear, icon=Paths.icon("clear.png"), hint= "Usunięcie wszystkich elementów oraz przywrócenie stanu początkowego." ) self.add_button("Losowe dane", self.random_data, icon=Paths.icon("random.png"), hint="Wylosowanie danych z ustawionego przedziału.") self.add_button( "Przemieszaj", self.shuffle, icon=Paths.icon("shuffle.png"), hint="Zamiana kolejności wszystkich elementów w tablicy.") self.add_button("Wykonaj algorytm", self.execute, icon=Paths.icon("execute.png"), hint="Rozpoczęcie wykonywania algorytmu.", update=False)
def setup_ui(self): """ Inicjalizacja interfejsu użytkownika. """ self.setObjectName("SettingsWindow") self.resize(400, 265) size_policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) size_policy.setHorizontalStretch(1) size_policy.setVerticalStretch(1) size_policy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) self.setSizePolicy(size_policy) self.setMinimumSize(QSize(400, 265)) self.setWindowTitle(SettingsWindow.window_title) self.control_panel = ControlPanel(self, Qt.AlignTop) self.setStyleSheet(Styles.settings_background) self.setCentralWidget(self.control_panel) self.setWindowIcon(QIcon(Paths.icon("settings.png")))
def setup_ui(self): """ Inicjalizuje interfejs użytkownika. """ self.center.set_widget(QuestionsWidget) self.questions_widget = self.center.widget self.check_button = self.control_panel_bottom.add_button( "Zakończ test", Paths.icon("eye.png"), "Sprawdza test") self.check_button.clicked.connect(self.on_click_check) self.previous_button = self.control_panel_bottom.add_button( "Poprzednie", Paths.icon("backward.png"), "Poprzednie pytanie") self.previous_button.clicked.connect(self.on_click_previous) self.next_button = self.control_panel_bottom.add_button( "Następne", Paths.icon("forward.png"), "Następne pytanie") self.next_button.clicked.connect(self.on_click_next) for index, answer_button in enumerate(self.questions_widget.answers): answer_button.clicked.connect( (lambda i: lambda: self.on_click_answer(i))(index)) answer_button.label.clicked.connect( (lambda i: lambda: self.on_click_answer(i))(index)) self.control_icon_panel = self.control_panel_bottom.add_icon_panel() self.first_icon_button = self.control_icon_panel.add_button( Paths.icon("first.png"), "Pierwsze pytanie") self.first_icon_button.clicked.connect(self.on_click_first) self.previous_icon_button = self.control_icon_panel.add_button( Paths.icon("backward.png"), "Poprzednie pytanie") self.previous_icon_button.clicked.connect(self.on_click_previous) self.next_icon_button = self.control_icon_panel.add_button( Paths.icon("forward.png"), "Następne pytanie") self.next_icon_button.clicked.connect(self.on_click_next) self.last_icon_button = self.control_icon_panel.add_button( Paths.icon("last.png"), "Ostatnie pytanie") self.last_icon_button.clicked.connect(self.on_click_last)
def setup_ui(self): """ Inicjalizacja interfejsu użytkownika. """ # Window config self.setObjectName("MainWindow") self.resize(800, 620) size_policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) size_policy.setHorizontalStretch(1) size_policy.setVerticalStretch(1) size_policy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) self.setSizePolicy(size_policy) self.setMinimumSize(QSize(1280, 720)) self.setWindowTitle(MainWindow.window_title) # Main widget self.main_widget = MainWidget(self) self.main_widget.setObjectName("main_widget") self.setStyleSheet(Styles.main_background) self.setCentralWidget(self.main_widget) self.setWindowIcon(QIcon(Paths.icon("window_icon.png")))
def load_controls(self): """ Metoda tworząca klawisze oraz pola tekstowe odpowiedzialne za manipulację wizualizacją. """ self.add_textbox("Wartość elementu:", self.on_value_change, hint="Tutaj możesz wpisać dowolną wartość.") self.add_button("Push back", self.push_back, icon=Paths.icon("plus.png"), hint="Dodanie nowego elementu na koniec listy.") self.add_button("Push front", self.push_front, icon=Paths.icon("plus.png"), hint="Dodanie nowego elementu na początek listy.") self.add_button("Pop back", self.pop_back, icon=Paths.icon("minus.png"), hint="Pobranie i usunięcie elementu z końca listy.") self.add_button( "Pop front", self.pop_front, icon=Paths.icon("minus.png"), hint="Pobranie i usunięcie elementu z początku listyy.") self.add_button( "Usuń", self.remove, icon=Paths.icon("minus.png"), hint="Usunięcie pierwszego napotkanego elementu o podanej wartości." ) self.add_button( "Wyczyść", self.clear, icon=Paths.icon("clear.png"), hint= "Usunięcie wszystkich elementów oraz przywrócenie stanu początkowego." ) self.add_button("Losowe dane", self.random_data, icon=Paths.icon("random.png"), hint="Wylosowanie danych z ustawionego przedziału.")
def test_icon(self): self.assertEqual(self.code_cpp.icon, Paths.icon("c++.png")) self.assertEqual(self.code_pseudocode.icon, Paths.icon("code.png")) self.assertEqual(self.code_python.icon, Paths.icon("python.png"))
def load_difficulty_icons(self): for filename in ["easy", "moderate", "difficult"]: self.difficulty_icons.append(QIcon(Paths.icon("%s.png" % filename)))