// widget developer functions: void UIWidget::mouse_axes_func(float x, float y, float dx, float dy) { if (disabled) return; // start by transforming the coordinates for the children local_mouse_x = x; local_mouse_y = y; float tmdx = dx; float tmdy = dy; surface_area->placement.transform_coordinates(&local_mouse_x, &local_mouse_y); surface_area->placement.transform_coordinates(&tmdx, &tmdy); UIWidget *parent = static_cast<UIWidget *>(get_parent()); if (parent && parent->mouse_is_blocked) mouse_is_blocked = true; else mouse_is_blocked = false; //for (int i=(int)children.size()-1; i>=0; i--) //children[i]->mouse_axes_func(local_mouse_x, local_mouse_y, dx, dy); // I'm not sure why these are dx/dy, but it works correctly this way for (auto &child : ElementID::recast_collection<UIWidget>(get_children())) child->mouse_axes_func(local_mouse_x, local_mouse_y, dx, dy); // I'm not sure why these are dx/dy, but it works correctly this way // then proceed with the execution of the function if (surface_area) { bool mouse_over_now = surface_area->collides(x, y); if (parent && parent->mouse_is_blocked) mouse_over_now = false; if (mouse_over_now && !mouse_over) on_mouse_enter(); else if (!mouse_over_now && mouse_over) on_mouse_leave(); mouse_over = mouse_over_now; if (parent && mouse_over) parent->mouse_is_blocked = true; } on_mouse_move(x, y, dx, dy); // TODO I think this needs to be the translated coordinates, and maybe even should be on the on_drag() call below as well if (mouse_down_on_over) { dragging = true; on_drag(x, y, dx, dy); } if (Framework::current_event->mouse.dz != 0 || Framework::current_event->mouse.dw != 0) on_mouse_wheel(); }
void CL_ListViewHeader_Impl::on_process_message(CL_GUIMessage &msg) { if (msg.is_type(CL_GUIMessage_Input::get_type_name())) { CL_GUIMessage_Input input = msg; CL_InputEvent input_event = input.get_event(); if (input_event.type == CL_InputEvent::pointer_moved) on_mouse_move(input, input_event); else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_LEFT) on_mouse_lbutton_down(input, input_event); else if (input_event.type == CL_InputEvent::released && input_event.id == CL_MOUSE_LEFT) on_mouse_lbutton_up(input, input_event); } else if (msg.is_type(CL_GUIMessage_Pointer::get_type_name())) { CL_GUIMessage_Pointer pointer = msg; if (pointer.get_pointer_type() == CL_GUIMessage_Pointer::pointer_leave) on_mouse_leave(); else if (pointer.get_pointer_type() == CL_GUIMessage_Pointer::pointer_enter) on_mouse_enter(); } }
void widget::process_event(const event& ev) { switch (ev.type) { case event::mouse_move_abs: { bool inside (point_in_rectangle(ev.xy, bounding_rect())); if (inside != mouse_inside_flag_) { if (inside) on_mouse_enter(); else on_mouse_leave(); mouse_inside_flag_ = inside; } } break; default: ; } }
bool window::dispatch_event ( XEvent& evt ) { switch ( evt.type ) { case Expose: exposed(); break; case ButtonPress: if ( evt.xbutton.button & Button2 ) on_right_button_down ( evt.xbutton.x, evt.xbutton.y ); else if ( evt.xbutton.button & Button1 ) on_left_button_down ( evt.xbutton.x, evt.xbutton.y ); break; case ButtonRelease: if ( evt.xbutton.button & Button2 ) on_right_button_up ( evt.xbutton.x, evt.xbutton.y ); else if ( evt.xbutton.button & Button1 ) on_left_button_up ( evt.xbutton.x, evt.xbutton.y ); break; case EnterNotify: on_mouse_enter ( evt.xcrossing.x, evt.xcrossing.y ); break; case LeaveNotify: on_mouse_exit ( evt.xcrossing.x, evt.xcrossing.y ); break; case MotionNotify: on_mouse_move ( evt.xmotion.x, evt.xmotion.y ); break; case FocusIn: on_got_focus(); break; case FocusOut: on_lost_focus(); break; case KeyPress: case KeyRelease: { character cp; KeySym keysym; XComposeStatus status; int count = XLookupString ( &evt.xkey, cp.text, character::MAX_CHAR_TEXT, &keysym, &status ); cp.text[count] = 0; if ( evt.type == KeyPress ) on_key_press ( cp ); else on_key_release ( cp ); } break; case MapNotify: state = WINDOW_SHOWN; shown(); break; case UnmapNotify: state = WINDOW_HIDDEN; hidden(); break; case ConfigureNotify: //XClearWindow ( env, hwnd ); //XFlush ( env ); position_changed(); break; case ClientMessage: { if ( atomDelete == (Atom)evt.xclient.data.l[0] ) destroy(); break; } } return true; }
void CL_ListView_Impl::on_process_message(CL_GUIMessage &msg) { if (msg.is_type(CL_GUIMessage_Input::get_type_name())) { CL_GUIMessage_Input input = msg; CL_InputEvent input_event = input.get_event(); if (input_event.type == CL_InputEvent::pointer_moved) { on_mouse_move(input, input_event); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_LEFT) { on_mouse_lbutton_down(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_WHEEL_UP) { scrollbar->set_position(scrollbar->get_position()-scrollbar->get_line_step()); on_scroll(); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_WHEEL_DOWN) { scrollbar->set_position(scrollbar->get_position() + scrollbar->get_line_step()); on_scroll(); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::released && input_event.id == CL_MOUSE_LEFT) { on_mouse_lbutton_up(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::doubleclick && input_event.id == CL_MOUSE_LEFT) { on_mouse_lbutton_doubleclick(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_RIGHT) { on_mouse_rbutton_down(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::released && input_event.id == CL_MOUSE_RIGHT) { on_mouse_rbutton_up(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.device.get_type() == CL_InputDevice::keyboard) { bool consumed = on_keyboard_pressed(input_event); if (consumed) msg.set_consumed(); } else if (input_event.type == CL_InputEvent::released && input_event.device.get_type() == CL_InputDevice::keyboard) { bool consumed = on_keyboard_released(input_event); if (consumed) msg.set_consumed(); } } else if (msg.is_type(CL_GUIMessage_Pointer::get_type_name())) { CL_GUIMessage_Pointer pointer = msg; if (pointer.get_pointer_type() == CL_GUIMessage_Pointer::pointer_leave) on_mouse_leave(); else if (pointer.get_pointer_type() == CL_GUIMessage_Pointer::pointer_enter) on_mouse_enter(); } else if (msg.is_type(CL_GUIMessage_FocusChange::get_type_name())) { CL_GUIMessage_FocusChange fc = msg; if (fc.get_focus_type() == CL_GUIMessage_FocusChange::gained_focus) { // .. } else { if (just_launched_lineedit) just_launched_lineedit = false; else cancel_edit(); } listview->request_repaint(); } }