Skip to content

Commit 0432fd1

Browse files
v-einhoffstadt
authored andcommitted
feat: mvToggledOpenHandler can now trigger on both open and close events.
This helps circumvent the change introduced in #1280 and handle the close.
1 parent 34a5c8c commit 0432fd1

8 files changed

Lines changed: 35 additions & 8 deletions

File tree

dearpygui/_dearpygui.pyi

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dearpygui/_dearpygui_RTD.py

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dearpygui/dearpygui.py

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/mvAppItem.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5066,6 +5066,8 @@ DearPyGui::GetEntityParser(mvAppItemType type)
50665066
MV_PARSER_ARG_CALLBACK)
50675067
);
50685068

5069+
args.push_back({ mvPyDataType::Bool, "two_way", mvArgType::KEYWORD_ARG, "False", "Trigger on both 'opened' and 'closed' events, i.e. when the 'opened' state is toggled between the two values. If False, some containers will trigger it only on the 'opened' event." });
5070+
50695071
setup.about = "Adds a togged open handler.";
50705072
setup.category = { "Widgets", "Events" };
50715073
break;

src/mvAppItemState.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ ResetAppItemState(mvAppItemState& state)
2626
state.activated = false;
2727
state.deactivated = false;
2828
state.deactivatedAfterEdit = false;
29-
state.toggledOpen = false;
29+
state.toggledOpenPure = state.toggledOpen = false;
3030
state.mvRectSizeResized = false;
3131
state.scrolledX = state.scrolledY = false;
3232
state.isScrollingX = state.isScrollingY = false;
@@ -57,7 +57,7 @@ UpdateAppItemState(mvAppItemState& state)
5757
state.activated = ImGui::IsItemActivated();
5858
state.deactivated = ImGui::IsItemDeactivated();
5959
state.deactivatedAfterEdit = ImGui::IsItemDeactivatedAfterEdit();
60-
state.toggledOpen = ImGui::IsItemToggledOpen();
60+
state.toggledOpenPure = state.toggledOpen = ImGui::IsItemToggledOpen();
6161
state.rectMin = { ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y };
6262
state.rectMax = { ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y };
6363
state.rectSize = { ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y };

src/mvAppItemState.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ struct mvAppItemState
8585
b8 deactivated = false;
8686
b8 deactivatedAfterEdit = false;
8787
b8 toggledOpen = false;
88+
// This one is not reset by mvCollapsingHeader and mvTreeNode; also, not all items
89+
// initialize it (but mvCollapsingHeader and mvTreeNode do, and they in fact are
90+
// the only ones that must do it). Used as an extra flag by the two-way toggled open handler.
91+
b8 toggledOpenPure = false;
8892
b8 mvRectSizeResized = false;
8993
b8 scrolledX = false;
9094
b8 scrolledY = false;

src/mvItemHandlers.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,12 +343,28 @@ void mvResizeHandler::customAction(void* data)
343343
void mvToggledOpenHandler::customAction(void* data)
344344
{
345345
mvAppItemState* state = static_cast<mvAppItemState*>(data);
346-
if (state->toggledOpen)
346+
if (state->toggledOpen || twoWay && state->toggledOpenPure)
347347
{
348348
submitHandler(state->parent);
349349
}
350350
}
351351

352+
void mvToggledOpenHandler::handleSpecificKeywordArgs(PyObject* dict)
353+
{
354+
if (dict == nullptr)
355+
return;
356+
357+
if (PyObject* item = PyDict_GetItemString(dict, "two_way")) twoWay = ToBool(item);
358+
}
359+
360+
void mvToggledOpenHandler::getSpecificConfiguration(PyObject* dict)
361+
{
362+
if (dict == nullptr)
363+
return;
364+
365+
PyDict_SetItemString(dict, "two_way", mvPyObject(ToPyBool(twoWay)));
366+
}
367+
352368
void mvVisibleHandler::customAction(void* data)
353369
{
354370
mvAppItemState* state = static_cast<mvAppItemState*>(data);

src/mvItemHandlers.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ class mvToggledOpenHandler : public mvItemHandler
149149
explicit mvToggledOpenHandler(mvUUID uuid) : mvItemHandler(uuid) {}
150150
void draw(ImDrawList* drawlist, float x, float y) override {}
151151
void customAction(void* data = nullptr) override;
152+
void handleSpecificKeywordArgs(PyObject* dict) override;
153+
void getSpecificConfiguration(PyObject* dict) override;
154+
155+
private:
156+
bool twoWay = false;
152157
};
153158

154159
class mvVisibleHandler : public mvItemHandler

0 commit comments

Comments
 (0)