I decided to open source a decade-old project I worked on during co-op work terms at University of Guelph. <OpenTag>Presenter is a desktop app that displays presentations using customizable modules. Extra features you won’t find outside Microsoft PowerPoint include embedded LaTeX and Z notation. I built this under guidance of a computer science prof so features focus on requirements for his undergrad lectures.

The app should work in Windows, OS X, and common Linux distributions. Unfortunately it requires ancient builds of Python 2 and Qt 3. QCanvas* classes became deprecated in Qt 4 and Qt3 support classes don’t exist in the latest PyQt distributions. I began porting the codebase from Python 2.2.2 to 3.0 and Qt3 to Qt4 but after two days concluded this was a comprehensive undertaking with little payoff.

The app has no editor implementation. You assemble presentation slides as an XML document along with support files in the same folder. This is similar to constructing a web page. To get a better idea, examples included in the project along with documentation and a post-mortem written by my 21 year old self.

Potential Features

  • Port codebase to Python 3 and Qt 4.
  • Add build process to package as an executable.
  • Change renderer to use QtWebKit rather than the primitive custom solution.
  • Add vector graphics
  • get z=”” property working so vector graphics can be placed on top of each other.
  • get coords=”x, y” working for every object
  • (font.py).font.resize(), find a way to easily scale a block of text for vector graphics/canvas.
  • “Select Mode” to move items on the canvas.
  • Option to reverse back to the default configuration.
  • Export a presentation to a series of images (one image per slide).
  • gradients for background. Fade from light to dark, compute on slide load.
  • Rewrite config code so current settings aren’t hardcoded.
  • Rewrite config GUI code so custom tags can add new config GUI tabs.
  • Add <style> tag built into the parser. Can be disabled from config window.

Known Issues

  • Anti-alias images when they’re scaled down.
  • Make the mouse cursor disappear if it’s still in the display for X number of seconds and reappear once the mouse is moved again or the slide is switched (i.e., the “loading” cursor is shown). I don’t think this can be implemented in Qt 2.* since QCanvasView.contentsMouseMoveEvent() is only being called when one of my mouse buttons is pushed. I have to check if the behaviour is the same for Qt 3.*
  • New thread to create <equation> images (allowing browsing of the slides before the images are loaded).
  • New thread for animating objects into a slide.
  • New thread for doing slide transitions.
  • For generate HTML action, display progress animation.
  • Show exception stack trace in a dialog window when a syntax error occurs in a tag definition. At the moment it only prints it in the shell window with a minimal dialog popup.
  • Change getHtml() for some tags so proper font colours are shown… <table>, <td>, etc. i.e., </td><td color=”black”>like my soul</td> won’t display the text as black in HTML since the color property isn’t being carried over.
  • Redo ZSchema getHtml() so the tables look the exact same as in the app.
  • For LaTeX equations, baseline alignment (<equation>j</equation> and <equation<d</equation> should vertically align properly)
  • Multiple key bindings (support modifiers like SHIFT and CTRL)
  • Figure out what causes crashing on refresh that occurring in examples/tag_test/tag_test.xml
  • Fix using <p> inside a <bullet>
  • Fix <u> code so underline is guaranteed to be shown below the text (I think alignPrevious() isn’t realigning the underlines?)
  • Make underlining work for <title>
  • Make underlines thicker when there’s a larger font size
  • Remove limitation where tags higher up the document/display must be animated into the GUI before the lower ones. Maybe a priority=”” property?
  • Keep object shown/hidden property when changing between full screen.
  • align=”” for <table>
  • Fix PresentationObject.getMaxWidth()
  • Case-insensitive parser looks for the proper Python class (doesn’t have to match the case of the filename). Use dir() to find the class constructor.
  • Convert all string handling to Unicode from ISO 8859-1
  • Rewrite table border/bgcolor code to make it faster/contain less Qt objects.