diff --git a/eeshow/gui-over.c b/eeshow/gui-over.c
index 5054b9a..f54a393 100644
--- a/eeshow/gui-over.c
+++ b/eeshow/gui-over.c
@@ -69,13 +69,29 @@ struct overlay {
#define DENSE_SKIP 5
#define DENSE_WIDTH 1
-#define BG_STANDARD { 0.8, 0.9, 1.0, 0.8 }
-#define FG_STANDARD { 0.0, 0.0, 0.0, 1.0 }
-#define FRAME_STANDARD { 0.5, 0.5, 1.0, 0.7 }
+#define BG_STANDARD { 0.8, 0.9, 1.0, 0.8 }
+#define FG_STANDARD { 0.0, 0.0, 0.0, 1.0 }
+#define FRAME_STANDARD { 0.5, 0.5, 1.0, 0.7 }
-#define BG_SELECTED BG_STANDARD
-#define FG_SELECTED FG_STANDARD
-#define FRAME_SELECTED { 0.0, 0.0, 1.0, 0.8 }
+#define BG_SELECTED BG_STANDARD
+#define FG_SELECTED FG_STANDARD
+#define FRAME_SELECTED { 0.0, 0.0, 1.0, 0.8 }
+
+#define BG_DIFF_NEW BG_STANDARD
+#define FG_DIFF_NEW { 0.0, 0.6, 0.0, 1.0 }
+#define FRAME_DIFF_NEW FRAME_STANDARD
+
+#define BG_DIFF_NEW_SELECTED BG_DIFF_NEW
+#define FG_DIFF_NEW_SELECTED FG_DIFF_NEW
+#define FRAME_DIFF_NEW_SELECTED FRAME_SELECTED
+
+#define BG_DIFF_OLD BG_STANDARD
+#define FG_DIFF_OLD { 0.8, 0.0, 0.0, 1.0 }
+#define FRAME_DIFF_OLD FRAME_STANDARD
+
+#define BG_DIFF_OLD_SELECTED BG_DIFF_OLD
+#define FG_DIFF_OLD_SELECTED FG_DIFF_OLD
+#define FRAME_DIFF_OLD_SELECTED FRAME_SELECTED
#define BOX_ATTRS(style) \
@@ -92,22 +108,42 @@ struct overlay {
.fg = FG_##style, \
.frame = FRAME_##style
-#define STANDARD COLOR_ATTRS(STANDARD)
-#define SELECTED COLOR_ATTRS(SELECTED)
+#define STANDARD COLOR_ATTRS(STANDARD)
+#define SELECTED COLOR_ATTRS(SELECTED)
+#define DIFF_NEW COLOR_ATTRS(DIFF_NEW)
+#define DIFF_NEW_SELECTED COLOR_ATTRS(DIFF_NEW_SELECTED)
+#define DIFF_OLD COLOR_ATTRS(DIFF_OLD)
+#define DIFF_OLD_SELECTED COLOR_ATTRS(DIFF_OLD_SELECTED)
struct overlay_style overlay_style_default = {
- .font = "Helvetica 10",
+ .font = NORMAL_FONT,
NORMAL,
STANDARD,
}, overlay_style_dense = {
- .font = "Helvetiva 10",
+ .font = NORMAL_FONT,
DENSE,
STANDARD,
}, overlay_style_dense_selected = {
- .font = "Helvetica Bold 10",
+ .font = BOLD_FONT,
DENSE,
SELECTED,
+}, overlay_style_diff_new = {
+ .font = NORMAL_FONT,
+ NORMAL,
+ DIFF_NEW,
+}, overlay_style_diff_old = {
+ .font = NORMAL_FONT,
+ NORMAL,
+ DIFF_OLD,
+}, overlay_style_dense_diff_new = {
+ .font = BOLD_FONT,
+ DENSE,
+ DIFF_NEW_SELECTED,
+}, overlay_style_dense_diff_old = {
+ .font = BOLD_FONT,
+ DENSE,
+ DIFF_OLD_SELECTED,
};
diff --git a/eeshow/gui-over.h b/eeshow/gui-over.h
index c7c29b9..8b3818a 100644
--- a/eeshow/gui-over.h
+++ b/eeshow/gui-over.h
@@ -39,6 +39,10 @@ struct overlay;
extern struct overlay_style overlay_style_default;
extern struct overlay_style overlay_style_dense;
extern struct overlay_style overlay_style_dense_selected;
+extern struct overlay_style overlay_style_diff_new;
+extern struct overlay_style overlay_style_diff_old;
+extern struct overlay_style overlay_style_dense_diff_new;
+extern struct overlay_style overlay_style_dense_diff_old;
struct overlay *overlay_draw(struct overlay *over, cairo_t *cr, int *x, int *y);
void overlay_draw_all(struct overlay *overlays, cairo_t *cr, int x, int y);
diff --git a/eeshow/gui.c b/eeshow/gui.c
index 04b4d70..68b6a58 100644
--- a/eeshow/gui.c
+++ b/eeshow/gui.c
@@ -84,6 +84,7 @@ struct gui_ctx {
struct gui_sheet *curr_sheet;
/* current sheet */
struct gui_hist *curr_hist;
+ struct gui_hist *last_hist;
};
@@ -251,13 +252,18 @@ static bool go_up_sheet(struct gui_ctx *ctx);
static struct overlay_style style_dense;
static struct overlay_style style_dense_selected;
+static struct overlay_style style_dense_diff_new;
+static struct overlay_style style_dense_diff_old;
static void setup_styles(void)
{
style_dense = overlay_style_dense;
style_dense_selected = overlay_style_dense_selected;
- style_dense.wmax = style_dense_selected.wmax = 400;
+ style_dense_diff_new = overlay_style_diff_new;
+ style_dense_diff_old = overlay_style_diff_old;
+ style_dense.wmax = style_dense_selected.wmax =
+ style_dense_diff_new.wmax = style_dense_diff_old.wmax = 400;
}
@@ -318,18 +324,39 @@ static bool hover_history(void *user, bool on)
}
+static void do_sheet_overlays(struct gui_ctx *ctx);
+
+
+static void go_to_history(struct gui_hist *h)
+{
+ struct gui_ctx *ctx = h->ctx;
+ struct gui_sheet *sheet;
+
+ if (h == ctx->curr_hist) {
+ ctx->last_hist = NULL;
+ do_sheet_overlays(ctx);
+ } else {
+ /*
+ * Look up sheet BEFORE changing history (we need various
+ * items from ctx for this).
+ *
+ * Set sheet AFTER changing history.
+ */
+ sheet = find_corresponding_sheet(ctx, h->sheets);
+ ctx->last_hist = ctx->curr_hist;
+ ctx->curr_hist = h;
+ go_to_sheet(ctx, sheet);
+ }
+}
+
+
static void click_history(void *user)
{
struct gui_hist *h = user;
struct gui_ctx *ctx = h->ctx;
- if (h->sheets && h != ctx->curr_hist) {
- struct gui_sheet *sheet;
-
- sheet = find_corresponding_sheet(ctx, h->sheets);
- ctx->curr_hist = h;
- go_to_sheet(ctx, sheet);
- }
+ if (h->sheets)
+ go_to_history(h);
hide_history(ctx);
}
@@ -344,8 +371,10 @@ static void show_history(struct gui_ctx *ctx)
hover_history, click_history, h);
hover_history(h, 0);
overlay_style(h->history_over,
- h == ctx->curr_hist ? &style_dense_selected :
- &style_dense);
+ h == ctx->curr_hist ?
+ ctx->last_hist ?
+ &style_dense_diff_new : &style_dense_selected :
+ h == ctx->last_hist ? &style_dense_diff_old : &style_dense);
}
redraw(ctx);
}
@@ -393,27 +422,45 @@ static bool show_history_details(void *user, bool on)
}
-static void go_to_sheet(struct gui_ctx *ctx, struct gui_sheet *sheet)
+static void do_sheet_overlays(struct gui_ctx *ctx)
{
struct overlay *over;
- if (!sheet->rendered) {
- render_sheet(sheet);
- mark_aois(ctx, sheet);
- }
- ctx->curr_sheet = sheet;
overlay_remove_all(&ctx->sheet_overlays);
if (ctx->curr_hist) {
ctx->curr_hist->sheet_over = overlay_add(&ctx->sheet_overlays,
&ctx->aois, show_history_details, show_history_cb,
ctx->curr_hist);
+ overlay_style(ctx->curr_hist->sheet_over,
+ &overlay_style_default);
show_history_details(ctx->curr_hist, 0);
}
- if (sheet->sch->title) {
+ if (ctx->last_hist) {
+ ctx->last_hist->sheet_over = overlay_add(&ctx->sheet_overlays,
+ &ctx->aois, show_history_details, show_history_cb,
+ ctx->last_hist);
+ overlay_style(ctx->curr_hist->sheet_over,
+ &overlay_style_diff_new);
+ overlay_style(ctx->last_hist->sheet_over,
+ &overlay_style_diff_old);
+ show_history_details(ctx->last_hist, 0);
+ }
+ if (ctx->curr_sheet->sch->title) {
over = overlay_add(&ctx->sheet_overlays, &ctx->aois,
NULL, close_subsheet, ctx);
- overlay_text(over, "%s", sheet->sch->title);
+ overlay_text(over, "%s", ctx->curr_sheet->sch->title);
}
+}
+
+
+static void go_to_sheet(struct gui_ctx *ctx, struct gui_sheet *sheet)
+{
+ if (!sheet->rendered) {
+ render_sheet(sheet);
+ mark_aois(ctx, sheet);
+ }
+ ctx->curr_sheet = sheet;
+ do_sheet_overlays(ctx);
zoom_to_extents(ctx);
}
@@ -802,6 +849,7 @@ int gui(unsigned n_args, char **args, bool recurse)
.sheet_overlays = NULL,
.hist_overlays = NULL,
.aois = NULL,
+ .last_hist = NULL,
};
get_revisions(&ctx, n_args, args, recurse);