summaryrefslogtreecommitdiff
path: root/src/gui/panels
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-09-11 21:57:53 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-09-11 21:57:53 (GMT)
commitce8c1719963657aeaf963650183e46979cab0d68 (patch)
tree389d1d40912a20006de3bcfc5158d57a2269fb90 /src/gui/panels
parentd1dd9ae74ba56b04ad8f79d926b2282c6c7fa0fd (diff)
Displayed a default picture when no panel overview is available.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@403 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gui/panels')
-rw-r--r--src/gui/panels/glance.c119
1 files changed, 103 insertions, 16 deletions
diff --git a/src/gui/panels/glance.c b/src/gui/panels/glance.c
index 89acf5c..0cb190a 100644
--- a/src/gui/panels/glance.c
+++ b/src/gui/panels/glance.c
@@ -65,6 +65,10 @@ struct _GGlancePanelClass
{
GPanelItemClass parent; /* A laisser en premier */
+ GtkIconInfo *no_image_32; /* Pas d'aperçu en 32x32 */
+ GtkIconInfo *no_image_64; /* Pas d'aperçu en 64x64 */
+ GtkIconInfo *no_image_128; /* Pas d'aperçu en 128x128 */
+
};
@@ -136,6 +140,7 @@ static void g_glance_panel_class_init(GGlancePanelClass *klass)
{
GObjectClass *object; /* Autre version de la classe */
GEditorItemClass *editem; /* Encore une autre vision... */
+ GtkIconTheme *theme; /* Thème GTK offrant des icones*/
object = G_OBJECT_CLASS(klass);
@@ -147,6 +152,12 @@ static void g_glance_panel_class_init(GGlancePanelClass *klass)
editem->update_view = (update_item_view_fc)update_glance_panel_for_view;
editem->update_content = (update_item_view_fc)update_glance_panel_for_view_content;
+ theme = gtk_icon_theme_get_default();
+
+ klass->no_image_32 = gtk_icon_theme_lookup_icon(theme, "image-missing", 32, GTK_ICON_LOOKUP_FORCE_SIZE);
+ klass->no_image_64 = gtk_icon_theme_lookup_icon(theme, "image-missing", 64, GTK_ICON_LOOKUP_FORCE_SIZE);
+ klass->no_image_128 = gtk_icon_theme_lookup_icon(theme, "image-missing", 128, GTK_ICON_LOOKUP_FORCE_SIZE);
+
}
@@ -179,8 +190,6 @@ static void g_glance_panel_init(GGlancePanel *panel)
gtk_container_add(GTK_CONTAINER(base->widget), area);
gtk_widget_show(base->widget);
- gtk_widget_set_size_request(base->widget, 300, 300);
-
g_signal_connect(G_OBJECT(area), "draw",
G_CALLBACK(redraw_glance_area), panel);
g_signal_connect(G_OBJECT(area), "size-allocate",
@@ -349,7 +358,12 @@ 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;
@@ -393,12 +407,12 @@ static void on_view_scroll_setup(GtkAdjustment *adj, GGlancePanel *panel)
if (gtk_adjustment_get_page_size(hadj) == 0 || gtk_adjustment_get_page_size(vadj) == 0)
return;
+ gtk_widget_get_preferred_size(GTK_WIDGET(panel->view), NULL, &panel->req);
+
compute_glance_scale(panel);
on_view_scrolled(adj, panel);
- gtk_widget_get_preferred_size(GTK_WIDGET(panel->view), NULL, &panel->req);
-
update_glance_panel_for_view_content(panel, panel->view);
}
@@ -478,7 +492,7 @@ 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 */
+ //gint border; /* Taille de la bordure */
double sx; /* Echelle sur l'axe X */
double sy; /* Echelle sur l'axe Y */
@@ -505,6 +519,14 @@ static void compute_glance_scale(GGlancePanel *panel)
sx = (1.0 * available.width) / panel->req.width;
sy = (1.0 * available.height) / panel->req.height;
+
+ printf(" -- avail :: (%d ; %d)\n", available.width, available.height);
+
+ printf(" -- req :: (%d ; %d)\n", panel->req.width, panel->req.height);
+
+ printf(" -- ratio >> (%g ; %g)\n", sx, sy);
+
+
if (sx < sy)
{
panel->scale = sx;
@@ -585,21 +607,78 @@ static void update_glance_panel_for_view_content(GGlancePanel *panel, GtkViewPan
static gboolean redraw_glance_area(GtkWidget *widget, cairo_t *cr, GGlancePanel *panel)
{
- GtkAllocation available; /* Surface disponible totale */
- cairo_t *cairo; /* Gestionnaire de rendu */
-#if 0
- /* Dessin de la bordure */
+ GtkAllocation alloc; /* Surface disponible totale */
+ GdkWindow *window; /* Fenêtre à redessiner */
+ GtkStyleContext *context; /* Contexte du thème actuel */
+ gint size; /* Taille d'icone à dessiner */
+ GtkIconInfo *no_image; /* Pas d'aperçu en XxX */
+ cairo_surface_t *icon; /* Eventuelle icone à dessiner */
- gtk_widget_get_allocation(widget, &available);
+ gtk_widget_get_allocation(widget, &alloc);
- gtk_paint_box(widget->style, event->window, widget->state,
- GTK_SHADOW_IN, &event->area, NULL, NULL,
- 0, 0, available.width, available.height);
+ window = gtk_widget_get_window(widget);
- /* Dessin de l'aperçu */
+ cairo_save(cr);
+ gtk_cairo_transform_to_window(cr, widget, window);
- if (panel->cache != NULL)
+ context = gtk_widget_get_style_context(widget);
+ gtk_style_context_save(context);
+
+ /* S'il n'existe pas d'aperçu actuellement... */
+ if (panel->cache == NULL)
+ {
+ gtk_style_context_add_class(context, GTK_STYLE_CLASS_VIEW);
+ gtk_render_background(context, cr, alloc.x, alloc.y, alloc.width, alloc.height);
+ gtk_style_context_restore(context);
+
+ gtk_style_context_save(context);
+ gtk_style_context_add_class(context, GTK_STYLE_CLASS_FRAME);
+ gtk_render_frame(context, cr, alloc.x, alloc.y, alloc.width, alloc.height);
+
+ /* Choix de l'image par défaut */
+
+ if (alloc.width > 128 && alloc.height > 128)
+ {
+ size = 128;
+ no_image = G_GLANCE_PANEL_GET_CLASS(panel)->no_image_128;
+ }
+ else if (alloc.width > 64 && alloc.height > 64)
+ {
+ size = 64;
+ no_image = G_GLANCE_PANEL_GET_CLASS(panel)->no_image_64;
+ }
+ else if (alloc.width > 32 && alloc.height > 32)
+ {
+ size = 32;
+ no_image = G_GLANCE_PANEL_GET_CLASS(panel)->no_image_32;
+ }
+ else
+ no_image = NULL;
+
+ /* Dessin de cette image */
+ if (no_image != NULL)
+ {
+ icon = gtk_icon_info_load_surface(no_image, window, NULL);
+
+ gtk_render_icon_surface(context, cr, icon,
+ (alloc.width - size) / 2,
+ (alloc.height - size) / 2);
+
+ cairo_surface_destroy(icon);
+
+ }
+
+ }
+
+ /* Si on dispose de graphique à représenter... */
+ else
{
+
+ /* TODO ... */
+
+
+#if 0
+
cairo = gdk_cairo_create(widget->window);
cairo_rectangle(cairo, panel->visible.x, panel->visible.y,
@@ -621,8 +700,16 @@ static gboolean redraw_glance_area(GtkWidget *widget, cairo_t *cr, GGlancePanel
cairo_destroy(cairo);
- }
#endif
+
+
+
+ }
+
+ gtk_style_context_restore(context);
+
+ cairo_restore(cr);
+
return TRUE;
}