Exemplo n.º 1
0
static gboolean create_textbox_event (Sheet *sheet, GdkEvent *event)
{
	switch (event->type) {
	case GDK_3BUTTON_PRESS:
	case GDK_2BUTTON_PRESS:
		return TRUE;

	case GDK_BUTTON_PRESS:
		if (event->button.button == 4 || event->button.button == 5)
			return FALSE;

		if (event->button.button == 1) {
			if (sheet->state == SHEET_STATE_TEXTBOX_WAIT)
				sheet->state = SHEET_STATE_TEXTBOX_START;

			return TRUE;
		} else
			return FALSE;

	case GDK_BUTTON_RELEASE:
		if (event->button.button == 4 || event->button.button == 5)
			return FALSE;

		if (sheet->state == SHEET_STATE_TEXTBOX_START) {
			Textbox *textbox;
			Coords pos;

			sheet->state = SHEET_STATE_NONE;

			sheet_get_pointer (sheet, &pos.x, &pos.y);
			textbox = textbox_new (NULL);

			textbox_set_text (textbox, _ ("Label"));

			item_data_set_pos (ITEM_DATA (textbox), &pos);
			schematic_add_item (schematic_view_get_schematic_from_sheet (sheet),
			                    ITEM_DATA (textbox));

			schematic_view_reset_tool (schematic_view_get_schematicview_from_sheet (sheet));
			g_signal_handlers_disconnect_by_func (G_OBJECT (sheet),
			                                      G_CALLBACK (create_textbox_event), sheet);
		}

		return TRUE;

	default:
		return FALSE;
	}

	return TRUE;
}
Exemplo n.º 2
0
int
sheet_event_callback (GtkWidget *widget, GdkEvent *event, Sheet *sheet)
{
	switch (event->type) {
		case GDK_3BUTTON_PRESS:
			// We don't not care about triple clicks on the sheet.
			return FALSE;
		case GDK_2BUTTON_PRESS:
			// The sheet does not care about double clicks, but invoke the
		 	// canvas event handler and see if an item picks up the event.
			if ((*GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class)
			     ->button_press_event) (widget, (GdkEventButton *)event))
			return TRUE;
		else
			return FALSE;
		case GDK_BUTTON_PRESS:
			// If we are in the middle of something else, don't interfere
		 	// with that.
			if (sheet->state != SHEET_STATE_NONE) {
				return FALSE;
			}

			if ((* GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class)
		         ->button_press_event) (widget, (GdkEventButton *) event)) {
				return TRUE;
			}

			if (event->button.button == 3) {
				run_context_menu (
					schematic_view_get_schematicview_from_sheet (sheet), 
			    	(GdkEventButton *) event);
				return TRUE;
			}

			if (event->button.button == 1) {
				if (!(event->button.state & GDK_SHIFT_MASK))
					sheet_select_all (sheet, FALSE);

				rubberband_start (sheet, event);
				return TRUE;
			}
			break;
		case GDK_BUTTON_RELEASE:
			if (event->button.button == 4 || event->button.button == 5)
				return TRUE;

			if (event->button.button == 1 && sheet->priv->rubberband_info->state == RUBBERBAND_ACTIVE) {
				rubberband_finish (sheet, event);
				return TRUE;
			}

			if (GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class)->button_release_event != NULL) {
				return GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class)
					->button_release_event (widget, (GdkEventButton *) event);
			}

			break;

		case GDK_SCROLL:
			if (((GdkEventScroll *)event)->direction == GDK_SCROLL_UP) {
				double zoom;
				sheet_get_zoom (sheet, &zoom);
				if (zoom < ZOOM_MAX)
					sheet_change_zoom (sheet, 1.1);
				} 
				else if (((GdkEventScroll *)event)->direction == GDK_SCROLL_DOWN) {
					double zoom;
				sheet_get_zoom (sheet, &zoom);
				if (zoom > ZOOM_MIN)
					sheet_change_zoom (sheet, 0.9);
				}
				break;
		case GDK_MOTION_NOTIFY:
			if (sheet->priv->rubberband_info->state == RUBBERBAND_ACTIVE) {
				rubberband_update (sheet, event);
				return TRUE;
			}
			if (GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class)
			    ->motion_notify_event != NULL) {
				return GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class)
						->motion_notify_event (widget, (GdkEventMotion *) event);		
			}
		case GDK_ENTER_NOTIFY:
			GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class)
						->enter_notify_event (widget, (GdkEventCrossing *) event);
		case GDK_KEY_PRESS:
			switch (event->key.keyval) {
				case GDK_KEY_R:
				case GDK_KEY_r:
					if (sheet->state == SHEET_STATE_NONE)
						sheet_rotate_selection (sheet);
					break;
				case GDK_KEY_Home:
				case GDK_KEY_End:
					break;
				case GDK_KEY_Left:
					if (event->key.state & GDK_MOD1_MASK)
						sheet_scroll_pixel (sheet, -20, 0);
					break;
				case GDK_KEY_Up:
					if (event->key.state & GDK_MOD1_MASK)
						sheet_scroll_pixel (sheet, 0, -20);
					break;
				case GDK_KEY_Right:
					if (event->key.state & GDK_MOD1_MASK)
						sheet_scroll_pixel (sheet, 20, 0);
					break;
				case GDK_KEY_Down:
					if (event->key.state & GDK_MOD1_MASK)
						sheet_scroll_pixel (sheet, 0, 20);
					break;
				case GDK_KEY_Page_Up:
					if (event->key.state & GDK_MOD1_MASK)
						sheet_scroll_pixel (sheet, 0, -120);
					break;
				case GDK_KEY_Page_Down:
					if (event->key.state & GDK_MOD1_MASK)
						sheet_scroll_pixel (sheet, 0, 120);
					break;
				case GDK_KEY_Escape:
					g_signal_emit_by_name (G_OBJECT (sheet), "cancel");
					break;
				case GDK_KEY_Delete:
					sheet_delete_selection (sheet);
					break;
				default:
					return FALSE;
			}
		default:
			return FALSE;
	}

	return TRUE;
}