Exemplo n.º 1
0
// 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();
}
Exemplo n.º 2
0
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();
	}
}
Exemplo n.º 3
0
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:
            ;
    }
}
Exemplo n.º 4
0
  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;
	}
Exemplo n.º 5
0
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();
	}
}