mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
196 lines
7.2 KiB
C++
196 lines
7.2 KiB
C++
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
|
// This file is part of the "Irrlicht Engine".
|
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
|
|
|
#pragma once
|
|
|
|
#include "IReferenceCounted.h"
|
|
#include "position2d.h"
|
|
#include "rect.h"
|
|
|
|
namespace irr
|
|
{
|
|
namespace gui
|
|
{
|
|
|
|
class IGUISpriteBank;
|
|
|
|
//! Default icons for cursors
|
|
enum ECURSOR_ICON
|
|
{
|
|
// Following cursors might be system specific, or might use an Irrlicht icon-set. No guarantees so far.
|
|
ECI_NORMAL, // arrow
|
|
ECI_CROSS, // Crosshair
|
|
ECI_HAND, // Hand
|
|
ECI_HELP, // Arrow and question mark
|
|
ECI_IBEAM, // typical text-selection cursor
|
|
ECI_NO, // should not click icon
|
|
ECI_WAIT, // hourglass
|
|
ECI_SIZEALL, // arrow in all directions
|
|
ECI_SIZENESW, // resizes in direction north-east or south-west
|
|
ECI_SIZENWSE, // resizes in direction north-west or south-east
|
|
ECI_SIZENS, // resizes in direction north or south
|
|
ECI_SIZEWE, // resizes in direction west or east
|
|
ECI_UP, // up-arrow
|
|
|
|
// Implementer note: Should we add system specific cursors, which use guaranteed the system icons,
|
|
// then I would recommend using a naming scheme like ECI_W32_CROSS, ECI_X11_CROSSHAIR and adding those
|
|
// additionally.
|
|
|
|
ECI_COUNT // maximal of defined cursors. Note that higher values can be created at runtime
|
|
};
|
|
|
|
//! Names for ECURSOR_ICON
|
|
const c8 *const GUICursorIconNames[ECI_COUNT + 1] = {
|
|
"normal",
|
|
"cross",
|
|
"hand",
|
|
"help",
|
|
"ibeam",
|
|
"no",
|
|
"wait",
|
|
"sizeall",
|
|
"sizenesw",
|
|
"sizenwse",
|
|
"sizens",
|
|
"sizewe",
|
|
"sizeup",
|
|
0,
|
|
};
|
|
|
|
//! structure used to set sprites as cursors.
|
|
struct SCursorSprite
|
|
{
|
|
SCursorSprite() :
|
|
SpriteBank(0), SpriteId(-1)
|
|
{
|
|
}
|
|
|
|
SCursorSprite(gui::IGUISpriteBank *spriteBank, s32 spriteId, const core::position2d<s32> &hotspot = (core::position2d<s32>(0, 0))) :
|
|
SpriteBank(spriteBank), SpriteId(spriteId), HotSpot(hotspot)
|
|
{
|
|
}
|
|
|
|
IGUISpriteBank *SpriteBank;
|
|
s32 SpriteId;
|
|
core::position2d<s32> HotSpot;
|
|
};
|
|
|
|
//! platform specific behavior flags for the cursor
|
|
enum ECURSOR_PLATFORM_BEHAVIOR
|
|
{
|
|
//! default - no platform specific behavior
|
|
ECPB_NONE = 0,
|
|
|
|
//! On X11 try caching cursor updates as XQueryPointer calls can be expensive.
|
|
/** Update cursor positions only when the irrlicht timer has been updated or the timer is stopped.
|
|
This means you usually get one cursor update per device->run() which will be fine in most cases.
|
|
See this forum-thread for a more detailed explanation:
|
|
http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=45525
|
|
*/
|
|
ECPB_X11_CACHE_UPDATES = 1
|
|
};
|
|
|
|
//! Interface to manipulate the mouse cursor.
|
|
class ICursorControl : public virtual IReferenceCounted
|
|
{
|
|
public:
|
|
//! Changes the visible state of the mouse cursor.
|
|
/** \param visible: The new visible state. If true, the cursor will be visible,
|
|
if false, it will be invisible. */
|
|
virtual void setVisible(bool visible) = 0;
|
|
|
|
//! Returns if the cursor is currently visible.
|
|
/** \return True if the cursor flag is set to visible, false if not. */
|
|
virtual bool isVisible() const = 0;
|
|
|
|
//! Sets the new position of the cursor.
|
|
/** The position must be
|
|
between (0.0f, 0.0f) and (1.0f, 1.0f), where (0.0f, 0.0f) is
|
|
the top left corner and (1.0f, 1.0f) is the bottom right corner of the
|
|
render window.
|
|
\param pos New position of the cursor. */
|
|
virtual void setPosition(const core::position2d<f32> &pos) = 0;
|
|
|
|
//! Sets the new position of the cursor.
|
|
/** The position must be
|
|
between (0.0f, 0.0f) and (1.0f, 1.0f), where (0.0f, 0.0f) is
|
|
the top left corner and (1.0f, 1.0f) is the bottom right corner of the
|
|
render window.
|
|
\param x New x-coord of the cursor.
|
|
\param y New x-coord of the cursor. */
|
|
virtual void setPosition(f32 x, f32 y) = 0;
|
|
|
|
//! Sets the new position of the cursor.
|
|
/** \param pos: New position of the cursor. The coordinates are pixel units. */
|
|
virtual void setPosition(const core::position2d<s32> &pos) = 0;
|
|
|
|
//! Sets the new position of the cursor.
|
|
/** \param x New x-coord of the cursor. The coordinates are pixel units.
|
|
\param y New y-coord of the cursor. The coordinates are pixel units. */
|
|
virtual void setPosition(s32 x, s32 y) = 0;
|
|
|
|
//! Returns the current position of the mouse cursor.
|
|
/** \param updateCursor When true ask system/OS for current cursor position.
|
|
When false return the last known (buffered) position ( this is useful to
|
|
check what has become of a setPosition call with float numbers).
|
|
\return Returns the current position of the cursor. The returned position
|
|
is the position of the mouse cursor in pixel units. */
|
|
virtual const core::position2d<s32> &getPosition(bool updateCursor = true) = 0;
|
|
|
|
//! Returns the current position of the mouse cursor.
|
|
/** \param updateCursor When true ask system/OS for current cursor position.
|
|
When false return the last known (buffered) position (this is
|
|
useful to check what has become of a setPosition call with float numbers
|
|
and is often different from the values you passed in setPosition).
|
|
\return Returns the current position of the cursor. The returned position
|
|
is a value between (0.0f, 0.0f) and (1.0f, 1.0f), where (0.0f, 0.0f) is
|
|
the top left corner and (1.0f, 1.0f) is the bottom right corner of the
|
|
render window. */
|
|
virtual core::position2d<f32> getRelativePosition(bool updateCursor = true) = 0;
|
|
|
|
//! Sets an absolute reference rect for setting and retrieving the cursor position.
|
|
/** If this rect is set, the cursor position is not being calculated relative to
|
|
the rendering window but to this rect. You can set the rect pointer to 0 to disable
|
|
this feature again. This feature is useful when rendering into parts of foreign windows
|
|
for example in an editor.
|
|
\param rect: A pointer to an reference rectangle or 0 to disable the reference rectangle.*/
|
|
virtual void setReferenceRect(core::rect<s32> *rect = 0) = 0;
|
|
|
|
//! Internally fixes the mouse position, and reports relative mouse movement compared to the old position
|
|
/** Specific to SDL */
|
|
virtual void setRelativeMode(bool relative){};
|
|
|
|
//! Sets the active cursor icon
|
|
/** Setting cursor icons is so far only supported on Win32 and Linux */
|
|
virtual void setActiveIcon(ECURSOR_ICON iconId) {}
|
|
|
|
//! Gets the currently active icon
|
|
virtual ECURSOR_ICON getActiveIcon() const { return gui::ECI_NORMAL; }
|
|
|
|
//! Add a custom sprite as cursor icon.
|
|
/** \return Identification for the icon */
|
|
virtual ECURSOR_ICON addIcon(const gui::SCursorSprite &icon) { return gui::ECI_NORMAL; }
|
|
|
|
//! replace a cursor icon.
|
|
/** Changing cursor icons is so far only supported on Win32 and Linux
|
|
Note that this only changes the icons within your application, system cursors outside your
|
|
application will not be affected.
|
|
*/
|
|
virtual void changeIcon(ECURSOR_ICON iconId, const gui::SCursorSprite &sprite) {}
|
|
|
|
//! Return a system-specific size which is supported for cursors. Larger icons will fail, smaller icons might work.
|
|
virtual core::dimension2di getSupportedIconSize() const { return core::dimension2di(0, 0); }
|
|
|
|
//! Set platform specific behavior flags.
|
|
virtual void setPlatformBehavior(ECURSOR_PLATFORM_BEHAVIOR behavior) {}
|
|
|
|
//! Return platform specific behavior.
|
|
/** \return Behavior set by setPlatformBehavior or ECPB_NONE for platforms not implementing specific behaviors.
|
|
*/
|
|
virtual ECURSOR_PLATFORM_BEHAVIOR getPlatformBehavior() const { return ECPB_NONE; }
|
|
};
|
|
|
|
} // end namespace gui
|
|
} // end namespace irr
|