public static void Table <T>(this IEnumerable <T> items, string id, ref T selectedItem) { var props = typeof(T).GetProperties(); ImGui.BeginChild("##scrolling"); ImGui.Columns(props.Length, "##columns", true); PropertyInfo idProp = null; foreach (var prop in props) { if (prop.Name == id) { idProp = prop; } ImGui.Text(prop.Name); ImGui.NextColumn(); } float itemHeight = ImGuiNative.igGetTextLineHeightWithSpacing(); int displayStart = 0, displayEnd = items.Count(); ImGui.CalcListClipping(displayEnd, itemHeight, ref displayStart, ref displayEnd); var visibleitems = items.Skip(displayStart).Take(displayEnd - displayStart).ToArray(); foreach (var prop in props) { ImGuiNative.igSetCursorPosY(ImGuiNative.igGetCursorPosY() + (displayStart * itemHeight)); foreach (var i in visibleitems) { if (ImGui.Selectable(prop.GetValue(i).ToString() + "##" + idProp?.GetValue(i).ToString(), i.Equals(selectedItem))) { selectedItem = i; } } ImGui.NextColumn(); } ImGui.Columns(1, "##columns", true); ImGui.EndChild(); }
public void Begin(int count, float items_height = -1.0f) { StartPosY = ImGuiNative.igGetCursorPosY(); ItemsHeight = items_height; ItemsCount = count; StepNo = 0; DisplayEnd = DisplayStart = -1; if (ItemsHeight > 0.0f) { ImGui.CalcListClipping(ItemsCount, ItemsHeight, ref DisplayStart, ref DisplayEnd); // calculate how many to clip/display if (DisplayStart > 0) { //SetCursorPosYAndSetupDummyPrevLine(StartPosY + DisplayStart * ItemsHeight, ItemsHeight); // advance cursor ImGuiNative.igSetCursorPosY(StartPosY + DisplayStart * ItemsHeight); } StepNo = 2; } }