I just want to see viewport, with playing in editor, without moving or minimizing the other window

Hello. I have short question.

There are two windows, and blueprint editor window is activated. So blueprint editor window is on top.

At this condition, if I click the level editor window, then -

Level editor window is activated, but, still blueprint editor window is on top. Because of this, I can not see large part of level editor window, including PIE viewport.

Why? How can I bring level editor window to top?

I spent lot of time to search about this, in several month, with many search word. Level editor window, PIE window, viewport window, parent window… always on top, blinded by other window… (I found [this][3] from forum, but it does not help for me. [this][4] seems related, but I’m not sure.)

Today, finally, I spent all of day to try to modify unreal engine with source code. It was fun and beneficial for me, but I failed to solve.

This is about my productivity, convenience, and effectiveness. But also, this is about my curiosity, emotion, motivation, confidence, and desire. Because of these, it looks impossible for me to give this up.

I just want to see viewport, with playing in editor, without moving or minimizing the other window. But it looks not easy for me.

In search, I found these too.

  • [How can I switch between
    editor windows without minimizing to
    taskbar?][5]: This is linked to below.
  • [Why are editor sub-windows always on
    top, and why can’t I alt-tab between
    them?][6]: This looks there was some feature request, but it seems rejected or deleted. And, 1. I want to know why 2. If neeeded, I will make custom engine from source code by myself. Please tell me where to modify. Or, at least, give me advice about where to start or continue to search, please.
  • [WinExplorer][7]: It can edit the properties of window, for example- Z Order, WS_CLIPCHILDREN. But it failed. I tried to use what I know from this through custom engine based on source code, but it failed, too.

Add by edit: Just wondering still now. Why Epic makes like this? is there need related some other feature?

A few solutions for you:

  1. You can dock the windows into each other like browser tabs.
  2. Alt + Tab on windows to change windows
  3. Try a standalone viewport.

It’s always easier with a duel-monitor setup, but anyways… just for the fun of poking around engine source :slight_smile:

You want to look into these two functions:

FSlateApplication::AddWindowAsNativeChild

FSlateApplication::AddWindow

Windows added with FSlateApplication::AddWindowAsNativeChild will stay on top of its parent window, where those with FSlateApplication::AddWindow can

You can test them out with an “Editor Standalone Window” plugin. After creating the plugin, comment out existing code under F[PluginName]Module::PluginButtonClicked(), then add the following:

FSlateApplication::Get().AddWindowAsNativeChild(SNew(SWindow), FGlobalTabmanager::Get()->GetRootWindow().ToSharedRef());

OR

FSlateApplication::Get().AddWindow(SNew(SWindow));

Hopefully this is enough to get you somewhere.

1 Like

Thank you so much! It’s what I need exactly!
By the way, today I’m struggling with msb3075. It takes my whole day, and I’m re-installing visual studio now. After this, I will check what you said with hope. Really really thank you.

Fun. The fun is very important to me. I believe that, the fun is important for all of us. Because what we make is about fun.

Thank you for your time:) I use those things already with my work. But, it’s not enough to me:)

I did it!

What I modified is this: (UE version is 4.23)

From TabManager.cpp ( \Engine\Source\Runtime\Slate\Private\Framework\Docking\TabManager.cpp )

in TSharedRef FTabManager::RestoreArea_Helper()

I found below source,

			// Any windows that were "pulled out" of a dock area should be children of the window in which the parent dock area resides.
			if (bIsChildWindow)
			{				
				FSlateApplication::Get().AddWindowAsNativeChild( NewWindow, ParentWindow.ToSharedRef() )->SetContent(
					SAssignNew( NewDockAreaWidget, SDockingArea, SharedThis(this), NodeAsArea.ToSharedRef() ) .ParentWindow( NewWindow )
				);				
			}
			else
			{
				FSlateApplication::Get().AddWindow( NewWindow )->SetContent(
					SAssignNew( NewDockAreaWidget, SDockingArea, SharedThis(this), NodeAsArea.ToSharedRef() ) .ParentWindow( NewWindow )
				);
			}

And I modified like this: (just copy and past from line under else{ )

			// Any windows that were "pulled out" of a dock area should be children of the window in which the parent dock area resides.
			if (bIsChildWindow)
			{				
				//FSlateApplication::Get().AddWindowAsNativeChild( NewWindow, ParentWindow.ToSharedRef() )->SetContent(
				//	SAssignNew( NewDockAreaWidget, SDockingArea, SharedThis(this), NodeAsArea.ToSharedRef() ) .ParentWindow( NewWindow )
				//);
				FSlateApplication::Get().AddWindow(NewWindow)->SetContent(
					SAssignNew(NewDockAreaWidget, SDockingArea, SharedThis(this), NodeAsArea.ToSharedRef()).ParentWindow(NewWindow)
				);
			}
			else
			{
				FSlateApplication::Get().AddWindow( NewWindow )->SetContent(
					SAssignNew( NewDockAreaWidget, SDockingArea, SharedThis(this), NodeAsArea.ToSharedRef() ) .ParentWindow( NewWindow )
				);
			}

Then it works! How sweet!!! Thank you!

For other people may see this post, I add this comment:
I’m testing what I modified from above, but I’m experiencing some crashes.
If I get something new, I will post agian.

Being a complete noob at unreal engine and no programming experience, as someone with no knowledge, can you explain how to do this like I’m a 4 year old? I would greatly appreciate it!

The solution above from Hyaniner may cause some errors/crashes. The solution below removes a redundancy and unnecessary variable check, has been tested by our dev team, and is stable and fully functional in UE 5.3.2.

Edit \Engine\Source\Runtime\Slate\Private\Framework\Docking\TabManager.cpp, and replace the following block of code:

				// Any windows that were "pulled out" of a dock area should be children of the window in which the parent dock area resides.
				if (bIsChildWindow)
				{
					FSlateApplication::Get().AddWindowAsNativeChild(NewWindow, ParentWindow.ToSharedRef())->SetContent(
						SAssignNew(NewDockAreaWidget, SDockingArea, SharedThis(this), NodeAsArea.ToSharedRef()).ParentWindow(NewWindow)
					);
				}
				else
				{
					FSlateApplication::Get().AddWindow(NewWindow)->SetContent(
						SAssignNew(NewDockAreaWidget, SDockingArea, SharedThis(this), NodeAsArea.ToSharedRef()).ParentWindow(NewWindow)
					);
				}

With this block of code:

				// Any windows that were "pulled out" of a dock area should be children of the window in which the parent dock area resides.
				// if (bIsChildWindow)
				// {
					// FSlateApplication::Get().AddWindowAsNativeChild(NewWindow, ParentWindow.ToSharedRef())->SetContent(
						// SAssignNew(NewDockAreaWidget, SDockingArea, SharedThis(this), NodeAsArea.ToSharedRef()).ParentWindow(NewWindow)
					// );
				// }
				// else
				{
					FSlateApplication::Get().AddWindow(NewWindow)->SetContent(
						SAssignNew(NewDockAreaWidget, SDockingArea, SharedThis(this), NodeAsArea.ToSharedRef()).ParentWindow(NewWindow)
					);
				}

Then save the file, and rebuild UGS/Unreal Editor. If you’re not familiar with how to do this, you’ll need to take the time to read up on it and learn, and you’ll need Visual Studio installed if you don’t have it already.

Or, if you’re part of a dev team, you could submit a request to your engineering team to make this change to implement it for everyone on the team.

This change removes the “child window” if/else statement, effectively ignoring the bIsChildWindow variable, so that any new window functions the same as a regular “parent” window (which is basically the way most other Windows apps function).

1 Like