index 74cf0abf77d4737709dfec651c37d670b49e4b69..1716a7cd65be1257a3e3b7fd559fb5d908dc1de0 100644 (file)
void eek_preview_set_color( EekPreview* preview, int r, int g, int b )
{
- preview->_r = r;
- preview->_g = g;
- preview->_b = b;
+ if ( (preview->_r = r)
+ || (preview->_g = g)
+ || (preview->_b = b) ) {
+ preview->_r = r;
+ preview->_g = g;
+ preview->_b = b;
+
+ gtk_widget_queue_draw(GTK_WIDGET(preview));
+ }
}
return preview_type;
}
+static guint trackCount = 0;
+static guint* trackSizes = 0;
+static GtkIconSize* trackKeys = 0;
+
+void eek_preview_set_size_mappings( guint count, GtkIconSize const* sizes )
+{
+ gint width = 0;
+ gint height = 0;
+ gint smallest = 512;
+ gint largest = 0;
+ guint i = 0;
+ guint delta = 0;
+
+ for ( i = 0; i < count; ++i ) {
+ gboolean worked = gtk_icon_size_lookup( sizes[i], &width, &height );
+ if ( worked ) {
+ if ( width < smallest ) {
+ smallest = width;
+ }
+ if ( width > largest ) {
+ largest = width;
+ }
+ }
+ }
+
+ smallest = (smallest * 3) / 4;
+
+ delta = largest - smallest;
+
+ if ( trackSizes ) {
+ g_free(trackSizes);
+ trackSizes = 0;
+ }
+ if ( trackKeys ) {
+ g_free(trackKeys);
+ trackKeys = 0;
+ }
+
+ trackCount = count;
+ trackSizes = g_new(guint, count);
+ trackKeys = g_new(GtkIconSize, count);
+ for ( i = 0; i < count; ++i ) {
+ guint val = smallest + ( (i * delta) / (count-1) );
+ trackKeys[i] = sizes[i];
+ trackSizes[i] = val;
+ }
+}
+
GtkWidget* eek_preview_area_new(void)
{
return NULL;
gint width = 0;
gint height = 0;
EekPreview* preview = EEK_PREVIEW(widget);
- gboolean worked = gtk_icon_size_lookup( preview->_size, &width, &height );
- if ( !worked ) {
- width = 16;
- height = 16;
+ gboolean tracked = TRUE;
+ guint i = 0;
+
+ for ( i = 0; i < trackCount; ++i ) {
+ tracked = (trackKeys[i] == preview->_size);
+ if ( tracked ) {
+ width = trackSizes[i];
+ height = width;
+ break;
+ }
+ }
+
+ if ( !tracked ) {
+ gboolean worked = gtk_icon_size_lookup( preview->_size, &width, &height );
+ if ( !worked ) {
+ width = 16;
+ height = 16;
+ g_warning("Size not found [%d]", preview->_size);
+ }
}
if ( preview->_view == VIEW_TYPE_LIST ) {
width *= 3;
gint insetX = 0;
gint insetY = 0;
+ (void)event;
/*
gint lower = widget->allocation.width;
lower = (widget->allocation.height < lower) ? widget->allocation.height : lower;
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,
@@ -265,12 +409,16 @@ static gboolean eek_preview_button_release_cb( GtkWidget* widget, GdkEventButton
gboolean eek_preview_key_press_event( GtkWidget* widget, GdkEventKey* event)
{
+ (void)widget;
+ (void)event;
g_message("TICK");
return FALSE;
}
gboolean eek_preview_key_release_event( GtkWidget* widget, GdkEventKey* event)
{
+ (void)widget;
+ (void)event;
g_message("tock");
return FALSE;
}
);
}
+void eek_preview_set_linked( EekPreview* splat, LinkType link )
+{
+ link = (LinkType)(link & PREVIEW_LINK_ALL);
+ if ( link != (LinkType)splat->_linked ) {
+ splat->_linked = link;
+
+ gtk_widget_queue_draw( GTK_WIDGET(splat) );
+ }
+}
+
+LinkType eek_preview_get_linked( EekPreview* splat )
+{
+ return (LinkType)splat->_linked;
+}
+
gboolean eek_preview_get_focus_on_click( EekPreview* preview )
{
return preview->_takesFocus;