Merge pull request #20967 from hrydgard/assorted-ui-work

Add icons to the tabs on the main settings page
This commit is contained in:
Henrik Rydgård
2025-11-05 16:04:36 +01:00
committed by GitHub
20 changed files with 225 additions and 176 deletions
+21 -7
View File
@@ -9,7 +9,7 @@
namespace UI {
TabHolder::TabHolder(Orientation orientation, float stripSize, TabHolderFlags flags, View *bannerView, LayoutParams *layoutParams)
: LinearLayout(Opposite(orientation), layoutParams) {
: LinearLayout(Opposite(orientation), layoutParams), orientation_(orientation), flags_(flags) {
SetSpacing(0.0f);
if (orientation == ORIENT_HORIZONTAL) {
// This orientation supports adding a back button.
@@ -34,6 +34,8 @@ TabHolder::TabHolder(Orientation orientation, float stripSize, TabHolderFlags fl
}
} else {
tabContainer_ = new LinearLayout(ORIENT_VERTICAL, new LayoutParams(stripSize, FILL_PARENT));
tabContainer_->Add(new Spacer(8.0f));
tabContainer_->SetSpacing(0.0f);
tabStrip_ = new ChoiceStrip(orientation, new LayoutParams(FILL_PARENT, FILL_PARENT));
tabStrip_->SetTopTabs(true);
tabScroll_ = new ScrollView(orientation, new LinearLayoutParams(1.0f));
@@ -62,9 +64,15 @@ void TabHolder::AddBack(UIScreen *parent) {
}
}
void TabHolder::AddTabContents(std::string_view title, ViewGroup *tabContents) {
void TabHolder::AddTabContents(std::string_view title, ImageID imageId, ViewGroup *tabContents) {
tabs_.push_back(tabContents);
tabStrip_->AddChoice(title);
if (orientation_ == ORIENT_HORIZONTAL && (flags_ & TabHolderFlags::HorizontalOnlyIcons) && imageId.isValid()) {
tabStrip_->AddChoice(imageId);
} else if (orientation_ == ORIENT_VERTICAL && (flags_ & TabHolderFlags::VerticalShowIcons) && imageId.isValid()) {
tabStrip_->AddChoice(title, imageId);
} else {
tabStrip_->AddChoice(title);
}
contents_->Add(tabContents);
if (tabs_.size() > 1)
tabContents->SetVisibility(V_GONE);
@@ -76,9 +84,15 @@ void TabHolder::AddTabContents(std::string_view title, ViewGroup *tabContents) {
createFuncs_.push_back(nullptr);
}
void TabHolder::AddTabDeferred(std::string_view title, std::function<ViewGroup *()> createCb) {
void TabHolder::AddTabDeferred(std::string_view title, ImageID imageId, std::function<ViewGroup *()> createCb) {
tabs_.push_back(nullptr); // marker
tabStrip_->AddChoice(title);
if (orientation_ == ORIENT_HORIZONTAL && (flags_ & TabHolderFlags::HorizontalOnlyIcons) && imageId.isValid()) {
tabStrip_->AddChoice(imageId);
} else if (orientation_ == ORIENT_VERTICAL && (flags_ & TabHolderFlags::VerticalShowIcons) && imageId.isValid()) {
tabStrip_->AddChoice(title, imageId);
} else {
tabStrip_->AddChoice(title);
}
tabTweens_.push_back(nullptr);
createFuncs_.push_back(createCb);
@@ -223,8 +237,8 @@ ChoiceStrip::ChoiceStrip(Orientation orientation, LayoutParams *layoutParams)
SetSpacing(0.0f);
}
void ChoiceStrip::AddChoice(std::string_view title) {
StickyChoice *c = new StickyChoice(title, "",
void ChoiceStrip::AddChoice(std::string_view title, ImageID imageId) {
StickyChoice *c = new StickyChoice(title, imageId,
orientation_ == ORIENT_HORIZONTAL ?
nullptr :
new LinearLayoutParams(FILL_PARENT, ITEM_HEIGHT));
+9 -5
View File
@@ -14,6 +14,8 @@ class ScrollView;
enum class TabHolderFlags {
Default = 0,
BackButton = 1,
HorizontalOnlyIcons = 2,
VerticalShowIcons = 4,
};
ENUM_CLASS_BITOPS(TabHolderFlags);
@@ -22,11 +24,11 @@ public:
TabHolder(Orientation orientation, float stripSize, TabHolderFlags flags, View *bannerView, LayoutParams *layoutParams);
template <class T>
T *AddTab(std::string_view title, T *tabContents) {
AddTabContents(title, tabContents);
T *AddTab(std::string_view title, ImageID imageId, T *tabContents) {
AddTabContents(title, imageId, tabContents);
return tabContents;
}
void AddTabDeferred(std::string_view title, std::function<ViewGroup *()> createCb);
void AddTabDeferred(std::string_view title, ImageID imageId, std::function<ViewGroup *()> createCb);
void EnableTab(int tab, bool enabled);
void AddBack(UIScreen *parent);
@@ -48,7 +50,7 @@ public:
}
private:
void AddTabContents(std::string_view title, ViewGroup *tabContents);
void AddTabContents(std::string_view title, ImageID imageId, ViewGroup *tabContents);
void OnTabClick(EventParams &e);
bool EnsureTab(int index); // return true if it actually created a tab.
@@ -57,7 +59,9 @@ private:
ChoiceStrip *tabStrip_ = nullptr;
ScrollView *tabScroll_ = nullptr;
ViewGroup *contents_ = nullptr;
Orientation orientation_ = ORIENT_HORIZONTAL;
TabHolderFlags flags_ = TabHolderFlags::Default;
int currentTab_ = 0;
std::vector<ViewGroup *> tabs_;
std::vector<AnchorTranslateTween *> tabTweens_;
@@ -68,7 +72,7 @@ class ChoiceStrip : public LinearLayout {
public:
ChoiceStrip(Orientation orientation, LayoutParams *layoutParams = 0);
void AddChoice(std::string_view title);
void AddChoice(std::string_view title, ImageID imageId = ImageID::invalid());
void AddChoice(ImageID buttonImage);
int GetSelection() const { return selected_; }
+22 -14
View File
@@ -468,11 +468,6 @@ 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;
if (image_.isValid()) {
dc.Draw()->GetAtlas()->measureImage(image_, &w, &h);
totalW = w * imgScale_ + 6;
totalH = h * imgScale_;
}
if (!text_.empty()) {
const int paddingX = 12;
float availWidth = horiz.size - paddingX * 2 - textPadding_.horiz() - totalW;
@@ -488,6 +483,16 @@ void Choice::GetContentDimensionsBySpec(const UIContext &dc, MeasureSpec horiz,
dc.MeasureTextRect(dc.GetTheme().uiFont, scale, scale, text_, availBounds, &textW, &textH, FLAG_WRAP_TEXT);
totalH = std::max(totalH, textH);
totalW += textW;
if (image_.isValid()) {
totalW += 12;
totalW += totalH;
}
} else {
if (image_.isValid()) {
dc.Draw()->GetAtlas()->measureImage(image_, &w, &h);
totalW = w * imgScale_ + 6;
totalH = h * imgScale_;
}
}
w = totalW + (text_.empty() ? 16 : 24);
@@ -508,17 +513,20 @@ void Choice::Draw(UIContext &dc) {
} else if (!text_.empty() && !hideTitle_) {
dc.SetFontStyle(dc.GetTheme().uiFont);
int paddingX = 12;
float availWidth = bounds_.w - paddingX * 2 - textPadding_.horiz();
int paddingLeft = 12;
int paddingRight = 12;
float availWidth = bounds_.w - (paddingLeft + paddingRight + textPadding_.horiz());
if (image_.isValid()) {
paddingLeft = 0;
const AtlasImage *image = dc.Draw()->GetAtlas()->getImage(image_);
if (image) {
_dbg_assert_(image);
paddingX += image->w + 6;
availWidth -= image->w + 6;
// TODO: Use scale rotation and flip here as well (DrawImageRotated is always ALIGN_CENTER for now)
dc.Draw()->DrawImage(image_, bounds_.x + 6, bounds_.centerY(), 1.0f, style.fgColor, ALIGN_LEFT | ALIGN_VCENTER);
dc.Draw()->DrawImage(image_, bounds_.x + bounds_.h * 0.5f + paddingLeft, bounds_.centerY(), 1.0f, style.fgColor, ALIGN_CENTER);
paddingLeft += bounds_.h;
availWidth -= bounds_.h;
}
}
@@ -528,12 +536,12 @@ void Choice::Draw(UIContext &dc) {
if (rightIconImage_.isValid()) {
uint32_t col = rightIconKeepColor_ ? 0xffffffff : style.fgColor; // Don't apply theme to gold icon
if (shine_) {
Bounds b = Bounds::FromCenter(bounds_.x2() - 32 - paddingX, bounds_.centerY(), bounds_.h * 0.4f);
Bounds b = Bounds::FromCenter(bounds_.x2() - 32 - paddingRight, bounds_.centerY(), bounds_.h * 0.4f);
DrawIconShine(dc, b.Inset(5.0f, 5.0f), 0.65f, false);
}
dc.Draw()->DrawImageRotated(rightIconImage_, bounds_.x2() - 32 - paddingX, bounds_.centerY(), rightIconScale_, rightIconRot_, col, rightIconFlipH_);
dc.Draw()->DrawImageRotated(rightIconImage_, bounds_.x2() - 32 - paddingRight, bounds_.centerY(), rightIconScale_, rightIconRot_, col, rightIconFlipH_);
}
Bounds textBounds(bounds_.x + paddingX + textPadding_.left, bounds_.y, availWidth, bounds_.h);
Bounds textBounds(bounds_.x + paddingLeft + textPadding_.left, bounds_.y, availWidth, bounds_.h);
dc.DrawTextRectSqueeze(text_, textBounds, style.fgColor, ALIGN_VCENTER | FLAG_WRAP_TEXT | drawTextFlags_);
}
dc.SetFontScale(1.0f, 1.0f);
@@ -629,7 +637,7 @@ void CollapsibleHeader::Draw(UIContext &dc) {
float xoff = 37.0f;
dc.SetFontStyle(dc.GetTheme().uiFontSmall);
dc.DrawText(text_, bounds_.x + 4 + xoff, bounds_.centerY(), style.fgColor, ALIGN_LEFT | ALIGN_VCENTER);
dc.DrawText(text_, bounds_.x + 6 + xoff, bounds_.centerY(), style.fgColor, ALIGN_LEFT | ALIGN_VCENTER);
dc.Draw()->DrawImageCenterTexel(dc.GetTheme().whiteImage, bounds_.x, bounds_.y2() - 2, bounds_.x2(), bounds_.y2(), style.fgColor);
if (hasSubItems_) {
dc.Draw()->DrawImageRotated(ImageID("I_ARROW"), bounds_.x + 20.0f, bounds_.y + 20.0f, 1.0f, *toggle_ ? -M_PI / 2 : M_PI, style.fgColor);
+6 -6
View File
@@ -30,8 +30,6 @@ struct KeyInput;
struct TouchInput;
struct AxisInput;
struct ImageID;
class DrawBuffer;
class Texture;
class UIContext;
@@ -778,10 +776,12 @@ private:
// Different key handling.
class StickyChoice : public Choice {
public:
StickyChoice(std::string_view text, std::string_view smallText = "", LayoutParams *layoutParams = 0)
StickyChoice(std::string_view text, std::string_view smallText = "", LayoutParams *layoutParams = nullptr)
: Choice(text, smallText, false, layoutParams) {}
StickyChoice(ImageID buttonImage, LayoutParams *layoutParams = 0)
StickyChoice(ImageID buttonImage, LayoutParams *layoutParams = nullptr)
: Choice(buttonImage, layoutParams) {}
StickyChoice(std::string_view text, ImageID image, LayoutParams *layoutParams = nullptr)
: Choice(text, image, layoutParams) {}
bool Key(const KeyInput &key) override;
bool Touch(const TouchInput &touch) override;
@@ -1033,8 +1033,8 @@ public:
Event OnClick;
private:
bool down_;
bool dragging_;
bool down_ = false;
bool dragging_ = false;
};
class TextEdit : public View {
+1
View File
@@ -752,6 +752,7 @@ void hleLagSync(u64 userdata, int cyclesLate) {
double now = before;
while (now < goal && goal < now + 0.01) {
// Tight loop on win32 - intentionally, as timing is otherwise not precise enough.
// TODO: Use the precise waits if available
#ifndef _WIN32
const double left = goal - now;
if (left > 0.0f && left < 1.0f) { // Sanity check
+2
View File
@@ -934,6 +934,8 @@ void DumpFileIfEnabled(const u8 *dataPtr, const u32 length, std::string_view nam
delete[] path;
}
}, path);
} else {
free(path);
}
return;
}
+1 -1
View File
@@ -146,7 +146,7 @@ void CustomButtonMappingScreen::CreateViews() {
root__->Add(leftColumn);
ScrollView *rightScroll = new ScrollView(ORIENT_VERTICAL, new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT, 1.0f));
leftColumn->Add(new Spacer(new LinearLayoutParams(1.0f)));
leftColumn->Add(new Choice(di->T("Back")))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
leftColumn->Add(new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK")))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
root__->Add(rightScroll);
LinearLayout *vertLayout = new LinearLayout(ORIENT_VERTICAL);
+1 -1
View File
@@ -557,7 +557,7 @@ void FrameDumpTestScreen::CreateViews() {
LinearLayout *dumps = new LinearLayoutList(ORIENT_VERTICAL);
dumps->SetSpacing(0);
dumpsScroll->Add(dumps);
tabHolder->AddTab("Dumps", dumpsScroll);
tabHolder->AddTab("Dumps", ImageID::invalid(), dumpsScroll);
dumps->Add(new ItemHeader("GE Frame Dumps"));
+3 -3
View File
@@ -303,10 +303,10 @@ void GPUDriverTestScreen::CreateViews() {
tabHolder_ = new TabHolder(ORIENT_HORIZONTAL, 30.0f, TabHolderFlags::Default, nullptr, new AnchorLayoutParams(FILL_PARENT, FILL_PARENT, false));
anchor->Add(tabHolder_);
tabHolder_->AddTab("Discard", new LinearLayout(ORIENT_VERTICAL));
tabHolder_->AddTab("Shader", new LinearLayout(ORIENT_VERTICAL));
tabHolder_->AddTab("Discard", ImageID::invalid(), new LinearLayout(ORIENT_VERTICAL));
tabHolder_->AddTab("Shader", ImageID::invalid(), new LinearLayout(ORIENT_VERTICAL));
Choice *back = new Choice(di->T("Back"), "", false, new AnchorLayoutParams(190, WRAP_CONTENT, 10, NONE, NONE, 10));
Choice *back = new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK"), new AnchorLayoutParams(190, WRAP_CONTENT, 10, NONE, NONE, 10));
back->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
anchor->Add(back);
}
+8 -9
View File
@@ -117,7 +117,7 @@ void SetMemStickDirDarwin(int requesterToken) {
#endif
GameSettingsScreen::GameSettingsScreen(const Path &gamePath, std::string gameID, bool editThenRestore)
: UITabbedBaseDialogScreen(gamePath), gameID_(gameID), editThenRestore_(editThenRestore) {
: UITabbedBaseDialogScreen(gamePath, TabDialogFlags::HorizontalOnlyIcons | TabDialogFlags::VerticalShowIcons), gameID_(gameID), editThenRestore_(editThenRestore) {
prevInflightFrames_ = g_Config.iInflightFrames;
analogSpeedMapped_ = KeyMap::InputMappingsFromPspButton(VIRTKEY_SPEED_ANALOG, nullptr, true);
}
@@ -221,35 +221,34 @@ void GameSettingsScreen::CreateTabs() {
using namespace UI;
auto ms = GetI18NCategory(I18NCat::MAINSETTINGS);
AddTab("GameSettingsGraphics", ms->T("Graphics"), [this](UI::LinearLayout *parent) {
AddTab("GameSettingsGraphics", ms->T("Graphics"), ImageID("I_DISPLAY"), [this](UI::LinearLayout *parent) {
CreateGraphicsSettings(parent);
});
AddTab("GameSettingsControls", ms->T("Controls"), [this](UI::LinearLayout *parent) {
AddTab("GameSettingsControls", ms->T("Controls"), ImageID("I_CONTROLLER"), [this](UI::LinearLayout *parent) {
CreateControlsSettings(parent);
});
AddTab("GameSettingsAudio", ms->T("Audio"), [this](UI::LinearLayout *parent) {
AddTab("GameSettingsAudio", ms->T("Audio"), ImageID("I_SPEAKER_MAX"), [this](UI::LinearLayout *parent) {
CreateAudioSettings(parent);
});
AddTab("GameSettingsNetworking", ms->T("Networking"), [this](UI::LinearLayout *parent) {
AddTab("GameSettingsNetworking", ms->T("Networking"), ImageID("I_WIFI"), [this](UI::LinearLayout *parent) {
CreateNetworkingSettings(parent);
});
AddTab("GameSettingsTools", ms->T("Tools"), [this](UI::LinearLayout *parent) {
AddTab("GameSettingsTools", ms->T("Tools"), ImageID("I_DEVMENU"), [this](UI::LinearLayout *parent) {
CreateToolsSettings(parent);
});
AddTab("GameSettingsSystem", ms->T("System"), [this](UI::LinearLayout *parent) {
AddTab("GameSettingsSystem", ms->T("System"), ImageID("I_GEAR"), [this](UI::LinearLayout *parent) {
parent->SetSpacing(0);
CreateSystemSettings(parent);
});
int deviceType = System_GetPropertyInt(SYSPROP_DEVICE_TYPE);
if ((deviceType == DEVICE_TYPE_VR) || g_Config.bForceVR) {
AddTab("GameSettingsVR", ms->T("VR"), [this](UI::LinearLayout *parent) {
AddTab("GameSettingsVR", ms->T("VR"), ImageID::invalid(), [this](UI::LinearLayout *parent) {
CreateVRSettings(parent);
});
}
+4 -4
View File
@@ -1099,7 +1099,7 @@ void MainScreen::CreateRecentTab() {
scrollRecentGames->Add(tabRecentGames);
gameBrowsers_.push_back(tabRecentGames);
tabHolder_->AddTab(mm->T("Recent"), scrollRecentGames);
tabHolder_->AddTab(mm->T("Recent"), ImageID::invalid(), scrollRecentGames);
tabRecentGames->OnChoice.Handle(this, &MainScreen::OnGameSelectedInstant);
tabRecentGames->OnHoldChoice.Handle(this, &MainScreen::OnGameSelected);
tabRecentGames->OnHighlight.Handle(this, &MainScreen::OnGameHighlight);
@@ -1119,7 +1119,7 @@ GameBrowser *MainScreen::CreateBrowserTab(const Path &path, std::string_view tit
scrollView->Add(gameBrowser);
gameBrowsers_.push_back(gameBrowser);
tabHolder_->AddTab(mm->T(title), scrollView);
tabHolder_->AddTab(mm->T(title), ImageID::invalid(), scrollView);
if (scrollPos) {
scrollView->RememberPosition(scrollPos);
}
@@ -1617,7 +1617,7 @@ void UmdReplaceScreen::CreateViews() {
Path("!RECENT"), BrowseFlags::NONE, &g_Config.bGridView1, screenManager(), "", "",
new LinearLayoutParams(FILL_PARENT, FILL_PARENT));
scrollRecentGames->Add(tabRecentGames);
leftColumn->AddTab(mm->T("Recent"), scrollRecentGames);
leftColumn->AddTab(mm->T("Recent"), ImageID::invalid(), scrollRecentGames);
tabRecentGames->OnChoice.Handle(this, &UmdReplaceScreen::OnGameSelected);
tabRecentGames->OnHoldChoice.Handle(this, &UmdReplaceScreen::OnGameSelected);
}
@@ -1630,7 +1630,7 @@ void UmdReplaceScreen::CreateViews() {
scrollAllGames->Add(tabAllGames);
leftColumn->AddTab(mm->T("Games"), scrollAllGames);
leftColumn->AddTab(mm->T("Games"), ImageID::invalid(), scrollAllGames);
tabAllGames->OnChoice.Handle(this, &UmdReplaceScreen::OnGameSelected);
+1 -1
View File
@@ -154,7 +154,7 @@ void UIBaseScreen::sendMessage(UIMessage message, const char *value) {
void UIBaseDialogScreen::AddStandardBack(UI::ViewGroup *parent) {
using namespace UI;
auto di = GetI18NCategory(I18NCat::DIALOG);
parent->Add(new Choice(di->T("Back"), "", false, new AnchorLayoutParams(190, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
parent->Add(new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK"), new AnchorLayoutParams(190, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
}
PromptScreen::PromptScreen(const Path &gamePath, std::string_view message, std::string_view yesButtonText, std::string_view noButtonText, std::function<void(bool)> callback)
+2 -2
View File
@@ -613,7 +613,7 @@ void RemoteISOBrowseScreen::CreateViews() {
scrollRecentGames->Add(tabRemoteGames);
gameBrowsers_.push_back(tabRemoteGames);
leftColumn->AddTab(ri->T("Remote Server"), scrollRecentGames);
leftColumn->AddTab(ri->T("Remote Server"), ImageID::invalid(), scrollRecentGames);
tabRemoteGames->OnChoice.Handle<MainScreen>(this, &MainScreen::OnGameSelectedInstant);
tabRemoteGames->OnHoldChoice.Handle<MainScreen>(this, &MainScreen::OnGameSelected);
tabRemoteGames->OnHighlight.Handle<MainScreen>(this, &MainScreen::OnGameHighlight);
@@ -623,7 +623,7 @@ void RemoteISOBrowseScreen::CreateViews() {
rightColumnItems->SetSpacing(0.0f);
rightColumn->Add(rightColumnItems);
rightColumnItems->Add(new Choice(di->T("Back"), "", false, new AnchorLayoutParams(150, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
rightColumnItems->Add(new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK"), new AnchorLayoutParams(150, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
if (portrait) {
root_ = new LinearLayout(ORIENT_VERTICAL);
+2 -2
View File
@@ -325,7 +325,7 @@ void ReportScreen::CreateViews() {
UpdateOverallDescription();
rightColumnItems->Add(new Spacer(25.0));
rightColumnItems->Add(new Choice(di->T("Back"), "", false, new AnchorLayoutParams(150, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
rightColumnItems->Add(new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK"), new AnchorLayoutParams(150, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
root_ = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT, 1.0f));
root_->Add(leftColumn);
@@ -432,7 +432,7 @@ void ReportFinishScreen::CreateViews() {
rightColumnItems->Add(new Choice(rp->T("View Feedback")))->OnClick.Handle(this, &ReportFinishScreen::HandleViewFeedback);
rightColumnItems->Add(new Spacer(25.0));
rightColumnItems->Add(new Choice(di->T("Back"), "", false, new AnchorLayoutParams(150, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
rightColumnItems->Add(new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK"), new AnchorLayoutParams(150, WRAP_CONTENT, 10, NONE, NONE, 10)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
root_ = new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, FILL_PARENT, 1.0f));
root_->Add(leftColumn);
+3 -3
View File
@@ -64,18 +64,18 @@ AudioFileChooser::AudioFileChooser(RequesterToken token, std::string *value, std
void RetroAchievementsListScreen::CreateTabs() {
auto ac = GetI18NCategory(I18NCat::ACHIEVEMENTS);
AddTab("Achievements", ac->T("Achievements"), [this](UI::LinearLayout *parent) {
AddTab("Achievements", ac->T("Achievements"), ImageID::invalid(), [this](UI::LinearLayout *parent) {
parent->SetSpacing(5.0f);
CreateAchievementsTab(parent);
});
AddTab("Leaderboards", ac->T("Leaderboards"), [this](UI::LinearLayout *parent) {
AddTab("Leaderboards", ac->T("Leaderboards"), ImageID::invalid(), [this](UI::LinearLayout *parent) {
parent->SetSpacing(5.0f);
CreateLeaderboardsTab(parent);
});
#ifdef _DEBUG
AddTab("AchievementsStatistics", ac->T("Statistics"), [this](UI::LinearLayout *parent) {
AddTab("AchievementsStatistics", ac->T("Statistics"), ImageID::invalid(), [this](UI::LinearLayout *parent) {
parent->SetSpacing(5.0f);
CreateStatisticsTab(parent);
});
+14 -5
View File
@@ -12,10 +12,10 @@
#include "UI/MiscViews.h"
#include "UI/TabbedDialogScreen.h"
void UITabbedBaseDialogScreen::AddTab(const char *tag, std::string_view title, std::function<void(UI::LinearLayout *)> createCallback, TabFlags flags) {
void UITabbedBaseDialogScreen::AddTab(const char *tag, std::string_view title, ImageID imageId, std::function<void(UI::LinearLayout *)> createCallback, TabFlags flags) {
using namespace UI;
tabHolder_->AddTabDeferred(title, [createCallback = std::move(createCallback), tag, flags]() -> UI::ViewGroup * {
tabHolder_->AddTabDeferred(title, imageId, [createCallback = std::move(createCallback), tag, flags]() -> UI::ViewGroup * {
using namespace UI;
ViewGroup *scroll = nullptr;
if (!(flags & TabFlags::NonScrollable)) {
@@ -53,12 +53,21 @@ void UITabbedBaseDialogScreen::CreateViews() {
if (portrait) {
auto di = GetI18NCategory(I18NCat::DIALOG);
LinearLayout *verticalLayout = new LinearLayout(ORIENT_VERTICAL, new LayoutParams(FILL_PARENT, FILL_PARENT));
tabHolder_ = new TabHolder(ORIENT_HORIZONTAL, 200, TabHolderFlags::BackButton, filterNotice_, new LinearLayoutParams(1.0f));
TabHolderFlags tabHolderFlags = TabHolderFlags::BackButton;
if (flags_ & TabDialogFlags::HorizontalOnlyIcons) {
tabHolderFlags |= TabHolderFlags::HorizontalOnlyIcons;
}
tabHolder_ = new TabHolder(ORIENT_HORIZONTAL, 200, tabHolderFlags, filterNotice_, new LinearLayoutParams(1.0f));
verticalLayout->Add(tabHolder_);
CreateExtraButtons(verticalLayout, 0);
root_->Add(verticalLayout);
} else {
tabHolder_ = new TabHolder(ORIENT_VERTICAL, 200, TabHolderFlags::Default, filterNotice_, new AnchorLayoutParams(10, 0, 10, 0, false));
TabHolderFlags tabHolderFlags = TabHolderFlags::Default;
if (flags_ & TabDialogFlags::VerticalShowIcons) {
tabHolderFlags |= TabHolderFlags::VerticalShowIcons;
}
tabHolder_ = new TabHolder(ORIENT_VERTICAL, 300, tabHolderFlags, filterNotice_, new AnchorLayoutParams(10, 0, 10, 0, false));
CreateExtraButtons(tabHolder_->Container(), 10);
tabHolder_->AddBack(this);
root_->Add(tabHolder_);
@@ -90,7 +99,7 @@ void UITabbedBaseDialogScreen::CreateViews() {
if ((g_display.dp_xres < g_display.dp_yres || g_display.dp_yres >= 500) && (deviceType != DEVICE_TYPE_VR) && ShowSearchControls()) {
// Search
auto ms = GetI18NCategory(I18NCat::MAINSETTINGS);
AddTab("GameSettingsSearch", ms->T("Search"), [this](UI::LinearLayout *searchSettings) {
AddTab("GameSettingsSearch", ms->T("Search"), ImageID("I_SEARCH"), [this](UI::LinearLayout *searchSettings) {
auto se = GetI18NCategory(I18NCat::SEARCH);
searchSettings->Add(new ItemHeader(se->T("Find settings")));
+15 -2
View File
@@ -4,6 +4,7 @@
#include <functional>
#include "Common/UI/UIScreen.h"
#include "Common/Render/TextureAtlas.h"
#include "Common/System/System.h"
#include "Core/ConfigValues.h"
#include "UI/BaseScreens.h"
@@ -14,6 +15,13 @@ namespace UI {
class TabHolder;
}
enum class TabDialogFlags {
Default = 0,
HorizontalOnlyIcons = 1,
VerticalShowIcons = 2,
};
ENUM_CLASS_BITOPS(TabDialogFlags);
enum class TabFlags {
Default = 0,
NonScrollable = 1,
@@ -22,11 +30,14 @@ ENUM_CLASS_BITOPS(TabFlags);
class UITabbedBaseDialogScreen : public UIBaseDialogScreen {
public:
UITabbedBaseDialogScreen(const Path &gamePath) : UIBaseDialogScreen(gamePath) {
UITabbedBaseDialogScreen(const Path &gamePath, TabDialogFlags flags = TabDialogFlags::Default) : UIBaseDialogScreen(gamePath), flags_(flags) {
ignoreBottomInset_ = true;
}
void AddTab(const char *tag, std::string_view title, std::function<void(UI::LinearLayout *)> createCallback, TabFlags flags = TabFlags::Default);
void AddTab(const char *tag, std::string_view title, ImageID imageId, std::function<void(UI::LinearLayout *)> createCallback, TabFlags flags = TabFlags::Default);
void AddTab(const char *tag, std::string_view title, std::function<void(UI::LinearLayout *)> createCallback, TabFlags flags = TabFlags::Default) {
AddTab(tag, title, ImageID::invalid(), createCallback, flags);
}
void CreateViews() override;
protected:
@@ -57,4 +68,6 @@ private:
// If we recreate the views while this is active we show it again
std::string oldSettingInfo_;
std::string searchFilter_;
TabDialogFlags flags_ = TabDialogFlags::Default;
};
+2 -2
View File
@@ -149,12 +149,12 @@ void RightAnalogMappingScreen::CreateViews() {
auto mc = GetI18NCategory(I18NCat::MAPPABLECONTROLS);
root_ = new AnchorLayout(new LayoutParams(FILL_PARENT, FILL_PARENT));
Choice *back = new Choice(di->T("Back"), "", false, new AnchorLayoutParams(leftColumnWidth - 10, WRAP_CONTENT, 10, NONE, NONE, 10));
Choice *back = new Choice(di->T("Back"), ImageID("I_NAVIGATE_BACK"), new AnchorLayoutParams(leftColumnWidth - 10, WRAP_CONTENT, 10, NONE, NONE, 10));
root_->Add(back)->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
TabHolder *tabHolder = new TabHolder(ORIENT_VERTICAL, leftColumnWidth, TabHolderFlags::Default, nullptr, new AnchorLayoutParams(10, 0, 10, 0, false));
root_->Add(tabHolder);
ScrollView *rightPanel = new ScrollView(ORIENT_VERTICAL);
tabHolder->AddTab(co->T("Binds"), rightPanel);
tabHolder->AddTab(co->T("Binds"), ImageID::invalid(), rightPanel);
LinearLayout *vert = rightPanel->Add(new LinearLayout(ORIENT_VERTICAL, new LayoutParams(FILL_PARENT, FILL_PARENT)));
vert->SetSpacing(0);
+4 -1
View File
@@ -135,7 +135,7 @@ static const ImageMeta imageIDs[] = {
{"I_FILLED_CIRCLE_3", false},
{"I_FILLED_CIRCLE_4", false},
{"I_FILLED_CIRCLE_5", false},
{"I_SETTINGS_DISPLAY", false},
{"I_DISPLAY", false},
{"I_NAVIGATE_BACK", false},
{"I_NAVIGATE_FORWARD", false},
{"I_FOLDER_UPLOAD", false},
@@ -150,6 +150,9 @@ static const ImageMeta imageIDs[] = {
{"I_LOGO_PLAY_STORE", false},
{"I_LOGO_APP_STORE", false},
{"I_SEARCH", false},
{"I_DEVMENU", false},
{"I_CONTROLLER", false},
{"I_DEBUGGER", false},
};
static std::string PNGNameFromID(std::string_view id) {
+104 -108
View File
@@ -24,15 +24,15 @@
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2.0000001"
inkscape:cx="520.74999"
inkscape:cy="253.74999"
inkscape:zoom="4.0000002"
inkscape:cx="95.374995"
inkscape:cy="277.37499"
inkscape:window-width="3379"
inkscape:window-height="1941"
inkscape:window-x="-9"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="layer1"
inkscape:current-layer="I_FOLDER_PINNED"
showgrid="false" /><defs
id="defs1"><inkscape:path-effect
effect="fillet_chamfer"
@@ -2996,19 +2996,18 @@
transform="matrix(0.51483133,0,0,0.48865723,85.611849,129.89633)"
aria-label="SD" /></g></g><path
style="baseline-shift:baseline;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;marker:none;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 45.101709,56.74501 -1.123047,2.205078 v 8.189453 H 55.52749 v -8.34375 L 55.023584,58.448135 H 50.506006 L 49.670068,56.74501 Z m 0.357422,0.583984 h 3.847656 l 0.833984,1.705078 h 4.701172 l 0.101563,0.06836 v 7.451172 H 44.5646 v -7.466797 z"
id="I_FOLDER" /><g
d="m 45.101709,56.74501 -1.123047,2.205078 v 8.189453 l 11.127879,0 v -8.34375 l -0.503906,-0.347656 -4.096629,0 -0.835938,-1.703125 z m 0.357422,0.583984 h 3.847656 l 0.833984,1.705078 4.280223,0 0.101563,0.06836 v 7.451172 l -9.957957,0 v -7.466797 z"
id="I_FOLDER"
sodipodi:nodetypes="cccccccccccccccccc" /><g
transform="matrix(0.38952161,0,0,0.38952161,-88.556132,-53.317315)"
id="I_FOLDER_OPEN"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"
inkscape:export-filename="C:\Users\hrydg\folder_open_line.png"><path
id="path6612"
style="baseline-shift:baseline;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;marker:none;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 298.15039,281.27539 -2.74023,5.66406 -0.13282,21.01953 h 28.64844 v -1.5 h -27.14062 l 0.12304,-19.16992 2.1836,-4.51367 h 9.86523 l 2.14258,4.375 h 11.81445 l 0.27735,0.19141 0.11132,2.51367 1.49805,-0.0645 -0.14258,-3.26172 -1.27734,-0.87891 h -11.3457 l -2.14258,-4.375 z"
id="path6612" /><path
style="baseline-shift:baseline;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;marker:none;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 330.39844,289.36133 -28.46094,0.0957 -6.58984,18.50195 h 29.125 z m -2.05469,1.50781 -4.9668,15.58984 h -25.90234 l 5.52148,-15.50586 z"
id="path6610" /></g><g
d="m 298.14993,281.27572 -2.73956,5.66353 -0.13267,21.01966 h 0.0703 25.33561 0.54659 l 5.92621,-18.59718 -5.61577,0.0186 -0.12471,-2.851 -1.27758,-0.87958 h -8.94411 l -2.14256,-4.37401 z m 0.94193,1.49913 h 9.02454 l 2.14257,4.37534 h 9.41242 l 0.2786,0.19103 0.0889,2.04439 -18.10132,0.0716 -5.13551,14.42084 0.10613,-16.58861 z m 26.00956,8.09397 -4.96703,15.58963 -22.65973,0 5.52157,-15.50472 z"
sodipodi:nodetypes="cccccccccccccccccccccccccccc" /></g><g
id="I_ROTATE_LEFT"
transform="matrix(0.00878851,0,0,0.00878851,43.016192,28.666646)"
style="vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:23.3029;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
@@ -3086,7 +3085,7 @@
id="I_HOME"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
transform="matrix(0.26458333,0,0,0.26458333,-5.9908997,79.356161)"><path
transform="matrix(0.26458333,0,0,0.26458333,-8.7690242,69.831162)"><path
style="color:#000000;fill:#ffffff;-inkscape-stroke:none"
d="m 154.41016,251.21289 h -3.10743 v 16.09766 h -19.04687 v -16.09766 h -2.42969 c 0,0 11.30045,-11.07641 12.1072,-11.88316 z m -12.47434,-15.43751 -18.13699,17.93751 h 5.95703 v 16.09766 h 24.04687 v -16.09766 h 6.21094 z"
id="path5204"
@@ -3190,7 +3189,7 @@
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" /></g><g
id="I_SPEAKER_MAX"
transform="matrix(0.44009307,0,0,0.44009307,-76.896945,1.9213872)"
transform="matrix(0.44009307,0,0,0.44009307,-79.67507,-7.6036111)"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"><g
transform="matrix(1.1742907,0,0,1.1742907,225.4342,162.52437)"
@@ -3198,79 +3197,49 @@
inkscape:export-filename="square_shape_line.png"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"><path
sodipodi:nodetypes="ccccccc"
inkscape:connector-curvature="0"
id="rect1524"
d="m 40.140311,135.92727 h 4.054542 l 3.801958,-2.99163 -0.04448,15.5982 -3.757475,-3.39096 h -4.054542 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:0.670213;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" /></g><path
sodipodi:open="true"
d="m 290.84236,317.75278 a 18.602837,18.602837 0 0 1 -0.0552,20.46967"
sodipodi:end="0.58527315"
sodipodi:start="5.7033033"
sodipodi:ry="18.602837"
sodipodi:rx="18.602837"
sodipodi:cy="327.94574"
sodipodi:cx="275.28058"
sodipodi:type="arc"
id="path1537"
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
sodipodi:arc-type="arc" /><path
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
id="path1539"
sodipodi:type="arc"
sodipodi:cx="276.69458"
sodipodi:cy="327.87177"
sodipodi:rx="9.5535717"
sodipodi:ry="9.5535717"
sodipodi:start="5.7033033"
sodipodi:end="0.58527315"
d="m 284.6864,322.63712 a 9.5535717,9.5535717 0 0 1 -0.0283,10.5123"
sodipodi:open="true"
sodipodi:arc-type="arc" /><path
style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
id="path1541"
sodipodi:type="arc"
sodipodi:cx="275.91193"
sodipodi:cy="328.00885"
sodipodi:rx="14.183419"
sodipodi:ry="14.183419"
sodipodi:start="5.7033033"
sodipodi:end="0.58527315"
d="m 287.77674,320.2374 a 14.183419,14.183419 0 0 1 -0.0421,15.60676"
sodipodi:open="true"
sodipodi:arc-type="arc" /></g><g
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.5"><path
style="fill:#ffffff;stroke:none;-inkscape-stroke:none"
d="m 48.751953,131.38672 -4.816406,3.79101 h -4.544922 v 10.71485 h 4.515625 l 4.791016,4.32422 z m -1.509766,3.09765 -0.03516,12.36719 -2.724609,-2.45898 h -3.591797 v -7.71485 h 3.564453 z"
id="rect1524" /></g><path
style="color:#000000;fill:#ffffff;-inkscape-stroke:none"
d="m 291.42773,317.36914 -1.17187,0.76758 c 3.9224,5.98842 3.90191,13.73204 -0.0527,19.69922 l 1.16797,0.77343 c 4.26171,-6.43051 4.28361,-14.78683 0.0566,-21.24023 z"
id="path1537" /><path
style="color:#000000;fill:#ffffff;-inkscape-stroke:none"
d="m 285.27148,322.25391 -1.16992,0.76757 c 1.94031,2.96228 1.92889,6.7904 -0.0273,9.74219 l 1.16797,0.77149 c 2.26329,-3.41513 2.27417,-7.85399 0.0293,-11.28125 z"
id="path1539" /><path
style="color:#000000;fill:#ffffff;-inkscape-stroke:none"
d="m 288.36328,319.85352 -1.17187,0.76757 c 2.95439,4.51054 2.93766,10.34141 -0.041,14.83594 l 1.16797,0.77344 c 3.28575,-4.95787 3.30388,-11.40143 0.0449,-16.37695 z"
id="path1541" /></g><g
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.5"
inkscape:export-ydpi="135"
inkscape:export-xdpi="135"
inkscape:export-filename="speaker.png"
id="I_SPEAKER"
transform="matrix(0.51679723,0,0,0.51679723,50.013049,73.447233)"><path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:0.670213;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 40.140311,135.92727 h 4.054542 l 3.801958,-2.99163 -0.04448,15.5982 -3.757475,-3.39096 h -4.054542 z"
id="path2639"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" /></g><g
transform="matrix(0.51679723,0,0,0.51679723,47.234924,63.922234)"><path
style="fill:#ffffff;stroke:none;-inkscape-stroke:none"
d="m 48.751953,131.38672 -4.816406,3.79101 h -4.544922 v 10.71485 h 4.515625 l 4.791016,4.32422 z m -1.509766,3.09765 -0.03516,12.36719 -2.724609,-2.45898 h -3.591797 v -7.71485 h 3.564453 z"
id="path2639" /></g><g
id="I_SPEAKER_OFF"
transform="matrix(0.44009307,0,0,0.44009307,-77.94216,1.7642172)"
transform="matrix(0.44009307,0,0,0.44009307,-80.720285,-7.7607811)"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"><g
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#ffffff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:1.5"
inkscape:export-ydpi="135"
inkscape:export-xdpi="135"
inkscape:export-filename="square_shape_line.png"
id="g2637"
transform="matrix(1.1742907,0,0,1.1742907,259.71992,162.88151)"><path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:0.670213;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 40.140311,135.92727 h 4.054542 l 3.801958,-2.99163 -0.04448,15.5982 -3.757475,-3.39096 h -4.054542 z"
id="path2635"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" /></g><path
inkscape:connector-curvature="0"
id="rect2643"
d="m 319.32217,324.08362 -0.31055,0.31055 3.69727,3.69726 -3.61719,3.61719 0.31055,0.31055 3.61718,-3.61719 3.61524,3.61719 0.31055,-0.31055 -3.61524,-3.61719 3.69727,-3.69726 -0.31055,-0.31055 -3.69727,3.69727 z"
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1.35233;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none" /></g><g
transform="matrix(0.39414007,0,0,0.39414007,-51.396484,29.857907)"
style="fill:#ffffff;stroke:none;-inkscape-stroke:none"
d="m 48.751953,131.38672 -4.816406,3.79101 h -4.544922 v 10.71485 h 4.515625 l 4.791016,4.32422 z m -1.509766,3.09765 -0.03516,12.36719 -2.724609,-2.45898 h -3.591797 v -7.71485 h 3.564453 z"
id="path2635" /></g><g
id="rect2643"><path
style="color:#000000;fill:#ffffff;-inkscape-stroke:none"
d="m 319.32217,324.08362 -0.31055,0.31055 3.69727,3.69726 -3.61719,3.61719 0.31055,0.31055 3.61718,-3.61719 3.61524,3.61719 0.31055,-0.31055 -3.61524,-3.61719 3.69727,-3.69726 -0.31055,-0.31055 -3.69727,3.69727 z"
id="path110" /><path
style="color:#000000;fill:#ffffff;-inkscape-stroke:none"
d="m 319.32227,323.12695 1.20117,1.82227 -1.03321,-1.0332 v 0.64648 h -0.64648 z m 0,0 -0.47852,0.47852 -0.78906,0.78906 3.69726,3.69727 -3.61718,3.61718 1.26757,1.26563 3.61719,-3.61524 3.61524,3.61524 1.26562,-1.26563 -3.61523,-3.61718 3.69921,-3.69727 -1.26757,-1.26758 -3.69727,3.69727 z"
id="path112" /></g></g><g
transform="matrix(0.34917415,0,0,0.34917415,-47.228842,33.601979)"
id="I_WARNING"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"><path
@@ -3295,7 +3264,7 @@
id="I_TRASHCAN"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"
transform="matrix(0.39414007,0,0,0.39414007,-46.785863,14.443237)"><rect
transform="matrix(0.39414007,0,0,0.39414007,-49.563988,4.9182387)"><rect
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
id="rect5029"
width="1.6071385"
@@ -3320,7 +3289,7 @@
transform="matrix(0.93415882,0,0,0.87040224,11.368845,44.781213)"
sodipodi:nodetypes="ccccccccccccccccccccccc" /></g><g
id="I_THREE_DOTS"
transform="matrix(0.42098793,0,0,0.42098793,-65.292476,27.877317)"
transform="matrix(0.42098793,0,0,0.42098793,-68.070601,18.352318)"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"><path
inkscape:export-ydpi="135"
@@ -3423,7 +3392,7 @@
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.353317"
sodipodi:nodetypes="ccccccccccccc" /><g
id="I_DIR"
transform="matrix(0.39577991,0,0,0.39577991,31.099286,65.926388)"><path
transform="matrix(0.39577991,0,0,0.39577991,27.924287,64.206597)"><path
inkscape:export-ydpi="135"
inkscape:export-xdpi="135"
inkscape:export-filename="D:\Dev\Emulatorer\potemkin\android\source_assets\image\dir.png"
@@ -3444,7 +3413,7 @@
inkscape:export-filename="D:\Dev\Emulatorer\potemkin\android\source_assets\image\rect.png"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"
transform="matrix(0.39577991,0,0,0.39577991,-4.1381679,66.169426)"><rect
transform="matrix(0.39577991,0,0,0.39577991,-7.1808757,63.788176)"><rect
inkscape:export-ydpi="135"
inkscape:export-xdpi="135"
inkscape:export-filename="D:\Dev\Emulatorer\potemkin\gfx\rect.png"
@@ -3464,9 +3433,9 @@
id="rect4948-9"
style="fill:#ffffff;fill-opacity:0.670213;stroke:none" /></g><path
style="baseline-shift:baseline;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;marker:none;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 26.460715,94.509891 v 11.774449 h 11.098071 l 5.143592,-5.87795 -5.142819,-5.896499 z m 0.59367,0.59367 h 10.235394 l 4.624132,5.302059 -4.624132,5.28505 H 27.054385 Z"
d="m 25.799257,91.864058 v 11.774452 h 11.098071 l 5.143592,-5.877953 -5.142819,-5.896499 z m 0.59367,0.59367 h 10.235394 l 4.624132,5.302059 -4.624132,5.285053 H 26.392927 Z"
id="I_DIR_LINE" /><g
transform="matrix(0.39577991,0,0,0.39577991,31.055396,66.169426)"
transform="matrix(0.39577991,0,0,0.39577991,16.635607,63.788176)"
id="I_RECT_LINE"
inkscape:export-filename="C:\dev\ppsspp\source_assets\image\rect_line.png"
inkscape:export-xdpi="135"
@@ -3475,7 +3444,7 @@
style="baseline-shift:baseline;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;stroke:none;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 33.535156,113.78516 v 21.4707 h 54.363281 v -21.4707 z m 1.5,1.5 h 51.363281 v 18.4707 H 35.035156 Z"
id="rect4948-4" /></g><g
transform="matrix(0.39577991,0,0,0.39577991,16.678873,62.960225)"
transform="matrix(0.39577991,0,0,0.39577991,13.900748,58.065434)"
id="I_SHOULDER_LINE"
inkscape:export-filename="C:\dev\ppsspp\source_assets\image\shoulder_line.png"
inkscape:export-xdpi="135"
@@ -3488,7 +3457,7 @@
inkscape:export-filename="D:\Dev\Emulatorer\potemkin\android\source_assets\image\shoulder.png"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"
transform="matrix(0.39502252,0,0,0.39502252,-18.488273,63.087641)"><path
transform="matrix(0.39502252,0,0,0.39502252,-21.266398,58.19285)"><path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="rect4948-1"
@@ -3505,7 +3474,7 @@
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"
inkscape:export-filename="D:\Dev\Emulatorer\potemkin\android\source_assets\image\round.png"
transform="matrix(0.39550706,0,0,0.39550706,54.360376,87.166616)"><ellipse
transform="matrix(0.39550706,0,0,0.39550706,47.481211,83.065575)"><ellipse
inkscape:export-ydpi="135"
inkscape:export-xdpi="135"
inkscape:export-filename="D:\Dev\Emulatorer\potemkin\gfx\round.png"
@@ -3550,7 +3519,7 @@
id="rect4948-9-7"
style="fill:#ffffff;fill-opacity:0.670213;stroke:none" /></g><path
style="baseline-shift:baseline;display:inline;overflow:visible;vector-effect:none;fill:#ffffff;stroke-width:0.0494455;enable-background:accumulate;stop-color:#000000"
d="m 93.841464,95.777601 c -4.058254,0 -7.36024,3.232244 -7.36024,7.218949 0,3.98671 3.301986,7.21905 7.36024,7.21905 4.05825,0 7.360326,-3.23234 7.360326,-7.21905 0,-3.986705 -3.302076,-7.218949 -7.360326,-7.218949 z m 0,0.593249 c 3.74404,0 6.767076,2.966161 6.767076,6.6257 0,3.65954 -3.023036,6.6258 -6.767076,6.6258 -3.744044,0 -6.76699,-2.96626 -6.76699,-6.6258 0,-3.659539 3.022946,-6.6257 6.76699,-6.6257 z"
d="m 85.242508,91.67656 c -4.058254,0 -7.36024,3.232244 -7.36024,7.218949 0,3.986711 3.301986,7.219051 7.36024,7.219051 4.05825,0 7.360326,-3.23234 7.360326,-7.219051 0,-3.986705 -3.302076,-7.218949 -7.360326,-7.218949 z m 0,0.593249 c 3.74404,0 6.767076,2.966161 6.767076,6.6257 0,3.659541 -3.023036,6.625801 -6.767076,6.625801 -3.744044,0 -6.76699,-2.96626 -6.76699,-6.625801 0,-3.659539 3.022946,-6.6257 6.76699,-6.6257 z"
id="I_ROUND_LINE" /><path
style="color:#000000;baseline-shift:baseline;display:inline;overflow:visible;visibility:visible;vector-effect:none;fill:#ffffff;stroke:none;stroke-width:0.69666;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate;stop-color:#000000"
d="m 73.773255,113.06444 v 14.62986 h 14.629868 v -14.62986 z m 0.69666,0.69666 h 13.236547 v 13.23654 H 74.469915 Z"
@@ -3559,7 +3528,7 @@
inkscape:export-filename="D:\Dev\Emulatorer\potemkin\android\source_assets\image\stick.png"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"
transform="matrix(0.39740844,0,0,0.39740844,50.74695,0.45580552)"><ellipse
transform="matrix(0.39740844,0,0,0.39740844,49.291742,-5.8941934)"><ellipse
inkscape:export-ydpi="135"
inkscape:export-xdpi="135"
inkscape:export-filename="D:\Dev\Emulatorer\potemkin\gfx\stick.png"
@@ -3585,15 +3554,15 @@
inkscape:export-filename="D:\Dev\Emulatorer\potemkin\android\source_assets\image\stick_bg.png"
inkscape:export-xdpi="135"
inkscape:export-ydpi="135"
cx="140.62358"
cy="47.137791"
cx="139.16837"
cy="40.787792"
rx="15.929352"
ry="15.610765" /><path
style="baseline-shift:baseline;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:0.569149;marker:none;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 114.28516,32.546875 c -80.313543,0 -145.529301,63.877921 -145.529301,142.671875 0,78.79395 65.215758,142.67383 145.529301,142.67383 80.31354,0 145.53125,-63.87988 145.53125,-142.67383 0,-78.793954 -65.21771,-142.671875 -145.53125,-142.671875 z m 0,5.345703 c 77.48211,0 140.18554,61.480396 140.18554,137.326172 0,75.84578 -62.70343,137.32812 -140.18554,137.32812 -77.482113,0 -140.183597,-61.48234 -140.183597,-137.32812 0,-75.845776 62.701484,-137.326172 140.183597,-137.326172 z"
id="I_STICK_BG_LINE"
transform="matrix(0.11150546,0,0,0.11150546,103.70423,57.505528)" /><g
id="I_STICK_LINE"><path
style="baseline-shift:baseline;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:0.569149;stroke-width:0.111505;marker:none;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 114.99244,54.784683 c -8.9554,0 -16.22731,7.122737 -16.22731,15.908693 0,8.785956 7.27191,15.908911 16.22731,15.908911 8.9554,0 16.22753,-7.122955 16.22753,-15.908911 0,-8.785956 -7.27213,-15.908693 -16.22753,-15.908693 z m 0,0.596075 c 8.63968,0 15.63145,6.8554 15.63145,15.312618 0,8.457219 -6.99177,15.312836 -15.63145,15.312836 -8.63968,0 -15.631235,-6.855617 -15.631235,-15.312836 0,-8.457218 6.991555,-15.312618 15.631235,-15.312618 z"
id="I_STICK_BG_LINE" /><g
id="I_STICK_LINE"
transform="translate(-1.4552081,-6.3499989)"><path
style="baseline-shift:baseline;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#ffffff;enable-background:accumulate;stop-color:#000000;stop-opacity:1"
d="m 114.28516,31.521484 c -80.856526,0 -146.554691,64.33794 -146.554691,143.697266 0,79.35933 65.698165,143.69922 146.554691,143.69922 80.85652,0 146.55664,-64.33989 146.55664,-143.69922 0,-79.359326 -65.70012,-143.697266 -146.55664,-143.697266 z m 0,7.396485 c 76.93912,0 139.16015,61.020377 139.16015,136.300781 0,75.2804 -62.22103,136.30273 -139.16015,136.30273 -76.939129,0 -139.158207,-61.02233 -139.158207,-136.30273 0,-75.280404 62.219078,-136.300781 139.158207,-136.300781 z"
id="path4099-17-9"
@@ -3779,14 +3748,9 @@
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" /></g><g
id="I_FOLDER_PINNED"><path
id="path59"
style="baseline-shift:baseline;display:inline;overflow:visible;vector-effect:none;fill:#ffffff;marker:none;enable-background:accumulate;stop-color:#000000"
d="m 85.961696,41.562602 -1.12305,2.205078 v 8.189453 h 11.54883 v -8.34375 l -0.50391,-0.347656 h -4.51757 l -0.83594,-1.703125 z m 0.35742,0.583984 h 3.84766 l 0.83398,1.705078 h 4.70117 l 0.10157,0.06836 v 7.451172 h -10.37891 v -7.466797 z"
id="path59" /><path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;fill-opacity:0.670213;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.529164;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 89.391353,48.970898 -1.32292,-1.322918 h 1.32292 l 2.64583,-2.645832 V 43.67923 l 2.64584,2.645837 h -1.32292 l -2.64583,2.645831 v 1.322918 l -1.32292,-1.322918 -2.64583,2.645836 z"
id="path60"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccc" /></g><g
d="M 85.961667 41.562832 L 84.838738 43.767866 L 84.838738 51.957029 L 96.387386 51.957029 L 96.387386 43.613353 L 95.883541 43.265571 L 91.365988 43.265571 L 90.529863 41.562832 L 85.961667 41.562832 z M 86.319268 42.146776 L 90.166578 42.146776 L 91.000636 43.851581 L 95.702157 43.851581 L 95.803443 43.919794 L 95.803443 51.371018 L 85.424749 51.371018 L 85.424749 43.904291 L 86.319268 42.146776 z M 91.876551 44.07379 A 0.22366586 0.22366586 0 0 0 91.747877 44.086192 A 0.22366586 0.22366586 0 0 0 91.609384 44.292898 L 91.609384 45.318158 L 89.504086 47.423973 L 88.478309 47.423973 A 0.22366586 0.22366586 0 0 0 88.320179 47.806895 L 89.279294 48.765493 L 87.201385 50.843919 L 87.517644 51.160178 L 89.595553 49.082269 L 90.556735 50.042934 A 0.22366586 0.22366586 0 0 0 90.93759 49.884804 L 90.93759 48.859544 L 93.042888 46.753729 L 94.068148 46.753729 A 0.22366586 0.22366586 0 0 0 94.226795 46.371324 L 91.990239 44.134768 A 0.22366586 0.22366586 0 0 0 91.876551 44.07379 z M 92.056385 44.83395 L 93.529163 46.306728 L 92.951421 46.306728 A 0.22366586 0.22366586 0 0 0 92.792774 46.371324 L 90.556735 48.607363 A 0.22366586 0.22366586 0 0 0 90.490072 48.765493 L 90.490072 49.343752 L 89.753683 48.607363 L 89.017811 47.870974 L 89.595553 47.870974 A 0.22366586 0.22366586 0 0 0 89.753683 47.806895 L 91.990239 45.570339 A 0.22366586 0.22366586 0 0 0 92.056385 45.412209 L 92.056385 44.83395 z " /></g><g
id="I_FLAG_ZZ"
transform="matrix(0.02084888,0,0,0.02076933,10.42345,100.98801)"><rect
x="267.82452"
@@ -4148,23 +4112,20 @@
id="path109" /></g><path
id="I_FILLED_CIRCLE_2"
style="fill:#ffffff;stroke-width:7.26457"
transform="scale(-1)"
d="m -114.87243,-103.03909 a 3.7885454,3.7885454 0 0 1 -3.78855,3.788542 3.7885454,3.7885454 0 0 1 -3.78855,-3.788542 3.7885454,3.7885454 0 0 1 3.78855,-3.78855 3.7885454,3.7885454 0 0 1 3.78855,3.78855 z" /><path
d="m 115.66618,92.323467 a 3.7885454,3.7885454 0 0 1 3.78855,-3.788542 3.7885454,3.7885454 0 0 1 3.78855,3.788542 3.7885454,3.7885454 0 0 1 -3.78855,3.788551 3.7885454,3.7885454 0 0 1 -3.78855,-3.788551 z" /><path
id="I_FILLED_CIRCLE_3"
style="fill:#ffffff;stroke-width:10.3139"
transform="scale(-1)"
d="m -125.44295,-103.41327 a 5.378799,5.378799 0 0 1 -5.3788,5.3788 5.378799,5.378799 0 0 1 -5.3788,-5.3788 5.378799,5.378799 0 0 1 5.3788,-5.3788 5.378799,5.378799 0 0 1 5.3788,5.3788 z" /><path
d="m 126.2367,92.697647 a 5.378799,5.378799 0 0 1 5.3788,-5.3788 5.378799,5.378799 0 0 1 5.3788,5.3788 5.378799,5.378799 0 0 1 -5.3788,5.378801 5.378799,5.378799 0 0 1 -5.3788,-5.378801 z" /><path
id="I_FILLED_CIRCLE_4"
style="fill:#ffffff;stroke-width:14.6188"
transform="scale(-1)"
d="m -139.10043,-103.50681 a 7.6238627,7.6238627 0 0 1 -7.62386,7.62386 7.6238627,7.6238627 0 0 1 -7.62386,-7.62386 7.6238627,7.6238627 0 0 1 7.62386,-7.62387 7.6238627,7.6238627 0 0 1 7.62386,7.62387 z" /><path
d="m 139.89418,92.791187 a 7.6238627,7.6238627 0 0 1 7.62386,-7.62386 7.6238627,7.6238627 0 0 1 7.62386,7.62386 7.6238627,7.6238627 0 0 1 -7.62386,7.623873 7.6238627,7.6238627 0 0 1 -7.62386,-7.623873 z" /><path
id="I_FILLED_CIRCLE_5"
style="fill:#ffffff;stroke-width:19.2825"
d="m 107.3889,119.12871 a 10.056015,10.056015 0 0 1 10.05602,-10.05601 10.056015,10.056015 0 0 1 10.05601,10.05601 10.056015,10.056015 0 0 1 -10.05601,10.05602 10.056015,10.056015 0 0 1 -10.05602,-10.05602 z" /><path
id="I_FILLED_CIRCLE_1"
style="fill:#ffffff;stroke-width:4.93273"
d="m 106.54699,103.13263 a 2.5724686,2.5724686 0 0 1 2.57247,-2.57246 2.5724686,2.5724686 0 0 1 2.57247,2.57246 2.5724686,2.5724686 0 0 1 -2.57247,2.57247 2.5724686,2.5724686 0 0 1 -2.57247,-2.57247 z" /><g
id="I_SETTINGS_DISPLAY"
d="m 107.34074,92.417007 a 2.5724686,2.5724686 0 0 1 2.57247,-2.57246 2.5724686,2.5724686 0 0 1 2.57247,2.57246 2.5724686,2.5724686 0 0 1 -2.57247,2.572471 2.5724686,2.5724686 0 0 1 -2.57247,-2.572471 z" /><g
id="I_DISPLAY"
transform="matrix(1.7225478,0,0,1.7225478,-72.335968,31.982012)">
<path
@@ -4286,7 +4247,38 @@
id="primary-4" /><path
style="color:#000000;fill:#ffffff;fill-opacity:1;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none"
d="M 3,16.099609 A 0.89999998,0.89999998 0 0 0 2.0996094,17 0.89999998,0.89999998 0 0 0 3,17.900391 H 13 A 0.89999998,0.89999998 0 0 0 13.900391,17 0.89999998,0.89999998 0 0 0 13,16.099609 Z"
id="primary-5" /></g></g><path
id="primary-5" /></g><g
id="I_CONTROLLER"
transform="matrix(0.0129731,0,0,0.0129731,70.319491,129.76101)"
style="fill:#ffffff;fill-opacity:1;stroke:none">
<g
id="g2"
style="fill:#ffffff;fill-opacity:1;stroke:none"><g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g4"
transform="matrix(41.613018,0,0,41.613018,-5394.596,985.68166)"><path
style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:none;stroke-linecap:round;-inkscape-stroke:none"
d="M 8.5,10.25 A 0.75,0.75 0 0 0 7.75,11 v 0.75 H 7 A 0.75,0.75 0 0 0 6.25,12.5 0.75,0.75 0 0 0 7,13.25 H 7.75 V 14 A 0.75,0.75 0 0 0 8.5,14.75 0.75,0.75 0 0 0 9.25,14 V 13.25 H 10 A 0.75,0.75 0 0 0 10.75,12.5 0.75,0.75 0 0 0 10,11.75 H 9.25 V 11 A 0.75,0.75 0 0 0 8.5,10.25 Z"
id="path1-90" /><path
style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:none;-inkscape-stroke:none"
d="m 10.755859,6.25 c -2.6939269,0 -4.1842008,-0.040633 -5.4667965,0.7441406 -0.30821,0.1885832 -0.5940103,0.4103771 -0.8535156,0.6601563 -1.0807539,1.0402708 -1.3867714,2.4783551 -2,5.0312501 l -1.0839844,4.515625 c -0.47835837,1.991581 0.8088812,3.995012 2.8261719,4.453125 1.7043645,0.387001 3.4688302,-0.422376 4.2480469,-1.970703 l 0.1289062,-0.253907 c 0.4404837,-0.875223 1.3606923,-1.439453 2.3808595,-1.439453 h 2.128906 c 1.020179,0 1.940345,0.564216 2.38086,1.439453 l 0.128906,0.253907 c 0.77918,1.548329 2.543628,2.357694 4.248047,1.970703 2.017209,-0.45812 3.3046,-2.461512 2.826171,-4.453125 L 21.564453,12.685547 C 20.951157,10.132661 20.647086,8.6945678 19.566406,7.6542969 l -0.002,-0.00195 C 19.304999,7.4027047 19.019205,7.1827592 18.710937,6.9941406 17.428297,6.2093855 15.938038,6.25 13.244141,6.25 Z m 0,1.5 h 2.488282 c 2.693897,0 3.894836,0.040854 4.683593,0.5234375 0.215932,0.1321211 0.416711,0.2868369 0.597657,0.4609375 0.658718,0.6340874 0.966776,1.747872 1.580078,4.300781 l 1.085937,4.517578 c 0.284371,1.183784 -0.455584,2.355792 -1.701172,2.638672 -1.047378,0.237809 -2.112553,-0.260372 -2.576172,-1.18164 L 16.785156,18.755859 C 16.084471,17.3637 14.638671,16.490234 13.064453,16.490234 h -2.128906 c -1.5742104,0 -3.0200481,0.873451 -3.7207033,2.265625 L 7.0859375,19.009766 C 6.6222954,19.931036 5.5570383,20.429205 4.5097656,20.191406 3.2640796,19.90852 2.5242529,18.73655 2.8085938,17.552734 L 3.8945313,13.035156 C 4.5077614,10.482256 4.815825,9.3684825 5.4746094,8.734375 5.6553436,8.5604146 5.8562762,8.405594 6.0722656,8.2734375 6.8609479,7.7908719 8.0619321,7.75 10.755859,7.75 Z"
id="path2-7" /><path
style="color:#000000;fill:#ffffff;fill-opacity:1;stroke:none;stroke-linecap:round;-inkscape-stroke:none"
d="M 15,2.25 A 0.75,0.75 0 0 0 14.25,3 v 1 c 0,0.1469601 -0.103023,0.25 -0.25,0.25 H 13 C 12.042378,4.25 11.25,5.0424012 11.25,6 V 7 A 0.75,0.75 0 0 0 12,7.75 0.75,0.75 0 0 0 12.75,7 V 6 c 0,-0.1469601 0.103023,-0.25 0.25,-0.25 h 1 c 0.957622,0 1.75,-0.7924012 1.75,-1.75 V 3 A 0.75,0.75 0 0 0 15,2.25 Z"
id="path3-2" /><path
d="m 16,11 c 0,0.5523 -0.4477,1 -1,1 -0.5523,0 -1,-0.4477 -1,-1 0,-0.5523 0.4477,-1 1,-1 0.5523,0 1,0.4477 1,1 z"
fill="#1c274c"
id="path4-6"
style="fill:#ffffff;fill-opacity:1;stroke:none" /><path
d="m 18,14 c 0,0.5523 -0.4477,1 -1,1 -0.5523,0 -1,-0.4477 -1,-1 0,-0.5523 0.4477,-1 1,-1 0.5523,0 1,0.4477 1,1 z"
fill="#1c274c"
id="path5-9"
style="fill:#ffffff;fill-opacity:1;stroke:none" /></g></g></g></g><path
id="I_GEAR"
style="fill:#ececec;fill-opacity:1;stroke-width:0.019487"
class="st0"
@@ -4303,4 +4295,8 @@
id="style1-2">
.st0{stroke:#FFFFFF;stroke-miterlimit:10;}
.st1{fill:#FFFFFF;}
</style><style
type="text/css"
id="style1-0">
.st0{fill:#000000;}
</style></svg>

Before

Width:  |  Height:  |  Size: 206 KiB

After

Width:  |  Height:  |  Size: 207 KiB