mirror of
https://github.com/SFML/SFML.git
synced 2024-11-25 04:41:05 +08:00
Remove default sf::Text
constructor
This commit is contained in:
parent
57a40c531f
commit
2c99b3343a
@ -30,7 +30,7 @@
|
|||||||
/// sf::Font font;
|
/// sf::Font font;
|
||||||
/// if (!font.loadFromFile("arial.ttf"))
|
/// if (!font.loadFromFile("arial.ttf"))
|
||||||
/// return EXIT_FAILURE;
|
/// return EXIT_FAILURE;
|
||||||
/// sf::Text text("Hello SFML", font, 50);
|
/// sf::Text text(font, "Hello SFML", 50);
|
||||||
///
|
///
|
||||||
/// // Load a music to play
|
/// // Load a music to play
|
||||||
/// sf::Music music;
|
/// sf::Music music;
|
||||||
|
@ -94,7 +94,7 @@ int main(int argc, char* argv[])
|
|||||||
if (!font.loadFromFile("tuffy.ttf"))
|
if (!font.loadFromFile("tuffy.ttf"))
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
sf::Text text("Tap anywhere to move the logo.", font, 64);
|
sf::Text text(font, "Tap anywhere to move the logo.", 64);
|
||||||
text.setFillColor(sf::Color::Black);
|
text.setFillColor(sf::Color::Black);
|
||||||
text.setPosition({10, 10});
|
text.setPosition({10, 10});
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
// Our PIMPL
|
// Our PIMPL
|
||||||
struct SFMLmainWindow
|
struct SFMLmainWindow
|
||||||
{
|
{
|
||||||
SFMLmainWindow(sf::WindowHandle win) : renderWindow(win), background(sf::Color::Blue)
|
SFMLmainWindow(sf::WindowHandle win) : renderWindow(win), text(font), background(sf::Color::Blue)
|
||||||
{
|
{
|
||||||
std::string resPath = [[[NSBundle mainBundle] resourcePath] tostdstring];
|
std::string resPath = [[[NSBundle mainBundle] resourcePath] tostdstring];
|
||||||
if (!logo.loadFromFile(resPath + "/logo.png"))
|
if (!logo.loadFromFile(resPath + "/logo.png"))
|
||||||
@ -59,7 +59,6 @@ struct SFMLmainWindow
|
|||||||
NSLog(@"Couldn't load the font");
|
NSLog(@"Couldn't load the font");
|
||||||
|
|
||||||
text.setFillColor(sf::Color::White);
|
text.setFillColor(sf::Color::White);
|
||||||
text.setFont(font);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sf::RenderWindow renderWindow;
|
sf::RenderWindow renderWindow;
|
||||||
|
@ -95,20 +95,18 @@ int main()
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
// Create all of our graphics resources
|
// Create all of our graphics resources
|
||||||
sf::Text hudText;
|
sf::Text hudText(font);
|
||||||
sf::Text statusText;
|
sf::Text statusText(font);
|
||||||
sf::Shader terrainShader;
|
sf::Shader terrainShader;
|
||||||
sf::RenderStates terrainStates(&terrainShader);
|
sf::RenderStates terrainStates(&terrainShader);
|
||||||
sf::VertexBuffer terrain(sf::PrimitiveType::Triangles, sf::VertexBuffer::Static);
|
sf::VertexBuffer terrain(sf::PrimitiveType::Triangles, sf::VertexBuffer::Static);
|
||||||
|
|
||||||
// Set up our text drawables
|
// Set up our text drawables
|
||||||
statusText.setFont(font);
|
|
||||||
statusText.setCharacterSize(28);
|
statusText.setCharacterSize(28);
|
||||||
statusText.setFillColor(sf::Color::White);
|
statusText.setFillColor(sf::Color::White);
|
||||||
statusText.setOutlineColor(sf::Color::Black);
|
statusText.setOutlineColor(sf::Color::Black);
|
||||||
statusText.setOutlineThickness(2.0f);
|
statusText.setOutlineThickness(2.0f);
|
||||||
|
|
||||||
hudText.setFont(font);
|
|
||||||
hudText.setCharacterSize(14);
|
hudText.setCharacterSize(14);
|
||||||
hudText.setFillColor(sf::Color::White);
|
hudText.setFillColor(sf::Color::White);
|
||||||
hudText.setOutlineColor(sf::Color::Black);
|
hudText.setOutlineColor(sf::Color::Black);
|
||||||
|
@ -41,8 +41,9 @@ void updateIdentification(unsigned int index)
|
|||||||
{
|
{
|
||||||
sstr.str("");
|
sstr.str("");
|
||||||
sstr << "Joystick " << index << ":";
|
sstr << "Joystick " << index << ":";
|
||||||
texts.at("ID").label.setString(sstr.str());
|
auto& [label, value] = texts.at("ID");
|
||||||
texts.at("ID").value.setString(sf::Joystick::getIdentification(index).name);
|
label.setString(sstr.str());
|
||||||
|
value.setString(sf::Joystick::getIdentification(index).name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update joystick axes
|
// Update joystick axes
|
||||||
@ -103,37 +104,40 @@ int main()
|
|||||||
sstr.setf(std::ios::fixed | std::ios::boolalpha);
|
sstr.setf(std::ios::fixed | std::ios::boolalpha);
|
||||||
|
|
||||||
// Set up our joystick identification sf::Text objects
|
// Set up our joystick identification sf::Text objects
|
||||||
texts.emplace("ID", JoystickObject{{"<Not Connected>", font}, {"", font}});
|
{
|
||||||
texts.at("ID").label.setPosition({5.f, 5.f});
|
auto [it, success] = texts.emplace("ID", JoystickObject{{font, "<Not Connected>"}, {font}});
|
||||||
texts.at("ID").value.setPosition({80.f, 5.f});
|
auto& [label, value] = it->second;
|
||||||
|
label.setPosition({5.f, 5.f});
|
||||||
|
value.setPosition({80.f, 5.f});
|
||||||
|
}
|
||||||
|
|
||||||
// Set up our threshold sf::Text objects
|
// Set up our threshold sf::Text objects
|
||||||
sstr.str("");
|
sstr.str("");
|
||||||
sstr << threshold << " (Change with up/down arrow keys)";
|
sstr << threshold << " (Change with up/down arrow keys)";
|
||||||
|
{
|
||||||
texts.emplace("Threshold", JoystickObject{{"Threshold:", font}, {sstr.str(), font}});
|
auto [it, success] = texts.emplace("Threshold", JoystickObject{{font, "Threshold:"}, {font, sstr.str()}});
|
||||||
texts.at("Threshold").label.setPosition({5.f, 5.f + 2 * font.getLineSpacing(14)});
|
auto& [label, value] = it->second;
|
||||||
texts.at("Threshold").value.setPosition({80.f, 5.f + 2 * font.getLineSpacing(14)});
|
label.setPosition({5.f, 5.f + 2 * font.getLineSpacing(14)});
|
||||||
|
value.setPosition({80.f, 5.f + 2 * font.getLineSpacing(14)});
|
||||||
|
}
|
||||||
|
|
||||||
// Set up our label-value sf::Text objects
|
// Set up our label-value sf::Text objects
|
||||||
for (unsigned int i = 0; i < sf::Joystick::AxisCount; ++i)
|
for (unsigned int i = 0; i < sf::Joystick::AxisCount; ++i)
|
||||||
{
|
{
|
||||||
auto& object = texts.insert({axislabels[i], {{axislabels[i] + ":", font}, {"N/A", font}}}).first->second;
|
auto [it, success] = texts.emplace(axislabels[i], JoystickObject{{font, axislabels[i] + ":"}, {font, "N/A"}});
|
||||||
|
auto& [label, value] = it->second;
|
||||||
object.label.setPosition({5.f, 5.f + (static_cast<float>(i + 4) * font.getLineSpacing(14))});
|
label.setPosition({5.f, 5.f + (static_cast<float>(i + 4) * font.getLineSpacing(14))});
|
||||||
object.value.setPosition({80.f, 5.f + (static_cast<float>(i + 4) * font.getLineSpacing(14))});
|
value.setPosition({80.f, 5.f + (static_cast<float>(i + 4) * font.getLineSpacing(14))});
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int i = 0; i < sf::Joystick::ButtonCount; ++i)
|
for (unsigned int i = 0; i < sf::Joystick::ButtonCount; ++i)
|
||||||
{
|
{
|
||||||
sstr.str("");
|
sstr.str("");
|
||||||
sstr << "Button " << i;
|
sstr << "Button " << i;
|
||||||
auto& object = texts.insert({sstr.str(), {{sstr.str() + ":", font}, {"N/A", font}}}).first->second;
|
auto [it, success] = texts.emplace(sstr.str(), JoystickObject{{font, sstr.str() + ":"}, {font, "N/A"}});
|
||||||
|
auto& [label, value] = it->second;
|
||||||
object.label.setPosition(
|
label.setPosition({5.f, 5.f + (static_cast<float>(sf::Joystick::AxisCount + i + 4) * font.getLineSpacing(14))});
|
||||||
{5.f, 5.f + (static_cast<float>(sf::Joystick::AxisCount + i + 4) * font.getLineSpacing(14))});
|
value.setPosition({80.f, 5.f + (static_cast<float>(sf::Joystick::AxisCount + i + 4) * font.getLineSpacing(14))});
|
||||||
object.value.setPosition(
|
|
||||||
{80.f, 5.f + (static_cast<float>(sf::Joystick::AxisCount + i + 4) * font.getLineSpacing(14))});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& [label, joystickObject] : texts)
|
for (auto& [label, joystickObject] : texts)
|
||||||
@ -176,8 +180,9 @@ int main()
|
|||||||
for (auto& [label, joystickObject] : texts)
|
for (auto& [label, joystickObject] : texts)
|
||||||
joystickObject.value.setString("N/A");
|
joystickObject.value.setString("N/A");
|
||||||
|
|
||||||
texts.at("ID").label.setString("<Not Connected>");
|
auto& [label, value] = texts.at("ID");
|
||||||
texts.at("ID").value.setString("");
|
label.setString("<Not Connected>");
|
||||||
|
value.setString("");
|
||||||
|
|
||||||
sstr.str("");
|
sstr.str("");
|
||||||
sstr << threshold << " (Change with up/down arrow keys)";
|
sstr << threshold << " (Change with up/down arrow keys)";
|
||||||
|
@ -62,9 +62,9 @@ int main()
|
|||||||
if (!font.loadFromFile(resourcesDir() / "tuffy.ttf"))
|
if (!font.loadFromFile(resourcesDir() / "tuffy.ttf"))
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
sf::Text text("SFML / OpenGL demo", font);
|
sf::Text text(font, "SFML / OpenGL demo");
|
||||||
sf::Text sRgbInstructions("Press space to toggle sRGB conversion", font);
|
sf::Text sRgbInstructions(font, "Press space to toggle sRGB conversion");
|
||||||
sf::Text mipmapInstructions("Press return to toggle mipmapping", font);
|
sf::Text mipmapInstructions(font, "Press return to toggle mipmapping");
|
||||||
text.setFillColor(sf::Color(255, 255, 255, 170));
|
text.setFillColor(sf::Color(255, 255, 255, 170));
|
||||||
sRgbInstructions.setFillColor(sf::Color(255, 255, 255, 170));
|
sRgbInstructions.setFillColor(sf::Color(255, 255, 255, 170));
|
||||||
mipmapInstructions.setFillColor(sf::Color(255, 255, 255, 170));
|
mipmapInstructions.setFillColor(sf::Color(255, 255, 255, 170));
|
||||||
|
@ -46,7 +46,7 @@ public:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sf::Text error("Shader not\nsupported", getFont());
|
sf::Text error(getFont(), "Shader not\nsupported");
|
||||||
error.setPosition({320.f, 200.f});
|
error.setPosition({320.f, 200.f});
|
||||||
error.setCharacterSize(36);
|
error.setCharacterSize(36);
|
||||||
target.draw(error, states);
|
target.draw(error, states);
|
||||||
|
@ -66,7 +66,7 @@ private:
|
|||||||
class WaveBlur : public Effect
|
class WaveBlur : public Effect
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WaveBlur() : Effect("Wave + Blur")
|
WaveBlur() : Effect("Wave + Blur"), m_text(getFont())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +92,6 @@ public:
|
|||||||
"Mauris ultricies dolor sed massa convallis sed aliquet augue fringilla.\n"
|
"Mauris ultricies dolor sed massa convallis sed aliquet augue fringilla.\n"
|
||||||
"Duis erat eros, porta in accumsan in, blandit quis sem.\n"
|
"Duis erat eros, porta in accumsan in, blandit quis sem.\n"
|
||||||
"In hac habitasse platea dictumst. Etiam fringilla est id odio dapibus sit amet semper dui laoreet.\n");
|
"In hac habitasse platea dictumst. Etiam fringilla est id odio dapibus sit amet semper dui laoreet.\n");
|
||||||
m_text.setFont(getFont());
|
|
||||||
m_text.setCharacterSize(22);
|
m_text.setCharacterSize(22);
|
||||||
m_text.setPosition({30.f, 20.f});
|
m_text.setPosition({30.f, 20.f});
|
||||||
|
|
||||||
@ -378,12 +377,12 @@ int main()
|
|||||||
textBackground.setColor(sf::Color(255, 255, 255, 200));
|
textBackground.setColor(sf::Color(255, 255, 255, 200));
|
||||||
|
|
||||||
// Create the description text
|
// Create the description text
|
||||||
sf::Text description("Current effect: " + effects[current]->getName(), font, 20);
|
sf::Text description(font, "Current effect: " + effects[current]->getName(), 20);
|
||||||
description.setPosition({10.f, 530.f});
|
description.setPosition({10.f, 530.f});
|
||||||
description.setFillColor(sf::Color(80, 80, 80));
|
description.setFillColor(sf::Color(80, 80, 80));
|
||||||
|
|
||||||
// Create the instructions text
|
// Create the instructions text
|
||||||
sf::Text instructions("Press left and right arrows to change the current shader", font, 20);
|
sf::Text instructions(font, "Press left and right arrows to change the current shader", 20);
|
||||||
instructions.setPosition({280.f, 555.f});
|
instructions.setPosition({280.f, 555.f});
|
||||||
instructions.setFillColor(sf::Color(80, 80, 80));
|
instructions.setFillColor(sf::Color(80, 80, 80));
|
||||||
|
|
||||||
|
@ -87,8 +87,7 @@ int main()
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
// Initialize the pause message
|
// Initialize the pause message
|
||||||
sf::Text pauseMessage;
|
sf::Text pauseMessage(font);
|
||||||
pauseMessage.setFont(font);
|
|
||||||
pauseMessage.setCharacterSize(40);
|
pauseMessage.setCharacterSize(40);
|
||||||
pauseMessage.setPosition({170.f, 200.f});
|
pauseMessage.setPosition({170.f, 200.f});
|
||||||
pauseMessage.setFillColor(sf::Color::White);
|
pauseMessage.setFillColor(sf::Color::White);
|
||||||
|
@ -480,14 +480,12 @@ private:
|
|||||||
/// }
|
/// }
|
||||||
///
|
///
|
||||||
/// // Create a text which uses our font
|
/// // Create a text which uses our font
|
||||||
/// sf::Text text1;
|
/// sf::Text text1(font);
|
||||||
/// text1.setFont(font);
|
|
||||||
/// text1.setCharacterSize(30);
|
/// text1.setCharacterSize(30);
|
||||||
/// text1.setStyle(sf::Text::Regular);
|
/// text1.setStyle(sf::Text::Regular);
|
||||||
///
|
///
|
||||||
/// // Create another text using the same font, but with different parameters
|
/// // Create another text using the same font, but with different parameters
|
||||||
/// sf::Text text2;
|
/// sf::Text text2(font);
|
||||||
/// text2.setFont(font);
|
|
||||||
/// text2.setCharacterSize(50);
|
/// text2.setCharacterSize(50);
|
||||||
/// text2.setStyle(sf::Text::Italic);
|
/// text2.setStyle(sf::Text::Italic);
|
||||||
/// \endcode
|
/// \endcode
|
||||||
|
@ -244,7 +244,12 @@ private:
|
|||||||
///
|
///
|
||||||
/// // Create a sprite and a text to display
|
/// // Create a sprite and a text to display
|
||||||
/// sf::Sprite sprite;
|
/// sf::Sprite sprite;
|
||||||
/// sf::Text text;
|
/// sf::Font font;
|
||||||
|
/// if (!font.loadFromFile("arial.ttf"))
|
||||||
|
/// {
|
||||||
|
/// // error...
|
||||||
|
/// }
|
||||||
|
/// sf::Text text(font);
|
||||||
/// ...
|
/// ...
|
||||||
///
|
///
|
||||||
/// // Perform OpenGL initializations
|
/// // Perform OpenGL initializations
|
||||||
|
@ -62,14 +62,6 @@ public:
|
|||||||
StrikeThrough = 1 << 3 //!< Strike through characters
|
StrikeThrough = 1 << 3 //!< Strike through characters
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
/// \brief Default constructor
|
|
||||||
///
|
|
||||||
/// Creates an empty text.
|
|
||||||
///
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Text();
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Construct the text from a string, font and size
|
/// \brief Construct the text from a string, font and size
|
||||||
///
|
///
|
||||||
@ -85,13 +77,13 @@ public:
|
|||||||
/// \param characterSize Base size of characters, in pixels
|
/// \param characterSize Base size of characters, in pixels
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
Text(const String& string, const Font& font, unsigned int characterSize = 30);
|
Text(const Font& font, const String& string = "", unsigned int characterSize = 30);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Disallow construction from a temporary font
|
/// \brief Disallow construction from a temporary font
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
Text(const String& string, Font&& font, unsigned int characterSize = 30) = delete;
|
Text(Font&& font, const String& string = "", unsigned int characterSize = 30) = delete;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Copy constructor
|
/// \brief Copy constructor
|
||||||
@ -499,7 +491,7 @@ private:
|
|||||||
/// font.loadFromFile("arial.ttf");
|
/// font.loadFromFile("arial.ttf");
|
||||||
///
|
///
|
||||||
/// // Create a text
|
/// // Create a text
|
||||||
/// sf::Text text("hello", font);
|
/// sf::Text text(font, "hello");
|
||||||
/// text.setCharacterSize(30);
|
/// text.setCharacterSize(30);
|
||||||
/// text.setStyle(sf::Text::Bold);
|
/// text.setStyle(sf::Text::Bold);
|
||||||
/// text.setFillColor(sf::Color::Red);
|
/// text.setFillColor(sf::Color::Red);
|
||||||
|
@ -94,11 +94,7 @@ void addGlyphQuad(sf::VertexArray& vertices, sf::Vector2f position, const sf::Co
|
|||||||
namespace sf
|
namespace sf
|
||||||
{
|
{
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
Text::Text() = default;
|
Text::Text(const Font& font, const String& string, unsigned int characterSize) :
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
Text::Text(const String& string, const Font& font, unsigned int characterSize) :
|
|
||||||
m_string(string),
|
m_string(string),
|
||||||
m_font(&font),
|
m_font(&font),
|
||||||
m_characterSize(characterSize)
|
m_characterSize(characterSize)
|
||||||
@ -301,10 +297,6 @@ float Text::getOutlineThickness() const
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
Vector2f Text::findCharacterPos(std::size_t index) const
|
Vector2f Text::findCharacterPos(std::size_t index) const
|
||||||
{
|
{
|
||||||
// Make sure that we have a valid font
|
|
||||||
if (!m_font)
|
|
||||||
return Vector2f();
|
|
||||||
|
|
||||||
// Adjust the index if it's out of range
|
// Adjust the index if it's out of range
|
||||||
if (index > m_string.getSize())
|
if (index > m_string.getSize())
|
||||||
index = m_string.getSize();
|
index = m_string.getSize();
|
||||||
@ -372,8 +364,6 @@ FloatRect Text::getGlobalBounds() const
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void Text::draw(RenderTarget& target, const RenderStates& states) const
|
void Text::draw(RenderTarget& target, const RenderStates& states) const
|
||||||
{
|
{
|
||||||
if (m_font)
|
|
||||||
{
|
|
||||||
ensureGeometryUpdate();
|
ensureGeometryUpdate();
|
||||||
|
|
||||||
RenderStates statesCopy(states);
|
RenderStates statesCopy(states);
|
||||||
@ -386,16 +376,12 @@ void Text::draw(RenderTarget& target, const RenderStates& states) const
|
|||||||
target.draw(m_outlineVertices, statesCopy);
|
target.draw(m_outlineVertices, statesCopy);
|
||||||
|
|
||||||
target.draw(m_vertices, statesCopy);
|
target.draw(m_vertices, statesCopy);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void Text::ensureGeometryUpdate() const
|
void Text::ensureGeometryUpdate() const
|
||||||
{
|
{
|
||||||
if (!m_font)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Do nothing, if geometry has not changed and the font texture has not changed
|
// Do nothing, if geometry has not changed and the font texture has not changed
|
||||||
if (!m_geometryNeedUpdate && m_font->getTexture(m_characterSize).m_cacheId == m_fontTextureId)
|
if (!m_geometryNeedUpdate && m_font->getTexture(m_characterSize).m_cacheId == m_fontTextureId)
|
||||||
return;
|
return;
|
||||||
|
@ -47,7 +47,7 @@ int main(int, char const**)
|
|||||||
{
|
{
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
sf::Text text("Hello SFML", font, 50);
|
sf::Text text(font, "Hello SFML", 50);
|
||||||
text.setFillColor(sf::Color::Black);
|
text.setFillColor(sf::Color::Black);
|
||||||
|
|
||||||
// Load a music to play
|
// Load a music to play
|
||||||
|
@ -45,7 +45,7 @@ int main(int argc, char const** argv)
|
|||||||
{
|
{
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
sf::Text text("Hello SFML", font, 50);
|
sf::Text text(font, "Hello SFML", 50);
|
||||||
text.setFillColor(sf::Color::Black);
|
text.setFillColor(sf::Color::Black);
|
||||||
|
|
||||||
// Load a music to play
|
// Load a music to play
|
||||||
|
Loading…
Reference in New Issue
Block a user