Fix comparison between ui::Accelerators

This commit is contained in:
David Capello 2014-10-29 23:50:48 -03:00
parent d90150fed9
commit 8bec9be4b2
3 changed files with 36 additions and 16 deletions

View File

@ -26,6 +26,8 @@
#include "base/bind.h"
#include "base/signal.h"
#include <cctype>
namespace app {
using namespace ui;
@ -50,11 +52,16 @@ protected:
case kKeyDownMessage:
if (hasFocus() && !isReadOnly()) {
KeyMessage* keymsg = static_cast<KeyMessage*>(msg);
KeyModifiers modifiers = keymsg->keyModifiers();
if (keymsg->scancode() == kKeySpace)
modifiers = (KeyModifiers)(modifiers & ~kKeySpaceModifier);
m_accel = Accelerator(
keymsg->keyModifiers(),
modifiers,
keymsg->scancode(),
keymsg->unicodeChar() >= 32 ? keymsg->unicodeChar(): 0);
keymsg->unicodeChar() > 32 ?
std::tolower(keymsg->unicodeChar()): 0);
updateText();
AccelChange(&m_accel);
@ -101,11 +108,15 @@ SelectAccelerator::SelectAccelerator(const ui::Accelerator& accel)
void SelectAccelerator::onModifierChange(KeyModifiers modifier, CheckBox* checkbox)
{
bool state = (checkbox->isSelected());
KeyModifiers modifiers = m_accel.modifiers();
KeyScancode scancode = m_accel.scancode();
int unicodeChar = m_accel.unicodeChar();
m_accel = Accelerator(
(KeyModifiers)((m_accel.modifiers() & ~modifier) | (state ? modifier : 0)),
m_accel.scancode(),
m_accel.unicodeChar());
modifiers = (KeyModifiers)((modifiers & ~modifier) | (state ? modifier : 0));
if (modifiers == kKeySpaceModifier && scancode == kKeySpace)
modifiers = kKeyNoneModifier;
m_accel = Accelerator(modifiers, scancode, unicodeChar);
m_keyField->setAccel(m_accel);
updateAssignedTo();

View File

@ -15,7 +15,7 @@
#include "base/string.h"
#include <allegro/keyboard.h>
#include <ctype.h>
#include <cctype>
#include <string>
#include <vector>
@ -85,7 +85,7 @@ Accelerator::Accelerator(const std::string& str)
}
if ((tok[0] >= 'a') && (tok[0] <= 'z'))
m_scancode = (KeyScancode)((int)kKeyA + tolower(tok[0]) - 'a');
m_scancode = (KeyScancode)((int)kKeyA + std::tolower(tok[0]) - 'a');
else if ((tok[0] >= '0') && (tok[0] <= '9'))
m_scancode = (KeyScancode)((int)kKey0 + tok[0] - '0');
else {
@ -179,6 +179,21 @@ Accelerator::Accelerator(const std::string& str)
}
}
bool Accelerator::operator==(const Accelerator& other) const
{
if (m_modifiers != other.m_modifiers)
return false;
if (m_scancode == other.m_scancode) {
if (m_scancode != kKeyNil)
return true;
else if (m_unicodeChar != 0)
return (std::tolower(m_unicodeChar) == std::tolower(other.m_unicodeChar));
}
return false;
}
bool Accelerator::isEmpty() const
{
return
@ -364,7 +379,7 @@ bool Accelerator::check(KeyModifiers modifiers, KeyScancode scancode, int unicod
}
// For any other legal Unicode code
else if (unicodeChar >= ' ') {
unicodeChar = tolower(unicodeChar);
unicodeChar = std::tolower(unicodeChar);
/* without shift (because characters like '*' can be trigger with
"Shift+8", so we don't want "Shift+*") */

View File

@ -28,13 +28,7 @@ namespace ui {
bool check(KeyModifiers modifiers, KeyScancode scancode, int unicodeChar) const;
bool checkFromAllegroKeyArray() const;
bool operator==(const Accelerator& other) const {
return
(m_modifiers == other.m_modifiers &&
m_scancode == other.m_scancode &&
m_unicodeChar == other.m_unicodeChar);
}
bool operator==(const Accelerator& other) const;
bool operator!=(const Accelerator& other) const {
return !operator==(other);
}