Skip to content

Commit

Permalink
[orientation] bug fixing and qml refactoring
Browse files Browse the repository at this point in the history
- the Key element doesn't have a MouseArea anymore (this would lead to the creation of many mouseareas), gestures and vkb-presses are all handled in one MouseArea.
- the scroll/select/gestures event filter system has been partially rewritten as the old one would only work in one fixed orientation.
  • Loading branch information
faenil committed Aug 14, 2013
1 parent e2f5a26 commit 2517ade
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 92 deletions.
1 change: 0 additions & 1 deletion main.cpp
Expand Up @@ -152,7 +152,6 @@ int main(int argc, char *argv[])
util.setWindow(&view);
util.setTerm(&term);
util.setRenderer(tr);
view.installEventFilter(&util); //for grabbing mouse drags

QObject::connect(&term,SIGNAL(displayBufferChanged()),win,SLOT(displayBufferChanged()));
QObject::connect(view.engine(),SIGNAL(quit()),&app,SLOT(quit()));
Expand Down
57 changes: 24 additions & 33 deletions qml/Key.qml
Expand Up @@ -94,47 +94,38 @@ Rectangle {
anchors.topMargin: key.height/2
}

MouseArea {
enabled: label!=""
id: keyMouseArea
anchors.fill: parent
anchors.margins: -3 // -(half of keyspacing)
onExited: {
keyRepeatStarter.stop();
keyRepeatTimer.stop();

key.color = keyboard.keyBgColor
keyboard.currentKeyPressed = 0;
}
onPressedChanged: {
if(pressed) {
key.color = keyboard.keyHilightBgColor
keyboard.currentKeyPressed = key;
util.keyPressFeedback();
function handlePress() {
key.color = keyboard.keyHilightBgColor
keyboard.currentKeyPressed = key;
util.keyPressFeedback();

keyRepeatStarter.start();
} else {
keyboard.currentKeyPressed = 0;
if(containsMouse) {
keyRepeatStarter.start();
}

util.keyReleaseFeedback();
function handleRelease() {
util.keyReleaseFeedback();

keyRepeatStarter.stop();
keyRepeatTimer.stop();
keyRepeatStarter.stop();
keyRepeatTimer.stop();

key.color = keyboard.keyBgColor
key.color = keyboard.keyBgColor

setStickiness(-1)
window.vkbKeypress(currentCode, keyboard.keyModifiers);
setStickiness(-1)
window.vkbKeypress(currentCode, keyboard.keyModifiers);

if( !sticky && keyboard.resetSticky != 0 && keyboard.resetSticky !== key ) {
resetSticky.setStickiness(0);
}
}
}
if( !sticky && keyboard.resetSticky != 0 && keyboard.resetSticky !== key ) {
resetSticky.setStickiness(0);
}
}

function handleExit() {
keyRepeatStarter.stop();
keyRepeatTimer.stop();

key.color = keyboard.keyBgColor
keyboard.currentKeyPressed = 0;
}

Timer {
id: keyRepeatStarter
running: false
Expand All @@ -153,7 +144,7 @@ Rectangle {
triggeredOnStart: true
interval: 80
onTriggered: {
vkbKeypress(currentCode, keyboard.keyModifiers);
window.vkbKeypress(currentCode, keyboard.keyModifiers);
}
}

Expand Down
21 changes: 21 additions & 0 deletions qml/Keyboard.qml
Expand Up @@ -110,4 +110,25 @@ Rectangle {
keyboardLoader.sourceComponent = undefined
keyboardLoader.sourceComponent = keyboardContents
}

//borrowed from nemo-keyboard
//Parameters: (x, y) in view coordinates
function keyAt(x, y) {
var item = keyboard
x -= keyboard.x
y -= keyboard.y

while ((item = item.childAt(x, y)) != null) {
//return the first "Key" element we find
if (typeof item.currentCode !== 'undefined') {
return item
}

// Cheaper mapToItem, assuming we're not using anything fancy.
x -= item.x
y -= item.y
}

return null
}
}
81 changes: 66 additions & 15 deletions qml/Main.qml
Expand Up @@ -108,20 +108,78 @@ PageStackWindow {
}
}

MouseArea { // the area above the keyboard ("wakes up" the keyboard when tapped)
x:0
y:0
z:0
width: window.width
height: vkb.y
onClicked: {
if (util.settingsValue("ui/dragMode") !== "select") {
Keyboard {
id: vkb
x: 0
y: parent.height-vkb.height
}

//area that handles gestures/select/scroll modes and vkb-keypresses
MouseArea {
id: touchArea
objectName: "touchArea"
anchors.fill: parent
property int pressMouseY: 0
property int pressMouseX: 0
property int clickThreshold: 20
property alias pressedKey: vkb.currentKeyPressed
property bool exitedPressedKeyArea: false
//We define a click as a mouse-press followed by a mouse-release
//Morover, we only consider it a click if the mouse hasn't moved too much
//between press and release events
property bool isClick: false
onPressed: {
isClick = true
pressMouseY = mouse.y
pressMouseX = mouse.x
var key = vkb.keyAt(mouse.x, mouse.y)
exitedPressedKeyArea = false
if (key != null) {
pressedKey = key
pressedKey.handlePress()
}
//gestures c++ handler
util.mousePress(mouse.x, mouse.y)
}
onPositionChanged: {
//if the finger exits key's area
if (pressedKey != null && pressedKey != 0 && !exitedPressedKeyArea) {
var mappedPoint = pressedKey.mapFromItem(touchArea, mouse.x, mouse.y)
if (!pressedKey.contains(Qt.point(mappedPoint.x, mappedPoint.y))) {
exitedPressedKeyArea = true
pressedKey.handleExit()
}
}

if (isClick) {
if (Math.abs(mouse.x - pressMouseX) > clickThreshold ||
Math.abs(mouse.y - pressMouseY) > clickThreshold )
isClick = false
}
//gestures c++ handler
util.mouseMove(mouse.x, mouse.y)
}
onReleased: {
if (pressedKey != null && pressedKey != 0 &&
vkb.keyAt(mouse.x, mouse.y) == pressedKey && !exitedPressedKeyArea) {
pressedKey.handleRelease()
}
vkb.currentKeyPressed = 0;

//gestures c++ handler
util.mouseRelease(mouse.x, mouse.y)

// Wake up the keyboard if the user has tapped/clicked on it and we're not in select mode
//(or it would be hard to select text)
if (mouse.y < vkb.y && mouseY < vkb.y && isClick && util.settingsValue("ui/dragMode") !== "select") {
if (vkb.active)
window.sleepVKB();
else
window.wakeVKB();
}
}


}

Rectangle {
Expand Down Expand Up @@ -163,13 +221,6 @@ PageStackWindow {
y: 0
}

Keyboard {
id: vkb
x: 0
y: parent.height-vkb.height
z: 0
}

TextRender {
id: textrender
objectName: "textrender"
Expand Down
81 changes: 41 additions & 40 deletions util.cpp
Expand Up @@ -264,54 +264,55 @@ void Util::clearNotifications()
#endif //MEEGO_EDITION_HARMATTAN
}

bool Util::eventFilter(QObject *, QEvent *ev)
{
// event filter used to check if a mouse drag/pan was performed on the scene
void Util::mousePress(float eventX, float eventY) {
if(!iAllowGestures)
return;

dragOrigin = QPointF(eventX, eventY);
newSelection = true;
}

void Util::mouseMove(float eventX, float eventY) {
QPointF eventPos(eventX, eventY);

if(!iAllowGestures)
return;

if(settingsValue("ui/dragMode")=="scroll") {
scrollBackBuffer(eventPos, dragOrigin);
dragOrigin = eventPos;
}
else if(settingsValue("ui/dragMode")=="select" && iRenderer) {
selectionHelper(eventPos);
}
}

void Util::mouseRelease(float eventX, float eventY) {
QPointF eventPos(eventX, eventY);
const int reqDragLength = 140;

if(!iAllowGestures)
return false;
return;

if(ev->type()==QEvent::MouseButtonPress) {
QMouseEvent *mev = static_cast<QMouseEvent*>(ev);
dragOrigin = mev->pos();
newSelection = true;
if(settingsValue("ui/dragMode")=="gestures") {
int xdist = qAbs(eventPos.x() - dragOrigin.x());
int ydist = qAbs(eventPos.y() - dragOrigin.y());
if(eventPos.x() < dragOrigin.x()-reqDragLength && xdist > ydist*2)
doGesture(PanLeft);
else if(eventPos.x() > dragOrigin.x()+reqDragLength && xdist > ydist*2)
doGesture(PanRight);
else if(eventPos.y() > dragOrigin.y()+reqDragLength && ydist > xdist*2)
doGesture(PanDown);
else if(eventPos.y() < dragOrigin.y()-reqDragLength && ydist > xdist*2)
doGesture(PanUp);
}
else if(ev->type()==QEvent::MouseMove) {
QMouseEvent *mev = static_cast<QMouseEvent*>(ev);
if(settingsValue("ui/dragMode")=="scroll") {
scrollBackBuffer(mev->pos(), dragOrigin);
dragOrigin = mev->pos();
}
else if(settingsValue("ui/dragMode")=="select" && iRenderer) {
selectionHelper(mev->pos());
}
else if(settingsValue("ui/dragMode")=="scroll") {
scrollBackBuffer(eventPos, dragOrigin);
}
else if(ev->type()==QEvent::MouseButtonRelease) {
QMouseEvent *mev = static_cast<QMouseEvent*>(ev);
if(settingsValue("ui/dragMode")=="gestures") {
int xdist = qAbs(mev->pos().x() - dragOrigin.x());
int ydist = qAbs(mev->pos().y() - dragOrigin.y());
if(mev->pos().x() < dragOrigin.x()-reqDragLength && xdist > ydist*2)
doGesture(PanLeft);
else if(mev->pos().x() > dragOrigin.x()+reqDragLength && xdist > ydist*2)
doGesture(PanRight);
else if(mev->pos().y() > dragOrigin.y()+reqDragLength && ydist > xdist*2)
doGesture(PanDown);
else if(mev->pos().y() < dragOrigin.y()-reqDragLength && ydist > xdist*2)
doGesture(PanUp);
}
else if(settingsValue("ui/dragMode")=="scroll") {
scrollBackBuffer(mev->pos(), dragOrigin);
}
else if(settingsValue("ui/dragMode")=="select" && iRenderer) {
selectionHelper(mev->pos());
selectionFinished();
}
else if(settingsValue("ui/dragMode")=="select" && iRenderer) {
selectionHelper(eventPos);
selectionFinished();
}

return false;
}

void Util::selectionHelper(QPointF scenePos)
Expand Down
6 changes: 3 additions & 3 deletions util.h
Expand Up @@ -71,9 +71,9 @@ class Util : public QObject

public slots:
void onMainWinFocusChanged(bool in);

protected:
virtual bool eventFilter(QObject*, QEvent *ev);
void mousePress(float eventX, float eventY);
void mouseMove(float eventX, float eventY);
void mouseRelease(float eventX, float eventY);

signals:
void visualBell();
Expand Down

0 comments on commit 2517ade

Please sign in to comment.