diff --git a/src/OpenSimCreator/UI/SplashTab.cpp b/src/OpenSimCreator/UI/SplashTab.cpp index c96ebaa073..f7d5ee61c6 100644 --- a/src/OpenSimCreator/UI/SplashTab.cpp +++ b/src/OpenSimCreator/UI/SplashTab.cpp @@ -239,7 +239,7 @@ class osc::SplashTab::Impl final { // names int imguiID = 0; - ui::set_num_columns(2, nullptr, false); + ui::set_num_columns(2, std::nullopt, false); drawMenuLeftColumnContent(imguiID); ui::next_column(); drawMenuRightColumnContent(imguiID); diff --git a/src/oscar/UI/oscimgui.cpp b/src/oscar/UI/oscimgui.cpp index 3f28fc800f..1e1dca60f2 100644 --- a/src/oscar/UI/oscimgui.cpp +++ b/src/oscar/UI/oscimgui.cpp @@ -114,12 +114,12 @@ void osc::ui::draw_text(CStringView sv) ImGui::TextUnformatted(sv.c_str(), sv.c_str() + sv.size()); } -void osc::ui::draw_text_v(CStringView fmt, va_list args) +void osc::ui::detail::draw_text_v(CStringView fmt, va_list args) { ImGui::TextV(fmt.c_str(), args); } -void osc::ui::draw_text_disabled_v(CStringView fmt, va_list args) +void osc::ui::detail::draw_text_disabled_v(CStringView fmt, va_list args) { ImGui::TextDisabledV(fmt.c_str(), args); } @@ -134,7 +134,7 @@ void osc::ui::draw_text_wrapped(CStringView sv) ImGui::TextWrapped("%s", sv.c_str()); } -void osc::ui::draw_text_wrapped_v(CStringView fmt, va_list args) +void osc::ui::detail::draw_text_wrapped_v(CStringView fmt, va_list args) { ImGui::TextWrappedV(fmt.c_str(), args); } @@ -227,9 +227,9 @@ bool osc::ui::draw_tab_item_button(CStringView label) return ImGui::TabItemButton(label.c_str()); } -void osc::ui::set_num_columns(int count, const char* id, bool border) +void osc::ui::set_num_columns(int count, std::optional id, bool border) { - ImGui::Columns(count, id, border); + ImGui::Columns(count, id ? id->c_str() : nullptr, border); } float osc::ui::get_column_width(int column_index) @@ -427,9 +427,9 @@ void osc::ui::close_current_popup() ImGui::CloseCurrentPopup(); } -void osc::ui::set_tooltip_v(const char* fmt, va_list args) +void osc::ui::detail::set_tooltip_v(CStringView fmt, va_list args) { - ImGui::SetTooltipV(fmt, args); + ImGui::SetTooltipV(fmt.c_str(), args); } void osc::ui::set_scroll_y_here() @@ -2414,9 +2414,9 @@ Rect osc::ui::plot::get_plot_screen_rect() return {top_left, top_left + Vec2{ImPlot::GetPlotSize()}}; } -void osc::ui::plot::draw_annotation_v(Vec2 location_dataspace, const Color& color, Vec2 pixel_offset, bool clamp, const char* fmt, va_list args) +void osc::ui::plot::detail::draw_annotation_v(Vec2 location_dataspace, const Color& color, Vec2 pixel_offset, bool clamp, CStringView fmt, va_list args) { - ImPlot::AnnotationV(location_dataspace.x, location_dataspace.y, color, pixel_offset, clamp, fmt, args); + ImPlot::AnnotationV(location_dataspace.x, location_dataspace.y, color, pixel_offset, clamp, fmt.c_str(), args); } bool osc::ui::plot::drag_point(int id, Vec2d* location, const Color& color, float size, DragToolFlags flags) diff --git a/src/oscar/UI/oscimgui.h b/src/oscar/UI/oscimgui.h index 53eab1fe7d..7a8e535e7e 100644 --- a/src/oscar/UI/oscimgui.h +++ b/src/oscar/UI/oscimgui.h @@ -39,34 +39,58 @@ namespace osc::ui // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item) void align_text_to_frame_padding(); + namespace detail + { + void draw_text_v(CStringView fmt, va_list); + inline void draw_text(CStringView fmt, ...) + { + va_list args; + va_start(args, fmt); + draw_text_v(fmt, args); + va_end(args); + } + } void draw_text(CStringView); - void draw_text_v(CStringView fmt, va_list); - inline void draw_text(const char* fmt, ...) + template + void draw_text(CStringView fmt, Args&&... args) { - va_list args; - va_start(args, fmt); - draw_text_v(fmt, args); - va_end(args); + detail::draw_text(fmt, std::forward(args)...); } + namespace detail + { + void draw_text_disabled_v(CStringView fmt, va_list); + inline void draw_text_disabled(CStringView fmt, ...) + { + va_list args; + va_start(args, fmt); + draw_text_disabled_v(fmt, args); + va_end(args); + } + } void draw_text_disabled(CStringView); - void draw_text_disabled_v(CStringView fmt, va_list); - inline void draw_text_disabled(const char* fmt, ...) + template + void draw_text_disabled(CStringView fmt, Args&&... args) { - va_list args; - va_start(args, fmt); - draw_text_disabled_v(fmt, args); - va_end(args); + detail::draw_text_disabled(fmt, std::forward(args)...); } + namespace detail + { + void draw_text_wrapped_v(CStringView fmt, va_list); + inline void draw_text_wrapped(CStringView fmt, ...) + { + va_list args; + va_start(args, fmt); + draw_text_wrapped_v(fmt, args); + va_end(args); + } + } void draw_text_wrapped(CStringView); - void draw_text_wrapped_v(CStringView fmt, va_list); - inline void draw_text_wrapped(const char* fmt, ...) + template + void draw_text_wrapped(CStringView fmt, Args&&... args) { - va_list args; - va_start(args, fmt); - draw_text_wrapped_v(fmt, args); - va_end(args); + detail::draw_text_wrapped(fmt, std::forward(args)...); } void draw_text_unformatted(CStringView); @@ -110,7 +134,7 @@ namespace osc::ui bool draw_tab_item_button(CStringView label); - void set_num_columns(int count = 1, const char* id = nullptr, bool border = true); + void set_num_columns(int count = 1, std::optional id = std::nullopt, bool border = true); float get_column_width(int column_index = -1); void next_column(); @@ -138,7 +162,7 @@ namespace osc::ui bool draw_float_slider(CStringView label, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); - bool draw_scalar_input(CStringView label, ImGuiDataType data_type, void* p_data, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); + bool draw_scalar_input(CStringView label, ImGuiDataType data_type, void* p_data, const void* p_step = nullptr, const void* p_step_fast = nullptr, const char* format = nullptr, ImGuiInputTextFlags flags = 0); bool draw_int_input(CStringView label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags flags = 0); @@ -174,7 +198,7 @@ namespace osc::ui ImGuiViewport* get_main_viewport(); - ImGuiID enable_dockspace_over_viewport(const ImGuiViewport* viewport = NULL, ImGuiDockNodeFlags flags = 0, const ImGuiWindowClass* window_class = NULL); + ImGuiID enable_dockspace_over_viewport(const ImGuiViewport* viewport = nullptr, ImGuiDockNodeFlags flags = 0, const ImGuiWindowClass* window_class = nullptr); bool begin_panel(CStringView name, bool* p_open = nullptr, ImGuiWindowFlags flags = 0); void end_panel(); @@ -184,12 +208,15 @@ namespace osc::ui void close_current_popup(); - void set_tooltip_v(const char* fmt, va_list); - inline void set_tooltip(const char* fmt, ...) + namespace detail + { + void set_tooltip_v(CStringView fmt, va_list); + } + inline void set_tooltip(CStringView fmt, ...) { va_list args; va_start(args, fmt); - set_tooltip_v(fmt, args); + detail::set_tooltip_v(fmt, args); va_end(args); } @@ -272,7 +299,7 @@ namespace osc::ui void open_popup(CStringView str_id, ImGuiPopupFlags popup_flags = 0); bool begin_popup(CStringView str_id, ImGuiWindowFlags flags = 0); bool begin_popup_context_menu(CStringView str_id = nullptr, ImGuiPopupFlags popup_flags = 1); - bool begin_popup_modal(CStringView name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); + bool begin_popup_modal(CStringView name, bool* p_open = nullptr, ImGuiWindowFlags flags = 0); void end_popup(); Vec2 get_mouse_pos(); @@ -938,12 +965,15 @@ namespace osc::ui // // - clamping keeps annotations in the plot area // - annotations are always rendered on top of the plot area - void draw_annotation_v(Vec2 location_dataspace, const Color& color, Vec2 pixel_offset, bool clamp, const char* fmt, va_list args); - inline void draw_annotation(Vec2 location_dataspace, const Color& color, Vec2 pixel_offset, bool clamp, const char* fmt, ...) + namespace detail + { + void draw_annotation_v(Vec2 location_dataspace, const Color& color, Vec2 pixel_offset, bool clamp, CStringView fmt, va_list args); + } + inline void draw_annotation(Vec2 location_dataspace, const Color& color, Vec2 pixel_offset, bool clamp, CStringView fmt, ...) { va_list args; va_start(args, fmt); - draw_annotation_v(location_dataspace, color, pixel_offset, clamp, fmt, args); + detail::draw_annotation_v(location_dataspace, color, pixel_offset, clamp, fmt, args); va_end(args); } diff --git a/src/oscar/UI/ui_context.cpp b/src/oscar/UI/ui_context.cpp index 322920c312..9bfe9e6665 100644 --- a/src/oscar/UI/ui_context.cpp +++ b/src/oscar/UI/ui_context.cpp @@ -78,7 +78,7 @@ void osc::ui::context::init() // load application-level ImGui settings, then the user one, // so that the user settings takes precedence #ifdef EMSCRIPTEN - io.IniFilename = NULL; + io.IniFilename = nullptr; #else float dpi_scale_factor = [&]() { diff --git a/tests/testoscar/Utils/TestFlags.cpp b/tests/testoscar/Utils/TestFlags.cpp index fca06588d5..bf278b862e 100644 --- a/tests/testoscar/Utils/TestFlags.cpp +++ b/tests/testoscar/Utils/TestFlags.cpp @@ -150,4 +150,4 @@ TEST(Flags, lowest_set_returns_lowest_flag_for_non_None_values) const auto flags = Flags{ExampleDenseFlags::Flag1, ExampleDenseFlags::Flag3}; ASSERT_EQ(flags.lowest_set(), ExampleDenseFlags::Flag1); } -} \ No newline at end of file +}