void _GuiWinDrawingArea_handleClick (GuiObject widget, int x, int y) { iam_drawingarea; if (my clickCallback) { struct structGuiDrawingAreaClickEvent event = { widget, 0 }; event. x = x; event. y = y; event. shiftKeyPressed = GetKeyState (VK_SHIFT) < 0; try { my clickCallback (my clickBoss, & event); } catch (MelderError) { Melder_flushError ("Mouse click not completely handled."); } } }
void _GuiMacDrawingArea_handleClick (GuiObject widget, EventRecord *macEvent) { iam_drawingarea; if (my clickCallback) { struct structGuiDrawingAreaClickEvent event = { widget, 0 }; event. x = macEvent -> where. h; event. y = macEvent -> where. v; event. shiftKeyPressed = (macEvent -> modifiers & shiftKey) != 0; event. commandKeyPressed = (macEvent -> modifiers & cmdKey) != 0; event. optionKeyPressed = (macEvent -> modifiers & optionKey) != 0; event. extraControlKeyPressed = (macEvent -> modifiers & controlKey) != 0; try { my clickCallback (my clickBoss, & event); } catch (MelderError) { Melder_flushError ("Mouse click not completely handled."); } } }
static gboolean _GuiGtkDrawingArea_clickCallback (GuiObject widget, GdkEvent *e, gpointer void_me) { iam (GuiDrawingArea); if (my clickCallback) { struct structGuiDrawingAreaClickEvent event = { widget, 0 }; //Melder_casual("event type %ld", (long)e->type); switch (e -> type) { case GDK_BUTTON_PRESS: event. type = BUTTON_PRESS; event. button = ((GdkEventButton *) e) -> button; break; case GDK_BUTTON_RELEASE: event. type = BUTTON_RELEASE; event. button = ((GdkEventButton *) e) -> button; break; case GDK_MOTION_NOTIFY: event. type = MOTION_NOTIFY; event. button = ((GdkEventMotion *) e) -> state & GDK_BUTTON1_MASK ? 1 : ((GdkEventMotion *) e) -> state & GDK_BUTTON2_MASK ? 2 : ((GdkEventMotion *) e) -> state & GDK_BUTTON3_MASK ? 3 : ((GdkEventMotion *) e) -> state & GDK_BUTTON4_MASK ? 4 : ((GdkEventMotion *) e) -> state & GDK_BUTTON5_MASK ? 5 : 0; break; default: // Do NOTHING return FALSE; } event. x = ((GdkEventButton *) e) -> x; event. y = ((GdkEventButton *) e) -> y; event. shiftKeyPressed = (((GdkEventButton *) e) -> state & GDK_SHIFT_MASK) != 0; if (e -> type == GDK_BUTTON_PRESS || 1) { try { my clickCallback (my clickBoss, & event); } catch (MelderError) { Melder_flushError ("Mouse click not completely handled."); } return TRUE; } } return FALSE; }
// @todo industrialize with Button::onTouch() bool Toggle::onTouch( TouchEvent event ) { // if the Toggle is disabled // we ignore this touch event if( _state == State::DISABLED ) { return false; } // if the touch event is a CANCEL event // we just release the Toggle and return // without consuming the touch event if (event.getType() == TouchEvent::Type::CANCEL) { release(); return false; } bool result = false; // get event data const TouchEvent::Type eventType = event.getType(); const float eventX = event.getX(); const float eventY = event.getY(); // get this Toggle's bounding box px::tools::Rect bb = getBoundingBox(); // add the GUI touch margin to the bounding box bb.setX(bb.getX() - guiButtonTouchMargin); bb.setY(bb.getY() - guiButtonTouchMargin); bb.setWidth(bb.getWidth() + 2*guiButtonTouchMargin); bb.setHeight(bb.getHeight() + 2*guiButtonTouchMargin); // test if touch event is on the Toggle if(eventX > bb.getX() && eventX < bb.getX()+bb.getWidth() && eventY > bb.getY() && eventY < bb.getY()+bb.getHeight()) { // event is on the Toggle // in this case we test only touch DOWN and UP if( eventType == TouchEvent::Type::DOWN ) { // we push the Toggle press(); // we consume the touch event result = true; } else if( eventType == TouchEvent::Type::UP ) { // Toggle receives a touch up event on it // but it may be not pushed at this time // if it was pushed, it's a click action // if it wasn't it does nothing if( _state == State::PRESSED ) { if(_on) setOff(); else setOn(); // this is a click action clickCallback(); // we consume the touch event result = true; } // in both cases, Toggle isn't pushed anymore release(); } } else { // event is not on this Toggle object if( eventType == TouchEvent::Type::UP ) { // Toggle is no more down, it's a click cancel action // PXLLOG("Toggle touch UP cancel"); release(); // we do not consume this event because it wasn't on the Toggle } } return result; }