Files
ppsspp/UI/DevScreens.h
T
Henrik RydgårdandClaude Opus 5.5 58fa522d48 UI: Limit the width of dialog screens, and keep content off the edges of large screens
Dialog screens (tabbed, two-pane, simple and the others built on
UIBaseDialogScreen) center their content at up to 1400 wide, instead of
stretching settings rows and buttons across very wide windows.

On large screens, those screens and the main screen also get an inset on all
sides, since controls right at the edge are hard to see there. It grows with
the screen's smaller dimension, from nothing at 600 to the full inset at
1000, and is always full on TVs. The game, popups, and the screens that
position things to match the game's screen (display layout, touch control
layout and tests, custom button and visual mapping) are left as they were.

The root's bounds are computed by UIScreen::GetContentBounds, since
UI::Margins can't hold widths this large.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 16:12:01 +02:00

208 lines
5.5 KiB
C++

// Copyright (c) 2013- PPSSPP Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0 or later versions.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
#pragma once
#include <memory>
#include <string>
#include <vector>
#include "Common/Data/Text/I18n.h"
#include "Common/Net/HTTPClient.h"
#include "Common/UI/UIScreen.h"
#include "UI/TabbedDialogScreen.h"
#include "UI/BaseScreens.h"
#include "UI/PopupScreens.h"
#include "UI/SimpleDialogScreen.h"
#include "GPU/Common/ShaderCommon.h"
class DevMenuScreen : public UI::PopupScreen {
public:
DevMenuScreen(const Path &gamePath, I18NCat cat) : PopupScreen(T(cat, "Dev Tools")), gamePath_(gamePath) {}
const char *tag() const override { return "DevMenu"; }
void CreatePopupContents(UI::ViewGroup *parent) override;
void dialogFinished(const Screen *dialog, DialogResult result) override;
private:
Path gamePath_;
};
class JitDebugScreen : public UIBaseDialogScreen {
public:
JitDebugScreen() {}
void CreateViews() override;
const char *tag() const override { return "JitDebug"; }
private:
void OnEnableAll(UI::EventParams &e);
void OnDisableAll(UI::EventParams &e);
};
class LogConfigScreen : public UITwoPaneBaseDialogScreen {
public:
LogConfigScreen() : UITwoPaneBaseDialogScreen(Path(), TwoPaneFlags::ContentsCanScroll | TwoPaneFlags::SettingsInContextMenu) {}
void CreateSettingsViews(UI::ViewGroup *parent) override;
void CreateContentViews(UI::ViewGroup *parent) override;
const char *tag() const override { return "LogConfig"; }
private:
std::string_view GetTitle() const override;
void OnToggleAll(UI::EventParams &e);
void OnEnableAll(UI::EventParams &e);
void OnDisableAll(UI::EventParams &e);
void OnLogLevel(UI::EventParams &e);
void OnLogLevelChange(UI::EventParams &e);
};
class LogViewScreen : public UIBaseDialogScreen {
public:
void CreateViews() override;
void update() override;
const char *tag() const override { return "Log"; }
private:
void UpdateLog();
UI::LinearLayout *vert_ = nullptr;
UI::ScrollView *scroll_ = nullptr;
bool toBottom_ = false;
};
class LogLevelScreen : public UI::ListPopupScreen {
public:
LogLevelScreen(std::string_view title);
const char *tag() const override { return "LogLevel"; }
private:
void OnCompleted(DialogResult result) override;
};
class GPIGPOScreen : public UI::PopupScreen {
public:
GPIGPOScreen(std::string_view title) : PopupScreen(title, T(I18NCat::DIALOG, "OK")) {}
const char *tag() const override { return "GPIGPO"; }
protected:
void CreatePopupContents(UI::ViewGroup *parent) override;
};
class ShaderListScreen : public UITabbedBaseDialogScreen {
public:
ShaderListScreen() : UITabbedBaseDialogScreen(Path()) {}
void CreateTabs() override;
const char *tag() const override { return "ShaderList"; }
private:
bool ForceHorizontalTabs() const override {return true; }
int ListShaders(DebugShaderType shaderType, UI::LinearLayout *view);
void AddPipelineAnalysis(UI::LinearLayout *view);
void OnShaderClick(UI::EventParams &e);
};
class ShaderViewScreen : public UIBaseDialogScreen {
public:
ShaderViewScreen(std::string id, DebugShaderType type)
: id_(id), type_(type) {}
void CreateViews() override;
bool key(const KeyInput &ki) override;
const char *tag() const override { return "ShaderView"; }
private:
std::string id_;
DebugShaderType type_;
};
class FrameDumpTestScreen : public UITabbedBaseDialogScreen {
public:
FrameDumpTestScreen() : UITabbedBaseDialogScreen(Path()) {}
~FrameDumpTestScreen();
void CreateTabs() override;
void update() override;
const char *tag() const override { return "FrameDumpTest"; }
private:
bool ShowSearchControls() const override { return false; }
std::vector<std::string> files_;
std::shared_ptr<http::Request> listing_;
std::shared_ptr<http::Request> dumpDownload_;
};
class TouchTestScreen : public UIBaseDialogScreen {
public:
// Shows touches where they are on the screen.
bool LimitContentArea() const override { return false; }
TouchTestScreen(const Path &gamePath) : UIBaseDialogScreen(gamePath) {
for (int i = 0; i < MAX_TOUCH_POINTS; i++) {
touches_[i].id = -1;
}
}
bool touch(const TouchInput &touch) override;
void DrawForeground(UIContext &dc) override;
bool key(const KeyInput &key) override;
void axis(const AxisInput &axis) override;
const char *tag() const override { return "TouchTest"; }
protected:
ViewLayoutMode LayoutMode() const override {
return ViewLayoutMode::ApplyInsets;
}
struct TrackedTouch {
int id;
float x;
float y;
};
enum {
MAX_TOUCH_POINTS = 10,
};
TrackedTouch touches_[MAX_TOUCH_POINTS]{};
std::vector<std::string> keyEventLog_;
UI::TextView *lastKeyEvents_ = nullptr;
double lastFrameTime_ = 0.0;
void CreateViews() override;
void UpdateLogView();
void OnImmersiveModeChange(UI::EventParams &e);
void OnRenderingBackend(UI::EventParams &e);
void OnRecreateActivity(UI::EventParams &e);
};
void DrawProfile(UIContext &ui);
void AddOverlayList(UI::ViewGroup *items, ScreenManager *screenManager);