Skip to content

Commit 2192bb3

Browse files
Thibaullttnmwsharp
andauthored
Table* bindings for cpp/imgui (#48)
* [ci-skip] add Table* bindings to imgui * Tables*: add bindings + some forgotten functions * add bindings to a few missing enums etc * bind a the table sort related functions --------- Co-authored-by: Nicholas Sharp <nmwsharp@gmail.com>
1 parent f903a97 commit 2192bb3

File tree

2 files changed

+226
-0
lines changed

2 files changed

+226
-0
lines changed

src/cpp/imgui.cpp

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,28 @@ void bind_imgui_structs(py::module& m) {
135135

136136
;
137137

138+
139+
// Table sorting
140+
py::class_<ImGuiTableSortSpecs>(m, "ImGuiTableSortSpecs")
141+
.def("Specs", [](py::object& ob) {
142+
ImGuiTableSortSpecs& o = ob.cast<ImGuiTableSortSpecs&>();
143+
std::vector<ImGuiTableColumnSortSpecs> specs;
144+
for (int i = 0; i < o.SpecsCount; i++) {
145+
specs.push_back(o.Specs[i]);
146+
}
147+
return specs;}
148+
)
149+
.def_readonly("SpecsCount", &ImGuiTableSortSpecs::SpecsCount)
150+
.def_readwrite("SpecsDirty", &ImGuiTableSortSpecs::SpecsDirty)
151+
;
152+
153+
py::class_<ImGuiTableColumnSortSpecs>(m, "ImGuiTableColumnSortSpecs")
154+
.def_readonly("ColumnUserID", &ImGuiTableColumnSortSpecs::ColumnUserID)
155+
.def_readonly("ColumnIndex", &ImGuiTableColumnSortSpecs::ColumnIndex)
156+
.def_readonly("SortOrder", &ImGuiTableColumnSortSpecs::SortOrder)
157+
.def_readonly("SortDirection", &ImGuiTableColumnSortSpecs::SortDirection)
158+
;
159+
138160
}
139161

140162
void bind_imgui_methods(py::module& m) {
@@ -1379,6 +1401,101 @@ void bind_imgui_methods(py::module& m) {
13791401
py::arg("flags") = 0);
13801402
m.def("CloseCurrentPopup", []() { ImGui::CloseCurrentPopup(); });
13811403

1404+
// Tables
1405+
m.def(
1406+
"BeginTable",
1407+
[](const char*str_id, int columns, ImGuiTableFlags flags, Vec2T size, float innerwidth) -> bool {
1408+
return ImGui::BeginTable(str_id, columns, flags, to_vec2(size), innerwidth);
1409+
},
1410+
py::arg("str"),
1411+
py::arg("columns"),
1412+
py::arg("flags") = 0,
1413+
py::arg("size") = std::make_tuple(0.f, 0.f),
1414+
py::arg("inner_width") = 0.f
1415+
);
1416+
m.def( "EndTable", []() { ImGui::EndTable(); } );
1417+
m.def(
1418+
"TableNextRow",
1419+
[](ImGuiTableRowFlags flags, float min_row_height) {
1420+
ImGui::TableNextRow(flags, min_row_height);
1421+
},
1422+
py::arg("flags") = 0,
1423+
py::arg("min_row_height") = 0.f
1424+
);
1425+
m.def(
1426+
"TableNextColumn",
1427+
[]() -> bool {
1428+
return ImGui::TableNextColumn();
1429+
}
1430+
);
1431+
m.def(
1432+
"TableSetColumnIndex",
1433+
[](int column_n) -> bool {
1434+
return ImGui::TableSetColumnIndex(column_n);
1435+
},
1436+
py::arg("column_n")
1437+
);
1438+
1439+
// Table headers and columns
1440+
m.def(
1441+
"TableSetupColumn",
1442+
[](const char* label, ImGuiTableColumnFlags flags, float init_width_or_height, ImGuiID user_id) {
1443+
ImGui::TableSetupColumn(label, flags, init_width_or_height, user_id);
1444+
},
1445+
py::arg("label"),
1446+
py::arg("flags") = 0,
1447+
py::arg("init_width_or_height") = 0.f,
1448+
py::arg("user_id") = 0u
1449+
);
1450+
m.def(
1451+
"TableSetupScrollFreeze",
1452+
[](int cols, int rows) {
1453+
ImGui::TableSetupScrollFreeze(cols, rows);
1454+
},
1455+
py::arg("cols"),
1456+
py::arg("rows")
1457+
);
1458+
m.def(
1459+
"TableHeader",
1460+
[](const char* label) {
1461+
ImGui::TableHeader(label);
1462+
},
1463+
py::arg("label")
1464+
);
1465+
m.def("TableHeadersRow", []() { ImGui::TableHeadersRow(); });
1466+
m.def("TableAngledHeadersRow", []() { ImGui::TableAngledHeadersRow(); });
1467+
1468+
// Table miscellaneous functions
1469+
1470+
// warning! this function returns a pointer which is only valid for a short time, within the same frame and before next call to BeginTable() (see imgui docs)
1471+
// you will get undefined behavior if you try to use it later
1472+
m.def("TableGetSortSpecs", []() -> ImGuiTableSortSpecs* { return ImGui::TableGetSortSpecs(); }, py::return_value_policy::reference);
1473+
m.def("TableGetColumnCount", []() -> int { return ImGui::TableGetColumnCount(); });
1474+
m.def("TableGetColumnIndex", []() -> int { return ImGui::TableGetColumnIndex(); });
1475+
m.def("TableGetRowIndex", []() -> int { return ImGui::TableGetRowIndex(); });
1476+
m.def(
1477+
"TableGetColumnName",
1478+
[](int column_n) { return py::str(ImGui::TableGetColumnName(column_n)); },
1479+
py::arg("column_n") = -1
1480+
);
1481+
/* TableGetColumnFlags not included for the same reasons. */
1482+
m.def(
1483+
"TableSetColumnEnabled",
1484+
[](int column_n, bool enable) { return ImGui::TableSetColumnEnabled(column_n, enable); },
1485+
py::arg("column_n"),
1486+
py::arg("v")
1487+
);
1488+
m.def("TableGetHoveredColumn", []() -> int { return ImGui::TableGetHoveredColumn(); });
1489+
m.def(
1490+
"TableSetBgColor",
1491+
[](ImGuiTableBgTarget target, ImU32 color, int column_n) {
1492+
return ImGui::TableSetBgColor(target, color, column_n);
1493+
},
1494+
py::arg("target"),
1495+
py::arg("color"),
1496+
py::arg("column_n") = -1
1497+
);
1498+
13821499
// Columns
13831500
m.def(
13841501
"Columns",
@@ -1928,7 +2045,10 @@ void bind_imgui_methods(py::module& m) {
19282045

19292046
void bind_imgui_enums(py::module& m) {
19302047

2048+
py::enum_<ImGuiDir>(m, "ImGuiDir");
19312049
py::enum_<ImGuiKey>(m, "ImGuiKey");
2050+
py::enum_<ImGuiMouseSource>(m, "ImGuiMouseSource");
2051+
py::enum_<ImGuiSortDirection>(m, "ImGuiSortDirection");
19322052

19332053
m.attr("ImGuiWindowFlags_None") = static_cast<int>(ImGuiWindowFlags_None);
19342054
m.attr("ImGuiWindowFlags_NoTitleBar") = static_cast<int>(ImGuiWindowFlags_NoTitleBar);
@@ -2036,6 +2156,76 @@ void bind_imgui_enums(py::module& m) {
20362156
static_cast<int>(ImGuiTabItemFlags_NoCloseWithMiddleMouseButton);
20372157
m.attr("ImGuiTabItemFlags_NoPushId") = static_cast<int>(ImGuiTabItemFlags_NoPushId);
20382158

2159+
m.attr("ImGuiTableFlags_None") = static_cast<int>(ImGuiTableFlags_None);
2160+
m.attr("ImGuiTableFlags_Resizable") = static_cast<int>(ImGuiTableFlags_Resizable);
2161+
m.attr("ImGuiTableFlags_Reorderable") = static_cast<int>(ImGuiTableFlags_Reorderable);
2162+
m.attr("ImGuiTableFlags_Hideable") = static_cast<int>(ImGuiTableFlags_Hideable);
2163+
m.attr("ImGuiTableFlags_Sortable") = static_cast<int>(ImGuiTableFlags_Sortable);
2164+
m.attr("ImGuiTableFlags_NoSavedSettings") = static_cast<int>(ImGuiTableFlags_NoSavedSettings);
2165+
m.attr("ImGuiTableFlags_ContextMenuInBody") = static_cast<int>(ImGuiTableFlags_ContextMenuInBody);
2166+
m.attr("ImGuiTableFlags_RowBg") = static_cast<int>(ImGuiTableFlags_RowBg);
2167+
m.attr("ImGuiTableFlags_BordersInnerH") = static_cast<int>(ImGuiTableFlags_BordersInnerH);
2168+
m.attr("ImGuiTableFlags_BordersOuterH") = static_cast<int>(ImGuiTableFlags_BordersOuterH);
2169+
m.attr("ImGuiTableFlags_BordersInnerV") = static_cast<int>(ImGuiTableFlags_BordersInnerV);
2170+
m.attr("ImGuiTableFlags_BordersOuterV") = static_cast<int>(ImGuiTableFlags_BordersOuterV);
2171+
m.attr("ImGuiTableFlags_BordersH") = static_cast<int>(ImGuiTableFlags_BordersH);
2172+
m.attr("ImGuiTableFlags_BordersV") = static_cast<int>(ImGuiTableFlags_BordersV);
2173+
m.attr("ImGuiTableFlags_BordersInner") = static_cast<int>(ImGuiTableFlags_BordersInner);
2174+
m.attr("ImGuiTableFlags_BordersOuter") = static_cast<int>(ImGuiTableFlags_BordersOuter);
2175+
m.attr("ImGuiTableFlags_Borders") = static_cast<int>(ImGuiTableFlags_Borders);
2176+
m.attr("ImGuiTableFlags_NoBordersInBody") = static_cast<int>(ImGuiTableFlags_NoBordersInBody);
2177+
m.attr("ImGuiTableFlags_NoBordersInBodyUntilResize") = static_cast<int>(ImGuiTableFlags_NoBordersInBodyUntilResize);
2178+
m.attr("ImGuiTableFlags_SizingFixedFit") = static_cast<int>(ImGuiTableFlags_SizingFixedFit);
2179+
m.attr("ImGuiTableFlags_SizingFixedSame") = static_cast<int>(ImGuiTableFlags_SizingFixedSame);
2180+
m.attr("ImGuiTableFlags_SizingStretchProp") = static_cast<int>(ImGuiTableFlags_SizingStretchProp);
2181+
m.attr("ImGuiTableFlags_SizingStretchSame") = static_cast<int>(ImGuiTableFlags_SizingStretchSame);
2182+
m.attr("ImGuiTableFlags_NoHostExtendX") = static_cast<int>(ImGuiTableFlags_NoHostExtendX);
2183+
m.attr("ImGuiTableFlags_NoHostExtendY") = static_cast<int>(ImGuiTableFlags_NoHostExtendY);
2184+
m.attr("ImGuiTableFlags_NoKeepColumnsVisible") = static_cast<int>(ImGuiTableFlags_NoKeepColumnsVisible);
2185+
m.attr("ImGuiTableFlags_PreciseWidths") = static_cast<int>(ImGuiTableFlags_PreciseWidths);
2186+
m.attr("ImGuiTableFlags_NoClip") = static_cast<int>(ImGuiTableFlags_NoClip);
2187+
m.attr("ImGuiTableFlags_PadOuterX") = static_cast<int>(ImGuiTableFlags_PadOuterX);
2188+
m.attr("ImGuiTableFlags_NoPadOuterX") = static_cast<int>(ImGuiTableFlags_NoPadOuterX);
2189+
m.attr("ImGuiTableFlags_NoPadInnerX") = static_cast<int>(ImGuiTableFlags_NoPadInnerX);
2190+
m.attr("ImGuiTableFlags_ScrollX") = static_cast<int>(ImGuiTableFlags_ScrollX);
2191+
m.attr("ImGuiTableFlags_ScrollY") = static_cast<int>(ImGuiTableFlags_ScrollY);
2192+
m.attr("ImGuiTableFlags_SortMulti") = static_cast<int>(ImGuiTableFlags_SortMulti);
2193+
m.attr("ImGuiTableFlags_SortTristate") = static_cast<int>(ImGuiTableFlags_SortTristate);
2194+
m.attr("ImGuiTableFlags_HighlightHoveredColumn") = static_cast<int>(ImGuiTableFlags_HighlightHoveredColumn);
2195+
2196+
m.attr("ImGuiTableColumnFlags_None") = static_cast<int>(ImGuiTableColumnFlags_None);
2197+
m.attr("ImGuiTableColumnFlags_Disabled") = static_cast<int>(ImGuiTableColumnFlags_Disabled);
2198+
m.attr("ImGuiTableColumnFlags_DefaultHide") = static_cast<int>(ImGuiTableColumnFlags_DefaultHide);
2199+
m.attr("ImGuiTableColumnFlags_DefaultSort") = static_cast<int>(ImGuiTableColumnFlags_DefaultSort);
2200+
m.attr("ImGuiTableColumnFlags_WidthStretch") = static_cast<int>(ImGuiTableColumnFlags_WidthStretch);
2201+
m.attr("ImGuiTableColumnFlags_WidthFixed") = static_cast<int>(ImGuiTableColumnFlags_WidthFixed);
2202+
m.attr("ImGuiTableColumnFlags_NoResize") = static_cast<int>(ImGuiTableColumnFlags_NoResize);
2203+
m.attr("ImGuiTableColumnFlags_NoReorder") = static_cast<int>(ImGuiTableColumnFlags_NoReorder);
2204+
m.attr("ImGuiTableColumnFlags_NoHide") = static_cast<int>(ImGuiTableColumnFlags_NoHide);
2205+
m.attr("ImGuiTableColumnFlags_NoClip") = static_cast<int>(ImGuiTableColumnFlags_NoClip);
2206+
m.attr("ImGuiTableColumnFlags_NoSort") = static_cast<int>(ImGuiTableColumnFlags_NoSort);
2207+
m.attr("ImGuiTableColumnFlags_NoSortAscending") = static_cast<int>(ImGuiTableColumnFlags_NoSortAscending);
2208+
m.attr("ImGuiTableColumnFlags_NoSortDescending") = static_cast<int>(ImGuiTableColumnFlags_NoSortDescending);
2209+
m.attr("ImGuiTableColumnFlags_NoHeaderLabel") = static_cast<int>(ImGuiTableColumnFlags_NoHeaderLabel);
2210+
m.attr("ImGuiTableColumnFlags_NoHeaderWidth") = static_cast<int>(ImGuiTableColumnFlags_NoHeaderWidth);
2211+
m.attr("ImGuiTableColumnFlags_PreferSortAscending") = static_cast<int>(ImGuiTableColumnFlags_PreferSortAscending);
2212+
m.attr("ImGuiTableColumnFlags_PreferSortDescending") = static_cast<int>(ImGuiTableColumnFlags_PreferSortDescending);
2213+
m.attr("ImGuiTableColumnFlags_IndentEnable") = static_cast<int>(ImGuiTableColumnFlags_IndentEnable);
2214+
m.attr("ImGuiTableColumnFlags_IndentDisable") = static_cast<int>(ImGuiTableColumnFlags_IndentDisable);
2215+
m.attr("ImGuiTableColumnFlags_AngledHeader") = static_cast<int>(ImGuiTableColumnFlags_AngledHeader);
2216+
m.attr("ImGuiTableColumnFlags_IsEnabled") = static_cast<int>(ImGuiTableColumnFlags_IsEnabled);
2217+
m.attr("ImGuiTableColumnFlags_IsVisible") = static_cast<int>(ImGuiTableColumnFlags_IsVisible);
2218+
m.attr("ImGuiTableColumnFlags_IsSorted") = static_cast<int>(ImGuiTableColumnFlags_IsSorted);
2219+
m.attr("ImGuiTableColumnFlags_IsHovered") = static_cast<int>(ImGuiTableColumnFlags_IsHovered);
2220+
2221+
m.attr("ImGuiTableRowFlags_None") = static_cast<int>(ImGuiTableRowFlags_None);
2222+
m.attr("ImGuiTableRowFlags_Headers") = static_cast<int>(ImGuiTableRowFlags_Headers);
2223+
2224+
m.attr("ImGuiTableBgTarget_None") = static_cast<int>(ImGuiTableBgTarget_None);
2225+
m.attr("ImGuiTableBgTarget_RowBg0") = static_cast<int>(ImGuiTableBgTarget_RowBg0);
2226+
m.attr("ImGuiTableBgTarget_RowBg1") = static_cast<int>(ImGuiTableBgTarget_RowBg1);
2227+
m.attr("ImGuiTableBgTarget_CellBg") = static_cast<int>(ImGuiTableBgTarget_CellBg);
2228+
20392229
m.attr("ImGuiFocusedFlags_None") = static_cast<int>(ImGuiFocusedFlags_None);
20402230
m.attr("ImGuiFocusedFlags_ChildWindows") = static_cast<int>(ImGuiFocusedFlags_ChildWindows);
20412231
m.attr("ImGuiFocusedFlags_RootWindow") = static_cast<int>(ImGuiFocusedFlags_RootWindow);
@@ -2085,6 +2275,10 @@ void bind_imgui_enums(py::module& m) {
20852275
m.attr("ImGuiDir_Down") = static_cast<int>(ImGuiDir_Down);
20862276
m.attr("ImGuiDir_COUNT") = static_cast<int>(ImGuiDir_COUNT);
20872277

2278+
m.attr("ImGuiSortDirection_None") = static_cast<int>(ImGuiSortDirection_None);
2279+
m.attr("ImGuiSortDirection_Ascending") = static_cast<int>(ImGuiSortDirection_Ascending);
2280+
m.attr("ImGuiSortDirection_Descending") = static_cast<int>(ImGuiSortDirection_Descending);
2281+
20882282
m.attr("ImGuiKey_Tab") = static_cast<ImGuiKey>(ImGuiKey_Tab);
20892283
m.attr("ImGuiKey_None") = static_cast<ImGuiKey>(ImGuiKey_None);
20902284
m.attr("ImGuiKey_Tab") = static_cast<ImGuiKey>(ImGuiKey_Tab);

src/polyscope_bindings/imgui.pyi

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ ImGuiSelectableFlags = NewType("ImGuiSelectableFlags", int)
2424
ImGuiStyleVar = NewType("ImGuiStyleVar", int)
2525
ImGuiTabBarFlags = NewType("ImGuiTabBarFlags", int)
2626
ImGuiTabItemFlags = NewType("ImGuiTabItemFlags", int)
27+
ImGuiTableBgTarget = NewType("ImGuiTableBgTarget", int)
28+
ImGuiTableColumnFlags = NewType("ImGuiTableColumnFlags", int)
29+
ImGuiTableRowFlags = NewType("ImGuiTableRowFlags", int)
2730
ImGuiTreeNodeFlags = NewType("ImGuiTreeNodeFlags", int)
2831
ImGuiWindowFlags = NewType("ImGuiWindowFlags", int)
2932

@@ -721,6 +724,35 @@ def OpenPopupOnItemClick(
721724
def IsPopupOpen(str_id: str) -> bool: ...
722725
def CloseCurrentPopup() -> None: ...
723726

727+
728+
# Tables
729+
730+
def BeginTable(str_id: str, columns: int, flags: int
731+
= 0, size: ImVec2 = (0,0),
732+
innerwidth: float = 0.) -> bool: ...
733+
def EndTable() -> None: ...
734+
def TableNextRow(flags: ImGuiTableRowFlags = 0,
735+
min_row_height: float = 0) -> None:...
736+
def TableNextColumn() -> bool: ...
737+
def TableSetColumnIndex(column_n: int) -> None:...
738+
739+
def TableSetupColumn(label: str, flags: ImGuiTableColumnFlags
740+
= 0, init_width_or_height: float = 0,
741+
user_id: ImGuiID = 0) -> None:
742+
def TableSetupScrollFreeze(cols: int, rows: int) -> None:...
743+
def TableHeader(label: str) -> None:...
744+
def TableHeadersRow() -> None:...
745+
def TableAngledHeadersRow() -> None:...
746+
747+
def TableGetColumnCount() -> int:...
748+
def TableGetColumnIndex() -> int:...
749+
def TableGetRowIndex() -> int:...
750+
def TableGetColumnName() -> str:...
751+
def TableSetColumnEnabled(column_n: int, v: bool) -> None:...
752+
def TableGetHoveredColumn() -> int:...
753+
def TableSetBgColor(target: ImGuiTableBgTarget, color: ImU32,
754+
column_n: int = -1) -> None:...
755+
724756
# Columns
725757

726758

0 commit comments

Comments
 (0)