static void eek_preview_size_request( GtkWidget* widget, GtkRequisition* req ) { gint width = 0; gint height = 0; EekPreview* preview = EEK_PREVIEW(widget); if ( !setupDone ) { GtkIconSize sizes[] = { GTK_ICON_SIZE_MENU, GTK_ICON_SIZE_SMALL_TOOLBAR, GTK_ICON_SIZE_LARGE_TOOLBAR, GTK_ICON_SIZE_BUTTON, GTK_ICON_SIZE_DIALOG }; eek_preview_set_size_mappings( G_N_ELEMENTS(sizes), sizes ); } width = sizeThings[preview->_size].width; height = sizeThings[preview->_size].height; if ( preview->_view == VIEW_TYPE_LIST ) { width *= 3; } if ( preview->_ratio != 100 ) { width = (width * preview->_ratio) / 100; if ( width < 0 ) { width = 1; } } req->width = width; req->height = height; }
static gboolean eek_preview_leave_cb( GtkWidget* widget, GdkEventCrossing* event ) { if ( gtk_get_event_widget( (GdkEvent*)event ) == widget ) { EekPreview* preview = EEK_PREVIEW(widget); preview->_within = FALSE; gtk_widget_set_state( widget, GTK_STATE_NORMAL ); } return FALSE; }
static gboolean eek_preview_enter_cb( GtkWidget* widget, GdkEventCrossing* event ) { if ( gtk_get_event_widget( (GdkEvent*)event ) == widget ) { EekPreview* preview = EEK_PREVIEW(widget); preview->_within = TRUE; gtk_widget_set_state( widget, preview->_hot ? GTK_STATE_ACTIVE : GTK_STATE_PRELIGHT ); } return FALSE; }
static gboolean eek_preview_button_release_cb( GtkWidget* widget, GdkEventButton* event ) { if ( gtk_get_event_widget( (GdkEvent*)event ) == widget ) { EekPreview* preview = EEK_PREVIEW(widget); preview->_hot = FALSE; gtk_widget_set_state( widget, GTK_STATE_NORMAL ); if ( preview->_within && event->button == PRIME_BUTTON_MAGIC_NUMBER ) { gboolean isAlt = (event->state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK; if ( isAlt ) { g_signal_emit( widget, eek_preview_signals[ALTCLICKED_SIGNAL], 0, 2 ); } else { g_signal_emit( widget, eek_preview_signals[CLICKED_SIGNAL], 0 ); } } } return FALSE; }
static gboolean eek_preview_button_press_cb( GtkWidget* widget, GdkEventButton* event ) { if ( gtk_get_event_widget( (GdkEvent*)event ) == widget ) { EekPreview* preview = EEK_PREVIEW(widget); if ( preview->_takesFocus && !GTK_WIDGET_HAS_FOCUS(widget) ) { gtk_widget_grab_focus(widget); } if ( event->button == PRIME_BUTTON_MAGIC_NUMBER ) { preview->_hot = TRUE; if ( preview->_within ) { gtk_widget_set_state( widget, GTK_STATE_ACTIVE ); } } } return FALSE; }
static void eek_preview_get_property( GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { GObjectClass* gobjClass = G_OBJECT_CLASS(parent_class); switch ( property_id ) { case FOCUS_PROP_ID: { EekPreview* preview = EEK_PREVIEW( object ); g_value_set_boolean( value, preview->_takesFocus ); } break; default: { if ( gobjClass->get_property ) { gobjClass->get_property( object, property_id, value, pspec ); } } } }
gboolean eek_preview_expose_event( GtkWidget* widget, GdkEventExpose* event ) { /* g_message("Exposed!!! %s", GTK_WIDGET_HAS_FOCUS(widget) ? "XXX" : "---" ); */ gint insetX = 0; gint insetY = 0; (void)event; /* gint lower = widget->allocation.width; lower = (widget->allocation.height < lower) ? widget->allocation.height : lower; if ( lower > 16 ) { insetX++; if ( lower > 18 ) { insetX++; if ( lower > 22 ) { insetX++; if ( lower > 24 ) { insetX++; if ( lower > 32 ) { insetX++; } } } } insetY = insetX; } */ if ( GTK_WIDGET_DRAWABLE( widget ) ) { GtkStyle* style = gtk_widget_get_style( widget ); if ( insetX > 0 || insetY > 0 ) { gtk_paint_flat_box( style, widget->window, (GtkStateType)GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE, NULL, widget, NULL, 0, 0, widget->allocation.width, widget->allocation.height); } GdkGC *gc = gdk_gc_new( widget->window ); EekPreview* preview = EEK_PREVIEW(widget); GdkColor fg = {0, preview->_r, preview->_g, preview->_b}; gdk_colormap_alloc_color( gdk_colormap_get_system(), &fg, FALSE, TRUE ); gdk_gc_set_foreground( gc, &fg ); gdk_draw_rectangle( widget->window, gc, TRUE, insetX, insetY, widget->allocation.width - (insetX * 2), widget->allocation.height - (insetY * 2) ); if ( preview->_linked ) { /* Draw arrow */ GdkRectangle possible = {insetX, insetY, (widget->allocation.width - (insetX * 2)), (widget->allocation.height - (insetY * 2)) }; GdkRectangle area = {possible.x, possible.y, possible.width / 2, possible.height / 2 }; /* Make it square */ if ( area.width > area.height ) area.width = area.height; if ( area.height > area.width ) area.height = area.width; /* Center it horizontally */ if ( area.width < possible.width ) { int diff = (possible.width - area.width) / 2; area.x += diff; } if ( preview->_linked & PREVIEW_LINK_IN ) { gtk_paint_arrow( style, widget->window, (GtkStateType)widget->state, GTK_SHADOW_ETCHED_IN, NULL, /* clip area. &area, */ widget, /* may be NULL */ NULL, /* detail */ GTK_ARROW_DOWN, FALSE, area.x, area.y, area.width, area.height ); } if ( preview->_linked & PREVIEW_LINK_OUT ) { GdkRectangle otherArea = {area.x, area.y, area.width, area.height}; if ( otherArea.height < possible.height ) { otherArea.y = possible.y + (possible.height - otherArea.height); } gtk_paint_arrow( style, widget->window, (GtkStateType)widget->state, GTK_SHADOW_ETCHED_OUT, NULL, /* clip area. &area, */ widget, /* may be NULL */ NULL, /* detail */ GTK_ARROW_UP, FALSE, otherArea.x, otherArea.y, otherArea.width, otherArea.height ); } if ( preview->_linked & PREVIEW_LINK_OTHER ) { GdkRectangle otherArea = {insetX, area.y, area.width, area.height}; if ( otherArea.height < possible.height ) { otherArea.y = possible.y + (possible.height - otherArea.height) / 2; } gtk_paint_arrow( style, widget->window, (GtkStateType)widget->state, GTK_SHADOW_ETCHED_OUT, NULL, /* clip area. &area, */ widget, /* may be NULL */ NULL, /* detail */ GTK_ARROW_LEFT, FALSE, otherArea.x, otherArea.y, otherArea.width, otherArea.height ); } } if ( GTK_WIDGET_HAS_FOCUS(widget) ) { gtk_paint_focus( style, widget->window, GTK_STATE_NORMAL, NULL, /* GdkRectangle *area, */ widget, NULL, 0 + 1, 0 + 1, widget->allocation.width - 2, widget->allocation.height - 2 ); } } return FALSE; }
gboolean eek_preview_expose_event( GtkWidget* widget, GdkEventExpose* event ) { /* g_message("Exposed!!! %s", GTK_WIDGET_HAS_FOCUS(widget) ? "XXX" : "---" ); */ gint insetX = 0; gint insetY = 0; (void)event; /* gint lower = widget->allocation.width; lower = (widget->allocation.height < lower) ? widget->allocation.height : lower; if ( lower > 16 ) { insetX++; if ( lower > 18 ) { insetX++; if ( lower > 22 ) { insetX++; if ( lower > 24 ) { insetX++; if ( lower > 32 ) { insetX++; } } } } insetY = insetX; } */ if ( GTK_WIDGET_DRAWABLE( widget ) ) { GtkStyle* style = gtk_widget_get_style( widget ); if ( insetX > 0 || insetY > 0 ) { gtk_paint_flat_box( style, widget->window, (GtkStateType)GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE, NULL, widget, NULL, 0, 0, widget->allocation.width, widget->allocation.height); } GdkGC *gc = gdk_gc_new( widget->window ); EekPreview* preview = EEK_PREVIEW(widget); GdkColor fg = {0, static_cast<guint16>(preview->_r), static_cast<guint16>(preview->_g), static_cast<guint16>(preview->_b)}; gdk_colormap_alloc_color( gdk_colormap_get_system(), &fg, FALSE, TRUE ); gdk_gc_set_foreground( gc, &fg ); gdk_draw_rectangle( widget->window, gc, TRUE, insetX, insetY, widget->allocation.width - (insetX * 2), widget->allocation.height - (insetY * 2) ); if ( preview->_previewPixbuf ) { GtkDrawingArea* da = &(preview->drawing); GdkDrawable* drawable = (GdkDrawable*) (((GtkWidget*)da)->window); gint w = 0; gint h = 0; gdk_drawable_get_size(drawable, &w, &h); if ((w != preview->_scaledW) || (h != preview->_scaledH)) { if (preview->_scaled) { g_object_unref(preview->_scaled); } preview->_scaled = gdk_pixbuf_scale_simple(preview->_previewPixbuf, w, h, GDK_INTERP_BILINEAR); preview->_scaledW = w; preview->_scaledH = h; } GdkPixbuf* pix = (preview->_scaled) ? preview->_scaled : preview->_previewPixbuf; gdk_draw_pixbuf( drawable, 0, pix, 0, 0, 0, 0, w, h, GDK_RGB_DITHER_NONE, 0, 0 ); } if ( preview->_linked ) { /* Draw arrow */ GdkRectangle possible = {insetX, insetY, (widget->allocation.width - (insetX * 2)), (widget->allocation.height - (insetY * 2)) }; GdkRectangle area = {possible.x, possible.y, possible.width / 2, possible.height / 2 }; /* Make it square */ if ( area.width > area.height ) area.width = area.height; if ( area.height > area.width ) area.height = area.width; /* Center it horizontally */ if ( area.width < possible.width ) { int diff = (possible.width - area.width) / 2; area.x += diff; } if ( preview->_linked & PREVIEW_LINK_IN ) { gtk_paint_arrow( style, widget->window, (GtkStateType)widget->state, GTK_SHADOW_ETCHED_IN, NULL, /* clip area. &area, */ widget, /* may be NULL */ NULL, /* detail */ GTK_ARROW_DOWN, FALSE, area.x, area.y, area.width, area.height ); } if ( preview->_linked & PREVIEW_LINK_OUT ) { GdkRectangle otherArea = {area.x, area.y, area.width, area.height}; if ( otherArea.height < possible.height ) { otherArea.y = possible.y + (possible.height - otherArea.height); } gtk_paint_arrow( style, widget->window, (GtkStateType)widget->state, GTK_SHADOW_ETCHED_OUT, NULL, /* clip area. &area, */ widget, /* may be NULL */ NULL, /* detail */ GTK_ARROW_DOWN, FALSE, otherArea.x, otherArea.y, otherArea.width, otherArea.height ); } if ( preview->_linked & PREVIEW_LINK_OTHER ) { GdkRectangle otherArea = {insetX, area.y, area.width, area.height}; if ( otherArea.height < possible.height ) { otherArea.y = possible.y + (possible.height - otherArea.height) / 2; } gtk_paint_arrow( style, widget->window, (GtkStateType)widget->state, GTK_SHADOW_ETCHED_OUT, NULL, /* clip area. &area, */ widget, /* may be NULL */ NULL, /* detail */ GTK_ARROW_LEFT, FALSE, otherArea.x, otherArea.y, otherArea.width, otherArea.height ); } if ( preview->_linked & PREVIEW_FILL ) { GdkRectangle otherArea = {possible.x + ((possible.width / 4) - (area.width / 2)), area.y, area.width, area.height}; if ( otherArea.height < possible.height ) { otherArea.y = possible.y + (possible.height - otherArea.height) / 2; } gtk_paint_check( style, widget->window, (GtkStateType)widget->state, GTK_SHADOW_ETCHED_OUT, NULL, widget, NULL, otherArea.x, otherArea.y, otherArea.width, otherArea.height ); } if ( preview->_linked & PREVIEW_STROKE ) { GdkRectangle otherArea = {possible.x + (((possible.width * 3) / 4) - (area.width / 2)), area.y, area.width, area.height}; if ( otherArea.height < possible.height ) { otherArea.y = possible.y + (possible.height - otherArea.height) / 2; } gtk_paint_diamond( style, widget->window, (GtkStateType)widget->state, GTK_SHADOW_ETCHED_OUT, NULL, widget, NULL, otherArea.x, otherArea.y, otherArea.width, otherArea.height ); } } if ( GTK_WIDGET_HAS_FOCUS(widget) ) { gtk_paint_focus( style, widget->window, GTK_STATE_NORMAL, NULL, /* GdkRectangle *area, */ widget, NULL, 0 + 1, 0 + 1, widget->allocation.width - 2, widget->allocation.height - 2 ); } } return FALSE; }