[olympic/studio] Add PushButton, PopupBtns, ComboBox, and IDStackItem to ImGui utils
This commit is contained in:
		@@ -2,12 +2,42 @@
 | 
			
		||||
 * Copyright 2016 - 2024 Gary Talent (gary@drinkingtea.net). All rights reserved.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <imgui.h>
 | 
			
		||||
 | 
			
		||||
#include <turbine/context.hpp>
 | 
			
		||||
 | 
			
		||||
namespace studio::ig {
 | 
			
		||||
 | 
			
		||||
inline constexpr auto BtnSz = ImVec2{50, 22};
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
class IDStackItem {
 | 
			
		||||
	private:
 | 
			
		||||
		T m_id;
 | 
			
		||||
	public:
 | 
			
		||||
		explicit IDStackItem(T id) noexcept: m_id(id) {
 | 
			
		||||
			ImGui::PushID(m_id);
 | 
			
		||||
		}
 | 
			
		||||
		~IDStackItem() noexcept {
 | 
			
		||||
			ImGui::PopID();
 | 
			
		||||
		}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void centerNextWindow(turbine::Context &ctx) noexcept;
 | 
			
		||||
 | 
			
		||||
bool PushButton(ox::CStringView lbl, ImVec2 const&btnSz = BtnSz) noexcept;
 | 
			
		||||
 | 
			
		||||
void PopupBtns(float popupWidth, bool &popupOpen);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @param lbl
 | 
			
		||||
 * @param list
 | 
			
		||||
 * @param selectedIdx
 | 
			
		||||
 * @return true if new value selected, false otherwise
 | 
			
		||||
 */
 | 
			
		||||
bool ComboBox(ox::CStringView lbl, ox::SpanView<ox::String> list, size_t &selectedIdx) noexcept;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -6,6 +6,8 @@
 | 
			
		||||
 | 
			
		||||
#include <turbine/gfx.hpp>
 | 
			
		||||
 | 
			
		||||
#include <studio/imguiutil.hpp>
 | 
			
		||||
 | 
			
		||||
namespace studio::ig {
 | 
			
		||||
 | 
			
		||||
void centerNextWindow(turbine::Context &ctx) noexcept {
 | 
			
		||||
@@ -16,4 +18,43 @@ void centerNextWindow(turbine::Context &ctx) noexcept {
 | 
			
		||||
	ImGui::SetNextWindowPos(ImVec2(screenW / mod, screenH / mod), ImGuiCond_Always, ImVec2(0.5f, 0.5f));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool PushButton(ox::CStringView lbl, ImVec2 const&btnSz) noexcept {
 | 
			
		||||
	return ImGui::Button(lbl.c_str(), btnSz);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PopupBtns(float popupWidth, bool &popupOpen) {
 | 
			
		||||
	constexpr auto btnSz = ImVec2{50, BtnSz.y};
 | 
			
		||||
	ImGui::Separator();
 | 
			
		||||
	ImGui::SetCursorPosX(popupWidth - 118);
 | 
			
		||||
	if (ImGui::Button("OK", btnSz)) {
 | 
			
		||||
		ImGui::CloseCurrentPopup();
 | 
			
		||||
		popupOpen = false;
 | 
			
		||||
	}
 | 
			
		||||
	ImGui::SameLine();
 | 
			
		||||
	if (ImGui::Button("Cancel", btnSz)) {
 | 
			
		||||
		ImGui::CloseCurrentPopup();
 | 
			
		||||
		popupOpen = false;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ComboBox(
 | 
			
		||||
		ox::CStringView lbl,
 | 
			
		||||
		ox::SpanView<ox::String> list,
 | 
			
		||||
		size_t &selectedIdx) noexcept {
 | 
			
		||||
	bool out{};
 | 
			
		||||
	auto const first = selectedIdx < list.size() ? list[selectedIdx].c_str() : "";
 | 
			
		||||
	if (ImGui::BeginCombo(lbl.c_str(), first, 0)) {
 | 
			
		||||
		for (auto i = 0u; i < list.size(); ++i) {
 | 
			
		||||
			const auto selected = (selectedIdx == i);
 | 
			
		||||
			if (ImGui::Selectable(list[i].c_str(), selected) && selectedIdx != i) {
 | 
			
		||||
				selectedIdx = i;
 | 
			
		||||
				//oxLogError(m_model.setPalette(list[n]));
 | 
			
		||||
				out = true;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		ImGui::EndCombo();
 | 
			
		||||
	}
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user