Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #5
0
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);
}
Пример #6
0
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;
}
Пример #7
0
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;
    }
}
Пример #9
0
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;
}
Пример #10
0
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;
}
Пример #11
0
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;
}
Пример #12
0
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;
}