gboolean rcm_button_press_event (GtkWidget *widget, GdkEventButton *event, RcmCircle *circle) { float clicked_angle; float *alpha; float *beta; alpha = &circle->angle->alpha; beta = &circle->angle->beta; circle->action_flag = DRAG_START; clicked_angle = angle_mod_2PI (arctg (CENTER - event->y, event->x - CENTER)); circle->prev_clicked = clicked_angle; if ((sqrt (SQR (event->y - CENTER) + SQR (event->x - CENTER)) > RADIUS * EACH_OR_BOTH) && (min_prox (*alpha, *beta, clicked_angle) < G_PI / 12)) { circle->mode = EACH; circle->target = closest (alpha, beta, clicked_angle); if (*(circle->target) != clicked_angle) { GtkStyle *style = gtk_widget_get_style (widget); *(circle->target) = clicked_angle; gtk_widget_queue_draw (circle->preview); color_rotate_draw_arrows (widget->window, style->black_gc, circle->angle); gtk_spin_button_set_value (GTK_SPIN_BUTTON (circle->alpha_entry), circle->angle->alpha * rcm_units_factor(Current.Units)); gtk_spin_button_set_value (GTK_SPIN_BUTTON (circle->beta_entry), circle->angle->beta * rcm_units_factor(Current.Units)); if (Current.RealTime) rcm_render_preview (Current.Bna->after); } } else circle->mode = BOTH; return TRUE; }
void rcm_360_degrees (GtkWidget *button, RcmCircle *circle) { GtkStyle *style = gtk_widget_get_style (circle->preview); circle->action_flag = DO_NOTHING; gtk_widget_queue_draw (circle->preview); circle->angle->beta = circle->angle->alpha-circle->angle->cw_ccw * 0.001; color_rotate_draw_arrows (circle->preview->window, style->black_gc, circle->angle); circle->action_flag = VIRGIN; rcm_render_preview (Current.Bna->after); }
gboolean rcm_expose_event (GtkWidget *widget, GdkEventExpose *event, RcmCircle *circle) { cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (widget)); cairo_translate (cr, 0.5, 0.5); color_rotate_draw_arrows (cr, circle->angle); cairo_destroy (cr); return TRUE; }
gboolean rcm_expose_event (GtkWidget *widget, GdkEventExpose *event, RcmCircle *circle) { if (circle->action_flag == VIRGIN) { GtkStyle *style = gtk_widget_get_style (widget); color_rotate_draw_arrows (widget->window, style->black_gc, circle->angle); } return TRUE; }
void rcm_set_beta (GtkWidget *entry, RcmCircle *circle) { GtkStyle *style = gtk_widget_get_style (circle->preview); if (circle->action_flag != VIRGIN) return; circle->angle->beta = (gtk_spin_button_get_value (GTK_SPIN_BUTTON (entry)) / rcm_units_factor(Current.Units)); gtk_widget_queue_draw (circle->preview); color_rotate_draw_arrows (circle->preview->window, style->black_gc, circle->angle); rcm_render_preview (Current.Bna->after); }
gboolean rcm_release_event (GtkWidget *widget, GdkEventButton *event, RcmCircle *circle) { if (circle->action_flag == DRAGING) { GtkStyle *style = gtk_widget_get_style (widget); gtk_widget_queue_draw (circle->preview); color_rotate_draw_arrows (widget->window, style->black_gc, circle->angle); } circle->action_flag = VIRGIN; rcm_render_preview (Current.Bna->after); return TRUE; }
gboolean rcm_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, RcmCircle *circle) { gfloat clicked_angle, delta; gfloat *alpha, *beta; gint cw_ccw; GdkGCValues values; alpha = &(circle->angle->alpha); beta = &(circle->angle->beta); cw_ccw = circle->angle->cw_ccw; delta = angle_mod_2PI (cw_ccw * (*beta - *alpha)); values.function = GDK_INVERT; xor_gc = gdk_gc_new_with_values (Current.From->preview->window, &values, GDK_GC_FUNCTION); clicked_angle = angle_mod_2PI (arctg (CENTER - event->y, event->x - CENTER)); delta = clicked_angle - circle->prev_clicked; circle->prev_clicked = clicked_angle; if (delta) { if (circle->action_flag == DRAG_START) { gtk_widget_queue_draw (circle->preview); circle->action_flag = DRAGING; } else { /* this should be erasing entire angle */ color_rotate_draw_arrows (widget->window, xor_gc, circle->angle); } if (circle->mode == EACH) { *(circle->target)=clicked_angle; } else { circle->angle->alpha=angle_mod_2PI(circle->angle->alpha + delta); circle->angle->beta =angle_mod_2PI(circle->angle->beta + delta); } gdk_window_process_updates (widget->window, FALSE); color_rotate_draw_arrows (widget->window, xor_gc, circle->angle); gtk_spin_button_set_value (GTK_SPIN_BUTTON (circle->alpha_entry), circle->angle->alpha * rcm_units_factor(Current.Units)); gtk_spin_button_set_value (GTK_SPIN_BUTTON (circle->beta_entry), circle->angle->beta * rcm_units_factor(Current.Units)); if (Current.RealTime) rcm_render_preview (Current.Bna->after); } gdk_event_request_motions (event); return TRUE; }