mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-16 19:49:56 +00:00
180 lines
5.5 KiB
C++
180 lines
5.5 KiB
C++
/*!
|
||
@file
|
||
@author Albert Semenov
|
||
@date 11/2007
|
||
@module
|
||
*/
|
||
/*
|
||
This file is part of MyGUI.
|
||
|
||
MyGUI is free software: you can redistribute it and/or modify
|
||
it under the terms of the GNU Lesser General Public License as published by
|
||
the Free Software Foundation, either version 3 of the License, or
|
||
(at your option) any later version.
|
||
|
||
MyGUI is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU Lesser General Public License for more details.
|
||
|
||
You should have received a copy of the GNU Lesser General Public License
|
||
along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
|
||
*/
|
||
#ifndef __MYGUI_INPUT_MANAGER_H__
|
||
#define __MYGUI_INPUT_MANAGER_H__
|
||
|
||
#include "MyGUI_Prerequest.h"
|
||
#include "MyGUI_Macros.h"
|
||
#include "MyGUI_Instance.h"
|
||
#include "MyGUI_WidgetDefines.h"
|
||
#include "MyGUI_IUnlinkWidget.h"
|
||
#include "MyGUI_WidgetDefines.h"
|
||
#include "MyGUI_XmlDocument.h"
|
||
#include "MyGUI_InputDefine.h"
|
||
#include "MyGUI_Timer.h"
|
||
#include "MyGUI_ILayer.h"
|
||
#include "MyGUI_Delegate.h"
|
||
|
||
namespace MyGUI
|
||
{
|
||
|
||
class MYGUI_EXPORT InputManager : public IUnlinkWidget
|
||
{
|
||
MYGUI_INSTANCE_HEADER( InputManager )
|
||
|
||
public:
|
||
void initialise();
|
||
void shutdown();
|
||
|
||
/** Inject MouseMove event
|
||
@return true if event has been processed by GUI
|
||
*/
|
||
bool injectMouseMove(int _absx, int _absy, int _absz);
|
||
/** Inject MousePress event
|
||
@return true if event has been processed by GUI
|
||
*/
|
||
bool injectMousePress(int _absx, int _absy, MouseButton _id);
|
||
/** Inject MouseRelease event
|
||
@return true if event has been processed by GUI
|
||
*/
|
||
bool injectMouseRelease(int _absx, int _absy, MouseButton _id);
|
||
|
||
/** Inject KeyPress event
|
||
@return true if event has been processed by GUI
|
||
*/
|
||
bool injectKeyPress(KeyCode _key, Char _text = 0);
|
||
/** Inject KeyRelease event
|
||
@return true if event has been processed by GUI
|
||
*/
|
||
bool injectKeyRelease(KeyCode _key);
|
||
|
||
/** Is any widget have mouse focus */
|
||
bool isFocusMouse() { return mWidgetMouseFocus != nullptr; }
|
||
/** Is any widget have key focus */
|
||
bool isFocusKey() { return mWidgetKeyFocus != nullptr; }
|
||
/** Is any widget captured mouse */
|
||
bool isCaptureMouse() { return mIsWidgetMouseCapture; }
|
||
|
||
/** Set key focus for _widget */
|
||
void setKeyFocusWidget(Widget* _widget);
|
||
/** Drop key focus for _widget */
|
||
void resetKeyFocusWidget(Widget* _widget);
|
||
/** Drop any key focus */
|
||
void resetKeyFocusWidget() { setKeyFocusWidget(nullptr); }
|
||
|
||
/** Get mouse focused widget */
|
||
Widget* getMouseFocusWidget() { return mWidgetMouseFocus; }
|
||
/** Get key focused widget */
|
||
Widget* getKeyFocusWidget() { return mWidgetKeyFocus; }
|
||
/** Get position of last left mouse button press */
|
||
const IntPoint& getLastLeftPressed() { return mLastLeftPressed; }
|
||
/** Get current mouse position */
|
||
const IntPoint& getMousePosition() { return mMousePosition; }
|
||
|
||
IntPoint getMousePositionByLayer();
|
||
|
||
// тестовый вариант, очистка фокуса мыши
|
||
/** Drop any mouse focus */
|
||
void resetMouseFocusWidget();
|
||
|
||
// работа с модальными окнами
|
||
/** Add modal widget - all other widgets inaccessible while modal widget exist */
|
||
void addWidgetModal(Widget* _widget);
|
||
/** Remove modal widget */
|
||
void removeWidgetModal(Widget* _widget);
|
||
|
||
/** Return true if any modal widget exist */
|
||
bool isModalAny() { return !mVectorModalRootWidget.empty(); }
|
||
|
||
/** Is control button pressed */
|
||
bool isControlPressed() { return mIsControlPressed; }
|
||
/** Is shift button pressed */
|
||
bool isShiftPressed() { return mIsShiftPressed; }
|
||
|
||
/** Reset mouse capture (for example when we dragging and application
|
||
lost focus you should call this)
|
||
*/
|
||
void resetMouseCaptureWidget() { mIsWidgetMouseCapture = false; }
|
||
|
||
void unlinkWidget(Widget* _widget) { _unlinkWidget(_widget); }
|
||
|
||
/** Event :\n
|
||
signature : void method(MyGUI::Widget* _widget)\n
|
||
@param _widget
|
||
*/
|
||
delegates::CMultiDelegate1<Widget*>
|
||
eventChangeMouseFocus;
|
||
|
||
/** Event :\n
|
||
signature : void method(MyGUI::Widget* _widget)\n
|
||
@param _widget
|
||
*/
|
||
delegates::CMultiDelegate1<Widget*>
|
||
eventChangeKeyFocus;
|
||
|
||
private:
|
||
// удаляем данный виджет из всех возможных мест
|
||
void _unlinkWidget(Widget* _widget);
|
||
|
||
void frameEntered(float _frame);
|
||
|
||
void firstEncoding(KeyCode _key, bool bIsKeyPressed);
|
||
|
||
// запоминает клавишу для поддержки повторения
|
||
void storeKey(KeyCode _key, Char _text);
|
||
|
||
// сбрасывает клавишу повторения
|
||
void resetKey();
|
||
|
||
private:
|
||
// виджеты которым принадлежит фокус
|
||
Widget* mWidgetMouseFocus;
|
||
Widget* mWidgetKeyFocus;
|
||
ILayer* mLayerMouseFocus;
|
||
// захватил ли мышь активный виджет
|
||
bool mIsWidgetMouseCapture;
|
||
// таймер для двойного клика
|
||
Timer mTimer; //used for double click timing
|
||
|
||
// нажат ли шифт
|
||
bool mIsShiftPressed;
|
||
// нажат ли контрол
|
||
bool mIsControlPressed;
|
||
// там где была последний раз нажата левая кнопка
|
||
IntPoint mLastLeftPressed;
|
||
IntPoint mMousePosition;
|
||
// клавиша для повтора
|
||
KeyCode mHoldKey;
|
||
Char mHoldChar;
|
||
bool mFirstPressKey;
|
||
float mTimerKey;
|
||
int mOldAbsZ;
|
||
|
||
// список виджетов с модальным режимом
|
||
VectorWidgetPtr mVectorModalRootWidget;
|
||
|
||
};
|
||
|
||
} // namespace MyGUI
|
||
|
||
#endif // __MYGUI_INPUT_MANAGER_H__
|