| |
| |
| |
| |
| |
| |
| |
|
|
| import os |
| import imgui |
| import imgui.integrations.glfw |
|
|
| from . import glfw_window |
| from . import imgui_utils |
| from . import text_utils |
|
|
| |
|
|
| class ImguiWindow(glfw_window.GlfwWindow): |
| def __init__(self, *, title='ImguiWindow', font=None, font_sizes=range(14,24), **glfw_kwargs): |
| if font is None: |
| font = text_utils.get_default_font() |
| font_sizes = {int(size) for size in font_sizes} |
| super().__init__(title=title, **glfw_kwargs) |
|
|
| |
| self._imgui_context = None |
| self._imgui_renderer = None |
| self._imgui_fonts = None |
| self._cur_font_size = max(font_sizes) |
|
|
| |
| if os.path.isfile('imgui.ini'): |
| os.remove('imgui.ini') |
|
|
| |
| self._imgui_context = imgui.create_context() |
| self._imgui_renderer = _GlfwRenderer(self._glfw_window) |
| self._attach_glfw_callbacks() |
| imgui.get_io().ini_saving_rate = 0 |
| imgui.get_io().mouse_drag_threshold = 0 |
| self._imgui_fonts = {size: imgui.get_io().fonts.add_font_from_file_ttf(font, size) for size in font_sizes} |
| self._imgui_renderer.refresh_font_texture() |
|
|
| def close(self): |
| self.make_context_current() |
| self._imgui_fonts = None |
| if self._imgui_renderer is not None: |
| self._imgui_renderer.shutdown() |
| self._imgui_renderer = None |
| if self._imgui_context is not None: |
| |
| self._imgui_context = None |
| super().close() |
|
|
| def _glfw_key_callback(self, *args): |
| super()._glfw_key_callback(*args) |
| self._imgui_renderer.keyboard_callback(*args) |
|
|
| @property |
| def font_size(self): |
| return self._cur_font_size |
|
|
| @property |
| def spacing(self): |
| return round(self._cur_font_size * 0.4) |
|
|
| def set_font_size(self, target): |
| self._cur_font_size = min((abs(key - target), key) for key in self._imgui_fonts.keys())[1] |
|
|
| def begin_frame(self): |
| |
| super().begin_frame() |
|
|
| |
| self._imgui_renderer.mouse_wheel_multiplier = self._cur_font_size / 10 |
| if self.content_width > 0 and self.content_height > 0: |
| self._imgui_renderer.process_inputs() |
|
|
| |
| imgui.new_frame() |
| imgui.push_font(self._imgui_fonts[self._cur_font_size]) |
| imgui_utils.set_default_style(spacing=self.spacing, indent=self.font_size, scrollbar=self.font_size+4) |
|
|
| def end_frame(self): |
| imgui.pop_font() |
| imgui.render() |
| imgui.end_frame() |
| self._imgui_renderer.render(imgui.get_draw_data()) |
| super().end_frame() |
|
|
| |
| |
|
|
| class _GlfwRenderer(imgui.integrations.glfw.GlfwRenderer): |
| def __init__(self, *args, **kwargs): |
| super().__init__(*args, **kwargs) |
| self.mouse_wheel_multiplier = 1 |
|
|
| def scroll_callback(self, window, x_offset, y_offset): |
| self.io.mouse_wheel += y_offset * self.mouse_wheel_multiplier |
|
|
| |
|
|