Merge pull request #20986 from hrydgard/guess-what-more-ui

More UI improvements for portrait
This commit is contained in:
Henrik Rydgård authored and GitHub committed 2025-11-10 17:38:17 +01:00
commit fd300aeb23
81 files changed
+674 -622

No files matched your search

+1 -1
View File
@@ -70,7 +70,7 @@ void TextDrawerAndroid::SetOrCreateFont(const FontStyle &style) {
AndroidFontEntry entry{};
entry.font = allocatedFonts_[filename];
entry.size = 1.4f * style.sizePts / dpiScale_; // Not sure why this formula works.
entry.size = 1.25f * style.sizePts / dpiScale_; // Not sure why this formula works.
// Just chose a factor that looks good, don't know what unit size is in anyway.
fontMap_[style] = entry;
+185 -3
View File
@@ -10,17 +10,199 @@
#include "Common/Data/Text/I18n.h"
#include "Common/System/System.h"
#include "Common/System/Request.h"
#include "Common/System/Display.h"
#include "Common/Math/curves.h"
#include "Common/Render/DrawBuffer.h"
namespace UI {
PopupScreen::PopupScreen(std::string_view title, std::string_view button1, std::string_view button2)
: title_(title), button1_(button1), button2_(button2) {
auto di = GetI18NCategory(I18NCat::DIALOG);
// Auto-assign images. A bit hack to have this here.
if (button1 == di->T("Delete") || button1 == di->T("Move to trash")) {
button1Image_ = ImageID("I_TRASHCAN");
}
alpha_ = 0.0f; // inherited
}
void PopupScreen::touch(const TouchInput &touch) {
if (!box_ || (touch.flags & TOUCH_DOWN) == 0) {
// Handle down-presses here.
UIDialogScreen::touch(touch);
return;
}
// Extra bounds to avoid closing the dialog while trying to aim for something
// near the edge. Now that we only close on actual down-events, we can shrink
// this border a bit.
if (!box_->GetBounds().Expand(30.0f, 30.0f).Contains(touch.x, touch.y)) {
TriggerFinish(DR_CANCEL);
}
UIDialogScreen::touch(touch);
}
bool PopupScreen::key(const KeyInput &key) {
if (key.flags & KEY_DOWN) {
if ((key.keyCode == NKCODE_ENTER || key.keyCode == NKCODE_NUMPAD_ENTER) && defaultButton_) {
UI::EventParams e{};
defaultButton_->OnClick.Trigger(e);
return true;
}
}
return UIDialogScreen::key(key);
}
void PopupScreen::update() {
UIDialogScreen::update();
if (defaultButton_)
defaultButton_->SetEnabled(CanComplete(DR_OK));
float animatePos = 1.0f;
++frames_;
if (finishFrame_ >= 0) {
float leadOut = bezierEaseInOut((frames_ - finishFrame_) * (1.0f / (float)FRAMES_LEAD_OUT));
animatePos = 1.0f - leadOut;
if (frames_ >= finishFrame_ + FRAMES_LEAD_OUT) {
// Actual finish happens here.
screenManager()->finishDialog(this, finishResult_);
}
} else if (frames_ < FRAMES_LEAD_IN) {
float leadIn = bezierEaseInOut(frames_ * (1.0f / (float)FRAMES_LEAD_IN));
animatePos = leadIn;
}
if (animatePos < 1.0f) {
alpha_ = animatePos;
scale_.x = 0.9f + animatePos * 0.1f;
scale_.y = 0.9f + animatePos * 0.1f;
if (hasPopupOrigin_) {
float xoff = popupOrigin_.x - g_display.dp_xres / 2;
float yoff = popupOrigin_.y - g_display.dp_yres / 2;
// Pull toward the origin a bit.
translation_.x = xoff * (1.0f - animatePos) * 0.2f;
translation_.y = yoff * (1.0f - animatePos) * 0.2f;
} else {
translation_.y = -g_display.dp_yres * (1.0f - animatePos) * 0.2f;
}
} else {
alpha_ = 1.0f;
scale_.x = 1.0f;
scale_.y = 1.0f;
translation_.x = 0.0f;
translation_.y = 0.0f;
}
}
void PopupScreen::SetPopupOrigin(const UI::View *view) {
hasPopupOrigin_ = true;
popupOrigin_ = view->GetBounds().Center();
}
void PopupScreen::TriggerFinish(DialogResult result) {
if (CanComplete(result)) {
ignoreInput_ = true;
finishFrame_ = frames_;
finishResult_ = result;
OnCompleted(result);
}
// Inform UI that popup close to hide OSK (if visible)
System_NotifyUIEvent(UIEventNotification::POPUP_CLOSED);
}
void PopupScreen::CreateViews() {
using namespace UI;
UIContext &dc = *screenManager()->getUIContext();
AnchorLayout *anchor = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT));
anchor->Overflow(false);
root_ = anchor;
const float ySize = FillVertical() ? dc.GetLayoutBounds().h - 30 : WRAP_CONTENT;
int y = dc.GetBounds().centerY() + offsetY_;
Centering vCentering = Centering::Vertical;
if (alignTop_) {
y = 0;
vCentering = Centering::None;
}
const float popupWidth = PopupWidth();
AnchorLayoutParams *anchorParams;
// NOTE: We purely use the popup width here to decide the type of layout, instead of the device orientation.
if (dc.GetLayoutBounds().w < popupWidth + 50) {
anchorParams = new AnchorLayoutParams(popupWidth, ySize,
10, y, 10, NONE, vCentering);
} else {
anchorParams = new AnchorLayoutParams(popupWidth, ySize,
dc.GetBounds().centerX(), y, NONE, NONE, vCentering | Centering::Horizontal);
}
box_ = new LinearLayout(ORIENT_VERTICAL, anchorParams);
root_->Add(box_);
box_->SetBG(dc.GetTheme().popupStyle.background);
box_->SetHasDropShadow(hasDropShadow_);
// Since we scale a bit, make the dropshadow bleed past the edges.
box_->SetDropShadowExpand(std::max(g_display.dp_xres, g_display.dp_yres));
box_->SetSpacing(0.0f);
if (!title_.empty()) {
View *title = new PopupHeader(title_);
box_->Add(title);
}
CreatePopupContents(box_);
root_->Recurse([](View *view) {
view->SetPopupStyle(true);
});
root_->SetDefaultFocusView(box_);
if (ShowButtons() && !button1_.empty()) {
// And the two buttons at the bottom.
LinearLayout *buttonRow = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(200, WRAP_CONTENT));
buttonRow->SetSpacing(0);
Margins buttonMargins(5, 5);
// Adjust button order to the platform default.
if (System_GetPropertyBool(SYSPROP_OK_BUTTON_LEFT)) {
defaultButton_ = buttonRow->Add(new Choice(button1_, button1Image_, new LinearLayoutParams(1.0f, buttonMargins)));
defaultButton_->OnClick.Handle<UIScreen>(this, &UIScreen::OnOK);
if (!button2_.empty()) {
buttonRow->Add(new Choice(button2_, new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnCancel);
}
} else {
if (!button2_.empty()) {
buttonRow->Add(new Choice(button2_, new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnCancel);
}
defaultButton_ = buttonRow->Add(new Choice(button1_, button1Image_, new LinearLayoutParams(1.0f, buttonMargins)));
defaultButton_->OnClick.Handle<UIScreen>(this, &UIScreen::OnOK);
}
box_->Add(buttonRow);
}
}
void MessagePopupScreen::CreatePopupContents(UI::ViewGroup *parent) {
using namespace UI;
UIContext &dc = *screenManager()->getUIContext();
std::vector<std::string_view> messageLines;
SplitString(message_, '\n', messageLines);
for (auto lineOfText : messageLines)
parent->Add(new UI::TextView(lineOfText, ALIGN_LEFT | ALIGN_VCENTER, false));
for (auto lineOfText : messageLines) {
parent->Add(new UI::TextView(lineOfText, ALIGN_LEFT | ALIGN_VCENTER | FLAG_WRAP_TEXT, false, new LinearLayoutParams(Margins(8))));
}
}
void MessagePopupScreen::OnCompleted(DialogResult result) {
@@ -80,7 +262,7 @@ void PopupContextMenuScreen::CreatePopupContents(UI::ViewGroup *parent) {
// Hacky: Override the position to look like a popup menu.
AnchorLayoutParams *ap = (AnchorLayoutParams *)parent->GetLayoutParams();
ap->center = false;
ap->centering = Centering::None;
ap->left = sourceView_->GetBounds().x;
ap->top = sourceView_->GetBounds().y2();
}
+60 -8
View File
@@ -16,6 +16,62 @@ namespace UI {
static const float NO_DEFAULT_FLOAT = -1000000.0f;
static const int NO_DEFAULT_INT = -1000000;
class PopupScreen : public UIDialogScreen {
public:
PopupScreen(std::string_view title, std::string_view button1 = "", std::string_view button2 = "");
virtual void CreatePopupContents(UI::ViewGroup *parent) = 0;
void CreateViews() override;
bool isTransparent() const override { return true; }
void touch(const TouchInput &touch) override;
bool key(const KeyInput &key) override;
void TriggerFinish(DialogResult result) override;
void SetPopupOrigin(const UI::View *view);
void SetPopupOffset(float y) { offsetY_ = y; }
void SetAlignTop(bool alignTop) { alignTop_ = alignTop; }
void SetHasDropShadow(bool has) { hasDropShadow_ = has; }
// For the postproc param sliders on DisplayLayoutScreen
bool wantBrightBackground() const override { return !hasDropShadow_; }
protected:
virtual bool FillVertical() const { return false; }
virtual UI::Size PopupWidth() const { return 550; }
virtual bool ShowButtons() const { return true; }
virtual bool CanComplete(DialogResult result) { return true; }
virtual void OnCompleted(DialogResult result) {}
std::string_view Title() { return title_; }
void update() override;
private:
UI::LinearLayout *box_ = nullptr;
UI::Choice *defaultButton_ = nullptr;
ImageID button1Image_;
std::string title_;
std::string button1_;
std::string button2_;
enum {
FRAMES_LEAD_IN = 6,
FRAMES_LEAD_OUT = 4,
};
int frames_ = 0;
int finishFrame_ = -1;
DialogResult finishResult_ = DR_CANCEL;
bool hasPopupOrigin_ = false;
Point2D popupOrigin_;
float offsetY_ = 0.0f;
bool alignTop_ = false;
bool hasDropShadow_ = true;
};
class ListPopupScreen : public PopupScreen {
public:
ListPopupScreen(std::string_view title) : PopupScreen(title) {}
@@ -60,7 +116,7 @@ private:
class MessagePopupScreen : public PopupScreen {
public:
MessagePopupScreen(std::string_view title, std::string message, std::string button1, std::string button2, std::function<void(bool)> callback)
MessagePopupScreen(std::string_view title, std::string_view message, std::string_view button1, std::string_view button2, std::function<void(bool)> callback)
: PopupScreen(title, button1, button2), message_(message), callback_(callback) {}
const char *tag() const override { return "MessagePopupScreen"; }
@@ -195,9 +251,6 @@ public:
UI::Event OnChoice;
protected:
bool HasTitleBar() const override { return false; }
private:
const ContextMenuItem *items_;
size_t itemCount_;
@@ -444,13 +497,12 @@ class ChoiceWithValueDisplay : public AbstractChoiceWithValueDisplay {
public:
ChoiceWithValueDisplay(int *value, std::string_view text, LayoutParams *layoutParams = 0)
: AbstractChoiceWithValueDisplay(text, layoutParams), iValue_(value) {}
ChoiceWithValueDisplay(int *value, ImageID imageId, LayoutParams *layoutParams = 0)
: AbstractChoiceWithValueDisplay("", imageId, layoutParams), iValue_(value) {}
ChoiceWithValueDisplay(std::string *value, std::string_view text, I18NCat category, LayoutParams *layoutParams = 0)
: AbstractChoiceWithValueDisplay(text, layoutParams), sValue_(value), category_(category) {}
ChoiceWithValueDisplay(std::string *value, std::string_view text, std::string(*translateCallback)(std::string_view value), LayoutParams *layoutParams = 0)
: AbstractChoiceWithValueDisplay(text, layoutParams), sValue_(value), translateCallback_(translateCallback) {
}
: AbstractChoiceWithValueDisplay(text, layoutParams), sValue_(value), translateCallback_(translateCallback) {}
private:
std::string ValueText() const override;
-168
View File
@@ -6,12 +6,10 @@
#include "Common/System/Request.h"
#include "Common/Input/InputState.h"
#include "Common/Input/KeyCodes.h"
#include "Common/Math/curves.h"
#include "Common/UI/UIScreen.h"
#include "Common/UI/Context.h"
#include "Common/UI/Screen.h"
#include "Common/UI/Root.h"
#include "Common/Data/Text/I18n.h"
#include "Common/Render/DrawBuffer.h"
static const bool ClickDebug = false;
@@ -300,169 +298,3 @@ void UIScreen::OnOK(UI::EventParams &e) {
void UIScreen::OnCancel(UI::EventParams &e) {
TriggerFinish(DR_CANCEL);
}
PopupScreen::PopupScreen(std::string_view title, std::string_view button1, std::string_view button2)
: title_(title) {
auto di = GetI18NCategory(I18NCat::DIALOG);
if (!button1.empty())
button1_ = di->T(button1);
if (!button2.empty())
button2_ = di->T(button2);
alpha_ = 0.0f; // inherited
}
void PopupScreen::touch(const TouchInput &touch) {
if (!box_ || (touch.flags & TOUCH_DOWN) == 0) {
// Handle down-presses here.
UIDialogScreen::touch(touch);
return;
}
// Extra bounds to avoid closing the dialog while trying to aim for something
// near the edge. Now that we only close on actual down-events, we can shrink
// this border a bit.
if (!box_->GetBounds().Expand(30.0f, 30.0f).Contains(touch.x, touch.y)) {
TriggerFinish(DR_CANCEL);
}
UIDialogScreen::touch(touch);
}
bool PopupScreen::key(const KeyInput &key) {
if (key.flags & KEY_DOWN) {
if ((key.keyCode == NKCODE_ENTER || key.keyCode == NKCODE_NUMPAD_ENTER) && defaultButton_) {
UI::EventParams e{};
defaultButton_->OnClick.Trigger(e);
return true;
}
}
return UIDialogScreen::key(key);
}
void PopupScreen::update() {
UIDialogScreen::update();
if (defaultButton_)
defaultButton_->SetEnabled(CanComplete(DR_OK));
float animatePos = 1.0f;
++frames_;
if (finishFrame_ >= 0) {
float leadOut = bezierEaseInOut((frames_ - finishFrame_) * (1.0f / (float)FRAMES_LEAD_OUT));
animatePos = 1.0f - leadOut;
if (frames_ >= finishFrame_ + FRAMES_LEAD_OUT) {
// Actual finish happens here.
screenManager()->finishDialog(this, finishResult_);
}
} else if (frames_ < FRAMES_LEAD_IN) {
float leadIn = bezierEaseInOut(frames_ * (1.0f / (float)FRAMES_LEAD_IN));
animatePos = leadIn;
}
if (animatePos < 1.0f) {
alpha_ = animatePos;
scale_.x = 0.9f + animatePos * 0.1f;
scale_.y = 0.9f + animatePos * 0.1f;
if (hasPopupOrigin_) {
float xoff = popupOrigin_.x - g_display.dp_xres / 2;
float yoff = popupOrigin_.y - g_display.dp_yres / 2;
// Pull toward the origin a bit.
translation_.x = xoff * (1.0f - animatePos) * 0.2f;
translation_.y = yoff * (1.0f - animatePos) * 0.2f;
} else {
translation_.y = -g_display.dp_yres * (1.0f - animatePos) * 0.2f;
}
} else {
alpha_ = 1.0f;
scale_.x = 1.0f;
scale_.y = 1.0f;
translation_.x = 0.0f;
translation_.y = 0.0f;
}
}
void PopupScreen::SetPopupOrigin(const UI::View *view) {
hasPopupOrigin_ = true;
popupOrigin_ = view->GetBounds().Center();
}
void PopupScreen::TriggerFinish(DialogResult result) {
if (CanComplete(result)) {
ignoreInput_ = true;
finishFrame_ = frames_;
finishResult_ = result;
OnCompleted(result);
}
// Inform UI that popup close to hide OSK (if visible)
System_NotifyUIEvent(UIEventNotification::POPUP_CLOSED);
}
void PopupScreen::CreateViews() {
using namespace UI;
UIContext &dc = *screenManager()->getUIContext();
AnchorLayout *anchor = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT));
anchor->Overflow(false);
root_ = anchor;
float yres = screenManager()->getUIContext()->GetBounds().h;
AnchorLayoutParams *anchorParams;
if (!alignTop_) {
// Standard centering etc.
anchorParams = new AnchorLayoutParams(PopupWidth(), FillVertical() ? yres - 30 : WRAP_CONTENT,
dc.GetBounds().centerX(), dc.GetBounds().centerY() + offsetY_, NONE, NONE, true);
} else {
// Top-aligned, for dialogs where we need to pop a keyboard below.
anchorParams = new AnchorLayoutParams(PopupWidth(), FillVertical() ? yres - 30 : WRAP_CONTENT,
NONE, 0, NONE, NONE, false);
}
box_ = new LinearLayout(ORIENT_VERTICAL, anchorParams);
root_->Add(box_);
box_->SetBG(dc.GetTheme().popupStyle.background);
box_->SetHasDropShadow(hasDropShadow_);
// Since we scale a bit, make the dropshadow bleed past the edges.
box_->SetDropShadowExpand(std::max(g_display.dp_xres, g_display.dp_yres));
box_->SetSpacing(0.0f);
if (HasTitleBar()) {
View *title = new PopupHeader(title_);
box_->Add(title);
}
CreatePopupContents(box_);
root_->Recurse([](View *view) {
view->SetPopupStyle(true);
});
root_->SetDefaultFocusView(box_);
if (ShowButtons() && !button1_.empty()) {
// And the two buttons at the bottom.
LinearLayout *buttonRow = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(200, WRAP_CONTENT));
buttonRow->SetSpacing(0);
Margins buttonMargins(5, 5);
// Adjust button order to the platform default.
if (System_GetPropertyBool(SYSPROP_OK_BUTTON_LEFT)) {
defaultButton_ = buttonRow->Add(new Button(button1_, new LinearLayoutParams(1.0f, buttonMargins)));
defaultButton_->OnClick.Handle<UIScreen>(this, &UIScreen::OnOK);
if (!button2_.empty())
buttonRow->Add(new Button(button2_, new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnCancel);
} else {
if (!button2_.empty())
buttonRow->Add(new Button(button2_, new LinearLayoutParams(1.0f)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnCancel);
defaultButton_ = buttonRow->Add(new Button(button1_, new LinearLayoutParams(1.0f)));
defaultButton_->OnClick.Handle<UIScreen>(this, &UIScreen::OnOK);
}
box_->Add(buttonRow);
}
}
-56
View File
@@ -97,59 +97,3 @@ public:
private:
bool finished_;
};
class PopupScreen : public UIDialogScreen {
public:
PopupScreen(std::string_view title, std::string_view button1 = "", std::string_view button2 = "");
virtual void CreatePopupContents(UI::ViewGroup *parent) = 0;
void CreateViews() override;
bool isTransparent() const override { return true; }
void touch(const TouchInput &touch) override;
bool key(const KeyInput &key) override;
void TriggerFinish(DialogResult result) override;
void SetPopupOrigin(const UI::View *view);
void SetPopupOffset(float y) { offsetY_ = y; }
void SetAlignTop(bool alignTop) { alignTop_ = alignTop; }
void SetHasDropShadow(bool has) { hasDropShadow_ = has; }
// For the postproc param sliders on DisplayLayoutScreen
bool wantBrightBackground() const override { return !hasDropShadow_; }
protected:
virtual bool FillVertical() const { return false; }
virtual UI::Size PopupWidth() const { return 550; }
virtual bool ShowButtons() const { return true; }
virtual bool CanComplete(DialogResult result) { return true; }
virtual void OnCompleted(DialogResult result) {}
virtual bool HasTitleBar() const { return true; }
const std::string &Title() { return title_; }
void update() override;
private:
UI::LinearLayout *box_ = nullptr;
UI::Button *defaultButton_ = nullptr;
std::string title_;
std::string button1_;
std::string button2_;
enum {
FRAMES_LEAD_IN = 6,
FRAMES_LEAD_OUT = 4,
};
int frames_ = 0;
int finishFrame_ = -1;
DialogResult finishResult_ = DR_CANCEL;
bool hasPopupOrigin_ = false;
Point2D popupOrigin_;
float offsetY_ = 0.0f;
bool alignTop_ = false;
bool hasDropShadow_ = true;
};
+8 -8
View File
@@ -468,15 +468,14 @@ void Choice::ClickInternal() {
void Choice::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const {
float totalW = 0.0f;
float totalH = 0.0f;
int paddingLeft = 12;
int paddingRight = 12;
if (!text_.empty() && !hideTitle_) {
int paddingLeft = 12;
int paddingRight = 12;
if (rightIconImage_.isValid()) {
paddingRight = ITEM_HEIGHT;
}
float availWidth = horiz.size - paddingLeft - paddingRight - textPadding_.horiz();
float availWidth = horiz.size - paddingLeft - paddingRight - textPadding_.horiz() - totalW;
if (availWidth < 0.0f) {
// Let it have as much space as it needs.
availWidth = MAX_ITEM_SIZE;
@@ -488,19 +487,20 @@ void Choice::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz,
float textW = 0.0f, textH = 0.0f;
dc.MeasureTextRect(dc.GetTheme().uiFont, scale, scale, text_, availBounds, &textW, &textH, FLAG_WRAP_TEXT);
totalH = std::max(totalH, textH);
totalW += textW;
if (image_.isValid()) {
paddingLeft = ITEM_HEIGHT;
totalW += 12;
totalW += totalH;
}
totalW = paddingLeft + textW + paddingRight + textPadding_.horiz();
} else {
if (image_.isValid()) {
dc.Draw()->GetAtlas()->measureImage(image_, &w, &h);
totalW = w * imgScale_ + paddingLeft + paddingRight;
totalW = w * imgScale_ + 6;
totalH = h * imgScale_;
}
}
w = totalW;
w = totalW + (text_.empty() ? 16 : 24);
h = totalH + 16;
h = std::max(h, ITEM_HEIGHT);
}
+3
View File
@@ -819,6 +819,9 @@ public:
AbstractChoiceWithValueDisplay(std::string_view text, LayoutParams *layoutParams = nullptr)
: Choice(text, layoutParams) {
}
AbstractChoiceWithValueDisplay(std::string_view text, ImageID image, LayoutParams *layoutParams = nullptr)
: Choice(text, image, layoutParams) {
}
void Draw(UIContext &dc) override;
void GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz, MeasureSpec vert, float &w, float &h) const override;
+9 -7
View File
@@ -805,10 +805,12 @@ void AnchorLayout::MeasureViews(const UIContext &dc, MeasureSpec horiz, MeasureS
width = params->width;
height = params->height;
if (!params->center) {
if (!(params->centering & Centering::Horizontal)) {
if (params->left > NONE && params->right > NONE) {
width = measuredWidth_ - params->left - params->right;
}
}
if (!(params->centering & Centering::Vertical)) {
if (params->top > NONE && params->bottom > NONE) {
height = measuredHeight_ - params->top - params->bottom;
}
@@ -839,22 +841,22 @@ static void ApplyAnchorLayoutParams(float measuredWidth, float measuredHeight, c
if (vBounds->h > container.h) vBounds->h = container.h;
float left = 0, top = 0, right = 0, bottom = 0;
bool center = false;
Centering centering = Centering::None;
if (params) {
left = params->left;
top = params->top;
right = params->right;
bottom = params->bottom;
center = params->center;
centering = params->centering;
}
if (left > NONE) {
vBounds->x = container.x + left;
if (center)
if (centering & Centering::Horizontal)
vBounds->x -= vBounds->w * 0.5f;
} else if (right > NONE) {
vBounds->x = container.x2() - right - vBounds->w;
if (center) {
if (centering & Centering::Horizontal) {
vBounds->x += vBounds->w * 0.5f;
}
} else {
@@ -864,11 +866,11 @@ static void ApplyAnchorLayoutParams(float measuredWidth, float measuredHeight, c
if (top > NONE) {
vBounds->y = container.y + top;
if (center)
if (centering & Centering::Vertical)
vBounds->y -= vBounds->h * 0.5f;
} else if (bottom > NONE) {
vBounds->y = container.y2() - bottom - vBounds->h;
if (center)
if (centering & Centering::Vertical)
vBounds->y += vBounds->h * 0.5f;
} else {
// Both top and bottom are NONE. Center.
+15 -7
View File
@@ -109,22 +109,30 @@ public:
const float NONE = -FLT_MAX;
enum class Centering {
None = 0,
Vertical = 1,
Horizontal = 2,
Both = 3, // 1 | 2
};
ENUM_CLASS_BITOPS(Centering);
class AnchorLayoutParams : public LayoutParams {
public:
AnchorLayoutParams(Size w, Size h, float l, float t, float r, float b, bool c = false)
: LayoutParams(w, h, LP_ANCHOR), left(l), top(t), right(r), bottom(b), center(c) {}
AnchorLayoutParams(Size w, Size h, float l, float t, float r, float b, Centering c = Centering::None)
: LayoutParams(w, h, LP_ANCHOR), left(l), top(t), right(r), bottom(b), centering(c) {}
// There's a small hack here to make this behave more intuitively - AnchorLayout ordinarily ignores FILL_PARENT.
AnchorLayoutParams(Size w, Size h, bool c = false)
: LayoutParams(w, h, LP_ANCHOR), left(0), top(0), right(w == FILL_PARENT ? 0 : NONE), bottom(h == FILL_PARENT ? 0 : NONE), center(c) {
AnchorLayoutParams(Size w, Size h, Centering c = Centering::None)
: LayoutParams(w, h, LP_ANCHOR), left(0), top(0), right(w == FILL_PARENT ? 0 : NONE), bottom(h == FILL_PARENT ? 0 : NONE), centering(c) {
}
AnchorLayoutParams(float l, float t, float r, float b, bool c = false)
: LayoutParams(WRAP_CONTENT, WRAP_CONTENT, LP_ANCHOR), left(l), top(t), right(r), bottom(b), center(c) {}
AnchorLayoutParams(float l, float t, float r, float b, Centering c = Centering::None)
: LayoutParams(WRAP_CONTENT, WRAP_CONTENT, LP_ANCHOR), left(l), top(t), right(r), bottom(b), centering(c) {}
// These are not bounds, but distances from the container edges.
// Set to NONE to not attach this edge to the container.
// If two opposite edges are NONE, centering will happen.
float left, top, right, bottom;
bool center; // If set, only two "sides" can be set, and they refer to the center, not the edge, of the view being layouted.
Centering centering; // If set, only two "sides" can be set, and they refer to the center, not the edge, of the view being layouted.
static LayoutParamsType StaticType() {
return LP_ANCHOR;
+85 -105
View File
@@ -108,9 +108,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
[[package]]
name = "cc"
version = "1.2.43"
version = "1.2.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2"
checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe"
dependencies = [
"find-msvc-tools",
"shlex",
@@ -124,9 +124,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "clap"
version = "4.5.50"
version = "4.5.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623"
checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5"
dependencies = [
"clap_builder",
"clap_derive",
@@ -134,9 +134,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.50"
version = "4.5.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0"
checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a"
dependencies = [
"anstream",
"anstyle",
@@ -153,7 +153,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
"syn 2.0.108",
"syn 2.0.110",
]
[[package]]
@@ -228,7 +228,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.108",
"syn 2.0.110",
]
[[package]]
@@ -556,9 +556,9 @@ dependencies = [
[[package]]
name = "icu_collections"
version = "2.0.0"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
dependencies = [
"displaydoc",
"potential_utf",
@@ -569,9 +569,9 @@ dependencies = [
[[package]]
name = "icu_locale_core"
version = "2.0.0"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
dependencies = [
"displaydoc",
"litemap",
@@ -582,11 +582,10 @@ dependencies = [
[[package]]
name = "icu_normalizer"
version = "2.0.0"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
dependencies = [
"displaydoc",
"icu_collections",
"icu_normalizer_data",
"icu_properties",
@@ -597,42 +596,38 @@ dependencies = [
[[package]]
name = "icu_normalizer_data"
version = "2.0.0"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
[[package]]
name = "icu_properties"
version = "2.0.1"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99"
dependencies = [
"displaydoc",
"icu_collections",
"icu_locale_core",
"icu_properties_data",
"icu_provider",
"potential_utf",
"zerotrie",
"zerovec",
]
[[package]]
name = "icu_properties_data"
version = "2.0.1"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899"
[[package]]
name = "icu_provider"
version = "2.0.0"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
dependencies = [
"displaydoc",
"icu_locale_core",
"stable_deref_trait",
"tinystr",
"writeable",
"yoke",
"zerofrom",
@@ -679,9 +674,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
[[package]]
name = "iri-string"
version = "0.7.8"
version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397"
dependencies = [
"memchr",
"serde",
@@ -701,9 +696,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "js-sys"
version = "0.3.81"
version = "0.3.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305"
checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -735,9 +730,9 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
[[package]]
name = "litemap"
version = "0.8.0"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
[[package]]
name = "log"
@@ -874,9 +869,9 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "openssl"
version = "0.10.74"
version = "0.10.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654"
checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328"
dependencies = [
"bitflags 2.10.0",
"cfg-if",
@@ -895,7 +890,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.108",
"syn 2.0.110",
]
[[package]]
@@ -906,9 +901,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
[[package]]
name = "openssl-sys"
version = "0.9.110"
version = "0.9.111"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2"
checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321"
dependencies = [
"cc",
"libc",
@@ -962,9 +957,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]]
name = "potential_utf"
version = "0.1.3"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a"
checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
dependencies = [
"zerovec",
]
@@ -980,9 +975,9 @@ dependencies = [
[[package]]
name = "quote"
version = "1.0.41"
version = "1.0.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1"
checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
dependencies = [
"proc-macro2",
]
@@ -1064,9 +1059,9 @@ dependencies = [
[[package]]
name = "rustls"
version = "0.23.34"
version = "0.23.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7"
checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f"
dependencies = [
"once_cell",
"rustls-pki-types",
@@ -1077,18 +1072,18 @@ dependencies = [
[[package]]
name = "rustls-pki-types"
version = "1.12.0"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a"
dependencies = [
"zeroize",
]
[[package]]
name = "rustls-webpki"
version = "0.103.7"
version = "0.103.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf"
checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52"
dependencies = [
"ring",
"rustls-pki-types",
@@ -1166,7 +1161,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.108",
"syn 2.0.110",
]
[[package]]
@@ -1259,9 +1254,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.108"
version = "2.0.110"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917"
checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea"
dependencies = [
"proc-macro2",
"quote",
@@ -1285,7 +1280,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.108",
"syn 2.0.110",
]
[[package]]
@@ -1339,14 +1334,14 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.108",
"syn 2.0.110",
]
[[package]]
name = "tinystr"
version = "0.8.1"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
dependencies = [
"displaydoc",
"zerovec",
@@ -1388,9 +1383,9 @@ dependencies = [
[[package]]
name = "tokio-util"
version = "0.7.16"
version = "0.7.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594"
dependencies = [
"bytes",
"futures-core",
@@ -1483,9 +1478,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
name = "unicode-ident"
version = "1.0.20"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06"
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "untrusted"
@@ -1549,9 +1544,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen"
version = "0.2.104"
version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d"
checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60"
dependencies = [
"cfg-if",
"once_cell",
@@ -1560,25 +1555,11 @@ dependencies = [
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-backend"
version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19"
dependencies = [
"bumpalo",
"log",
"proc-macro2",
"quote",
"syn 2.0.108",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
version = "0.4.54"
version = "0.4.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c"
checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0"
dependencies = [
"cfg-if",
"js-sys",
@@ -1589,9 +1570,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.104"
version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119"
checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -1599,22 +1580,22 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.104"
version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7"
checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
"syn 2.0.108",
"wasm-bindgen-backend",
"syn 2.0.110",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.104"
version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1"
checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76"
dependencies = [
"unicode-ident",
]
@@ -1680,9 +1661,9 @@ dependencies = [
[[package]]
name = "web-sys"
version = "0.3.81"
version = "0.3.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120"
checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -1942,9 +1923,9 @@ dependencies = [
[[package]]
name = "writeable"
version = "0.6.1"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
[[package]]
name = "x11-clipboard"
@@ -1979,17 +1960,16 @@ dependencies = [
[[package]]
name = "xml-rs"
version = "0.8.27"
version = "0.8.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7"
checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f"
[[package]]
name = "yoke"
version = "0.8.0"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
dependencies = [
"serde",
"stable_deref_trait",
"yoke-derive",
"zerofrom",
@@ -1997,13 +1977,13 @@ dependencies = [
[[package]]
name = "yoke-derive"
version = "0.8.0"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.108",
"syn 2.0.110",
"synstructure",
]
@@ -2024,7 +2004,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.108",
"syn 2.0.110",
"synstructure",
]
@@ -2036,9 +2016,9 @@ checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
[[package]]
name = "zerotrie"
version = "0.2.2"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
dependencies = [
"displaydoc",
"yoke",
@@ -2047,9 +2027,9 @@ dependencies = [
[[package]]
name = "zerovec"
version = "0.11.4"
version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
dependencies = [
"yoke",
"zerofrom",
@@ -2058,11 +2038,11 @@ dependencies = [
[[package]]
name = "zerovec-derive"
version = "0.11.1"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.108",
"syn 2.0.110",
]
+24
View File
@@ -90,6 +90,10 @@ enum Command {
language: String,
section: Option<String>,
},
RemoveLinebreaks {
section: String,
key: String,
},
}
fn copy_missing_lines(
@@ -216,6 +220,14 @@ fn remove_key(target_ini: &mut IniFile, section: &str, key: &str) -> io::Result<
Ok(())
}
fn remove_linebreaks(target_ini: &mut IniFile, section: &str, key: &str) -> io::Result<()> {
if let Some(old_section) = target_ini.get_section_mut(section) {
old_section.remove_linebreaks(key);
} else {
println!("No section {section}");
}
Ok(())
}
fn add_new_key(target_ini: &mut IniFile, section: &str, key: &str, value: &str) -> io::Result<()> {
if let Some(section) = target_ini.get_section_mut(section) {
section.insert_line_if_missing(&format!("{key} = {value}"));
@@ -796,6 +808,12 @@ fn execute_command(cmd: Command, ai: Option<&ChatGPT>, dry_run: bool, verbose: b
} => {
remove_key(&mut target_ini, section, key).unwrap();
}
Command::RemoveLinebreaks {
ref section,
ref key,
} => {
remove_linebreaks(&mut target_ini, section, key).unwrap();
}
Command::ImportSingle {
filename: _,
ref section,
@@ -906,6 +924,12 @@ fn execute_command(cmd: Command, ai: Option<&ChatGPT>, dry_run: bool, verbose: b
} => {
remove_key(&mut reference_ini, section, key).unwrap();
}
Command::RemoveLinebreaks {
ref section,
ref key,
} => {
remove_linebreaks(&mut reference_ini, section, key).unwrap();
}
_ => {}
}
+15
View File
@@ -49,6 +49,21 @@ impl Section {
}
}
pub fn remove_linebreaks(&mut self, key: &str) {
for line in self.lines.iter_mut() {
let prefix = if let Some(pos) = line.find(" =") {
&line[0..pos]
} else {
continue;
};
if !prefix.trim().eq(key) {
continue;
}
// Escaped linebreaks.
*line = line.replace("\\n", " ");
}
}
pub fn get_line(&self, key: &str) -> Option<String> {
for line in self.lines.iter() {
let prefix = if let Some(pos) = line.find(" =") {
+6 -6
View File
@@ -59,22 +59,22 @@ void ChatMenu::CreateSubviews(const Bounds &screenBounds) {
switch (g_Config.iChatScreenPosition) {
// the chat screen size is still static 280x240 need a dynamic size based on device resolution
case 0:
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, 280, NONE, NONE, 240, true));
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, 280, NONE, NONE, 240, Centering::Both));
break;
case 1:
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, screenBounds.centerX(), NONE, NONE, 240, true));
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, screenBounds.centerX(), NONE, NONE, 240, Centering::Both));
break;
case 2:
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, NONE, NONE, 280, 240, true));
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, NONE, NONE, 280, 240, Centering::Both));
break;
case 3:
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, 280, 240, NONE, NONE, true));
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, 280, 240, NONE, NONE, Centering::Both));
break;
case 4:
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, screenBounds.centerX(), 240, NONE, NONE, true));
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, screenBounds.centerX(), 240, NONE, NONE, Centering::Both));
break;
case 5:
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, NONE, 240, 280, NONE, true));
box_ = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(width, WRAP_CONTENT, NONE, 240, 280, NONE, Centering::Both));
break;
default:
box_ = nullptr;
+1 -1
View File
@@ -900,7 +900,7 @@ void VisualMappingScreen::CreateViews() {
bounds.w -= leftColumnWidth + 10.0f;
AnchorLayout *rightColumn = new AnchorLayout(new LinearLayoutParams(bounds.w, FILL_PARENT, 1.0f));
psp_ = rightColumn->Add(new MockPSP(new AnchorLayoutParams(bounds.centerX(), bounds.centerY(), NONE, NONE, true)));
psp_ = rightColumn->Add(new MockPSP(new AnchorLayoutParams(bounds.centerX(), bounds.centerY(), NONE, NONE, Centering::Both)));
psp_->ButtonClick.Handle(this, &VisualMappingScreen::OnMapButton);
root_->Add(leftColumn);
+3 -2
View File
@@ -26,6 +26,7 @@
#include "Common/UI/View.h"
#include "Common/UI/UIScreen.h"
#include "Common/UI/PopupScreens.h"
#include "Common/Data/Text/I18n.h"
#include "Core/ControlMapper.h"
@@ -64,7 +65,7 @@ private:
bool categoryToggles_[10]{};
};
class KeyMappingNewKeyDialog : public PopupScreen {
class KeyMappingNewKeyDialog : public UI::PopupScreen {
public:
explicit KeyMappingNewKeyDialog(int btn, bool replace, std::function<void(KeyMap::MultiInputMapping)> callback, I18NCat i18n)
: PopupScreen(T(i18n, "Map Key"), "Cancel", ""), pspBtn_(btn), callback_(callback) {}
@@ -97,7 +98,7 @@ private:
double delayUntil_ = 0.0f;
};
class KeyMappingNewMouseKeyDialog : public PopupScreen {
class KeyMappingNewMouseKeyDialog : public UI::PopupScreen {
public:
KeyMappingNewMouseKeyDialog(int btn, bool replace, std::function<void(KeyMap::MultiInputMapping)> callback, I18NCat i18n)
: PopupScreen(T(i18n, "Map Mouse"), "", ""), callback_(callback) {}
+4 -3
View File
@@ -22,6 +22,7 @@
#include "Common/UI/View.h"
#include "Common/UI/ViewGroup.h"
#include "Common/UI/ScrollView.h"
#include "Common/UI/PopupScreens.h"
#include "Common/Data/Text/I18n.h"
#include "Common/Data/Color/RGBAUtil.h"
@@ -32,7 +33,7 @@
#include "UI/CustomButtonMappingScreen.h"
class ButtonShapeScreen : public PopupScreen {
class ButtonShapeScreen : public UI::PopupScreen {
public:
ButtonShapeScreen(std::string_view title, int *setting) : PopupScreen(title), setting_(setting) {}
@@ -61,7 +62,7 @@ private:
int *setting_;
};
class ButtonIconScreen : public PopupScreen {
class ButtonIconScreen : public UI::PopupScreen {
public:
ButtonIconScreen(std::string_view title, int *setting) : PopupScreen(title), setting_(setting) {}
@@ -93,7 +94,7 @@ private:
class ButtonPreview : public UI::View {
public:
ButtonPreview(ImageID bgImg, ImageID img, float rotationIcon, bool flipShape, float rotationShape, int x, int y)
: View(new UI::AnchorLayoutParams(x, y, UI::NONE, UI::NONE, true)), bgImg_(bgImg), img_(img), rotI_(rotationIcon),
: View(new UI::AnchorLayoutParams(x, y, UI::NONE, UI::NONE, UI::Centering::Both)), bgImg_(bgImg), img_(img), rotI_(rotationIcon),
flipS_(flipShape), rotS_(rotationShape), x_(x), y_(y) {}
void Draw(UIContext &dc) override {
+2 -2
View File
@@ -29,7 +29,7 @@
#include "UI/PopupScreens.h"
#include "GPU/Common/ShaderCommon.h"
class DevMenuScreen : public PopupScreen {
class DevMenuScreen : public UI::PopupScreen {
public:
DevMenuScreen(const Path &gamePath, I18NCat cat) : PopupScreen(T(cat, "Dev Tools")), gamePath_(gamePath) {}
@@ -100,7 +100,7 @@ private:
void OnCompleted(DialogResult result) override;
};
class GPIGPOScreen : public PopupScreen {
class GPIGPOScreen : public UI::PopupScreen {
public:
GPIGPOScreen(std::string_view title) : PopupScreen(title, "OK") {}
const char *tag() const override { return "GPIGPO"; }
+3 -3
View File
@@ -218,7 +218,7 @@ void DisplayLayoutScreen::CreateViews() {
LinearLayout *leftColumn;
if (!portrait) {
ScrollView *leftScrollView = new ScrollView(ORIENT_VERTICAL, new AnchorLayoutParams(420.0f, FILL_PARENT, 0.f, 0.f, NONE, 0.f, false));
ScrollView *leftScrollView = new ScrollView(ORIENT_VERTICAL, new AnchorLayoutParams(420.0f, FILL_PARENT, 0.f, 0.f, NONE, 0.f));
leftColumn = new LinearLayout(ORIENT_VERTICAL);
leftColumn->padding.SetAll(8.0f);
leftScrollView->Add(leftColumn);
@@ -226,7 +226,7 @@ void DisplayLayoutScreen::CreateViews() {
root_->Add(leftScrollView);
}
ScrollView *rightScrollView = new ScrollView(ORIENT_VERTICAL, new AnchorLayoutParams(300.0f, FILL_PARENT, NONE, 0.f, 0.f, 0.f, false));
ScrollView *rightScrollView = new ScrollView(ORIENT_VERTICAL, new AnchorLayoutParams(300.0f, FILL_PARENT, NONE, 0.f, 0.f, 0.f));
LinearLayout *rightColumn = new LinearLayout(ORIENT_VERTICAL);
rightColumn->padding.SetAll(8.0f);
rightScrollView->Add(rightColumn);
@@ -239,7 +239,7 @@ void DisplayLayoutScreen::CreateViews() {
rightColumn->Add(bottomControls);
leftColumn = rightColumn;
} else {
bottomControls = new LinearLayout(ORIENT_HORIZONTAL, new AnchorLayoutParams(NONE, NONE, NONE, 10.0f, false));
bottomControls = new LinearLayout(ORIENT_HORIZONTAL, new AnchorLayoutParams(NONE, NONE, NONE, 10.0f));
root_->Add(bottomControls);
}
+15 -14
View File
@@ -1002,9 +1002,10 @@ void EmuScreen::ProcessVKey(VirtKey virtKey) {
std::string confirmExitMessage = GetConfirmExitMessage();
if (!confirmExitMessage.empty()) {
auto di = GetI18NCategory(I18NCat::DIALOG);
auto mm = GetI18NCategory(I18NCat::MAINMENU);
confirmExitMessage += '\n';
confirmExitMessage += di->T("Are you sure you want to exit?");
screenManager()->push(new PromptScreen(gamePath_, confirmExitMessage, di->T("Yes"), di->T("No"), [=](bool result) {
screenManager()->push(new UI::MessagePopupScreen(mm->T("Exit"), confirmExitMessage, di->T("Yes"), di->T("No"), [=](bool result) {
if (result) {
System_ExitApp();
}
@@ -1226,15 +1227,15 @@ protected:
static UI::AnchorLayoutParams *AnchorInCorner(const Bounds &bounds, int corner, float xOffset, float yOffset) {
using namespace UI;
switch ((ScreenEdgePosition)g_Config.iChatButtonPosition) {
case ScreenEdgePosition::BOTTOM_LEFT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, xOffset, NONE, NONE, yOffset, true);
case ScreenEdgePosition::BOTTOM_CENTER: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, bounds.centerX(), NONE, NONE, yOffset, true);
case ScreenEdgePosition::BOTTOM_RIGHT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, NONE, NONE, xOffset, yOffset, true);
case ScreenEdgePosition::TOP_LEFT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, xOffset, yOffset, NONE, NONE, true);
case ScreenEdgePosition::TOP_CENTER: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, bounds.centerX(), yOffset, NONE, NONE, true);
case ScreenEdgePosition::TOP_RIGHT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, NONE, yOffset, xOffset, NONE, true);
case ScreenEdgePosition::CENTER_LEFT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, xOffset, bounds.centerY(), NONE, NONE, true);
case ScreenEdgePosition::CENTER_RIGHT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, NONE, bounds.centerY(), xOffset, NONE, true);
default: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, xOffset, NONE, NONE, yOffset, true);
case ScreenEdgePosition::BOTTOM_LEFT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, xOffset, NONE, NONE, yOffset, Centering::Both);
case ScreenEdgePosition::BOTTOM_CENTER: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, bounds.centerX(), NONE, NONE, yOffset, Centering::Both);
case ScreenEdgePosition::BOTTOM_RIGHT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, NONE, NONE, xOffset, yOffset, Centering::Both);
case ScreenEdgePosition::TOP_LEFT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, xOffset, yOffset, NONE, NONE, Centering::Both);
case ScreenEdgePosition::TOP_CENTER: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, bounds.centerX(), yOffset, NONE, NONE, Centering::Both);
case ScreenEdgePosition::TOP_RIGHT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, NONE, yOffset, xOffset, NONE, Centering::Both);
case ScreenEdgePosition::CENTER_LEFT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, xOffset, bounds.centerY(), NONE, NONE, Centering::Both);
case ScreenEdgePosition::CENTER_RIGHT: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, NONE, bounds.centerY(), xOffset, NONE, Centering::Both);
default: return new AnchorLayoutParams(WRAP_CONTENT, WRAP_CONTENT, xOffset, NONE, NONE, yOffset, Centering::Both);
}
}
@@ -1260,7 +1261,7 @@ void EmuScreen::CreateViews() {
root_->Add(new Button(dev->T("DevMenu")))->OnClick.Handle(this, &EmuScreen::OnDevTools);
}
LinearLayout *buttons = new LinearLayout(Orientation::ORIENT_HORIZONTAL, new AnchorLayoutParams(bounds.centerX(), NONE, NONE, 60, true));
LinearLayout *buttons = new LinearLayout(Orientation::ORIENT_HORIZONTAL, new AnchorLayoutParams(bounds.centerX(), NONE, NONE, 60, Centering::Both));
buttons->SetSpacing(20.0f);
root_->Add(buttons);
@@ -1288,7 +1289,7 @@ void EmuScreen::CreateViews() {
});
backButton_->SetVisibility(V_GONE);
cardboardDisableButton_ = root_->Add(new Button(sc->T("Cardboard VR OFF"), new AnchorLayoutParams(bounds.centerX(), NONE, NONE, 30, true)));
cardboardDisableButton_ = root_->Add(new Button(sc->T("Cardboard VR OFF"), new AnchorLayoutParams(bounds.centerX(), NONE, NONE, 30, Centering::Both)));
DeviceOrientation orientation = GetDeviceOrientation();
cardboardDisableButton_->OnClick.Add([deviceOrientation](UI::EventParams &) {
DisplayLayoutConfig &config = g_Config.GetDisplayLayoutConfig(deviceOrientation);
@@ -1311,7 +1312,7 @@ void EmuScreen::CreateViews() {
chatMenu_->SetVisibility(UI::V_GONE);
}
saveStatePreview_ = new AsyncImageFileView(Path(), IS_FIXED, new AnchorLayoutParams(bounds.centerX(), 100, NONE, NONE, true));
saveStatePreview_ = new AsyncImageFileView(Path(), IS_FIXED, new AnchorLayoutParams(bounds.centerX(), 100, NONE, NONE, Centering::Both));
saveStatePreview_->SetFixedSize(160, 90);
saveStatePreview_->SetColor(0x90FFFFFF);
saveStatePreview_->SetVisibility(V_GONE);
@@ -1327,7 +1328,7 @@ void EmuScreen::CreateViews() {
ImageID("I_TRIANGLE"),
};
Spinner *loadingSpinner = root_->Add(new Spinner(symbols, ARRAY_SIZE(symbols), new AnchorLayoutParams(NONE, NONE, 45, 45, true)));
Spinner *loadingSpinner = root_->Add(new Spinner(symbols, ARRAY_SIZE(symbols), new AnchorLayoutParams(NONE, NONE, 45, 45, Centering::Both)));
loadingSpinner_ = loadingSpinner;
loadingBG->SetTag("LoadingBG");
+1 -1
View File
@@ -301,7 +301,7 @@ void GPUDriverTestScreen::CreateViews() {
AnchorLayout *anchor = new AnchorLayout();
root_ = anchor;
tabHolder_ = new TabHolder(ORIENT_HORIZONTAL, 30.0f, TabHolderFlags::Default, nullptr, new AnchorLayoutParams(FILL_PARENT, FILL_PARENT, false));
tabHolder_ = new TabHolder(ORIENT_HORIZONTAL, 30.0f, TabHolderFlags::Default, nullptr, new AnchorLayoutParams(FILL_PARENT, FILL_PARENT, Centering::None));
anchor->Add(tabHolder_);
tabHolder_->AddTab("Discard", ImageID::invalid(), new LinearLayout(ORIENT_VERTICAL));
tabHolder_->AddTab("Shader", ImageID::invalid(), new LinearLayout(ORIENT_VERTICAL));
+16 -14
View File
@@ -23,7 +23,7 @@
#include "Common/UI/Context.h"
#include "Common/UI/View.h"
#include "Common/UI/ViewGroup.h"
#include "Common/UI/PopupScreens.h"
#include "Common/Data/Text/I18n.h"
#include "Common/Data/Text/Parsers.h"
#include "Common/Data/Encoding/Utf8.h"
@@ -394,17 +394,18 @@ void GameScreen::OnDeleteConfig(UI::EventParams &e) {
auto di = GetI18NCategory(I18NCat::DIALOG);
const bool trashAvailable = System_GetPropertyBool(SYSPROP_HAS_TRASH_BIN);
screenManager()->push(
new PromptScreen(gamePath_, di->T("DeleteConfirmGameConfig", "Do you really want to delete the settings for this game?"), trashAvailable ? di->T("Move to trash") : di->T("Delete"), di->T("Cancel"),
[this](bool result) {
if (result) {
std::shared_ptr<GameInfo> info = g_gameInfoCache->GetInfo(nullptr, gamePath_, GameInfoFlags::PARAM_SFO);
if (!info->Ready(GameInfoFlags::PARAM_SFO)) {
return;
}
g_Config.DeleteGameConfig(info->id);
info->hasConfig = false;
RecreateViews();
new UI::MessagePopupScreen(di->T("Delete"), di->T("DeleteConfirmGameConfig", "Do you really want to delete the settings for this game?"),
trashAvailable ? di->T("Move to trash") : di->T("Delete"), di->T("Cancel"), [this](bool result) {
if (!result) {
return;
}
std::shared_ptr<GameInfo> info = g_gameInfoCache->GetInfo(nullptr, gamePath_, GameInfoFlags::PARAM_SFO);
if (!info->Ready(GameInfoFlags::PARAM_SFO)) {
return;
}
g_Config.DeleteGameConfig(info->id);
info->hasConfig = false;
RecreateViews();
}));
}
@@ -483,7 +484,7 @@ void GameScreen::OnDeleteSaveData(UI::EventParams &e) {
auto di = GetI18NCategory(I18NCat::DIALOG);
Path gamePath = gamePath_;
screenManager()->push(
new PromptScreen(gamePath_, di->T("DeleteConfirmAll", "Do you really want to delete all\nyour save data for this game?"), trashAvailable ? di->T("Move to trash") : di->T("Delete"), di->T("Cancel"),
new UI::MessagePopupScreen(di->T("Delete"), di->T("DeleteConfirmAll", "Do you really want to delete all\nyour save data for this game?"), trashAvailable ? di->T("Move to trash") : di->T("Delete"), di->T("Cancel"),
[gamePath](bool yes) {
if (yes) {
std::shared_ptr<GameInfo> info = g_gameInfoCache->GetInfo(NULL, gamePath, GameInfoFlags::PARAM_SFO);
@@ -501,6 +502,7 @@ void GameScreen::OnDeleteGame(UI::EventParams &e) {
std::shared_ptr<GameInfo> info = g_gameInfoCache->GetInfo(NULL, gamePath_, GameInfoFlags::PARAM_SFO);
if (info->Ready(GameInfoFlags::PARAM_SFO)) {
auto di = GetI18NCategory(I18NCat::DIALOG);
auto ga = GetI18NCategory(I18NCat::GAME);
std::string prompt;
prompt = di->T("DeleteConfirmGame", "Do you really want to delete this game\nfrom your device? You can't undo this.");
prompt += "\n\n" + gamePath_.ToVisualString(g_Config.memStickDirectory.c_str());
@@ -508,7 +510,7 @@ void GameScreen::OnDeleteGame(UI::EventParams &e) {
Path gamePath = gamePath_;
ScreenManager *sm = screenManager();
screenManager()->push(
new PromptScreen(gamePath_, prompt, trashAvailable ? di->T("Move to trash") : di->T("Delete"), di->T("Cancel"),
new UI::MessagePopupScreen(ga->T("Delete Game"), prompt, trashAvailable ? di->T("Move to trash") : di->T("Delete"), di->T("Cancel"),
[sm, gamePath](bool yes) {
if (yes) {
std::shared_ptr<GameInfo> info = g_gameInfoCache->GetInfo(NULL, gamePath, GameInfoFlags::PARAM_SFO);
@@ -526,7 +528,7 @@ void GameScreen::OnRemoveFromRecent(UI::EventParams &e) {
screenManager()->switchScreen(new MainScreen());
}
class SetBackgroundPopupScreen : public PopupScreen {
class SetBackgroundPopupScreen : public UI::PopupScreen {
public:
SetBackgroundPopupScreen(std::string_view title, const Path &gamePath)
: PopupScreen(title), gamePath_(gamePath) {
+24 -28
View File
@@ -1709,17 +1709,23 @@ void TriggerRestart(const char *why, bool editThenRestore, const Path &gamePath)
System_RestartApp(param);
}
void GameSettingsScreen::TriggerRestartOrDo(std::function<void()> callback) {
auto di = GetI18NCategory(I18NCat::DIALOG);
screenManager()->push(new UI::MessagePopupScreen(di->T("Restart"), di->T("Changing this setting requires PPSSPP to restart."), di->T("Restart"), di->T("Cancel"), [=](bool yes) {
if (yes) {
TriggerRestart("GameSettingsScreen::RenderingBackendYes", editThenRestore_, gamePath_);
} else {
callback();
}
}));
}
void GameSettingsScreen::OnRenderingBackend(UI::EventParams &e) {
// It only makes sense to show the restart prompt if the backend was actually changed.
if (g_Config.iGPUBackend != (int)GetGPUBackend()) {
auto di = GetI18NCategory(I18NCat::DIALOG);
screenManager()->push(new PromptScreen(gamePath_, di->T("Changing this setting requires PPSSPP to restart."), di->T("Restart"), di->T("Cancel"), [=](bool yes) {
if (yes) {
TriggerRestart("GameSettingsScreen::RenderingBackendYes", editThenRestore_, gamePath_);
} else {
g_Config.iGPUBackend = (int)GetGPUBackend();
}
}));
TriggerRestartOrDo([]() {
g_Config.iGPUBackend = (int)GetGPUBackend();
});
}
}
@@ -1728,32 +1734,22 @@ void GameSettingsScreen::OnRenderingDevice(UI::EventParams &e) {
std::string *deviceNameSetting = GPUDeviceNameSetting();
if (deviceNameSetting && *deviceNameSetting != GetGPUBackendDevice()) {
auto di = GetI18NCategory(I18NCat::DIALOG);
screenManager()->push(new PromptScreen(gamePath_, di->T("Changing this setting requires PPSSPP to restart."), di->T("Restart"), di->T("Cancel"), [=](bool yes) {
// If the user ends up deciding not to restart, set the config back to the current backend
// so it doesn't get switched by accident.
if (yes) {
TriggerRestart("GameSettingsScreen::RenderingDeviceYes", editThenRestore_, gamePath_);
} else {
std::string *deviceNameSetting = GPUDeviceNameSetting();
if (deviceNameSetting)
*deviceNameSetting = GetGPUBackendDevice();
// Needed to redraw the setting.
RecreateViews();
}
}));
TriggerRestartOrDo([this]() {
std::string *deviceNameSetting = GPUDeviceNameSetting();
if (deviceNameSetting)
*deviceNameSetting = GetGPUBackendDevice();
// Needed to redraw the setting.
RecreateViews();
});
}
}
void GameSettingsScreen::OnInflightFramesChoice(UI::EventParams &e) {
if (g_Config.iInflightFrames != prevInflightFrames_) {
auto di = GetI18NCategory(I18NCat::DIALOG);
screenManager()->push(new PromptScreen(gamePath_, di->T("Changing this setting requires PPSSPP to restart."), di->T("Restart"), di->T("Cancel"), [=](bool yes) {
if (yes) {
TriggerRestart("GameSettingsScreen::InflightFramesYes", editThenRestore_, gamePath_);
} else {
g_Config.iInflightFrames = prevInflightFrames_;
}
}));
TriggerRestartOrDo([this]() {
g_Config.iInflightFrames = prevInflightFrames_;
});
}
}
+5 -3
View File
@@ -106,6 +106,8 @@ private:
void OnAdhocGuides(UI::EventParams &e);
void TriggerRestartOrDo(std::function<void()> callback);
// Temporaries to convert setting types, cache enabled, etc.
int iAlternateSpeedPercent1_ = 0;
int iAlternateSpeedPercent2_ = 0;
@@ -122,10 +124,10 @@ private:
std::string pendingMemstickFolder_;
};
class HostnameSelectScreen : public PopupScreen {
class HostnameSelectScreen : public UI::PopupScreen {
public:
HostnameSelectScreen(std::string *value, std::vector<std::string> *listItems, std::string_view title)
: PopupScreen(title, "OK", "Cancel"), listItems_(listItems), value_(value) {
: UI::PopupScreen(title, "OK", "Cancel"), listItems_(listItems), value_(value) {
resolver_ = std::thread([](HostnameSelectScreen *thiz) {
thiz->ResolverThread();
}, this);
@@ -194,7 +196,7 @@ protected:
void CreateGestureTab(UI::LinearLayout *parent);
};
class RestoreSettingsScreen : public PopupScreen {
class RestoreSettingsScreen : public UI::PopupScreen {
public:
RestoreSettingsScreen(std::string_view title);
void CreatePopupContents(UI::ViewGroup *parent) override;
+2 -2
View File
@@ -888,7 +888,7 @@ UI::ViewGroup *CreatePadLayout(const TouchControlConfig &config, float xres, flo
float y;
};
auto buttonLayoutParams = [=](const ConfigTouchPos &touch, ButtonOffset off = { 0, 0 }) {
return new AnchorLayoutParams(touch.x * xres + off.x, touch.y * yres + off.y, NONE, NONE, true);
return new AnchorLayoutParams(touch.x * xres + off.x, touch.y * yres + off.y, NONE, NONE, Centering::Both);
};
// Space between the PSP buttons (traingle, circle, square and cross)
@@ -937,7 +937,7 @@ UI::ViewGroup *CreatePadLayout(const TouchControlConfig &config, float xres, flo
};
if (showPauseButton) {
root->Add(new BoolButton(pause, "Pause button", roundImage, ImageID("I_ROUND"), ImageID("I_ARROW"), 1.0f, new AnchorLayoutParams(halfW, 20, NONE, NONE, true)))->SetAngle(90);
root->Add(new BoolButton(pause, "Pause button", roundImage, ImageID("I_ROUND"), ImageID("I_ARROW"), 1.0f, new AnchorLayoutParams(halfW, 20, NONE, NONE, Centering::Both)))->SetAngle(90);
}
// touchActionButtonCenter.show will always be true, since that's the default.
+2 -2
View File
@@ -15,9 +15,9 @@ void IAPScreen::CreateViews() {
auto di = GetI18NCategory(I18NCat::DIALOG);
auto mm = GetI18NCategory(I18NCat::MAINMENU);
const bool vertical = GetDeviceOrientation() == DeviceOrientation::Portrait;
const bool portrait = GetDeviceOrientation() == DeviceOrientation::Portrait;
root_ = new LinearLayout(vertical ? ORIENT_VERTICAL : ORIENT_HORIZONTAL, new LayoutParams(FILL_PARENT, FILL_PARENT));
root_ = new LinearLayout(portrait ? ORIENT_VERTICAL : ORIENT_HORIZONTAL, new LayoutParams(FILL_PARENT, FILL_PARENT));
const bool bought = System_GetPropertyBool(SYSPROP_APP_GOLD);
+1
View File
@@ -5,6 +5,7 @@
#include "ppsspp_config.h"
#include "UI/BaseScreens.h"
#include "UI/SimpleDialogScreen.h"
class IAPScreen : public UIBaseDialogScreen {
public:
+2 -1
View File
@@ -1,5 +1,6 @@
#pragma once
#include "Common/UI/UIScreen.h"
#include "Common/UI/PopupScreens.h"
#include "UI/BaseScreens.h"
#include "UI/TabbedDialogScreen.h"
@@ -57,7 +58,7 @@ private:
UI::TextView *globalStats_ = nullptr;
};
class AddressPromptScreen : public PopupScreen {
class AddressPromptScreen : public UI::PopupScreen {
public:
AddressPromptScreen(std::string_view title) : PopupScreen(title, "OK", "Cancel") {}
+16 -13
View File
@@ -1135,11 +1135,11 @@ UI::ViewGroup *MainScreen::CreateLogoView(bool portrait, UI::LayoutParams *layou
using namespace UI;
AnchorLayout *logos = new AnchorLayout(layoutParams);
if (System_GetPropertyBool(SYSPROP_APP_GOLD)) {
logos->Add(new ImageView(ImageID("I_ICON_GOLD"), "", IS_DEFAULT, new AnchorLayoutParams(64, 64, 0, 0, NONE, NONE, false)));
logos->Add(new ImageView(ImageID("I_ICON_GOLD"), "", IS_DEFAULT, new AnchorLayoutParams(64, 64, 0, 0, NONE, NONE)));
} else {
logos->Add(new ImageView(ImageID("I_ICON"), "", IS_DEFAULT, new AnchorLayoutParams(64, 64, 0, 0, NONE, NONE, false)));
logos->Add(new ImageView(ImageID("I_ICON"), "", IS_DEFAULT, new AnchorLayoutParams(64, 64, 0, 0, NONE, NONE)));
}
logos->Add(new ImageView(ImageID("I_LOGO"), "PPSSPP", IS_DEFAULT, new AnchorLayoutParams(180, 64, 68, 2, NONE, NONE, false)));
logos->Add(new ImageView(ImageID("I_LOGO"), "PPSSPP", IS_DEFAULT, new AnchorLayoutParams(180, 64, 68, 2, NONE, NONE)));
std::string versionString = PPSSPP_GIT_VERSION;
// Strip the 'v' from the displayed version, and shorten the commit hash.
@@ -1170,24 +1170,24 @@ UI::ViewGroup *MainScreen::CreateLogoView(bool portrait, UI::LayoutParams *layou
return logos;
}
void MainScreen::CreateMainButtons(UI::ViewGroup *parent, bool vertical) {
void MainScreen::CreateMainButtons(UI::ViewGroup *parent, bool portrait) {
using namespace UI;
auto mm = GetI18NCategory(I18NCat::MAINMENU);
if (vertical) {
if (portrait) {
parent->Add(new Spacer(1.0f, new LinearLayoutParams(1.0f)));
}
if (System_GetPropertyBool(SYSPROP_HAS_FILE_BROWSER)) {
parent->Add(vertical ? new Choice(ImageID("I_FOLDER_OPEN"), vertical ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("Load", "Load...")))->OnClick.Handle(this, &MainScreen::OnLoadFile);
parent->Add(portrait ? new Choice(ImageID("I_FOLDER_OPEN"), portrait ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("Load", "Load...")))->OnClick.Handle(this, &MainScreen::OnLoadFile);
}
parent->Add(vertical ? new Choice(ImageID("I_GEAR"), vertical ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("Game Settings", "Settings")))->OnClick.Handle(this, &MainScreen::OnGameSettings);
parent->Add(vertical ? new Choice(ImageID("I_INFO"), vertical ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("About PPSSPP")))->OnClick.Handle(this, &MainScreen::OnCredits);
parent->Add(portrait ? new Choice(ImageID("I_GEAR"), portrait ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("Game Settings", "Settings")))->OnClick.Handle(this, &MainScreen::OnGameSettings);
parent->Add(portrait ? new Choice(ImageID("I_INFO"), portrait ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("About PPSSPP")))->OnClick.Handle(this, &MainScreen::OnCredits);
if (!vertical) {
if (!portrait) {
parent->Add(new Choice(mm->T("www.ppsspp.org")))->OnClick.Handle(this, &MainScreen::OnPPSSPPOrg);
}
if (!System_GetPropertyBool(SYSPROP_APP_GOLD) && (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) != DEVICE_TYPE_VR)) {
Choice *gold = parent->Add(vertical ? new Choice(ImageID("I_ICON_GOLD"), vertical ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("Buy PPSSPP Gold")));
Choice *gold = parent->Add(portrait ? new Choice(ImageID("I_ICON_GOLD"), portrait ? new LinearLayoutParams() : nullptr) : new Choice(mm->T("Buy PPSSPP Gold")));
gold->OnClick.Add([this](UI::EventParams &) {
LaunchBuyGold(this->screenManager());
});
@@ -1196,14 +1196,17 @@ void MainScreen::CreateMainButtons(UI::ViewGroup *parent, bool vertical) {
gold->SetShine(true);
}
if (!vertical) {
if (!portrait) {
parent->Add(new Spacer(25.0));
}
#if !PPSSPP_PLATFORM(IOS_APP_STORE) && !PPSSPP_PLATFORM(ANDROID)
// Officially, iOS apps should not have exit buttons. Remove it to maximize app store review chances.
// Additionally, the Exit button creates problems on Android.
parent->Add(new Choice(mm->T("Exit"), vertical ? new LinearLayoutParams() : nullptr))->OnClick.Handle(this, &MainScreen::OnExit);
// Also we remove it in the vertical layout on all platforms, just no space.
if (!portrait) {
parent->Add(new Choice(mm->T("Exit"), portrait ? new LinearLayoutParams() : nullptr))->OnClick.Handle(this, &MainScreen::OnExit);
}
#endif
}
@@ -1325,7 +1328,7 @@ void MainScreen::CreateViews() {
#if !defined(MOBILE_DEVICE)
auto gr = GetI18NCategory(I18NCat::GRAPHICS);
ImageID icon(g_Config.UseFullScreen() ? "I_RESTORE" : "I_FULLSCREEN");
fullscreenButton_ = logo->Add(new Button(gr->T("FullScreen", "Full Screen"), icon, new AnchorLayoutParams(48, 48, NONE, 0, 0, NONE, false)));
fullscreenButton_ = logo->Add(new Button(gr->T("FullScreen", "Full Screen"), icon, new AnchorLayoutParams(48, 48, NONE, 0, 0, NONE, Centering::None)));
fullscreenButton_->SetIgnoreText(true);
fullscreenButton_->OnClick.Handle(this, &MainScreen::OnFullScreenToggle);
#endif
+2 -1
View File
@@ -24,6 +24,7 @@
#include "Common/UI/UIScreen.h"
#include "Common/UI/ViewGroup.h"
#include "Common/UI/TabHolder.h"
#include "Common/UI/PopupScreens.h"
#include "UI/BaseScreens.h"
#include "Common/File/PathBrowser.h"
@@ -193,7 +194,7 @@ private:
void OnGameSettings(UI::EventParams &e);
};
class GridSettingsPopupScreen : public PopupScreen {
class GridSettingsPopupScreen : public UI::PopupScreen {
public:
GridSettingsPopupScreen(std::string_view label) : PopupScreen(label) {}
void CreatePopupContents(UI::ViewGroup *parent) override;
+2 -2
View File
@@ -83,9 +83,9 @@ void SettingInfoMessage::Show(std::string_view text, const UI::View *refView) {
const UI::AnchorLayoutParams *lp = GetLayoutParams()->As<UI::AnchorLayoutParams>();
if (lp) {
if (cutOffY_ != -1.0f && b.y >= cutOffY_) {
ReplaceLayoutParams(new UI::AnchorLayoutParams(lp->width, lp->height, lp->left, 80.0f, lp->right, lp->bottom, lp->center));
ReplaceLayoutParams(new UI::AnchorLayoutParams(lp->width, lp->height, lp->left, 80.0f, lp->right, lp->bottom, lp->centering));
} else {
ReplaceLayoutParams(new UI::AnchorLayoutParams(lp->width, lp->height, lp->left, g_display.dp_yres - 80.0f - 40.0f, lp->right, lp->bottom, lp->center));
ReplaceLayoutParams(new UI::AnchorLayoutParams(lp->width, lp->height, lp->left, g_display.dp_yres - 80.0f - 40.0f, lp->right, lp->bottom, lp->centering));
}
}
}
+23 -22
View File
@@ -23,6 +23,7 @@
#include "Common/UI/ViewGroup.h"
#include "Common/UI/Context.h"
#include "Common/UI/UIScreen.h"
#include "Common/UI/PopupScreens.h"
#include "Common/GPU/thin3d.h"
#include "Common/Data/Text/I18n.h"
@@ -32,6 +33,7 @@
#include "Common/System/Request.h"
#include "Common/VR/PPSSPPVR.h"
#include "Common/UI/AsyncImageFileView.h"
#include "Common/UI/PopupScreens.h"
#include "Core/KeyMap.h"
#include "Core/Reporting.h"
@@ -72,7 +74,7 @@ static void AfterSaveStateAction(SaveState::Status status, std::string_view mess
}
}
class ScreenshotViewScreen : public PopupScreen {
class ScreenshotViewScreen : public UI::PopupScreen {
public:
ScreenshotViewScreen(const Path &filename, std::string title, int slot, Path gamePath)
: PopupScreen(title), filename_(filename), slot_(slot), gamePath_(gamePath), title_(title) {} // PopupScreen will translate Back on its own
@@ -168,13 +170,13 @@ void ScreenshotViewScreen::OnDeleteState(UI::EventParams &e) {
std::shared_ptr<GameInfo> info = g_gameInfoCache->GetInfo(NULL, gamePath_, GameInfoFlags::PARAM_SFO);
std::string message(di->T("DeleteConfirmSaveState"));
message += "\n\n" + info->GetTitle() + " (" + info->id + ")";
std::string_view title = di->T("Delete");
std::string message = std::string(di->T("DeleteConfirmSaveState")) + "\n\n" + info->GetTitle() + " (" + info->id + ")";
message += "\n\n" + title_;
// TODO: Also show the screenshot on the confirmation screen?
screenManager()->push(new PromptScreen(gamePath_, message, di->T("Delete"), di->T("Cancel"), [=](bool result) {
screenManager()->push(new UI::MessagePopupScreen(title, message, di->T("Delete"), di->T("Cancel"), [=](bool result) {
if (result) {
SaveState::DeleteSlot(gamePath_, slot_);
TriggerFinish(DR_CANCEL);
@@ -604,7 +606,7 @@ void GamePauseScreen::CreateViews() {
std::string confirmMessage = GetConfirmExitMessage();
if (!confirmMessage.empty()) {
auto di = GetI18NCategory(I18NCat::DIALOG);
screenManager()->push(new PromptScreen(gamePath_, confirmMessage, di->T("Reset"), di->T("Cancel"), [=](bool result) {
screenManager()->push(new UI::MessagePopupScreen(di->T("Reset"), confirmMessage, di->T("Reset"), di->T("Cancel"), [=](bool result) {
if (result) {
System_PostUIMessage(UIMessage::REQUEST_GAME_RESET);
}
@@ -705,9 +707,8 @@ void GamePauseScreen::OnExit(UI::EventParams &e) {
if (!confirmExitMessage.empty()) {
auto di = GetI18NCategory(I18NCat::DIALOG);
confirmExitMessage += '\n';
confirmExitMessage += di->T("Are you sure you want to exit?");
screenManager()->push(new PromptScreen(gamePath_, confirmExitMessage, di->T("Yes"), di->T("No"), [=](bool result) {
std::string_view title = di->T("Are you sure you want to exit?");
screenManager()->push(new UI::MessagePopupScreen(title, confirmExitMessage, di->T("Exit"), di->T("Cancel"), [=](bool result) {
if (result) {
if (g_Config.bPauseMenuExitsEmulator) {
System_ExitApp();
@@ -748,18 +749,6 @@ void GamePauseScreen::OnLastSaveUndo(UI::EventParams &e) {
RecreateViews();
}
void GamePauseScreen::CallbackDeleteConfig(bool yes) {
if (yes) {
std::shared_ptr<GameInfo> info = g_gameInfoCache->GetInfo(NULL, gamePath_, GameInfoFlags::PARAM_SFO);
if (info->Ready(GameInfoFlags::PARAM_SFO)) {
g_Config.UnloadGameConfig();
g_Config.DeleteGameConfig(info->id);
info->hasConfig = false;
screenManager()->RecreateAllViews();
}
}
}
void GamePauseScreen::OnCreateConfig(UI::EventParams &e) {
std::shared_ptr<GameInfo> info = g_gameInfoCache->GetInfo(NULL, gamePath_, GameInfoFlags::PARAM_SFO);
if (info->Ready(GameInfoFlags::PARAM_SFO)) {
@@ -776,7 +765,19 @@ void GamePauseScreen::OnCreateConfig(UI::EventParams &e) {
void GamePauseScreen::OnDeleteConfig(UI::EventParams &e) {
auto di = GetI18NCategory(I18NCat::DIALOG);
const bool trashAvailable = System_GetPropertyBool(SYSPROP_HAS_TRASH_BIN);
screenManager()->push(
new PromptScreen(gamePath_, di->T("DeleteConfirmGameConfig", "Do you really want to delete the settings for this game?"), di->T("Delete"), di->T("Cancel"),
std::bind(&GamePauseScreen::CallbackDeleteConfig, this, std::placeholders::_1)));
new UI::MessagePopupScreen(di->T("Delete"), di->T("DeleteConfirmGameConfig", "Do you really want to delete the settings for this game?"),
trashAvailable ? di->T("Move to trash") : di->T("Delete"), di->T("Cancel"), [this](bool yes) {
if (!yes) {
return;
}
std::shared_ptr<GameInfo> info = g_gameInfoCache->GetInfo(NULL, gamePath_, GameInfoFlags::PARAM_SFO);
if (info->Ready(GameInfoFlags::PARAM_SFO)) {
g_Config.UnloadGameConfig();
g_Config.DeleteGameConfig(info->id);
info->hasConfig = false;
screenManager()->RecreateAllViews();
}
}));
}
-1
View File
@@ -39,7 +39,6 @@ public:
protected:
void CreateViews() override;
void update() override;
void CallbackDeleteConfig(bool yes);
UI::Margins RootMargins() const override;
private:
+6 -5
View File
@@ -28,6 +28,7 @@
#include "Common/System/Request.h"
#include "Common/UI/Context.h"
#include "Common/UI/View.h"
#include "Common/UI/PopupScreens.h"
#include "Common/UI/ViewGroup.h"
#include "Common/UI/AsyncImageFileView.h"
#include "UI/SavedataScreen.h"
@@ -130,7 +131,7 @@ SavedataView::SavedataView(UIContext &dc, GameInfo *ginfo, IdentifiedFileType ty
}
}
class SavedataPopupScreen : public PopupScreen {
class SavedataPopupScreen : public UI::PopupScreen {
public:
SavedataPopupScreen(Path gamePath, Path savePath, std::string_view title) : PopupScreen(StripSpaces(title)), savePath_(savePath), gamePath_(gamePath) { }
@@ -168,15 +169,15 @@ public:
buttonRow->SetSpacing(0);
Margins buttonMargins(5, 5, 5, 13); // not sure why we need more at the bottom to make it look right
buttonRow->Add(new Button(di->T("Back"), new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
buttonRow->Add(new Button(di->T("Delete"), new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Add([this](UI::EventParams &e) {
buttonRow->Add(new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK"), new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
buttonRow->Add(new Choice(di->T("Delete"), ImageID("I_TRASHCAN"), new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Add([this](UI::EventParams &e) {
auto di = GetI18NCategory(I18NCat::DIALOG);
std::shared_ptr<GameInfo> ginfo = g_gameInfoCache->GetInfo(nullptr, savePath_, GameInfoFlags::PARAM_SFO);
const bool trashAvailable = System_GetPropertyBool(SYSPROP_HAS_TRASH_BIN);
std::string_view confirmMessage = di->T("Are you sure you want to delete the file?");
screenManager()->push(new PromptScreen(gamePath_, confirmMessage, trashAvailable ? di->T("Move to trash") : di->T("Delete"), di->T("Cancel"), [=](bool result) {
screenManager()->push(new MessagePopupScreen(di->T("Delete"), confirmMessage, trashAvailable ? di->T("Move to trash") : di->T("Delete"), di->T("Cancel"), [=](bool result) {
if (result) {
ginfo->Delete();
TriggerFinish(DR_NO);
@@ -184,7 +185,7 @@ public:
}));
});
if (System_GetPropertyBool(SYSPROP_CAN_SHOW_FILE)) {
buttonRow->Add(new Button(di->T("Show in folder"), new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Add([this](UI::EventParams &e) {
buttonRow->Add(new Choice(di->T("Show in folder"), ImageID("I_FOLDER"), new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Add([this](UI::EventParams &e) {
System_ShowFileInFolder(savePath_);
});
}
+1 -1
View File
@@ -67,7 +67,7 @@ void UITabbedBaseDialogScreen::CreateViews() {
if (flags_ & TabDialogFlags::VerticalShowIcons) {
tabHolderFlags |= TabHolderFlags::VerticalShowIcons;
}
tabHolder_ = new TabHolder(ORIENT_VERTICAL, 300, tabHolderFlags, filterNotice_, new AnchorLayoutParams(10, 0, 10, 0, false));
tabHolder_ = new TabHolder(ORIENT_VERTICAL, 300, tabHolderFlags, filterNotice_, new AnchorLayoutParams(10, 0, 10, 0));
CreateExtraButtons(tabHolder_->Container(), 10);
tabHolder_->AddBack(this);
root_->Add(tabHolder_);
+7 -7
View File
@@ -44,7 +44,7 @@ void TiltAnalogSettingsScreen::CreateCalibrationView(UI::ViewGroup *parent, UI::
switch (g_Config.iTiltInputType) {
case TILT_DPAD:
{
parent->Add(new PSPDpad(ImageID("I_DIR_LINE"), "D-pad", ImageID("I_DIR_LINE"), ImageID("I_ARROW"), 1.5f, 1.3f, new AnchorLayoutParams(NONE, NONE, NONE, NONE, true)));
parent->Add(new PSPDpad(ImageID("I_DIR_LINE"), "D-pad", ImageID("I_DIR_LINE"), ImageID("I_ARROW"), 1.5f, 1.3f, new AnchorLayoutParams(NONE, NONE, NONE, NONE, Centering::Both)));
break;
}
case TILT_ACTION_BUTTON:
@@ -52,10 +52,10 @@ void TiltAnalogSettingsScreen::CreateCalibrationView(UI::ViewGroup *parent, UI::
AnchorLayout *rightSide = new AnchorLayout(layoutParams);
parent->Add(rightSide);
PSPButton *circle = new PSPButton(CTRL_CIRCLE, "Circle button", ImageID("I_ROUND_LINE"), ImageID("I_ROUND"), ImageID("I_CIRCLE"), 1.5f, new AnchorLayoutParams(NONE, NONE, 100.0f, NONE, true));
PSPButton *cross = new PSPButton(CTRL_CROSS, "Cross button", ImageID("I_ROUND_LINE"), ImageID("I_ROUND"), ImageID("I_CROSS"), 1.5f, new AnchorLayoutParams(NONE, NONE, NONE, 100.0f, true));
PSPButton *triangle = new PSPButton(CTRL_TRIANGLE, "Triangle button", ImageID("I_ROUND_LINE"), ImageID("I_ROUND"), ImageID("I_TRIANGLE"), 1.5f, new AnchorLayoutParams(NONE, 100.0f, NONE, NONE, true));
PSPButton *square = new PSPButton(CTRL_SQUARE, "Square button", ImageID("I_ROUND_LINE"), ImageID("I_ROUND"), ImageID("I_SQUARE"), 1.5f, new AnchorLayoutParams(100.0f, NONE, NONE, NONE, true));
PSPButton *circle = new PSPButton(CTRL_CIRCLE, "Circle button", ImageID("I_ROUND_LINE"), ImageID("I_ROUND"), ImageID("I_CIRCLE"), 1.5f, new AnchorLayoutParams(NONE, NONE, 100.0f, NONE, Centering::Both));
PSPButton *cross = new PSPButton(CTRL_CROSS, "Cross button", ImageID("I_ROUND_LINE"), ImageID("I_ROUND"), ImageID("I_CROSS"), 1.5f, new AnchorLayoutParams(NONE, NONE, NONE, 100.0f, Centering::Both));
PSPButton *triangle = new PSPButton(CTRL_TRIANGLE, "Triangle button", ImageID("I_ROUND_LINE"), ImageID("I_ROUND"), ImageID("I_TRIANGLE"), 1.5f, new AnchorLayoutParams(NONE, 100.0f, NONE, NONE, Centering::Both));
PSPButton *square = new PSPButton(CTRL_SQUARE, "Square button", ImageID("I_ROUND_LINE"), ImageID("I_ROUND"), ImageID("I_SQUARE"), 1.5f, new AnchorLayoutParams(100.0f, NONE, NONE, NONE, Centering::Both));
rightSide->Add(circle);
rightSide->Add(cross);
rightSide->Add(triangle);
@@ -67,8 +67,8 @@ void TiltAnalogSettingsScreen::CreateCalibrationView(UI::ViewGroup *parent, UI::
AnchorLayout *rightSide = new AnchorLayout(layoutParams);
parent->Add(rightSide);
PSPButton *lTrigger = new PSPButton(CTRL_LTRIGGER, "Left shoulder button", ImageID("I_SHOULDER_LINE"), ImageID("I_SHOULDER"), ImageID("I_L"), 1.5f, new AnchorLayoutParams(100.0f, NONE, NONE, NONE, true));
PSPButton *rTrigger = new PSPButton(CTRL_RTRIGGER, "Right shoulder button", ImageID("I_SHOULDER_LINE"), ImageID("I_SHOULDER"), ImageID("I_R"), 1.5f, new AnchorLayoutParams(NONE, NONE, 100.0f, NONE, true));
PSPButton *lTrigger = new PSPButton(CTRL_LTRIGGER, "Left shoulder button", ImageID("I_SHOULDER_LINE"), ImageID("I_SHOULDER"), ImageID("I_L"), 1.5f, new AnchorLayoutParams(100.0f, NONE, NONE, NONE, Centering::Both));
PSPButton *rTrigger = new PSPButton(CTRL_RTRIGGER, "Right shoulder button", ImageID("I_SHOULDER_LINE"), ImageID("I_SHOULDER"), ImageID("I_R"), 1.5f, new AnchorLayoutParams(NONE, NONE, 100.0f, NONE, Centering::Both));
rTrigger->FlipImageH(true);
rightSide->Add(lTrigger);
rightSide->Add(rTrigger);
+2 -2
View File
@@ -44,7 +44,7 @@ static u32 GetButtonColor() {
class DragDropButton : public MultiTouchButton {
public:
DragDropButton(ConfigTouchPos &pos, const char *key, ImageID bgImg, ImageID img, const Bounds &screenBounds)
: MultiTouchButton(key, bgImg, bgImg, img, pos.scale, new UI::AnchorLayoutParams(pos.x * screenBounds.w, pos.y * screenBounds.h, UI::NONE, UI::NONE, true)),
: MultiTouchButton(key, bgImg, bgImg, img, pos.scale, new UI::AnchorLayoutParams(pos.x * screenBounds.w, pos.y * screenBounds.h, UI::NONE, UI::NONE, UI::Centering::Both)),
x_(pos.x), y_(pos.y), theScale_(pos.scale), screenBounds_(screenBounds) {
scale_ = theScale_;
}
@@ -412,7 +412,7 @@ bool ControlLayoutView::Touch(const TouchInput &touch) {
}
newPos = ClampTo(newPos, validRange);
pickedControl_->ReplaceLayoutParams(new AnchorLayoutParams(newPos.x, newPos.y, NONE, NONE, true));
pickedControl_->ReplaceLayoutParams(new AnchorLayoutParams(newPos.x, newPos.y, NONE, NONE, Centering::Both));
} else if (mode_ == 1) {
// Resize. Vertical = scaling, horizontal = spacing;
// Up should be bigger so let's negate in that direction
+1 -1
View File
@@ -155,7 +155,7 @@ void RightAnalogMappingScreen::CreateViews() {
root_ = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT));
Choice *back = new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK"), new AnchorLayoutParams(leftColumnWidth - 10, WRAP_CONTENT, 10, NONE, NONE, 10));
root_->Add(back)->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
TabHolder *tabHolder = new TabHolder(ORIENT_VERTICAL, leftColumnWidth, TabHolderFlags::Default, nullptr, new AnchorLayoutParams(10, 0, 10, 0, false));
TabHolder *tabHolder = new TabHolder(ORIENT_VERTICAL, leftColumnWidth, TabHolderFlags::Default, nullptr, new AnchorLayoutParams(10, 0, 10, 0, Centering::None));
root_->Add(tabHolder);
ScrollView *rightPanel = new ScrollView(ORIENT_VERTICAL);
tabHolder->AddTab(co->T("Binds"), ImageID::invalid(), rightPanel);
-2
View File
@@ -575,8 +575,6 @@ bool ReadDualSenseInput(HANDLE handle, HIDControllerState *state) {
buttons &= ~0xF;
buttons |= DecodeHatSwitch(report.buttons[0] & 0xF);
INFO_LOG(Log::sceCtrl, "DualSense accel: %0.2f %0.2f %0.2f", state->accelerometer[0], state->accelerometer[1], state->accelerometer[2]);
state->buttons = buttons;
return true;
}
+2
View File
@@ -447,6 +447,8 @@ bool System_GetPropertyBool(SystemProperty prop) {
#endif
case SYSPROP_HAS_ACCELEROMETER:
return g_InputManager.AnyAccelerometer();
case SYSPROP_USE_IAP:
return true;
default:
return false;
}
+3 -3
View File
@@ -408,9 +408,9 @@ Corrupted Data = Corrupted data
Delete = ‎مسح
Delete all = ‎مسح الكل
Delete completed = ‎المسح إكتمل.
DeleteConfirm = ‎بيانات الحفظ هذه سوف تمسح.\nهل أنت متأكد من الإكمال?
DeleteConfirmAll = ‎هل تريد حقاً مسح كل \nملفات الحفظ لهذه اللعبة?
DeleteConfirmGame = ‎هل تود حقاً مسح هذه اللعبة \nfمن جهازك? لا يمكن الرجوع عن هذا.
DeleteConfirm = ‎بيانات الحفظ هذه سوف تمسح. هل أنت متأكد من الإكمال?
DeleteConfirmAll = ‎هل تريد حقاً مسح كل ملفات الحفظ لهذه اللعبة?
DeleteConfirmGame = ‎هل تود حقاً مسح هذه اللعبة fمن جهازك? لا يمكن الرجوع عن هذا.
DeleteConfirmGameConfig = ‎هل تود حقاً مسح الإعدادات لهذه اللعبة?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = ‎غير قادر علي مسح البيانات.
+3 -3
View File
@@ -404,9 +404,9 @@ Corrupted Data = Korlanmış verilən
Delete = Sil
Delete all = Hamısını sil
Delete completed = Siliniş tamamlandı
DeleteConfirm = Bu verilənlər silinəcək.\nDəvam etmək istəyisinizmi?
DeleteConfirmAll = Bu oyun üçün bütün qorunma veriləninizi\nsilmək istəyirsinizmi?
DeleteConfirmGame = Bu oyunu qurğunuzdan silmək istədiyinizdən\nəminsiz? Bunun qayıdışı yoxdur.
DeleteConfirm = Bu verilənlər silinəcək. Dəvam etmək istəyisinizmi?
DeleteConfirmAll = Bu oyun üçün bütün qorunma veriləninizi silmək istəyirsinizmi?
DeleteConfirmGame = Bu oyunu qurğunuzdan silmək istədiyinizdən əminsiz? Bunun qayıdışı yoxdur.
DeleteConfirmGameConfig = Bu oyun üçün quruluşları silmək doğrudan istəyirsiniz?
DeleteConfirmSaveState = Bu qoruma durumunu ömürlük silmək istədiyinizdən əminsiz?
DeleteFailed = Verilən silinişi uğursuz oldu.
+1 -1
View File
@@ -400,7 +400,7 @@ Corrupted Data = Corrupted data
Delete = Delete
Delete all = Delete all
Delete completed = Delete completed.
DeleteConfirm = This save data will be deleted.\nAre you sure you want to continue?
DeleteConfirm = This save data will be deleted. Are you sure you want to continue?
DeleteConfirmAll = Do you really want to delete all your save data for this game?
DeleteConfirmGame = Do you really want to delete this game from your device? You can't undo this.
DeleteConfirmGameConfig = Do you really want to delete the settings for this game?
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Повредени данни
Delete = Изтрий
Delete all = Изтрий всички
Delete completed = Изтриването завършето.
DeleteConfirm = Този запис ще бъде изтрит.\nСигурни ли сте, че искате да продължите?
DeleteConfirmAll = Наистина ли искате да изтриете\nвсички записани данни за тази игра?
DeleteConfirmGame = Наистина ли искате да изтриете тази игра\nот устройството Ви? Не може да върнете това действие.
DeleteConfirm = Този запис ще бъде изтрит. Сигурни ли сте, че искате да продължите?
DeleteConfirmAll = Наистина ли искате да изтриете всички записани данни за тази игра?
DeleteConfirmGame = Наистина ли искате да изтриете тази игра от устройството Ви? Не може да върнете това действие.
DeleteConfirmGameConfig = Do you really want to delete the settings for this game?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Unable to delete data.
+2 -2
View File
@@ -400,9 +400,9 @@ Corrupted Data = Dades corruptes
Delete = Eliminar
Delete all = Eliminar tot
Delete completed = Esborrat completat
DeleteConfirm = Aquesta partida serà esborrada.\nVols perdre el progrés guardat?
DeleteConfirm = Aquesta partida serà esborrada. Vols perdre el progrés guardat?
DeleteConfirmAll = Estàs segur que vols esborrar totes les dades de guardat d'aquest joc?
DeleteConfirmGame = Estàs segur que vols esborrar aquest joc?\nAquesta operació no es pot desfer.
DeleteConfirmGame = Estàs segur que vols esborrar aquest joc? Aquesta operació no es pot desfer.
DeleteConfirmGameConfig = Estàs segur que vols esborrar la configuración d'aquest joc?.
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Les dades no s'han pogut borrar.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = Smazat
Delete all = Smazat vše
Delete completed = Mazání dokončeno.
DeleteConfirm = Tato uložená data budou smazána.\nOpravdu chcete pokračovat?
DeleteConfirmAll = Opravdu chcete smazat všechna\nvaše uložená data pro tuto hru?
DeleteConfirmGame = Opravdu chcete tuto hru smazat\nze svého zařízení? Toto nelze vrátit zpět.
DeleteConfirm = Tato uložená data budou smazána. Opravdu chcete pokračovat?
DeleteConfirmAll = Opravdu chcete smazat všechna vaše uložená data pro tuto hru?
DeleteConfirmGame = Opravdu chcete tuto hru smazat ze svého zařízení? Toto nelze vrátit zpět.
DeleteConfirmGameConfig = Opravdu chcete smazat nastavení této hry?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Nelze smazat data.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = Slet
Delete all = Slet alt
Delete completed = Slettet.
DeleteConfirm = Alt gemt data vil blive slettet.\nEr du sikker på at du vil fortsætte?
DeleteConfirmAll = Vil du virkelig slette alle\nspil-status for dette spil?
DeleteConfirmGame = Vil du virkelig slette dette spil\nfra din enhed? Du kan ikke fortryde.
DeleteConfirm = Alt gemt data vil blive slettet. Er du sikker på at du vil fortsætte?
DeleteConfirmAll = Vil du virkelig slette alle spil-status for dette spil?
DeleteConfirmGame = Vil du virkelig slette dette spil fra din enhed? Du kan ikke fortryde.
DeleteConfirmGameConfig = Vil du virkelig slette opsætningen for dette spil?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Ikke muligt at slette data.
+1 -1
View File
@@ -393,7 +393,7 @@ Corrupted Data = Beschädigte Daten
Delete = Löschen
Delete all = Alle löschen
Delete completed = Löschen abgeschlossen
DeleteConfirm = Diese Speicherdaten werden gelöscht.\nWillst du wirklich fortfahren?
DeleteConfirm = Diese Speicherdaten werden gelöscht. Willst du wirklich fortfahren?
DeleteConfirmAll = Willst du wirklich alle deine Speicherdaten für dieses Spiel löschen?
DeleteConfirmGame = Willst du dieses Spiel wirklich von deinem Gerät löschen? Dies lässt sich nicht rückgängig machen.
DeleteConfirmGameConfig = Willst du die Einstellungen für dieses Spiel wirklich löschen?
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = Hapusi
Delete all = Delete all
Delete completed = Terhapusmi.
DeleteConfirm = Ala dihapusmi te' data.\nYake bangmo?
DeleteConfirmAll = Dihapus nasang tongammi te'e\nyake bangmo?
DeleteConfirmGame = Dihapus tongammi te' paningoan?\n Tihapus tongammi dau mane.
DeleteConfirm = Ala dihapusmi te' data. Yake bangmo?
DeleteConfirmAll = Dihapus nasang tongammi te'e yake bangmo?
DeleteConfirmGame = Dihapus tongammi te' paningoan? Tihapus tongammi dau mane.
DeleteConfirmGameConfig = Do you really want to delete the settings for this game?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Unable to delete data.
+1 -1
View File
@@ -424,7 +424,7 @@ Corrupted Data = Corrupted data
Delete = Delete
Delete all = Delete all
Delete completed = Delete completed.
DeleteConfirm = This save data will be deleted.\nAre you sure you want to continue?
DeleteConfirm = This save data will be deleted. Are you sure you want to continue?
DeleteConfirmAll = Do you really want to delete all your save data for this game?
DeleteConfirmGame = Do you really want to delete this game from your device? You can't undo this.
DeleteConfirmGameConfig = Do you really want to delete the settings for this game?
+4 -4
View File
@@ -400,10 +400,10 @@ Corrupted Data = Datos dañados
Delete = Borrar
Delete all = Borrar todos
Delete completed = Borrado terminado.
DeleteConfirm = Estos archivos son borrados.\n¿Estás seguro/a?
DeleteConfirmAll = ADVERTENCIA:\nTodos los archivos de guardado serán borrados.\n¿Estás seguro/a?
DeleteConfirmGame = ADVERTENCIA:\nEste juego será borrado para siempre y no puedes deshacerlo.\n¿Estás seguro/a?
DeleteConfirmGameConfig = ADVERTENCIA:\nLos archivos de preferencias de este juego serán borrados.\n¿Estás seguro/a?
DeleteConfirm = Estos archivos son borrados. ¿Estás seguro/a?
DeleteConfirmAll = ADVERTENCIA: Todos los archivos de guardado serán borrados. ¿Estás seguro/a?
DeleteConfirmGame = ADVERTENCIA: Este juego será borrado para siempre y no puedes deshacerlo. ¿Estás seguro/a?
DeleteConfirmGameConfig = ADVERTENCIA: Los archivos de preferencias de este juego serán borrados. ¿Estás seguro/a?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Los archivos no se pudieron borrar.
Deleting = Borrando\nPor favor espere...
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = داده‌ها خراب شده
Delete = ‎حذف
Delete all = حذف همه
Delete completed = ‎.حذف شد
DeleteConfirm = ‎این دادهٔ ذخیره شده حذف خواهد شد.\nآیا از حذف آن مطمئن هستید؟
DeleteConfirmAll = ‎آیا شما می خواهید که همه ی\nداده‌های ذخیره این بازی را حذف نمایید؟
DeleteConfirmGame = ‎آیا شما می خواهید این بازی را\n.از دستگاه خود حذف کنید؟ نمی توانید آن را برگردانید
DeleteConfirm = ‎این دادهٔ ذخیره شده حذف خواهد شد. آیا از حذف آن مطمئن هستید؟
DeleteConfirmAll = ‎آیا شما می خواهید که همه ی داده‌های ذخیره این بازی را حذف نمایید؟
DeleteConfirmGame = ‎آیا شما می خواهید این بازی را .از دستگاه خود حذف کنید؟ نمی توانید آن را برگردانید
DeleteConfirmGameConfig = آیا واقعا میخواهید تنظیمات این بازی را حذف کنید؟
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Unable to delete data.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Vioittuneet tiedot
Delete = Poista
Delete all = Poista kaikki
Delete completed = Poisto onnistui.
DeleteConfirm = Tämä tallennus poistetaan.\nHaluatko varmasti jatkaa?
DeleteConfirmAll = Haluatko varmasti poistaa kaikki\ntämän pelin tallennustiedot?
DeleteConfirmGame = Haluatko varmasti poistaa tämän pelin\nlaitteeltasi? Tätä ei voi perua.
DeleteConfirm = Tämä tallennus poistetaan. Haluatko varmasti jatkaa?
DeleteConfirmAll = Haluatko varmasti poistaa kaikki tämän pelin tallennustiedot?
DeleteConfirmGame = Haluatko varmasti poistaa tämän pelin laitteeltasi? Tätä ei voi perua.
DeleteConfirmGameConfig = Haluatko varmasti poistaa tämän pelin asetukset?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Tietojen poistaminen epäonnistui.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Données corrompues
Delete = Supprimer
Delete all = Tout supprimer
Delete completed = Suppression terminée.
DeleteConfirm = Cette sauvegarde va être supprimée.\nÊtes-vous sûr de vouloir continuer ?
DeleteConfirmAll = Voulez-vous vraiment supprimer toutes les\nsauvegardes de ce jeu ?\nCette action est définitive.
DeleteConfirmGame = Voulez-vous vraiment supprimer ce jeu de votre système ?\nCette action est définitive.
DeleteConfirm = Cette sauvegarde va être supprimée. Êtes-vous sûr de vouloir continuer ?
DeleteConfirmAll = Voulez-vous vraiment supprimer toutes les sauvegardes de ce jeu ? Cette action est définitive.
DeleteConfirmGame = Voulez-vous vraiment supprimer ce jeu de votre système ? Cette action est définitive.
DeleteConfirmGameConfig = Voulez-vous vraiment supprimer les paramètres pour ce jeu ?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Suppression impossible.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = Borrar
Delete all = Borrar todo
Delete completed = Borrado completado.
DeleteConfirm = Este arquivo de datos borrarase.\nSeguro que queres borralo?
DeleteConfirmAll = Seguro que queres borrar todos\nos datos de gardado de este xogo?
DeleteConfirmGame = Seguro que queres borrar este xogo?\nEsta operación non se pode desfacer.
DeleteConfirm = Este arquivo de datos borrarase. Seguro que queres borralo?
DeleteConfirmAll = Seguro que queres borrar todos os datos de gardado de este xogo?
DeleteConfirmGame = Seguro que queres borrar este xogo? Esta operación non se pode desfacer.
DeleteConfirmGameConfig = Seguro que queres borrar a configuración deste xogo?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Os datos non se puideron borrar.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = ΔΙΑΓΡΑΦΗ
Delete all = ΔΙΑΓΡΑΦΗ ΟΛΩΝ
Delete completed = ΔΙΑΓΡΑΦΗ ΟΛΟΚΛΗΡΩΘΗΚΕ
DeleteConfirm = ΤΑ ΔΕΔΟΜΕΝΑ ΘΑ ΔΙΑΦΡΑΦΟΥΝ.\nΕΙΣΤΕ ΣΙΓΟΥΡΟΙ;
DeleteConfirmAll = ΘΕΛΕΤΕ ΝΑ ΔΙΑΦΡΑΨΕΤΕ ΟΛΑ\nΤΑ ΔΕΔΟΜΕΝΑ ΓΙ' ΑΥΤΟ ΤΟ ΠΑΙΧΝΙΔΙ;
DeleteConfirmGame = ΘΕΛΕΤΕ ΝΑ ΔΙΑΓΡΑΨΕΤΕ ΑΥΤΟ ΤΟ ΠΑΙΧΝΙΔΙ ΑΠΟ \nΤΗΝ ΣΥΣΚΕΥΗ ΣΑΣ; ΔΕΝ ΜΠΟΡΕΙΤΕ ΝΑ ΑΝΑΙΡΕΣΕΤΕ ΤΗΝ ΕΠΙΛΟΓΗ ΣΑΣ.
DeleteConfirm = ΤΑ ΔΕΔΟΜΕΝΑ ΘΑ ΔΙΑΦΡΑΦΟΥΝ. ΕΙΣΤΕ ΣΙΓΟΥΡΟΙ;
DeleteConfirmAll = ΘΕΛΕΤΕ ΝΑ ΔΙΑΦΡΑΨΕΤΕ ΟΛΑ ΤΑ ΔΕΔΟΜΕΝΑ ΓΙ' ΑΥΤΟ ΤΟ ΠΑΙΧΝΙΔΙ;
DeleteConfirmGame = ΘΕΛΕΤΕ ΝΑ ΔΙΑΓΡΑΨΕΤΕ ΑΥΤΟ ΤΟ ΠΑΙΧΝΙΔΙ ΑΠΟ ΤΗΝ ΣΥΣΚΕΥΗ ΣΑΣ; ΔΕΝ ΜΠΟΡΕΙΤΕ ΝΑ ΑΝΑΙΡΕΣΕΤΕ ΤΗΝ ΕΠΙΛΟΓΗ ΣΑΣ.
DeleteConfirmGameConfig = Είστε σίγουροι ότι θέλετε να διαγράψετε τις ρυθμίσεις για αυτό το παιχνίδι;
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = ΑΔΥΝΑΜΙΑ ΔΙΑΓΡΑΦΗΣ ΔΕΔΟΜΕΝΩΝ.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = Izbriši
Delete all = Izbriši sve
Delete completed = Brisanje dovršeno.
DeleteConfirm = Ova data će biti izbrisana.\nŽeliš li nastaviti?
DeleteConfirmAll = Želis li izbrisati svu\nsvoju save datu za ovu igru?
DeleteConfirmGame = Želiš li izbrisati igru\nsa svog uređaja? Ovo ne možeš poništit.
DeleteConfirm = Ova data će biti izbrisana. Želiš li nastaviti?
DeleteConfirmAll = Želis li izbrisati svu svoju save datu za ovu igru?
DeleteConfirmGame = Želiš li izbrisati igru sa svog uređaja? Ovo ne možeš poništit.
DeleteConfirmGameConfig = Želiš li izbrisati postavke za ovu igru?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Nije moguće izbrisati datu.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Sérült adat
Delete = Töröl
Delete all = Mindet töröl
Delete completed = Törölve.
DeleteConfirm = Ez a mentés törlődni fog.\nBiztosan akarod folytatni?
DeleteConfirmAll = Biztosan törölni akarod az összes\nmentésedet ehhez a játékhoz?
DeleteConfirmGame = Biztosan törölni akarod ezt a játékot?\nNem lehet visszavonni.
DeleteConfirm = Ez a mentés törlődni fog. Biztosan akarod folytatni?
DeleteConfirmAll = Biztosan törölni akarod az összes mentésedet ehhez a játékhoz?
DeleteConfirmGame = Biztosan törölni akarod ezt a játékot? Nem lehet visszavonni.
DeleteConfirmGameConfig = Biztosan törölni akarod a játék beállításait?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Törlés sikertelen.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Data rusak
Delete = Hapus
Delete all = Hapus semua
Delete completed = Selesai menghapus.
DeleteConfirm = Simpanan ini akan dihapus.\nAnda yakin ingin melanjutkan?
DeleteConfirmAll = Apakah Anda ingin menghapus semua\ndata simpanan untuk permainan ini?
DeleteConfirmGame = Apakah Anda benar-benar ingin menghapus\npermainan ini dari perangkat? Aksi ini bersifat permanen.
DeleteConfirm = Simpanan ini akan dihapus. Anda yakin ingin melanjutkan?
DeleteConfirmAll = Apakah Anda ingin menghapus semua data simpanan untuk permainan ini?
DeleteConfirmGame = Apakah Anda benar-benar ingin menghapus permainan ini dari perangkat? Aksi ini bersifat permanen.
DeleteConfirmGameConfig = Apakah Anda benar-benar ingin menghapus pengaturan untuk permainan ini?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Tidak dapat menghapus data.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Dati corrotti
Delete = Elimina
Delete all = Elimina tutto
Delete completed = Eliminazione completata.
DeleteConfirm = Questo salvataggio sarà eliminato.\nSi è sicuri di voler continuare?
DeleteConfirmAll = Vuoi veramente eliminare tutti\ni salvataggi di questo gioco?
DeleteConfirmGame = Vuoi veramente eliminare questo gioco\ndal tuo dispositivo? Questa azione non si può annullare.
DeleteConfirm = Questo salvataggio sarà eliminato. Si è sicuri di voler continuare?
DeleteConfirmAll = Vuoi veramente eliminare tutti i salvataggi di questo gioco?
DeleteConfirmGame = Vuoi veramente eliminare questo gioco dal tuo dispositivo? Questa azione non si può annullare.
DeleteConfirmGameConfig = Vuoi veramente cancellare le impostazioni per questo gioco?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Impossibile cancellare i dati.
+2 -2
View File
@@ -400,9 +400,9 @@ Corrupted Data = 破損したデータ
Delete = 削除
Delete all = 全て削除
Delete completed = 削除が完了しました。
DeleteConfirm = データを削除します。\n本当に続けますか?
DeleteConfirm = データを削除します。 本当に続けますか?
DeleteConfirmAll = 本当にこのゲームのセーブデータを削除しますか?
DeleteConfirmGame = 本当にこのゲームを削除しますか?\nデータを元に戻すことはできません。
DeleteConfirmGame = 本当にこのゲームを削除しますか? データを元に戻すことはできません。
DeleteConfirmGameConfig = 本当にこのゲームの設定を削除しますか?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = データを削除できませんでした。
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = Mbusek
Delete all = Mbusek Kabeh
Delete completed = Mbusek rampung.
DeleteConfirm = Data iki arep di busek.\nTetep lanjutkake?
DeleteConfirmAll = Njenengan yakin arep mbusek\nkabeh data penyimpenan dolanan iki?
DeleteConfirmGame = Yakin arep mbusek dolanan iki\nsaka perangkat njenengan? Tindakan iki ora bisa di batalkake.
DeleteConfirm = Data iki arep di busek. Tetep lanjutkake?
DeleteConfirmAll = Njenengan yakin arep mbusek kabeh data penyimpenan dolanan iki?
DeleteConfirmGame = Yakin arep mbusek dolanan iki saka perangkat njenengan? Tindakan iki ora bisa di batalkake.
DeleteConfirmGameConfig = Yakin arep mbusek setelan kanggo dolanan iki?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = ora dapat mbusek data.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = 손상된 데이터
Delete = 삭제
Delete all = 모두 삭제
Delete completed = 삭제가 완료되었습니다.
DeleteConfirm = 이 저장 데이터는 삭제됩니다.\n계속할까요?
DeleteConfirmAll = 이 게임에 대한 모든 저장 데이터를\n삭제할까요?
DeleteConfirmGame = 이 게임을 정말로 장치에서\n삭제할까요? 이 작업은 취소할 수 없습니다.
DeleteConfirm = 이 저장 데이터는 삭제됩니다. 계속할까요?
DeleteConfirmAll = 이 게임에 대한 모든 저장 데이터를 삭제할까요?
DeleteConfirmGame = 이 게임을 정말로 장치에서 삭제할까요? 이 작업은 취소할 수 없습니다.
DeleteConfirmGameConfig = 이 게임의 설정을 삭제할까요?
DeleteConfirmSaveState = 이 저장 상태를 영구적으로 삭제할까요?
DeleteFailed = 데이터를 삭제할 수 없습니다.
+3 -3
View File
@@ -414,9 +414,9 @@ Corrupted Data = زانیاریەکە تێکچووە
Delete = سڕینەوە
Delete all = سڕینەوەی هەمووی
Delete completed = سڕینەوەکە سەرکەووتوو بوو
DeleteConfirm = زانیارە خەخن کراوە دەسڕدرێتەوە.\nئایا تۆ دڵنیایت لە بەردەوام بوون؟
DeleteConfirmAll = ئایە تۆ دڵنیایت لە\nسڕینەوەی هەموو زانیاریە خەزنکروەکان بۆ ئەم یاریە؟?
DeleteConfirmGame = ئایا تۆ دڵنیایت کە\nئەم یاریە بسڕیتەوە لە ئامێرەکەت؟ ئەم کارە گەڕانەوەی نییە
DeleteConfirm = زانیارە خەخن کراوە دەسڕدرێتەوە. ئایا تۆ دڵنیایت لە بەردەوام بوون؟
DeleteConfirmAll = ئایە تۆ دڵنیایت لە سڕینەوەی هەموو زانیاریە خەزنکروەکان بۆ ئەم یاریە؟?
DeleteConfirmGame = ئایا تۆ دڵنیایت کە ئەم یاریە بسڕیتەوە لە ئامێرەکەت؟ ئەم کارە گەڕانەوەی نییە
DeleteConfirmGameConfig = ئایا تۆ دڵنیایت لە سڕینەوەی سێتینگەکانت بۆ ئەم یاریە؟
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = نەتوانرا زانیاریەکان بسڕدرێنەوە.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = ລຶບ
Delete all = ລຶບທັງໝົດ
Delete completed = ລຶບຂໍ້ມູນສຳເລັດ
DeleteConfirm = ເຊບນີ້ຈະຖືກລຶບ\nເຈົ້າຕ້ອງການຈະດຳເນີນການຕໍ່ຫຼືບໍ່?
DeleteConfirmAll = ເຈົ້າຕ້ອງການທີ່ຈະລຶບເຊບທັງໝົດ\nຂອງເຈົ້າສຳລັບເກມນີ້
DeleteConfirmGame = ເຈົ້າຕ້ອງການທີ່ຈະລຶບເກມທັງໝົດ\nຈາກອຸປະກອນຂອງເຈົ້າຫຼືບໍ່? ເຈົ້າຈະບໍ່ສາມາດຍົກເລີກໄດ້
DeleteConfirm = ເຊບນີ້ຈະຖືກລຶບ ເຈົ້າຕ້ອງການຈະດຳເນີນການຕໍ່ຫຼືບໍ່?
DeleteConfirmAll = ເຈົ້າຕ້ອງການທີ່ຈະລຶບເຊບທັງໝົດ ຂອງເຈົ້າສຳລັບເກມນີ້
DeleteConfirmGame = ເຈົ້າຕ້ອງການທີ່ຈະລຶບເກມທັງໝົດ ຈາກອຸປະກອນຂອງເຈົ້າຫຼືບໍ່? ເຈົ້າຈະບໍ່ສາມາດຍົກເລີກໄດ້
DeleteConfirmGameConfig = ເຈົ້າຕ້ອງການທີ່ຈະລຶບການຕັ້ງຄ່າສຳລັບເກມນີ້ຫຼືບໍ່?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = ບໍ່ສາມາດລຶບຂໍ້ມູນ.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = Ištrinti
Delete all = Ištrinti viską
Delete completed = Ištrinimas baigtas.
DeleteConfirm = This save data will be deleted.\nAre you sure you want to continue?
DeleteConfirmAll = Ar norite tikrai ištrinti visus\njūsų išsaugojimo duomenis šitam žaidimui?
DeleteConfirmGame = Ar norite tikrai ištrinti šitą žaidimą\niš jūsų įrenginio? Jūs negalite atstatyti šitos komandos.
DeleteConfirm = This save data will be deleted. Are you sure you want to continue?
DeleteConfirmAll = Ar norite tikrai ištrinti visus jūsų išsaugojimo duomenis šitam žaidimui?
DeleteConfirmGame = Ar norite tikrai ištrinti šitą žaidimą iš jūsų įrenginio? Jūs negalite atstatyti šitos komandos.
DeleteConfirmGameConfig = Ar tikrai norite ištrinti šiuos nustatymus iš šito žaidimo?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Neįmanoma ištrinti duomenų.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = Padam
Delete all = Padam semua
Delete completed = Pemadaman selesai.
DeleteConfirm = Data disimpan ini akan dipadam.\nAnda pasti hendak teruskan?
DeleteConfirmAll = Anda yakin ingin menghapus\nsemua data penyimpanan permainan ini?
DeleteConfirmGame = Anda pasti memadam permainan ini\ndari peranti? Anda tak dapat kembalikan ini.
DeleteConfirm = Data disimpan ini akan dipadam. Anda pasti hendak teruskan?
DeleteConfirmAll = Anda yakin ingin menghapus semua data penyimpanan permainan ini?
DeleteConfirmGame = Anda pasti memadam permainan ini dari peranti? Anda tak dapat kembalikan ini.
DeleteConfirmGameConfig = Do you really want to delete the settings for this game?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Pemadaman data gagal.
+4 -4
View File
@@ -400,10 +400,10 @@ Corrupted Data = Corrupted data
Delete = Wissen
Delete all = Alles wissen
Delete completed = Het verwijderen is voltooid.
DeleteConfirm = De opgeslagen data worden verwijderd.\nWeet u zeker dat u wilt doorgaan?
DeleteConfirmAll = Weet u zeker dat u alle opgeslagen data voor deze\ngame wilt verwijderen?
DeleteConfirmGame = Weet u zeker dat u deze game van uw apparaat wilt\nverwijderen? Dit kan niet ongedaan gemaakt worden.
DeleteConfirmGameConfig = Weet u zeker dat u de instellingen voor deze game\nwilt verwijderen?
DeleteConfirm = De opgeslagen data worden verwijderd. Weet u zeker dat u wilt doorgaan?
DeleteConfirmAll = Weet u zeker dat u alle opgeslagen data voor deze game wilt verwijderen?
DeleteConfirmGame = Weet u zeker dat u deze game van uw apparaat wilt verwijderen? Dit kan niet ongedaan gemaakt worden.
DeleteConfirmGameConfig = Weet u zeker dat u de instellingen voor deze game wilt verwijderen?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Kan de data niet verwijderen.
Deleting = Bezig met verwijderen...\nEen ogenblik geduld.
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = Corrupted data
Delete = Slett
Delete all = Delete all
Delete completed = Slettet!!.
DeleteConfirm = Slett markert fil.\nEr du sikker på at du vil dette?
DeleteConfirmAll = Do you really want to delete all\nyour save data for this game?
DeleteConfirmGame = Do you really want to delete this game\nfrom your device? You can't undo this.
DeleteConfirm = Slett markert fil. Er du sikker på at du vil dette?
DeleteConfirmAll = Do you really want to delete all your save data for this game?
DeleteConfirmGame = Do you really want to delete this game from your device? You can't undo this.
DeleteConfirmGameConfig = Do you really want to delete the settings for this game?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Unable to delete data.
+3 -3
View File
@@ -399,9 +399,9 @@ Corrupted Data = Uszkodzone dane
Delete = Usuń
Delete all = Usuń wszystko
Delete completed = Usuwanie zakończone.
DeleteConfirm = Dane zapisu zostaną usunięte.\nCzy na pewno chcesz kontynuować?
DeleteConfirmAll = Czy na pewno chcesz usunąć wszystkie\ndane zapisu tej gry?
DeleteConfirmGame = Czy na pewno chcesz usunąć tę grę\nze swojego urządzenia? Nie można tego cofnąć.
DeleteConfirm = Dane zapisu zostaną usunięte. Czy na pewno chcesz kontynuować?
DeleteConfirmAll = Czy na pewno chcesz usunąć wszystkie dane zapisu tej gry?
DeleteConfirmGame = Czy na pewno chcesz usunąć tę grę ze swojego urządzenia? Nie można tego cofnąć.
DeleteConfirmGameConfig = Czy na pewno chcesz usunąć ustawienia dla tej gry?
DeleteFailed = Nie można usunąć danych.
Deleting = Usuwanie\nProszę czekać...
+3 -3
View File
@@ -423,9 +423,9 @@ Corrupted Data = Dados corrompidos
Delete = Apagar
Delete all = Apagar tudo
Delete completed = Exclusão completada.
DeleteConfirm = Este dado do save será apagado.\nVocê tem certeza que você quer continuar?
DeleteConfirmAll = Você realmente quer apagar todos\nos seus dados salvos deste jogo?
DeleteConfirmGame = Você realmente quer apagar este jogo\ndo seu dispositivo? Você não pode desfazer isto.
DeleteConfirm = Este dado do save será apagado. Você tem certeza que você quer continuar?
DeleteConfirmAll = Você realmente quer apagar todos os seus dados salvos deste jogo?
DeleteConfirmGame = Você realmente quer apagar este jogo do seu dispositivo? Você não pode desfazer isto.
DeleteConfirmGameConfig = Você realmente quer apagar as configurações deste jogo?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Incapaz de apagar os dados.
+3 -3
View File
@@ -424,9 +424,9 @@ Corrupted Data = Dados Corrompidos
Delete = Eliminar
Delete all = Eliminar tudo
Delete completed = Eliminação completa.
DeleteConfirm = Estes dados do salvamento serão eliminados.\nTens a certeza que queres continuar?
DeleteConfirmAll = Queres realmente eliminar todos\nos teus dados salvos deste jogo?
DeleteConfirmGame = Queres realmente eliminar este jogo\ndo teu dispositivo? Não poderás desfazer isto.
DeleteConfirm = Estes dados do salvamento serão eliminados. Tens a certeza que queres continuar?
DeleteConfirmAll = Queres realmente eliminar todos os teus dados salvos deste jogo?
DeleteConfirmGame = Queres realmente eliminar este jogo do teu dispositivo? Não poderás desfazer isto.
DeleteConfirmGameConfig = Queres realmente eliminar as definições deste jogo?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Não foi possível eliminar os dados.
+3 -3
View File
@@ -401,9 +401,9 @@ Corrupted Data = Corrupted data
Delete = Șterge
Delete all = Șterge tot
Delete completed = Ștergere completă
DeleteConfirm = Salvarea curentă va fi ștearsă.\nConfirmați?
DeleteConfirmAll = Chiar vrei să-ți ștergi\ndatele salvate pt. acest joc?
DeleteConfirmGame = Chiar vrei să ștergi acest joc\nde pe aparatul tău? Nu este cale de întoarcere.
DeleteConfirm = Salvarea curentă va fi ștearsă. Confirmați?
DeleteConfirmAll = Chiar vrei să-ți ștergi datele salvate pt. acest joc?
DeleteConfirmGame = Chiar vrei să ștergi acest joc de pe aparatul tău? Nu este cale de întoarcere.
DeleteConfirmGameConfig = Chiar vrei să ștergi setările pt. acest joc?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Nu s-au putut șterge datele.
+2 -2
View File
@@ -400,9 +400,9 @@ Corrupted Data = Данные повреждены
Delete = Удалить
Delete all = Удалить всё
Delete completed = Удаление завершено
DeleteConfirm = Эти данные будут удалены.\nХотите продолжить?
DeleteConfirm = Эти данные будут удалены. Хотите продолжить?
DeleteConfirmAll = Вы уверены, что хотите удалить сохранения для данной игры?
DeleteConfirmGame = Вы уверены, что хотите безвозвратно удалить\nданную игру с вашего устройства?
DeleteConfirmGame = Вы уверены, что хотите безвозвратно удалить данную игру с вашего устройства?
DeleteConfirmGameConfig = Вы уверены, что хотите удалить настройки данной игры?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Не удалось удалить данные.
+3 -3
View File
@@ -401,9 +401,9 @@ Corrupted Data = Korrupt data
Delete = Radera
Delete all = Radera allt
Delete completed = Borttaget.
DeleteConfirm = All sparad data tas bort.\nÄr du säker på att du vill göra detta?
DeleteConfirmAll = Vill du verkligen ta bort all\nsparad data för spelet?
DeleteConfirmGame = Vill du verkligen ta bort det här spelet\nfrån din enhet? Detta kan inte ångras.
DeleteConfirm = All sparad data tas bort. Är du säker på att du vill göra detta?
DeleteConfirmAll = Vill du verkligen ta bort all sparad data för spelet?
DeleteConfirmGame = Vill du verkligen ta bort det här spelet från din enhet? Detta kan inte ångras.
DeleteConfirmGameConfig = Vill du verkligen ta bort inställningarna för det här spelet?
DeleteConfirmSaveState = Är du säker på att du vill radera detta sparade tillstånd permanent?
DeleteFailed = Misslyckades med att ta bort data.
+3 -3
View File
@@ -401,9 +401,9 @@ Corrupted Data = Corrupted ang data
Delete = Burahin
Delete all = Burahin Lahat
Delete completed = Burado na.
DeleteConfirm = Ang save data na ito ay mabubura.\nGusto mo bang ituloy?
DeleteConfirmAll = Gusto mo bang burahin\nang save data ng larong ito?
DeleteConfirmGame = Gusto mo bang burahin ang larong ito\nsa iyong device? Wala ng undo ito.
DeleteConfirm = Ang save data na ito ay mabubura. Gusto mo bang ituloy?
DeleteConfirmAll = Gusto mo bang burahin ang save data ng larong ito?
DeleteConfirmGame = Gusto mo bang burahin ang larong ito sa iyong device? Wala ng undo ito.
DeleteConfirmGameConfig = Sigurado ka bang burahin ang settings ng larong ito?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Hindi mabura ang datos.
+3 -3
View File
@@ -416,9 +416,9 @@ Corrupted Data = ข้อมูลเสียหาย
Delete = ลบ
Delete all = ลบทั้งหมด
Delete completed = ลบข้อมูลสำเร็จ
DeleteConfirm = ข้อมูลเซฟนี้จะถูกลบ\nคุณต้องการที่จะดำเนินการต่อหรือไม่?
DeleteConfirmAll = ข้อมูลเซฟของเกมนี้ทั้งหมดจะถูกลบ\nคุณต้องการที่จะดำเนินการต่อหรือไม่?
DeleteConfirmGame = คุณต้องการลบเกมทั้งหมดที่อยู่ในอุปกรณ์ของคุณหรือไม่?\nหากกดตกลงแล้วจะไม่สามารถยกเลิกได้
DeleteConfirm = ข้อมูลเซฟนี้จะถูกลบ คุณต้องการที่จะดำเนินการต่อหรือไม่?
DeleteConfirmAll = ข้อมูลเซฟของเกมนี้ทั้งหมดจะถูกลบ คุณต้องการที่จะดำเนินการต่อหรือไม่?
DeleteConfirmGame = คุณต้องการลบเกมทั้งหมดที่อยู่ในอุปกรณ์ของคุณหรือไม่? หากกดตกลงแล้วจะไม่สามารถยกเลิกได้
DeleteConfirmGameConfig = คุณแน่ใจนะว่าต้องการลบการตั้งค่าเฉพาะของเกมนี้?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = ไม่สามารถลบข้อมูลนี้ได้
+2 -2
View File
@@ -402,9 +402,9 @@ Corrupted Data = Bozuk veri
Delete = Sil
Delete all = Tümünü sil
Delete completed = Silme işlemi tamamlandı.
DeleteConfirm = Bu kayıt silinecek.\nDevam etmek istiyor musunuz?
DeleteConfirm = Bu kayıt silinecek. Devam etmek istiyor musunuz?
DeleteConfirmAll = Bu oyun için bütün kayıtları silmek istediğine emin misin?
DeleteConfirmGame = Bu oyunu cihazından silmek istediğine emin misin?\nBunu geri alamazsın.
DeleteConfirmGame = Bu oyunu cihazından silmek istediğine emin misin? Bunu geri alamazsın.
DeleteConfirmGameConfig = Bu oyun için ayarları silmek istediğine emin misin?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Veri silinemedi.
+4 -4
View File
@@ -400,10 +400,10 @@ Corrupted Data = Пошкоджені дані
Delete = Видалити
Delete all = Видалити все
Delete completed = Видалення завершено
DeleteConfirm = Ці дані будуть видалені.\nХочете продовжити?
DeleteConfirmAll = Всі збереження гри будуть видалені.\nВи впевнені, що хочете продовжити?
DeleteConfirmGame = Ця гра буде повністю видалена.\nВи впевнені, що хочете продовжити?
DeleteConfirmGameConfig = Параметри налаштування для цієї гри будуть видалені.\nВи впевнені, що хочете продовжити?
DeleteConfirm = Ці дані будуть видалені. Хочете продовжити?
DeleteConfirmAll = Всі збереження гри будуть видалені. Ви впевнені, що хочете продовжити?
DeleteConfirmGame = Ця гра буде повністю видалена. Ви впевнені, що хочете продовжити?
DeleteConfirmGameConfig = Параметри налаштування для цієї гри будуть видалені. Ви впевнені, що хочете продовжити?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Неможливо видалити дані.
Deleting = Видалення\nБудь ласка, зачекайте...
+4 -4
View File
@@ -400,10 +400,10 @@ Corrupted Data = Corrupted data
Delete = Xóa
Delete all = Xóa tất cả
Delete completed = Đã xóa xong.
DeleteConfirm = File save này sẽ bị xóa.\nBạn có muốn tiếp tục?
DeleteConfirmAll = Bạn có muốn xóa tất cả\ndữ liệu save của trò này??
DeleteConfirmGame = Bạn có muốn xóa trò này\nkhỏi thiết bị của bạn?
DeleteConfirmGameConfig = Bạn có muốn xóa thiết lập\nđối với game này?
DeleteConfirm = File save này sẽ bị xóa. Bạn có muốn tiếp tục?
DeleteConfirmAll = Bạn có muốn xóa tất cả dữ liệu save của trò này??
DeleteConfirmGame = Bạn có muốn xóa trò này khỏi thiết bị của bạn?
DeleteConfirmGameConfig = Bạn có muốn xóa thiết lập đối với game này?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = Không thể xóa dữ liệu này.
Deleting = Đang xóa\nXin đợi...
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = 数据损坏
Delete = 删除
Delete all = 清除
Delete completed = 已删除。
DeleteConfirm = 存档将被删除。\n您确定要继续吗?
DeleteConfirmAll = 将删除此游戏的所有存档。\n您确定要这样做吗?
DeleteConfirmGame = 将删除此游戏的文件,且不能复原。\n您确定要这样做吗?
DeleteConfirm = 存档将被删除。 您确定要继续吗?
DeleteConfirmAll = 将删除此游戏的所有存档。 您确定要这样做吗?
DeleteConfirmGame = 将删除此游戏的文件,且不能复原。 您确定要这样做吗?
DeleteConfirmGameConfig = 您确定要删除此游戏的设置吗?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = 无法删除存档。
+3 -3
View File
@@ -400,9 +400,9 @@ Corrupted Data = 已損毀的資料
Delete = 刪除
Delete all = 全部刪除
Delete completed = 刪除完成
DeleteConfirm = 這個存檔的資料將被刪除\n仍要繼續嗎?
DeleteConfirmAll = 您確定要刪除\n這個遊戲的全部存檔資料嗎?
DeleteConfirmGame = 您確定要從您的裝置上刪除這個遊戲嗎?\n您無法復原此動作。
DeleteConfirm = 這個存檔的資料將被刪除 仍要繼續嗎?
DeleteConfirmAll = 您確定要刪除 這個遊戲的全部存檔資料嗎?
DeleteConfirmGame = 您確定要從您的裝置上刪除這個遊戲嗎? 您無法復原此動作。
DeleteConfirmGameConfig = 您確定要刪除這個遊戲的全部設定嗎?
DeleteConfirmSaveState = Are you sure you want to permanently delete this save state?
DeleteFailed = 無法刪除資料