[gitg] Fix RTL lane rendering
- From: Jesse van den Kieboom <jessevdk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gitg] Fix RTL lane rendering
- Date: Sat, 4 Jan 2014 22:15:32 +0000 (UTC)
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]