/* handles the mouse button being released inside the drawing area
   calls the apropriate tool function, or none */
static gint
button_release_event(GtkWidget *widget, GdkEventButton *event )
{
  double x, y;

  if (deleting_placename) {
    do_delete_placename(current_place);
    return TRUE;
  }
  if (adding_placename) {
    x = pix_x_to_map(event->x)*map->config.resolution;
    y = pix_y_to_map(event->y)*map->config.resolution;
    start_add_placename(x, y);
    return TRUE;
  }
  if (adding_door) {
    x = pix_x_to_map(event->x)*map->config.resolution;
    y = pix_y_to_map(event->y)*map->config.resolution;
    if (adding_door == 2)
      start_add_door(x, y);
    else
      finish_add_door(x, y);
    return TRUE;
  }

  if (event->button == 1 && tmp_pixmap != NULL)
    switch(utensil)
      {
      case CARMEN_MAP_RECTANGLE:
	creating_rectangle(widget, 2, event->x, event->y);
	break;
      case CARMEN_MAP_CROP:
	cropping(widget, 2, event->x, event->y);
	break;
      case CARMEN_MAP_LINE:
	creating_line(2, event->x, event->y);
	break;
      case CARMEN_MAP_MOVER:
	move(2, event->x, event->y);
      default:
	break;
      }

  redraw();
  return 1;
}
/* handles the mouse moving in the drawing area
   only calls the appropriate tool function if the mouse button is down.
   always sets the cursor to the appropriate symbol */
static gint
motion_notify_event( GtkWidget *widget, GdkEventMotion *event )
{
  int x, y;
  GdkModifierType state;
  static char label_buffer[255];
  static carmen_map_point_t map_point;
  static carmen_world_point_t world_point;


  gtk_propagate_event(GTK_WIDGET(vrule), (GdkEvent *)event);
  gtk_propagate_event(GTK_WIDGET(hrule), (GdkEvent *)event);

  map_to_tmp();

  if (event->is_hint)
    gdk_window_get_pointer (event->window, &x, &y, &state);
  else
    {
      x = event->x;
      y = event->y;
      state = event->state;
    }

  map_point.x = pix_x_to_map(x);
  map_point.y = pix_y_to_map(y);
  map_point.map = map;
  carmen_map_to_world(&map_point, &world_point);
  sprintf(label_buffer, "X: %6.2f Y: %6.2f", world_point.pose.x,
	  world_point.pose.y);
  gtk_label_set_text(GTK_LABEL(coords_label), label_buffer);

  if (tmp_pixmap == NULL)
    return TRUE;

  if (deleting_placename)
    {
      handle_deleting_placename_move(map_point.x, map_point.y);
    }
  else if ((state & GDK_BUTTON1_MASK))
    {
      switch(utensil)
	{
	case CARMEN_MAP_BRUSH:
	  draw_brush (widget, x, y);
	  x = x/mult - brush_size + .5;
	  y = y/mult - brush_size + .5;
	  break;
	case CARMEN_MAP_RECTANGLE:
	  creating_rectangle(widget, 1, x, y);
	  break;
	case CARMEN_MAP_CROP:
	  cropping(widget, 1, x, y);
	  break;
	case CARMEN_MAP_LINE:
	  creating_line(1, x, y);
	  break;
	case CARMEN_MAP_EYEDROPPER:
	  sample(x, y);
	  break;
	case CARMEN_MAP_MOVER:
	  move(1, x, y);
	default:
	  break;
	}
    }

  redraw();

  return TRUE;
}
/* handles a button press event in the drawing area.
   calls the apropriate tool depending upon utensil's setting
   also creates a backup for undo and incrememnts modified if necessary */
static gint
button_press_event( GtkWidget *widget, GdkEventButton *event )
{
  if(tmp_pixmap == NULL)
    return -1;

  if (deleting_placename)
    return TRUE;

  if (adding_placename)
    return TRUE;

  if (adding_door)
    return TRUE;

  if (event->button == 1)
    {
      switch(utensil)
	{
	case CARMEN_MAP_BRUSH:
	  memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size *
		 map->config.y_size);
	  modified ++;
	  draw_brush(widget, event->x, event->y);
	  break;
	case CARMEN_MAP_RECTANGLE:
	  memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size *
		 map->config.y_size);
	  modified ++;
	  creating_rectangle(widget, 0, event->x, event->y);
	  break;
	case CARMEN_MAP_CROP:
	  memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size *
		 map->config.y_size);
	  modified ++;
	  cropping(widget, 0, event->x, event->y);
	  break;
	case CARMEN_MAP_LINE:
	  memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size *
		 map->config.y_size);
	  modified ++;
	  creating_line(0, event->x, event->y);
	  break;
	case CARMEN_MAP_FILL:
	  memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size *
		 map->config.y_size);
	  modified ++;
	  create_fill(event->x, event->y);
	  break;
	case CARMEN_MAP_FUZZY_FILL:
	  memcpy(backup, map->complete_map, sizeof(float) * map->config.x_size *
		 map->config.y_size);
	  modified ++;
	  create_fuzzy_fill(event->x, event->y);
	  break;
	case CARMEN_MAP_EYEDROPPER:
	  sample(event->x, event->y);
	  break;
	case CARMEN_MAP_ZOOM:
	  zoom_in(event->x, event->y);
	  break;
	case CARMEN_MAP_MOVER:
	  move(0, event->x, event->y);
	default:
	  break;
	}
    }
  else if (event->button == 3 && utensil == CARMEN_MAP_ZOOM)
    zoom_out(event->x, event->y);

  redraw();
  return TRUE;
}
Beispiel #4
0
int machinery(void)
{
   int key,
       button = 1,
       status = 0,
       h, v;
   machineplates();
   do{
      key = checkinput();
      h = rat.horiz;
      v = rat.verti;
      if((rat.buttons == LBUTTON && key == PRESS) && (platehit(0,h,v)))
      {
         clearplates();
         status = farmpower();
         machineplates();
      }
      if((rat.buttons == LBUTTON && key == PRESS) && (platehit(1,h,v)))
      {
         clearplates();
         status = cropping();
         machineplates();
      }
      if((rat.buttons == LBUTTON && key == PRESS) && (platehit(2,h,v)))
      {
         clearplates();
         status = haying();
         machineplates();
      }
      if((rat.buttons == LBUTTON && key == PRESS) && (platehit(3,h,v)))
      {
         clearplates();
         status = specialcrops();
         machineplates();
      }
      if((rat.buttons == LBUTTON && key == PRESS) && (platehit(4,h,v)))
      {
         clearplates();
         status = dairy();
         machineplates();
      }
      if((rat.buttons == LBUTTON && key == PRESS) && (platehit(5,h,v)))
      {
         clearplates();
         status = swine();
         machineplates();
      }
      if((rat.buttons == LBUTTON && key == PRESS) && (platehit(6,h,v)))
      {
         clearplates();
         status = poultry();
         machineplates();
      }
      if((rat.buttons == LBUTTON && key == PRESS) && (platehit(7,h,v)))
      {
         clearplates();
         status = genlvstock();
         machineplates();
      }
      if((rat.buttons == LBUTTON && key == PRESS) && (platehit(8,h,v)))
      {
         clearplates();
         status = misc();
         machineplates();
      }
      if((rat.buttons == LBUTTON && key == PRESS) && (platehit(9,h,v)))
      {
         clearplates();
         status = landlords();
         machineplates();
      }
      if((rat.buttons == RBUTTON && key == HELD) && (checkhit(1,h,v)))
      {
	     if(buton)
		 {
		    buttonoff(1);
			buton = 0;
		 }
		 else
		 {
		    buttonon(1);
			buton = 1;
		 }
	  }
     if((rat.buttons == CBUTTON && key == RELEASE) && (checkhit(1,h,v)))
      {
	     if(buton)
		 {
		    buttonoff(1);
			buton = 0;
		 }
		 else
		 {
		    buttonon(1);
			buton = 1;
		 }
	  }
     if((rat.buttons == LBUTTON && key == PRESS) && (checkhit(2,h,v)))
     {
	    status = 1;
	 }
	 if((rat.buttons == LBUTTON && key == PRESS) && (checkhit(0,h,v)))
     {
		status = 2;
     }
     if (status == 2 || status == 1) key = ESC;
     }while(!(((rat.buttons == LBUTTON && key == RELEASE) || (key == ENTER)) && checkhit(3,h,v) || (key == ESC));
        clearplates();
        return(status);
     }