Code

Fixing preview/swatch sizes.
[inkscape.git] / src / dialogs / eek-preview.cpp
index 74cf0abf77d4737709dfec651c37d670b49e4b69..1716a7cd65be1257a3e3b7fd559fb5d908dc1de0 100644 (file)
@@ -53,9 +53,15 @@ static GtkWidgetClass* parent_class = 0;
 
 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));
+    }
 }
 
 
@@ -84,6 +90,54 @@ GType eek_preview_get_type(void)
     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;
@@ -94,10 +148,25 @@ static void eek_preview_size_request( GtkWidget* widget, GtkRequisition* req )
     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;
@@ -122,6 +191,7 @@ gboolean eek_preview_expose_event( GtkWidget* widget, GdkEventExpose* event )
     gint insetX = 0;
     gint insetY = 0;
 
+    (void)event;
 /*
     gint lower = widget->allocation.width;
     lower = (widget->allocation.height < lower) ? widget->allocation.height : lower;
@@ -171,6 +241,80 @@ gboolean eek_preview_expose_event( GtkWidget* widget, GdkEventExpose* event )
                             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;
 }
@@ -424,6 +572,21 @@ static void eek_preview_class_init( EekPreviewClass *klass )
         );
 }
 
+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;