mirror of
https://github.com/cookiengineer/audacity
synced 2025-08-01 16:39:30 +02:00
Move class ShuttleGuiGetDefinition near its only point of use
This commit is contained in:
parent
5be54c5612
commit
7ad6897598
@ -2392,170 +2392,3 @@ void ShuttleGuiBase::SetSizeHints( const wxArrayStringEx & items )
|
|||||||
|
|
||||||
SetSizeHints( mpLastWind, items );
|
SetSizeHints( mpLastWind, items );
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************* GetDefinition ******************************/
|
|
||||||
|
|
||||||
ShuttleGuiGetDefinition::ShuttleGuiGetDefinition(
|
|
||||||
wxWindow * pParent,CommandMessageTarget & target )
|
|
||||||
: ShuttleGui( pParent, eIsGettingMetadata ),
|
|
||||||
CommandMessageTargetDecorator( target )
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
ShuttleGuiGetDefinition::~ShuttleGuiGetDefinition(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
wxCheckBox * ShuttleGuiGetDefinition::TieCheckBox(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const bool bDefault)
|
|
||||||
{
|
|
||||||
StartStruct();
|
|
||||||
AddItem( SettingName, "id" );
|
|
||||||
AddItem( Prompt, "prompt" );
|
|
||||||
AddItem( "bool", "type" );
|
|
||||||
AddBool( bDefault, "default" );
|
|
||||||
EndStruct();
|
|
||||||
return ShuttleGui::TieCheckBox( Prompt, SettingName, bDefault );
|
|
||||||
}
|
|
||||||
wxCheckBox * ShuttleGuiGetDefinition::TieCheckBoxOnRight(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const bool bDefault)
|
|
||||||
{
|
|
||||||
StartStruct();
|
|
||||||
AddItem( SettingName, "id" );
|
|
||||||
AddItem( Prompt, "prompt" );
|
|
||||||
AddItem( "bool", "type" );
|
|
||||||
AddBool( bDefault, "default" );
|
|
||||||
EndStruct();
|
|
||||||
return ShuttleGui::TieCheckBoxOnRight( Prompt, SettingName, bDefault );
|
|
||||||
}
|
|
||||||
wxChoice * ShuttleGuiGetDefinition::TieChoice(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const wxString &Default,
|
|
||||||
const wxArrayStringEx &Choices,
|
|
||||||
const wxArrayStringEx & InternalChoices )
|
|
||||||
{
|
|
||||||
StartStruct();
|
|
||||||
AddItem( SettingName, "id" );
|
|
||||||
AddItem( Prompt, "prompt" );
|
|
||||||
AddItem( "enum", "type" );
|
|
||||||
AddItem( Default, "default" );
|
|
||||||
StartField( "enum" );
|
|
||||||
StartArray();
|
|
||||||
for( size_t i=0;i<Choices.size(); i++ )
|
|
||||||
AddItem( InternalChoices[i] );
|
|
||||||
EndArray();
|
|
||||||
EndField();
|
|
||||||
EndStruct();
|
|
||||||
return ShuttleGui::TieChoice( Prompt, SettingName, Default, Choices, InternalChoices );
|
|
||||||
}
|
|
||||||
wxChoice * ShuttleGuiGetDefinition::TieChoice(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const int Default,
|
|
||||||
const wxArrayStringEx & Choices,
|
|
||||||
const std::vector<int> & InternalChoices)
|
|
||||||
{
|
|
||||||
// Should no longer come here!
|
|
||||||
// Choice controls in Preferences that really are exhaustive choices among
|
|
||||||
// non-numerical options must now encode the internal choices as strings,
|
|
||||||
// not numbers.
|
|
||||||
wxASSERT(false);
|
|
||||||
|
|
||||||
// But if we do get here anyway, proceed sub-optimally as before.
|
|
||||||
StartStruct();
|
|
||||||
AddItem( SettingName, "id" );
|
|
||||||
AddItem( Prompt, "prompt" );
|
|
||||||
AddItem( "enum", "type" );
|
|
||||||
AddItem( Default, "default" );
|
|
||||||
StartField( "enum" );
|
|
||||||
StartArray();
|
|
||||||
for( size_t i=0;i<Choices.size(); i++ )
|
|
||||||
AddItem( Choices[i] );
|
|
||||||
EndArray();
|
|
||||||
EndField();
|
|
||||||
EndStruct();
|
|
||||||
return ShuttleGui::TieChoice( Prompt, SettingName, Default, Choices, InternalChoices );
|
|
||||||
}
|
|
||||||
wxChoice * ShuttleGuiGetDefinition::TieNumberAsChoice(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const int Default,
|
|
||||||
const wxArrayStringEx & Choices,
|
|
||||||
const std::vector<int> & InternalChoices)
|
|
||||||
{
|
|
||||||
// Come here for controls that present non-exhaustive choices among some
|
|
||||||
// numbers, with an associated control that allows arbitrary entry of an
|
|
||||||
// "Other..."
|
|
||||||
StartStruct();
|
|
||||||
AddItem( SettingName, "id" );
|
|
||||||
AddItem( Prompt, "prompt" );
|
|
||||||
AddItem( "number", "type" ); // not "enum" !
|
|
||||||
AddItem( Default, "default" );
|
|
||||||
EndStruct();
|
|
||||||
return ShuttleGui::TieNumberAsChoice(
|
|
||||||
Prompt, SettingName, Default, Choices, InternalChoices );
|
|
||||||
}
|
|
||||||
wxTextCtrl * ShuttleGuiGetDefinition::TieTextBox(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const wxString &Default,
|
|
||||||
const int nChars)
|
|
||||||
{
|
|
||||||
StartStruct();
|
|
||||||
AddItem( SettingName, "id" );
|
|
||||||
AddItem( Prompt, "prompt" );
|
|
||||||
AddItem( "string", "type" );
|
|
||||||
AddItem( Default, "default" );
|
|
||||||
EndStruct();
|
|
||||||
return ShuttleGui::TieTextBox( Prompt, SettingName, Default, nChars );
|
|
||||||
}
|
|
||||||
wxTextCtrl * ShuttleGuiGetDefinition::TieNumericTextBox(
|
|
||||||
const wxString & Prompt,
|
|
||||||
const wxString & SettingName,
|
|
||||||
const double & Default,
|
|
||||||
const int nChars)
|
|
||||||
{
|
|
||||||
StartStruct();
|
|
||||||
AddItem( SettingName, "id" );
|
|
||||||
AddItem( Prompt, "prompt" );
|
|
||||||
AddItem( "number", "type" );
|
|
||||||
AddItem( Default, "default" );
|
|
||||||
EndStruct();
|
|
||||||
return ShuttleGui::TieNumericTextBox( Prompt, SettingName, Default, nChars );
|
|
||||||
}
|
|
||||||
wxSlider * ShuttleGuiGetDefinition::TieSlider(
|
|
||||||
const wxString & Prompt,
|
|
||||||
const wxString & SettingName,
|
|
||||||
const int iDefault,
|
|
||||||
const int max,
|
|
||||||
const int min)
|
|
||||||
{
|
|
||||||
StartStruct();
|
|
||||||
AddItem( SettingName, "id" );
|
|
||||||
AddItem( Prompt, "prompt" );
|
|
||||||
AddItem( "number", "type" );
|
|
||||||
AddItem( iDefault, "default" );
|
|
||||||
EndStruct();
|
|
||||||
return ShuttleGui::TieSlider( Prompt, SettingName, iDefault, max, min );
|
|
||||||
}
|
|
||||||
wxSpinCtrl * ShuttleGuiGetDefinition::TieSpinCtrl(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const int Value,
|
|
||||||
const int max,
|
|
||||||
const int min)
|
|
||||||
{
|
|
||||||
StartStruct();
|
|
||||||
AddItem( SettingName, "id" );
|
|
||||||
AddItem( Prompt, "prompt" );
|
|
||||||
AddItem( "number", "type" );
|
|
||||||
AddItem( Value, "default" );
|
|
||||||
EndStruct();
|
|
||||||
return ShuttleGui::TieSpinCtrl( Prompt, SettingName, Value, max, min );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -22,9 +22,6 @@
|
|||||||
|
|
||||||
#include "WrappedType.h"
|
#include "WrappedType.h"
|
||||||
|
|
||||||
// For ShuttleGuiGetDefinitions.
|
|
||||||
#include "commands/CommandTargets.h"
|
|
||||||
|
|
||||||
class ChoiceSetting;
|
class ChoiceSetting;
|
||||||
|
|
||||||
class wxArrayStringEx;
|
class wxArrayStringEx;
|
||||||
@ -443,68 +440,4 @@ public:
|
|||||||
teShuttleMode GetMode() { return mShuttleMode; };
|
teShuttleMode GetMode() { return mShuttleMode; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************//**
|
|
||||||
\brief Shuttle that retrieves a JSON format definition of a command's parameters.
|
|
||||||
********************************************************************************/
|
|
||||||
class ShuttleGuiGetDefinition : public ShuttleGui, public CommandMessageTargetDecorator
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ShuttleGuiGetDefinition(wxWindow * pParent,CommandMessageTarget & target );
|
|
||||||
virtual ~ShuttleGuiGetDefinition();
|
|
||||||
|
|
||||||
wxCheckBox * TieCheckBox(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const bool bDefault) override;
|
|
||||||
wxCheckBox * TieCheckBoxOnRight(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const bool bDefault) override;
|
|
||||||
wxChoice * TieChoice(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const wxString &Default,
|
|
||||||
const wxArrayStringEx &Choices,
|
|
||||||
const wxArrayStringEx & InternalChoices ) override;
|
|
||||||
|
|
||||||
// An assertion will be violated if this override is reached!
|
|
||||||
wxChoice * TieChoice(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const int Default,
|
|
||||||
const wxArrayStringEx & Choices,
|
|
||||||
const std::vector<int> & InternalChoices) override;
|
|
||||||
|
|
||||||
wxChoice * TieNumberAsChoice(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const int Default,
|
|
||||||
const wxArrayStringEx & Choices,
|
|
||||||
const std::vector<int> & InternalChoices) override;
|
|
||||||
|
|
||||||
wxTextCtrl * TieTextBox(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const wxString &Default,
|
|
||||||
const int nChars) override;
|
|
||||||
wxTextCtrl * TieNumericTextBox(
|
|
||||||
const wxString & Prompt,
|
|
||||||
const wxString & SettingName,
|
|
||||||
const double & Default,
|
|
||||||
const int nChars) override;
|
|
||||||
wxSlider * TieSlider(
|
|
||||||
const wxString & Prompt,
|
|
||||||
const wxString & SettingName,
|
|
||||||
const int iDefault,
|
|
||||||
const int max,
|
|
||||||
const int min = 0) override;
|
|
||||||
wxSpinCtrl * TieSpinCtrl(
|
|
||||||
const wxString &Prompt,
|
|
||||||
const wxString &SettingName,
|
|
||||||
const int Value,
|
|
||||||
const int max,
|
|
||||||
const int min) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -185,6 +185,237 @@ bool GetInfoCommand::SendMenus(const CommandContext &context)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
/**************************************************************************//**
|
||||||
|
\brief Shuttle that retrieves a JSON format definition of a command's parameters.
|
||||||
|
********************************************************************************/
|
||||||
|
class ShuttleGuiGetDefinition : public ShuttleGui, public CommandMessageTargetDecorator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ShuttleGuiGetDefinition(wxWindow * pParent,CommandMessageTarget & target );
|
||||||
|
virtual ~ShuttleGuiGetDefinition();
|
||||||
|
|
||||||
|
wxCheckBox * TieCheckBox(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const bool bDefault) override;
|
||||||
|
wxCheckBox * TieCheckBoxOnRight(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const bool bDefault) override;
|
||||||
|
wxChoice * TieChoice(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const wxString &Default,
|
||||||
|
const wxArrayStringEx &Choices,
|
||||||
|
const wxArrayStringEx & InternalChoices ) override;
|
||||||
|
|
||||||
|
// An assertion will be violated if this override is reached!
|
||||||
|
wxChoice * TieChoice(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const int Default,
|
||||||
|
const wxArrayStringEx & Choices,
|
||||||
|
const std::vector<int> & InternalChoices) override;
|
||||||
|
|
||||||
|
wxChoice * TieNumberAsChoice(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const int Default,
|
||||||
|
const wxArrayStringEx & Choices,
|
||||||
|
const std::vector<int> & InternalChoices) override;
|
||||||
|
|
||||||
|
wxTextCtrl * TieTextBox(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const wxString &Default,
|
||||||
|
const int nChars) override;
|
||||||
|
wxTextCtrl * TieNumericTextBox(
|
||||||
|
const wxString & Prompt,
|
||||||
|
const wxString & SettingName,
|
||||||
|
const double & Default,
|
||||||
|
const int nChars) override;
|
||||||
|
wxSlider * TieSlider(
|
||||||
|
const wxString & Prompt,
|
||||||
|
const wxString & SettingName,
|
||||||
|
const int iDefault,
|
||||||
|
const int max,
|
||||||
|
const int min = 0) override;
|
||||||
|
wxSpinCtrl * TieSpinCtrl(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const int Value,
|
||||||
|
const int max,
|
||||||
|
const int min) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
ShuttleGuiGetDefinition::ShuttleGuiGetDefinition(
|
||||||
|
wxWindow * pParent,CommandMessageTarget & target )
|
||||||
|
: ShuttleGui( pParent, eIsGettingMetadata ),
|
||||||
|
CommandMessageTargetDecorator( target )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
ShuttleGuiGetDefinition::~ShuttleGuiGetDefinition(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxCheckBox * ShuttleGuiGetDefinition::TieCheckBox(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const bool bDefault)
|
||||||
|
{
|
||||||
|
StartStruct();
|
||||||
|
AddItem( SettingName, "id" );
|
||||||
|
AddItem( Prompt, "prompt" );
|
||||||
|
AddItem( "bool", "type" );
|
||||||
|
AddBool( bDefault, "default" );
|
||||||
|
EndStruct();
|
||||||
|
return ShuttleGui::TieCheckBox( Prompt, SettingName, bDefault );
|
||||||
|
}
|
||||||
|
wxCheckBox * ShuttleGuiGetDefinition::TieCheckBoxOnRight(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const bool bDefault)
|
||||||
|
{
|
||||||
|
StartStruct();
|
||||||
|
AddItem( SettingName, "id" );
|
||||||
|
AddItem( Prompt, "prompt" );
|
||||||
|
AddItem( "bool", "type" );
|
||||||
|
AddBool( bDefault, "default" );
|
||||||
|
EndStruct();
|
||||||
|
return ShuttleGui::TieCheckBoxOnRight( Prompt, SettingName, bDefault );
|
||||||
|
}
|
||||||
|
wxChoice * ShuttleGuiGetDefinition::TieChoice(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const wxString &Default,
|
||||||
|
const wxArrayStringEx &Choices,
|
||||||
|
const wxArrayStringEx & InternalChoices )
|
||||||
|
{
|
||||||
|
StartStruct();
|
||||||
|
AddItem( SettingName, "id" );
|
||||||
|
AddItem( Prompt, "prompt" );
|
||||||
|
AddItem( "enum", "type" );
|
||||||
|
AddItem( Default, "default" );
|
||||||
|
StartField( "enum" );
|
||||||
|
StartArray();
|
||||||
|
for( size_t i=0;i<Choices.size(); i++ )
|
||||||
|
AddItem( InternalChoices[i] );
|
||||||
|
EndArray();
|
||||||
|
EndField();
|
||||||
|
EndStruct();
|
||||||
|
return ShuttleGui::TieChoice( Prompt, SettingName, Default, Choices, InternalChoices );
|
||||||
|
}
|
||||||
|
wxChoice * ShuttleGuiGetDefinition::TieChoice(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const int Default,
|
||||||
|
const wxArrayStringEx & Choices,
|
||||||
|
const std::vector<int> & InternalChoices)
|
||||||
|
{
|
||||||
|
// Should no longer come here!
|
||||||
|
// Choice controls in Preferences that really are exhaustive choices among
|
||||||
|
// non-numerical options must now encode the internal choices as strings,
|
||||||
|
// not numbers.
|
||||||
|
wxASSERT(false);
|
||||||
|
|
||||||
|
// But if we do get here anyway, proceed sub-optimally as before.
|
||||||
|
StartStruct();
|
||||||
|
AddItem( SettingName, "id" );
|
||||||
|
AddItem( Prompt, "prompt" );
|
||||||
|
AddItem( "enum", "type" );
|
||||||
|
AddItem( Default, "default" );
|
||||||
|
StartField( "enum" );
|
||||||
|
StartArray();
|
||||||
|
for( size_t i=0;i<Choices.size(); i++ )
|
||||||
|
AddItem( Choices[i] );
|
||||||
|
EndArray();
|
||||||
|
EndField();
|
||||||
|
EndStruct();
|
||||||
|
return ShuttleGui::TieChoice( Prompt, SettingName, Default, Choices, InternalChoices );
|
||||||
|
}
|
||||||
|
wxChoice * ShuttleGuiGetDefinition::TieNumberAsChoice(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const int Default,
|
||||||
|
const wxArrayStringEx & Choices,
|
||||||
|
const std::vector<int> & InternalChoices)
|
||||||
|
{
|
||||||
|
// Come here for controls that present non-exhaustive choices among some
|
||||||
|
// numbers, with an associated control that allows arbitrary entry of an
|
||||||
|
// "Other..."
|
||||||
|
StartStruct();
|
||||||
|
AddItem( SettingName, "id" );
|
||||||
|
AddItem( Prompt, "prompt" );
|
||||||
|
AddItem( "number", "type" ); // not "enum" !
|
||||||
|
AddItem( Default, "default" );
|
||||||
|
EndStruct();
|
||||||
|
return ShuttleGui::TieNumberAsChoice(
|
||||||
|
Prompt, SettingName, Default, Choices, InternalChoices );
|
||||||
|
}
|
||||||
|
wxTextCtrl * ShuttleGuiGetDefinition::TieTextBox(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const wxString &Default,
|
||||||
|
const int nChars)
|
||||||
|
{
|
||||||
|
StartStruct();
|
||||||
|
AddItem( SettingName, "id" );
|
||||||
|
AddItem( Prompt, "prompt" );
|
||||||
|
AddItem( "string", "type" );
|
||||||
|
AddItem( Default, "default" );
|
||||||
|
EndStruct();
|
||||||
|
return ShuttleGui::TieTextBox( Prompt, SettingName, Default, nChars );
|
||||||
|
}
|
||||||
|
wxTextCtrl * ShuttleGuiGetDefinition::TieNumericTextBox(
|
||||||
|
const wxString & Prompt,
|
||||||
|
const wxString & SettingName,
|
||||||
|
const double & Default,
|
||||||
|
const int nChars)
|
||||||
|
{
|
||||||
|
StartStruct();
|
||||||
|
AddItem( SettingName, "id" );
|
||||||
|
AddItem( Prompt, "prompt" );
|
||||||
|
AddItem( "number", "type" );
|
||||||
|
AddItem( Default, "default" );
|
||||||
|
EndStruct();
|
||||||
|
return ShuttleGui::TieNumericTextBox( Prompt, SettingName, Default, nChars );
|
||||||
|
}
|
||||||
|
wxSlider * ShuttleGuiGetDefinition::TieSlider(
|
||||||
|
const wxString & Prompt,
|
||||||
|
const wxString & SettingName,
|
||||||
|
const int iDefault,
|
||||||
|
const int max,
|
||||||
|
const int min)
|
||||||
|
{
|
||||||
|
StartStruct();
|
||||||
|
AddItem( SettingName, "id" );
|
||||||
|
AddItem( Prompt, "prompt" );
|
||||||
|
AddItem( "number", "type" );
|
||||||
|
AddItem( iDefault, "default" );
|
||||||
|
EndStruct();
|
||||||
|
return ShuttleGui::TieSlider( Prompt, SettingName, iDefault, max, min );
|
||||||
|
}
|
||||||
|
wxSpinCtrl * ShuttleGuiGetDefinition::TieSpinCtrl(
|
||||||
|
const wxString &Prompt,
|
||||||
|
const wxString &SettingName,
|
||||||
|
const int Value,
|
||||||
|
const int max,
|
||||||
|
const int min)
|
||||||
|
{
|
||||||
|
StartStruct();
|
||||||
|
AddItem( SettingName, "id" );
|
||||||
|
AddItem( Prompt, "prompt" );
|
||||||
|
AddItem( "number", "type" );
|
||||||
|
AddItem( Value, "default" );
|
||||||
|
EndStruct();
|
||||||
|
return ShuttleGui::TieSpinCtrl( Prompt, SettingName, Value, max, min );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
bool GetInfoCommand::SendPreferences(const CommandContext &context)
|
bool GetInfoCommand::SendPreferences(const CommandContext &context)
|
||||||
{
|
{
|
||||||
context.StartArray();
|
context.StartArray();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user