def show_main_menu(): global text, ip_text style: GuiStyle = imgui.get_style() style.window_border_size = 0 style.colors[imgui.COLOR_BUTTON] = Vec4(0.26, 0.59, 0.5, 0.4) style.colors[imgui.COLOR_BUTTON_ACTIVE] = Vec4(0.06, 0.53, 0.4, 1.0) style.colors[imgui.COLOR_BUTTON_HOVERED] = Vec4(0.26, 0.59, 0.5, 1.0) imgui.set_next_window_bg_alpha(0) imgui.set_next_window_position(300, 220) imgui.set_next_window_size(180, 200) imgui.begin("tremor0", False, imgui.WINDOW_NO_COLLAPSE | imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_TITLE_BAR | imgui.WINDOW_ALWAYS_USE_WINDOW_PADDING) _, username = imgui.input_text("Name", text, 16) _, ip = imgui.input_text("Host", ip_text, 32) ip_text = ip text = username imgui.end() imgui.set_next_window_bg_alpha(0) imgui.set_next_window_size(100, 100) imgui.set_next_window_position(200, 200) imgui.begin("tremor1", False, imgui.WINDOW_NO_COLLAPSE | imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_TITLE_BAR | imgui.WINDOW_ALWAYS_USE_WINDOW_PADDING) imgui.text_colored("Tremor", 0.9, 0.6, 1.0) play_clicked = imgui.button("Play", 82, 25) exit_clicked = imgui.button("Exit", 82, 25) if exit_clicked: graphics_subsystem.request_close() if play_clicked: print(username) client_net.connect_to_server((ip, 27070), username) imgui.end()
def render_callback(self, time: float, frametime: float): if imgui.begin_main_menu_bar(): if imgui.begin_menu("File", True): clicked_quit, selected_quit = imgui.menu_item( "Quit", 'Cmd+Q', False, True ) if clicked_quit: exit(1) imgui.end_menu() changed, value = imgui.input_text("", self.input_text, 30) if changed: imgui.set_next_window_position(imgui.get_item_rect_min().x, imgui.get_item_rect_max().y) imgui.set_next_window_size(imgui.get_item_rect_size().x, 0) if imgui.begin("##popup", False, imgui.WINDOW_NO_TITLE_BAR | imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE): for index, row in symbol_list.iterrows(): if value.upper() in row[0]: opened, selected = imgui.selectable(row[0] + " - " + row[2]) if imgui.is_item_clicked(): input_text = row[0] selected_symbol = row[0] imgui.end() if imgui.button("download"): yfc.download(self.selected_symbol, symbol_data_file()) imgui.end_main_menu_bar() pass
def draw(self): imgui.begin(self.title) changed, self.text_val = imgui.input_text('Text', self.text_val, 256) imgui.text('You wrote:') imgui.same_line() imgui.text(self.text_val) imgui.end()
def menu_bar(self): if imgui.begin_main_menu_bar(): if imgui.begin_menu("File", True): clicked_quit, selected_quit = imgui.menu_item( "Quit", 'Cmd+Q', False, True) if clicked_quit: self.cleanup() exit(0) imgui.end_menu() changed, value = imgui.input_text("", self.input_text, 30) if changed: imgui.set_next_window_position(imgui.get_item_rect_min().x, imgui.get_item_rect_max().y) imgui.set_next_window_size(imgui.get_item_rect_size().x, 0) if imgui.begin( "##popup", False, imgui.WINDOW_NO_TITLE_BAR | imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE): for index, row in self.symbol_list.iterrows(): if value.upper() in row[0]: _, _ = imgui.selectable(row[0] + " - " + row[2]) if imgui.is_item_clicked(): self.input_text = row[0] self.load_symbol(str(row[0]).lower()) imgui.end() imgui.end_main_menu_bar()
def draw_console(): global _console_text_temp if console.SHOW_CONSOLE: imgui.set_next_window_bg_alpha(0.35) imgui.set_next_window_position(0, 0) imgui.set_next_window_size(screen_utils.WIDTH, 110) imgui.begin( "ConsoleWindow", False, imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_COLLAPSE | imgui.WINDOW_NO_TITLE_BAR | imgui.WINDOW_NO_SAVED_SETTINGS) imgui.begin_child("ConsoleOutput", 0, -25, False) for text, color in console.text_buffer: if color is None: color = (0.25, 0.75, 1) imgui.text_colored(text, color[0], color[1], color[2], 0.8) imgui.text("") imgui.set_scroll_y(imgui.get_scroll_max_y()) imgui.end_child() buf_size = 256 if len(_console_text_temp) > 0 and not _console_text_temp[0] == "/": buf_size = 64 enter, text = imgui.input_text("Input", _console_text_temp, buf_size, imgui.INPUT_TEXT_ENTER_RETURNS_TRUE) if enter: if str.startswith(text, "/"): text = str.replace(text, "/", "", 1) console.handle_input(text) else: client_net.send_message(text) text = "" _console_text_temp = text imgui.end()
def _show(self, value, read_only): imgui.push_item_width(self.width) changed, v = imgui.input_text("", value.value, 255, imgui.INPUT_TEXT_ENTER_RETURNS_TRUE) if imgui.is_item_hovered() and not imgui.is_item_active(): imgui.set_tooltip(value.value) if changed: value.value = v
def _show_custom_ui(self): imgui.push_item_width(widget.WIDGET_WIDTH) if self.duplicate: imgui.push_style_color(imgui.COLOR_TEXT, 1.0, 0.0, 0.0) changed, v = imgui.input_text("", self.get("name"), 255, imgui.INPUT_TEXT_ENTER_RETURNS_TRUE) if self.duplicate: imgui.pop_style_color() if imgui.is_item_hovered(): imgui.set_tooltip("Name is a duplicate!") if changed: self.name = v
def function(self, fun): import tide.generators.nodes as nodes f: nodes.FunctionDef = fun imgui.begin_group() imgui.text('def') imgui.same_line() imgui.input_text('nolavel', f.name) imgui.same_line() imgui.text('(') imgui.same_line() imgui.text(')') imgui.same_line() imgui.text('->') imgui.same_line() imgui.text(str(f.returns)) imgui.same_line() imgui.text(':') imgui.end_group()
def _edit_field_arcs(self, field_geometry: GeometryFieldSize): while len(self._field_arc_expanded) < len(field_geometry.field_arcs): self._field_arc_expanded.append(False) while len(self._field_arc_expanded) > len(field_geometry.field_arcs): del self._field_arc_expanded[-1] imgui.text("Field Arcs") imgui.separator() arcs_to_delete = [] for i, arc in enumerate(field_geometry.field_arcs): expanded, visible = imgui.collapsing_header( arc.name, True, imgui.TREE_NODE_DEFAULT_OPEN if self._field_arc_expanded[i] else 0, ) if not visible: arcs_to_delete.append(i) if expanded: self._field_arc_expanded[i] = True changed, value = imgui.input_text(f"Name##{i}", arc.name, 255) if changed: arc.name = value changed, values = imgui.input_float2("Center", arc.center.x, arc.center.y) if changed: arc.center.x, arc.center.y = values changed, values = imgui.input_float(f"Radius##{i}", arc.radius) if changed: if value > 0: arc.radius = value else: self._log.error( f"Arc radius must be > 0. Got {arc.radius}") changed, values = imgui.input_float2( f"Start Angle, End Angle##{i}", arc.a1, arc.a2) if changed: arc.a1, arc.a2 = sorted(values) changed, value = imgui.input_float(f"Thickness##{i}", arc.thickness) if changed: if value > 0: arc.thickness = value else: self._log.error("Field arc must have thickness > 0. " f"Got {arc.thickness}") for arc in arcs_to_delete[::-1]: del field_geometry.field_arcs[arc] del self._field_arc_expanded[arc] if imgui.button("Add field arc"): new_arc = field_geometry.field_arcs.add() new_arc.radius = 1000 new_arc.thickness = 10 self._field_arc_expanded.append(False)
def _imgui_pick_file_menu(base_path, wildcard="*"): MAX_FILE_DISPLAY_LENGTH = 60 try: entries = [] for name in os.listdir(base_path): entries.append( (not os.path.isdir(os.path.join(base_path, name)), name)) imgui.text("New:") imgui.same_line() imgui.push_item_width(-1) changed, value = imgui.input_text("", "", 255, imgui.INPUT_TEXT_ENTER_RETURNS_TRUE) if changed: return os.path.join(base_path, value) imgui.separator() for w in WILDCARDS: if imgui.button(w): return os.path.join(base_path, w) imgui.same_line() imgui.dummy(0, 0) imgui.separator() if len(entries) == 0: imgui.dummy(200, 0) for not_is_dir, name in sorted(entries): display_name = name if len(display_name) > MAX_FILE_DISPLAY_LENGTH: display_name = display_name[:MAX_FILE_DISPLAY_LENGTH // 2] + "..." + display_name[ -MAX_FILE_DISPLAY_LENGTH // 2:] if not not_is_dir: if imgui.begin_menu(display_name): selected_path = _imgui_pick_file_menu( os.path.join(base_path, name), wildcard) imgui.end_menu() if selected_path is not None: return os.path.join(base_path, selected_path) else: if not fnmatch.fnmatch(name, wildcard): continue clicked, state = imgui.menu_item(display_name, None, False) if clicked: return os.path.join(base_path, name) imgui.separator() imgui.text("Pick: %s" % wildcard) except: imgui.text("Unable to open dir")
def obf_input_text(name, value, buffer_length=255, tag=None, flags=imgui.INPUT_TEXT_PASSWORD): while True: changed, new_value = imgui.input_text(name, value, buffer_length, flags) if changed: return (name if tag is None else tag), new_value else: yield
def input_text(name, value, buffer_length=255, tag=None, flags=0): """ Text input. Flags are [defined by PyImGui](https://pyimgui.readthedocs.io/en/latest/guide/inputtext-flags.html#inputtext-flag-options). `buffer_length` doesn't affect widget size on screen, it limits the maximum character count only. """ while True: changed, new_value = imgui.input_text(name, value, buffer_length, flags) if changed: return (name if tag is None else tag), new_value else: yield
def main(): imgui.create_context() window = impl_glfw_init() impl = GlfwRenderer(window) ip_address = "localhost:3333" #imgui.set_window_font_scale(1.0) comms = MouseSocket() click_guard = True while not glfw.window_should_close(window): glfw.poll_events() impl.process_inputs() imgui.new_frame() imgui.set_next_window_size(300, 120) imgui.set_next_window_position(10, 0) imgui.begin("", False, imgui.WINDOW_NO_RESIZE) changed, ip_address = imgui.input_text(label="IP:PORT", value=ip_address, buffer_length=30) clicked = imgui.button(label="CONNECT") if clicked: comms.connect(ip_address) max_x, max_y = glfw.get_window_size(window) x, y = glfw.get_cursor_pos(window) norm_x = x / max_x norm_y = y / max_y state = glfw.get_mouse_button(window, glfw.MOUSE_BUTTON_LEFT) if state == glfw.PRESS: click_guard = False elif state == glfw.RELEASE and not click_guard: click_guard = True comms.send_click(norm_x, norm_y) comms.send_mouse_coords(norm_x, norm_y) imgui.text("Mouse Coords: {:.2f}, {:.2f}".format(norm_x, norm_y)) imgui.text("Connected: {}".format(comms.is_connected)) imgui.end() gl.glClear(gl.GL_COLOR_BUFFER_BIT) imgui.render() impl.render(imgui.get_draw_data()) glfw.swap_buffers(window) impl.shutdown() glfw.terminate()
def draw_mode(): changed, text_val = imgui.input_text("Name: ", cur_state.map_data.name, buffer_length=64) if changed: cur_state.map_data.name = text_val imgui.text("{} mode".format(cur_state.mode.value)) for k in MODE_DRAW_FUNCS.keys(): # if can_switch_to(k.value): if imgui.radio_button(k.value, cur_state.mode == k): cur_state.mode = k MODE_DRAW_FUNCS[cur_state.mode](cur_state)
def _edit_field_lines(self, field_geometry: GeometryFieldSize): while len(self._field_line_expanded) < len(field_geometry.field_lines): self._field_line_expanded.append(False) while len(self._field_line_expanded) > len(field_geometry.field_lines): del self._field_line_expanded[-1] imgui.text("Field Lines") imgui.separator() lines_to_delete = [] for i, line in enumerate(field_geometry.field_lines): expanded, visible = imgui.collapsing_header( f"{line.name}##{i}", True, imgui.TREE_NODE_DEFAULT_OPEN if self._field_line_expanded[i] else 0, ) if not visible: lines_to_delete.append(i) if expanded: self._field_line_expanded[i] = True changed, value = imgui.input_text(f"Name##{i}", line.name, 255) if changed: line.name = value changed, values = imgui.input_float2(f"P1##{i}", line.p1.x, line.p1.y) if changed: line.p1.x, line.p1.y = values[0], values[1] changed, values = imgui.input_float2(f"P2##{i}", line.p2.x, line.p2.y) if changed: line.p2.x, line.p2.y = values[0], values[1] changed, value = imgui.input_float(f"Thickness##{i}", line.thickness) if changed: if value > 0: line.thickness = value else: self._log.error("Field line must have thickness > 0. " f"Got {line.thickness}") else: self._field_line_expanded[i] = False for line in lines_to_delete[::-1]: del field_geometry.field_lines[line] del self._field_line_expanded[line] if imgui.button("Add field line"): new_line = field_geometry.field_lines.add() new_line.thickness = 10 self._field_line_expanded.append(False)
def draw_saveas_window(self, width, height): imgui.set_next_window_size(width * 2 / 8, height / 8) imgui.begin("Save Snapshot As...", flags=imgui.WINDOW_NO_RESIZE) _, self.saveas_file = imgui.input_text("Filename", self.saveas_file, 256) if imgui.button("Save"): self.simulator.download_all(self.snapshot.buffers) self.snapshot.time = self.simulator.time self.snapshot.save(f"snapshots/{self.saveas_file}") self.snapshots = [ f for f in os.listdir("snapshots") if f.endswith(".npz") ] self.current_snapshot = self.snapshots.index(self.saveas_file) self.selected_snapshot = self.current_snapshot self.show_saveas = False imgui.end()
def _show(self, value, read_only): imgui.push_item_width(self.width) changed, v = imgui.input_text("", value.value, 255, imgui.INPUT_TEXT_ENTER_RETURNS_TRUE) if imgui.is_item_hovered() and not imgui.is_item_active(): imgui.set_tooltip(value.value) if changed: value.value = v return imgui.push_item_width(self.width) if imgui.button("Select file"): imgui.open_popup("select_file") path = imgui_pick_file("select_file", assets.ASSET_PATH + "/" + self.prefix) if path is not None: value.value = os.path.relpath(path, assets.ASSET_PATH)
def render_ui(self): imgui.new_frame() imgui.begin("") if imgui.button("capture"): pass if imgui.button("brush"): self.mode = Mode.BRUSH changed, self.input_text = imgui.input_text("input", self.input_text, 255) if changed: pass imgui.end() imgui.render() self.imgui_renderer.render(imgui.get_draw_data())
def _show_custom_ui(self): imgui.dummy(1, 5) imgui.text("lambda x:") imgui.push_item_width(208) changed, text = imgui.input_text("", self.get("lambda"), 255, imgui.INPUT_TEXT_ENTER_RETURNS_TRUE) if changed: self.get_input("lambda").value = text if self.compile_error is not None: imgui.text_colored("Compilation error. (?)", 1.0, 0.0, 0.0) if imgui.is_item_hovered(): imgui.set_tooltip(self.compile_error) elif self.run_error is not None: imgui.text_colored("Runtime error. (?)", 1.0, 0.0, 0.0) if imgui.is_item_hovered(): imgui.set_tooltip(self.run_error) else: imgui.text("Lambda compiled.")
def draw_btn_bar(self): # 按钮栏 utils.set_cursor_offset(6, 0) if imgui.button("clear"): print("清理") self.log_mgr.clear() imgui.same_line() # log等级 for idx, log_level in enumerate(self.log_level_lst): is_check = self.config.is_has_log_level(log_level) ret = imgui.checkbox(self.log_level[idx], is_check) imgui.same_line() if ret[1] == is_check: continue if ret[1]: self.config.add_log_level(log_level) else: self.config.remove_log_level(log_level) # 搜索框 imgui.same_line() old_text = self.config.get_string(EConfigKey.CONTENT_SEARCH_TEXT) imgui.push_item_width(240) imgui.push_id(EConfigKey.CONTENT_SEARCH_TEXT) ret = imgui.input_text("", old_text, 128) imgui.pop_id() if ret[0]: self.on_search_text_change(ret[1]) imgui.pop_item_width() imgui.same_line() utils.set_cursor_offset(-8, 0) if imgui.button("清空"): self.on_search_text_change("") # 是否固定到底部 imgui.same_line() is_to_bottom = self.config.get_bool( EConfigKey.CONTENT_SCROLL_TO_BOTTOM, True) ret = imgui.checkbox("bottom", is_to_bottom) if ret[1] != is_to_bottom: self.config.set_bool(EConfigKey.CONTENT_SCROLL_TO_BOTTOM, ret[1])
def render(self, time: float, frametime: float): global selected_symbol global input_text self.candlestick_chart.render() imgui.new_frame() if imgui.begin_main_menu_bar(): if imgui.begin_menu("File", True): clicked_quit, selected_quit = imgui.menu_item( "Quit", 'Cmd+Q', False, True ) if clicked_quit: exit(1) imgui.end_menu() changed, value = imgui.input_text("", input_text, 30) if changed: imgui.set_next_window_position(imgui.get_item_rect_min().x, imgui.get_item_rect_max().y) imgui.set_next_window_size(imgui.get_item_rect_size().x, 0) if imgui.begin("##popup", False, imgui.WINDOW_NO_TITLE_BAR | imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE): for index, row in symbol_list.iterrows(): if value.upper() in row[0]: opened, selected = imgui.selectable(row[0] + " - " + row[2]) if imgui.is_item_clicked(): input_text = row[0] selected_symbol = row[0] imgui.end() if imgui.button("download"): yfc.download(selected_symbol, symbol_data_file()) imgui.end_main_menu_bar() if not imgui.get_io().want_capture_mouse: self.candlestick_chart.render_gui() # if len(df): # graphics.draw_table(df, 0) imgui.show_test_window() imgui.render() self.imgui.render(imgui.get_draw_data())
def render(self, scene): imgui.new_frame() changed = False if scene is not None: imgui.style_colors_classic() imgui.begin("Scene") imgui.text("Filename Template:") _, self.snapshot_format = imgui.input_text("", self.snapshot_format, 256) if imgui.button("Save Snapshot"): # Call render again, since we're in the middle of overlaying # some stuff and we want a clean scene snapshot scene.render() write_bitmap( scene.image[:, :, :3], self.snapshot_format.format(count=self.snapshot_count), ) self.snapshot_count += 1 if imgui.tree_node("Debug"): if imgui.button("Save Depth"): scene.render() write_image( scene.depth, self.snapshot_format.format(count=self.snapshot_count), ) self.snapshot_count += 1 imgui.tree_pop() _ = self.render_camera(scene) changed = changed or _ # imgui.show_style_editor() for i, element in enumerate(scene): if imgui.tree_node(f"element {i + 1}: {element.name}"): changed = changed or element.render_gui( imgui, self.renderer, scene) imgui.tree_pop() self.window._do_update = self.window._do_update or changed imgui.end() imgui.render() self.renderer.render(imgui.get_draw_data())
def draw_mode(): draw_funcs = { Mode.SECTOR: draw_sector_mode, Mode.LINE: draw_line_mode, Mode.VERTEX: draw_vert_mode } changed, text_val = imgui.input_text("Name: ", cur_state.map_data.name, buffer_length=64) if changed: cur_state.map_data.name = text_val imgui.text("{} mode".format(cur_state.mode.value)) for k in draw_funcs.keys(): #if can_switch_to(k.value): if imgui.radio_button(k.value, cur_state.mode == k): cur_state.mode = k draw_funcs[cur_state.mode]()
def MudClientWindow(MudData): # mud content MudData['World_text_changed'], MudData['World_text'] = imgui.input_text_multiline( '\n', MudData['World_text'], 50000, 1280, 660, imgui.INPUT_TEXT_READ_ONLY ) imgui.begin_group() imgui.text("Input:") imgui.same_line() MudData['Player_text_changed'], MudData['Player_text'] = imgui.input_text( '\n\n', MudData['Player_text'], 1920, imgui.INPUT_TEXT_ENTER_RETURNS_TRUE ) imgui.end_group() if imgui.button("keyboard"): imgui.open_popup("select-popup")
def draw_input_bar(self): utils.set_cursor_offset(6, 0) cur_cmd = self.config.get_current_cmd() cur_txt = self.cur_edit_txt if self.is_edit_cmd else cur_cmd # win_width = imgui.get_window_width() # win_height = imgui.get_window_height() imgui.push_item_width(520) imgui.push_id(EConfigKey.CONTENT_CMD_TXT) ret = imgui.input_text( "", cur_txt, 1024, imgui.INPUT_TEXT_ENTER_RETURNS_TRUE | imgui.INPUT_TEXT_CALLBACK_COMPLETION | imgui.INPUT_TEXT_CALLBACK_HISTORY, self.input_bar_callback) self.is_edit_cmd = ret[1] != cur_cmd if self.is_edit_cmd: self.cur_edit_txt = ret[1] if ret[0]: self._send_cmd(ret[1]) # print "hello world", ret[1] imgui.pop_id() imgui.same_line() utils.set_cursor_offset(-8, 0) if imgui.button("发送命令"): self._send_cmd(ret[1])
def render_plugins_ui(window): "Draw UI windows for all plugins active for the current drawing." if not window.drawing: return drawing = window.drawing deactivated = set() for name, args in window.drawing.active_plugins.items(): plugin, sig = window.plugins[name] _, opened = imgui.begin(f"{ name } ##{ drawing.path or drawing.uuid }", True) if not opened: deactivated.add(name) imgui.columns(2) for param_name, param_sig in islice(sig.items(), 4, None): if param_sig.annotation == inspect._empty: continue imgui.text(param_name) imgui.next_column() default_value = args.get(param_name) if default_value is not None: value = default_value else: value = param_sig.default label = f"##{param_name}_val" if param_sig.annotation == int: changed, args[param_name] = imgui.drag_int(label, value) elif param_sig.annotation == float: changed, args[param_name] = imgui.drag_float(label, value) elif param_sig.annotation == str: changed, args[param_name] = imgui.input_text(label, value, 20) elif param_sig.annotation == bool: changed, args[param_name] = imgui.checkbox(label, value) imgui.next_column() imgui.columns(1) texture_and_size = getattr(plugin, "texture", None) if texture_and_size: texture, size = texture_and_size w, h = size ww, wh = imgui.get_window_size() scale = max(1, (ww - 10) // w) imgui.image(texture.name, w * scale, h * scale, border_color=(1, 1, 1, 1)) if hasattr(plugin, "ui"): result = plugin.ui(oldpaint, imgui, window.drawing, window.brush, **args) if result: args.update(result) last_run = getattr(plugin, "last_run", 0) period = getattr(plugin, "period", None) t = time() # TODO I've seen more readable if-statements in my days... if callable(plugin) and ((period and t > last_run + period) or (not period and imgui.button("Execute"))): plugin.last_run = t try: result = plugin(oldpaint, imgui, window.drawing, window.brush, **args) if result: args.update(result) except Exception: # We don't want crappy plugins to ruin everything # Still probably probably possible to crash opengl though... logger.error(f"Plugin {name}: {format_exc()}") imgui.button("Help") if imgui.begin_popup_context_item("Help", mouse_button=0): if plugin.__doc__: imgui.text(inspect.cleandoc(plugin.__doc__)) else: imgui.text("No documentation available.") imgui.end_popup() imgui.end() for name in deactivated: window.drawing.active_plugins.pop(name, None)
for button in range(joystick.get_numbuttons()): value = joystick.get_button(button) imgui.selectable("Button %s: %s" % (button, value)) if imgui.begin_drag_drop_source(): imgui.set_drag_drop_payload( "input", ("Button " + str(button)).encode()) imgui.text("Button %s: %s" % (button, value)) imgui.end_drag_drop_source() imgui.end() if local_motors: imgui.begin("Motor server IP address and port") changed, ip_address = imgui.input_text("IP address", other[0], 512) if changed: other = (ip_address, other[1]) changed, port = imgui.input_int("Port", other[1]) if changed: other = (other[0], port) else: imgui.begin("Motor client IP address and port") changed, ip_address = imgui.input_text("IP address", other[0], 512) if changed: other = (ip_address, other[1])
def update(self): # return done, value do_return = False recipe = '' if self.extra_font: imgui.push_font(self.extra_font) width = 750 height = 250 imgui.set_next_window_size(width, height) imgui.set_next_window_position(self.center_x - width // 2, self.center_y - height // 2) imgui.push_style_var(imgui.STYLE_ALPHA, self.alpha) imgui.begin('Drop', False, flags=self.flags) self.left_label('ID:') xx, self.id = imgui.input_text('\n', self.id, 128) self.tooltip_help('Participant ID/Name') self.add_space(3) self.left_label('Español:') _, self.spanish = imgui.checkbox('', self.spanish) self.tooltip_help('Spanish text for subsequent instructions') self.add_space(3) self.left_label('Recipe:') # current filenames recipe_names = [] recipe_short = [] for file in glob.glob('recipes/**/*.toml', recursive=True): if (os.path.sep + 'defaults' + os.path.sep) not in file: recipe_names.append(file) recipe_short.append(os.path.relpath(file, 'recipes')) changed, self.current_recipe = imgui.combo(' ', self.current_recipe, recipe_short) self.tooltip_help( 'Available recipes (TOML files) in the recipe directory') imgui.same_line() imgui.button('Preview') if imgui.is_item_hovered() and recipe_names: with open(recipe_names[self.current_recipe], 'r') as f: prev = f.read() # width in characters, height in number of newlines if prev: wid = len( max(open(recipe_names[self.current_recipe], 'r'), key=len)) # TODO: need to be careful of newline char?? hei = prev.count('\n') + 1 else: wid = 10 hei = 1 fac = 0.6 font_size = imgui.get_font_size() * fac wid = int(wid * font_size / 2) # get something like pix hei = int(hei * font_size) # if height is >= half the window height, turn to scroll val = hei if hei >= self.center_y: val = self.center_y imgui.begin_tooltip() imgui.begin_child('region', wid, val) imgui.set_scroll_y(imgui.get_scroll_y() - imgui.get_io().mouse_wheel * 30) imgui.set_window_font_scale(fac) imgui.text(prev) imgui.end_child() imgui.end_tooltip() imgui.set_item_default_focus() # imgui.set_tooltip(prev) self.add_space(3) if imgui.button('Ok'): do_return = True if imgui.get_io().keys_down[imgui.KEY_ENTER]: do_return = True imgui.pop_style_var(1) imgui.end() if self.extra_font: imgui.pop_font() # disallow depending on current state if not self.id: do_return = False try: recipe = recipe_names[self.current_recipe] except IndexError: do_return = False if not os.path.isdir(self.recipe_dir): do_return = False # no need to validate data dir, we'll create it data = { 'id': self.id, 'recipe': recipe, 'spanish': 'es' if self.spanish else 'en' } return do_return, data
def image_explorer_impl(im, title=""): # type: (ImageWithZoomInfo, str) -> None """ :return: imgui.Vec2 (mouse_location_original_image) or None (if not on image) """ if im.image.size == 0: imgui.text("empty image !") return imgui.Vec2(0, 0) zoomed_image = im.zoomed_image() if not im.hide_buttons: _display_zoom_or_pan_buttons(im) if title != "": imgui.same_line() imgui.text(" " + title) mouse_location = imgui_cv.image(zoomed_image, image_adjustments=im.image_adjustments) mouse_location_original_image = None viewport_center_original_image = im.viewport_center_original_image() if not im.hide_buttons and mouse_location is not None: mouse_drag_button = 0 is_mouse_dragging = imgui.is_mouse_dragging( mouse_drag_button) and imgui.is_item_hovered() drag_delta = imgui.get_mouse_drag_delta(mouse_drag_button) mouse_location_original_image = im.zoom_info.mouse_location_original_image( mouse_location) # Handle dragging / zoom or pan if not is_mouse_dragging: im.zoom_info.last_delta = imgui.Vec2(0, 0) if is_mouse_dragging: drag_delta_delta = imgui.Vec2( drag_delta.x - im.zoom_info.last_delta.x, drag_delta.y - im.zoom_info.last_delta.y) if im.zoom_info.zoom_or_pan == ZoomOrPan.Zoom: k = 1.03 if drag_delta.y < 0: zoom_ratio = k else: zoom_ratio = 1. / k im.zoom_info.affine_transform = np.dot( im.zoom_info.affine_transform, compute_zoom_matrix(mouse_location_original_image, zoom_ratio)) if im.zoom_info.zoom_or_pan == ZoomOrPan.Pan: im.zoom_info.affine_transform = np.dot( im.zoom_info.affine_transform, compute_pan_matrix(drag_delta_delta, im.zoom_info.affine_transform[0, 0])) im.zoom_info.last_delta = drag_delta # Zoom & Pan buttons def perform_zoom(ratio): im.zoom_info.affine_transform = np.dot( im.zoom_info.affine_transform, compute_zoom_matrix(viewport_center_original_image, ratio)) import functools perform_zoom_plus = functools.partial(perform_zoom, 1.25) perform_zoom_minus = functools.partial(perform_zoom, 1. / 1.25) def perform_scale_one(): im.zoom_info.set_scale_one(SizePixel.from_image(im.image), im.current_viewport_size()) def perform_full_view(): im.zoom_info.set_full_view(SizePixel.from_image(im.image), im.current_viewport_size()) def perform_force_viewport_size(): im.set_force_viewport_size(True) def perform_reset_viewport_size(): im.set_force_viewport_size(False) def perform_hide_buttons(): im.hide_buttons = True def perform_show_buttons(): im.hide_buttons = False def show_zoom_button(name, action, same_line=True): if imgui.small_button(imgui_ext.make_unique_label(name)): action() if same_line: imgui.same_line() if im.hide_buttons: show_zoom_button("+", perform_show_buttons, False) imgui.same_line() imgui.text(title) else: show_zoom_button("-", perform_hide_buttons) if not im.hide_buttons: show_zoom_button("zoom +", perform_zoom_plus) show_zoom_button("zoom -", perform_zoom_minus) if im.can_show_big_viewport(): show_zoom_button("scale 1", perform_scale_one) if im.is_not_full_view(): show_zoom_button("full view", perform_full_view) if not im.show_adjustments: if imgui.small_button(imgui_ext.make_unique_label("Adjust")): im.show_adjustments = True # adjustments if im.show_adjustments: imgui.new_line() imgui.text("Adjust:") imgui.same_line() imgui.push_item_width(80) # noinspection PyArgumentList changed, im.image_adjustments.factor = imgui.slider_float( imgui_ext.make_unique_label("k"), im.image_adjustments.factor, 0., 32., display_format="%.3f", power=5.) imgui.same_line() imgui.push_item_width(80) changed, im.image_adjustments.delta = imgui.slider_float( imgui_ext.make_unique_label("delta"), im.image_adjustments.delta, 0., 255., display_format="%.3f", power=5.) imgui.same_line() if not im.image_adjustments.is_none(): if imgui.small_button(imgui_ext.make_unique_label("reset")): im.image_adjustments = imgui_cv.ImageAdjustments() imgui.same_line() if imgui.small_button(imgui_ext.make_unique_label("hide adjust")): im.show_adjustments = False # Show image info image_type_msg = str(im.image.dtype) + str(im.image.shape) zoom = im.zoom_info.affine_transform[0, 0] import math if not _is_close(zoom, 1): zoom_msg = "Zoom:{0:.2f} ".format(zoom) else: zoom_msg = "" msg = zoom_msg + image_type_msg imgui.text(msg) if im.can_show_big_viewport(): imgui.same_line() if im.get_force_viewport_size(): show_zoom_button("reset viewport", perform_reset_viewport_size) else: show_zoom_button("fit viewport", perform_force_viewport_size) imgui.new_line() # Save button # imgui.same_line() imgui.push_item_width(60) changed, im.filename = imgui.input_text( imgui_ext.make_unique_label(""), im.filename, 1000) imgui.same_line() if imgui.small_button(imgui_ext.make_unique_label("save")): cv2.imwrite(im.filename, im.image) # Show pixel color info if mouse_location is not None: color = zoomed_image[int(round(mouse_location.y)), int(round(mouse_location.x))] mouse2 = np.array([[mouse_location.x], [mouse_location.y], [1.]]) pt_original = np.dot( numpy.linalg.inv(im.zoom_info.affine_transform), mouse2) position_msg = "({0},{1})".format(int(round(pt_original[0, 0])), int(round(pt_original[1, 0]))) imgui.text(position_msg + " " + color_msg(color)) else: imgui.text("") return mouse_location_original_image
def display_parameter(parameter, editable): global slider_indexes if parameter.type == "List": if len(parameter.list) == 0: imgui.text("Empty list") else: if parameter.id not in slider_indexes: slider_indexes[parameter.id] = 0 changed, values = imgui.slider_int("index", slider_indexes[parameter.id], 0, len(parameter.list)-1) if changed: slider_indexes[parameter.id] = values display_parameter(parameter.list[slider_indexes[parameter.id]], editable) if parameter.type == "Image": if parameter.image: image_to_texture = get_gl_texture(parameter.image, parameter.timestamp) # imgui.image(image_texture, image_width, image_height) window_width = 256 # imgui.get_window_width() display_width = 0 display_height = 0 image_width = image_to_texture.gl_widh image_height = image_to_texture.gl_height if image_width >= image_height: display_width = window_width display_height = image_height / (image_width/float(display_width)) else: display_height = window_width display_width = image_width / (image_height/float(display_height)) imgui.image(image_to_texture.gl_texture, display_width, display_height) imgui.text("width: " + str(parameter.image.width)) imgui.text("height: " + str(parameter.image.height)) else: imgui.text("No image available - run workflow or connect an image source") elif parameter.type == "Rectangle": if editable: changed, value = imgui.input_float("Left", parameter.left) if changed: parameter.left = value changed, value = imgui.input_float("Top", parameter.top) if changed: parameter.top = value changed, value = imgui.input_float("Right", parameter.right) if changed: parameter.right = value changed, value = imgui.input_float("Bottom", parameter.bottom) if changed: parameter.left = value else: imgui.text("Left: " + str(parameter.left)) imgui.text("Top: " + str(parameter.top)) imgui.text("Right: " + str(parameter.right)) imgui.text("Bottom: " + str(parameter.bottom)) elif parameter.type == "Coordinates": if editable: changed, value = imgui.input_float("x", parameter.x) if changed: parameter.x = value changed, value = imgui.input_float("y", parameter.y) if changed: parameter.y = value else: imgui.text("x: " + str(parameter.x)) imgui.text("y: " + str(parameter.y)) elif parameter.type == "Integer": # to do change to "number" if editable: changed, value = imgui.input_int("Value", parameter.value) if changed: parameter.value = value else: imgui.text("Value: " + str(parameter.value)) elif parameter.type == "Color": changed, color = imgui.color_edit4(parameter.id, parameter.r, parameter.g, parameter.b, parameter.a) if editable and changed: parameter.r = color[0] parameter.g = color[1] parameter.b = color[2] parameter.a = color[3] elif parameter.type == "URL": changed, textval = imgui.input_text(parameter.id, parameter.url, 1024) if editable and changed: parameter.url = textval if editable: if imgui.button("browse..."): root = tk.Tk() root.withdraw() file_path = filedialog.askopenfilename() if file_path: parameter.url = file_path elif parameter.type == "Text": changed, textval = imgui.input_text(parameter.id, parameter.text, 1024) if editable and changed: parameter.text = textval