static gboolean double_click_event (GtkWidget *widget, GdkEventButton *event, designer_node_t *hn, _hit_t ht) { widget_data_t *data = get_widget_data(widget); switch(ht) { case HIT_LABEL: change_node_title (data, hn); data->state = STATE_IDLE; clean_up_active_target (data); data->dragging = FALSE; break; case HIT_TITLE: case HIT_BODY: set_root_focus (data, hn); break; default: break; } gtk_widget_queue_draw(widget); return TRUE; }
void designer_widget_design_loaded_callback (designer_design_t *design, gpointer user_data) { GtkWidget *widget = GTK_WIDGET(user_data); widget_data_t *data = get_widget_data(widget); #ifdef DEBUG_OUTPUT g_print("design loaded for widget %p\n", data); #endif designer_widget_set_design(widget, design); }
void designer_widget_set_design (GtkWidget *widget, designer_design_t *design) { widget_data_t *data = get_widget_data(widget); #ifdef DEBUG_OUTPUT g_print("widget %p sets design to %p\n", data, design); #endif data->design = design; update_area_conditional(data, TRUE); }
std::string get_name<label_t>(const label_t& widget) { if (!widget.control_m.get()) return std::string(); ::CFStringRef cfstring; get_widget_data(widget.control_m.get(), kControlEntireControl, kControlStaticTextCFStringTag, cfstring); auto_cfstring_t auto_cfstring(cfstring); return explicit_cast<std::string>(cfstring); }
void designer_widget_move_node (GtkWidget *widget, designer_node_t *node, double x, double y) { widget_data_t *data = get_widget_data(widget); #ifdef DEBUG_OUTPUT g_print("widget %p moves node %s to %gx%g\n", data, node->name, x, y); #endif node_data_t *nd = node_data(node); nd->origin = _point(x,y); update_area_conditional(data, FALSE); }
void designer_widget_get_node_position (GtkWidget *widget, designer_node_t *node, double *x, double *y) { widget_data_t *data = get_widget_data(widget); #ifdef DEBUG_OUTPUT g_print("widget %p retrieves position of node %s\n", data, node->name); #endif node_data_t *nd = node_data(node); *x = nd->origin.x; *y = nd->origin.y; }
void designer_widget_add_node (GtkWidget *widget, designer_node_t *node, double x, double y) { widget_data_t *data = get_widget_data(widget); #ifdef DEBUG_OUTPUT g_print("widget %p adds node %s at %gx%g\n", data, node->name, x, y); #endif node_data_t *nd = node_data(node); nd->origin = place_new_node(data); designer_node_push_back(node); set_root_focus (data, node); update_area_conditional(data, TRUE); gtk_widget_queue_draw(widget); }
void get_selection(edit_text_t& edit_text, std::size_t& start_pos, std::size_t& end_pos) { assert(edit_text.control_m); if (edit_text.scrollable_m) { // REVISIT (fbrereto) : Implement me } else { ::ControlEditTextSelectionRec selection = { 0 }; get_widget_data(edit_text.control_m, kControlEditTextPart, kControlEditTextSelectionTag, selection); start_pos = selection.selStart; end_pos = selection.selEnd; } }
static gboolean motion_notify_event (GtkWidget *widget, GdkEventMotion *event) { widget_data_t *data = get_widget_data(widget); int x, y; GdkModifierType state; if (event->is_hint) gdk_window_get_pointer (event->window, &x, &y, &state); else { x = event->x; y = event->y; state = event->state; } data->mouse = map_location(data, _point(x, y)); switch(data->state) { case STATE_MOVING: if (data->active_node) { node_data(data->active_node)->origin = _move(data->origin, _delta(data->mouse_down, data->mouse)); } break; case STATE_CONIN: break; case STATE_CONOUT: break; default: break; } gtk_widget_queue_draw(widget); return TRUE; }
static gboolean button_release_event (GtkWidget *widget, GdkEventButton *event) { widget_data_t *data = get_widget_data(widget); data->mouse_up = map_location(data, _point(event->x, event->y)); switch(data->state) { case STATE_MOVING: update_area_conditional(data, FALSE); data->state = STATE_IDLE; break; case STATE_CONIN: if (data->target_check != DESIGNER_CONNECTION_UNCONNECTABLE) connect(data, data->target_node, data->target_slot_id, data->active_node, data->active_slot_id); data->state = STATE_IDLE; break; case STATE_CONOUT: if (data->target_check != DESIGNER_CONNECTION_UNCONNECTABLE) connect(data, data->active_node, data->active_slot_id, data->target_node, data->target_slot_id); data->state = STATE_IDLE; break; default: break; } /* clean up active/target */ if (data->state == STATE_IDLE) clean_up_active_target (data); data->dragging = FALSE; gtk_widget_queue_draw(widget); return TRUE; }
static gboolean expose_event (GtkWidget *widget, GdkEventExpose *event) { widget_data_t *data = get_widget_data(widget); designer_node_t *hn = NULL; _hit_t hit; int hs = -1; cairo_t *cr = gdk_cairo_create( GTK_WIDGET (data->drawing_area)->window); cairo_set_source_rgb(cr, 0.9, 0.9, 0.9); cairo_paint(cr); _size_t delta = _ptos(data->visible_area.o); cairo_translate(cr, 0.5 - delta.w, 0.5 - delta.h); #if 0 cairo_set_line_width(cr, 3.0); cairo_set_source_rgba(cr, 0.3, 0.3, 0.3, 0.5); round_path(cr, data->used_area, round_s); cairo_stroke(cr); cairo_set_source_rgba(cr, 0.8, 0.6, 0.3, 0.5); round_path(cr, data->visible_area, round_s); cairo_stroke(cr); { char buf[32]; _point_t o = data->mouse; show_axis(cr, o, 0,0,0, 20, 20); set_title_font(cr); cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.8); cairo_move_to(cr, o.x + 5, o.y - 5); sprintf(buf, "(%.0f,%.0f)", o.x, o.y); cairo_show_text(cr, buf); cairo_stroke(cr); cairo_move_to(cr, o.x + 5, o.y + 13); sprintf(buf, "[%.0f,%.0f,%.0fx%.0f]", data->used_area.o.x, data->used_area.o.y, data->used_area.s.w, data->used_area.s.h); cairo_show_text(cr, buf); cairo_stroke(cr); cairo_move_to(cr, o.x + 5, o.y + 28); sprintf(buf, "[%.0f,%.0f,%.0fx%.0f]", data->visible_area.o.x, data->visible_area.o.y, data->visible_area.s.w, data->visible_area.s.h); cairo_show_text(cr, buf); cairo_stroke(cr); show_axis(cr, _zerop, 1,0,0, 10, 10); } #endif /* draw the slot conenctions */ for (GSList *list = data->design->nodes; list != NULL; list = list->next) { designer_node_t *dst = list->data; node_data_t *ndd = node_data(dst); calc_node_type(cr, dst->type); calc_node(cr, dst); for (GSList *slot_list = dst->input_slots; slot_list != NULL; slot_list = slot_list->next) { designer_slot_t *slot = slot_list->data; designer_node_t *src = slot->source; node_data_t *nsd = node_data(src); designer_slot_spec_t *src_spec = slot->output_slot_spec; designer_slot_spec_t *dst_spec = slot->input_slot_spec; slot_spec_data_t *ssd = slot_spec_data(src_spec); slot_spec_data_t *dsd = slot_spec_data(dst_spec); _point_t sp = _move(_move(nsd->or.o, _ptos(nsd->origin)), ssd->offset); _point_t dp = _move(_move(ndd->ir.o, _ptos(ndd->origin)), dsd->offset); draw_connect(cr, sp, dp, 0); } /* check for 'highest' node hit */ _hit_t nht = hit_node(dst, data->mouse); if (nht) { hn = dst; hit = nht; } } /* update target info */ switch (hit) { case HIT_INPUT: hs = hit_input_slot(hn, data->mouse); data->target = input_slot_origin(hn, hs); if (data->state == STATE_IDLE) /* show 'break' if already connected */ data->target_check = input_slot_check(hn, hs); else if (data->state == STATE_CONIN) data->target_check = DESIGNER_CONNECTION_UNCONNECTABLE; else if (data->state == STATE_CONOUT && ((hn != data->target_node) || (hs != data->target_slot_id))) data->target_check = connect_check( data->active_node, data->active_slot_id, hn, hs); break; case HIT_OUTPUT: hs = hit_output_slot(hn, data->mouse); data->target = output_slot_origin(hn, hs); if (data->state == STATE_IDLE) data->target_check = DESIGNER_CONNECTION_FREE; else if (data->state == STATE_CONOUT) data->target_check = DESIGNER_CONNECTION_UNCONNECTABLE; else if (data->state == STATE_CONIN && ((hn != data->target_node) || (hs != data->target_slot_id))) data->target_check = connect_check( hn, hs, data->active_node, data->active_slot_id); break; default: data->target_check = DESIGNER_CONNECTION_UNCONNECTABLE; hs = -1; break; } data->target_node = hn; data->target_slot_id = hs; /* draw the nodes */ for (GSList *list = data->design->nodes; list != NULL; list = list->next) { designer_node_t *node = list->data; int flags = (node == data->design->root) ? 0x1 : 0; draw_node(cr, node, flags); if (node == hn) { draw_highlight(cr, node, data->mouse, hit, data->target_check); } } if (data->state == STATE_CONIN) { draw_connect(cr, data->mouse, data->origin, 0); } if (data->state == STATE_CONOUT) { draw_connect(cr, data->origin, data->mouse, 0); } cairo_destroy(cr); return FALSE; }
static gboolean button_press_event (GtkWidget *widget, GdkEventButton *event) { widget_data_t *data = get_widget_data(widget); data->mouse_down = map_location(data, _point(event->x, event->y)); designer_node_t *hn = NULL; _hit_t ht = HIT_NOTHING; int hs = -1; /* check for best node hit */ for (GSList *list = data->design->nodes; list != NULL; list = list->next) { designer_node_t *node = list->data; _hit_t nht = hit_node(node, data->mouse_down); if (nht) { hn = node; ht = nht; } } if (event->type == GDK_2BUTTON_PRESS) return double_click_event(widget, event, hn, ht); switch(ht) { case HIT_LABEL: case HIT_TITLE: case HIT_BODY: data->active_node = hn; data->state = STATE_MOVING; data->origin = node_data(hn)->origin; designer_node_push_back(hn); break; case HIT_CLOSE: designer_disconnect_and_delete_node(hn); promote_focus(data); signal_design_change(data); update_area_conditional(data, FALSE); break; case HIT_INPUT: hs = hit_input_slot(hn, data->mouse_down); /* loosen connection if connected */ if (data->target_check == DESIGNER_CONNECTION_CONNECTABLE) { loosen_connection(data, hn, hs); data->state = STATE_CONOUT; break; } data->active_node = hn; data->active_slot_id = hs; data->origin = input_slot_origin(hn, hs); // g_print("hit %lf,%lf -> %d\n", event->x, event->y, data->active_slot_id); data->state = STATE_CONIN; break; case HIT_OUTPUT: hs = hit_output_slot(hn, data->mouse_down); data->active_node = hn; data->active_slot_id = hs; data->origin = output_slot_origin(hn, data->active_slot_id); // g_print("hit %lf,%lf -> %d\n", event->x, event->y, data->active_slot_Id); data->state = STATE_CONOUT; break; default: data->state = STATE_IDLE; break; } data->dragging = TRUE; gtk_widget_queue_draw(widget); return TRUE; }