diff --git a/Common/Render/Text/draw_text_android.cpp b/Common/Render/Text/draw_text_android.cpp index c82bbc16da..3e43e8b691 100644 --- a/Common/Render/Text/draw_text_android.cpp +++ b/Common/Render/Text/draw_text_android.cpp @@ -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; diff --git a/Common/UI/PopupScreens.cpp b/Common/UI/PopupScreens.cpp index 4be6d1467b..6de6b6482d 100644 --- a/Common/UI/PopupScreens.cpp +++ b/Common/UI/PopupScreens.cpp @@ -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(this, &UIScreen::OnOK); + if (!button2_.empty()) { + buttonRow->Add(new Choice(button2_, new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Handle(this, &UIScreen::OnCancel); + } + } else { + if (!button2_.empty()) { + buttonRow->Add(new Choice(button2_, new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Handle(this, &UIScreen::OnCancel); + } + defaultButton_ = buttonRow->Add(new Choice(button1_, button1Image_, new LinearLayoutParams(1.0f, buttonMargins))); + defaultButton_->OnClick.Handle(this, &UIScreen::OnOK); + } + + box_->Add(buttonRow); + } +} + void MessagePopupScreen::CreatePopupContents(UI::ViewGroup *parent) { using namespace UI; UIContext &dc = *screenManager()->getUIContext(); std::vector 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(); } diff --git a/Common/UI/PopupScreens.h b/Common/UI/PopupScreens.h index b93ff85f8e..6042dea487 100644 --- a/Common/UI/PopupScreens.h +++ b/Common/UI/PopupScreens.h @@ -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 callback) + MessagePopupScreen(std::string_view title, std::string_view message, std::string_view button1, std::string_view button2, std::function 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; diff --git a/Common/UI/UIScreen.cpp b/Common/UI/UIScreen.cpp index c5e299708e..be5eec16fe 100644 --- a/Common/UI/UIScreen.cpp +++ b/Common/UI/UIScreen.cpp @@ -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(this, &UIScreen::OnOK); - if (!button2_.empty()) - buttonRow->Add(new Button(button2_, new LinearLayoutParams(1.0f, buttonMargins)))->OnClick.Handle(this, &UIScreen::OnCancel); - } else { - if (!button2_.empty()) - buttonRow->Add(new Button(button2_, new LinearLayoutParams(1.0f)))->OnClick.Handle(this, &UIScreen::OnCancel); - defaultButton_ = buttonRow->Add(new Button(button1_, new LinearLayoutParams(1.0f))); - defaultButton_->OnClick.Handle(this, &UIScreen::OnOK); - } - - box_->Add(buttonRow); - } -} diff --git a/Common/UI/UIScreen.h b/Common/UI/UIScreen.h index 5fc9dea39e..c6b55cc679 100644 --- a/Common/UI/UIScreen.h +++ b/Common/UI/UIScreen.h @@ -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; -}; diff --git a/Common/UI/View.cpp b/Common/UI/View.cpp index 3e446169ca..8e5cb7870e 100644 --- a/Common/UI/View.cpp +++ b/Common/UI/View.cpp @@ -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); } diff --git a/Common/UI/View.h b/Common/UI/View.h index d196a347d7..80ba75612d 100644 --- a/Common/UI/View.h +++ b/Common/UI/View.h @@ -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; diff --git a/Common/UI/ViewGroup.cpp b/Common/UI/ViewGroup.cpp index f3c0326d1c..434c05e0e0 100644 --- a/Common/UI/ViewGroup.cpp +++ b/Common/UI/ViewGroup.cpp @@ -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. diff --git a/Common/UI/ViewGroup.h b/Common/UI/ViewGroup.h index 76a74e1d87..899f80be93 100644 --- a/Common/UI/ViewGroup.h +++ b/Common/UI/ViewGroup.h @@ -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; diff --git a/Tools/langtool/Cargo.lock b/Tools/langtool/Cargo.lock index 4ae92b3a49..5acb829b4b 100644 --- a/Tools/langtool/Cargo.lock +++ b/Tools/langtool/Cargo.lock @@ -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", ] diff --git a/Tools/langtool/src/main.rs b/Tools/langtool/src/main.rs index a7ef497613..372b06744a 100644 --- a/Tools/langtool/src/main.rs +++ b/Tools/langtool/src/main.rs @@ -90,6 +90,10 @@ enum Command { language: String, section: Option, }, + 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(); + } _ => {} } diff --git a/Tools/langtool/src/section.rs b/Tools/langtool/src/section.rs index 2e96f6bdd9..5256c6a733 100644 --- a/Tools/langtool/src/section.rs +++ b/Tools/langtool/src/section.rs @@ -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 { for line in self.lines.iter() { let prefix = if let Some(pos) = line.find(" =") { diff --git a/UI/ChatScreen.cpp b/UI/ChatScreen.cpp index 208e8d7800..0a9b0f7cf9 100644 --- a/UI/ChatScreen.cpp +++ b/UI/ChatScreen.cpp @@ -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; diff --git a/UI/ControlMappingScreen.cpp b/UI/ControlMappingScreen.cpp index dc75458cec..83b2b9fcf7 100644 --- a/UI/ControlMappingScreen.cpp +++ b/UI/ControlMappingScreen.cpp @@ -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); diff --git a/UI/ControlMappingScreen.h b/UI/ControlMappingScreen.h index 18760ef1a7..43bb825085 100644 --- a/UI/ControlMappingScreen.h +++ b/UI/ControlMappingScreen.h @@ -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 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 callback, I18NCat i18n) : PopupScreen(T(i18n, "Map Mouse"), "", ""), callback_(callback) {} diff --git a/UI/CustomButtonMappingScreen.cpp b/UI/CustomButtonMappingScreen.cpp index 4456a00831..ded01b9e60 100644 --- a/UI/CustomButtonMappingScreen.cpp +++ b/UI/CustomButtonMappingScreen.cpp @@ -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 { diff --git a/UI/DevScreens.h b/UI/DevScreens.h index 9bc256dcad..026e86ce85 100644 --- a/UI/DevScreens.h +++ b/UI/DevScreens.h @@ -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"; } diff --git a/UI/DisplayLayoutScreen.cpp b/UI/DisplayLayoutScreen.cpp index d6599c01c1..4e34406bae 100644 --- a/UI/DisplayLayoutScreen.cpp +++ b/UI/DisplayLayoutScreen.cpp @@ -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); } diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index b404ff6ae5..32c6cea58c 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -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"); diff --git a/UI/GPUDriverTestScreen.cpp b/UI/GPUDriverTestScreen.cpp index cdc9cf5529..29ebd09cf2 100644 --- a/UI/GPUDriverTestScreen.cpp +++ b/UI/GPUDriverTestScreen.cpp @@ -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)); diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index 49cb3b9ce7..1f7624b313 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -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 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 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 info = g_gameInfoCache->GetInfo(NULL, gamePath, GameInfoFlags::PARAM_SFO); @@ -501,6 +502,7 @@ void GameScreen::OnDeleteGame(UI::EventParams &e) { std::shared_ptr 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 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) { diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index a6bfec6411..8ff2c35283 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1709,17 +1709,23 @@ void TriggerRestart(const char *why, bool editThenRestore, const Path &gamePath) System_RestartApp(param); } +void GameSettingsScreen::TriggerRestartOrDo(std::function 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_; + }); } } diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index 8f41c59ce9..c87d1f674f 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -106,6 +106,8 @@ private: void OnAdhocGuides(UI::EventParams &e); + void TriggerRestartOrDo(std::function 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 *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; diff --git a/UI/GamepadEmu.cpp b/UI/GamepadEmu.cpp index ea242c1e85..6c48d6e1d8 100644 --- a/UI/GamepadEmu.cpp +++ b/UI/GamepadEmu.cpp @@ -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. diff --git a/UI/IAPScreen.cpp b/UI/IAPScreen.cpp index 46f62f40b0..e34e2bf856 100644 --- a/UI/IAPScreen.cpp +++ b/UI/IAPScreen.cpp @@ -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); diff --git a/UI/IAPScreen.h b/UI/IAPScreen.h index 51dd91a740..831a8a9962 100644 --- a/UI/IAPScreen.h +++ b/UI/IAPScreen.h @@ -5,6 +5,7 @@ #include "ppsspp_config.h" #include "UI/BaseScreens.h" +#include "UI/SimpleDialogScreen.h" class IAPScreen : public UIBaseDialogScreen { public: diff --git a/UI/JitCompareScreen.h b/UI/JitCompareScreen.h index 189f47426f..a93d57184e 100644 --- a/UI/JitCompareScreen.h +++ b/UI/JitCompareScreen.h @@ -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") {} diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index ff5840c955..91b5eb7a13 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -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 diff --git a/UI/MainScreen.h b/UI/MainScreen.h index ff199aec91..5c9a694ee6 100644 --- a/UI/MainScreen.h +++ b/UI/MainScreen.h @@ -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; diff --git a/UI/MiscViews.cpp b/UI/MiscViews.cpp index 1d6fbe8c15..42767595cf 100644 --- a/UI/MiscViews.cpp +++ b/UI/MiscViews.cpp @@ -83,9 +83,9 @@ void SettingInfoMessage::Show(std::string_view text, const UI::View *refView) { const UI::AnchorLayoutParams *lp = GetLayoutParams()->As(); 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)); } } } diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 40ab3d73d0..b363a2b546 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -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 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 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 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 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(); + } + })); } diff --git a/UI/PauseScreen.h b/UI/PauseScreen.h index 9cd3b7e66f..4f091a2e3d 100644 --- a/UI/PauseScreen.h +++ b/UI/PauseScreen.h @@ -39,7 +39,6 @@ public: protected: void CreateViews() override; void update() override; - void CallbackDeleteConfig(bool yes); UI::Margins RootMargins() const override; private: diff --git a/UI/SavedataScreen.cpp b/UI/SavedataScreen.cpp index f0a5970b28..8c3d1ba4ed 100644 --- a/UI/SavedataScreen.cpp +++ b/UI/SavedataScreen.cpp @@ -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(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(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 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_); }); } diff --git a/UI/TabbedDialogScreen.cpp b/UI/TabbedDialogScreen.cpp index 6b35730003..82421b268d 100644 --- a/UI/TabbedDialogScreen.cpp +++ b/UI/TabbedDialogScreen.cpp @@ -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_); diff --git a/UI/TiltAnalogSettingsScreen.cpp b/UI/TiltAnalogSettingsScreen.cpp index 6590640a30..13bcb2e9bd 100644 --- a/UI/TiltAnalogSettingsScreen.cpp +++ b/UI/TiltAnalogSettingsScreen.cpp @@ -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); diff --git a/UI/TouchControlLayoutScreen.cpp b/UI/TouchControlLayoutScreen.cpp index e8c1b3e143..efe8cfb171 100644 --- a/UI/TouchControlLayoutScreen.cpp +++ b/UI/TouchControlLayoutScreen.cpp @@ -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 diff --git a/UI/TouchControlVisibilityScreen.cpp b/UI/TouchControlVisibilityScreen.cpp index 1f0720bbcb..a0659c0dd8 100644 --- a/UI/TouchControlVisibilityScreen.cpp +++ b/UI/TouchControlVisibilityScreen.cpp @@ -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(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); diff --git a/Windows/HidInputDevice.cpp b/Windows/HidInputDevice.cpp index 1ebb83ea71..cee349b3d9 100644 --- a/Windows/HidInputDevice.cpp +++ b/Windows/HidInputDevice.cpp @@ -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; } diff --git a/Windows/main.cpp b/Windows/main.cpp index ec2ce66450..d9ab4c470a 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -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; } diff --git a/assets/lang/ar_AE.ini b/assets/lang/ar_AE.ini index fbe8359740..d1f6f2ba72 100644 --- a/assets/lang/ar_AE.ini +++ b/assets/lang/ar_AE.ini @@ -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 = ‎غير قادر علي مسح البيانات. diff --git a/assets/lang/az_AZ.ini b/assets/lang/az_AZ.ini index af89da9578..e3dbab7aa5 100644 --- a/assets/lang/az_AZ.ini +++ b/assets/lang/az_AZ.ini @@ -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. diff --git a/assets/lang/be_BY.ini b/assets/lang/be_BY.ini index 87a9f273ad..5381eb6f6b 100644 --- a/assets/lang/be_BY.ini +++ b/assets/lang/be_BY.ini @@ -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? diff --git a/assets/lang/bg_BG.ini b/assets/lang/bg_BG.ini index 1ab2976173..d8c25d88de 100644 --- a/assets/lang/bg_BG.ini +++ b/assets/lang/bg_BG.ini @@ -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. diff --git a/assets/lang/ca_ES.ini b/assets/lang/ca_ES.ini index 0363ea9b6f..b01fb0ab52 100644 --- a/assets/lang/ca_ES.ini +++ b/assets/lang/ca_ES.ini @@ -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. diff --git a/assets/lang/cz_CZ.ini b/assets/lang/cz_CZ.ini index 2e2540c6fe..0d9c6daf40 100644 --- a/assets/lang/cz_CZ.ini +++ b/assets/lang/cz_CZ.ini @@ -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. diff --git a/assets/lang/da_DK.ini b/assets/lang/da_DK.ini index ee9b01d233..d626d513b0 100644 --- a/assets/lang/da_DK.ini +++ b/assets/lang/da_DK.ini @@ -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. diff --git a/assets/lang/de_DE.ini b/assets/lang/de_DE.ini index 0c59f33d11..f9d3f4c53b 100644 --- a/assets/lang/de_DE.ini +++ b/assets/lang/de_DE.ini @@ -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? diff --git a/assets/lang/dr_ID.ini b/assets/lang/dr_ID.ini index e3cc32a374..3566dde571 100644 --- a/assets/lang/dr_ID.ini +++ b/assets/lang/dr_ID.ini @@ -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. diff --git a/assets/lang/en_US.ini b/assets/lang/en_US.ini index d8ea305ea6..0d01efbeeb 100644 --- a/assets/lang/en_US.ini +++ b/assets/lang/en_US.ini @@ -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? diff --git a/assets/lang/es_LA.ini b/assets/lang/es_LA.ini index f589e5f809..0cf6520943 100644 --- a/assets/lang/es_LA.ini +++ b/assets/lang/es_LA.ini @@ -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... diff --git a/assets/lang/fa_IR.ini b/assets/lang/fa_IR.ini index c029bdba22..a6cba3f4e4 100644 --- a/assets/lang/fa_IR.ini +++ b/assets/lang/fa_IR.ini @@ -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. diff --git a/assets/lang/fi_FI.ini b/assets/lang/fi_FI.ini index 4e1224c5d1..d52c10b8db 100644 --- a/assets/lang/fi_FI.ini +++ b/assets/lang/fi_FI.ini @@ -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. diff --git a/assets/lang/fr_FR.ini b/assets/lang/fr_FR.ini index 98c0d9dfc3..d9d5ed22c8 100644 --- a/assets/lang/fr_FR.ini +++ b/assets/lang/fr_FR.ini @@ -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. diff --git a/assets/lang/gl_ES.ini b/assets/lang/gl_ES.ini index 61a0d841d9..4da4b84508 100644 --- a/assets/lang/gl_ES.ini +++ b/assets/lang/gl_ES.ini @@ -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. diff --git a/assets/lang/gr_EL.ini b/assets/lang/gr_EL.ini index 3d8c069e4a..99109d6ac8 100644 --- a/assets/lang/gr_EL.ini +++ b/assets/lang/gr_EL.ini @@ -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 = ΑΔΥΝΑΜΙΑ ΔΙΑΓΡΑΦΗΣ ΔΕΔΟΜΕΝΩΝ. diff --git a/assets/lang/hr_HR.ini b/assets/lang/hr_HR.ini index 3854ecc341..afdfe9b11d 100644 --- a/assets/lang/hr_HR.ini +++ b/assets/lang/hr_HR.ini @@ -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. diff --git a/assets/lang/hu_HU.ini b/assets/lang/hu_HU.ini index a8ee499b1a..f8b43f24e2 100644 --- a/assets/lang/hu_HU.ini +++ b/assets/lang/hu_HU.ini @@ -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. diff --git a/assets/lang/id_ID.ini b/assets/lang/id_ID.ini index 25269862b3..47c6a11069 100644 --- a/assets/lang/id_ID.ini +++ b/assets/lang/id_ID.ini @@ -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. diff --git a/assets/lang/it_IT.ini b/assets/lang/it_IT.ini index 2b239f90c5..189979eaf1 100644 --- a/assets/lang/it_IT.ini +++ b/assets/lang/it_IT.ini @@ -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. diff --git a/assets/lang/ja_JP.ini b/assets/lang/ja_JP.ini index bc7e408626..1ee291b49c 100644 --- a/assets/lang/ja_JP.ini +++ b/assets/lang/ja_JP.ini @@ -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 = データを削除できませんでした。 diff --git a/assets/lang/jv_ID.ini b/assets/lang/jv_ID.ini index ca61092652..26da6b096d 100644 --- a/assets/lang/jv_ID.ini +++ b/assets/lang/jv_ID.ini @@ -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. diff --git a/assets/lang/ko_KR.ini b/assets/lang/ko_KR.ini index 609e9a15cb..f6238d7a97 100644 --- a/assets/lang/ko_KR.ini +++ b/assets/lang/ko_KR.ini @@ -400,9 +400,9 @@ Corrupted Data = 손상된 데이터 Delete = 삭제 Delete all = 모두 삭제 Delete completed = 삭제가 완료되었습니다. -DeleteConfirm = 이 저장 데이터는 삭제됩니다.\n계속할까요? -DeleteConfirmAll = 이 게임에 대한 모든 저장 데이터를\n삭제할까요? -DeleteConfirmGame = 이 게임을 정말로 장치에서\n삭제할까요? 이 작업은 취소할 수 없습니다. +DeleteConfirm = 이 저장 데이터는 삭제됩니다. 계속할까요? +DeleteConfirmAll = 이 게임에 대한 모든 저장 데이터를 삭제할까요? +DeleteConfirmGame = 이 게임을 정말로 장치에서 삭제할까요? 이 작업은 취소할 수 없습니다. DeleteConfirmGameConfig = 이 게임의 설정을 삭제할까요? DeleteConfirmSaveState = 이 저장 상태를 영구적으로 삭제할까요? DeleteFailed = 데이터를 삭제할 수 없습니다. diff --git a/assets/lang/ku_SO.ini b/assets/lang/ku_SO.ini index 709b6c21a8..e4f8c3192a 100644 --- a/assets/lang/ku_SO.ini +++ b/assets/lang/ku_SO.ini @@ -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 = نەتوانرا زانیاریەکان بسڕدرێنەوە. diff --git a/assets/lang/lo_LA.ini b/assets/lang/lo_LA.ini index baa0d08645..52aa8936b9 100644 --- a/assets/lang/lo_LA.ini +++ b/assets/lang/lo_LA.ini @@ -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 = ບໍ່ສາມາດລຶບຂໍ້ມູນ. diff --git a/assets/lang/lt-LT.ini b/assets/lang/lt-LT.ini index f30e393fc7..401f77146b 100644 --- a/assets/lang/lt-LT.ini +++ b/assets/lang/lt-LT.ini @@ -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ų. diff --git a/assets/lang/ms_MY.ini b/assets/lang/ms_MY.ini index 977117ef06..c9961f1312 100644 --- a/assets/lang/ms_MY.ini +++ b/assets/lang/ms_MY.ini @@ -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. diff --git a/assets/lang/nl_NL.ini b/assets/lang/nl_NL.ini index 4d2ec8fb86..271b49abf1 100644 --- a/assets/lang/nl_NL.ini +++ b/assets/lang/nl_NL.ini @@ -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. diff --git a/assets/lang/no_NO.ini b/assets/lang/no_NO.ini index 2a9168a784..d10d581554 100644 --- a/assets/lang/no_NO.ini +++ b/assets/lang/no_NO.ini @@ -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. diff --git a/assets/lang/pl_PL.ini b/assets/lang/pl_PL.ini index 288c7ee9c7..e09d87844c 100644 --- a/assets/lang/pl_PL.ini +++ b/assets/lang/pl_PL.ini @@ -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ć... diff --git a/assets/lang/pt_BR.ini b/assets/lang/pt_BR.ini index e0f9712e08..581b29d4d7 100644 --- a/assets/lang/pt_BR.ini +++ b/assets/lang/pt_BR.ini @@ -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. diff --git a/assets/lang/pt_PT.ini b/assets/lang/pt_PT.ini index a7a48552da..af080c436e 100644 --- a/assets/lang/pt_PT.ini +++ b/assets/lang/pt_PT.ini @@ -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. diff --git a/assets/lang/ro_RO.ini b/assets/lang/ro_RO.ini index 4a2b57a609..55a084f2ee 100644 --- a/assets/lang/ro_RO.ini +++ b/assets/lang/ro_RO.ini @@ -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. diff --git a/assets/lang/ru_RU.ini b/assets/lang/ru_RU.ini index be5b016370..740b485e1d 100644 --- a/assets/lang/ru_RU.ini +++ b/assets/lang/ru_RU.ini @@ -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 = Не удалось удалить данные. diff --git a/assets/lang/sv_SE.ini b/assets/lang/sv_SE.ini index 5679360687..03e3547f9c 100644 --- a/assets/lang/sv_SE.ini +++ b/assets/lang/sv_SE.ini @@ -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. diff --git a/assets/lang/tg_PH.ini b/assets/lang/tg_PH.ini index fac3e7a7fc..1f9ff13f43 100644 --- a/assets/lang/tg_PH.ini +++ b/assets/lang/tg_PH.ini @@ -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. diff --git a/assets/lang/th_TH.ini b/assets/lang/th_TH.ini index 3235b31359..46a7433239 100644 --- a/assets/lang/th_TH.ini +++ b/assets/lang/th_TH.ini @@ -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 = ไม่สามารถลบข้อมูลนี้ได้ diff --git a/assets/lang/tr_TR.ini b/assets/lang/tr_TR.ini index 75413084d3..7f7f1ae09f 100644 --- a/assets/lang/tr_TR.ini +++ b/assets/lang/tr_TR.ini @@ -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. diff --git a/assets/lang/uk_UA.ini b/assets/lang/uk_UA.ini index 682d06d4c0..c2a13233c9 100644 --- a/assets/lang/uk_UA.ini +++ b/assets/lang/uk_UA.ini @@ -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Будь ласка, зачекайте... diff --git a/assets/lang/vi_VN.ini b/assets/lang/vi_VN.ini index f3a6270842..3af9870eec 100644 --- a/assets/lang/vi_VN.ini +++ b/assets/lang/vi_VN.ini @@ -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... diff --git a/assets/lang/zh_CN.ini b/assets/lang/zh_CN.ini index 13e9998e30..0de2290194 100644 --- a/assets/lang/zh_CN.ini +++ b/assets/lang/zh_CN.ini @@ -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 = 无法删除存档。 diff --git a/assets/lang/zh_TW.ini b/assets/lang/zh_TW.ini index 1b5e430703..84a43b02e6 100644 --- a/assets/lang/zh_TW.ini +++ b/assets/lang/zh_TW.ini @@ -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 = 無法刪除資料