mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-23 04:33:09 +00:00
GUI: use start + end for static widgets
This commit is contained in:
parent
e6e32aeb75
commit
4fc9c11bbe
@ -270,13 +270,11 @@ void RemapWidget::loadKeymap() {
|
||||
}
|
||||
|
||||
void RemapWidget::refreshKeymap() {
|
||||
Graphics::TextAlign alignment = g_gui.useRTL() ? Graphics::kTextAlignRight : Graphics::kTextAlignLeft;
|
||||
|
||||
for (uint i = 0; i < _actions.size(); i++) {
|
||||
ActionRow &row = _actions[i];
|
||||
|
||||
if (!row.actionText) {
|
||||
row.actionText = new GUI::StaticTextWidget(widgetsBoss(), 0, 0, 0, 0, "", alignment, nullptr, GUI::ThemeEngine::kFontStyleNormal);
|
||||
row.actionText = new GUI::StaticTextWidget(widgetsBoss(), 0, 0, 0, 0, "", GUI::ThemeEngine::kTextAlignHStart, nullptr, GUI::ThemeEngine::kFontStyleNormal);
|
||||
row.actionText->setLabel(row.action->description);
|
||||
|
||||
row.keyButton = new GUI::DropdownButtonWidget(widgetsBoss(), 0, 0, 0, 0, "", nullptr, kRemapCmd + i);
|
||||
@ -305,7 +303,7 @@ void RemapWidget::refreshKeymap() {
|
||||
|
||||
KeymapTitleRow &keymapTitle = _keymapSeparators[row.keymap];
|
||||
if (!keymapTitle.descriptionText) {
|
||||
keymapTitle.descriptionText = new GUI::StaticTextWidget(widgetsBoss(), 0, 0, 0, 0, row.keymap->getDescription(), alignment);
|
||||
keymapTitle.descriptionText = new GUI::StaticTextWidget(widgetsBoss(), 0, 0, 0, 0, row.keymap->getDescription(), GUI::ThemeEngine::kTextAlignHStart);
|
||||
keymapTitle.resetButton = new GUI::ButtonWidget(widgetsBoss(), 0, 0, 0, 0, "", nullptr, kResetKeymapCmd + i);
|
||||
|
||||
// I18N: Button to reset keymap mappings to defaults
|
||||
|
@ -71,7 +71,7 @@ bool ThemeEval::getWidgetData(const Common::String &widget, int16 &x, int16 &y,
|
||||
return _layouts[dialogName]->getWidgetData(widgetName, x, y, w, h, useRTL);
|
||||
}
|
||||
|
||||
Graphics::TextAlign ThemeEval::getWidgetTextHAlign(const Common::String &widget) {
|
||||
GUI::ThemeEngine::TextAlignH ThemeEval::getWidgetTextHAlign(const Common::String &widget) {
|
||||
Common::StringTokenizer tokenizer(widget, ".");
|
||||
|
||||
if (widget.hasPrefix("Dialog."))
|
||||
@ -81,20 +81,20 @@ Graphics::TextAlign ThemeEval::getWidgetTextHAlign(const Common::String &widget)
|
||||
Common::String widgetName = tokenizer.nextToken();
|
||||
|
||||
if (!_layouts.contains(dialogName))
|
||||
return Graphics::kTextAlignInvalid;
|
||||
return GUI::ThemeEngine::kTextAlignHInvalid;
|
||||
|
||||
return _layouts[dialogName]->getWidgetTextHAlign(widgetName);
|
||||
}
|
||||
|
||||
ThemeEval &ThemeEval::addWidget(const Common::String &name, const Common::String &type, int w, int h, Graphics::TextAlign align, bool useRTL) {
|
||||
ThemeEval &ThemeEval::addWidget(const Common::String &name, const Common::String &type, int w, int h, GUI::ThemeEngine::TextAlignH align, bool useRTL) {
|
||||
int typeW = -1;
|
||||
int typeH = -1;
|
||||
Graphics::TextAlign typeAlign = Graphics::kTextAlignInvalid;
|
||||
GUI::ThemeEngine::TextAlignH typeAlign = GUI::ThemeEngine::kTextAlignHInvalid;
|
||||
|
||||
if (!type.empty()) {
|
||||
typeW = getVar("Globals." + type + ".Width", -1);
|
||||
typeH = getVar("Globals." + type + ".Height", -1);
|
||||
typeAlign = (Graphics::TextAlign)getVar("Globals." + type + ".Align", Graphics::kTextAlignInvalid);
|
||||
typeAlign = (GUI::ThemeEngine::TextAlignH)getVar("Globals." + type + ".Align", GUI::ThemeEngine::kTextAlignHInvalid);
|
||||
}
|
||||
|
||||
ThemeLayoutWidget *widget;
|
||||
@ -102,13 +102,13 @@ ThemeEval &ThemeEval::addWidget(const Common::String &name, const Common::String
|
||||
widget = new ThemeLayoutTabWidget(_curLayout.top(), name,
|
||||
typeW == -1 ? w : typeW,
|
||||
typeH == -1 ? h : typeH,
|
||||
typeAlign == Graphics::kTextAlignInvalid ? align : typeAlign,
|
||||
typeAlign == GUI::ThemeEngine::kTextAlignHInvalid ? align : typeAlign,
|
||||
getVar("Globals.TabWidget.Tab.Height", 0));
|
||||
else
|
||||
widget = new ThemeLayoutWidget(_curLayout.top(), name,
|
||||
typeW == -1 ? w : typeW,
|
||||
typeH == -1 ? h : typeH,
|
||||
typeAlign == Graphics::kTextAlignInvalid ? align : typeAlign,
|
||||
typeAlign == GUI::ThemeEngine::kTextAlignHInvalid ? align : typeAlign,
|
||||
useRTL);
|
||||
|
||||
_curLayout.top()->addChild(widget);
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "graphics/font.h"
|
||||
|
||||
#include "gui/ThemeLayout.h"
|
||||
#include "gui/ThemeEngine.h"
|
||||
|
||||
namespace GUI {
|
||||
|
||||
@ -76,7 +77,7 @@ public:
|
||||
|
||||
ThemeEval &addDialog(const Common::String &name, const Common::String &overlays, int16 maxWidth = -1, int16 maxHeight = -1, int inset = 0);
|
||||
ThemeEval &addLayout(ThemeLayout::LayoutType type, int spacing = -1, ThemeLayout::ItemAlign itemAlign = ThemeLayout::kItemAlignStart);
|
||||
ThemeEval &addWidget(const Common::String &name, const Common::String &type, int w = -1, int h = -1, Graphics::TextAlign align = Graphics::kTextAlignLeft, bool useRTL = false);
|
||||
ThemeEval &addWidget(const Common::String &name, const Common::String &type, int w = -1, int h = -1, GUI::ThemeEngine::TextAlignH align = GUI::ThemeEngine::kTextAlignHStart, bool useRTL = false);
|
||||
ThemeEval &addImportedLayout(const Common::String &name);
|
||||
ThemeEval &addSpace(int size = -1);
|
||||
|
||||
@ -91,7 +92,7 @@ public:
|
||||
bool getWidgetData(const Common::String &widget, int16 &x, int16 &y, int16 &w, int16 &h);
|
||||
bool getWidgetData(const Common::String &widget, int16 &x, int16 &y, int16 &w, int16 &h, bool &useRTL);
|
||||
|
||||
Graphics::TextAlign getWidgetTextHAlign(const Common::String &widget);
|
||||
GUI::ThemeEngine::TextAlignH getWidgetTextHAlign(const Common::String &widget);
|
||||
|
||||
#ifdef LAYOUT_DEBUG_DIALOG
|
||||
void debugDraw(Graphics::Surface *screen, const Graphics::Font *font) {
|
||||
|
@ -89,20 +89,20 @@ bool ThemeLayout::getWidgetData(const Common::String &name, int16 &x, int16 &y,
|
||||
return false;
|
||||
}
|
||||
|
||||
Graphics::TextAlign ThemeLayout::getWidgetTextHAlign(const Common::String &name) {
|
||||
GUI::ThemeEngine::TextAlignH ThemeLayout::getWidgetTextHAlign(const Common::String &name) {
|
||||
if (name.empty()) {
|
||||
assert(getLayoutType() == kLayoutMain);
|
||||
return _textHAlign;
|
||||
}
|
||||
|
||||
Graphics::TextAlign res;
|
||||
GUI::ThemeEngine::TextAlignH res;
|
||||
|
||||
for (uint i = 0; i < _children.size(); ++i) {
|
||||
if ((res = _children[i]->getWidgetTextHAlign(name)) != Graphics::kTextAlignInvalid)
|
||||
if ((res = _children[i]->getWidgetTextHAlign(name)) != GUI::ThemeEngine::kTextAlignHInvalid)
|
||||
return res;
|
||||
}
|
||||
|
||||
return Graphics::kTextAlignInvalid;
|
||||
return GUI::ThemeEngine::kTextAlignHInvalid;
|
||||
}
|
||||
|
||||
int16 ThemeLayoutStacked::getParentWidth() {
|
||||
@ -172,12 +172,12 @@ bool ThemeLayoutWidget::getWidgetData(const Common::String &name, int16 &x, int1
|
||||
return false;
|
||||
}
|
||||
|
||||
Graphics::TextAlign ThemeLayoutWidget::getWidgetTextHAlign(const Common::String &name) {
|
||||
GUI::ThemeEngine::TextAlignH ThemeLayoutWidget::getWidgetTextHAlign(const Common::String &name) {
|
||||
if (name == _name) {
|
||||
return _textHAlign;
|
||||
}
|
||||
|
||||
return Graphics::kTextAlignInvalid;
|
||||
return GUI::ThemeEngine::kTextAlignHInvalid;
|
||||
}
|
||||
|
||||
void ThemeLayoutWidget::reflowLayout(Widget *widgetChain) {
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "common/array.h"
|
||||
#include "common/rect.h"
|
||||
#include "graphics/font.h"
|
||||
#include "gui/ThemeEngine.h"
|
||||
|
||||
#ifdef LAYOUT_DEBUG_DIALOG
|
||||
namespace Graphics {
|
||||
@ -63,7 +64,7 @@ public:
|
||||
ThemeLayout(ThemeLayout *p) :
|
||||
_parent(p), _x(0), _y(0), _w(-1), _h(-1),
|
||||
_defaultW(-1), _defaultH(-1),
|
||||
_textHAlign(Graphics::kTextAlignInvalid) {}
|
||||
_textHAlign(GUI::ThemeEngine::kTextAlignHInvalid) {}
|
||||
|
||||
virtual ~ThemeLayout() {
|
||||
for (uint i = 0; i < _children.size(); ++i)
|
||||
@ -100,7 +101,7 @@ protected:
|
||||
|
||||
void setWidth(int16 width) { _w = width; }
|
||||
void setHeight(int16 height) { _h = height; }
|
||||
void setTextHAlign(Graphics::TextAlign align) { _textHAlign = align; }
|
||||
void setTextHAlign(GUI::ThemeEngine::TextAlignH align) { _textHAlign = align; }
|
||||
|
||||
/**
|
||||
* Checks if the layout element is attached to a GUI widget
|
||||
@ -116,11 +117,11 @@ protected:
|
||||
public:
|
||||
virtual bool getWidgetData(const Common::String &name, int16 &x, int16 &y, int16 &w, int16 &h, bool &useRTL);
|
||||
|
||||
virtual Graphics::TextAlign getWidgetTextHAlign(const Common::String &name);
|
||||
virtual GUI::ThemeEngine::TextAlignH getWidgetTextHAlign(const Common::String &name);
|
||||
|
||||
void importLayout(ThemeLayout *layout);
|
||||
|
||||
Graphics::TextAlign getTextHAlign() { return _textHAlign; }
|
||||
GUI::ThemeEngine::TextAlignH getTextHAlign() { return _textHAlign; }
|
||||
|
||||
#ifdef LAYOUT_DEBUG_DIALOG
|
||||
void debugDraw(Graphics::Surface *screen, const Graphics::Font *font);
|
||||
@ -135,7 +136,7 @@ protected:
|
||||
Common::Rect _padding;
|
||||
Common::Array<ThemeLayout *> _children;
|
||||
int16 _defaultW, _defaultH;
|
||||
Graphics::TextAlign _textHAlign;
|
||||
GUI::ThemeEngine::TextAlignH _textHAlign;
|
||||
};
|
||||
|
||||
class ThemeLayoutMain : public ThemeLayout {
|
||||
@ -220,7 +221,7 @@ protected:
|
||||
|
||||
class ThemeLayoutWidget : public ThemeLayout {
|
||||
public:
|
||||
ThemeLayoutWidget(ThemeLayout *p, const Common::String &name, int16 w, int16 h, Graphics::TextAlign align, bool &useRTL) : ThemeLayout(p), _name(name) {
|
||||
ThemeLayoutWidget(ThemeLayout *p, const Common::String &name, int16 w, int16 h, GUI::ThemeEngine::TextAlignH align, bool &useRTL) : ThemeLayout(p), _name(name) {
|
||||
_w = _defaultW = w;
|
||||
_h = _defaultH = h;
|
||||
_useRTL = useRTL;
|
||||
@ -229,7 +230,7 @@ public:
|
||||
}
|
||||
|
||||
bool getWidgetData(const Common::String &name, int16 &x, int16 &y, int16 &w, int16 &h, bool &useRTL) override;
|
||||
Graphics::TextAlign getWidgetTextHAlign(const Common::String &name) override;
|
||||
GUI::ThemeEngine::TextAlignH getWidgetTextHAlign(const Common::String &name) override;
|
||||
|
||||
void reflowLayout(Widget *widgetChain) override;
|
||||
|
||||
@ -254,7 +255,7 @@ class ThemeLayoutTabWidget : public ThemeLayoutWidget {
|
||||
int _tabHeight;
|
||||
|
||||
public:
|
||||
ThemeLayoutTabWidget(ThemeLayout *p, const Common::String &name, int16 w, int16 h, Graphics::TextAlign align, int tabHeight):
|
||||
ThemeLayoutTabWidget(ThemeLayout *p, const Common::String &name, int16 w, int16 h, GUI::ThemeEngine::TextAlignH align, int tabHeight):
|
||||
ThemeLayoutWidget(p, name, w, h, align, _useRTL) {
|
||||
_tabHeight = tabHeight;
|
||||
}
|
||||
|
@ -717,8 +717,7 @@ bool ThemeParser::parserCallback_widget(ParserNode *node) {
|
||||
useRTL = false;
|
||||
}
|
||||
|
||||
Graphics::TextAlign textAlign = GUI::convertTextAlignH(alignH, false);
|
||||
_theme->getEvaluator()->addWidget(var, node->values["type"], width, height, textAlign, useRTL);
|
||||
_theme->getEvaluator()->addWidget(var, node->values["type"], width, height, alignH, useRTL);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -1135,8 +1135,6 @@ void OptionsDialog::addAchievementsControls(GuiObject *boss, const Common::Strin
|
||||
uint16 width = g_system->getOverlayWidth() <= 320 ? 240 : 410;
|
||||
uint16 descrDelta = g_system->getOverlayWidth() <= 320 ? 25 : 30;
|
||||
|
||||
Graphics::TextAlign alignment = g_gui.useRTL() ? Graphics::kTextAlignRight : Graphics::kTextAlignLeft;
|
||||
|
||||
for (int16 viewAchieved = 1; viewAchieved >= 0; viewAchieved--) {
|
||||
// run this twice, first view all achieved, then view all non-hidden & non-achieved
|
||||
|
||||
@ -1163,7 +1161,7 @@ void OptionsDialog::addAchievementsControls(GuiObject *boss, const Common::Strin
|
||||
yPos += yStep;
|
||||
|
||||
if (info.descriptions[idx].comment && strlen(info.descriptions[idx].comment) > 0) {
|
||||
new StaticTextWidget(scrollContainer, lineHeight + descrDelta, yPos, width - descrDelta, yStep, info.descriptions[idx].comment, alignment, "", ThemeEngine::kFontStyleNormal);
|
||||
new StaticTextWidget(scrollContainer, lineHeight + descrDelta, yPos, width - descrDelta, yStep, info.descriptions[idx].comment, GUI::ThemeEngine::kTextAlignHStart, "", ThemeEngine::kFontStyleNormal);
|
||||
yPos += yStep;
|
||||
}
|
||||
|
||||
@ -1173,12 +1171,12 @@ void OptionsDialog::addAchievementsControls(GuiObject *boss, const Common::Strin
|
||||
|
||||
if (nHidden) {
|
||||
Common::String hiddenStr = Common::String::format(_("%d hidden achievements remaining"), nHidden);
|
||||
new StaticTextWidget(scrollContainer, lineHeight, yPos, width, yStep, hiddenStr.c_str(), alignment);
|
||||
new StaticTextWidget(scrollContainer, lineHeight, yPos, width, yStep, hiddenStr.c_str(), GUI::ThemeEngine::kTextAlignHStart);
|
||||
}
|
||||
|
||||
if (nMax) {
|
||||
Common::String totalStr = Common::String::format(_("Achievements unlocked: %d/%d"), nAchieved, nMax);
|
||||
new StaticTextWidget(scrollContainer, lineHeight, lineHeight, width, yStep, totalStr.c_str(), alignment);
|
||||
new StaticTextWidget(scrollContainer, lineHeight, lineHeight, width, yStep, totalStr.c_str(), GUI::ThemeEngine::kTextAlignHStart);
|
||||
|
||||
SliderWidget *progressBar;
|
||||
progressBar = new SliderWidget(scrollContainer, lineHeight, lineHeight*2, progressBarWidth, lineHeight);
|
||||
|
@ -377,8 +377,6 @@ SaveLoadChooserSimple::SaveLoadChooserSimple(const String &title, const String &
|
||||
_backgroundType = ThemeEngine::kDialogBackgroundSpecial;
|
||||
|
||||
_pageTitle = new StaticTextWidget(this, "SaveLoadChooser.Title", title);
|
||||
if (g_gui.useRTL())
|
||||
_pageTitle->setAlign(Graphics::kTextAlignRight);
|
||||
|
||||
// Add choice list
|
||||
_list = new ListWidget(this, "SaveLoadChooser.List");
|
||||
@ -760,8 +758,6 @@ SaveLoadChooserGrid::SaveLoadChooserGrid(const Common::String &title, bool saveM
|
||||
_backgroundType = ThemeEngine::kDialogBackgroundSpecial;
|
||||
|
||||
_pageTitle = new StaticTextWidget(this, "SaveLoadChooser.Title", title);
|
||||
if (g_gui.useRTL())
|
||||
_pageTitle->setAlign(Graphics::kTextAlignRight);
|
||||
|
||||
// The list widget needs to be bound so it takes space in the layout
|
||||
ContainerWidget *list = new ContainerWidget(this, "SaveLoadChooser.List");
|
||||
@ -777,11 +773,7 @@ SaveLoadChooserGrid::SaveLoadChooserGrid(const Common::String &title, bool saveM
|
||||
|
||||
// Page display
|
||||
_pageDisplay = new StaticTextWidget(this, "SaveLoadChooser.PageDisplay", Common::String());
|
||||
if (g_gui.useRTL()) {
|
||||
_pageDisplay->setAlign(Graphics::kTextAlignLeft);
|
||||
} else {
|
||||
_pageDisplay->setAlign(Graphics::kTextAlignRight);
|
||||
}
|
||||
_pageDisplay->setAlign(GUI::ThemeEngine::kTextAlignHEnd);
|
||||
}
|
||||
|
||||
SaveLoadChooserGrid::~SaveLoadChooserGrid() {
|
||||
@ -955,8 +947,6 @@ void SaveLoadChooserGrid::reflowLayout() {
|
||||
_lines = MAX<uint>(1, availableHeight / slotAreaHeight);
|
||||
_entriesPerPage = _columns * _lines;
|
||||
|
||||
Graphics::TextAlign alignment = Graphics::kTextAlignLeft;
|
||||
|
||||
// In save mode the first button is always "New Save", thus we need to
|
||||
// adjust the entries per page here.
|
||||
if (_saveMode) {
|
||||
@ -1004,14 +994,10 @@ void SaveLoadChooserGrid::reflowLayout() {
|
||||
buttonCmd += 1;
|
||||
}
|
||||
|
||||
if (g_gui.useRTL()) {
|
||||
alignment = Graphics::kTextAlignRight;
|
||||
}
|
||||
|
||||
PicButtonWidget *button = new PicButtonWidget(container, dstX, dstY, buttonWidth, buttonHeight, nullptr, buttonCmd);
|
||||
dstY += buttonHeight;
|
||||
|
||||
StaticTextWidget *description = new StaticTextWidget(container, dstX, dstY, buttonWidth, kLineHeight, Common::String(), alignment);
|
||||
StaticTextWidget *description = new StaticTextWidget(container, dstX, dstY, buttonWidth, kLineHeight, Common::String(), GUI::ThemeEngine::kTextAlignHStart);
|
||||
|
||||
_buttons.push_back(SlotButton(container, button, description));
|
||||
}
|
||||
|
@ -299,20 +299,22 @@ StaticTextWidget::StaticTextWidget(GuiObject *boss, int x, int y, int w, int h,
|
||||
_font = font;
|
||||
}
|
||||
|
||||
StaticTextWidget::StaticTextWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &text, GUI::ThemeEngine::TextAlignH align, const char *tooltip, ThemeEngine::FontStyle font)
|
||||
: Widget(boss, x, y, w, h, tooltip) {
|
||||
setFlags(WIDGET_ENABLED);
|
||||
_type = kStaticTextWidget;
|
||||
_label = text;
|
||||
_font = font;
|
||||
_align = GUI::convertTextAlignH(align, g_gui.useRTL() && _useRTL);
|
||||
}
|
||||
|
||||
StaticTextWidget::StaticTextWidget(GuiObject *boss, const Common::String &name, const Common::String &text, const char *tooltip, ThemeEngine::FontStyle font)
|
||||
: Widget(boss, name, tooltip) {
|
||||
setFlags(WIDGET_ENABLED | WIDGET_CLEARBG);
|
||||
_type = kStaticTextWidget;
|
||||
_label = text;
|
||||
|
||||
_align = g_gui.xmlEval()->getWidgetTextHAlign(name);
|
||||
if (g_gui.useRTL() && _useRTL) {
|
||||
if (_align == Graphics::kTextAlignLeft) {
|
||||
_align = Graphics::kTextAlignRight;
|
||||
} else if (_align == Graphics::kTextAlignRight) {
|
||||
_align = Graphics::kTextAlignLeft;
|
||||
}
|
||||
}
|
||||
_align = GUI::convertTextAlignH(g_gui.xmlEval()->getWidgetTextHAlign(name), g_gui.useRTL() && _useRTL);
|
||||
|
||||
_font = font;
|
||||
}
|
||||
@ -337,6 +339,9 @@ void StaticTextWidget::setAlign(Graphics::TextAlign align) {
|
||||
}
|
||||
}
|
||||
|
||||
void StaticTextWidget::setAlign(GUI::ThemeEngine::TextAlignH align) {
|
||||
setAlign(GUI::convertTextAlignH(align, g_gui.useRTL() && _useRTL));
|
||||
}
|
||||
|
||||
void StaticTextWidget::drawWidget() {
|
||||
g_gui.theme()->drawText(
|
||||
|
@ -201,12 +201,15 @@ protected:
|
||||
ThemeEngine::FontStyle _font;
|
||||
public:
|
||||
StaticTextWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &text, Graphics::TextAlign align, const char *tooltip = nullptr, ThemeEngine::FontStyle font = ThemeEngine::kFontStyleBold);
|
||||
StaticTextWidget(GuiObject *boss, int x, int y, int w, int h, const Common::String &text, GUI::ThemeEngine::TextAlignH align, const char *tooltip = nullptr, ThemeEngine::FontStyle font = ThemeEngine::kFontStyleBold);
|
||||
StaticTextWidget(GuiObject *boss, const Common::String &name, const Common::String &text, const char *tooltip = nullptr, ThemeEngine::FontStyle font = ThemeEngine::kFontStyleBold);
|
||||
void setValue(int value);
|
||||
void setLabel(const Common::String &label);
|
||||
void handleMouseEntered(int button) override { readLabel(); }
|
||||
const Common::String &getLabel() const { return _label; }
|
||||
void setAlign(Graphics::TextAlign align);
|
||||
void setAlign(GUI::ThemeEngine::TextAlignH align);
|
||||
|
||||
Graphics::TextAlign getAlign() const { return _align; }
|
||||
void readLabel() { read(_label); }
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user