[gitg/vala] Improved visual style and added commit message
- From: Jesse van den Kieboom <jessevdk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gitg/vala] Improved visual style and added commit message
- Date: Wed, 11 Jul 2012 12:06:50 +0000 (UTC)
commit 59643a0d0626eec45d3252f2b5a846d109620074
Author: Jesse van den Kieboom <jesse vandenkieboom epfl ch>
Date: Wed Jul 11 14:04:38 2012 +0200
Improved visual style and added commit message
libgitg-gtk/resources/base.css | 114 ++++++++++++++++++++----
libgitg-gtk/resources/base.html | 58 ++++++++++++
libgitg-gtk/resources/base.js | 186 ++++++++++++++++++++++++++++++++------
3 files changed, 312 insertions(+), 46 deletions(-)
---
diff --git a/libgitg-gtk/resources/base.css b/libgitg-gtk/resources/base.css
index 447acd8..800b6c9 100644
--- a/libgitg-gtk/resources/base.css
+++ b/libgitg-gtk/resources/base.css
@@ -1,36 +1,118 @@
-body {
+body, html {
+ padding: 0;
+ margin: 0;
+}
+
+div#templates {
+ display: none;
}
div#diff {
font-family: monospace;
+ -webkit-tab-size: 4;
}
div#diff div.file div.header {
- border: 1px solid #888a85;
- background: -webkit-gradient(linear, left top, left bottom, from(#eeeeec), to(#d3d7cf));
-
- border-radius: 10px 10px 10px 10px;
+ background: -webkit-gradient(linear, left top, left bottom, from(#729fcf), to(#3465a4));
+ color: #eeeeec;
padding: 5px;
- margin-bottom: 5px;
+ padding-top: 10px;
+ padding-bottom: 10px;
}
div#diff div.file {
- margin-bottom: 30px;
-}
-
-div#diff div.file div.hunk div.header {
- background: -webkit-gradient(linear, left top, left bottom, from(#729fcf), to(#3465a4));
- color: #eeeeec;
- border: 1px solid #204a87;
- border-radius: 5px 5px 5px 5px;
}
div#diff div.file span.old.prefix, div#diff div.file div.line.removed {
- color: #a40000;
+ color: #ffcccc;
}
div#diff div.file span.new.prefix, div#diff div.file div.line.added {
- color: #4e9a06;
+ color: #ccffcc;
+}
+
+div#diff div.hunk {
+ overflow: auto;
+}
+
+div#diff div.hunk table {
+ border-collapse: collapse;
+ width: 100%;
+ border-bottom: 1px solid #d3d7cf;
+}
+
+img.avatar {
+ float: right;
+ border-radius: 10px 10px 10px 10px;
+}
+
+div.commit {
+ padding: 10px;
+ font-family: sans-serif;
+ background: -webkit-gradient(linear, left top, left bottom, from(#eeeeec), to(#d3d7cf));
+}
+
+div.commit table {
+ border-collapse: collapse;
+}
+
+div.commit table td:first-child {
+ font-weight: bold;
+ padding-right: 15px;
+}
+
+div.commit div.message {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+div#diff div.hunk table td {
+ white-space: pre;
+}
+
+span.tab {
+ overflow: hidden;
+ display: inline-block;
+}
+
+div#diff div.hunk table.wrapped td {
+ white-space: pre-wrap;
+}
+
+div#diff div.hunk table tr.added td:last-child {
+ background-color: #ccffcc;
+}
+
+div#diff div.hunk table tr.removed td:last-child {
+ background-color: #ffcccc;
+}
+
+div#diff div.hunk table thead th {
+ background: -webkit-gradient(linear, left top, left bottom, from(#eeeeec), to(#d3d7cf));
+ padding-top: 3px;
+ padding-bottom: 3px;
+}
+
+div#diff div.hunk table thead th.header {
+ text-align: left;
+ padding-left: 5px;
+}
+
+div#diff div.hunk table td {
+ vertical-align: top;
+}
+
+div#diff div.hunk table td.gutter {
+ padding-right: 2px;
+ padding-left: 2px;
+ background-color: #eeeeec;
+ text-align: right;
+ color: #888a85;
+}
+
+div#diff div.hunk table td:nth-child(2) {
+ border-right: 3px solid #d3d7cf;
+ border-left: 1px solid #d3d7cf;
}
/* vi:ts=2:et */
diff --git a/libgitg-gtk/resources/base.html b/libgitg-gtk/resources/base.html
index 9040a42..8a95e37 100644
--- a/libgitg-gtk/resources/base.html
+++ b/libgitg-gtk/resources/base.html
@@ -6,6 +6,64 @@
<script type="text/javascript" src="base.js"></script>
</head>
<body>
+ <div id="templates">
+ <!-- Commit template -->
+ <div class="commit">
+ <img class="avatar"/>
+ <table>
+ <tr>
+ <td>SHA1:</td>
+ <td class="sha1"></td>
+ </tr>
+ <tr>
+ <td>Author:</td>
+ <td class="author"></td>
+ </tr>
+ <tr>
+ <td>Date:</td>
+ <td class="date"></td>
+ </tr>
+ <tr>
+ <td>Subject:</td>
+ <td class="subject"></td>
+ </tr>
+ </table>
+ <div class="message"></div>
+ </div>
+
+ <!-- File template -->
+ <div class="file">
+ <div class="header">
+ <span class="cmd">diff --git</span>
+ <span class="path old"></span>
+ <span class="path new"></span><br/>
+
+ <span class="old prefix">---</span>
+ <span class="path old prefix"></span><br/>
+
+ <span class="new prefix">+++</span>
+ <span class="path new prefix"></span>
+ </div>
+ <div class="hunks">
+ </div>
+ </div>
+
+ <!-- Hunk template -->
+ <div class="hunk">
+ <table class="contents">
+ <colgroup>
+ <col width="0">
+ <col width="0">
+ <col width="100%">
+ </colgroup>
+ <thead>
+ <th>-</th>
+ <th>+</th>
+ <th class="header"></th>
+ </thead>
+ </table>
+ </div>
+ </div>
<div id="diff">
</div>
</body>
diff --git a/libgitg-gtk/resources/base.js b/libgitg-gtk/resources/base.js
index 3932a4b..c6d5dc4 100644
--- a/libgitg-gtk/resources/base.js
+++ b/libgitg-gtk/resources/base.js
@@ -15,72 +15,165 @@ var params = function(query) {
return ret;
}(document.location.search.substring(1));
-var file_template = '<div class="file"><div class="header"><span class="cmd">diff --git</span> <span class="path old">#{this.file.old.path}</span> <span class="path new">#{this.file.new.path}</span><br/><span class="old prefix">---</span> <span class="path old prefix">#{this.file.old.path}</span><br/><span class="new prefix">+++</span> <span class="path new prefix">#{this.file.new.path}</span></div><div class="hunks"></div></div>';
+var settings = {
+ wrap: true,
+ tab_width: 4,
+};
-var hunk_template = '<div class="hunk"><div class="header">@@ -#{this.range.old.start},#{this.range.old.lines} +#{this.range.new.start},#{this.range.new.lines} @@</div><div>';
+if ('settings' in params)
+{
+ settings = $.merge(settings, JSON.parse(params.setttings));
+}
-function run_template(html, context)
+var templates = {};
+
+function create_template(name, bindmap)
{
- var r = /#{([^}]+)}/g;
+ templ = $('#templates').children('.' + name);
- return $(html.replace(r, function (m, p1) {
- var f = function () {
- return eval(p1);
+ if (templ.length != 1)
+ {
+ return;
+ }
+
+ templ = $(templ[0]);
+
+ props = [];
+
+ $.each(bindmap, function (key, callback) {
+ props.push({
+ elements: templ.find(key),
+ callback: callback
+ });
+ });
+
+ templates[name] = {
+ template: templ,
+ props: props,
+ execute: function (context) {
+ $.each(this.props, function (i, val) {
+ $.each(val.elements, function (i, e) {
+ var ee = $(e);
+
+ retval = val.callback.call(context, ee);
+
+ if (typeof(retval) == 'undefined')
+ {
+ return;
+ }
+
+ if (typeof(retval) == 'string')
+ {
+ ee.text(retval);
+ }
+ else if ('text' in retval)
+ {
+ ee.text(retval.text);
+ }
+ else if ('html' in retval)
+ {
+ ee.html(retval.html);
+ }
+ });
+ });
+
+ return this.template.clone();
}
+ };
- return f.call(context);
- }));
+ return templates[name];
+}
+
+function run_template(name, context)
+{
+ return templates[name].execute(context);
}
function diff_file(file)
{
- var f = run_template(file_template, file);
+ var f = run_template('file', file);
for (var i = 0; i < file.hunks.length; ++i)
{
var h = file.hunks[i];
- var ht = run_template(hunk_template, h);
+ var ht = run_template('hunk', h);
+
+ var table = ht.children('table');
+
+ if (settings.wrap)
+ {
+ table.addClass('wrapped');
+ }
+
+ var cold = h.range.old.start;
+ var cnew = h.range.new.start;
for (var j = 0; j < h.lines.length; ++j)
{
var l = h.lines[j];
-
var o = String.fromCharCode(l.type);
- var cls = {
- ' ': 'context',
- '+': 'added',
- '-': 'removed'
- }[o];
+ var oldtd = $('<td/>', {'class': 'gutter'});
+ var newtd = $('<td/>', {'class': 'gutter'});
+
+ var row = $('<tr/>');
- if (o == ' ')
+ switch (o)
{
- o = ' ';
+ case ' ':
+ row.addClass('context');
+
+ oldtd.text(cold);
+ newtd.text(cnew);
+
+ cold++;
+ cnew++;
+ break;
+ case '+':
+ row.addClass('added');
+
+ newtd.text(cnew);
+ cnew++;
+ break;
+ case '-':
+ row.addClass('removed');
+
+ oldtd.text(cold);
+ cold++;
+ break;
}
- var ll = $('<div/>', {'class': 'line ' + cls}).html(o);
- ll.append($('<span/>').text(l.content));
+ var texttd = $('<td/>').text(l.content);
- ht.append(ll);
+ texttd.html(texttd.html().replace(/\t/g, '<span class="tab" style="width: ' + settings.tab_width + 'ex">\t</span>'));
+
+ row.append(oldtd).append(newtd).append(texttd);
+ table.append(row);
}
+
f.append(ht);
}
return f;
}
-function write_diff(res)
+function write_diff(content, res)
{
- var content = $('#diff');
- content.empty();
-
- for (var i = 0; i < res.diff.length; ++i)
+ for (var i = 0; i < res.length; ++i)
{
- content.append(diff_file(res.diff[i]));
+ var df = diff_file(res[i]);
+
+ content.append(df);
}
}
+function write_commit(content, commit)
+{
+ var c = run_template('commit', commit);
+ content.append(c);
+}
+
function update_diff()
{
var r = new XMLHttpRequest();
@@ -88,14 +181,47 @@ function update_diff()
r.onload = function(e) {
j = JSON.parse(r.responseText);
+ var content = $('#diff');
+ content.empty();
+
if ('commit' in j)
{
- console.log(JSON.stringify(j.commit, null, 2));
+ write_commit(content, j.commit);
}
- write_diff(j);
+ write_diff(content, j.diff);
}
r.open("GET", "gitg-internal:/diff/?viewid=" + params.viewid);
r.send();
}
+
+addEventListener('DOMContentLoaded', function () {
+ create_template("file", {
+ '.path.old': function () { return this.file.old.path; },
+ '.path.new': function () { return this.file.new.path; }
+ });
+
+ create_template("hunk", {
+ '.header': function () { return this.header; }
+ });
+
+ create_template("commit", {
+ '.author': function () { return this.author.name + ' <' + this.author.email + '>'; },
+ '.date': function () {
+ var d = new Date();
+ d.setTime(this.author.time * 1000);
+ return {text: d.toLocaleString()};
+ },
+ '.subject': function () { return this.subject; },
+ '.message': function () { return this.message; },
+ '.sha1': function () { return this.id; },
+ '.avatar': function (e) {
+ var h = this.author.email_md5;
+
+ e.attr('src', 'http://www.gravatar.com/avatar/' + h + '?s=80');
+ },
+ });
+}, false);
+
+// vi:ts=4
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]