{
 "metadata": {
  "name": "Progress Bars"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Two Examples of Progress Bars"
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "A Javascript Progress Bar"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Here is a simple progress bar using HTML/Javascript:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import uuid\n",
      "import time\n",
      "from IPython.display import HTML, Javascript, display\n",
      "\n",
      "divid = str(uuid.uuid4())\n",
      "\n",
      "pb = HTML(\n",
      "\"\"\"\n",
      "<div style=\"border: 1px solid black; width:500px\">\n",
      "  <div id=\"%s\" style=\"background-color:blue; width:0%%\">&nbsp;</div>\n",
      "</div> \n",
      "\"\"\" % divid)\n",
      "display(pb)\n",
      "for i in range(1,101):\n",
      "    time.sleep(0.1)\n",
      "    \n",
      "    display(Javascript(\"$('div#%s').width('%i%%')\" % (divid, i)))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The above simply makes a div that is a box, and a blue div inside it with a unique ID \n",
      "(so that the javascript won't collide with other similar progress bars on the same page).  \n",
      "\n",
      "Then, at every progress point, we run a simple jQuery call to resize the blue box to\n",
      "the appropriate fraction of the width of its containing box, and voil\u00e0 a nice\n",
      "HTML/Javascript progress bar!"
     ]
    },
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "ProgressBar class"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "And finally, here is a progress bar *class* extracted from [PyMC](http://code.google.com/p/pymc/), which will work in regular Python as well as in the IPython Notebook"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": true,
     "input": [
      "from __future__ import print_function\n",
      "import sys, time\n",
      "\n",
      "class ProgressBar:\n",
      "    def __init__(self, iterations):\n",
      "        self.iterations = iterations\n",
      "        self.prog_bar = '[]'\n",
      "        self.fill_char = '*'\n",
      "        self.width = 50\n",
      "        self.__update_amount(0)\n",
      "\n",
      "    def animate(self, iter):\n",
      "        print('\\r', self, end='')\n",
      "        sys.stdout.flush()\n",
      "        self.update_iteration(iter + 1)\n",
      "\n",
      "    def update_iteration(self, elapsed_iter):\n",
      "        self.__update_amount((elapsed_iter / float(self.iterations)) * 100.0)\n",
      "        self.prog_bar += '  %d of %s complete' % (elapsed_iter, self.iterations)\n",
      "\n",
      "    def __update_amount(self, new_amount):\n",
      "        percent_done = int(round((new_amount / 100.0) * 100.0))\n",
      "        all_full = self.width - 2\n",
      "        num_hashes = int(round((percent_done / 100.0) * all_full))\n",
      "        self.prog_bar = '[' + self.fill_char * num_hashes + ' ' * (all_full - num_hashes) + ']'\n",
      "        pct_place = (len(self.prog_bar) // 2) - len(str(percent_done))\n",
      "        pct_string = '%d%%' % percent_done\n",
      "        self.prog_bar = self.prog_bar[0:pct_place] + \\\n",
      "            (pct_string + self.prog_bar[pct_place + len(pct_string):])\n",
      "\n",
      "    def __str__(self):\n",
      "        return str(self.prog_bar)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 3
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "p = ProgressBar(1000)\n",
      "for i in range(1001):\n",
      "    time.sleep(0.002)\n",
      "    p.animate(i)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 4
    }
   ],
   "metadata": {}
  }
 ]
}