summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/panels/glance.c142
1 files changed, 65 insertions, 77 deletions
diff --git a/src/gui/panels/glance.c b/src/gui/panels/glance.c
index 0cb190a..306281a 100644
--- a/src/gui/panels/glance.c
+++ b/src/gui/panels/glance.c
@@ -44,13 +44,10 @@ struct _GGlancePanel
double scale; /* Ratio de réduction */
cairo_surface_t *cache; /* Cache grandeur nature */
+ GtkAllocation frame; /* Représentation du cadre */
GtkAllocation painting; /* Zone réservée pour l'aperçu */
GtkAllocation visible; /* Sous-partie visible */
- double red; /* Conversion Gdk -> Cairo #1 */
- double green; /* Conversion Gdk -> Cairo #2 */
- double blue; /* Conversion Gdk -> Cairo #3 */
-
gdouble start_x; /* Abscisse du point de souris */
gdouble start_y; /* Ordonnée du point de souris */
bool valid; /* Point de départ visible ? */
@@ -72,6 +69,9 @@ struct _GGlancePanelClass
};
+/* Espace entre le cadre et l'aperçu */
+#define GLANCE_BORDER 3
+
/* Initialise la classe des panneaux d'aperçu rapide. */
static void g_glance_panel_class_init(GGlancePanelClass *);
@@ -85,9 +85,6 @@ static void g_glance_panel_dispose(GGlancePanel *);
/* Procède à la libération totale de la mémoire. */
static void g_glance_panel_finalize(GGlancePanel *);
-/* Définit une fois et au bon moment le fond de l'aperçu rapide. */
-static void define_glance_bg(GtkWidget *, GGlancePanel *);
-
/* Lance une actualisation du fait d'un changement de support. */
static void update_glance_panel_for_view(GGlancePanel *, GtkViewPanel *);
@@ -183,7 +180,6 @@ static void g_glance_panel_init(GGlancePanel *panel)
base->name = _("Glance");
area = gtk_drawing_area_new();
- g_signal_connect(G_OBJECT(area), "realize", G_CALLBACK(define_glance_bg), panel);
gtk_widget_show(area);
base->widget = gtk_event_box_new();
@@ -274,32 +270,6 @@ GEditorItem *g_glance_panel_new(GObject *ref)
/******************************************************************************
* *
-* Paramètres : widget = composant GTK en préparation. *
-* panel = informations liées au panneau associé. *
-* *
-* Description : Définit une fois et au bon moment le fond de l'aperçu rapide.*
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void define_glance_bg(GtkWidget *widget, GGlancePanel *panel)
-{
- /*
- gtk_widget_modify_bg(widget, GTK_STATE_NORMAL,
- &widget->style->mid[GTK_STATE_NORMAL]);
-
- panel->red = widget->style->mid[GTK_STATE_NORMAL].red / USHRT_MAX;
- panel->green = widget->style->mid[GTK_STATE_NORMAL].green / USHRT_MAX;
- panel->blue = widget->style->mid[GTK_STATE_NORMAL].blue / USHRT_MAX;
- */
-}
-
-
-/******************************************************************************
-* *
* Paramètres : ref = espace de référencement global. *
* *
* Description : Construit et intègre un panneau d'affichage des symboles. *
@@ -362,8 +332,8 @@ static void update_glance_panel_for_view(GGlancePanel *panel, GtkViewPanel *view
* Pour le détail de la hiérarchie, se retourner vers les commentaires
* de la fonction mcb_view_change_support().
*/
+
parent = gtk_widget_get_parent(GTK_WIDGET(view));
- parent = gtk_widget_get_parent(parent);
if (!GTK_IS_SCROLLED_WINDOW(parent)) return;
panel->view = view;
@@ -492,56 +462,61 @@ static void on_glance_resize(GtkWidget *widget, GdkRectangle *allocation, GGlanc
static void compute_glance_scale(GGlancePanel *panel)
{
GtkAllocation available; /* Surface disponible totale */
- //gint border; /* Taille de la bordure */
+ GtkAllocation granted; /* Surface totale accordée */
double sx; /* Echelle sur l'axe X */
double sy; /* Echelle sur l'axe Y */
/* Superficies niveau GTK... */
gtk_widget_get_allocation(G_EDITOR_ITEM(panel)->widget, &available);
- /*
- border = MIN(2, G_EDITOR_ITEM(panel)->widget->style->xthickness);
- if (border > 0)
- {
- available.x = border;
- available.width -= 2 * border;
- }
- border = MIN(2, G_EDITOR_ITEM(panel)->widget->style->ythickness);
- if (border > 0)
- {
- available.y = border;
- available.height -= 2 * border;
- }
- */
/* Calcul des ratios et emplacements */
- sx = (1.0 * available.width) / panel->req.width;
- sy = (1.0 * available.height) / panel->req.height;
-
+ granted = available;
- printf(" -- avail :: (%d ; %d)\n", available.width, available.height);
+ if (available.width > 2 * GLANCE_BORDER)
+ granted.width = available.width - 2 * GLANCE_BORDER;
+ else
+ granted.width = 0;
- printf(" -- req :: (%d ; %d)\n", panel->req.width, panel->req.height);
+ if (available.height > 2 * GLANCE_BORDER)
+ granted.height = available.height - 2 * GLANCE_BORDER;
+ else
+ granted.height = 0;
- printf(" -- ratio >> (%g ; %g)\n", sx, sy);
+ sx = (1.0 * granted.width) / panel->req.width;
+ sy = (1.0 * granted.height) / panel->req.height;
+ /* Calcul des dimensions internes */
if (sx < sy)
{
panel->scale = sx;
- panel->painting.width = available.width;
- panel->painting.height = panel->req.height * panel->scale;
+ panel->frame.width = available.width;
+ panel->frame.height = panel->req.height * panel->scale;
}
else
{
panel->scale = sy;
- panel->painting.width = panel->req.width * panel->scale;
- panel->painting.height = available.height;
+ panel->frame.width = panel->req.width * panel->scale;
+ panel->frame.height = available.height;
}
- panel->painting.x = available.x + (available.width - panel->painting.width) / 2;
- panel->painting.y = available.y + (available.height - panel->painting.height) / 2;
+ panel->frame.x = (available.width - panel->frame.width) / 2;
+ panel->frame.y = (available.height - panel->frame.height) / 2;
+
+ panel->painting.x = panel->frame.x + GLANCE_BORDER;
+ panel->painting.y = panel->frame.y + GLANCE_BORDER;
+
+ if (panel->frame.width > 2 * GLANCE_BORDER)
+ panel->painting.width = panel->frame.width - 2 * GLANCE_BORDER;
+ else
+ panel->painting.width = 0;
+
+ if (panel->frame.height > 2 * GLANCE_BORDER)
+ panel->painting.height = panel->frame.height - 2 * GLANCE_BORDER;
+ else
+ panel->painting.height = 0;
}
@@ -656,6 +631,7 @@ static gboolean redraw_glance_area(GtkWidget *widget, cairo_t *cr, GGlancePanel
no_image = NULL;
/* Dessin de cette image */
+
if (no_image != NULL)
{
icon = gtk_icon_info_load_surface(no_image, window, NULL);
@@ -673,36 +649,48 @@ static gboolean redraw_glance_area(GtkWidget *widget, cairo_t *cr, GGlancePanel
/* Si on dispose de graphique à représenter... */
else
{
+ /* Dessin d'un fond */
- /* TODO ... */
+ gtk_style_context_save(context);
+ gtk_style_context_add_class(context, GTK_STYLE_CLASS_VIEW);
+ gtk_render_background(context, cr,
+ panel->frame.x, panel->frame.y,
+ panel->frame.width, panel->frame.height);
-#if 0
+ gtk_style_context_restore(context);
- cairo = gdk_cairo_create(widget->window);
+ /* Dessin d'un cadre */
- cairo_rectangle(cairo, panel->visible.x, panel->visible.y,
- panel->visible.width, panel->visible.height);
+ gtk_style_context_save(context);
+ gtk_style_context_add_class(context, GTK_STYLE_CLASS_FRAME);
- cairo_clip(cairo);
+ gtk_render_frame(context, cr,
+ panel->frame.x, panel->frame.y,
+ panel->frame.width, panel->frame.height);
- cairo_set_source_rgb(cairo, 1.0, 1.0, 1.0);
+ gtk_style_context_restore(context);
- cairo_rectangle(cairo, panel->painting.x, panel->painting.y,
- panel->painting.width, panel->painting.height);
+ /* Partie visible */
- cairo_fill(cairo);
+ cairo_rectangle(cr, panel->visible.x, panel->visible.y,
+ panel->visible.width, panel->visible.height);
- cairo_reset_clip(cairo);
+ cairo_clip(cr);
- cairo_set_source_surface(cairo, panel->cache, panel->painting.x, panel->painting.y);
- cairo_paint(cairo);
+ cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
+
+ cairo_rectangle(cr, panel->painting.x, panel->painting.y,
+ panel->painting.width, panel->painting.height);
- cairo_destroy(cairo);
+ cairo_fill(cr);
-#endif
+ cairo_reset_clip(cr);
+ /* Aperçu mignature */
+ cairo_set_source_surface(cr, panel->cache, panel->painting.x, panel->painting.y);
+ cairo_paint(cr);
}