mirror of
https://github.com/moparisthebest/Simba
synced 2024-12-22 23:38:50 -05:00
Usable mouse class.
Code is readable to the trained eye... I hope.
This commit is contained in:
parent
3ed1f42aab
commit
8f416c68e6
@ -14,7 +14,10 @@ type
|
||||
|
||||
Const
|
||||
RESULT_OK = 0;
|
||||
RESULT_ERROR = 1;
|
||||
RESULT_ERROR = -1;
|
||||
|
||||
MOUSE_UP = 0;
|
||||
MOUSE_DOWN = 1;
|
||||
|
||||
var
|
||||
C: TClient;
|
||||
@ -36,7 +39,7 @@ end;
|
||||
|
||||
{ Mouse }
|
||||
|
||||
function getmousepos(var t: tpoint): integer; cdecl;
|
||||
function getMousePos(var t: tpoint): integer; cdecl;
|
||||
|
||||
begin
|
||||
try
|
||||
@ -50,17 +53,60 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
{function ConvIntClickType(Int : Integer) : TClickType;inline;
|
||||
begin;
|
||||
case int of
|
||||
ps_mouse_right : result := mouse_Right;
|
||||
ps_mouse_left : result := mouse_left;
|
||||
ps_mouse_middle: result := mouse_middle;
|
||||
else
|
||||
raise exception.CreateFMT('Unknown Clicktype (%d) passed.',[int]);
|
||||
function setMousePos(var t: tpoint): integer; cdecl;
|
||||
begin
|
||||
try
|
||||
C.IOManager.SetMousePos(t.x,t.y);
|
||||
result := RESULT_OK;
|
||||
except on e : Exception do
|
||||
begin
|
||||
result := RESULT_ERROR;
|
||||
last_error := PChar(e.Message);
|
||||
end;
|
||||
end; }
|
||||
end;
|
||||
end;
|
||||
|
||||
function ConvIntClickType(Int : Integer) : TClickType;inline;
|
||||
begin
|
||||
case int of
|
||||
0 : result := mouse_Left;
|
||||
1 : result := mouse_Right;
|
||||
2: result := mouse_Middle;
|
||||
end;
|
||||
end;
|
||||
|
||||
function getMouseButtonState(But: Integer): Integer;
|
||||
begin
|
||||
try
|
||||
if C.IOManager.IsMouseButtonDown(ConvIntClickType(But)) then
|
||||
result := MOUSE_DOWN;
|
||||
except on e : Exception do
|
||||
begin
|
||||
result := RESULT_ERROR;
|
||||
last_error := PChar(e.Message);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function setMouseButtonState(But, State, X, Y: Integer): Integer;
|
||||
begin
|
||||
try
|
||||
if State = MOUSE_UP then
|
||||
begin
|
||||
C.IOManager.ReleaseMouse(X, Y, ConvIntClickType(But));
|
||||
result := RESULT_OK;
|
||||
end else if state = MOUSE_DOWN then
|
||||
begin
|
||||
C.IOManager.HoldMouse(X, Y, ConvIntClickType(But));
|
||||
result := RESULT_OK;
|
||||
end;
|
||||
except on e : Exception do
|
||||
begin
|
||||
result := RESULT_ERROR;
|
||||
last_error := PChar(e.Message);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function returnpoints: PTPoint; cdecl;
|
||||
@ -170,7 +216,10 @@ end;
|
||||
exports
|
||||
test,
|
||||
init,
|
||||
getmousepos,
|
||||
getMousePos,
|
||||
setMousePos,
|
||||
getMouseButtonState,
|
||||
setMouseButtonState,
|
||||
returnpoints,
|
||||
printpoints,
|
||||
hoi,
|
||||
|
@ -24,7 +24,19 @@ class MMLCore(object):
|
||||
DLL = MMLCore('../libmml.so')
|
||||
|
||||
m = Mouse(DLL)
|
||||
print m._getMousePos()
|
||||
|
||||
|
||||
|
||||
print m[Mouse.Pos]
|
||||
|
||||
for v in zip((Mouse.Left, Mouse.Right), m[(Mouse.Left, Mouse.Right)]):
|
||||
print v
|
||||
|
||||
m[(Mouse.Pos, Mouse.Right)] = ((300,300), True)
|
||||
#print m._getMousePos()
|
||||
|
||||
# Reset all buttons..
|
||||
m[(Mouse.Left, Mouse.Right, Mouse.Middle)] = [False for x in range(3)]
|
||||
|
||||
del DLL
|
||||
|
||||
|
@ -1,11 +1,19 @@
|
||||
from ctypes import *
|
||||
from mml import
|
||||
from mmltypes import POINT
|
||||
from mmltypes import POINT, PPOINT
|
||||
from mmltypes import isiterable
|
||||
|
||||
class MouseException(Exception):
|
||||
def __init__(self, err):
|
||||
Exception.__init__(self, err)
|
||||
|
||||
# Usage:
|
||||
class Mouse(object):
|
||||
# _mc = MMLCore reference.
|
||||
_mc = None
|
||||
Left ='Left'
|
||||
Right = 'Right'
|
||||
Middle = 'Middle'
|
||||
Pos = 'Pos'
|
||||
|
||||
# last pointer position
|
||||
_lpp = (0, 0)
|
||||
@ -17,28 +25,85 @@ class Mouse(object):
|
||||
pass
|
||||
|
||||
def _initialiseDLLFuncs(self):
|
||||
self._mc.dll.getmousepos.restype = c_int
|
||||
self._mc.dll.getmousepos.argtypes = [PPOINT]
|
||||
self._mc.dll.getMousePos.restype = c_int
|
||||
self._mc.dll.getMousePos.argtypes = [PPOINT]
|
||||
|
||||
self._mc.dll.setMousePos.restype = c_int
|
||||
self._mc.dll.setMousePos.argtypes = [PPOINT]
|
||||
|
||||
self._mc.dll.getMouseButtonState.restype = c_int
|
||||
self._mc.dll.getMouseButtonState.argtypes = [c_int]
|
||||
|
||||
self._mc.dll.setMouseButtonState.restype = c_int
|
||||
self._mc.dll.setMouseButtonState.argtypes = [c_int, c_int, c_int, c_int]
|
||||
pass
|
||||
|
||||
# Will be used to get the states of the mouse
|
||||
def __getitem__(self, item):
|
||||
pass
|
||||
if item == self.Pos:
|
||||
return self._getMousePos()
|
||||
if isiterable(item):
|
||||
for i in item:
|
||||
if i not in self._getButtons().keys():
|
||||
raise MouseException('Invalid mouse button')
|
||||
|
||||
bs = [self._buttonToInt(x) for x in item]
|
||||
return [self._getMouseButtonState(x) for x in bs]
|
||||
|
||||
raise MouseException('item is not iterable, nor a (valid) string')
|
||||
|
||||
# Will be used to set states of the mouse
|
||||
def __setitem__(self, item, value):
|
||||
pass
|
||||
ak = self._getButtons().keys() + [self.Pos]
|
||||
isfalse = lambda x: True if not x in ak else False
|
||||
|
||||
for i in map(isfalse, item):
|
||||
if i:
|
||||
raise MouseException('One of the items is not valid. Items:', item)
|
||||
|
||||
if isiterable(item) and isiterable(value):
|
||||
if len(item) != len(value):
|
||||
raise MouseException('Not enough values for items')
|
||||
|
||||
for i, v in dict(zip(item, value)).iteritems():
|
||||
if i == self.Pos:
|
||||
self._setMousePos(v)
|
||||
if i in (self.Left, self.Right, self.Middle):
|
||||
self._setMouseButtonState(self._buttonToInt(i), \
|
||||
1 if v else 0)
|
||||
return
|
||||
|
||||
|
||||
raise MouseException('FIXME')
|
||||
|
||||
# internal functions
|
||||
|
||||
def _getButtons(self):
|
||||
return {self.Left : 0, self.Right : 1, self.Middle : 2}
|
||||
|
||||
def _buttonToInt(self, button):
|
||||
return self._getButtons()[button]
|
||||
|
||||
# internal function
|
||||
def _getMousePos(self):
|
||||
ret = POINT()
|
||||
ok = self._mc.dll.getmousepos(byref(ret))
|
||||
ok = self._mc.dll.getMousePos(byref(ret))
|
||||
# FIXME: Perhaps use some sort of assertion?
|
||||
# We should print dll.last_error is ok != 0
|
||||
|
||||
self._lpp = (ret.x, ret.y)
|
||||
return (ret.x, ret.y)
|
||||
|
||||
# internal function
|
||||
def _setMousePos(self, p):
|
||||
ret = POINT()
|
||||
ret.x, ret.y = p
|
||||
ok = self._mc.dll.setMousePos(byref(ret))
|
||||
return ok
|
||||
|
||||
def _getMouseButtonState(self, button):
|
||||
pass
|
||||
ok = self._mc.dll.getMouseButtonState(button)
|
||||
if ok < 0:
|
||||
pass #Raise exception
|
||||
return ok == 1
|
||||
|
||||
def _setMouseButtonState(self, button, state):
|
||||
return self._mc.dll.setMouseButtonState(c_int(button), c_int(state), *map(lambda x: c_int(x), self._getMousePos()))
|
||||
|
||||
|
||||
|
@ -6,4 +6,4 @@ class POINT(Structure):
|
||||
|
||||
PPOINT = POINTER(POINT)
|
||||
|
||||
|
||||
isiterable = lambda x: hasattr(x, '__iter__')
|
||||
|
Loading…
Reference in New Issue
Block a user