/////////////////////////////////////////////////////////////////////////////
// Name: dwellclick.cpp
// Purpose:
// Author: Cesar Mauri Loba (cesar at crea-si dot com)
// Modified by:
// Created:
// Copyright: (C) 2010-12 Cesar Mauri Loba - CREA Software Systems
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
/////////////////////////////////////////////////////////////////////////////
#include "dwellclick.h"
#include "clickwindowcontroller.h"
#include "eviacamapp.h"
#include "mousecontrol.h"
#include
CDwellClick::CDwellClick(CMouseControl& mc)
: m_enabled(false)
, m_consecutiveClicksAllowed(false)
, m_visualAlertsEnabled(false)
, m_useClickWindow(false)
, m_dwellToleranceArea(0)
, m_mouseControl(&mc)
{
m_pClickWindowController= new CClickWindowController(wxGetApp().GetController());
InitDefaults ();
}
CDwellClick::~CDwellClick ()
{
SetEnabled(false);
delete m_pClickWindowController;
m_pClickWindowController= NULL;
}
// Configuration methods
void CDwellClick::InitDefaults()
{
SetConsecutiveClicksAllowed (false);
EnableVisualAlerts (true);
SetUseClickWindow (true);
SetDwellToleranceArea (3);
SetDwellTime (10);
}
void CDwellClick::WriteProfileData(wxConfigBase* pConfObj)
{
pConfObj->SetPath (_T("dwellclick"));
pConfObj->Write(_T("consecutiveClicksAllowed"), (bool) GetConsecutiveClicksAllowed());
pConfObj->Write(_T("visualAlertsEnabled"), (bool) AreVisualAlertsEnabled());
pConfObj->Write(_T("useClickWindow"), (bool) GetUseClickWindow());
pConfObj->Write(_T("dwellToleranceArea"), (double) GetDwellToleranceArea());
pConfObj->Write(_T("dwellTime"), (int) GetDwellTime());
m_pClickWindowController->WriteProfileData (pConfObj);
pConfObj->SetPath (_T(".."));
}
void CDwellClick::ReadProfileData(wxConfigBase* pConfObj)
{
int val;
bool valb;
double vald;
pConfObj->SetPath (_T("dwellclick"));
pConfObj->Read(_T("consecutiveClicksAllowed"), &m_consecutiveClicksAllowed);
if (pConfObj->Read(_T("visualAlertsEnabled"), &valb)) EnableVisualAlerts(valb);
if (pConfObj->Read(_T("useClickWindow"), &valb)) SetUseClickWindow(valb);
if (pConfObj->Read(_T("dwellToleranceArea"), &vald)) SetDwellToleranceArea((unsigned int) vald);
if (pConfObj->Read(_T("dwellTime"), &val)) SetDwellTime(val);
m_pClickWindowController->ReadProfileData (pConfObj);
pConfObj->SetPath (_T(".."));
}
mousecmd::mousecmd CDwellClick::ProcessMotion (int dxPix, int dyPix, unsigned int xCurr, unsigned int yCurr)
{
if (!m_enabled) return mousecmd::CMD_NO_CLICK;;
//Check autohide window
//m_pClickWindowController->AutohideClickWindow(xCurr, yCurr);
// Compute cursor displacement
float despl= sqrtf ((float) (dxPix*dxPix + dyPix*dyPix));
// TODO: check relative from dwell start position
if (despl> m_dwellToleranceArea) {
// Pointer is moving
if (m_visualAlertsEnabled) m_progressVisualAlert.End();
m_dwellCountdown.Reset();
}
else {
// Pointer is static
if (!m_dwellCountdown.HasExpired())
if (m_visualAlertsEnabled)
m_progressVisualAlert.Update(xCurr, yCurr, m_dwellCountdown.PercentagePassed());
mousecmd::mousecmd action= m_pClickWindowController->GetAction (xCurr, yCurr);
if (action== mousecmd::CMD_NO_CLICK) {
if (m_visualAlertsEnabled)
m_progressVisualAlert.End();
m_dwellCountdown.Reset();
}
else {
if (m_dwellCountdown.OneShootAction()) {
// Send action
switch (action)
{
case mousecmd::CMD_LEFT_CLICK:
m_mouseControl->LeftClick();
break;
case mousecmd::CMD_MIDDLE_CLICK:
m_mouseControl->MiddleClick();
break;
case mousecmd::CMD_RIGHT_CLICK:
m_mouseControl->RightClick();
break;
case mousecmd::CMD_LEFT_DOWN:
m_mouseControl->LeftDown();
break;
case mousecmd::CMD_LEFT_UP:
m_mouseControl->LeftUp();
break;
case mousecmd::CMD_DOUBLE_CLICK:
m_mouseControl->LeftDblClick();
break;
default:
assert (false);
}
m_pClickWindowController->ActionDone(xCurr, yCurr);
if (m_visualAlertsEnabled)
m_progressVisualAlert.End();
if (m_consecutiveClicksAllowed)
m_dwellCountdown.Reset();
return action;
}
}
}
return mousecmd::CMD_NO_CLICK;
}
void CDwellClick::SetEnabled(bool value)
{
if (value!= m_enabled) {
if (value) {
// Enabling dwell click
Reset();
// Show click window when needed
if (m_useClickWindow)
m_pClickWindowController->Show(true);
}
else {
// Hide click window
m_pClickWindowController->Show(false);
}
m_enabled= value;
}
}
void CDwellClick::Reset()
{
m_dwellCountdown.Reset();
m_progressVisualAlert.End();
}
void CDwellClick::SetUseClickWindow(bool value)
{
if (value!= m_useClickWindow) {
if (m_enabled) {
if (value)
m_pClickWindowController->Show(true);
else
m_pClickWindowController->Show(false);
}
m_useClickWindow= value;
}
}
void CDwellClick::EnableVisualAlerts(bool value)
{
if (value!= m_visualAlertsEnabled) {
m_visualAlertsEnabled = value;
if (!value) m_progressVisualAlert.End();
}
}