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
2 changes: 1 addition & 1 deletion dearpygui/_dearpygui.pyi

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

4 changes: 2 additions & 2 deletions dearpygui/_dearpygui_RTD.py

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

4 changes: 2 additions & 2 deletions dearpygui/dearpygui.py

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

111 changes: 49 additions & 62 deletions src/dearpygui_commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -3015,7 +3015,7 @@ static PyObject*
set_primary_window(PyObject* self, PyObject* args, PyObject* kwargs)
{
PyObject* itemraw;
i32 value;
i32 value = 1;

if (!VerifyRequiredArguments(GetParsers()["set_primary_window"], args))
return GetPyNoneOrError();
Expand All @@ -3027,73 +3027,60 @@ set_primary_window(PyObject* self, PyObject* args, PyObject* kwargs)

mvUUID item = GetIDFromPyObject(itemraw);

{
mvWindowAppItem* window = GetWindow(*GContext->itemRegistry, item);
mvWindowAppItem* window = GetWindow(*GContext->itemRegistry, item);

if (!window)
{
mvThrowPythonError(mvErrorCode::mvItemNotFound, "set_primary_window",
"Item not found: " + std::to_string(item), nullptr);
assert(false);
return nullptr;
}
else
{
if (window->configData.mainWindow == (bool)value)
return GetPyNone();
else
{
window->configData.mainWindow = value;
if (value)
{
window->configData._oldWindowflags = window->configData.windowflags;
window->configData.windowflags = ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoSavedSettings
| ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar;

if (window->configData._oldWindowflags & ImGuiWindowFlags_MenuBar)
window->configData.windowflags |= ImGuiWindowFlags_MenuBar;
window->configData._oldxpos = window->state.pos.x;
window->configData._oldypos = window->state.pos.y;
window->configData._oldWidth = window->config.width;
window->configData._oldHeight = window->config.height;
}
else
{
window->info.focusNextFrame = true;
if (window->configData.windowflags & ImGuiWindowFlags_MenuBar)
window->configData._oldWindowflags |= ImGuiWindowFlags_MenuBar;
window->configData.windowflags = window->configData._oldWindowflags;
if (window->configData.windowflags & ImGuiWindowFlags_MenuBar)
window->configData.windowflags |= ImGuiWindowFlags_MenuBar;
window->state.pos = { window->configData._oldxpos , window->configData._oldypos };
window->config.width = window->configData._oldWidth;
window->config.height = window->configData._oldHeight;
window->info.dirtyPos = true;
window->info.dirty_size = true;
}
}
}
if (!window)
{
mvThrowPythonError(mvErrorCode::mvItemNotFound, "set_primary_window",
"Item not found: " + std::to_string(item), nullptr);
assert(false);
return nullptr;
}

// reset other windows
for (auto& window : GContext->itemRegistry->windowRoots)
if (window->configData.mainWindow == (bool)value)
// Nothing to do!
return GetPyNone();

// Now, we either demote this (primary) window back to a regular window, or demote
// another window and set this one to be the new primary. The `value` shows us
// the direction.
mvWindowAppItem* old_primary = nullptr;

if (value)
{
if (window->uuid != item)
// Find old primary, if any. Also re-focus all windows except the current one
// so that they float atop of the primary window (otherwise they'd stay hidden
// behind it). Unfortunately ImGui does not have better means for controlling z-order.
for (auto& root : GContext->itemRegistry->windowRoots)
{
mvWindowAppItem* windowActual = static_cast<mvWindowAppItem*>(window.get());
windowActual->configData.mainWindow = false;
window->info.focusNextFrame = true;
if (windowActual->configData.windowflags & ImGuiWindowFlags_MenuBar)
windowActual->configData._oldWindowflags |= ImGuiWindowFlags_MenuBar;
windowActual->configData.windowflags = windowActual->configData._oldWindowflags;
if (windowActual->configData.windowflags & ImGuiWindowFlags_MenuBar)
windowActual->configData.windowflags |= ImGuiWindowFlags_MenuBar;
window->state.pos = { windowActual->configData._oldxpos , windowActual->configData._oldypos };
window->config.width = windowActual->configData._oldWidth;
window->config.height = windowActual->configData._oldHeight;
window->info.dirtyPos = true;
window->info.dirty_size = true;
mvWindowAppItem* cur_window = static_cast<mvWindowAppItem*>(root.get());
if (cur_window->configData.mainWindow)
old_primary = cur_window;

cur_window->info.focusNextFrame = (cur_window->uuid != item);
}

// Select the window passed in as a primary
window->configData.mainWindow = true;
window->configData._oldxpos = window->state.pos.x;
window->configData._oldypos = window->state.pos.y;
window->configData._oldWidth = window->config.width;
window->configData._oldHeight = window->config.height;
}
else
// Just demote this window, nothing special
old_primary = window;

// Now whatever old primary was there (it might be the window passed in -
// if `value` is False), we want to make it a regular window.
if (old_primary)
{
old_primary->configData.mainWindow = false;
old_primary->state.pos = { old_primary->configData._oldxpos , old_primary->configData._oldypos };
old_primary->config.width = old_primary->configData._oldWidth;
old_primary->config.height = old_primary->configData._oldHeight;
old_primary->info.dirtyPos = true;
old_primary->info.dirty_size = true;
}

return GetPyNone();
Expand Down
2 changes: 1 addition & 1 deletion src/dearpygui_parsers.h
Original file line number Diff line number Diff line change
Expand Up @@ -1289,7 +1289,7 @@ InsertParser_Block2(std::map<std::string, mvPythonParser>& parsers)
{
std::vector<mvPythonDataElement> args;
args.push_back({ mvPyDataType::UUID, "window" });
args.push_back({ mvPyDataType::Bool, "value" });
args.push_back({ mvPyDataType::Bool, "value", mvArgType::POSITIONAL_ARG, "True", "True to select this window as primary, False to make it a regular window (without any primary window). Only one window at a time can be primary." });

mvPythonParserSetup setup;
setup.about = "Sets the primary window.";
Expand Down
18 changes: 8 additions & 10 deletions src/mvContainers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -485,13 +485,6 @@ DearPyGui::set_configuration(PyObject* inDict, mvAppItem& itemc, mvWindowAppItem
flagop("no_scroll_with_mouse", ImGuiWindowFlags_NoScrollWithMouse, outConfig.windowflags);
flagop("unsaved_document", ImGuiWindowFlags_UnsavedDocument, outConfig.windowflags);
flagop("no_docking", ImGuiWindowFlags_NoDocking, outConfig.windowflags);


outConfig._oldxpos = itemc.state.pos.x;
outConfig._oldypos = itemc.state.pos.y;
outConfig._oldWidth = itemc.config.width;
outConfig._oldHeight = itemc.config.height;
outConfig._oldWindowflags = outConfig.windowflags;
}

//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -1476,12 +1469,17 @@ DearPyGui::draw_window(ImDrawList* drawlist, mvAppItem& item, mvWindowAppItemCon

ScopedID id(item.uuid);

// For primary windows, we'll need to massage the flags
ImGuiWindowFlags windowFlags = config.windowflags;
if (config.mainWindow)
{
ImGui::SetNextWindowBgAlpha(1.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); // to prevent main window corners from showing
ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f));
ImGui::SetNextWindowSize(ImVec2((float)GContext->viewport->clientWidth, (float)GContext->viewport->clientHeight));
windowFlags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoSavedSettings
| ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove;
windowFlags &= ~ImGuiWindowFlags_AlwaysAutoResize;
}

else if (item.info.dirtyPos)
Expand Down Expand Up @@ -1514,7 +1512,7 @@ DearPyGui::draw_window(ImDrawList* drawlist, mvAppItem& item, mvWindowAppItemCon
ImGui::OpenPopup(item.info.internalLabel.c_str(), config.no_open_over_existing_popup ? ImGuiPopupFlags_NoOpenOverExistingPopup : ImGuiPopupFlags_None);
}

if (!ImGui::BeginPopupModal(item.info.internalLabel.c_str(), config.no_close ? nullptr : &item.config.show, config.windowflags))
if (!ImGui::BeginPopupModal(item.info.internalLabel.c_str(), config.no_close ? nullptr : &item.config.show, windowFlags))
{
if (config.mainWindow)
ImGui::PopStyleVar();
Expand Down Expand Up @@ -1546,7 +1544,7 @@ DearPyGui::draw_window(ImDrawList* drawlist, mvAppItem& item, mvWindowAppItemCon
ImGui::OpenPopup(item.info.internalLabel.c_str(), config.no_open_over_existing_popup ? ImGuiPopupFlags_NoOpenOverExistingPopup : ImGuiPopupFlags_None);
}

if (!ImGui::BeginPopup(item.info.internalLabel.c_str(), config.windowflags))
if (!ImGui::BeginPopup(item.info.internalLabel.c_str(), windowFlags))
{
if (config.mainWindow)
ImGui::PopStyleVar();
Expand Down Expand Up @@ -1581,7 +1579,7 @@ DearPyGui::draw_window(ImDrawList* drawlist, mvAppItem& item, mvWindowAppItemCon
ImGuiIO &io = ImGui::GetIO();
io.ConfigWindowsCopyContentsWithCtrlC = config.copy_contents_shortcut;

if (!ImGui::Begin(item.info.internalLabel.c_str(), config.no_close ? nullptr : &item.config.show, config.windowflags))
if (!ImGui::Begin(item.info.internalLabel.c_str(), config.no_close ? nullptr : &item.config.show, windowFlags))
{
if (config.mainWindow)
ImGui::PopStyleVar();
Expand Down
3 changes: 1 addition & 2 deletions src/mvContainers.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,6 @@ struct mvWindowAppItemConfig
mvVec2 min_size = { 100.0f, 100.0f };
mvVec2 max_size = { 30000.0f, 30000.0f };
bool _collapsedDirty = true;
ImGuiWindowFlags _oldWindowflags = ImGuiWindowFlags_None;
float _oldxpos = 200;
float _oldypos = 200;
int _oldWidth = 200;
Expand Down Expand Up @@ -269,7 +268,7 @@ class mvWindowAppItem : public mvAppItem
{
public:
mvWindowAppItemConfig configData{};
explicit mvWindowAppItem(mvUUID uuid, bool mainWindow = false) : mvAppItem(uuid) { configData.mainWindow = mainWindow; config.width = config.height = 500; info.dirty_size = true; if (mainWindow) configData.windowflags = ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar;}
explicit mvWindowAppItem(mvUUID uuid) : mvAppItem(uuid) { config.width = config.height = 500; info.dirty_size = true; }
void draw(ImDrawList* drawlist, float x, float y) override { DearPyGui::draw_window(drawlist, *this, configData); }
void handleSpecificKeywordArgs(PyObject* dict) override { DearPyGui::set_configuration(dict, *this, configData); }
void getSpecificConfiguration(PyObject* dict) override { DearPyGui::fill_configuration_dict(configData, dict); }
Expand Down
Loading