mirror of
https://github.com/SFML/SFML.git
synced 2024-11-24 20:31:05 +08:00
Remove default empty state of sf::Cursor
This commit is contained in:
parent
9f71ad3b24
commit
53ade4baf1
@ -32,6 +32,7 @@
|
||||
#include <SFML/System/Vector2.hpp>
|
||||
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
@ -110,17 +111,6 @@ public:
|
||||
NotAllowed //!< Action not allowed cursor
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Default constructor
|
||||
///
|
||||
/// This constructor doesn't actually create the cursor;
|
||||
/// initially the new instance is invalid and must not be
|
||||
/// used until either loadFromPixels() or loadFromSystem()
|
||||
/// is called and successfully created a cursor.
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
Cursor();
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Destructor
|
||||
///
|
||||
@ -180,11 +170,11 @@ public:
|
||||
/// \param pixels Array of pixels of the image
|
||||
/// \param size Width and height of the image
|
||||
/// \param hotspot (x,y) location of the hotspot
|
||||
/// \return true if the cursor was successfully loaded;
|
||||
/// false otherwise
|
||||
/// \return Cursor if the cursor was successfully loaded;
|
||||
/// `std::nullopt` otherwise
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
[[nodiscard]] bool loadFromPixels(const std::uint8_t* pixels, Vector2u size, Vector2u hotspot);
|
||||
[[nodiscard]] static std::optional<Cursor> loadFromPixels(const std::uint8_t* pixels, Vector2u size, Vector2u hotspot);
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Create a native system cursor
|
||||
@ -195,16 +185,22 @@ public:
|
||||
/// the operating system.
|
||||
///
|
||||
/// \param type Native system cursor type
|
||||
/// \return true if and only if the corresponding cursor is
|
||||
/// \return Cursor if and only if the corresponding cursor is
|
||||
/// natively supported by the operating system;
|
||||
/// false otherwise
|
||||
/// `std::nullopt` otherwise
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
[[nodiscard]] bool loadFromSystem(Type type);
|
||||
[[nodiscard]] static std::optional<Cursor> loadFromSystem(Type type);
|
||||
|
||||
private:
|
||||
friend class WindowBase;
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Default constructor
|
||||
///
|
||||
////////////////////////////////////////////////////////////
|
||||
Cursor();
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
/// \brief Get access to the underlying implementation
|
||||
///
|
||||
|
@ -54,19 +54,27 @@ Cursor& Cursor::operator=(Cursor&&) noexcept = default;
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
bool Cursor::loadFromPixels(const std::uint8_t* pixels, Vector2u size, Vector2u hotspot)
|
||||
std::optional<Cursor> Cursor::loadFromPixels(const std::uint8_t* pixels, Vector2u size, Vector2u hotspot)
|
||||
{
|
||||
if ((pixels == nullptr) || (size.x == 0) || (size.y == 0))
|
||||
return false;
|
||||
else
|
||||
return m_impl->loadFromPixels(pixels, size, hotspot);
|
||||
return std::nullopt;
|
||||
|
||||
Cursor cursor;
|
||||
if (!cursor.m_impl->loadFromPixels(pixels, size, hotspot))
|
||||
return std::nullopt;
|
||||
|
||||
return cursor;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
bool Cursor::loadFromSystem(Type type)
|
||||
std::optional<Cursor> Cursor::loadFromSystem(Type type)
|
||||
{
|
||||
return m_impl->loadFromSystem(type);
|
||||
Cursor cursor;
|
||||
if (!cursor.m_impl->loadFromSystem(type))
|
||||
return std::nullopt;
|
||||
|
||||
return cursor;
|
||||
}
|
||||
|
||||
|
||||
|
@ -10,60 +10,38 @@ TEST_CASE("[Window] sf::Cursor", runDisplayTests())
|
||||
{
|
||||
SECTION("Type traits")
|
||||
{
|
||||
STATIC_CHECK(!std::is_default_constructible_v<sf::Cursor>);
|
||||
STATIC_CHECK(!std::is_copy_constructible_v<sf::Cursor>);
|
||||
STATIC_CHECK(!std::is_copy_assignable_v<sf::Cursor>);
|
||||
STATIC_CHECK(std::is_nothrow_move_constructible_v<sf::Cursor>);
|
||||
STATIC_CHECK(std::is_nothrow_move_assignable_v<sf::Cursor>);
|
||||
}
|
||||
|
||||
SECTION("Construction")
|
||||
{
|
||||
const sf::Cursor cursor;
|
||||
}
|
||||
|
||||
SECTION("Move semantics")
|
||||
{
|
||||
SECTION("Construction")
|
||||
{
|
||||
sf::Cursor movedCursor;
|
||||
const sf::Cursor cursor(std::move(movedCursor));
|
||||
}
|
||||
|
||||
SECTION("Assignment")
|
||||
{
|
||||
sf::Cursor movedCursor;
|
||||
sf::Cursor cursor;
|
||||
cursor = std::move(movedCursor);
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("loadFromPixels()")
|
||||
{
|
||||
sf::Cursor cursor;
|
||||
std::array<std::uint8_t, 4> pixels{};
|
||||
static constexpr std::array<std::uint8_t, 4> pixels{};
|
||||
|
||||
CHECK(!cursor.loadFromPixels(nullptr, {}, {}));
|
||||
CHECK(!cursor.loadFromPixels(pixels.data(), {0, 1}, {}));
|
||||
CHECK(!cursor.loadFromPixels(pixels.data(), {1, 0}, {}));
|
||||
CHECK(cursor.loadFromPixels(pixels.data(), {1, 1}, {}));
|
||||
CHECK(!sf::Cursor::loadFromPixels(nullptr, {}, {}));
|
||||
CHECK(!sf::Cursor::loadFromPixels(pixels.data(), {0, 1}, {}));
|
||||
CHECK(!sf::Cursor::loadFromPixels(pixels.data(), {1, 0}, {}));
|
||||
CHECK(sf::Cursor::loadFromPixels(pixels.data(), {1, 1}, {}));
|
||||
}
|
||||
|
||||
SECTION("loadFromSystem()")
|
||||
{
|
||||
sf::Cursor cursor;
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::Hand));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::SizeHorizontal));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::SizeVertical));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::SizeLeft));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::SizeRight));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::SizeTop));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::SizeBottom));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::SizeTopLeft));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::SizeTopRight));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::SizeBottomLeft));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::SizeBottomRight));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::Cross));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::Help));
|
||||
CHECK(cursor.loadFromSystem(sf::Cursor::Type::NotAllowed));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::Hand));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::SizeHorizontal));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::SizeVertical));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::SizeLeft));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::SizeRight));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::SizeTop));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::SizeBottom));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::SizeTopLeft));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::SizeTopRight));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::SizeBottomLeft));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::SizeBottomRight));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::Cross));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::Help));
|
||||
CHECK(sf::Cursor::loadFromSystem(sf::Cursor::Type::NotAllowed));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user