Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions dearpygui/_dearpygui.pyi

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions dearpygui/_dearpygui_RTD.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 10 additions & 4 deletions dearpygui/dearpygui.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions src/dearpygui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ GetModuleConstants()
ModuleConstants.push_back({"mvComboHeight_Large", 2L });
ModuleConstants.push_back({"mvComboHeight_Largest", 3L });

ModuleConstants.push_back({"mvEventType_Off", mvEventType_Off });
ModuleConstants.push_back({"mvEventType_Enter", mvEventType_Enter });
ModuleConstants.push_back({"mvEventType_On", mvEventType_On });
ModuleConstants.push_back({"mvEventType_Leave", mvEventType_Leave });

ModuleConstants.push_back({"mvPlatform_Windows", 0L });
ModuleConstants.push_back({"mvPlatform_Apple", 1L });
ModuleConstants.push_back({"mvPlatform_Linux", 2L });
Expand Down
4 changes: 4 additions & 0 deletions src/mvAppItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4855,6 +4855,8 @@ DearPyGui::GetEntityParser(mvAppItemType type)
MV_PARSER_ARG_CALLBACK)
);

args.push_back({ mvPyDataType::Integer, "event_type", mvArgType::KEYWORD_ARG, "None", "What kind of events to track: mouse-in (mvEventType_Enter), mouse-over (mvEventType_On), mouse-out (mvEventType_Leave). Can be a combination of these flags. Defaults to mouse-over." });

setup.about = "Adds a hover handler.";
setup.category = { "Widgets", "Events" };
break;
Expand All @@ -4881,6 +4883,8 @@ DearPyGui::GetEntityParser(mvAppItemType type)
MV_PARSER_ARG_CALLBACK)
);

args.push_back({ mvPyDataType::Integer, "event_type", mvArgType::KEYWORD_ARG, "None", "What kind of events to track: just got focus (mvEventType_Enter), currently having focus (mvEventType_On), lost focus (mvEventType_Leave). Can be a combination of these flags. Defaults to mvEventType_On." });

setup.about = "Adds a focus handler.";
setup.category = { "Widgets", "Events" };
break;
Expand Down
4 changes: 4 additions & 0 deletions src/mvAppItemState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ void
ResetAppItemState(mvAppItemState& state)
{
state.hovered = false;
state.prevHovered = false;
state.active = false;
state.focused = false;
state.prevFocused = false;
state.leftclicked = false;
state.rightclicked = false;
state.middleclicked = false;
Expand All @@ -27,8 +29,10 @@ void
UpdateAppItemState(mvAppItemState& state)
{
state.lastFrameUpdate = GContext->frame;
state.prevHovered = state.hovered;
state.hovered = ImGui::IsItemHovered();
state.active = ImGui::IsItemActive();
state.prevFocused = state.focused;
state.focused = ImGui::IsItemFocused();
if (state.focused)
{
Expand Down
2 changes: 2 additions & 0 deletions src/mvAppItemState.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,10 @@ inline b8 IsItemDoubleClicked(ImGuiMouseButton mouse_button)
struct mvAppItemState
{
b8 hovered = false;
b8 prevHovered = false;
b8 active = false;
b8 focused = false;
b8 prevFocused = false;
b8 leftclicked = false;
b8 rightclicked = false;
b8 middleclicked = false;
Expand Down
22 changes: 2 additions & 20 deletions src/mvBasicWidgets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2642,6 +2642,7 @@ DearPyGui::draw_simple_plot(ImDrawList* drawlist, mvAppItem& item, const mvSimpl
// * only update if applicable
//-----------------------------------------------------------------------------
item.state.lastFrameUpdate = GContext->frame;
item.state.prevHovered = item.state.hovered;
item.state.hovered = ImGui::IsItemHovered();
item.state.leftclicked = ImGui::IsItemClicked();
item.state.rightclicked = ImGui::IsItemClicked(1);
Expand Down Expand Up @@ -4388,26 +4389,7 @@ DearPyGui::draw_radio_button(ImDrawList* drawlist, mvAppItem& item, mvRadioButto
//-----------------------------------------------------------------------------
// update state
//-----------------------------------------------------------------------------
item.state.lastFrameUpdate = GContext->frame;
item.state.hovered = ImGui::IsItemHovered();
item.state.active = ImGui::IsItemActive();
item.state.focused = ImGui::IsItemFocused();
item.state.leftclicked = ImGui::IsItemClicked();
item.state.rightclicked = ImGui::IsItemClicked(1);
item.state.middleclicked = ImGui::IsItemClicked(2);
for (int i = 0; i < item.state.doubleclicked.size(); i++)
{
item.state.doubleclicked[i] = IsItemDoubleClicked(i);
}
item.state.visible = ImGui::IsItemVisible();
item.state.activated = ImGui::IsItemActivated();
item.state.deactivated = ImGui::IsItemDeactivated();
item.state.deactivatedAfterEdit = ImGui::IsItemDeactivatedAfterEdit();
item.state.toggledOpen = ImGui::IsItemToggledOpen();
item.state.rectMin = { ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y };
item.state.rectMax = { ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y };
item.state.rectSize = { ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y };
item.state.contextRegionAvail = { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y };
UpdateAppItemState(item.state);

//-----------------------------------------------------------------------------
// post draw
Expand Down
15 changes: 15 additions & 0 deletions src/mvContainers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,9 @@ DearPyGui::draw_menu(ImDrawList* drawlist, mvAppItem& item, mvMenuConfig& config
item.state.active = ImGui::IsItemActive();
item.state.activated = ImGui::IsItemActivated();
item.state.deactivated = ImGui::IsItemDeactivated();
item.state.prevFocused = item.state.focused;
item.state.focused = ImGui::IsWindowFocused();
item.state.prevHovered = item.state.hovered;
item.state.hovered = ImGui::IsWindowHovered();
item.state.rectSize = { ImGui::GetWindowWidth(), ImGui::GetWindowHeight() };
item.state.contextRegionAvail = { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y };
Expand Down Expand Up @@ -682,7 +684,9 @@ DearPyGui::draw_menu(ImDrawList* drawlist, mvAppItem& item, mvMenuConfig& config
item.state.active = ImGui::IsItemActive();
item.state.activated = ImGui::IsItemActivated();
item.state.deactivated = ImGui::IsItemDeactivated();
item.state.prevFocused = item.state.focused;
item.state.focused = false;
item.state.prevHovered = item.state.hovered;
item.state.hovered = false;
item.state.rectSize = { 0.0f, 0.0f };
item.state.contextRegionAvail = { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y };
Expand Down Expand Up @@ -779,6 +783,7 @@ DearPyGui::draw_tab(ImDrawList* drawlist, mvAppItem& item, mvTabConfig& config)
}

item.state.lastFrameUpdate = GContext->frame;
item.state.prevHovered = item.state.hovered;
// create tab item and see if it is selected
if (ImGui::BeginTabItem(item.info.internalLabel.c_str(), config.closable ? &item.config.show : nullptr, config._flags))
{
Expand Down Expand Up @@ -927,7 +932,9 @@ DearPyGui::draw_child_window(ImDrawList* drawlist, mvAppItem& item, mvChildWindo
item.state.lastFrameUpdate = GContext->frame;
item.state.active = ImGui::IsItemActive();
item.state.deactivated = ImGui::IsItemDeactivated();
item.state.prevFocused = item.state.focused;
item.state.focused = ImGui::IsWindowFocused();
item.state.prevHovered = item.state.hovered;
item.state.hovered = ImGui::IsWindowHovered();
item.state.rectSize = { ImGui::GetWindowWidth(), ImGui::GetWindowHeight() };
item.state.contextRegionAvail = { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y };
Expand Down Expand Up @@ -1511,7 +1518,9 @@ DearPyGui::draw_window(ImDrawList* drawlist, mvAppItem& item, mvWindowAppItemCon
// shouldn't have to do this but do. Fix later
item.config.show = false;
item.state.lastFrameUpdate = GContext->frame;
item.state.prevHovered = item.state.hovered;
item.state.hovered = false;
item.state.prevFocused = item.state.focused;
item.state.focused = false;
item.state.toggledOpen = false;
item.state.visible = false;
Expand Down Expand Up @@ -1550,7 +1559,9 @@ DearPyGui::draw_window(ImDrawList* drawlist, mvAppItem& item, mvWindowAppItemCon
item.config.show = false;
// Update item state so that get_item_state is valid
item.state.lastFrameUpdate = GContext->frame;
item.state.prevHovered = item.state.hovered;
item.state.hovered = false;
item.state.prevFocused = item.state.focused;
item.state.focused = false;
item.state.toggledOpen = false;
item.state.visible = false;
Expand Down Expand Up @@ -1658,7 +1669,9 @@ DearPyGui::draw_window(ImDrawList* drawlist, mvAppItem& item, mvWindowAppItemCon

item.state.lastFrameUpdate = GContext->frame;
item.state.visible = true;
item.state.prevHovered = item.state.hovered;
item.state.hovered = ImGui::IsWindowHovered();
item.state.prevFocused = item.state.focused;
item.state.focused = ImGui::IsWindowFocused();
item.state.rectSize = { ImGui::GetWindowSize().x, ImGui::GetWindowSize().y };
item.state.toggledOpen = ImGui::IsWindowCollapsed();
Expand Down Expand Up @@ -1705,7 +1718,9 @@ DearPyGui::draw_window(ImDrawList* drawlist, mvAppItem& item, mvWindowAppItemCon
if (!item.config.show)
{
item.state.lastFrameUpdate = GContext->frame;
item.state.prevHovered = item.state.hovered;
item.state.hovered = false;
item.state.prevFocused = item.state.focused;
item.state.focused = false;
item.state.toggledOpen = false;
item.state.visible = false;
Expand Down
45 changes: 36 additions & 9 deletions src/mvItemHandlers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,40 @@ void mvItemHandler::submitHandler(mvAppItem* parent)
});
}

void mvBoolStateHandler::checkEvent(bool curState, bool prevState, mvAppItem* parent)
{
mvEventType eventType = curState?
(prevState? mvEventType_On : mvEventType_EnterAndOn) :
(prevState? mvEventType_LeaveAndOff : mvEventType_Off);

if (trackedEventType & eventType)
{
// We do not pass eventType to callback yet in order to keep it compatible
// with the old version.
submitHandler(parent);
}
}

void mvBoolStateHandler::handleSpecificKeywordArgs(PyObject* dict)
{
if (dict == nullptr)
return;

if (PyObject* item = PyDict_GetItemString(dict, "event_type"))
{
if (item != Py_None)
trackedEventType = static_cast<mvEventType>(ToInt(item));
}
}

void mvBoolStateHandler::getSpecificConfiguration(PyObject* dict)
{
if (dict == nullptr)
return;

PyDict_SetItemString(dict, "event_type", mvPyObject(ToPyInt(trackedEventType)));
}

void mvActivatedHandler::customAction(void* data)
{

Expand Down Expand Up @@ -277,21 +311,14 @@ void mvEditedHandler::customAction(void* data)

void mvFocusHandler::customAction(void* data)
{

mvAppItemState* state = static_cast<mvAppItemState*>(data);
if (state->focused)
{
submitHandler(state->parent);
}
checkEvent(state->focused, state->prevFocused, state->parent);
}

void mvHoverHandler::customAction(void* data)
{
mvAppItemState* state = static_cast<mvAppItemState*>(data);
if (state->hovered)
{
submitHandler(state->parent);
}
checkEvent(state->hovered, state->prevHovered, state->parent);
}

void mvResizeHandler::customAction(void* data)
Expand Down
Loading
Loading