From f16f3e4558fedc0a99fd6e9e6853af9583f4cfe0 Mon Sep 17 00:00:00 2001 From: DerGrumpf Date: Thu, 2 Jan 2025 02:36:42 +0100 Subject: [PATCH] Changed: Window Layout --- .gitignore | 3 ++ imgui.ini | 20 ----------- main.py | 101 +++++++++++++++++++++++++++++++++++++++-------------- 3 files changed, 77 insertions(+), 47 deletions(-) delete mode 100644 imgui.ini diff --git a/.gitignore b/.gitignore index 5d381cc..0d1eaa6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# ---> ImGUI +imgui.ini + # ---> Python # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/imgui.ini b/imgui.ini deleted file mode 100644 index 213e088..0000000 --- a/imgui.ini +++ /dev/null @@ -1,20 +0,0 @@ -[Window][Debug##Default] -Pos=60,60 -Size=400,400 -Collapsed=0 - -[Window][Custom window] -Pos=355,219 -Size=321,302 -Collapsed=0 - -[Window][Dear ImGui Demo] -Pos=323,104 -Size=550,680 -Collapsed=0 - -[Window][Student Table] -Pos=5,9 -Size=251,142 -Collapsed=0 - diff --git a/main.py b/main.py index 4bab58d..ee6e45b 100644 --- a/main.py +++ b/main.py @@ -4,6 +4,7 @@ import OpenGL.GL as gl from imgui.integrations.glfw import GlfwRenderer from PIL import ImageColor from dataclasses import dataclass +import numpy @dataclass class Lecture: @@ -18,6 +19,20 @@ class Student: project: str lectures: list +phil = Student( + "Phil Keier", "772fb04b24caa68fd38a05ec2a22e62b", "Geomapping", + [Lecture("1. Tutorial 1", 28.5, 31), Lecture("2. Tutorial 2", 4.5, 15), Lecture("3. Extended Application", 18, 18)] + ) +nova = Student( + "Nova Eib", "772fb04b24caa68fd38a05ec2a22e62b", "Mapping Maps", + [Lecture("1. Tutorial 1", 28.5, 31), Lecture("2. Tutorial 2", 4.5, 15), Lecture("3. Extended Application", 18, 18)] + ) +kathi = Student( + "Katharina Walz", "772fb04b24caa68fd38a05ec2a22e62b", "Geomapping", + [Lecture("1. Tutorial 1", 28.5, 31), Lecture("2. Tutorial 2", 4.5, 15), Lecture("3. Extended Application", 18, 18), Lecture("4. Numpy & MatPlotLib", 3, 30)] + ) + +students = [phil, nova, kathi] # Global Color Pallet COLOR_BACKGROUND = tuple([e/255 for e in ImageColor.getcolor("#29132E","RGBA")]) COLOR_1 = tuple([e/255 for e in ImageColor.getcolor("#321450","RGBA")]) @@ -27,7 +42,7 @@ COLOR_TEXT = tuple([e/255 for e in ImageColor.getcolor("#F887FF","RGBA")]) COLOR_TEXT_PASSED = tuple([e/255 for e in ImageColor.getcolor("#1AFE49","RGBA")]) COLOR_TEXT_FAILED = tuple([e/255 for e in ImageColor.getcolor("#FF124F","RGBA")]) -def impl_glfw_init(window_name="minimal ImGui/GLFW3 example", width=1280, height=720): +def impl_glfw_init(window_name="Grapher Tool", width=1280, height=720): if not glfw.init(): print("Could not initialize OpenGL context") exit(1) @@ -59,18 +74,18 @@ class GUI(object): gl.glClearColor(*self.backgroundColor) imgui.create_context() self.impl = GlfwRenderer(self.window) - + + # App states + self.select = 0 # Global GUI Setting - win_w, win_h = glfw.get_window_size(self.window) + '''win_w, win_h = glfw.get_window_size(self.window) fb_w, fb_h = glfw.get_framebuffer_size(self.window) font_scaling_factor = max(float(fb_w) / win_w, float(fb_h) / win_h) font_size_in_pixels = 30 io = imgui.get_io() - io.fonts.add_font_from_file_ttf( - "assets/MPLUSRounded1c-Regular.ttf", font_size_in_pixels - ) - io.font_global_scale /= font_scaling_factor + io.fonts.add_font_from_file_ttf("assets/MPLUSRounded1c-Regular.ttf", font_size_in_pixels * font_scaling_factor) + io.font_global_scale /= font_scaling_factor''' self.loop() @@ -78,7 +93,7 @@ class GUI(object): # Window Position and Sizing io = imgui.get_io() - imgui.set_next_window_size(io.display_size.x*0.3, io.display_size.y*0.3) + imgui.set_next_window_size(io.display_size.x*0.3, io.display_size.y*0.4) imgui.set_next_window_position(io.display_size.x*0.7, io.display_size.y*0.05) # Student accumulated Info @@ -92,8 +107,10 @@ class GUI(object): imgui.text("No Student selected") return - s = f"{student.name} {overall_points}/{overall_max}" - imgui.text_colored(s, *COLOR_TEXT) + s = f"{overall_points}/{overall_max} | {round(overall_points/overall_max*100, 1)}%" + imgui.text_colored(student.name, *COLOR_TEXT) + w, h = imgui.get_window_size() + imgui.progress_bar(overall_points/overall_max, (w*0.5, h*0.1), s) imgui.text("Jupyter ID:") imgui.text_colored(student.jupyter_id.rjust(4+len(student.jupyter_id), " "), *COLOR_TEXT) @@ -110,35 +127,65 @@ class GUI(object): # Window Position and Sizing io = imgui.get_io() - imgui.set_next_window_size(max(min(io.display_size.x*0.2, 200), 120), io.display_size.y*0.9) - imgui.set_next_window_position(io.display_size.y*0.01, io.display_size.y*0.05) - - # Boiler - selected = [False for _ in range(len(students))] - visible = True + imgui.set_next_window_size(io.display_size.x*0.15, io.display_size.y*0.95) + imgui.set_next_window_position(0, io.display_size.y*0.05) with imgui.begin("Student Table", False, imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_COLLAPSE): if not students: imgui.text("No Dataset selected") return - for i, student in enumerate(students): - _, selected[i] = imgui.selectable(student, selected[i]) + for n, student in enumerate(students): + opened, _ = imgui.selectable(student.name, self.select == n) + if opened: + self.select = n + + + def student_graph(self, student: Student): + + # Window Position and Sizing + io = imgui.get_io() + imgui.set_next_window_size(io.display_size.x*0.55, io.display_size.y*0.4) + imgui.set_next_window_position(io.display_size.x*0.15, io.display_size.y*0.05) + + # Setup Data + data = numpy.array([float(lecture.points) / float(lecture.max_points) * 100 for lecture in student.lectures], dtype=numpy.float32) + + with imgui.begin("Student Graph", False, imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_COLLAPSE): + if not students: + imgui.text("No Dataset selected") + return + imgui.plot_histogram( + "##Data", data, overlay_text="Performance per Lecture (in %)", + scale_min=0.0, scale_max=100, + graph_size=imgui.get_content_region_available() + ) + + def header(self): + + # Window Position and Sizing + io = imgui.get_io() + imgui.set_next_window_size(io.display_size.x, io.display_size.y*0.05) + imgui.set_next_window_position(0, 0) + + with imgui.begin("HEADER", False, imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_COLLAPSE | imgui.WINDOW_NO_TITLE_BAR): + imgui.set_window_font_scale(1.5) + text = "Student Analyzer" + ww = imgui.get_window_size().x + tw = imgui.calc_text_size(text).x + imgui.set_cursor_pos_x((ww - tw) * 0.5) + imgui.text("Student Analyzer") def loop(self): - - phil = Student( - "Phil Keier", "772fb04b24caa68fd38a05ec2a22e62b", "Geomapping", - [Lecture("1. Tutorial 1", 28.5, 31), Lecture("2. Tutorial 2", 4.5, 15), Lecture("3. Extended Application", 18, 18)] - ) - while not glfw.window_should_close(self.window): glfw.poll_events() self.impl.process_inputs() imgui.new_frame() - - self.table(["Phil Keier", "Nova Eib", "Katharina Walz"]) - self.student_info(phil) + + self.header() + self.table(students) + self.student_info(students[self.select]) + self.student_graph(students[self.select]) #imgui.show_test_window() imgui.render()