changeset 489:86cdaa346e59

Merge
author Chris Cannam
date Wed, 17 Aug 2011 22:13:51 +0100
parents 2f59333952ce (current diff) 12195f4b5105 (diff)
children cd3dd285d0ff 1d90cd7a1c5f
files src/mainwindow.cpp
diffstat 20 files changed, 690 insertions(+), 271 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Wed Aug 17 22:13:14 2011 +0100
+++ b/.hgtags	Wed Aug 17 22:13:51 2011 +0100
@@ -12,3 +12,4 @@
 820512d49fcac53b902a053cede055b903400006 easyhg_v0.9.5
 a206deb6c1aab16f5bfb4c1d9d10074d1a93fa7e easyhg_v0.9.6
 9510a32a96ab9ea3c2bec5998f3f702b29ec0114 easyhg_v0.9.7
+319f920a51ee61df29701db8ad9bdb413c66a399 easyhg_v0.9.8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.txt	Wed Aug 17 22:13:51 2011 +0100
@@ -0,0 +1,52 @@
+
+EasyMercurial
+=============
+
+EasyMercurial is a user interface for the Mercurial distributed
+version control system.
+
+EasyMercurial is intended to be:
+
+ * simple to teach and to learn
+ * indicative of repository state using a history graph representation
+ * recognisably close to normal command-line workflow for Mercurial
+ * consistent across platforms
+
+We are not trying to produce "the best" Mercurial client for any one
+purpose. We actively encourage users to move on to other clients as
+their needs evolve. The aim is simply to provide something accessible
+for beginners in small project groups working with a shared remote
+repository.
+
+The application is developed by Chris Cannam for SoundSoftware.ac.uk,
+based on the HgExplorer application by Jari Korhonen, and is published
+under the GPL.  See the file COPYING for license details.
+
+
+Building EasyMercurial
+======================
+
+EasyMercurial is written in C++ using the Qt4 toolkit.  On most
+platforms, you can build it by running "qmake" followed by "make".  Qt
+version 4.6 or newer is required.
+
+
+To run EasyMercurial
+====================
+
+Just run the EasyMercurial application that is produced by the build.
+You will of course also need to have Mercurial installed (version 1.7
+or newer).  If you want to use the EasyHg authentication extension,
+you will also need PyQt4 (the Python bindings for Qt4); you may also
+wish to install the python-crypto library for the password store.
+Finally, an external diff/merge utility is required, typically kdiff3.
+
+
+EasyMercurial is
+Copyright 2010 Jari Korhonen
+Copyright 2010-2011 Chris Cannam
+Copyright 2010-2011 Queen Mary, University of London
+
+
+
+
--- a/deploy/linux/control	Wed Aug 17 22:13:14 2011 +0100
+++ b/deploy/linux/control	Wed Aug 17 22:13:51 2011 +0100
@@ -3,5 +3,5 @@
 Maintainer: Chris Cannam <cannam@all-day-breakfast.com>
 Architecture: amd64
 Version: 0.9.8cc-1
-Depends: mercurial (>= 1.7.0),libqtgui4,libqt4-network,python-crypto,python-qt4
+Depends: mercurial (>= 1.7.0),libqtgui4 (>= 4.6.0),libqt4-network,python-crypto,python-qt4
 Description: A simple user interface for the Mercurial version-control system
Binary file easyhg_en.qm has changed
--- a/easyhg_en.ts	Wed Aug 17 22:13:14 2011 +0100
+++ b/easyhg_en.ts	Wed Aug 17 22:13:51 2011 +0100
@@ -2,6 +2,25 @@
 <!DOCTYPE TS>
 <TS version="2.0" language="en_GB">
 <context>
+    <name>AnnotateDialog</name>
+    <message>
+        <source>User</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Revision</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Date</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Content</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>ChangesetItem</name>
     <message>
         <source>&lt;qt&gt;&lt;b&gt;&amp;nbsp;Revision: &lt;/b&gt;%1&lt;/qt&gt;</source>
@@ -109,10 +128,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>These files are unresolved following an incomplete merge.&lt;br&gt;Select a file and use Merge to try to resolve the merge again.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Files highlighted &lt;font color=#d40000&gt;in red&lt;/font&gt; have appeared since your most recent commit or update.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -160,6 +175,112 @@
         <source>&lt;qt&gt;You have no uncommitted changes.&lt;/qt&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Show annotated version</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Diff to parent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Commit...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Revert to last committed state</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Rename...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Copy...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Add to version control</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Remove from version control</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Redo merge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mark conflict as resolved</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ignore...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Edit .hgignore File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>These files are unresolved following an incomplete merge.&lt;br&gt;Use Merge to try to resolve the merge again.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>HgIgnoreDialog</name>
+    <message>
+        <source>Ignore files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You have asked to ignore the following files:&lt;/p&gt;&lt;p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message numerus="yes">
+        <source>You have asked to ignore %n file(s).</source>
+        <translation type="unfinished">
+            <numerusform></numerusform>
+        </translation>
+    </message>
+    <message>
+        <source>Ignore these files only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ignore files with these names, in any folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ignore this file only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ignore files with the same name as this, in any folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ignore the whole folder &quot;%1&quot;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ignore all files with these extensions:
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ignore all files with the extension &quot;%1&quot;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;p&gt;Please choose whether to:&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ignore</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>HgRunner</name>
@@ -215,7 +336,7 @@
     </message>
     <message numerus="yes">
         <source>There are %n change(s) ready to pull</source>
-        <translation type="unfinished">
+        <translation>
             <numerusform>There is %n change ready to pull</numerusform>
             <numerusform>There are %n changes ready to pull</numerusform>
         </translation>
@@ -253,8 +374,8 @@
     </message>
     <message numerus="yes">
         <source>You are about to &lt;b&gt;revert&lt;/b&gt; %n file(s).&lt;br&gt;&lt;br&gt;This will &lt;b&gt;throw away any changes&lt;/b&gt; that you have made to these files but have not committed.</source>
-        <translation type="unfinished">
-            <numerusform>You are about to &lt;b&gt;revert&lt;/b&gt; %n file.&lt;br&gt;&lt;br&gt;This will &lt;b&gt;throw away any changes&lt;/b&gt; that you have made to these files but have not committed.</numerusform>
+        <translation>
+            <numerusform>You are about to &lt;b&gt;revert&lt;/b&gt; %n file.&lt;br&gt;&lt;br&gt;This will &lt;b&gt;throw away any changes&lt;/b&gt; that you have made to this file but have not committed.</numerusform>
             <numerusform>You are about to &lt;b&gt;revert&lt;/b&gt; %n files.&lt;br&gt;&lt;br&gt;This will &lt;b&gt;throw away any changes&lt;/b&gt; that you have made to these files but have not committed.</numerusform>
         </translation>
     </message>
@@ -363,10 +484,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&lt;qt&gt;&lt;b&gt;Initialise a repository here?&lt;/b&gt;&lt;br&gt;&lt;br&gt;You asked to open &quot;%1&quot;.&lt;br&gt;This folder does not contain a Mercurial repository.&lt;br&gt;&lt;br&gt;Would you like to initialise a repository here?&lt;/qt&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>&lt;qt&gt;&lt;b&gt;Initialise a new repository?&lt;/b&gt;&lt;br&gt;&lt;br&gt;You asked to open &quot;%1&quot;.&lt;br&gt;This folder does not yet exist.&lt;br&gt;&lt;br&gt;Would you like to create the folder and initialise a new empty repository in it?&lt;/qt&gt;</source>
         <translation type="unfinished"></translation>
     </message>
@@ -378,17 +495,9 @@
         <source>&lt;qt&gt;&lt;b&gt;Open existing repository?&lt;/b&gt;&lt;br&gt;&lt;br&gt;You asked to initialise a new repository at &quot;%1&quot;.&lt;br&gt;This folder already contains a repository.  Would you like to open it?&lt;/qt&gt;</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <source>Ok</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Mercurial command did not return any output.</source>
-        <translation type="unfinished"></translation>
-    </message>
     <message numerus="yes">
         <source>Pushed %n changeset(s)</source>
-        <translation type="unfinished">
+        <translation>
             <numerusform>Pushed %n changeset</numerusform>
             <numerusform>Pushed %n changesets</numerusform>
         </translation>
@@ -403,7 +512,7 @@
     </message>
     <message numerus="yes">
         <source>Pulled %n changeset(s)</source>
-        <translation type="unfinished">
+        <translation>
             <numerusform>Pulled %n changeset</numerusform>
             <numerusform>Pulled %n changesets</numerusform>
         </translation>
@@ -454,7 +563,7 @@
     </message>
     <message numerus="yes">
         <source>You are about to commit %n file(s) to %1.</source>
-        <translation type="unfinished">
+        <translation type="obsolete">
             <numerusform>You are about to commit %n file to %1.</numerusform>
             <numerusform>You are about to commit %n files to %1.</numerusform>
         </translation>
@@ -485,7 +594,7 @@
     </message>
     <message numerus="yes">
         <source>At one of %n heads of %1</source>
-        <translation type="unfinished">
+        <translation>
             <numerusform>At one of %n heads of %1</numerusform>
             <numerusform>At one of %n heads of %1</numerusform>
         </translation>
@@ -495,22 +604,10 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Open...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Settings...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>View and change application settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Refresh</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Preview</source>
         <translation type="unfinished"></translation>
     </message>
@@ -527,10 +624,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Revert</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Add</source>
         <translation type="unfinished"></translation>
     </message>
@@ -539,34 +632,10 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Commit</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Annotate</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Show line-by-line version information for selected file</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Serve local repository via http for workgroup access</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>File</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Advanced</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Help</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Ready</source>
         <translation type="unfinished"></translation>
     </message>
@@ -579,10 +648,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>You are about to commit the following files to %1:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>New Branch</source>
         <translation type="unfinished"></translation>
     </message>
@@ -591,14 +656,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Start Branch</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Add Tag</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; you are reverting only the files you have selected, not all of the files that have been changed!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -627,10 +684,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&lt;qt&gt;&lt;p&gt;You are about to push your changes to the remote repository at &lt;code&gt;%1&lt;/code&gt;.&lt;/p&gt;&lt;/qt&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Serve</source>
         <translation type="unfinished"></translation>
     </message>
@@ -639,18 +692,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&lt;p&gt;Press Close to stop the server and return.&lt;/p&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Change Remote Location</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>&lt;qt&gt;&lt;big&gt;Change the remote location&lt;/big&gt;&lt;/qt&gt;</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Provide a new URL to use for push and pull actions from the current local repository.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -695,10 +736,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>The new changes will be highlighted in the history.&lt;br&gt;Use Update to bring these changes into your working copy.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Your local repository already contains all changes found in the remote repository.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -727,10 +764,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>The Mercurial program either could not be found or failed to run.&lt;br&gt;Check that the Mercurial program path is correct in %1.</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Failed to run Mercurial with extension enabled</source>
         <translation type="unfinished"></translation>
     </message>
@@ -747,10 +780,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Clone successful</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>The remote repository was successfully cloned to the local folder &lt;code&gt;%1&lt;/code&gt;.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -799,22 +828,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Change Remote Location...</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Change the default remote repository for pull and push actions</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Quit</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Quit EasyMercurial</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Refresh the window to show the current state of the working folder</source>
         <translation type="unfinished"></translation>
     </message>
@@ -839,14 +852,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Mark the selected file(s) to be added on the next commit</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Mark the selected file(s) to be removed from version control on the next commit</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Update the working folder to the head of the current repository branch</source>
         <translation type="unfinished"></translation>
     </message>
@@ -859,27 +864,348 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Edit .hgignore File</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>Edit the .hgignore file, containing the names of files that should be ignored by Mercurial</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Serve via HTTP</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>&lt;qt&gt;&lt;h2&gt;EasyMercurial v%1&lt;/h2&gt;&lt;font size=-1&gt;&lt;p&gt;EasyMercurial is a simple user interface for the Mercurial&lt;/a&gt; version control system.&lt;/p&gt;&lt;h4&gt;Credits and Copyright&lt;/h4&gt;&lt;p&gt;Development carried out by Chris Cannam for SoundSoftware.ac.uk at the Centre for Digital Music, Queen Mary, University of London.&lt;/p&gt;&lt;p&gt;EasyMercurial is based on HgExplorer by Jari Korhonen, with thanks.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;Copyright &amp;copy; 2011 Queen Mary, University of London.&lt;br&gt;Copyright &amp;copy; 2010 Jari Korhonen.&lt;br&gt;Copyright &amp;copy; 2011 Chris Cannam.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;This program requires Mercurial, by Matt Mackall and others.&lt;br&gt;This program uses Qt by Nokia.&lt;br&gt;This program uses Nuvola icons by David Vignoni.&lt;br&gt;This program may use KDiff3 by Joachim Eibl.&lt;br&gt;This program may use PyQt by River Bank Computing.&lt;br&gt;Packaging for Mercurial and other dependencies on Windows is derived from TortoiseHg by Steve Borho and others.&lt;/p&gt;&lt;h4&gt;License&lt;/h4&gt;&lt;p&gt;This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.  See the file COPYING included with this distribution for more information.&lt;/p&gt;&lt;/font&gt;</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>You are about to commit changes to the following files in %1:</source>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <source>Running temporary server at %n address(es):</source>
-        <translation type="unfinished">
-            <numerusform></numerusform>
+        <source>You are about to commit changes to %n file(s) in %1.</source>
+        <translation>
+            <numerusform>You are about to commit changes to %n file in %1.</numerusform>
+            <numerusform>You are about to commit changes to %n files in %1.</numerusform>
         </translation>
     </message>
+    <message>
+        <source>Co&amp;mmit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Start &amp;Branch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Add &amp;Tag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;qt&gt;&lt;h3&gt;Ignored File Patterns&lt;/h3&gt;&lt;/qt&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Write failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Failed to open file %1 for writing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ignored files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The following lines have been added to the .hgignore file for this working copy:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Re&amp;vert</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Rename</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Rename &lt;code&gt;%1&lt;/code&gt; to:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Re&amp;name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Copy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Copy &lt;code&gt;%1&lt;/code&gt; to:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Co&amp;py</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Pull</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; You have uncommitted changes.  If you want to push these changes to the remote repository, you need to commit them first.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;qt&gt;&lt;p&gt;You are about to push your commits to the remote repository at &lt;code&gt;%1&lt;/code&gt;.&lt;/p&gt;%2&lt;/qt&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Push</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sharing Repository</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Your local repository is now being made temporarily available via HTTP for workgroup access.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Users who have network access to your computer can now clone your repository, by using one of the following URLs as a remote location:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Users who have network access to your computer can now clone your repository, by using the following URL as a remote location:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;p&gt;Press Close to terminate this server, end remote access, and return.&lt;/p&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Share Repository</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Set Remote Location</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;qt&gt;&lt;big&gt;Set the remote location&lt;/big&gt;&lt;/qt&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Provide a URL to use for push and pull actions from the current local repository.&lt;br&gt;This will be the default for subsequent pushes and pulls.&lt;br&gt;You can change it using &amp;ldquo;Set Remote Location&amp;rdquo; on the File menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&lt;qt&gt;&lt;b&gt;Initialise a repository here?&lt;/b&gt;&lt;br&gt;&lt;br&gt;You asked to open &quot;%1&quot;.&lt;br&gt;This folder is not a Mercurial working copy.&lt;br&gt;&lt;br&gt;Would you like to initialise a repository here?&lt;/qt&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>New changes will be highlighted in yellow in the history.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Your local repository could not be pushed to the remote repository.&lt;br&gt;&lt;br&gt;You have an uncommitted merge in your local folder.  You probably need to commit it before you push.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Authorization failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You may have entered an incorrect user name or password, or the remote URL may be wrong.&lt;br&gt;&lt;br&gt;Or you may lack the necessary permissions on the remote repository.&lt;br&gt;&lt;br&gt;Check with the administrator of your remote repository if necessary.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The Mercurial program either could not be found or failed to run.&lt;br&gt;&lt;br&gt;Check that the Mercurial program path is correct in %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Merge failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Some files were not merged successfully.&lt;p&gt;You can Merge again to repeat the interactive merge; use Revert to abandon the merge entirely; or edit the files that are in conflict in an editor and, when you are happy with them, choose Mark Resolved in each file&apos;s right-button menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A Mercurial command failed to run correctly.  This may indicate an installation problem or some other problem with EasyMercurial.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Newer Mercurial version required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>To use EasyMercurial, you should have at least Mercurial v1.7 installed.&lt;br&gt;&lt;br&gt;The version found on this system (v%1.%2) does not support all of the features required by EasyMercurial.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Open successful</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>No recent local repositories</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Open...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ctrl+O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Set Remote &amp;Location...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Set or change the default remote repository for pull and push actions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Settings...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>E&amp;xit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Quit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Exit EasyMercurial</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Refresh</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ctrl+R</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pre&amp;view Incoming Changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pu&amp;ll from Remote Repository</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ctrl+L</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pus&amp;h to Remote Repository</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ctrl+H</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Diff</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ctrl+D</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Add Files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mark the selected files to be added on the next commit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Remove Files</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Del</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Mark the selected files to be removed from version control on the next commit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Ignore Files...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Add the selected filenames to the ignored list, of files that should never be tracked in this repository</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Edit Ignored List</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Update to Branch Head</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ctrl+U</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Commit...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ctrl+Return</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Merge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Ctrl+M</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Serve local repository temporarily via HTTP for workgroup access</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Open Re&amp;cent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Work</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Remote</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&amp;Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Remote</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Work</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>MoreInformationDialog</name>
@@ -922,6 +1248,18 @@
         <source>&amp;Folder:</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>Documents</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>My Documents</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Desktop</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>QApplication</name>
@@ -1039,10 +1377,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>External text editor:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>EasyHg Mercurial extension:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1067,10 +1401,6 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>External text editor</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
         <source>EasyHg Mercurial extension</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1082,6 +1412,14 @@
         <source>&lt;qt&gt;&lt;b&gt;Restore default settings?&lt;/b&gt;&lt;br&gt;&lt;br&gt;Are you sure you want to reset all settings to their default values?</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>SSH program (for ssh URLs):</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SSH program</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>StartupDialog</name>
@@ -1148,6 +1486,18 @@
         <source>Cancel new branch</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <source>&lt;qt&gt;&lt;b&gt;&amp;nbsp;Uncommitted merge&lt;/b&gt;&lt;/qt&gt;</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Uncommitted merge</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>merge</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>WorkStatusWidget</name>
--- a/src/changesetitem.cpp	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/changesetitem.cpp	Wed Aug 17 22:13:51 2011 +0100
@@ -101,17 +101,16 @@
         } else {
             showDetail();
         }
-    } else if (e->button() == Qt::RightButton) {
-        if (m_detail) {
-            hideDetail();
-        }
-        activateMenu();
     }
 }
 
 void
-ChangesetItem::activateMenu()
+ChangesetItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *)
 {
+    if (m_detail) {
+        hideDetail();
+    }
+
     m_parentDiffActions.clear();
     m_summaryActions.clear();
 
@@ -201,9 +200,9 @@
     QAction *tag = menu->addAction(tr("Add tag..."));
     connect(tag, SIGNAL(triggered()), this, SLOT(tagActivated()));
 
+    ungrabMouse();
+
     menu->exec(QCursor::pos());
-
-    ungrabMouse();
 }
 
 void
--- a/src/changesetitem.h	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/changesetitem.h	Wed Aug 17 22:13:51 2011 +0100
@@ -85,6 +85,7 @@
 
 protected:
     virtual void mousePressEvent(QGraphicsSceneMouseEvent *);
+    virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *);
 
 private:
     void activateMenu();
--- a/src/debug.cpp	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/debug.cpp	Wed Aug 17 22:13:51 2011 +0100
@@ -25,6 +25,7 @@
 #include <QDir>
 #include <QCoreApplication>
 #include <QDateTime>
+#include <QDesktopServices>
 
 #include <cstdio>
 
@@ -39,7 +40,15 @@
     if (!debug) {
         prefix = new char[20];
         sprintf(prefix, "[%lu]", (unsigned long)QCoreApplication::applicationPid());
-        logFile = new QFile(QDir::homePath() + "/.easyhg.log");
+        QString logFileName = QDir::homePath() + "/.easyhg.log"; // the fallback
+        QString logDir = QDesktopServices::storageLocation
+            (QDesktopServices::DataLocation);
+        if (logDir != "" &&
+            (QDir(logDir).exists() ||
+             QDir().mkpath(logDir))) {
+            logFileName = logDir + "/debug.log";
+        }
+        logFile = new QFile(logFileName);
         if (logFile->open(QIODevice::WriteOnly | QIODevice::Truncate)) {
             QDebug(QtDebugMsg) << (const char *)prefix
                                << "Opened debug log file "
--- a/src/filestatuswidget.cpp	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/filestatuswidget.cpp	Wed Aug 17 22:13:51 2011 +0100
@@ -79,7 +79,7 @@
     m_descriptions[FileStates::Missing] = tr("These files are recorded in the version control, but absent from your working folder.<br>"
                                              "If you intended to delete them, select them and use Remove to tell the version control system about it.<br>"
                                              "If you deleted them by accident, select them and use Revert to restore their previous contents.");
-    m_descriptions[FileStates::InConflict] = tr("These files are unresolved following an incomplete merge.<br>Select a file and use Merge to try to resolve the merge again.");
+    m_descriptions[FileStates::InConflict] = tr("These files are unresolved following an incomplete merge.<br>Use Merge to try to resolve the merge again.");
     m_descriptions[FileStates::Unknown] = tr("These files are in your working folder but are not under version control.<br>"
 //                                             "Select a file and use Add to place it under version control or Ignore to remove it from this list.");
                                              "Select a file and use Add to place it under version control.");
@@ -157,15 +157,27 @@
     m_showAllFiles = new QCheckBox(tr("Show all files"), this);
     m_showAllFiles->setEnabled(false);
     layout->addWidget(m_showAllFiles, ++row, 0, Qt::AlignLeft);
+
+    QSettings settings;
+    m_showAllFiles->setChecked(settings.value("showall", false).toBool());
+
     connect(m_showAllFiles, SIGNAL(toggled(bool)),
-            this, SIGNAL(showAllChanged(bool)));
+            this, SIGNAL(showAllChanged()));
 }
 
 FileStatusWidget::~FileStatusWidget()
 {
+    QSettings settings;
+    settings.setValue("showall", m_showAllFiles->isChecked());
+
     delete m_dateReference;
 }
 
+bool FileStatusWidget::shouldShowAll() const
+{
+    return m_showAllFiles->isChecked();
+}
+
 QString FileStatusWidget::labelFor(FileStates::State s, bool addHighlightExplanation)
 {
     QSettings settings;
--- a/src/filestatuswidget.h	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/filestatuswidget.h	Wed Aug 17 22:13:51 2011 +0100
@@ -54,9 +54,11 @@
     QStringList getSelectedAddableFiles() const;
     QStringList getSelectedRemovableFiles() const;
 
+    bool shouldShowAll() const;
+
 signals:
     void selectionChanged();
-    void showAllChanged(bool);
+    void showAllChanged();
 
     void annotateFiles(QStringList);
     void diffFiles(QStringList);
--- a/src/hgrunner.cpp	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/hgrunner.cpp	Wed Aug 17 22:13:51 2011 +0100
@@ -40,6 +40,8 @@
 #include <unistd.h>
 #include <termios.h>
 #include <fcntl.h>
+#else
+#include <process.h>
 #endif
 
 HgRunner::HgRunner(QString myDirPath, QWidget * parent) :
@@ -497,9 +499,6 @@
         return;
     }
 
-    QSettings settings;
-    settings.beginGroup("General");
-
     if (executable == "") {
         // This is a Hg command
         executable = getHgBinaryName();
@@ -514,6 +513,7 @@
         if (action.mayBeInteractive()) {
             params.push_front("ui.interactive=true");
             params.push_front("--config");
+            QSettings settings;
             if (settings.value("useextension", true).toBool()) {
                 params = addExtensionOptions(params);
             }
--- a/src/hgtabwidget.cpp	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/hgtabwidget.cpp	Wed Aug 17 22:13:51 2011 +0100
@@ -37,8 +37,8 @@
     connect(m_fileStatusWidget, SIGNAL(selectionChanged()),
             this, SIGNAL(selectionChanged()));
 
-    connect(m_fileStatusWidget, SIGNAL(showAllChanged(bool)),
-            this, SIGNAL(showAllChanged(bool)));
+    connect(m_fileStatusWidget, SIGNAL(showAllChanged()),
+            this, SIGNAL(showAllChanged()));
 
     connect(m_fileStatusWidget, SIGNAL(annotateFiles(QStringList)),
             this, SIGNAL(annotateFiles(QStringList)));
@@ -268,3 +268,8 @@
     setCurrentWidget(m_historyWidget);
 }
 
+bool HgTabWidget::shouldShowAll() const
+{
+    return m_fileStatusWidget->shouldShowAll();
+}
+
--- a/src/hgtabwidget.h	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/hgtabwidget.h	Wed Aug 17 22:13:51 2011 +0100
@@ -70,9 +70,11 @@
     QStringList getSelectedAddableFiles() const;
     QStringList getSelectedRemovableFiles() const;
 
+    bool shouldShowAll() const;
+
 signals:
     void selectionChanged();
-    void showAllChanged(bool);
+    void showAllChanged();
 
     void commit();
     void revert();
--- a/src/mainwindow.cpp	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/mainwindow.cpp	Wed Aug 17 22:13:51 2011 +0100
@@ -33,6 +33,7 @@
 #include <QRegExp>
 #include <QShortcut>
 #include <QUrl>
+#include <QDialogButtonBox>
 #include <QTimer>
 
 #include "mainwindow.h"
@@ -110,8 +111,8 @@
 
     connect(m_hgTabs, SIGNAL(selectionChanged()),
             this, SLOT(enableDisableActions()));
-    connect(m_hgTabs, SIGNAL(showAllChanged(bool)),
-            this, SLOT(showAllChanged(bool)));
+    connect(m_hgTabs, SIGNAL(showAllChanged()),
+            this, SLOT(showAllChanged()));
 
     setUnifiedTitleAndToolBarOnMac(true);
     connectActions();
@@ -205,9 +206,8 @@
     m_hgTabs->clearSelections();
 }
 
-void MainWindow::showAllChanged(bool s)
+void MainWindow::showAllChanged()
 {
-    m_showAllFiles = s;
     hgQueryPaths();
 }
 
@@ -256,6 +256,8 @@
 
 void MainWindow::hgQueryPaths()
 {
+    m_showAllFiles = m_hgTabs->shouldShowAll();
+
     // Quickest is to just read the file
 
     QFileInfo hgrc(m_workFolderPath + "/.hg/hgrc");
@@ -456,10 +458,10 @@
         (this,
          cf,
          tr("<h3>%1</h3><p>%2%3").arg(cf)
-         .arg(tr("You are about to commit the following files to %1:").arg(branchText))
+         .arg(tr("You are about to commit changes to the following files in %1:").arg(branchText))
          .arg(subsetNote),
          tr("<h3>%1</h3><p>%2%3").arg(cf)
-         .arg(tr("You are about to commit %n file(s) to %1.", "", reportFiles.size()).arg(branchText))
+         .arg(tr("You are about to commit changes to %n file(s) in %1.", "", reportFiles.size()).arg(branchText))
          .arg(subsetNote),
          reportFiles,
          comment,
@@ -577,23 +579,50 @@
     initHgIgnore();
 
     QString hgIgnorePath = m_workFolderPath + "/.hgignore";
-    QStringList params;
-
-    params << hgIgnorePath;
+
+    QFile f(hgIgnorePath);
+    if (!f.exists()) return; // shouldn't happen (after initHgIgnore called)
+
+    if (!f.open(QFile::ReadOnly)) return;
+    QTextStream sin(&f);
+    QString all = sin.readAll();
+    f.close();
+
+    QDialog d;
+    QGridLayout layout;
+    d.setLayout(&layout);
+
+    int row = 0;
+    layout.addWidget(new QLabel(tr("<qt><h3>Ignored File Patterns</h3></qt>")), row++, 0);//!!! todo: link to Hg docs?
+
+    QTextEdit ed;
+    ed.setAcceptRichText(false);
+    ed.setLineWrapMode(QTextEdit::NoWrap);
+    layout.setRowStretch(row, 10);
+    layout.addWidget(&ed, row++, 0);
     
-    QString editor = getEditorBinaryName();
-
-    if (editor == "") {
-        QMessageBox::critical
-            (this, tr("Edit .hgignore"),
-             tr("Failed to locate a system text editor program!"));
-        return;
+    QDialogButtonBox bb(QDialogButtonBox::Save | QDialogButtonBox::Cancel);
+    connect(bb.button(QDialogButtonBox::Save), SIGNAL(clicked()),
+            &d, SLOT(accept()));
+    connect(bb.button(QDialogButtonBox::Cancel), SIGNAL(clicked()),
+            &d, SLOT(reject()));
+    layout.addWidget(&bb, row++, 0);
+
+    ed.document()->setPlainText(all);
+
+    d.resize(QSize(300, 400));
+
+    if (d.exec() == QDialog::Accepted) {
+        if (!f.open(QFile::WriteOnly | QFile::Truncate)) {
+            QMessageBox::critical(this, tr("Write failed"),
+                                  tr("Failed to open file %1 for writing")
+                                  .arg(f.fileName()));
+            return;
+        }
+        QTextStream sout(&f);
+        sout << ed.document()->toPlainText();
+        f.close();
     }
-
-    HgAction action(ACT_HG_IGNORE, m_workFolderPath, params);
-    action.executable = editor;
-
-    m_runner->requestAction(action);
 }
 
 static QString regexEscape(QString filename)
@@ -767,13 +796,6 @@
     return settings.value("mergebinary", "").toString();
 }
 
-QString MainWindow::getEditorBinaryName()
-{
-    QSettings settings;
-    settings.beginGroup("Locations");
-    return settings.value("editorbinary", "").toString();
-}
-
 void MainWindow::hgShowSummary()
 {
     QStringList params;
@@ -1313,7 +1335,7 @@
                      MultiChoiceDialog::DirectoryArg);
 
         QSettings settings;
-        settings.beginGroup("General");
+        settings.beginGroup("");
         QString lastChoice = settings.value("lastopentype", "remote").toString();
         if (lastChoice != "local" &&
             lastChoice != "remote" &&
@@ -2042,7 +2064,7 @@
             (this,
              tr("Failed to run Mercurial"),
              tr("Failed to run Mercurial"),
-             tr("The Mercurial program either could not be found or failed to run.<br>Check that the Mercurial program path is correct in %1.").arg(setstr),
+             tr("The Mercurial program either could not be found or failed to run.<br><br>Check that the Mercurial program path is correct in %1.").arg(setstr),
              output);
         settings(SettingsDialog::PathsTab);
         return;
@@ -2145,7 +2167,9 @@
         (this,
          tr("Command failed"),
          tr("Command failed"),
-         tr("A Mercurial command failed to run correctly.  This may indicate an installation problem or some other problem with EasyMercurial.<br><br>See &ldquo;More Details&rdquo; for the command output."),
+         (output == "" ?
+          tr("A Mercurial command failed to run correctly.  This may indicate an installation problem or some other problem with EasyMercurial.") :
+          tr("A Mercurial command failed to run correctly.  This may indicate an installation problem or some other problem with EasyMercurial.<br><br>See &ldquo;More Details&rdquo; for the command output.")),
          output);
 }
 
@@ -2422,7 +2446,6 @@
     case ACT_TEST_HG:
     {
         QSettings settings;
-        settings.beginGroup("General");
         if (settings.value("useextension", true).toBool()) {
             hgTestExtension();
         } else if (m_workFolderPath == "") {
--- a/src/mainwindow.h	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/mainwindow.h	Wed Aug 17 22:13:51 2011 +0100
@@ -65,7 +65,7 @@
     void changeRemoteRepo(bool initial);
     void startupDialog();
     void clearSelections();
-    void showAllChanged(bool);
+    void showAllChanged();
 
     void hgTest();
     void hgTestExtension();
--- a/src/multichoicedialog.cpp	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/multichoicedialog.cpp	Wed Aug 17 22:13:51 2011 +0100
@@ -171,11 +171,15 @@
     QDir home(QDir::home());
     QDir dflt;
 
+    dflt = QDir(home.filePath(tr("Documents")));
+    DEBUG << "testing " << dflt << endl;
+    if (dflt.exists()) return dflt.canonicalPath();
+
     dflt = QDir(home.filePath(tr("My Documents")));
     DEBUG << "testing " << dflt << endl;
     if (dflt.exists()) return dflt.canonicalPath();
 
-    dflt = QDir(home.filePath(tr("Documents")));
+    dflt = QDir(home.filePath(tr("Desktop")));
     DEBUG << "testing " << dflt << endl;
     if (dflt.exists()) return dflt.canonicalPath();
 
@@ -218,6 +222,7 @@
 MultiChoiceDialog::urlChanged(const QString &s)
 {
     updateOkButton();
+    updateFileComboFromURL();
 }
 
 void
@@ -227,16 +232,11 @@
 }
 
 void
-MultiChoiceDialog::updateOkButton()
+MultiChoiceDialog::updateFileComboFromURL()
 {
-/* This doesn't work well
     if (m_argTypes[m_currentChoice] != UrlToDirectoryArg) {
         return;
     }
-    QDir dirPath(m_fileCombo->currentText());
-    if (!dirPath.exists()) {
-        if (!dirPath.cdUp()) return;
-    }
     QString url = m_urlCombo->currentText();
     if (QRegExp("^\\w+://").indexIn(url) < 0) {
         return;
@@ -246,8 +246,23 @@
     if (urlDirName == "" || urlDirName == url) {
         return;
     }
-    m_fileCombo->lineEdit()->setText(dirPath.filePath(urlDirName));
-*/
+    QString dirPath = m_fileCombo->currentText();
+    QString defaultPath = getDefaultPath();
+    if (dirPath == defaultPath) {
+        dirPath += QDir::separator() + urlDirName;
+    } else if (dirPath == defaultPath + QDir::separator()) {
+        dirPath += urlDirName;
+    } else {
+        QDir d(dirPath);
+        d.cdUp();
+        dirPath = d.filePath(urlDirName);
+    }
+    m_fileCombo->lineEdit()->setText(dirPath);
+}
+
+void
+MultiChoiceDialog::updateOkButton()
+{
     if (m_argTypes[m_currentChoice] == UrlToDirectoryArg) {
         m_okButton->setEnabled(getArgument() != "" &&
                                getAdditionalArgument() != "");
@@ -289,15 +304,17 @@
 
     m_descriptionLabel->setText(m_descriptions[id]);
 
-    m_fileLabel->hide();
-    m_fileCombo->hide();
     m_browseButton->hide();
+
     m_urlLabel->hide();
+    m_urlCombo->clear();
     m_urlCombo->hide();
 
+    m_fileLabel->hide();
+    m_fileCombo->clear();
+    m_fileCombo->hide();
+
     QSharedPointer<RecentFiles> rf = m_recentFiles[id];
-    m_fileCombo->clear();
-    m_urlCombo->clear();
 
     switch (m_argTypes[id]) {
         
@@ -334,6 +351,7 @@
         m_fileLabel->show();
         m_fileCombo->show();
         m_fileCombo->lineEdit()->setText(getDefaultPath());
+        updateFileComboFromURL();
         m_browseButton->show();
         break;
     }
--- a/src/multichoicedialog.h	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/multichoicedialog.h	Wed Aug 17 22:13:51 2011 +0100
@@ -65,6 +65,7 @@
     void browse();
 
 private:
+    void updateFileComboFromURL();
     void updateOkButton();
     
     QMap<QString, QString> m_texts;
--- a/src/settingsdialog.cpp	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/settingsdialog.cpp	Wed Aug 17 22:13:51 2011 +0100
@@ -151,15 +151,6 @@
     pathsLayout->addWidget(browse, row++, 1);
     connect(browse, SIGNAL(clicked()), this, SLOT(sshPathBrowse()));
 
-    pathsLayout->addWidget(new QLabel(tr("External text editor:")), row, 0);
-
-    m_editPathLabel = new QLineEdit();
-    pathsLayout->addWidget(m_editPathLabel, row, 2);
-
-    browse = new QPushButton(tr("Browse..."));
-    pathsLayout->addWidget(browse, row++, 1);
-    connect(browse, SIGNAL(clicked()), this, SLOT(editPathBrowse()));
-
     pathsLayout->addWidget(new QLabel(tr("EasyHg Mercurial extension:")), row, 0);
 
     m_extensionPathLabel = new QLineEdit();
@@ -222,12 +213,6 @@
 }
 
 void
-SettingsDialog::editPathBrowse()
-{
-    browseFor(tr("External text editor"), m_editPathLabel);
-}
-
-void
 SettingsDialog::extensionPathBrowse()
 {
     browseFor(tr("EasyHg Mercurial extension"), m_extensionPathLabel);
@@ -275,7 +260,6 @@
     findDiffBinaryName();
     findMergeBinaryName();
     findSshBinaryName();
-    findEditorBinaryName();
 }
 
 void
@@ -409,40 +393,6 @@
 }
 
 void
-SettingsDialog::findEditorBinaryName()
-{
-    QSettings settings;
-    settings.beginGroup("Locations");
-    QString editor = settings.value("editorbinary", "").toString();
-    if (editor != "" && QFile(editor).exists()) {
-        return;
-    }
-    QStringList bases;
-    bases
-#if defined Q_OS_WIN32
-        << "wordpad.exe"
-        << "C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe"
-        << "notepad.exe"
-#elif defined Q_OS_MAC
-        << "/Applications/TextEdit.app/Contents/MacOS/TextEdit"
-#else
-        << "gedit" << "kate"
-#endif
-        ;
-    bool found = false;
-    foreach (QString base, bases) {
-        editor = findInPath(base, m_installPath, true);
-        if (editor != "") {
-            found = true;
-            break;
-        }
-    }
-    if (found) {
-        settings.setValue("editorbinary", editor);
-    }
-}
-
-void
 SettingsDialog::clear()
 {
     // Clear everything that has a default setting
@@ -458,10 +408,9 @@
     settings.remove("extdiffbinary");
     settings.remove("mergebinary");
     settings.remove("sshbinary");
-    settings.remove("editorbinary");
     settings.remove("extensionpath");
     settings.endGroup();
-    settings.beginGroup("General");
+    settings.beginGroup("");
     settings.remove("useextension");
     settings.endGroup();
 }
@@ -488,10 +437,9 @@
     m_diffPathLabel->setText(settings.value("extdiffbinary").toString());
     m_mergePathLabel->setText(settings.value("mergebinary").toString());
     m_sshPathLabel->setText(settings.value("sshbinary").toString());
-    m_editPathLabel->setText(settings.value("editorbinary").toString());
     m_extensionPathLabel->setText(settings.value("extensionpath").toString());
     settings.endGroup();
-    settings.beginGroup("General");
+    settings.beginGroup("");
     m_useExtension->setChecked(settings.value("useextension", true).toBool());
     settings.endGroup();
 }
@@ -536,10 +484,9 @@
     settings.setValue("extdiffbinary", m_diffPathLabel->text());
     settings.setValue("mergebinary", m_mergePathLabel->text());
     settings.setValue("sshbinary", m_sshPathLabel->text());
-    settings.setValue("editorbinary", m_editPathLabel->text());
     settings.setValue("extensionpath", m_extensionPathLabel->text());
     settings.endGroup();
-    settings.beginGroup("General");
+    settings.beginGroup("");
     settings.setValue("useextension", m_useExtension->isChecked());
     settings.endGroup();
     QDialog::accept();
--- a/src/settingsdialog.h	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/settingsdialog.h	Wed Aug 17 22:13:51 2011 +0100
@@ -53,7 +53,6 @@
     void diffPathBrowse();
     void mergePathBrowse();
     void sshPathBrowse();
-    void editPathBrowse();
     void extensionPathBrowse();
 
     void accept();
@@ -70,7 +69,6 @@
     QLineEdit *m_diffPathLabel;
     QLineEdit *m_mergePathLabel;
     QLineEdit *m_sshPathLabel;
-    QLineEdit *m_editPathLabel;
 
     QCheckBox *m_useExtension;
     QLineEdit *m_extensionPathLabel;
@@ -93,7 +91,6 @@
     static void findDiffBinaryName();
     static void findMergeBinaryName();
     static void findSshBinaryName();
-    static void findEditorBinaryName();
 
     static QString m_installPath;
 };
--- a/src/version.h	Wed Aug 17 22:13:14 2011 +0100
+++ b/src/version.h	Wed Aug 17 22:13:51 2011 +0100
@@ -1,1 +1,1 @@
-#define EASYHG_VERSION "0.9.7"
+#define EASYHG_VERSION "1.0"