<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:html="http://www.w3.org/1999/html" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Ross Burton</title><link>http://www.burtonini.com/blog</link><description>A potted account of Ross' life</description><language>en</language><ttl>60</ttl><dc:creator>Ross Burton</dc:creator><admin:generatorAgent rdf:resource="http://pyblosxom.sourceforge.net/"/><admin:errorReportsTo rdf:resource="mailto:ross+web@burtonini.com"/><item><title>Infinite Undo in Tasks</title><guid isPermaLink="false">computers/tasks-undo-2007-09-18-11-14</guid><link>http://www.burtonini.com/blog/computers/tasks-undo-2007-09-18-11-14</link><description>Yesterday I landed in Subversion a branch of Tasks I've been working on to remove all confirmation dialogs and replace ...</description><content:encoded><![CDATA[    <p>
      Yesterday I landed in Subversion a branch of <a
      href="http://pimlico-project.org/tasks.html">Tasks</a> I've been working
      on to remove all confirmation dialogs and replace them with infinite
      undo/redo.  I'm really pleased with the end result, there are no more
      dialogs getting in the way and every action is undoable.  To implement
      this I adapted <tt>MarlinUndoManager</tt> from <a
      href="http://live.gnome.org/Marlin">Marlin</a> by the most excellent
      Iain Holmes.
    </p>
    <p>
      The basic design is that the application has a global <cite>undo
      context</cite>.  When an operation which should be undoable occurs, you
      <cite>start</cite> the context, add as many <cite>undoables</cite> as
      required, and then <cite>end</cite> the context.  Allowing a single
      undoable action to consist of multiple undoables lets the application
      reuse fine-grained logic to build coarse user-level actions (in Tasks this
      is used to build the Remove Completed action from multiple Delete Task
      actions). To make integrating this into applications even easier, I wrote
      a <tt>GtkAction</tt> which reflects the state of an undo context, so it is
      trivial to add redo/undo to the interface.
    </p>
    <p>
      <img src="http://burtonini.com/computing/screenshots/tasks-undo.png"/>
    </p>
    <p>
      There is one remaining task left before this is ready to be released: undo
      support in the edit dialog entries.  Once this is done, the next release
      of Tasks will be announced.  I also plan to work with Iain on cleaning up
      this code and submitting it for inclusion into GTK+.
    </p>

    <p>
      <small>NP: <cite>Money Jungle</cite>, Duke Ellington, Charles Mingus, Max
      Roach</small>
    </p>
]]></content:encoded><dc:date>2007-09-18T10:14:00Z</dc:date></item></channel></rss>