[gitg] Fix RTL lane rendering



commit 04d7b20e7db97ef262d0246f5a6da6de3c67b3fe
Author: Jesse van den Kieboom <jessevdk gmail com>
Date:   Sat Jan 4 23:14:21 2014 +0100

    Fix RTL lane rendering

 libgitg/gitg-cell-renderer-lanes.vala |  101 +++++++++++++++++++++++++--------
 libgitg/gitg-label-renderer.vala      |   23 +++++++-
 2 files changed, 98 insertions(+), 26 deletions(-)
---
diff --git a/libgitg/gitg-cell-renderer-lanes.vala b/libgitg/gitg-cell-renderer-lanes.vala
index a215375..8783ca7 100644
--- a/libgitg/gitg-cell-renderer-lanes.vala
+++ b/libgitg/gitg-cell-renderer-lanes.vala
@@ -29,6 +29,8 @@ namespace Gitg
 
                private int d_last_height;
 
+               private delegate double DirectionFunc(double i);
+
                private uint num_lanes
                {
                        get { return commit.get_lanes().length(); }
@@ -47,11 +49,9 @@ namespace Gitg
                                              out int        width,
                                              out int        height)
                {
-                       xoffset = 0;
-                       yoffset = 0;
+                       base.get_size(widget, area, out xoffset, out yoffset, out width, out height);
 
-                       width = (int)total_width(widget);
-                       height = area != null ? area.height : 1;
+                       width += (int)total_width(widget);
                }
 
                private void draw_arrow(Cairo.Context context,
@@ -101,6 +101,7 @@ namespace Gitg
                private void draw_paths_real(Cairo.Context context,
                                             Gdk.Rectangle area,
                                             Commit?       commit,
+                                            DirectionFunc f,
                                             double        yoffset)
                {
                        if (commit == null)
@@ -119,8 +120,8 @@ namespace Gitg
 
                                foreach (var from in lane.from)
                                {
-                                       double x1 = area.x + from * cw + cw / 2.0;
-                                       double x2 = area.x + to * cw + cw / 2.0;
+                                       double x1 = area.x + f(from * cw + cw / 2.0);
+                                       double x2 = area.x + f(to * cw + cw / 2.0);
                                        double y1 = area.y + yoffset * ch;
                                        double y2 = area.y + (yoffset + 1) * ch;
                                        double y3 = area.y + (yoffset + 2) * ch;
@@ -135,30 +136,38 @@ namespace Gitg
                }
 
                private void draw_top_paths(Cairo.Context context,
-                                           Gdk.Rectangle area)
+                                           Gdk.Rectangle area,
+                                           DirectionFunc f)
                {
-                       draw_paths_real(context, area, commit, -1);
+                       draw_paths_real(context, area, commit, f, -1);
                }
 
                private void draw_bottom_paths(Cairo.Context context,
-                                              Gdk.Rectangle area)
+                                              Gdk.Rectangle area,
+                                              DirectionFunc f)
                {
-                       draw_paths_real(context, area, next_commit, 1);
+                       draw_paths_real(context, area, next_commit, f, 1);
                }
 
                private void draw_paths(Cairo.Context context,
-                                       Gdk.Rectangle area)
+                                       Gdk.Rectangle area,
+                                       DirectionFunc f)
                {
                        context.set_line_width(2.0);
                        context.set_line_cap(Cairo.LineCap.ROUND);
 
-                       draw_top_paths(context, area);
-                       draw_bottom_paths(context, area);
+                       context.save();
+
+                       draw_top_paths(context, area, f);
+                       draw_bottom_paths(context, area, f);
                        draw_arrows(context, area);
+
+                       context.restore();
                }
 
                private void draw_indicator(Cairo.Context context,
-                                           Gdk.Rectangle area)
+                                           Gdk.Rectangle area,
+                                           DirectionFunc f)
                {
                        double offset;
                        double radius;
@@ -168,7 +177,7 @@ namespace Gitg
 
                        context.set_line_width(2.0);
 
-                       context.arc(area.x + offset + radius,
+                       context.arc(area.x + f(offset + radius),
                                    area.y + area.height / 2.0,
                                    radius,
                                    0,
@@ -187,15 +196,50 @@ namespace Gitg
                }
 
                private void draw_labels(Cairo.Context context,
-                                        Gdk.Rectangle area,
-                                        Gtk.Widget    widget)
+                                        Gtk.Widget    widget,
+                                        Gdk.Rectangle area)
                {
-                       uint offset;
+                       int offset;
+
+                       offset = (int)(num_lanes * lane_width);
 
-                       offset = num_lanes * lane_width;
+                       var rtl = (widget.get_style_context().get_state() & Gtk.StateFlags.DIR_RTL) != 0;
 
+                       if (rtl)
+                       {
+                               offset = -offset;
+                       }
+
+                       context.save();
                        context.translate(offset, 0);
                        LabelRenderer.draw(widget, font_desc, context, labels, area);
+                       context.restore();
+               }
+
+               private void draw_lane(Cairo.Context context,
+                                      Gtk.Widget    widget,
+                                      Gdk.Rectangle area)
+               {
+                       DirectionFunc f;
+
+                       var rtl = (widget.get_style_context().get_state() & Gtk.StateFlags.DIR_RTL) != 0;
+
+                       context.save();
+
+                       if (rtl)
+                       {
+                               context.translate(area.width, 0);
+                               f = (a) => -a;
+                       }
+                       else
+                       {
+                               f = (a) => a;
+                       }
+
+                       draw_paths(context, area, f);
+                       draw_indicator(context, area, f);
+
+                       context.restore();
                }
 
                public override void render(Cairo.Context         context,
@@ -207,6 +251,8 @@ namespace Gitg
                        var ncell_area = cell_area;
                        var narea = area;
 
+                       var rtl = (widget.get_style_context().get_state() & Gtk.StateFlags.DIR_RTL) != 0;
+
                        d_last_height = area.height;
 
                        if (commit != null)
@@ -216,14 +262,21 @@ namespace Gitg
                                Gdk.cairo_rectangle(context, area);
                                context.clip();
 
-                               draw_paths(context, area);
-                               draw_indicator(context, area);
-                               draw_labels(context, area, widget);
+                               draw_lane(context, widget, area);
+                               draw_labels(context, widget, area);
 
                                var tw = total_width(widget);
 
-                               narea.x += (int)tw;
-                               ncell_area.x += (int)tw;
+                               if (!rtl)
+                               {
+                                       narea.x += (int)tw;
+                                       ncell_area.x += (int)tw;
+                               }
+                               else
+                               {
+                                       narea.x -= (int)tw;
+                                       ncell_area.x -= (int)tw;
+                               }
 
                                context.restore();
                        }
diff --git a/libgitg/gitg-label-renderer.vala b/libgitg/gitg-label-renderer.vala
index b37bb26..4ee34f4 100644
--- a/libgitg/gitg-label-renderer.vala
+++ b/libgitg/gitg-label-renderer.vala
@@ -121,6 +121,13 @@ namespace Gitg
                                context.add_class(style_class);
                        }
 
+                       var rtl = (widget.get_style_context().get_state() & Gtk.StateFlags.DIR_RTL) != 0;
+
+                       if (rtl)
+                       {
+                               x -= w + padding * 2;
+                       }
+
                        context.render_background(cr,
                                                  x,
                                                  y + margin,
@@ -148,7 +155,18 @@ namespace Gitg
                                        SList<Ref>            labels,
                                        Gdk.Rectangle         area)
                {
-                       double pos = margin + 0.5;
+                       double pos;
+
+                       var rtl = (widget.get_style_context().get_state() & Gtk.StateFlags.DIR_RTL) != 0;
+
+                       if (!rtl)
+                       {
+                               pos = area.x + margin + 0.5;
+                       }
+                       else
+                       {
+                               pos = area.x + area.width - margin - 0.5;
+                       }
 
                        context.save();
                        context.set_line_width(1.0);
@@ -169,7 +187,8 @@ namespace Gitg
                                                     area.height,
                                                     true);
 
-                               pos += w + padding * 2 + margin;
+                               var o = w + padding * 2 + margin;
+                               pos += rtl ? -o : o;
                        }
 
                        context.restore();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]