← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~raoul-snyman/openlp/shortcut-dialog into lp:openlp

 

Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/shortcut-dialog into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)


View-only list of actions and shortcuts, currently also only the actions in the main window are in the shortcut dialog.
-- 
https://code.launchpad.net/~raoul-snyman/openlp/shortcut-dialog/+merge/39494
Your team OpenLP Core is requested to review the proposed merge of lp:~raoul-snyman/openlp/shortcut-dialog into lp:openlp.
=== modified file 'openlp/core/resources.py'
--- openlp/core/resources.py	2010-09-14 18:18:47 +0000
+++ openlp/core/resources.py	2010-10-28 06:57:50 +0000
@@ -12368,6 +12368,61 @@
 \x94\x8f\x52\xca\x04\xc0\x7e\x92\x24\x67\x71\x1c\x3f\x4b\x29\x03\
 \x2c\xd7\xcf\xba\xae\xb1\x00\x35\xf4\xac\x81\x7c\x6a\x79\x61\x00\
 \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x03\x4f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\
+\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
+\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01\
+\x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x01\x05\
+\x15\x38\x05\x8e\x43\x17\x2a\x00\x00\x02\xcf\x49\x44\x41\x54\x78\
+\xda\x8d\x93\x5b\x48\x93\x61\x1c\xc6\x9f\x6f\xf3\xb0\x96\xd3\x29\
+\xd3\xa1\x17\x82\x8e\x9c\xcd\x16\x88\x05\x05\x89\x90\x95\x68\x8a\
+\x61\xe4\xe1\xc6\x43\xa4\x35\xcd\x41\xba\x2e\x9a\xa9\x0d\xb3\xc2\
+\x84\xd0\xe5\x70\xa0\x16\x08\x1e\x52\x03\xbd\x28\x0d\xbb\xf2\x90\
+\x82\x74\x91\x4d\x27\x09\xdb\xac\x5c\xe9\x06\x2d\x21\xdb\xb7\x6f\
+\xbe\x7d\xdf\x24\x29\x2a\xed\x07\x7f\x78\x6f\xfe\xcf\xfb\x3c\xcf\
+\xcb\x4b\x61\x0f\xaa\xaa\xaf\x49\xf3\xf2\xf2\x35\x14\x85\xa3\x4e\
+\xa7\x73\xe3\xc3\xc7\xf7\x7d\x15\xe5\x95\x3d\xb4\x9b\x26\xd8\x8b\
+\xcc\xac\x0c\x89\x79\x69\xc9\xe2\xf5\x7a\x89\xd5\x6a\x21\xb5\x75\
+\x37\x5d\x29\x29\xc9\x0f\x00\x04\xe2\x7f\x50\x55\x5c\x51\xdb\x3f\
+\xad\x92\xef\x9b\xdf\xc8\xe0\xd0\xe0\x3a\x00\x25\x00\x3e\x7e\x81\
+\x87\x5d\xf0\xd0\xb4\xc2\x62\xb1\xc0\x4d\xbb\x71\x30\x3e\xde\x5f\
+\xa1\x50\xac\x02\xf0\x82\xa5\xe1\xb6\x2e\x6c\x2f\x01\x4a\xa9\x3c\
+\x74\x60\x66\x66\x06\x0c\xe3\x45\x64\x64\x64\x88\x4e\x57\x3f\xda\
+\xd0\xa8\xcb\x9a\x7e\x35\xd5\x05\x42\x0d\x03\xf0\xdf\x4d\x20\x20\
+\x26\x56\x96\x40\x08\x81\xb6\xb6\x0e\x76\xbb\x1d\x72\xb9\xfc\x88\
+\x70\xdf\xfe\x11\x71\x88\xb8\x64\x68\xe8\xe9\x3c\x00\xe6\x9f\x02\
+\x25\x25\x85\x0a\x69\x84\x54\xfa\x6c\x6c\x1c\xa1\xa1\x61\x30\x76\
+\x74\x42\x14\x1c\x8c\xa0\xa0\x20\x34\x37\x37\x23\x3a\x3a\xfa\x98\
+\x4a\xa5\x6a\xe7\xff\xb5\xfd\xcc\x8c\xc0\x6a\x8d\xe6\x71\x5c\x9c\
+\x3c\xf6\x8b\xcb\x85\x8d\x8d\xaf\x10\x0a\x02\x41\xbb\xdd\x30\x99\
+\x16\x90\x9e\x9e\x81\xd2\xd2\xd2\xc8\x95\x95\x95\xc4\x3f\x1c\x14\
+\x14\xe4\x07\x68\x34\xd7\x7b\xd6\x3e\xaf\xa5\xae\xaf\xaf\xe3\xc2\
+\xf9\x1c\x86\x0f\x32\x6d\x6c\x37\xde\xea\xed\xed\x43\x7d\x5d\x3d\
+\xac\x56\x2b\xeb\x2a\x14\x62\xb1\x98\xfa\x4d\xa0\xec\x72\x69\x40\
+\x5e\x5e\x6e\xff\xa2\x79\x31\xa7\xcd\x60\xe0\x5e\xc1\xab\xae\x54\
+\x6b\x9b\x9a\xee\x9f\x49\x4c\x4c\x6c\x66\x8b\xf4\x45\x98\x9d\x9d\
+\x05\x9f\xcf\xc7\xd6\xd6\x16\xf1\xdb\x59\x2e\xbb\x24\x48\x4e\x3e\
+\x31\xf0\x6e\x79\x39\xb3\xb5\x55\x8f\x7b\x77\xef\x60\x64\x78\x64\
+\x40\x22\x91\xbc\x56\xab\xd5\x9d\x9b\x9b\x9b\xfe\x6e\x36\x02\x07\
+\x45\x51\xbe\x61\x18\x06\x3e\x8a\x8b\x8b\x82\xa6\xa6\x26\x5e\x3c\
+\x34\xe8\x49\x78\x44\x38\xc9\xcf\xcf\x25\xfd\x4f\x7a\x6d\x00\x62\
+\xb4\x5a\x6d\xa3\xc3\xe1\x20\x34\x4d\x13\x8f\xc7\x43\x38\x0a\x0b\
+\x0b\x7d\xe7\x96\x96\x16\x2f\x4f\x91\xa0\xf0\x53\x95\xab\xfa\x08\
+\x45\x9d\xee\xea\x7c\x04\x99\x2c\x16\xd9\xe7\xb2\x19\xbd\xbe\xed\
+\x06\x00\x6b\x52\x52\x12\x84\x42\xa1\xef\x36\x76\x61\xc7\x01\x07\
+\x61\xf1\x2b\xb9\x58\x74\x9c\x61\x3c\x67\x4d\x6f\x17\x10\x15\x15\
+\x85\xec\xec\x2c\x8c\x8f\xbf\xec\x9b\x9c\x98\x1c\x02\x40\x64\x32\
+\x19\x97\x95\x2d\xb7\x00\x73\x73\x73\x30\x9b\xcd\x10\x89\x44\x60\
+\xff\x07\x38\xfc\x5c\x2e\x97\xd3\xe1\x74\x90\xb4\xb4\x34\xea\x54\
+\xea\x49\x8c\x8e\x3d\x37\x75\x76\x74\x71\xb7\xfb\x02\x0b\x04\x02\
+\x70\x74\x77\x77\x43\xaf\xd7\xa3\xa6\xa6\x06\x6c\x1c\xb0\x7b\xdb\
+\x5d\x70\x8e\xda\x8d\x06\xb5\x52\x79\xb8\x92\xa6\x3d\xcb\x6c\x61\
+\x55\xf3\x6f\xe6\x17\x80\x6d\x6c\x36\xdb\x55\x1e\x8f\xd7\xca\x96\
+\xc8\x59\xfe\x69\x9d\x1b\xce\x99\xed\x07\x39\xf7\x48\x74\xc8\xf9\
+\xb8\x6a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
 \x00\x00\x03\x36\
 \x89\
 \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -12644,6 +12699,49 @@
 \xf8\x02\xad\x15\x5d\xd7\x33\x2a\xdb\x17\x81\x28\x93\xdc\xf1\x3e\
 \x99\xef\x2c\x89\x18\x25\x60\x1e\x87\xcd\x7f\xa4\xf5\xbb\xd8\x41\
 \x74\xba\x21\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\x84\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x10\x00\x00\x00\x10\x08\x03\x00\x00\x00\x28\x2d\x0f\x53\
+\x00\x00\x00\x03\x73\x42\x49\x54\x08\x08\x08\xdb\xe1\x4f\xe0\x00\
+\x00\x00\x09\x70\x48\x59\x73\x00\x00\x01\xbb\x00\x00\x01\xbb\x01\
+\x3a\xec\xe3\xe2\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\
+\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\
+\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\x35\x50\x4c\x54\
+\x45\xff\xff\xff\x00\x00\x00\x3a\x42\x3a\x00\x00\x00\x2c\x32\x2c\
+\x00\x00\x00\x20\x20\x20\x00\x00\x00\x15\x15\x12\x00\x00\x00\x05\
+\x05\x05\x3d\x3e\x3c\x00\x00\x00\x3d\x3e\x3b\x63\x63\x63\x00\x00\
+\x00\x01\x01\x01\x30\x31\x2f\x02\x02\x02\x24\x25\x24\x02\x02\x02\
+\x18\x18\x17\x04\x04\x04\x0d\x0d\x0d\x01\x01\x01\x02\x02\x02\x04\
+\x04\x04\x05\x05\x05\x06\x06\x06\x07\x07\x07\x08\x08\x08\x0c\x0c\
+\x0c\x0d\x0d\x0d\x10\x10\x10\x14\x14\x13\x14\x14\x14\x19\x19\x19\
+\x20\x20\x20\x21\x22\x21\x22\x22\x22\x27\x27\x26\x2f\x30\x2e\x31\
+\x31\x31\x32\x33\x31\x37\x37\x37\x3a\x3a\x3a\x3d\x3e\x3b\x3f\x3f\
+\x3f\x41\x41\x41\x41\x42\x3f\x44\x45\x43\x45\x45\x45\x47\x47\x47\
+\x4a\x4a\x4a\x4a\x4b\x48\x4b\x4b\x4b\x4d\x4e\x4b\x4e\x4e\x4e\x4e\
+\x4f\x4d\x50\x50\x50\x53\x53\x53\x54\x54\x54\x56\x56\x55\x56\x57\
+\x54\x58\x59\x56\x59\x59\x59\x5b\x5b\x5b\x64\x64\x63\x64\x66\x62\
+\x66\x68\x64\x68\x68\x68\x6a\x6a\x6a\x6a\x6b\x67\x71\x71\x71\x75\
+\x75\x75\x79\x79\x79\x7a\x7a\x7a\x84\x84\x84\x86\x86\x86\x8a\x8a\
+\x8a\x90\x90\x90\x9f\x9f\x9f\xac\xac\xac\xae\xae\xae\xb2\xb2\xb1\
+\xb7\xb8\xb7\xc1\xc1\xc1\xc4\xc5\xc4\xc6\xc6\xc6\xcf\xd0\xcf\xd4\
+\xd4\xd4\xde\xde\xde\xe1\xe1\xe1\xe7\xe7\xe7\xe9\xe9\xe9\xea\xea\
+\xea\xed\xed\xed\xf0\xf0\xf0\xf3\xf3\xf3\xf4\xf4\xf4\xfa\xfa\xfa\
+\xfb\xfb\xfb\xfc\xfc\xfc\x75\x4a\xf7\xaa\x00\x00\x00\x18\x74\x52\
+\x4e\x53\x00\x1f\x1f\x2e\x2e\x3f\x3f\x54\x54\x65\x65\xb8\xca\xca\
+\xd4\xe5\xe5\xe5\xf0\xf0\xf8\xf8\xfd\xfd\x0a\xa9\xac\x9a\x00\x00\
+\x00\x9d\x49\x44\x41\x54\x18\x19\x9d\xc1\x03\x16\x02\x01\x00\x05\
+\xc0\x9f\x6d\xdb\xb6\x6d\xdb\x76\x5b\x7b\xff\x23\x84\x3d\x40\xef\
+\x35\x03\xfc\x89\x2e\x0a\x53\x04\xf8\x62\xca\xea\xe3\x41\xbf\x37\
+\xec\xb4\x7d\xf8\x60\x2b\x8a\x33\x62\x52\x1f\x11\xf3\xa2\x1b\x6f\
+\x5c\x55\xaa\xb6\x7f\xdc\x17\x04\x79\xc9\xd9\x01\xf0\x35\xd1\x4c\
+\xb2\x74\x78\x3c\xc9\x5b\x21\x62\x04\x20\xf1\x47\x42\xc1\xe0\x94\
+\x24\x9f\x53\x8f\x53\x0b\x80\xa7\xb6\x58\x6d\x89\xc3\xf5\x74\x3d\
+\xe6\x74\x3a\xbc\x71\x94\x06\xfd\xf6\xbc\x29\xaf\xcf\x3b\x97\x1e\
+\x1f\x2c\xb9\x23\xbe\xcc\xc7\x2a\xab\x46\xc0\x80\x2f\x86\xd4\x9b\
+\xae\x36\xbb\xad\x6a\xd6\x04\x0a\x4d\x68\xa6\x88\xf1\xdb\x0b\x5c\
+\x72\x1c\x18\xbd\x2b\x0f\x2f\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
 \x00\x00\x03\xd9\
 \x89\
 \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@@ -48518,6 +48616,11 @@
 \x00\x73\
 \x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x5f\x00\x6d\x00\x65\x00\x64\x00\x69\x00\x61\x00\x6d\x00\x61\x00\x6e\x00\x61\x00\x67\
 \x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x1e\
+\x01\x34\xc5\x07\
+\x00\x73\
+\x00\x79\x00\x73\x00\x74\x00\x65\x00\x6d\x00\x5f\x00\x63\x00\x6f\x00\x6e\x00\x66\x00\x69\x00\x67\x00\x75\x00\x72\x00\x65\x00\x5f\
+\x00\x73\x00\x68\x00\x6f\x00\x72\x00\x74\x00\x63\x00\x75\x00\x74\x00\x73\x00\x2e\x00\x70\x00\x6e\x00\x67\
 \x00\x15\
 \x0a\xa4\x46\xa7\
 \x00\x73\
@@ -48543,6 +48646,11 @@
 \x00\x73\
 \x00\x65\x00\x74\x00\x74\x00\x69\x00\x6e\x00\x67\x00\x73\x00\x5f\x00\x70\x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x5f\x00\x6c\
 \x00\x69\x00\x73\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\
+\x00\x12\
+\x0d\x73\x66\x27\
+\x00\x63\
+\x00\x6c\x00\x65\x00\x61\x00\x72\x00\x5f\x00\x73\x00\x68\x00\x6f\x00\x72\x00\x74\x00\x63\x00\x75\x00\x74\x00\x2e\x00\x70\x00\x6e\
+\x00\x67\
 \x00\x17\
 \x09\x41\x2f\xc7\
 \x00\x73\
@@ -48907,113 +49015,115 @@
 
 qt_resource_struct = "\
 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x01\
-\x00\x00\x00\x98\x00\x02\x00\x00\x00\x06\x00\x00\x00\x66\
-\x00\x00\x00\x3a\x00\x02\x00\x00\x00\x04\x00\x00\x00\x62\
-\x00\x00\x00\xf4\x00\x02\x00\x00\x00\x03\x00\x00\x00\x5f\
-\x00\x00\x00\x5e\x00\x02\x00\x00\x00\x10\x00\x00\x00\x4f\
-\x00\x00\x00\x4e\x00\x02\x00\x00\x00\x02\x00\x00\x00\x4d\
-\x00\x00\x00\x84\x00\x02\x00\x00\x00\x09\x00\x00\x00\x44\
-\x00\x00\x00\x14\x00\x02\x00\x00\x00\x0b\x00\x00\x00\x39\
-\x00\x00\x00\xa6\x00\x02\x00\x00\x00\x03\x00\x00\x00\x36\
-\x00\x00\x00\xe2\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x2c\
+\x00\x00\x00\x98\x00\x02\x00\x00\x00\x06\x00\x00\x00\x68\
+\x00\x00\x00\x3a\x00\x02\x00\x00\x00\x04\x00\x00\x00\x64\
+\x00\x00\x00\xf4\x00\x02\x00\x00\x00\x03\x00\x00\x00\x61\
+\x00\x00\x00\x5e\x00\x02\x00\x00\x00\x10\x00\x00\x00\x51\
+\x00\x00\x00\x4e\x00\x02\x00\x00\x00\x02\x00\x00\x00\x4f\
+\x00\x00\x00\x84\x00\x02\x00\x00\x00\x09\x00\x00\x00\x46\
+\x00\x00\x00\x14\x00\x02\x00\x00\x00\x0b\x00\x00\x00\x3b\
+\x00\x00\x00\xa6\x00\x02\x00\x00\x00\x03\x00\x00\x00\x38\
+\x00\x00\x00\xe2\x00\x02\x00\x00\x00\x0c\x00\x00\x00\x2c\
 \x00\x00\x00\x6e\x00\x02\x00\x00\x00\x03\x00\x00\x00\x29\
 \x00\x00\x01\x04\x00\x02\x00\x00\x00\x03\x00\x00\x00\x26\
 \x00\x00\x00\xcc\x00\x02\x00\x00\x00\x06\x00\x00\x00\x20\
 \x00\x00\x00\x26\x00\x02\x00\x00\x00\x04\x00\x00\x00\x1c\
 \x00\x00\x00\x00\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x12\
 \x00\x00\x00\xb8\x00\x02\x00\x00\x00\x02\x00\x00\x00\x10\
-\x00\x00\x05\x20\x00\x00\x00\x00\x00\x01\x00\x05\xce\x8a\
-\x00\x00\x04\xee\x00\x00\x00\x00\x00\x01\x00\x03\x2d\xa8\
-\x00\x00\x0f\x38\x00\x00\x00\x00\x00\x01\x00\x0b\xb1\xbb\
-\x00\x00\x0e\xe8\x00\x00\x00\x00\x00\x01\x00\x0b\xac\x5f\
-\x00\x00\x0f\xd2\x00\x00\x00\x00\x00\x01\x00\x0b\xbb\x7e\
-\x00\x00\x0e\xbe\x00\x00\x00\x00\x00\x01\x00\x0b\xa9\xc1\
-\x00\x00\x0f\xfe\x00\x00\x00\x00\x00\x01\x00\x0b\xbe\xb1\
-\x00\x00\x0f\xa8\x00\x00\x00\x00\x00\x01\x00\x0b\xb9\x06\
-\x00\x00\x0f\x0e\x00\x00\x00\x00\x00\x01\x00\x0b\xaf\x39\
-\x00\x00\x10\x24\x00\x00\x00\x00\x00\x01\x00\x0b\xc1\x85\
-\x00\x00\x0f\x84\x00\x00\x00\x00\x00\x01\x00\x0b\xb6\x09\
-\x00\x00\x0f\x5e\x00\x00\x00\x00\x00\x01\x00\x0b\xb3\xf2\
-\x00\x00\x0c\x4a\x00\x00\x00\x00\x00\x01\x00\x0b\x83\x87\
-\x00\x00\x0c\x7e\x00\x00\x00\x00\x00\x01\x00\x0b\x86\xe9\
-\x00\x00\x0c\xa6\x00\x00\x00\x00\x00\x01\x00\x0b\x89\x87\
-\x00\x00\x0c\xd4\x00\x00\x00\x00\x00\x01\x00\x0b\x8c\x9b\
-\x00\x00\x04\x48\x00\x00\x00\x00\x00\x01\x00\x03\x22\x29\
-\x00\x00\x04\x92\x00\x00\x00\x00\x00\x01\x00\x03\x27\x6d\
-\x00\x00\x03\xfe\x00\x00\x00\x00\x00\x01\x00\x03\x1d\x0f\
-\x00\x00\x04\xbc\x00\x00\x00\x00\x00\x01\x00\x03\x2a\x38\
-\x00\x00\x04\x22\x00\x00\x00\x00\x00\x01\x00\x03\x1f\xb6\
-\x00\x00\x04\x70\x00\x00\x00\x00\x00\x01\x00\x03\x24\xc9\
+\x00\x00\x05\x8c\x00\x00\x00\x00\x00\x01\x00\x05\xd4\x65\
+\x00\x00\x05\x5a\x00\x00\x00\x00\x00\x01\x00\x03\x33\x83\
+\x00\x00\x0f\xa4\x00\x00\x00\x00\x00\x01\x00\x0b\xb7\x96\
+\x00\x00\x0f\x54\x00\x00\x00\x00\x00\x01\x00\x0b\xb2\x3a\
+\x00\x00\x10\x3e\x00\x00\x00\x00\x00\x01\x00\x0b\xc1\x59\
+\x00\x00\x0f\x2a\x00\x00\x00\x00\x00\x01\x00\x0b\xaf\x9c\
+\x00\x00\x10\x6a\x00\x00\x00\x00\x00\x01\x00\x0b\xc4\x8c\
+\x00\x00\x10\x14\x00\x00\x00\x00\x00\x01\x00\x0b\xbe\xe1\
+\x00\x00\x0f\x7a\x00\x00\x00\x00\x00\x01\x00\x0b\xb5\x14\
+\x00\x00\x10\x90\x00\x00\x00\x00\x00\x01\x00\x0b\xc7\x60\
+\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x01\x00\x0b\xbb\xe4\
+\x00\x00\x0f\xca\x00\x00\x00\x00\x00\x01\x00\x0b\xb9\xcd\
+\x00\x00\x0c\xb6\x00\x00\x00\x00\x00\x01\x00\x0b\x89\x62\
+\x00\x00\x0c\xea\x00\x00\x00\x00\x00\x01\x00\x0b\x8c\xc4\
+\x00\x00\x0d\x12\x00\x00\x00\x00\x00\x01\x00\x0b\x8f\x62\
+\x00\x00\x0d\x40\x00\x00\x00\x00\x00\x01\x00\x0b\x92\x76\
+\x00\x00\x04\xb4\x00\x00\x00\x00\x00\x01\x00\x03\x28\x04\
+\x00\x00\x04\xfe\x00\x00\x00\x00\x00\x01\x00\x03\x2d\x48\
+\x00\x00\x04\x6a\x00\x00\x00\x00\x00\x01\x00\x03\x22\xea\
+\x00\x00\x05\x28\x00\x00\x00\x00\x00\x01\x00\x03\x30\x13\
+\x00\x00\x04\x8e\x00\x00\x00\x00\x00\x01\x00\x03\x25\x91\
+\x00\x00\x04\xdc\x00\x00\x00\x00\x00\x01\x00\x03\x2a\xa4\
 \x00\x00\x01\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
 \x00\x00\x01\x84\x00\x00\x00\x00\x00\x01\x00\x00\x05\xe6\
 \x00\x00\x01\x50\x00\x00\x00\x00\x00\x01\x00\x00\x02\xfe\
-\x00\x00\x08\x58\x00\x00\x00\x00\x00\x01\x00\x09\xdd\xa3\
-\x00\x00\x08\x88\x00\x00\x00\x00\x00\x01\x00\x0a\x4c\xe8\
-\x00\x00\x08\xa8\x00\x00\x00\x00\x00\x01\x00\x0a\x53\x99\
+\x00\x00\x08\xc4\x00\x00\x00\x00\x00\x01\x00\x09\xe3\x7e\
+\x00\x00\x08\xf4\x00\x00\x00\x00\x00\x01\x00\x0a\x52\xc3\
+\x00\x00\x09\x14\x00\x00\x00\x00\x00\x01\x00\x0a\x59\x74\
+\x00\x00\x02\x80\x00\x00\x00\x00\x00\x01\x00\x03\x02\x0d\
 \x00\x00\x02\x26\x00\x00\x00\x00\x00\x01\x00\x02\xfd\x0c\
-\x00\x00\x03\xb4\x00\x00\x00\x00\x00\x01\x00\x03\x16\x7a\
+\x00\x00\x04\x20\x00\x00\x00\x00\x00\x01\x00\x03\x1c\x55\
 \x00\x00\x02\x4c\x00\x00\x00\x00\x00\x01\x00\x03\x00\x3d\
-\x00\x00\x03\x1e\x00\x00\x00\x00\x00\x01\x00\x03\x0a\x6d\
-\x00\x00\x03\x80\x00\x00\x00\x00\x00\x01\x00\x03\x12\x9d\
-\x00\x00\x03\x4a\x00\x00\x00\x00\x00\x01\x00\x03\x0f\x79\
-\x00\x00\x03\xda\x00\x00\x00\x00\x00\x01\x00\x03\x19\x5c\
-\x00\x00\x02\x80\x00\x00\x00\x00\x00\x01\x00\x03\x02\x0d\
-\x00\x00\x02\xe6\x00\x00\x00\x00\x00\x01\x00\x03\x07\xf7\
-\x00\x00\x02\xb0\x00\x00\x00\x00\x00\x01\x00\x03\x05\x47\
-\x00\x00\x05\x76\x00\x00\x00\x00\x00\x01\x00\x08\x72\x0a\
-\x00\x00\x05\x96\x00\x00\x00\x00\x00\x01\x00\x08\x75\xe7\
-\x00\x00\x05\x50\x00\x00\x00\x00\x00\x01\x00\x08\x6f\x6c\
-\x00\x00\x0e\x3a\x00\x00\x00\x00\x00\x01\x00\x0b\xa3\x04\
-\x00\x00\x0e\x94\x00\x00\x00\x00\x00\x01\x00\x0b\xa7\xbd\
-\x00\x00\x0d\x20\x00\x00\x00\x00\x00\x01\x00\x0b\x91\x6e\
-\x00\x00\x0d\xac\x00\x00\x00\x00\x00\x01\x00\x0b\x97\xfc\
-\x00\x00\x0e\x16\x00\x00\x00\x00\x00\x01\x00\x0b\x9f\xd1\
-\x00\x00\x0d\x76\x00\x00\x00\x00\x00\x01\x00\x0b\x96\x03\
-\x00\x00\x0d\xd0\x00\x00\x00\x00\x00\x01\x00\x0b\x9a\x8d\
-\x00\x00\x0d\xf2\x00\x00\x00\x00\x00\x01\x00\x0b\x9c\xa0\
-\x00\x00\x0e\x70\x00\x00\x00\x00\x00\x01\x00\x0b\xa4\xec\
-\x00\x00\x0c\xf8\x00\x00\x00\x00\x00\x01\x00\x0b\x8e\xb2\
-\x00\x00\x0d\x54\x00\x00\x00\x00\x00\x01\x00\x0b\x93\x65\
-\x00\x00\x07\xe0\x00\x00\x00\x00\x00\x01\x00\x09\xd7\x31\
-\x00\x00\x07\x64\x00\x00\x00\x00\x00\x01\x00\x09\xcd\xd6\
-\x00\x00\x07\x08\x00\x00\x00\x00\x00\x01\x00\x09\xc8\x14\
-\x00\x00\x07\x92\x00\x00\x00\x00\x00\x01\x00\x09\xd1\x8c\
-\x00\x00\x06\xe0\x00\x00\x00\x00\x00\x01\x00\x09\xc5\x16\
-\x00\x00\x07\x2e\x00\x00\x00\x00\x00\x01\x00\x09\xcb\xab\
-\x00\x00\x07\xba\x00\x00\x00\x00\x00\x01\x00\x09\xd4\xce\
-\x00\x00\x08\x30\x00\x00\x00\x00\x00\x01\x00\x09\xdb\x9d\
-\x00\x00\x08\x08\x00\x00\x00\x00\x00\x01\x00\x09\xd9\x83\
-\x00\x00\x0b\x58\x00\x00\x00\x00\x00\x01\x00\x0b\x72\xdb\
-\x00\x00\x0b\x7c\x00\x00\x00\x00\x00\x01\x00\x0b\x75\xd9\
-\x00\x00\x0b\x34\x00\x00\x00\x00\x00\x01\x00\x0b\x6f\xef\
-\x00\x00\x09\x20\x00\x00\x00\x00\x00\x01\x00\x0b\x38\xb9\
-\x00\x00\x09\x76\x00\x00\x00\x00\x00\x01\x00\x0b\x3e\x1f\
-\x00\x00\x0a\x2e\x00\x00\x00\x00\x00\x01\x00\x0b\x4f\xf0\
-\x00\x00\x09\x96\x00\x00\x00\x00\x00\x01\x00\x0b\x42\x12\
-\x00\x00\x0a\x90\x00\x00\x00\x00\x00\x01\x00\x0b\x60\xae\
-\x00\x00\x09\xea\x00\x00\x00\x00\x00\x01\x00\x0b\x48\xa4\
-\x00\x00\x09\xbc\x00\x00\x00\x00\x00\x01\x00\x0b\x46\x24\
-\x00\x00\x0b\x14\x00\x00\x00\x00\x00\x01\x00\x0b\x6c\xe3\
-\x00\x00\x09\x02\x00\x00\x00\x00\x00\x01\x00\x0b\x36\x17\
-\x00\x00\x09\x48\x00\x00\x00\x00\x00\x01\x00\x0b\x3c\x17\
-\x00\x00\x0a\xba\x00\x00\x00\x00\x00\x01\x00\x0b\x62\xe3\
-\x00\x00\x0a\xe8\x00\x00\x00\x00\x00\x01\x00\x0b\x69\xa1\
-\x00\x00\x08\xde\x00\x00\x00\x00\x00\x01\x00\x0b\x32\x9e\
-\x00\x00\x0a\x0c\x00\x00\x00\x00\x00\x01\x00\x0b\x4c\xa8\
-\x00\x00\x0a\x60\x00\x00\x00\x00\x00\x01\x00\x0b\x57\x06\
+\x00\x00\x03\x60\x00\x00\x00\x00\x00\x01\x00\x03\x0d\xc0\
+\x00\x00\x03\xec\x00\x00\x00\x00\x00\x01\x00\x03\x18\x78\
+\x00\x00\x03\x8c\x00\x00\x00\x00\x00\x01\x00\x03\x12\xcc\
+\x00\x00\x04\x46\x00\x00\x00\x00\x00\x01\x00\x03\x1f\x37\
+\x00\x00\x02\xc2\x00\x00\x00\x00\x00\x01\x00\x03\x05\x60\
+\x00\x00\x03\x28\x00\x00\x00\x00\x00\x01\x00\x03\x0b\x4a\
+\x00\x00\x03\xc2\x00\x00\x00\x00\x00\x01\x00\x03\x15\xf0\
+\x00\x00\x02\xf2\x00\x00\x00\x00\x00\x01\x00\x03\x08\x9a\
+\x00\x00\x05\xe2\x00\x00\x00\x00\x00\x01\x00\x08\x77\xe5\
+\x00\x00\x06\x02\x00\x00\x00\x00\x00\x01\x00\x08\x7b\xc2\
+\x00\x00\x05\xbc\x00\x00\x00\x00\x00\x01\x00\x08\x75\x47\
+\x00\x00\x0e\xa6\x00\x00\x00\x00\x00\x01\x00\x0b\xa8\xdf\
+\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x01\x00\x0b\xad\x98\
+\x00\x00\x0d\x8c\x00\x00\x00\x00\x00\x01\x00\x0b\x97\x49\
+\x00\x00\x0e\x18\x00\x00\x00\x00\x00\x01\x00\x0b\x9d\xd7\
+\x00\x00\x0e\x82\x00\x00\x00\x00\x00\x01\x00\x0b\xa5\xac\
+\x00\x00\x0d\xe2\x00\x00\x00\x00\x00\x01\x00\x0b\x9b\xde\
+\x00\x00\x0e\x3c\x00\x00\x00\x00\x00\x01\x00\x0b\xa0\x68\
+\x00\x00\x0e\x5e\x00\x00\x00\x00\x00\x01\x00\x0b\xa2\x7b\
+\x00\x00\x0e\xdc\x00\x00\x00\x00\x00\x01\x00\x0b\xaa\xc7\
+\x00\x00\x0d\x64\x00\x00\x00\x00\x00\x01\x00\x0b\x94\x8d\
+\x00\x00\x0d\xc0\x00\x00\x00\x00\x00\x01\x00\x0b\x99\x40\
+\x00\x00\x08\x4c\x00\x00\x00\x00\x00\x01\x00\x09\xdd\x0c\
+\x00\x00\x07\xd0\x00\x00\x00\x00\x00\x01\x00\x09\xd3\xb1\
+\x00\x00\x07\x74\x00\x00\x00\x00\x00\x01\x00\x09\xcd\xef\
+\x00\x00\x07\xfe\x00\x00\x00\x00\x00\x01\x00\x09\xd7\x67\
+\x00\x00\x07\x4c\x00\x00\x00\x00\x00\x01\x00\x09\xca\xf1\
+\x00\x00\x07\x9a\x00\x00\x00\x00\x00\x01\x00\x09\xd1\x86\
+\x00\x00\x08\x26\x00\x00\x00\x00\x00\x01\x00\x09\xda\xa9\
+\x00\x00\x08\x9c\x00\x00\x00\x00\x00\x01\x00\x09\xe1\x78\
+\x00\x00\x08\x74\x00\x00\x00\x00\x00\x01\x00\x09\xdf\x5e\
+\x00\x00\x0b\xc4\x00\x00\x00\x00\x00\x01\x00\x0b\x78\xb6\
+\x00\x00\x0b\xe8\x00\x00\x00\x00\x00\x01\x00\x0b\x7b\xb4\
+\x00\x00\x0b\xa0\x00\x00\x00\x00\x00\x01\x00\x0b\x75\xca\
+\x00\x00\x09\x8c\x00\x00\x00\x00\x00\x01\x00\x0b\x3e\x94\
+\x00\x00\x09\xe2\x00\x00\x00\x00\x00\x01\x00\x0b\x43\xfa\
+\x00\x00\x0a\x9a\x00\x00\x00\x00\x00\x01\x00\x0b\x55\xcb\
+\x00\x00\x0a\x02\x00\x00\x00\x00\x00\x01\x00\x0b\x47\xed\
+\x00\x00\x0a\xfc\x00\x00\x00\x00\x00\x01\x00\x0b\x66\x89\
+\x00\x00\x0a\x56\x00\x00\x00\x00\x00\x01\x00\x0b\x4e\x7f\
+\x00\x00\x0a\x28\x00\x00\x00\x00\x00\x01\x00\x0b\x4b\xff\
+\x00\x00\x0b\x80\x00\x00\x00\x00\x00\x01\x00\x0b\x72\xbe\
+\x00\x00\x09\x6e\x00\x00\x00\x00\x00\x01\x00\x0b\x3b\xf2\
+\x00\x00\x09\xb4\x00\x00\x00\x00\x00\x01\x00\x0b\x41\xf2\
+\x00\x00\x0b\x26\x00\x00\x00\x00\x00\x01\x00\x0b\x68\xbe\
+\x00\x00\x0b\x54\x00\x00\x00\x00\x00\x01\x00\x0b\x6f\x7c\
+\x00\x00\x09\x4a\x00\x00\x00\x00\x00\x01\x00\x0b\x38\x79\
+\x00\x00\x0a\x78\x00\x00\x00\x00\x00\x01\x00\x0b\x52\x83\
+\x00\x00\x0a\xcc\x00\x00\x00\x00\x00\x01\x00\x0b\x5c\xe1\
 \x00\x00\x01\xd2\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xd8\
 \x00\x00\x01\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x09\x05\
 \x00\x00\x02\x04\x00\x00\x00\x00\x00\x01\x00\x02\xfa\x36\
-\x00\x00\x0b\x9c\x00\x00\x00\x00\x00\x01\x00\x0b\x78\x5c\
-\x00\x00\x0b\xfe\x00\x00\x00\x00\x00\x01\x00\x0b\x7e\xd2\
-\x00\x00\x0b\xd0\x00\x00\x00\x00\x00\x01\x00\x0b\x7b\xbe\
-\x00\x00\x0c\x26\x00\x00\x00\x00\x00\x01\x00\x0b\x81\x70\
-\x00\x00\x06\x48\x00\x00\x00\x00\x00\x01\x00\x08\xb2\xf5\
-\x00\x00\x05\xe8\x00\x00\x00\x00\x00\x01\x00\x08\x83\xb5\
-\x00\x00\x05\xb8\x00\x00\x00\x00\x00\x01\x00\x08\x79\x21\
-\x00\x00\x06\x18\x00\x00\x00\x00\x00\x01\x00\x08\x98\xea\
-\x00\x00\x06\x78\x00\x00\x00\x00\x00\x01\x00\x08\xb7\x12\
-\x00\x00\x06\xac\x00\x00\x00\x00\x00\x01\x00\x09\x7f\xab\
+\x00\x00\x0c\x08\x00\x00\x00\x00\x00\x01\x00\x0b\x7e\x37\
+\x00\x00\x0c\x6a\x00\x00\x00\x00\x00\x01\x00\x0b\x84\xad\
+\x00\x00\x0c\x3c\x00\x00\x00\x00\x00\x01\x00\x0b\x81\x99\
+\x00\x00\x0c\x92\x00\x00\x00\x00\x00\x01\x00\x0b\x87\x4b\
+\x00\x00\x06\xb4\x00\x00\x00\x00\x00\x01\x00\x08\xb8\xd0\
+\x00\x00\x06\x54\x00\x00\x00\x00\x00\x01\x00\x08\x89\x90\
+\x00\x00\x06\x24\x00\x00\x00\x00\x00\x01\x00\x08\x7e\xfc\
+\x00\x00\x06\x84\x00\x00\x00\x00\x00\x01\x00\x08\x9e\xc5\
+\x00\x00\x06\xe4\x00\x00\x00\x00\x00\x01\x00\x08\xbc\xed\
+\x00\x00\x07\x18\x00\x00\x00\x00\x00\x01\x00\x09\x85\x86\
 "
 
 def qInitResources():

=== modified file 'openlp/core/ui/__init__.py'
--- openlp/core/ui/__init__.py	2010-10-16 22:50:36 +0000
+++ openlp/core/ui/__init__.py	2010-10-28 06:57:50 +0000
@@ -51,6 +51,7 @@
 from aboutform import AboutForm
 from pluginform import PluginForm
 from settingsform import SettingsForm
+from shortcutlistform import ShortcutListForm
 from mediadockmanager import MediaDockManager
 from servicemanager import ServiceManager
 from thememanager import ThemeManager

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2010-10-27 17:42:10 +0000
+++ openlp/core/ui/mainwindow.py	2010-10-28 06:57:50 +0000
@@ -29,10 +29,12 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \
-    ThemeManager, SlideController, PluginForm, MediaDockManager
+    ThemeManager, SlideController, PluginForm, MediaDockManager, \
+    ShortcutListForm
 from openlp.core.lib import RenderManager, build_icon, OpenLPDockWidget, \
     SettingsManager, PluginManager, Receiver, translate
-from openlp.core.utils import AppLocation, add_actions, LanguageManager
+from openlp.core.utils import AppLocation, add_actions, LanguageManager, \
+    ActionList
 
 log = logging.getLogger(__name__)
 
@@ -98,6 +100,12 @@
             self.screens)
         self.LiveController = SlideController(self, self.settingsmanager,
             self.screens, True)
+        previewVisible = QtCore.QSettings().value(
+            u'user interface/preview panel', QtCore.QVariant(True)).toBool()
+        self.PreviewController.Panel.setVisible(previewVisible)
+        liveVisible = QtCore.QSettings().value(u'user interface/live panel',
+            QtCore.QVariant(True)).toBool()
+        self.LiveController.Panel.setVisible(liveVisible)
         # Create menu
         self.MenuBar = QtGui.QMenuBar(MainWindow)
         self.MenuBar.setGeometry(QtCore.QRect(0, 0, 1087, 27))
@@ -177,29 +185,34 @@
         self.FileNewItem = QtGui.QAction(MainWindow)
         self.FileNewItem.setIcon(build_icon(u':/general/general_new.png'))
         self.FileNewItem.setObjectName(u'FileNewItem')
+        MainWindow.actionList.add_action(self.FileNewItem, u'File')
         self.FileOpenItem = QtGui.QAction(MainWindow)
         self.FileOpenItem.setIcon(build_icon(u':/general/general_open.png'))
         self.FileOpenItem.setObjectName(u'FileOpenItem')
+        MainWindow.actionList.add_action(self.FileOpenItem, u'File')
         self.FileSaveItem = QtGui.QAction(MainWindow)
         self.FileSaveItem.setIcon(build_icon(u':/general/general_save.png'))
         self.FileSaveItem.setObjectName(u'FileSaveItem')
+        MainWindow.actionList.add_action(self.FileSaveItem, u'File')
         self.FileSaveAsItem = QtGui.QAction(MainWindow)
         self.FileSaveAsItem.setObjectName(u'FileSaveAsItem')
+        MainWindow.actionList.add_action(self.FileSaveAsItem, u'File')
         self.FileExitItem = QtGui.QAction(MainWindow)
         self.FileExitItem.setIcon(build_icon(u':/system/system_exit.png'))
         self.FileExitItem.setObjectName(u'FileExitItem')
+        MainWindow.actionList.add_action(self.FileExitItem, u'File')
         self.ImportThemeItem = QtGui.QAction(MainWindow)
         self.ImportThemeItem.setObjectName(u'ImportThemeItem')
+        MainWindow.actionList.add_action(self.ImportThemeItem, u'Import')
         self.ImportLanguageItem = QtGui.QAction(MainWindow)
         self.ImportLanguageItem.setObjectName(u'ImportLanguageItem')
+        MainWindow.actionList.add_action(self.ImportLanguageItem, u'Import')
         self.ExportThemeItem = QtGui.QAction(MainWindow)
         self.ExportThemeItem.setObjectName(u'ExportThemeItem')
+        MainWindow.actionList.add_action(self.ExportThemeItem, u'Export')
         self.ExportLanguageItem = QtGui.QAction(MainWindow)
         self.ExportLanguageItem.setObjectName(u'ExportLanguageItem')
-        self.SettingsConfigureItem = QtGui.QAction(MainWindow)
-        self.SettingsConfigureItem.setIcon(
-            build_icon(u':/system/system_settings.png'))
-        self.SettingsConfigureItem.setObjectName(u'SettingsConfigureItem')
+        MainWindow.actionList.add_action(self.ExportLanguageItem, u'Export')
         self.ViewMediaManagerItem = QtGui.QAction(MainWindow)
         self.ViewMediaManagerItem.setCheckable(True)
         self.ViewMediaManagerItem.setChecked(self.MediaManagerDock.isVisible())
@@ -212,6 +225,7 @@
         self.ViewThemeManagerItem.setIcon(
             build_icon(u':/system/system_thememanager.png'))
         self.ViewThemeManagerItem.setObjectName(u'ViewThemeManagerItem')
+        MainWindow.actionList.add_action(self.ViewMediaManagerItem, u'View')
         self.ViewServiceManagerItem = QtGui.QAction(MainWindow)
         self.ViewServiceManagerItem.setCheckable(True)
         self.ViewServiceManagerItem.setChecked(
@@ -219,71 +233,87 @@
         self.ViewServiceManagerItem.setIcon(
             build_icon(u':/system/system_servicemanager.png'))
         self.ViewServiceManagerItem.setObjectName(u'ViewServiceManagerItem')
-        self.SettingsPluginListItem = QtGui.QAction(MainWindow)
-        self.SettingsPluginListItem.setIcon(
-            build_icon(u':/system/settings_plugin_list.png'))
-        self.SettingsPluginListItem.setObjectName(u'SettingsPluginListItem')
-        self.HelpDocumentationItem = QtGui.QAction(MainWindow)
-        self.HelpDocumentationItem.setIcon(
-            build_icon(u':/system/system_help_contents.png'))
-        self.HelpDocumentationItem.setObjectName(u'HelpDocumentationItem')
-        self.HelpDocumentationItem.setEnabled(False)
-        self.HelpAboutItem = QtGui.QAction(MainWindow)
-        self.HelpAboutItem.setIcon(
-            build_icon(u':/system/system_about.png'))
-        self.HelpAboutItem.setObjectName(u'HelpAboutItem')
-        self.HelpOnlineHelpItem = QtGui.QAction(MainWindow)
-        self.HelpOnlineHelpItem.setObjectName(u'HelpOnlineHelpItem')
-        self.HelpOnlineHelpItem.setEnabled(False)
-        self.HelpWebSiteItem = QtGui.QAction(MainWindow)
-        self.HelpWebSiteItem.setObjectName(u'HelpWebSiteItem')
-        #i18n Language Items
-        self.AutoLanguageItem = QtGui.QAction(MainWindow)
-        self.AutoLanguageItem.setObjectName(u'AutoLanguageItem')
-        self.AutoLanguageItem.setCheckable(True)
-        self.LanguageGroup = QtGui.QActionGroup(MainWindow)
-        qmList = LanguageManager.get_qm_list()
-        savedLanguage = LanguageManager.get_language()
-        self.AutoLanguageItem.setChecked(LanguageManager.auto_language)
-        for key in sorted(qmList.keys()):
-            languageItem = QtGui.QAction(MainWindow)
-            languageItem.setObjectName(key)
-            languageItem.setCheckable(True)
-            if qmList[key] == savedLanguage:
-                languageItem.setChecked(True)
-            add_actions(self.LanguageGroup, [languageItem])
-        self.LanguageGroup.setDisabled(LanguageManager.auto_language)
-        self.ToolsAddToolItem = QtGui.QAction(MainWindow)
-        self.ToolsAddToolItem.setIcon(build_icon(u':/tools/tools_add.png'))
-        self.ToolsAddToolItem.setObjectName(u'ToolsAddToolItem')
+        MainWindow.actionList.add_action(self.ViewServiceManagerItem, u'View')
         self.ViewPreviewPanel = QtGui.QAction(MainWindow)
         self.ViewPreviewPanel.setCheckable(True)
-        previewVisible = QtCore.QSettings().value(
-            u'user interface/preview panel', QtCore.QVariant(True)).toBool()
         self.ViewPreviewPanel.setChecked(previewVisible)
         self.ViewPreviewPanel.setObjectName(u'ViewPreviewPanel')
-        self.PreviewController.Panel.setVisible(previewVisible)
+        MainWindow.actionList.add_action(self.ViewPreviewPanel, u'View')
         self.ViewLivePanel = QtGui.QAction(MainWindow)
         self.ViewLivePanel.setCheckable(True)
-        liveVisible = QtCore.QSettings().value(u'user interface/live panel',
-            QtCore.QVariant(True)).toBool()
         self.ViewLivePanel.setChecked(liveVisible)
         self.ViewLivePanel.setObjectName(u'ViewLivePanel')
-        self.LiveController.Panel.setVisible(liveVisible)
+        MainWindow.actionList.add_action(self.ViewLivePanel, u'View')
         self.ModeDefaultItem = QtGui.QAction(MainWindow)
         self.ModeDefaultItem.setCheckable(True)
         self.ModeDefaultItem.setObjectName(u'ModeDefaultItem')
+        MainWindow.actionList.add_action(self.ModeDefaultItem, u'View Mode')
         self.ModeSetupItem = QtGui.QAction(MainWindow)
         self.ModeSetupItem.setCheckable(True)
         self.ModeSetupItem.setObjectName(u'ModeLiveItem')
+        MainWindow.actionList.add_action(self.ModeSetupItem, u'View Mode')
         self.ModeLiveItem = QtGui.QAction(MainWindow)
         self.ModeLiveItem.setCheckable(True)
         self.ModeLiveItem.setObjectName(u'ModeLiveItem')
+        MainWindow.actionList.add_action(self.ModeLiveItem, u'View Mode')
         self.ModeGroup = QtGui.QActionGroup(MainWindow)
         self.ModeGroup.addAction(self.ModeDefaultItem)
         self.ModeGroup.addAction(self.ModeSetupItem)
         self.ModeGroup.addAction(self.ModeLiveItem)
         self.ModeDefaultItem.setChecked(True)
+        self.ToolsAddToolItem = QtGui.QAction(MainWindow)
+        self.ToolsAddToolItem.setIcon(build_icon(u':/tools/tools_add.png'))
+        self.ToolsAddToolItem.setObjectName(u'ToolsAddToolItem')
+        MainWindow.actionList.add_action(self.ToolsAddToolItem, u'Tools')
+        self.SettingsPluginListItem = QtGui.QAction(MainWindow)
+        self.SettingsPluginListItem.setIcon(
+            build_icon(u':/system/settings_plugin_list.png'))
+        self.SettingsPluginListItem.setObjectName(u'SettingsPluginListItem')
+        MainWindow.actionList.add_action(self.SettingsPluginListItem, u'Settings')
+        #i18n Language Items
+        self.AutoLanguageItem = QtGui.QAction(MainWindow)
+        self.AutoLanguageItem.setObjectName(u'AutoLanguageItem')
+        self.AutoLanguageItem.setCheckable(True)
+        MainWindow.actionList.add_action(self.AutoLanguageItem, u'Settings')
+        self.LanguageGroup = QtGui.QActionGroup(MainWindow)
+        qmList = LanguageManager.get_qm_list()
+        savedLanguage = LanguageManager.get_language()
+        self.AutoLanguageItem.setChecked(LanguageManager.auto_language)
+        for key in sorted(qmList.keys()):
+            languageItem = QtGui.QAction(MainWindow)
+            languageItem.setObjectName(key)
+            languageItem.setCheckable(True)
+            if qmList[key] == savedLanguage:
+                languageItem.setChecked(True)
+            add_actions(self.LanguageGroup, [languageItem])
+        self.LanguageGroup.setDisabled(LanguageManager.auto_language)
+        self.SettingsShortcutsItem = QtGui.QAction(MainWindow)
+        self.SettingsShortcutsItem.setIcon(
+            build_icon(u':/system/system_configure_shortcuts.png'))
+        self.SettingsShortcutsItem.setObjectName(u'SettingsShortcutsItem')
+        self.SettingsConfigureItem = QtGui.QAction(MainWindow)
+        self.SettingsConfigureItem.setIcon(
+            build_icon(u':/system/system_settings.png'))
+        self.SettingsConfigureItem.setObjectName(u'SettingsConfigureItem')
+        MainWindow.actionList.add_action(self.SettingsShortcutsItem, u'Settings')
+        self.HelpDocumentationItem = QtGui.QAction(MainWindow)
+        self.HelpDocumentationItem.setIcon(
+            build_icon(u':/system/system_help_contents.png'))
+        self.HelpDocumentationItem.setObjectName(u'HelpDocumentationItem')
+        self.HelpDocumentationItem.setEnabled(False)
+        MainWindow.actionList.add_action(self.HelpDocumentationItem, u'Help')
+        self.HelpAboutItem = QtGui.QAction(MainWindow)
+        self.HelpAboutItem.setIcon(
+            build_icon(u':/system/system_about.png'))
+        self.HelpAboutItem.setObjectName(u'HelpAboutItem')
+        MainWindow.actionList.add_action(self.HelpAboutItem, u'Help')
+        self.HelpOnlineHelpItem = QtGui.QAction(MainWindow)
+        self.HelpOnlineHelpItem.setObjectName(u'HelpOnlineHelpItem')
+        self.HelpOnlineHelpItem.setEnabled(False)
+        MainWindow.actionList.add_action(self.HelpOnlineHelpItem, u'Help')
+        self.HelpWebSiteItem = QtGui.QAction(MainWindow)
+        self.HelpWebSiteItem.setObjectName(u'HelpWebSiteItem')
+        MainWindow.actionList.add_action(self.HelpWebSiteItem, u'Help')
         add_actions(self.FileImportMenu,
             (self.ImportThemeItem, self.ImportLanguageItem))
         add_actions(self.FileExportMenu,
@@ -303,7 +333,7 @@
         add_actions(self.SettingsLanguageMenu, self.LanguageGroup.actions())
         add_actions(self.SettingsMenu, (self.SettingsPluginListItem,
             self.SettingsLanguageMenu.menuAction(), None,
-            self.SettingsConfigureItem))
+            self.SettingsShortcutsItem, self.SettingsConfigureItem))
         add_actions(self.ToolsMenu,
             (self.ToolsAddToolItem, None))
         add_actions(self.HelpMenu,
@@ -394,6 +424,8 @@
             translate('OpenLP.MainWindow', '&Theme'))
         self.ExportLanguageItem.setText(
             translate('OpenLP.MainWindow', '&Language'))
+        self.SettingsShortcutsItem.setText(
+            translate('OpenLP.MainWindow', 'Configure &Shortcuts...'))
         self.SettingsConfigureItem.setText(
             translate('OpenLP.MainWindow', '&Configure OpenLP...'))
         self.ViewMediaManagerItem.setText(
@@ -488,6 +520,8 @@
     """
     log.info(u'MainWindow loaded')
 
+    actionList = ActionList()
+
     def __init__(self, screens, applicationVersion):
         """
         This constructor sets up the interface, the various managers, and the
@@ -495,6 +529,7 @@
         """
         QtGui.QMainWindow.__init__(self)
         self.screens = screens
+        self.actionList = ActionList()
         self.applicationVersion = applicationVersion
         # Set up settings sections for the main application
         # (not for use by plugins)
@@ -506,6 +541,7 @@
         self.settingsmanager = SettingsManager(screens)
         self.aboutForm = AboutForm(self, applicationVersion)
         self.settingsForm = SettingsForm(self.screens, self, self)
+        self.shortcutForm = ShortcutListForm(self)
         self.recentFiles = QtCore.QStringList()
         # Set up the path with plugins
         pluginpath = AppLocation.get_directory(AppLocation.PluginsDir)
@@ -551,7 +587,9 @@
         QtCore.QObject.connect(self.SettingsPluginListItem,
             QtCore.SIGNAL(u'triggered()'), self.onPluginItemClicked)
         QtCore.QObject.connect(self.SettingsConfigureItem,
-            QtCore.SIGNAL(u'triggered()'), self.onOptionsSettingsItemClicked)
+            QtCore.SIGNAL(u'triggered()'), self.onSettingsConfigureItemClicked)
+        QtCore.QObject.connect(self.SettingsShortcutsItem,
+            QtCore.SIGNAL(u'triggered()'), self.onSettingsShortcutsItemClicked)
         QtCore.QObject.connect(self.FileNewItem, QtCore.SIGNAL(u'triggered()'),
             self.ServiceManagerContents.onNewService)
         QtCore.QObject.connect(self.FileOpenItem,
@@ -712,12 +750,18 @@
         self.pluginForm.load()
         self.pluginForm.exec_()
 
-    def onOptionsSettingsItemClicked(self):
+    def onSettingsConfigureItemClicked(self):
         """
         Show the Settings dialog
         """
         self.settingsForm.exec_()
 
+    def onSettingsShortcutsItemClicked(self):
+        """
+        Show the shortcuts dialog
+        """
+        self.shortcutForm.exec_(self.actionList)
+
     def onModeDefaultItemClicked(self):
         """
         Put OpenLP into "Default" view mode.

=== added file 'openlp/core/ui/shortcutlistdialog.py'
--- openlp/core/ui/shortcutlistdialog.py	1970-01-01 00:00:00 +0000
+++ openlp/core/ui/shortcutlistdialog.py	2010-10-28 06:57:50 +0000
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2010 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian      #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble,    #
+# Carsten Tinggaard, Frode Woldsund                                           #
+# --------------------------------------------------------------------------- #
+# 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; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+from PyQt4 import QtCore, QtGui
+
+from openlp.core.lib import translate, build_icon
+
+class Ui_ShortcutListDialog(object):
+    def setupUi(self, shortcutListDialog):
+        shortcutListDialog.setObjectName(u'shortcutListDialog')
+        shortcutListDialog.resize(500, 438)
+        self.shortcutListLayout = QtGui.QVBoxLayout(shortcutListDialog)
+        self.shortcutListLayout.setSpacing(8)
+        self.shortcutListLayout.setMargin(8)
+        self.shortcutListLayout.setObjectName(u'shortcutListLayout')
+        self.shortcutListTreeWidget = QtGui.QTreeWidget(shortcutListDialog)
+        self.shortcutListTreeWidget.setAlternatingRowColors(True)
+        self.shortcutListTreeWidget.setObjectName(u'shortcutListTreeWidget')
+        self.shortcutListTreeWidget.setColumnCount(2)
+        self.shortcutListTreeWidget.setSelectionBehavior(
+            QtGui.QAbstractItemView.SelectRows)
+        #self.shortcutListTreeWidget.setHeaderItem(0, QtGui.QTreeWidgetItem())
+        #self.shortcutListTreeWidget.setHeaderItem(1, QtGui.QTreeWidgetItem())
+        #self.shortcutListTreeWidget.verticalHeader().setVisible(False)
+        self.shortcutListLayout.addWidget(self.shortcutListTreeWidget)
+        self.shortcutLayout = QtGui.QVBoxLayout()
+        self.shortcutLayout.setSpacing(8)
+        self.shortcutLayout.setContentsMargins(0, -1, -1, -1)
+        self.shortcutLayout.setObjectName(u'shortcutLayout')
+        self.defaultRadioButton = QtGui.QRadioButton(shortcutListDialog)
+        self.defaultRadioButton.setChecked(True)
+        self.defaultRadioButton.setObjectName(u'defaultRadioButton')
+        self.shortcutLayout.addWidget(self.defaultRadioButton)
+        self.customShortcutLayout = QtGui.QHBoxLayout()
+        self.customShortcutLayout.setSpacing(8)
+        self.customShortcutLayout.setObjectName(u'customShortcutLayout')
+        self.customRadioButton = QtGui.QRadioButton(shortcutListDialog)
+        self.customRadioButton.setObjectName(u'customRadioButton')
+        self.customShortcutLayout.addWidget(self.customRadioButton)
+        self.shortcutPushButton = QtGui.QPushButton(shortcutListDialog)
+        self.shortcutPushButton.setMinimumSize(QtCore.QSize(84, 0))
+        self.shortcutPushButton.setIcon(
+            build_icon(u':/system/system_configure_shortcuts.png'))
+        self.shortcutPushButton.setCheckable(True)
+        self.shortcutPushButton.setChecked(False)
+        self.shortcutPushButton.setObjectName(u'shortcutPushButton')
+        self.customShortcutLayout.addWidget(self.shortcutPushButton)
+        self.clearShortcutToolButton = QtGui.QToolButton(shortcutListDialog)
+        self.clearShortcutToolButton.setMinimumSize(QtCore.QSize(0, 16))
+        self.clearShortcutToolButton.setText(u'')
+        self.clearShortcutToolButton.setIcon(
+            build_icon(u':/system/clear_shortcut.png'))
+        self.clearShortcutToolButton.setObjectName(u'clearShortcutToolButton')
+        self.customShortcutLayout.addWidget(self.clearShortcutToolButton)
+        self.customShortcutSpacer = QtGui.QSpacerItem(40, 20,
+            QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.customShortcutLayout.addItem(self.customShortcutSpacer)
+        self.shortcutLayout.addLayout(self.customShortcutLayout)
+        self.shortcutListLayout.addLayout(self.shortcutLayout)
+        self.shortcutListButtonBox = QtGui.QDialogButtonBox(shortcutListDialog)
+        self.shortcutListButtonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.shortcutListButtonBox.setStandardButtons(
+            QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok |
+            QtGui.QDialogButtonBox.Reset)
+        self.shortcutListButtonBox.setObjectName(u'shortcutListButtonBox')
+        self.shortcutListLayout.addWidget(self.shortcutListButtonBox)
+
+        self.retranslateUi(shortcutListDialog)
+        QtCore.QObject.connect(
+            self.shortcutListButtonBox,
+            QtCore.SIGNAL(u'accepted()'),
+            shortcutListDialog.accept
+        )
+        QtCore.QObject.connect(
+            self.shortcutListButtonBox,
+            QtCore.SIGNAL(u'rejected()'),
+            shortcutListDialog.reject
+        )
+        QtCore.QMetaObject.connectSlotsByName(shortcutListDialog)
+
+    def retranslateUi(self, shortcutListDialog):
+        shortcutListDialog.setWindowTitle(
+            translate('OpenLP.ShortcutListDialog', 'Customize Shortcuts'))
+        self.shortcutListTreeWidget.setHeaderLabels([
+            translate(u'OpenLP.ShortcutListDialog', 'Action'),
+            translate(u'OpenLP.ShortcutListDialog', 'Shortcut')
+        ])
+        self.defaultRadioButton.setText(
+            translate('OpenLP.ShortcutListDialog', 'Default: %s'))
+        self.customRadioButton.setText(
+            translate('OpenLP.ShortcutListDialog', 'Custom:'))
+        self.shortcutPushButton.setText(
+            translate('OpenLP.ShortcutListDialog', 'None'))

=== added file 'openlp/core/ui/shortcutlistform.py'
--- openlp/core/ui/shortcutlistform.py	1970-01-01 00:00:00 +0000
+++ openlp/core/ui/shortcutlistform.py	2010-10-28 06:57:50 +0000
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2010 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian      #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble,    #
+# Carsten Tinggaard, Frode Woldsund                                           #
+# --------------------------------------------------------------------------- #
+# 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; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+
+import logging
+import re
+
+from PyQt4 import QtCore, QtGui
+
+from openlp.core.utils import translate
+from shortcutlistdialog import Ui_ShortcutListDialog
+
+REMOVE_AMPERSAND = re.compile(r'&{1}')
+
+log = logging.getLogger(__name__)
+
+class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog):
+    """
+    The shortcut list dialog
+    """
+
+    def __init__(self, parent):
+        """
+        Do some initialisation stuff
+        """
+        QtGui.QDialog.__init__(self, parent)
+        self.setupUi(self)
+        self.actionList = None
+        self.captureShortcut = False
+        QtCore.QObject.connect(
+            self.shortcutPushButton,
+            QtCore.SIGNAL(u'toggled(bool)'),
+            self.onShortcutPushButtonClicked
+        )
+
+    def keyReleaseEvent(self, event):
+        Qt = QtCore.Qt
+        if not self.captureShortcut:
+            return
+        key = event.key()
+        if key == Qt.Key_Shift or key == Qt.Key_Control or \
+            key == Qt.Key_Meta or key == Qt.Key_Alt:
+            return
+        key_string = QtGui.QKeySequence(key).toString()
+        if event.modifiers() & Qt.ControlModifier == Qt.ControlModifier:
+            key_string = u'Ctrl+' + key_string
+        if event.modifiers() & Qt.AltModifier == Qt.AltModifier:
+            key_string = u'Alt+' + key_string
+        if event.modifiers() & Qt.ShiftModifier == Qt.ShiftModifier:
+            key_string = u'Shift+' + key_string;
+        key_sequence = QtGui.QKeySequence(key_string)
+        existing_key = QtGui.QKeySequence("Ctrl+Shift+F8")
+        if key_sequence == existing_key:
+            QtGui.QMessageBox.warning(
+                self,
+                translate('OpenLP.ShortcutListDialog', 'Duplicate Shortcut'),
+                unicode(translate('OpenLP.ShortcutListDialog', 'The shortcut '
+                    '"%s" is already assigned to another action, please '
+                    'use a different shortcut.')) % key_sequence.toString(),
+                QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok),
+                QtGui.QMessageBox.Ok
+            )
+        else:
+            self.shortcutPushButton.setText(key_sequence.toString())
+        self.shortcutPushButton.setChecked(False)
+        self.captureShortcut = False
+
+    def exec_(self, actionList):
+        self.actionList = actionList
+        self.refreshActions()
+        return QtGui.QDialog.exec_(self)
+
+    def refreshActions(self):
+        self.shortcutListTreeWidget.clear()
+        for category in self.actionList.categories:
+            item = QtGui.QTreeWidgetItem([category.name])
+            for action in category.actions:
+                actionText = REMOVE_AMPERSAND.sub('', unicode(action.text()))
+                shortcutText = action.shortcut().toString()
+                actionItem = QtGui.QTreeWidgetItem([actionText, shortcutText])
+                actionItem.setIcon(0, action.icon())
+                item.addChild(actionItem)
+            item.setExpanded(True)
+            self.shortcutListTreeWidget.addTopLevelItem(item)
+
+    def onShortcutPushButtonClicked(self, toggled):
+        self.captureShortcut = toggled
+

=== modified file 'openlp/core/utils/__init__.py'
--- openlp/core/utils/__init__.py	2010-09-30 05:04:43 +0000
+++ openlp/core/utils/__init__.py	2010-10-28 06:57:50 +0000
@@ -276,6 +276,7 @@
     return images_filter
 
 from languagemanager import LanguageManager
+from actions import ActionList
 
 __all__ = [u'AppLocation', u'check_latest_version', u'add_actions',
-    u'get_filesystem_encoding', u'LanguageManager']
+    u'get_filesystem_encoding', u'LanguageManager', u'ActionList']

=== added file 'openlp/core/utils/actions.py'
--- openlp/core/utils/actions.py	1970-01-01 00:00:00 +0000
+++ openlp/core/utils/actions.py	2010-10-28 06:57:50 +0000
@@ -0,0 +1,184 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection                                      #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2010 Raoul Snyman                                        #
+# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian      #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble,    #
+# Carsten Tinggaard, Frode Woldsund                                           #
+# --------------------------------------------------------------------------- #
+# 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; version 2 of the License.                              #
+#                                                                             #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
+# more details.                                                               #
+#                                                                             #
+# You should have received a copy of the GNU General Public License along     #
+# with this program; if not, write to the Free Software Foundation, Inc., 59  #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
+###############################################################################
+"""
+The :mod:`~openlp.core.utils.actions` module provides action list classes used
+by the shortcuts system.
+"""
+
+class ActionCategory(object):
+    """
+    The :class:`~openlp.core.utils.ActionCategory` class encapsulates a
+    category for the :class:`~openlp.core.utils.CategoryList` class.
+    """
+    def __init__(self, name, weight=0):
+        self.name = name
+        self.weight = weight
+        self.actions = CategoryActionList()
+
+
+class CategoryActionList(object):
+    """
+    The :class:`~openlp.core.utils.CategoryActionList` class provides a sorted
+    list of actions within a category.
+    """
+    def __init__(self):
+        self.index = 0
+        self.actions = []
+
+    def __getitem__(self, key):
+        for weight, action in self.actions:
+            if action.text() == key:
+                return action
+        raise KeyError(u'Action "%s" does not exist.' % key)
+
+    def __contains__(self, item):
+        return self.has_key(item)
+
+    def __len__(self):
+        return len(self.actions)
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        """
+        Python 3 "next" method.
+        """
+        if self.index >= len(self.actions):
+            raise StopIteration
+        else:
+            self.index += 1
+            return self.actions[self.index - 1][1]
+
+    def next(self):
+        """
+        Python 2 "next" method.
+        """
+        return self.__next__()
+
+    def has_key(key):
+        for weight, action in self.actions:
+            if action.text() == key:
+                return True
+        return False
+
+    def append(self, name):
+        weight = 0
+        if len(self.actions) > 0:
+            weight = self.actions[-1][0] + 1
+        self.add(name, weight)
+
+    def add(self, action, weight=0):
+        self.actions.append((weight, action))
+        self.actions.sort(key=lambda act: act[0])
+
+
+class CategoryList(object):
+    """
+    The :class:`~openlp.core.utils.CategoryList` class encapsulates a category
+    list for the :class:`~openlp.core.utils.ActionList` class and provides an
+    iterator interface for walking through the list of actions in this category.
+    """
+
+    def __init__(self):
+        self.index = 0
+        self.categories = []
+
+    def __getitem__(self, key):
+        for category in self.categories:
+            if category.name == key:
+                return category
+        raise KeyError(u'Category "%s" does not exist.' % key)
+
+    def __contains__(self, item):
+        return self.has_key(item)
+
+    def __len__(self):
+        return len(self.categories)
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        """
+        Python 3 "next" method for iterator.
+        """
+        if self.index >= len(self.categories):
+            raise StopIteration
+        else:
+            self.index += 1
+            return self.categories[self.index - 1]
+
+    def next(self):
+        """
+        Python 2 "next" method for iterator.
+        """
+        return self.__next__()
+
+    def has_key(self, key):
+        for category in self.categories:
+            if category.name == key:
+                return True
+        return False
+
+    def append(self, name, actions=[]):
+        weight = 0
+        if len(self.categories) > 0:
+            weight = self.categories[-1].weight + 1
+        if actions:
+            self.add(name, weight, actions)
+        else:
+            self.add(name, weight)
+
+    def add(self, name, weight=0, actions=[]):
+        category = ActionCategory(name, weight)
+        if actions:
+            for action in actions:
+                if isinstance(action, tuple):
+                    category.actions.add(action[0], action[1])
+                else:
+                    category.actions.append(action)
+        self.categories.append(category)
+        self.categories.sort(key=lambda cat: cat.weight)
+
+
+class ActionList(object):
+    """
+    The :class:`~openlp.core.utils.ActionList` class contains a list of menu
+    actions and categories associated with those actions. Each category also
+    has a weight by which it is sorted when iterating through the list of
+    actions or categories.
+    """
+    def __init__(self):
+        self.categories = CategoryList()
+
+    def add_action(self, action, category=u'Default', weight=None):
+        if category not in self.categories:
+            self.categories.append(category)
+        if weight is None:
+            self.categories[category].actions.append(action)
+        else:
+            self.categories[category].actions.add(action, weight)

=== added file 'resources/forms/shortcutlistdialog.ui'
--- resources/forms/shortcutlistdialog.ui	1970-01-01 00:00:00 +0000
+++ resources/forms/shortcutlistdialog.ui	2010-10-28 06:57:50 +0000
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ShortcutListDialog</class>
+ <widget class="QDialog" name="ShortcutListDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>500</width>
+    <height>438</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="shortcutListLayout">
+   <property name="spacing">
+    <number>8</number>
+   </property>
+   <property name="margin">
+    <number>8</number>
+   </property>
+   <item>
+    <widget class="QTableWidget" name="shortcutListTableWidget">
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <attribute name="verticalHeaderVisible">
+      <bool>false</bool>
+     </attribute>
+     <column>
+      <property name="text">
+       <string>Action</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Shortcut</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="shortcutLayout">
+     <property name="spacing">
+      <number>8</number>
+     </property>
+     <property name="leftMargin">
+      <number>0</number>
+     </property>
+     <item>
+      <widget class="QRadioButton" name="defaultRadioButton">
+       <property name="text">
+        <string>Default: None</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="customShortcutLayout">
+       <property name="spacing">
+        <number>8</number>
+       </property>
+       <item>
+        <widget class="QRadioButton" name="customRadioButton">
+         <property name="text">
+          <string>Custom:</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="shortcutPushButton">
+         <property name="minimumSize">
+          <size>
+           <width>84</width>
+           <height>0</height>
+          </size>
+         </property>
+         <property name="text">
+          <string>None</string>
+         </property>
+         <property name="icon">
+          <iconset resource="../images/openlp-2.qrc">
+           <normaloff>:/system/system_settings.png</normaloff>:/system/system_settings.png</iconset>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+         <property name="checked">
+          <bool>false</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QToolButton" name="clearShortcutToolButton">
+         <property name="minimumSize">
+          <size>
+           <width>0</width>
+           <height>16</height>
+          </size>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="icon">
+          <iconset resource="../images/openlp-2.qrc">
+           <normaloff>:/system/clear_shortcut.png</normaloff>:/system/clear_shortcut.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="customShortcutSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="shortcutListButtonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../images/openlp-2.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>shortcutListButtonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>ShortcutListDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>shortcutListButtonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>ShortcutListDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>

=== added file 'resources/images/clear_shortcut.png'
Binary files resources/images/clear_shortcut.png	1970-01-01 00:00:00 +0000 and resources/images/clear_shortcut.png	2010-10-28 06:57:50 +0000 differ
=== modified file 'resources/images/openlp-2.qrc'
--- resources/images/openlp-2.qrc	2010-09-14 18:18:47 +0000
+++ resources/images/openlp-2.qrc	2010-10-28 06:57:50 +0000
@@ -92,6 +92,7 @@
   </qresource>
   <qresource prefix="system">
     <file>system_close.png</file>
+    <file>clear_shortcut.png</file>
     <file>system_about.png</file>
     <file>system_help_contents.png</file>
     <file>system_mediamanager.png</file>
@@ -101,6 +102,7 @@
     <file>system_exit.png</file>
     <file>settings_plugin_list.png</file>
     <file>system_settings.png</file>
+    <file>system_configure_shortcuts.png</file>
   </qresource>
   <qresource prefix="media">
     <file>media_time.png</file>

=== added file 'resources/images/system_configure_shortcuts.png'
Binary files resources/images/system_configure_shortcuts.png	1970-01-01 00:00:00 +0000 and resources/images/system_configure_shortcuts.png	2010-10-28 06:57:50 +0000 differ

Follow ups