# Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # # NVIDIA CORPORATION and its licensors retain all intellectual property # and proprietary rights in and to this software, related documentation # and any modifications thereto. Any use, reproduction, disclosure or # distribution of this software and related documentation without an express # license agreement from NVIDIA CORPORATION is strictly prohibited. import contextlib import imgui #---------------------------------------------------------------------------- def set_default_style(color_scheme='dark', spacing=9, indent=23, scrollbar=27): s = imgui.get_style() s.window_padding = [spacing, spacing] s.item_spacing = [spacing, spacing] s.item_inner_spacing = [spacing, spacing] s.columns_min_spacing = spacing s.indent_spacing = indent s.scrollbar_size = scrollbar s.frame_padding = [4, 3] s.window_border_size = 1 s.child_border_size = 1 s.popup_border_size = 1 s.frame_border_size = 1 s.window_rounding = 0 s.child_rounding = 0 s.popup_rounding = 3 s.frame_rounding = 3 s.scrollbar_rounding = 3 s.grab_rounding = 3 getattr(imgui, f'style_colors_{color_scheme}')(s) c0 = s.colors[imgui.COLOR_MENUBAR_BACKGROUND] c1 = s.colors[imgui.COLOR_FRAME_BACKGROUND] s.colors[imgui.COLOR_POPUP_BACKGROUND] = [x * 0.7 + y * 0.3 for x, y in zip(c0, c1)][:3] + [1] #---------------------------------------------------------------------------- @contextlib.contextmanager def grayed_out(cond=True): if cond: s = imgui.get_style() text = s.colors[imgui.COLOR_TEXT_DISABLED] grab = s.colors[imgui.COLOR_SCROLLBAR_GRAB] back = s.colors[imgui.COLOR_MENUBAR_BACKGROUND] imgui.push_style_color(imgui.COLOR_TEXT, *text) imgui.push_style_color(imgui.COLOR_CHECK_MARK, *grab) imgui.push_style_color(imgui.COLOR_SLIDER_GRAB, *grab) imgui.push_style_color(imgui.COLOR_SLIDER_GRAB_ACTIVE, *grab) imgui.push_style_color(imgui.COLOR_FRAME_BACKGROUND, *back) imgui.push_style_color(imgui.COLOR_FRAME_BACKGROUND_HOVERED, *back) imgui.push_style_color(imgui.COLOR_FRAME_BACKGROUND_ACTIVE, *back) imgui.push_style_color(imgui.COLOR_BUTTON, *back) imgui.push_style_color(imgui.COLOR_BUTTON_HOVERED, *back) imgui.push_style_color(imgui.COLOR_BUTTON_ACTIVE, *back) imgui.push_style_color(imgui.COLOR_HEADER, *back) imgui.push_style_color(imgui.COLOR_HEADER_HOVERED, *back) imgui.push_style_color(imgui.COLOR_HEADER_ACTIVE, *back) imgui.push_style_color(imgui.COLOR_POPUP_BACKGROUND, *back) yield imgui.pop_style_color(14) else: yield #---------------------------------------------------------------------------- @contextlib.contextmanager def item_width(width=None): if width is not None: imgui.push_item_width(width) yield imgui.pop_item_width() else: yield #---------------------------------------------------------------------------- def scoped_by_object_id(method): def decorator(self, *args, **kwargs): imgui.push_id(str(id(self))) res = method(self, *args, **kwargs) imgui.pop_id() return res return decorator #---------------------------------------------------------------------------- def button(label, width=0, enabled=True): with grayed_out(not enabled): clicked = imgui.button(label, width=width) clicked = clicked and enabled return clicked #---------------------------------------------------------------------------- def collapsing_header(text, visible=None, flags=0, default=False, enabled=True, show=True): expanded = False if show: if default: flags |= imgui.TREE_NODE_DEFAULT_OPEN if not enabled: flags |= imgui.TREE_NODE_LEAF with grayed_out(not enabled): expanded, visible = imgui.collapsing_header(text, visible=visible, flags=flags) expanded = expanded and enabled return expanded, visible #---------------------------------------------------------------------------- def popup_button(label, width=0, enabled=True): if button(label, width, enabled): imgui.open_popup(label) opened = imgui.begin_popup(label) return opened #---------------------------------------------------------------------------- def input_text(label, value, buffer_length, flags, width=None, help_text=''): old_value = value color = list(imgui.get_style().colors[imgui.COLOR_TEXT]) if value == '': color[-1] *= 0.5 with item_width(width): imgui.push_style_color(imgui.COLOR_TEXT, *color) value = value if value != '' else help_text changed, value = imgui.input_text(label, value, buffer_length, flags) value = value if value != help_text else '' imgui.pop_style_color(1) if not flags & imgui.INPUT_TEXT_ENTER_RETURNS_TRUE: changed = (value != old_value) return changed, value #---------------------------------------------------------------------------- def drag_previous_control(enabled=True): dragging = False dx = 0 dy = 0 if imgui.begin_drag_drop_source(imgui.DRAG_DROP_SOURCE_NO_PREVIEW_TOOLTIP): if enabled: dragging = True dx, dy = imgui.get_mouse_drag_delta() imgui.reset_mouse_drag_delta() imgui.end_drag_drop_source() return dragging, dx, dy #---------------------------------------------------------------------------- def drag_button(label, width=0, enabled=True): clicked = button(label, width=width, enabled=enabled) dragging, dx, dy = drag_previous_control(enabled=enabled) return clicked, dragging, dx, dy #---------------------------------------------------------------------------- def drag_hidden_window(label, x, y, width, height, enabled=True): imgui.push_style_color(imgui.COLOR_WINDOW_BACKGROUND, 0, 0, 0, 0) imgui.push_style_color(imgui.COLOR_BORDER, 0, 0, 0, 0) imgui.set_next_window_position(x, y) imgui.set_next_window_size(width, height) imgui.begin(label, closable=False, flags=(imgui.WINDOW_NO_TITLE_BAR | imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_MOVE)) dragging, dx, dy = drag_previous_control(enabled=enabled) imgui.end() imgui.pop_style_color(2) return dragging, dx, dy #----------------------------------------------------------------------------