Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 13029) +++ trunk/src/draw.c (revision 13030) @@ -805,10 +805,15 @@ pcb_gui->set_drawing_mode(PCB_HID_COMP_RESET, 1, &ctx->view); pcb_gui->set_drawing_mode(PCB_HID_COMP_POSITIVE, 1, &ctx->view); - pcb_draw_doing_pinout = pcb_true; - pcb_elem_draw(ctx->content.elem); - pcb_draw_doing_pinout = pcb_false; - + if (ctx->content.obj != NULL) { + pcb_draw_doing_pinout = pcb_true; + switch(ctx->content.obj->type) { + case PCB_OBJ_ELEMENT: pcb_elem_draw((pcb_element_t *)ctx->content.obj); break; + case PCB_OBJ_SUBC: pcb_subc_draw_preview((pcb_subc_t *)ctx->content.obj, &ctx->view); break; + default: pcb_message(PCB_MSG_ERROR, "pcb_hid_expose_pinout: unknown object type %x\n", ctx->content.obj->type); + } + pcb_draw_doing_pinout = pcb_false; + } pcb_gui->set_drawing_mode(PCB_HID_COMP_FLUSH, 1, &ctx->view); expose_end(old_gui); Index: trunk/src/hid.h =================================================================== --- trunk/src/hid.h (revision 13029) +++ trunk/src/hid.h (revision 13030) @@ -596,7 +596,7 @@ unsigned force:1; /* draw even if layer set fails */ union { pcb_layer_id_t layer_id; - pcb_element_t *elem; + pcb_any_obj_t *obj; } content; /* for PCB_LYT_DIALOG */ Index: trunk/src_plugins/hid_gtk2_gdk/gtkhid-gdk.c =================================================================== --- trunk/src_plugins/hid_gtk2_gdk/gtkhid-gdk.c (revision 13029) +++ trunk/src_plugins/hid_gtk2_gdk/gtkhid-gdk.c (revision 13030) @@ -942,7 +942,7 @@ ctx.view.Y2 = MAX(0, MIN(PCB->MaxHeight, ctx.view.Y2)); ctx.force = 0; - ctx.content.elem = NULL; + ctx.content.obj = NULL; eleft = Vx(0); eright = Vx(PCB->MaxWidth); Index: trunk/src_plugins/hid_gtk3_cairo/gtkhid-cairo.c =================================================================== --- trunk/src_plugins/hid_gtk3_cairo/gtkhid-cairo.c (revision 13029) +++ trunk/src_plugins/hid_gtk3_cairo/gtkhid-cairo.c (revision 13030) @@ -1089,7 +1089,7 @@ ctx.view.Y2 = MAX(0, MIN(PCB->MaxHeight, ctx.view.Y2)); ctx.force = 0; - ctx.content.elem = NULL; + ctx.content.obj = NULL; eleft = Vx(0); eright = Vx(PCB->MaxWidth); Index: trunk/src_plugins/hid_lesstif/main.c =================================================================== --- trunk/src_plugins/hid_lesstif/main.c (revision 13029) +++ trunk/src_plugins/hid_lesstif/main.c (revision 13030) @@ -3522,7 +3522,7 @@ PreviewData *pd; for (pd = pinouts; pd; pd = pd->next) - if (pd->ctx.content.elem == item) + if (pd->ctx.content.obj == item) return; if (!mainwind) return; @@ -3529,7 +3529,7 @@ pd = (PreviewData *) calloc(1, sizeof(PreviewData)); - pd->ctx.content.elem = item; + pd->ctx.content.obj = item; extents = pcb_hid_get_extents_pinout(&pd->ctx); pd->left = extents->X1; Index: trunk/src_plugins/lib_gtk_common/dlg_library.c =================================================================== --- trunk/src_plugins/lib_gtk_common/dlg_library.c (revision 13029) +++ trunk/src_plugins/lib_gtk_common/dlg_library.c (revision 13030) @@ -362,11 +362,16 @@ pcb_crosshair_set_mode(PCB_MODE_PASTE_BUFFER); /* update the preview with new symbol data */ - if ((PCB_PASTEBUFFER->Data != NULL) && (elementlist_length(&PCB_PASTEBUFFER->Data->Element) != 0)) - g_object_set(library_window->preview, "element-data", elementlist_first(&PCB_PASTEBUFFER->Data->Element), NULL); - else { + if (PCB_PASTEBUFFER->Data != NULL) { + if (elementlist_length(&PCB_PASTEBUFFER->Data->Element) != 0) + g_object_set(library_window->preview, "element-data", elementlist_first(&PCB_PASTEBUFFER->Data->Element), NULL); + else if (pcb_subclist_length(&PCB_PASTEBUFFER->Data->subc) != 0) + g_object_set(library_window->preview, "element-data", pcb_subclist_first(&PCB_PASTEBUFFER->Data->subc), NULL); + else + g_object_set(library_window->preview, "element-data", NULL, NULL); + } + else g_object_set(library_window->preview, "element-data", NULL, NULL); - } /* update the text */ pt = g_string_new("Tags:"); Index: trunk/src_plugins/lib_gtk_common/wt_preview.c =================================================================== --- trunk/src_plugins/lib_gtk_common/wt_preview.c (revision 13029) +++ trunk/src_plugins/lib_gtk_common/wt_preview.c (revision 13030) @@ -58,31 +58,24 @@ static void preview_set_view(pcb_gtk_preview_t * preview) { float scale = SENSIBLE_VIEW_SCALE; - pcb_element_t *elem = &preview->element; #warning switch for .kind here and do a zoom-to-extend on layer - preview->x_max = elem->BoundingBox.X2 + conf_core.appearance.pinout.offset_x; - preview->y_max = elem->BoundingBox.Y2 + conf_core.appearance.pinout.offset_y; - preview->w_pixels = scale * (elem->BoundingBox.X2 - elem->BoundingBox.X1); - preview->h_pixels = scale * (elem->BoundingBox.Y2 - elem->BoundingBox.Y1); + preview->x_max = preview->obj->BoundingBox.X2 + conf_core.appearance.pinout.offset_x; + preview->y_max = preview->obj->BoundingBox.Y2 + conf_core.appearance.pinout.offset_y; + preview->w_pixels = scale * (preview->obj->BoundingBox.X2 - preview->obj->BoundingBox.X1); + preview->h_pixels = scale * (preview->obj->BoundingBox.Y2 - preview->obj->BoundingBox.Y1); } -static void preview_set_data(pcb_gtk_preview_t * preview, pcb_element_t * element) +static void preview_set_data(pcb_gtk_preview_t *preview, pcb_any_obj_t *obj) { - if (element == NULL) { - pcb_element_destroy(&preview->element); + if (obj == NULL) { preview->w_pixels = 0; preview->h_pixels = 0; return; } - /* copy element data and move element to a 5% offset from zero position */ - pcb_element_copy(NULL, &preview->element, element, FALSE, 0, 0); - pcb_element_move(NULL, &preview->element, - conf_core.appearance.pinout.offset_x - preview->element.BoundingBox.X1, - conf_core.appearance.pinout.offset_y - preview->element.BoundingBox.Y1); - + preview->obj = obj; preview_set_view(preview); } @@ -122,7 +115,7 @@ { pcb_gtk_preview_t *preview = PCB_GTK_PREVIEW(object); - /* Passing NULL for element data will free the old memory */ + /* Passing NULL for element data will clear the preview */ preview_set_data(preview, NULL); G_OBJECT_CLASS(ghid_preview_parent_class)->finalize(object); @@ -147,8 +140,8 @@ switch (property_id) { case PROP_ELEMENT_DATA: preview->kind = PCB_GTK_PREVIEW_PINOUT; - preview_set_data(preview, (pcb_element_t *) g_value_get_pointer(value)); - preview->expose_data.content.elem = &preview->element; + preview_set_data(preview, (pcb_any_obj_t *)g_value_get_pointer(value)); + preview->expose_data.content.obj = preview->obj; if (window != NULL) gdk_window_invalidate_rect(window, NULL, FALSE); break; @@ -474,12 +467,12 @@ } GtkWidget *pcb_gtk_preview_pinout_new(pcb_gtk_common_t * com, pcb_gtk_init_drawing_widget_t init_widget, - pcb_gtk_preview_expose_t expose, pcb_element_t * element) + pcb_gtk_preview_expose_t expose, pcb_any_obj_t *obj) { pcb_gtk_preview_t *preview; preview = (pcb_gtk_preview_t *) pcb_gtk_preview_new(com, init_widget, expose, NULL); - g_object_set(G_OBJECT(preview), "element-data", element, NULL); + g_object_set(G_OBJECT(preview), "element-data", obj, NULL); return GTK_WIDGET(preview); } Index: trunk/src_plugins/lib_gtk_common/wt_preview.h =================================================================== --- trunk/src_plugins/lib_gtk_common/wt_preview.h (revision 13029) +++ trunk/src_plugins/lib_gtk_common/wt_preview.h (revision 13030) @@ -92,7 +92,7 @@ time_t grabt; long grabmot; - pcb_element_t element; + pcb_any_obj_t *obj; /* object being displayed in the preview */ pcb_gtk_common_t *com; }; @@ -118,11 +118,11 @@ /** Creates and returns a new freshly-allocated \ref pcb_gtk_preview_t widget for pinout. \param init_widget virtual function called at initialization \param expose drawing event call-back function - \param element widget associated data + \param obj object to draw */ GtkWidget *pcb_gtk_preview_pinout_new(pcb_gtk_common_t * com, pcb_gtk_init_drawing_widget_t init_widget, - pcb_gtk_preview_expose_t expose, pcb_element_t * element); + pcb_gtk_preview_expose_t expose, pcb_any_obj_t *obj); /** Creates and returns a new freshly-allocated \ref pcb_gtk_preview_t widget, using \p layer... for What ?