Ticket #378: piecesbar_webui.patch

File piecesbar_webui.patch, 6.9 KB (added by James_Kern, 13 years ago)

canvas based piecesbar for web ui

  • deluge/ui/web/js/deluge-all/Keys.js

    diff --git a/deluge/ui/web/js/deluge-all/Keys.js b/deluge/ui/web/js/deluge-all/Keys.js
    index cb74db3..48fd6f5 100644
    a b Deluge.Keys = {  
    6262    Status: [
    6363        'total_done', 'total_payload_download', 'total_uploaded',
    6464        'total_payload_upload', 'next_announce', 'tracker_status', 'num_pieces',
    65         'piece_length', 'is_auto_managed', 'active_time', 'seeding_time',
     65        'piece_length', 'pieces', 'is_auto_managed', 'active_time', 'seeding_time',
    6666        'seed_rank'
    6767    ],
    6868
  • deluge/ui/web/js/deluge-all/details/StatusTab.js

    diff --git a/deluge/ui/web/js/deluge-all/details/StatusTab.js b/deluge/ui/web/js/deluge-all/details/StatusTab.js
    index ba99a2a..d280364 100644
    a b Ext.ns('Deluge.details');  
    3838Deluge.details.StatusTab = Ext.extend(Ext.Panel, {
    3939        title: _('Status'),
    4040        autoScroll: true,
    41        
     41   
    4242        onRender: function(ct, position) {
    4343                Deluge.details.StatusTab.superclass.onRender.call(this, ct, position);
    4444               
    45                 this.progressBar = this.add({
    46                         xtype: 'progress',
    47                         cls: 'x-deluge-status-progressbar'
     45        this.piecesBar = this.add({                   
     46            xtype: 'box',
     47            id: 'piecesbar',
     48            width: '99%',
     49            height: 30,
     50           
     51            style: {
     52                marginRight: '.5%',
     53                marginLeft: '.5%',
     54                marginTop: '7px'
     55            },
     56           
     57            autoEl: {
     58                tag: 'canvas',
     59                height: 30,
     60                width: '99%'
     61            },
     62
     63            colors: {
     64                0: "#a8a8a9",
     65                1: "#22dd00",
     66                2: "#dddd00",
     67                3: "#3258c1",
     68                4: "#cccccc"
     69            },
     70
     71            pieces: null,
     72            fraction: null,
     73            text: null,
     74           
     75            compare_pieces: function(pieces) {
     76                if (!this.pieces || pieces.length != this.pieces.length) {
     77                    return false;
     78                }
     79   
     80                for (var i = 0; i < pieces.length; i++) {
     81                    if (pieces[i] != this.pieces[i]) {
     82                        return false;
     83                    }
     84                }
     85                return true;
     86            },
     87
     88            roundcorners_clipping: function(ctx) {
     89                this.create_roundcorners_subpath(ctx, 0.0, 0.0, this.getWidth(), this.getHeight());
     90                ctx.clip();
     91            },
     92
     93            roundcorners_border: function(ctx) {
     94                this.create_roundcorners_subpath(ctx, 0.5, 0.5, this.getWidth()-1, this.getHeight()-1);
     95                ctx.strokeStyle = "rgba(0,0,0,0.9)";
     96                ctx.stroke();
     97            },
     98
     99            create_roundcorners_subpath: function(ctx, x, y, width, height) {
     100                var aspect = 1.0;
     101                var corner_radius = height/10.0;
     102                var radius = corner_radius/aspect;
     103                var degrees = Math.PI/180.0;
     104                ctx.beginPath();
     105                ctx.arc(x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees);
     106                ctx.arc(x + width - radius, y + height - radius, radius, 0 * degrees, 90 * degrees);
     107                ctx.arc(x + radius, y + height - radius, radius, 90 * degrees, 180 * degrees);
     108                ctx.arc(x + radius, y + radius, radius, 180 * degrees, 270 * degrees);
     109                ctx.closePath();
     110               
     111            },
     112
     113            draw_progress_overlay: function(ctx, fraction) {
     114                if (fraction == 0) {
     115                    return;
     116                }
     117               
     118                var overlay_width = this.getWidth()*fraction;
     119                var gradient = ctx.createLinearGradient(0, this.getHeight()/2, overlay_width, this.getHeight()/2);
     120                gradient.addColorStop(0, "rgba(0,0,0,0.4)");
     121               
     122                var stop = 20/overlay_width;
     123                gradient.addColorStop(1-stop, "rgba(0,0,0,0.4)");
     124
     125                if (fraction != 1.0) {
     126                    gradient.addColorStop(1, "rgba(0,0,0,0.0)");
     127                }
     128                ctx.fillStyle = gradient;
     129                ctx.fillRect(0, 0, overlay_width, this.getHeight());
     130            },
     131
     132            write_text: function(ctx, text) {
     133                ctx.textAlign = "center";
     134                ctx.font = "bold 13px sans-serif";
     135                ctx.fillStyle = "rgba(255,255,255,1)";
     136                ctx.fillText(text, Math.floor(this.getWidth()/2), this.getHeight()/2 + 4);
     137            },
     138
     139            draw_pieces: function(ctx, pieces) {
     140                var piece_width = (1/pieces.length) * (this.getWidth() - 2);
     141                var start_pos = 1;
     142                for (var i = 0; i < pieces.length; i++) {
     143                    ctx.fillStyle = this.colors[pieces[i]];
     144                    ctx.fillRect(start_pos, 1, piece_width, this.getHeight() - 2);
     145                    start_pos += piece_width;
     146                }   
     147            },
     148
     149            update: function(pieces, fraction, text) {
     150                if (!this.compare_pieces(pieces) && typeof(pieces) != "number"
     151                    || this.fraction != fraction || this.text != text) {
     152               
     153                    var canvas = document.getElementById("piecesbar");
     154                    var ctx = canvas.getContext("2d");
     155                    canvas.width = this.getWidth();
     156               
     157                    this.roundcorners_clipping(ctx);
     158                   
     159                    this.pieces = pieces;
     160                    this.fraction = fraction;
     161                    this.text = text;
     162                   
     163                    this.draw_pieces(ctx, pieces);
     164                    this.draw_progress_overlay(ctx, fraction);
     165                    this.write_text(ctx, text);
     166                   
     167                    this.roundcorners_border(ctx);
     168                }
     169            }
     170
    48171                });
    49172               
    50173                this.status = this.add({
    Deluge.details.StatusTab = Ext.extend(Ext.Panel, {  
    69192        },
    70193       
    71194        clear: function() {
    72                 this.progressBar.updateProgress(0, ' ');
     195                this.piecesBar.update([4], 0, ' ');
    73196                for (var k in this.fields) {
    74197                        this.fields[k].innerHTML = '';
    75198                }
    Deluge.details.StatusTab = Ext.extend(Ext.Panel, {  
    120243                        this.fields[field].innerHTML = data[field];
    121244                }
    122245                var text = status.state + ' ' + status.progress.toFixed(2) + '%';
    123                 this.progressBar.updateProgress(status.progress / 100.0, text);
     246
     247        if (parseInt(status.num_pieces) != status.pieces.length) {
     248            pieces = Array(parseInt(status.num_pieces));
     249            for (var i=0; i<pieces.length; i++) {
     250                pieces[i] = 3;
     251            }
     252            this.piecesBar.update(pieces, 1.0, text);
     253        }
     254        else {
     255            this.piecesBar.update(status.pieces, status.progress / 100.0, text);
     256        }
     257
     258               
    124259        }
    125260});