Skip to content

Commit 6c9277d

Browse files
committed
FullscreenUI: Improve split window UX
- Fix sidebar scroll resetting after activation. - Fix selection rectangle displaying on escape down. - Improve padding and remove gaps.
1 parent c5ce2f9 commit 6c9277d

File tree

3 files changed

+45
-37
lines changed

3 files changed

+45
-37
lines changed

src/core/fullscreenui_settings.cpp

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1903,13 +1903,7 @@ void FullscreenUI::DrawSettingsWindow()
19031903
ImVec2(io.DisplaySize.x, io.DisplaySize.y - heading_size.y - LayoutScale(LAYOUT_FOOTER_HEIGHT)),
19041904
TinyString::from_format("settings_page_{}", static_cast<u32>(s_settings_locals.settings_page)).c_str(),
19051905
ImVec4(UIStyle.BackgroundColor.x, UIStyle.BackgroundColor.y, UIStyle.BackgroundColor.z,
1906-
s_settings_locals.settings_last_bg_alpha),
1907-
0.0f, ImVec2(LAYOUT_MENU_WINDOW_X_PADDING, LAYOUT_MENU_WINDOW_Y_PADDING));
1908-
1909-
// so the child windows get it
1910-
ImGui::PushStyleColor(ImGuiCol_WindowBg,
1911-
ModAlpha(UIStyle.BackgroundColor, s_settings_locals.settings_last_bg_alpha *
1912-
s_settings_locals.settings_last_bg_alpha));
1906+
s_settings_locals.settings_last_bg_alpha));
19131907

19141908
if (SplitWindowIsNavWindow() && WantsToCloseMenu())
19151909
ReturnToPreviousWindow();
@@ -1986,9 +1980,6 @@ void FullscreenUI::DrawSettingsWindow()
19861980
}
19871981
}
19881982

1989-
if (is_split_window)
1990-
ImGui::PopStyleColor(1);
1991-
19921983
EndFullscreenWindow();
19931984

19941985
if (!ImGui::IsPopupOpen(0u, ImGuiPopupFlags_AnyPopup) && !WasSplitWindowChanged())
@@ -3144,8 +3135,10 @@ void FullscreenUI::DrawControllerSettingsPage()
31443135
if (SplitWindowSidebarItem(FSUI_ICONVSTR(ICON_FA_GEARS, "Global Settings"),
31453136
(s_settings_locals.selected_controller_port == -1)))
31463137
{
3147-
BeginTransition(DEFAULT_TRANSITION_TIME, []() { s_settings_locals.selected_controller_port = -1; });
3148-
FullscreenUI::FocusSplitWindowContent(true);
3138+
BeginTransition(DEFAULT_TRANSITION_TIME, []() {
3139+
s_settings_locals.selected_controller_port = -1;
3140+
FullscreenUI::FocusSplitWindowContent();
3141+
});
31493142
}
31503143

31513144
// load mtap settings
@@ -3174,18 +3167,21 @@ void FullscreenUI::DrawControllerSettingsPage()
31743167
Controller::GetPortDisplayName(mtap_port, mtap_slot, mtap_enabled[mtap_port])),
31753168
ci->GetDisplayName(), (s_settings_locals.selected_controller_port == static_cast<s8>(global_slot))))
31763169
{
3177-
BeginTransition(DEFAULT_TRANSITION_TIME,
3178-
[global_slot]() { s_settings_locals.selected_controller_port = static_cast<s8>(global_slot); });
3179-
FullscreenUI::FocusSplitWindowContent(true);
3170+
BeginTransition(DEFAULT_TRANSITION_TIME, [global_slot]() {
3171+
s_settings_locals.selected_controller_port = static_cast<s8>(global_slot);
3172+
FullscreenUI::FocusSplitWindowContent();
3173+
});
31803174
}
31813175
}
31823176

31833177
const bool show_hotkeys = !IsEditingGameSettings(bsi);
31843178
if (show_hotkeys && SplitWindowSidebarItem(FSUI_ICONVSTR(ICON_PF_KEYBOARD_ALT, "Hotkeys"),
31853179
(s_settings_locals.selected_controller_port == -2)))
31863180
{
3187-
BeginTransition(DEFAULT_TRANSITION_TIME, []() { s_settings_locals.selected_controller_port = -2; });
3188-
FullscreenUI::FocusSplitWindowContent(true);
3181+
BeginTransition(DEFAULT_TRANSITION_TIME, []() {
3182+
s_settings_locals.selected_controller_port = -2;
3183+
FullscreenUI::FocusSplitWindowContent();
3184+
});
31893185
}
31903186

31913187
EndSplitWindowSidebar();
@@ -3313,6 +3309,8 @@ void FullscreenUI::DrawControllerSettingsPage()
33133309

33143310
ImGui::PushID(TinyString::from_format("port_{}", global_slot));
33153311

3312+
MenuHeading(FSUI_VSTR("Controller Type"));
3313+
33163314
ResetSplitWindowContentFocusHere();
33173315

33183316
const TinyString section = TinyString::from_format("Pad{}", global_slot + 1);

src/core/fullscreenui_widgets.cpp

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,7 @@ void FullscreenUI::PushResetLayout()
11521152
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
11531153
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(8.0f, 8.0f));
11541154
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, LayoutScale(4.0f, 3.0f));
1155-
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, LayoutScale(8.0f, 4.0f));
1155+
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, LayoutScale(LAYOUT_ITEM_X_SPACING, LAYOUT_ITEM_Y_SPACING));
11561156
ImGui::PushStyleVar(ImGuiStyleVar_ItemInnerSpacing, LayoutScale(4.0f, 4.0f));
11571157
ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, LayoutScale(4.0f, 2.0f));
11581158
ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, LayoutScale(21.0f));
@@ -1252,10 +1252,8 @@ bool FullscreenUI::IsFocusResetQueued()
12521252

12531253
bool FullscreenUI::IsFocusResetFromWindowChange()
12541254
{
1255-
return (s_state.focus_reset_queued != FocusResetType::None &&
1256-
s_state.focus_reset_queued != FocusResetType::PopupOpened &&
1257-
s_state.focus_reset_queued != FocusResetType::PopupClosed &&
1258-
s_state.focus_reset_queued != FocusResetType::SplitWindowChanged);
1255+
return (s_state.focus_reset_queued == FocusResetType::ViewChanged ||
1256+
s_state.focus_reset_queued == FocusResetType::Other);
12591257
}
12601258

12611259
FullscreenUI::FocusResetType FullscreenUI::GetQueuedFocusResetType()
@@ -2216,8 +2214,8 @@ void FullscreenUI::MenuHeading(std::string_view title, bool draw_line /*= true*/
22162214
const ImVec2 title_size =
22172215
UIStyle.Font->CalcTextSizeA(font_size, font_weight, FLT_MAX, avail_width, IMSTR_START_END(title));
22182216
const u32 title_color = ImGui::GetColorU32(ImGuiCol_TextDisabled);
2219-
RenderShadowedTextClipped(UIStyle.Font, font_size, font_weight, pos, pos + title_size,
2220-
title_color, title, &title_size, ImVec2(0.0f, 0.0f), avail_width);
2217+
RenderShadowedTextClipped(UIStyle.Font, font_size, font_weight, pos, pos + title_size, title_color, title,
2218+
&title_size, ImVec2(0.0f, 0.0f), avail_width);
22212219

22222220
float total_height = UIStyle.LargeFontSize + style.FramePadding.y;
22232221

@@ -3310,9 +3308,9 @@ void FullscreenUI::BeginInnerSplitWindow()
33103308
window->DC.LayoutType = ImGuiLayoutType_Horizontal;
33113309

33123310
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
3313-
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, LayoutScale(10.0f, 0.0f));
3311+
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f));
33143312
ImGui::PushStyleVar(ImGuiStyleVar_ChildBorderSize, 0.0f);
3315-
ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, LayoutScale(LAYOUT_MENU_ITEM_BORDER_ROUNDING));
3313+
ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 0.0f);
33163314

33173315
s_state.split_window_focus_change = SplitWindowFocusChange::None;
33183316

@@ -3338,14 +3336,18 @@ void FullscreenUI::EndInnerSplitWindow()
33383336

33393337
bool FullscreenUI::BeginSplitWindowSidebar(float sidebar_width /*= 0.2f*/)
33403338
{
3341-
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(10.0f, 10.0f));
3342-
ImGui::PushStyleColor(ImGuiCol_ChildBg, DarkerColor(ImGui::GetStyle().Colors[ImGuiCol_WindowBg], 1.2f));
3339+
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding,
3340+
LayoutScale(LAYOUT_MENU_WINDOW_X_PADDING, LAYOUT_MENU_WINDOW_Y_PADDING));
3341+
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, LayoutScale(LAYOUT_ITEM_X_SPACING, LAYOUT_ITEM_Y_SPACING));
3342+
ImGui::PushStyleColor(ImGuiCol_ChildBg,
3343+
ModAlpha(DarkerColor(ImGui::GetStyle().Colors[ImGuiCol_WindowBg], 1.75f), 0.25f));
33433344

33443345
if (IsFocusResetFromWindowChange())
33453346
ImGui::SetNextWindowScroll(ImVec2(0.0f, 0.0f));
33463347

33473348
const float sidebar_width_px = ImFloor(ImGui::GetCurrentWindowRead()->WorkRect.GetWidth() * sidebar_width);
3348-
if (!ImGui::BeginChild("sidebar", ImVec2(sidebar_width_px, 0.0f)))
3349+
if (!ImGui::BeginChild("sidebar", ImVec2(sidebar_width_px, 0.0f),
3350+
ImGuiChildFlags_AlwaysUseWindowPadding | ImGuiChildFlags_NoNavCancel))
33493351
return false;
33503352

33513353
if (ImGui::IsWindowFocused())
@@ -3380,7 +3382,7 @@ void FullscreenUI::EndSplitWindowSidebar()
33803382

33813383
ImGui::GetWindowDrawList()->ChannelsMerge();
33823384
ImGui::PopStyleColor(1);
3383-
ImGui::PopStyleVar(1);
3385+
ImGui::PopStyleVar(2);
33843386

33853387
SetWindowNavWrapping(false, true);
33863388

@@ -3444,16 +3446,20 @@ bool FullscreenUI::SplitWindowSidebarItem(std::string_view title, std::string_vi
34443446

34453447
bool FullscreenUI::BeginSplitWindowContent(bool background)
34463448
{
3447-
ImGui::PushStyleColor(ImGuiCol_ChildBg, DarkerColor(ImGui::GetStyle().Colors[ImGuiCol_WindowBg], 1.1f));
3449+
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, LayoutScale(LAYOUT_MENU_WINDOW_X_PADDING, 0.0f));
3450+
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, LayoutScale(LAYOUT_ITEM_X_SPACING, LAYOUT_ITEM_Y_SPACING));
3451+
ImGui::PushStyleColor(ImGuiCol_ChildBg,
3452+
ModAlpha(DarkerColor(ImGui::GetStyle().Colors[ImGuiCol_WindowBg], 1.5f), 0.25f));
34483453

34493454
if (IsFocusResetFromWindowChange())
34503455
ImGui::SetNextWindowScroll(ImVec2(0.0f, 0.0f));
34513456

34523457
ImGuiWindow* const window = ImGui::GetCurrentWindow();
34533458
const float content_width = window->WorkRect.Max.x - window->DC.CursorPos.x;
34543459

3455-
const bool ret =
3456-
ImGui::BeginChild("content", ImVec2(content_width, 0.0f), 0, background ? 0 : ImGuiWindowFlags_NoBackground);
3460+
const bool ret = ImGui::BeginChild("content", ImVec2(content_width, 0.0f),
3461+
ImGuiChildFlags_AlwaysUseWindowPadding | ImGuiChildFlags_NoNavCancel,
3462+
background ? 0 : ImGuiWindowFlags_NoBackground);
34573463

34583464
if (ImGui::IsWindowFocused())
34593465
{
@@ -3483,6 +3489,7 @@ void FullscreenUI::ResetSplitWindowContentFocusHere()
34833489
void FullscreenUI::EndSplitWindowContent()
34843490
{
34853491
ImGui::PopStyleColor(1);
3492+
ImGui::PopStyleVar(2);
34863493

34873494
SetWindowNavWrapping(false, true);
34883495

@@ -3494,10 +3501,10 @@ bool FullscreenUI::WasSplitWindowChanged()
34943501
return (s_state.split_window_focus_change != SplitWindowFocusChange::None);
34953502
}
34963503

3497-
void FullscreenUI::FocusSplitWindowContent(bool reset_content_nav)
3504+
void FullscreenUI::FocusSplitWindowContent()
34983505
{
34993506
s_state.split_window_focus_change = SplitWindowFocusChange::FocusContent;
3500-
QueueResetFocus(reset_content_nav ? FocusResetType::Other : FocusResetType::SplitWindowChanged);
3507+
QueueResetFocus(FocusResetType::SplitContentChanged);
35013508
}
35023509

35033510
bool FullscreenUI::SplitWindowIsNavWindow()

src/core/fullscreenui_widgets.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ inline constexpr float LAYOUT_MENU_WINDOW_X_PADDING = 12.0f;
5656
inline constexpr float LAYOUT_MENU_WINDOW_Y_PADDING = 12.0f;
5757
inline constexpr float LAYOUT_MENU_ITEM_TITLE_SUMMARY_SPACING = 6.0f;
5858
inline constexpr float LAYOUT_MENU_ITEM_EXTRA_HEIGHT = 2.0f;
59-
static constexpr float LAYOUT_MENU_ITEM_BORDER_ROUNDING = 10.0f;
59+
inline constexpr float LAYOUT_MENU_ITEM_BORDER_ROUNDING = 10.0f;
60+
inline constexpr float LAYOUT_ITEM_X_SPACING = 8.0f;
61+
inline constexpr float LAYOUT_ITEM_Y_SPACING = 4.0f;
6062
inline constexpr float LAYOUT_FOOTER_PADDING = 10.0f;
6163
inline constexpr float LAYOUT_FOOTER_HEIGHT = LAYOUT_MEDIUM_FONT_SIZE + LAYOUT_FOOTER_PADDING * 2.0f;
6264
inline constexpr float LAYOUT_HORIZONTAL_MENU_HEIGHT = 320.0f;
@@ -297,6 +299,7 @@ enum class FocusResetType : u8
297299
PopupClosed,
298300
ViewChanged,
299301
SplitWindowChanged,
302+
SplitContentChanged,
300303
Other,
301304
};
302305
void QueueResetFocus(FocusResetType type);
@@ -480,7 +483,7 @@ bool BeginSplitWindowContent(bool background);
480483
void ResetSplitWindowContentFocusHere();
481484
void EndSplitWindowContent();
482485
bool WasSplitWindowChanged();
483-
void FocusSplitWindowContent(bool reset_content_nav);
486+
void FocusSplitWindowContent();
484487
bool SplitWindowIsNavWindow();
485488

486489
using FileSelectorCallback = std::function<void(std::string path)>;

0 commit comments

Comments
 (0)