Changeset 166:e4ba22b7a13b


Ignore:
Timestamp:
05/10/12 18:17:18 (12 years ago)
Author:
István Váradi <ivaradi@…>
Branch:
default
hg-Phase:
(<MercurialRepository 1 'hg:/home/ivaradi/mlx/hg' '/'>, 'public')
Message:

The configuration loading/saving and the basic GUI for the sound preferences work

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • MLXMANIFEST

    r158 r166  
    33library/encodings/euc_jis_2004.pyc      1694    e12bbd059d4fd595cf4be5440ab439c2
    44library/fnmatch.pyc     3414    4d50000f78e903598af06ef1c5cfb3ef
    5 library/gtk/_gtk.pyc    549     324e9bf59f307c6f34abcd2e105af2a6
     5library/gtk/_gtk.pyc    549     cce831fbbce661780e4aa4aee4005355
    66library/encodings/cp858.pyc     7591    02054a0b8e91b9758826eb70cddf096f
    77library/encodings/cp1254.pyc    2678    17ff2ac86f90886d5c73ed789f0499f3
     
    1212library/unittest/signals.pyc    2126    d574469ae3f8e3c3c6054c48e8ff6fe1
    1313library/pdb.pyc 41336   cca4477d622e897335b3f0cecb667ff4
    14 runmlx.exe      64000   8bcbc8f4c68b590c5ef010ad9580e1aa
     14runmlx.exe      64000   488633e152c81c000e315cd0d74d6474
    1515library/xml/sax/xmlreader.pyc   17862   0362ded7016d21cdd85aea1170ebdda1
    1616library/encodings/latin_1.pyc   2111    52427573ccbfd06220b67d5a9dd1376e
     
    5858library/encodings/koi8_r.pyc    2700    fff1b35002b9e938b7ea6fd0fbe824ae
    5959library/mlx/gui/statusbar.pyc   4616    2909310114db08ca8d3162e70ef22519
    60 library/mlx/const.pyc   4972    de3904c521b27597d548bbc96ff14050
    61 library/mlx/fsuipc.pyc  53293   3e9f6032fd366882d0982f6fe4f48418
     60library/mlx/const.pyc   4972    8b05e5b96077ed4c99eebd228f48db69
     61library/mlx/fsuipc.pyc  53402   5c12463c240c8e90844490a9ff850168
    6262library/encodings/punycode.pyc  7570    335ff94e207934ae64e6f5fc07a5cacc
    6363library/encodings/shift_jisx0213.pyc    1710    1ec0383aafb1dcadb5f9b6afff16eb7f
     
    9595library/encodings/iso2022_jp_2004.pyc   1723    66376e788f3819e781897268c1100986
    9696library/encodings/cp866.pyc     8103    f36418dcf93b17b3ced63bd544f44159
    97 library/gio/_gio.pyc    549     b623cbe0dd5f229d582bb55841557361
     97library/gio/_gio.pyc    549     014ddc5612d5ab5e06a303cfa0bcf0e9
    9898library/encodings/cp437.pyc     7874    63f1278c0a66129c6fb4f504d6b61b66
    9999library/mimetools.pyc   7837    c9accd6ef795bf71c90630be0161cadc
     
    123123library/encodings/cp864.pyc     7999    ca90afae086cb6b8f69b8419cc3cd1cb
    124124library/pyexpat.pyd     152576  5a82e9ec95005aca6130751e5b961cc3
    125 library/pyexpat.pyc     546     e0bf8ea119e513f8a72142c6d04852e7
     125library/pyexpat.pyc     546     28db9f4e93d106aa021b40423032f06b
    126126library/unittest/loader.pyc     10884   591a785be23fba35582ce33bdd3d7acd
    127127library/ftplib.pyc      32043   5a1925388a0874e459aed6891f4cf0c1
     
    130130library/unittest/suite.pyc      9838    bf2c79bd4a6b6032f1ea53fa4908748f
    131131library/encodings/mac_arabic.pyc        7824    820deef79b02e1f7e52eb18e9be655bf
    132 library/mlx/gui/prefs.pyc       13030   3c3d1fe199deb11859b67dc920c0e13d
     132library/mlx/gui/prefs.pyc       13053   0d5dbe8afbb8fab7b2be1840781e8db2
    133133library/encodings/tis_620.pyc   2748    5969b4db4f967b11ae7992cdfbf5890e
    134134library/encodings/cp855.pyc     8071    0a4259ba854c24186f2ce61d85883b4a
     
    157157library/encodings/iso8859_10.pyc        2693    5e6cc8f721486ddbc1c99da285e13191
    158158library/mlx/config.pyc  12010   7a138f5b96c513912e8e0686f5c5fbaa
    159 library/atk.pyc 534     fa86d691ae7b8d042fd5b3c33549cabe
     159library/atk.pyc 534     fe3e307a78a9cc4bce684d7bdf816dff
    160160library/gio._gio.pyd    263168  acb8c95fdc391079bebdf7d8685b0dbc
    161161library/encodings/cp861.pyc     7868    c97a8970ce4d9f40cbafbea6576fbdca
     
    174174library/encodings/iso8859_6.pyc 2723    c8f9aa14a6a2ebf05d977317114bc65d
    175175library/libpango-1.0-0.dll      333729  5a14efd93ee27cfe960220fe4a904911
    176 library/mlx/gui/gui.pyc 36341   6eeaa07fcbd8a89bf7e598087c666ee1
     176library/mlx/gui/gui.pyc 36364   2050500c35abdb515d17daf894d29320
    177177library/stat.pyc        2503    d3b6dc7a54e705219f04d0be75a212de
    178 library/gobject/_gobject.pyc    573     a37d7d8cb4f70b0f09ab615b993ea70c
     178library/gobject/_gobject.pyc    573     891881fc921b55eb6436b850d5bf668a
    179179library/encodings/utf_7.pyc     1747    2beeb059236527197d6c640396476ce8
    180180library/atexit.pyc      2083    595a09be339c73c3c02e378d99325d2a
     
    184184library/encodings/iso8859_1.pyc 2678    f09ec3b7f6a348cbd7f7286b60572bd0
    185185library/pangocairo.pyd  17920   5fc69a7d29a6d3127710c64de440daa4
    186 library/pangocairo.pyc  555     9a662f4c2634358c694d6833a0553304
     186library/pangocairo.pyc  555     f23a6733ab8c9132c1c6791714240df2
    187187library/sre.pyc 499     92bb633daa0bab6550ec0e3677673b5b
    188188library/tokenize.pyc    13565   354d02cd79df187a28c1851a1e3bad96
    189 library/mlx/gui/flight.pyc      85395   f5ec8303901df37eedc2c0667a087c07
     189library/mlx/gui/flight.pyc      85418   86f3c4ba458413deabd618aa67421374
    190190library/lib/gtk-2.0/2.10.0/engines/libwimp.dll  97984   a5bbbe46e1363aba9020a76f2d58e9d6
    191191library/email/quoprimime.pyc    8590    f6c7a8ad81d44037dd074f4871053dab
     
    195195library/gtk._gtk.pyd    1882624 bbb1d1e41bbebc6abf69bed719d50497
    196196library/_hashlib.pyd    287232  a1a18de0644f481749fcbcf26005eeaf
    197 library/_hashlib.pyc    549     b44386b428f16d1b172e6b57cbc6e8de
     197library/_hashlib.pyc    549     b0f9228e2299a7272830effaa43a4377
    198198library/copy.pyc        11674   30d1745c5e38ab170f8a0486fbebf305
    199199library/unittest/result.pyc     7444    aefbb3cc79c0ff17787ce84faed7f5e8
     
    207207library/ctypes/__init__.pyc     18846   2bd183962453ae93d6887b303d3fd338
    208208library/mlx/acars.pyc   1690    06ac9e4ad5cc96b831a3c69868e6145a
    209 library/cairo/_cairo.pyc        561     5785a244ecd7cfe65c2a27738ab4de48
     209library/cairo/_cairo.pyc        561     6622b2b68a65815534f741644f28467a
    210210library/warnings.pyc    12666   9788b5f45765e8204e04c820f2711094
    211211library/encodings/iso2022_jp_1.pyc      1699    faed9d5747e982cec9fa8b3ad8e1de26
     
    225225library/bz2.pyd 76800   1ca9ececd2c84b80996fe632627f857f
    226226library/encodings/iso8859_16.pyc        2695    85e819a29dec2b601ce978dcd5a040fc
    227 library/bz2.pyc 534     96169408e5e34b63e6395ee84d6400de
     227library/bz2.pyc 534     2dacc1f67ce6f4b8bef18fddbc30c9de
    228228library/email/utils.pyc 8840    a7be428df6fddee6121cfce55382d1f8
    229 library/_ssl.pyc        537     daeef57719226ef9d0bc44ad8a6b06ed
     229library/_ssl.pyc        537     a5ad680df66cce9aa48b31a6396e6d12
    230230library/encodings/cp1250.pyc    2676    c92e287a2aa6a1c924df287d826aa3b7
    231231library/_ssl.pyd        720896  90826a140137efd0d806038828e16f8e
    232 library/pango.pyc       540     1e5a976d1817680edb7c1c21ff48892d
     232library/pango.pyc       540     e3fcfc3d867e92c2c7416ef6dc684d58
    233233library/glib/__init__.pyc       187     d44c8c2772b263a36726ac0dcfc04b42
    234234library/pango.pyd       111616  c934763bdf125c3dc92b56db817001d4
    235235library/libgobject-2.0-0.dll    341594  356d697647a480562c4e2e921b13f8ed
    236 mlxupdate.exe   19456   d8eadc14204f8dd84f8ac703de608f02
     236mlxupdate.exe   19456   e4a2240eacdc2647c90656899310c6f8
    237237library/email/errors.pyc        3229    cdb78ab237e195ad69f059128bc03b1d
    238238library/linecache.pyc   3091    666e6f81b0ea9a7637f8068493f738d5
     
    250250library/encodings/mbcs.pyc      1883    2213911a7dd0deada6799b63e18b695b
    251251library/unicodedata.pyd 688128  c856c31a03dc892e4f2aee93d0bfee44
    252 library/unicodedata.pyc 558     b025c9579740ae143839a018b5da0e79
     252library/unicodedata.pyc 558     4289806e666e46e891fceb60a20b894e
    253253library/encodings/cp1256.pyc    2675    c1bf26ed9c9b5ee0eec495138993cffb
    254254library/email/base64mime.pyc    5221    c536d6f0c03f029bba77f15ef6ba3d99
     
    309309library/encodings/koi8_u.pyc    2686    b7e5a52eaaaf6b340075b40dc7596f42
    310310library/atk.pyd 208384  ebe7f0929eac23a3205d17d69906e172
    311 library/_ctypes.pyc     546     9f86310b686c3061d75bdd32ec1f4ff8
     311library/_ctypes.pyc     546     3b2a84ea4d020180b585c738bf78cec1
    312312library/mlx/update.pyc  16214   1927a43ac4580370198b6d2f091f835f
    313313library/subprocess.pyc  38648   c9f749db06dfc9fb32079de51d6efd01
    314314library/encodings/utf_16_le.pyc 1854    dfa68705c26fd303adfc7ce3322166f2
    315315library/_socket.pyd     38400   5d273be76603399e88cf57f2605004bf
    316 library/_socket.pyc     546     ba16b5802151bed5e05fe83d11f2b92c
     316library/_socket.pyc     546     7b1bd8f25e4e763ce7a2163c657aa4d3
    317317library/encodings/hex_codec.pyc 3520    a8b8d5b7c8810379c7007bcbc253951c
    318318library/tempfile.pyc    18526   e2cc2d63c29e15f20ee9325e790643a3
    319 library/glib/_glib.pyc  555     6157f7df91d682da07475a99f05d19b2
    320 library/win32api.pyc    549     d33834386641fd02adce67fe64a1cd2a
     319library/glib/_glib.pyc  555     b1fd18ba441a3ec8e55f93ebe9aa659a
     320library/win32api.pyc    549     3228c4576e9659f1af7ff11114e2a90c
    321321library/encodings/iso8859_13.pyc        2696    f901ae0bbcfbb78f0c1783e89b2e2dc5
    322322library/zlib1.dll       100352  d90dad5eea33a178bac56fff2847d4c2
     
    330330library/xml/sax/saxutils.pyc    12382   32ed045b3b520234ebea6a508a6569fe
    331331library/encodings/mac_turkish.pyc       2739    1682e228ddfd2e74e3ccaee0b65e7261
    332 library/mlx/pyuipc_sim.pyc      43532   fe15a7610a4058a4059a09bb2e91bccf
     332library/mlx/pyuipc_sim.pyc      43607   eecadfd81467b977dc4a4ae2b05c487f
    333333library/encodings/cp875.pyc     2636    c72faa5d1cb6105ae81c971448fea479
    334334library/socket.pyc      15488   35f8eb455d6d8df8e19826d1dd7193f2
    335 library/select.pyc      543     bde5d0dccea956e8408f692d35755f8b
     335library/select.pyc      543     7c963d4085711e3cb6cb745bf936ef58
    336336library/encodings/iso2022_jp.pyc        1683    40c2b92127f99452f84b250c2b4b2cda
    337337library/libgthread-2.0-0.dll    44287   7ad6f303082b382bff7bafbab246c61f
    338338library/select.pyd      11776   d90bf525f9f6c9c3aa6532fa6e569b4f
    339 library/pyuipc.pyc      543     96b93d674c4f8ee6a8feac09af40b25f
     339library/pyuipc.pyc      543     2d50c10362e28900a8761a170f9c5061
    340340library/pyuipc.pyd      129220  58cdce7763687f456383c93fd3404d9f
    341341library/encodings/johab.pyc     1638    5346c11a863ffbcfb21aba8f1d2236b7
  • notes.txt

    r107 r166  
    4141        Alt+K: Kapuk
    4242       
     43-------------------------------------------------------------------------------
     44
     45Sounds
     46------
     47
     48- sikoly.mp3: vs<-6000 | vs>6000, and is not playing
     49
     50- board.mp3: stage==BOARDING, not played yet, and pilot either pressed
     51  hot key, or !pilotControlsSounds and 10s after the start of the boarding
     52
     53- malev.mp3: stage==PUSHANDTAXI, pilotControlsSounds && hotkey ||
     54  !pilotControlsSounds && gs>5,
     55  played only when board.mp3 was finished (if started at all),
     56  followed by XXXtaxi.mp3, when finished
     57
     58- cpt_takeoff.mp3: stage==TAKEOFF && (langingLights on || gs>80)
     59
     60- TOC.mp3: stage==CRUISE && (pilotControlsSounds && hotkey ||
     61                             !pilotControlsSounds)
     62
     63- TOD.mp3: stage==DESCEND && (pilotControlsSounds && hotkey ||
     64                              !pilotControlsSounds && altitude<15000)
     65
     66- TaxiAfterLand.mp3: stage==TAXIAFTERLAND && (pilotControlsSounds && hotkey ||
     67                                              !pilotControlsSounds && timeSinceStage>10)
     68
     69- (notnormal.mp3): approachCallouts && stage in [DESCEND, LANDING, TAXIAFTERLAND] &&
     70                   gs<40 && flown distance<0.404
     71
     72- (2500.mp3): approachCallouts && stage in [DESCEND, LANDING, TAXIAFTERLAND] &&
     73              radioAltitude<2500
     74
     75- (700.mp3): approachCallouts && stage in [DESCEND, LANDING, TAXIAFTERLAND] &&
     76              radioAltitude<700
     77
     78- (1200.mp3): approachCallouts && stage in [DESCEND, LANDING, TAXIAFTERLAND] &&
     79              radioAltitude<1200
     80
     81- (1800.mp3): approachCallouts && stage in [DESCEND, LANDING, TAXIAFTERLAND] &&
     82              radioAltitude<1800
     83
     84- (500.mp3): approachCallouts && stage in [DESCEND, LANDING, TAXIAFTERLAND] &&
     85             radioAltitude<500
     86
     87- (200.mp3): approachCallouts && stage in [DESCEND, LANDING, TAXIAFTERLAND] &&
     88             radioAltitude<200
     89
     90- (20.mp3): approachCallouts && stage in [DESCEND, LANDING, TAXIAFTERLAND] &&
     91            radioAltitude<500
     92
     93- (atTD.mp3): approachCallouts && stage in [DESCEND, LANDING, TAXIAFTERLAND] &&
     94              isOnTheGround
     95
     96- taps.mp3: 2 sec after touchdown, if T/D rate<150
     97
     98- cpt_landing.mp3: ????
     99
     100- notam.mp3: when the briefing window is displayed for the first time
     101
     102- notify.wav: for VISIBILITY message if sounds are enabled for that
     103
     104- speed.mp3: stage==LANDING, spoiler moves, speedbrake sound selected
     105
     106- Checklists:
     107  - there are directories named checklist_<type>
     108  - each directory contains a file named checklist.txt which is a list of
     109    the sound files comprising the check list
     110  - if a check list set is enabled and selected, its items are played
     111    on-by-one as the second hot key is pressed
     112
     113 
  • src/mlx/config.py

    r156 r166  
    2020    _languageMap = { "en_GB" : "eng",
    2121                     "hu_HU" : "hun" }
     22
     23#-------------------------------------------------------------------------------
     24
     25class Hotkey(object):
     26    """A hotkey."""
     27    def __init__(self, ctrl = False, shift = False, key = "0"):
     28        """Construct the hotkey."""
     29        self.ctrl = ctrl
     30        self.shift = shift
     31        self.key = key
     32
     33    def set(self, s):
     34        """Set the hotkey from the given string."""
     35        self.ctrl = "C" in s[:-1]
     36        self.shift = "S" in s[:-1]
     37        self.key = s[-1]
     38
     39    def __eq__(self, other):
     40        """Check if the given hotkey is equal to the other one."""
     41        return self.ctrl == other.ctrl and self.shift == other.shift and \
     42               self.key == other.key
     43
     44    def __str__(self):
     45        """Construct the hotkey to a string."""
     46        s = ""
     47        if self.ctrl: s += "C"
     48        if self.shift: s += "S"
     49        s += self.key
     50        return s
    2251
    2352#-------------------------------------------------------------------------------
     
    4473
    4574        self._pirepDirectory = None
    46        
     75
     76        self._enableSounds = True
     77
     78        self._pilotControlsSounds = True
     79        self._pilotHotkey = Hotkey(ctrl = True, shift = False, key = "0")
     80
     81        #self._approachCallOuts = False
     82        self._speedbrakeAtTD = True
     83
     84        self._enableChecklists = False
     85        self._checklistHotkey = Hotkey(ctrl = True, shift = True, key = "0")
     86               
    4787        self._autoUpdate = True       
    4888        self._updateURL = Config.DEFAULT_UPDATE_URL
     
    196236           self._messageTypeLevels[messageType]!=level:
    197237            self._messageTypeLevels[messageType] = level
     238            self._modified = True
     239
     240    @property
     241    def enableSounds(self):
     242        """Get whether background sounds are enabled."""
     243        return self._enableSounds
     244
     245    @enableSounds.setter
     246    def enableSounds(self, enableSounds):
     247        """Set whether background sounds are enabled."""
     248        if enableSounds!=self._enableSounds:
     249            self._enableSounds = enableSounds
     250            self._modified = True
     251
     252    @property
     253    def pilotControlsSounds(self):
     254        """Get whether the pilot controls the background sounds."""
     255        return self._pilotControlsSounds
     256
     257    @pilotControlsSounds.setter
     258    def pilotControlsSounds(self, pilotControlsSounds):
     259        """Set whether the pilot controls the background sounds."""
     260        if pilotControlsSounds!=self._pilotControlsSounds:
     261            self._pilotControlsSounds = pilotControlsSounds
     262            self._modified = True
     263
     264    @property
     265    def pilotHotkey(self):
     266        """Get the pilot's hotkey."""
     267        return self._pilotHotkey
     268
     269    @pilotHotkey.setter
     270    def pilotHotkey(self, pilotHotkey):
     271        """Set the pilot's hotkey."""
     272        if pilotHotkey!=self._pilotHotkey:
     273            self._pilotHotkey = pilotHotkey
     274            self._modified = True
     275
     276    # @property
     277    # def approachCallOuts(self):
     278    #     """Get whether the approach callouts should be played."""
     279    #     return self._approachCallOuts
     280
     281    # @approachCallOuts.setter
     282    # def approachCallOuts(self, approachCallOuts):
     283    #     """Set whether the approach callouts should be played."""
     284    #     if approachCallOuts!=self._approachCallOuts:
     285    #         self._approachCallOuts = approachCallOuts
     286    #         self._modified = True
     287
     288    @property
     289    def speedbrakeAtTD(self):
     290        """Get whether the speedbrake sounds should be played at touchdown."""
     291        return self._speedbrakeAtTD
     292
     293    @speedbrakeAtTD.setter
     294    def speedbrakeAtTD(self, speedbrakeAtTD):
     295        """Set whether the speedbrake sounds should be played at touchdown."""
     296        if speedbrakeAtTD!=self._speedbrakeAtTD:
     297            self._speedbrakeAtTD = speedbrakeAtTD
     298            self._modified = True
     299       
     300    @property
     301    def enableChecklists(self):
     302        """Get whether aircraft-specific checklists should be played."""
     303        return self._enableChecklists
     304
     305    @enableChecklists.setter
     306    def enableChecklists(self, enableChecklists):
     307        """Get whether aircraft-specific checklists should be played."""
     308        if enableChecklists!=self._enableChecklists:
     309            self._enableChecklists = enableChecklists
     310            self._modified = True
     311
     312    @property
     313    def checklistHotkey(self):
     314        """Get the checklist hotkey."""
     315        return self._checklistHotkey
     316
     317    @checklistHotkey.setter
     318    def checklistHotkey(self, checklistHotkey):
     319        """Set the checklist hotkey."""
     320        if checklistHotkey!=self._checklistHotkey:
     321            self._checklistHotkey = checklistHotkey
    198322            self._modified = True
    199323
     
    254378            self._messageTypeLevels[messageType] = \
    255379                self._getMessageTypeLevel(config, messageType)
     380
     381        self._enableSounds = self._getBoolean(config, "sounds",
     382                                              "enable", True)
     383        self._pilotControlsSounds = self._getBoolean(config, "sounds",
     384                                                     "pilotControls", True)
     385        self._pilotHotkey.set(self._get(config, "sounds",
     386                                        "pilotHotkey", "C0"))
     387        #self._approachCallOuts = self._getBoolean(config, "sounds",
     388        #                                          "approachCallOuts", False)
     389        self._speedbrakeAtTD = self._getBoolean(config, "sounds",
     390                                                "speedbrakeAtTD", True)
     391
     392        self._enableChecklists = self._getBoolean(config, "sounds",
     393                                                  "enableChecklists", False)
     394        self._checklistHotkey.set(self._get(config, "sounds",
     395                                            "checklistHotkey", "CS0"))
    256396           
    257397        self._autoUpdate = self._getBoolean(config, "update", "auto", True)
     
    298438                config.set(Config._messageTypesSection, option,
    299439                           const.messageLevel2string(level))
     440
     441        config.add_section("sounds")
     442        config.set("sounds", "enable",
     443                   "yes" if self._enableSounds else "no")
     444        config.set("sounds", "pilotControls",
     445                   "yes" if self._pilotControlsSounds else "no")
     446        config.set("sounds", "pilotHotkey", str(self._pilotHotkey))
     447        #config.set("sounds", "approachCallOuts",
     448        #           "yes" if self._approachCallOuts else "no")
     449        config.set("sounds", "speedbrakeAtTD",
     450                   "yes" if self._speedbrakeAtTD else "no")
     451
     452        config.set("sounds", "enableChecklists",
     453                   "yes" if self._enableChecklists else "no")
     454        config.set("sounds", "checklistHotkey",
     455                   str(self._checklistHotkey))
    300456       
    301457        config.add_section("update")
  • src/mlx/gui/prefs.py

    r164 r166  
    77from mlx.i18n import xstr
    88import mlx.const as const
     9import mlx.config as config
    910
    1011import urlparse
     12
     13#------------------------------------------------------------------------------
     14
     15class Hotkey(gtk.HBox):
     16    """A widget to handle a hotkey."""
     17    def __init__(self, labelText, tooltips):
     18        """Construct the hotkey widget.
     19
     20        labelText is the text for the label before the hotkey.
     21
     22        The tooltips parameter is an array of the tooltips for:
     23        - the hotkey combo box,
     24        - the control check box, and
     25        - the shift check box."""
     26        super(Hotkey, self).__init__()
     27       
     28        label = gtk.Label(labelText)
     29        label.set_use_underline(True)
     30        labelAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
     31                                       xscale = 0.0, yscale = 0.0)
     32        labelAlignment.add(label)
     33        self.pack_start(labelAlignment, False, False, 8)
     34
     35        self._ctrl = gtk.CheckButton("Ctrl")
     36        self._ctrl.set_tooltip_text(tooltips[1])
     37        self.pack_start(self._ctrl, False, False, 4)
     38           
     39        self._shift = gtk.CheckButton("Shift")
     40        self._shift.set_tooltip_text(tooltips[2])
     41        self.pack_start(self._shift, False, False, 4)
     42
     43        self._hotkeyModel = gtk.ListStore(str)
     44        for keyCode in range(ord("0"), ord("9")) + range(ord("A"), ord("Z")):
     45            self._hotkeyModel.append([chr(keyCode)])
     46
     47        self._hotkey = gtk.ComboBox(model = self._hotkeyModel)
     48        cell = gtk.CellRendererText()
     49        self._hotkey.pack_start(cell, True)
     50        self._hotkey.add_attribute(cell, 'text', 0)
     51        self._hotkey.set_tooltip_text(tooltips[0])
     52        self.pack_start(self._hotkey, False, False, 4)
     53
     54        self._setting = False
     55
     56    def set(self, hotkey):
     57        """Set the hotkey widget from the given hotkey."""
     58        self._setting = True
     59
     60        self._ctrl.set_active(hotkey.ctrl)
     61        self._shift.set_active(hotkey.shift)
     62
     63        hotkeyModel = self._hotkeyModel
     64        iter = hotkeyModel.get_iter_first()
     65        while iter is not None and \
     66              hotkeyModel.get_value(iter, 0)!=hotkey.key:
     67            iter = hotkeyModel.iter_next(iter)
     68
     69        if iter is None:
     70            iter = hotkeyModel.get_iter_first()
     71
     72        self._hotkey.set_active_iter(iter)           
     73       
     74        self._setting = False
     75
     76    def get(self):
     77        """Get a hotkey corresponding to the settings in the widghet."""
     78
     79        key = self._hotkeyModel.get_value(self._hotkey.get_active_iter(), 0)
     80
     81        return config.Hotkey(ctrl = self._ctrl.get_active(),
     82                             shift = self._shift.get_active(),
     83                             key = key)
    1184
    1285#------------------------------------------------------------------------------
     
    2598       
    2699        self._gui = gui
     100        self._settingFromConfig = False
    27101
    28102        contentArea = self.get_content_area()
     
    42116        label.set_tooltip_text(xstr("prefs_tab_message_tooltip"))
    43117        notebook.append_page(messages, label)
     118
     119        sounds = self._buildSounds()
     120        label = gtk.Label(xstr("prefs_tab_sounds"))
     121        label.set_use_underline(True)
     122        label.set_tooltip_text(xstr("prefs_tab_sounds_tooltip"))
     123        notebook.append_page(sounds, label)
    44124
    45125        advanced = self._buildAdvanced()
     
    66146    def _fromConfig(self, config):
    67147        """Setup the dialog from the given configuration."""
     148        self._settingFromConfig = True
     149
    68150        self._setLanguage(config.language)
    69151        self._hideMinimizedWindow.set_active(config.hideMinimizedWindow)
     
    86168                              level == const.MESSAGELEVEL_BOTH)
    87169
    88         self._togglingAutoUpdate = True
     170        self._enableSounds.set_active(config.enableSounds)
     171        self._pilotControlsSounds.set_active(config.pilotControlsSounds)
     172        self._pilotHotkey.set(config.pilotHotkey)
     173        #self._approachCallOuts.set_active(config.approachCallOuts)
     174        self._speedbrakeAtTD.set_active(config.speedbrakeAtTD)
     175
     176        self._enableChecklists.set_active(config.enableChecklists)       
     177        self._checklistHotkey.set(config.checklistHotkey)
     178
    89179        self._autoUpdate.set_active(config.autoUpdate)
    90         self._togglingAutoUpdate = False
    91180        if not config.autoUpdate:
    92181            self._warnedAutoUpdate = True
    93182
    94183        self._updateURL.set_text(config.updateURL)
     184
     185        self._settingFromConfig = False
    95186
    96187    def _toConfig(self, config):
     
    115206                level = const.MESSAGELEVEL_NONE
    116207            config.setMessageTypeLevel(messageType, level)
     208
     209        config.enableSounds = self._enableSounds.get_active()
     210        config.pilotControlsSounds = self._pilotControlsSounds.get_active()
     211        config.pilotHotkey = self._pilotHotkey.get()
     212        #config.approachCallOuts = self._approachCallOuts.get_active()
     213        config.speedbrakeAtTD = self._speedbrakeAtTD.get_active()
     214
     215        config.enableChecklists = self._enableChecklists.get_active()
     216        config.checklistHotkey = self._checklistHotkey.get()
    117217
    118218        config.autoUpdate = self._autoUpdate.get_active()
     
    330430
    331431        return True
    332            
     432
     433    def _buildSounds(self):
     434        """Build the page for the sounds."""
     435        mainAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.0,
     436                                      xscale = 1.0, yscale = 1.0)
     437        mainAlignment.set_padding(padding_top = 8, padding_bottom = 8,
     438                                  padding_left = 4, padding_right = 4)
     439
     440        mainBox = gtk.VBox()
     441        mainAlignment.add(mainBox)
     442
     443        backgroundFrame = gtk.Frame(label = xstr("prefs_sounds_frame_bg"))
     444        mainBox.pack_start(backgroundFrame, False, False, 4)
     445
     446        backgroundAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.0,
     447                                            xscale = 1.0, yscale = 0.0)
     448        backgroundAlignment.set_padding(padding_top = 4, padding_bottom = 4,
     449                                        padding_left = 4, padding_right = 4)
     450        backgroundFrame.add(backgroundAlignment)
     451
     452        backgroundBox = gtk.VBox()
     453        backgroundAlignment.add(backgroundBox)
     454
     455        self._enableSounds = gtk.CheckButton(xstr("prefs_sounds_enable"))
     456        self._enableSounds.set_use_underline(True)
     457        self._enableSounds.set_tooltip_text(xstr("prefs_sounds_enable_tooltip"))
     458        self._enableSounds.connect("toggled", self._enableSoundsToggled)
     459        alignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
     460                                  xscale = 1.0, yscale = 0.0)
     461        alignment.add(self._enableSounds)
     462        backgroundBox.pack_start(alignment, False, False, 4)
     463
     464        self._pilotControlsSounds = gtk.CheckButton(xstr("prefs_sounds_pilotControls"))
     465        self._pilotControlsSounds.set_use_underline(True)
     466        self._pilotControlsSounds.set_tooltip_text(xstr("prefs_sounds_pilotControls_tooltip"))
     467        backgroundBox.pack_start(self._pilotControlsSounds, False, False, 4)
     468
     469        self._pilotHotkey = Hotkey(xstr("prefs_sounds_pilotHotkey"),
     470                                   [xstr("prefs_sounds_pilotHotkey_tooltip"),
     471                                    xstr("prefs_sounds_pilotHotkeyCtrl_tooltip"),
     472                                    xstr("prefs_sounds_pilotHotkeyShift_tooltip")])
     473       
     474        backgroundBox.pack_start(self._pilotHotkey, False, False, 4)
     475
     476        # self._approachCallOuts = gtk.CheckButton(xstr("prefs_sounds_approachCallOuts"))
     477        # self._approachCallOuts.set_use_underline(True)
     478        # self._approachCallOuts.set_tooltip_text(xstr("prefs_sounds_approachCallOuts_tooltip"))
     479        # backgroundBox.pack_start(self._approachCallOuts, False, False, 4)
     480       
     481        self._speedbrakeAtTD = gtk.CheckButton(xstr("prefs_sounds_speedbrakeAtTD"))
     482        self._speedbrakeAtTD.set_use_underline(True)
     483        self._speedbrakeAtTD.set_tooltip_text(xstr("prefs_sounds_speedbrakeAtTD_tooltip"))
     484        backgroundBox.pack_start(self._speedbrakeAtTD, False, False, 4)
     485
     486        checklistFrame = gtk.Frame(label = xstr("prefs_sounds_frame_checklists"))
     487        mainBox.pack_start(checklistFrame, False, False, 4)
     488
     489        checklistAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.0,
     490                                           xscale = 1.0, yscale = 0.0)
     491        checklistAlignment.set_padding(padding_top = 4, padding_bottom = 4,
     492                                       padding_left = 4, padding_right = 4)
     493        checklistFrame.add(checklistAlignment)
     494
     495        checklistBox = gtk.VBox()
     496        checklistAlignment.add(checklistBox)
     497       
     498        self._enableChecklists = gtk.CheckButton(xstr("prefs_sounds_enableChecklists"))
     499        self._enableChecklists.set_use_underline(True)
     500        self._enableChecklists.set_tooltip_text(xstr("prefs_sounds_enableChecklists_tooltip"))
     501        self._enableChecklists.connect("toggled", self._enableChecklistsToggled)
     502        checklistBox.pack_start(self._enableChecklists, False, False, 4)
     503
     504        self._checklistHotkey = Hotkey(xstr("prefs_sounds_checklistHotkey"),
     505                                       [xstr("prefs_sounds_checklistHotkey_tooltip"),
     506                                        xstr("prefs_sounds_checklistHotkeyCtrl_tooltip"),
     507                                        xstr("prefs_sounds_checklistHotkeyShift_tooltip")])
     508
     509        checklistBox.pack_start(self._checklistHotkey, False, False, 4)
     510
     511        self._enableSoundsToggled(self._enableSounds)
     512        self._enableChecklistsToggled(self._enableChecklists)
     513
     514        return mainAlignment
     515
     516    def _enableSoundsToggled(self, button):
     517        """Called when the enable sounds button is toggled."""
     518        active = button.get_active()
     519        self._pilotControlsSounds.set_sensitive(active)
     520        self._pilotHotkey.set_sensitive(active)
     521        #self._approachCallOuts.set_sensitive(active)
     522        self._speedbrakeAtTD.set_sensitive(active)
     523
     524    def _enableChecklistsToggled(self, button):
     525        """Called when the enable checklists button is toggled."""
     526        active = button.get_active()
     527        self._checklistHotkey.set_sensitive(active)
     528
    333529    def _buildAdvanced(self):
    334530        """Build the page for the advanced settings."""
     
    348544        self._autoUpdate.set_tooltip_text(xstr("prefs_update_auto_tooltip"))
    349545        self._warnedAutoUpdate = False
    350         self._togglingAutoUpdate = False
    351546       
    352547        updateURLBox = gtk.HBox()
     
    379574    def _autoUpdateToggled(self, button):
    380575        """Called when the auto update check button is toggled."""
    381         if not self._togglingAutoUpdate and not self._warnedAutoUpdate and \
     576        if not self._settingFromConfig and not self._warnedAutoUpdate and \
    382577           not self._autoUpdate.get_active():
    383578            dialog = gtk.MessageDialog(parent = self,
  • src/mlx/i18n.py

    r155 r166  
    568568        self.add("prefs_tab_message_tooltip",
    569569                 "Enable/disable message notifications in FS and/or by sound")
     570        self.add("prefs_tab_sounds", "_Sounds")
     571        self.add("prefs_tab_sounds_tooltip",
     572                 "Preferences regarding what sounds should be played during the various flight stages")
    570573        self.add("prefs_tab_advanced", "_Advanced")
    571574        self.add("prefs_tab_advanced_tooltip",
     
    604607                 "from timestamps returned by the simulator.")
    605608        self.add("prefs_syncFSTime",
    606                  "_Synchronize the time in FS with the computer's clock")
     609                 "S_ynchronize the time in FS with the computer's clock")
    607610        self.add("prefs_syncFSTime_tooltip",
    608611                 "If this is checked the flight simulator's internal clock "
     
    615618        self.add("prefs_pirepDirectory_browser_title",
    616619                 "Select PIREP directory")
     620
     621        self.add("prefs_sounds_frame_bg", "Background")
     622        self.add("prefs_sounds_enable",
     623                 "_Enable background sounds")
     624        self.add("prefs_sounds_enable_tooltip",
     625                 "If the background sounds are enabled, the logger "
     626                 "can play different pre-recorded sounds during the "
     627                 "various stages of the flight.")
     628        self.add("prefs_sounds_pilotControls",
     629                 "_Pilot controls the sounds")
     630        self.add("prefs_sounds_pilotControls_tooltip",
     631                 "If checked, the background sounds can be started by the "
     632                 "pilot by pressing the hotkey specified below. Otherwise "
     633                 "the sounds will start automatically when certain "
     634                 "conditions hold.")
     635        self.add("prefs_sounds_pilotHotkey",
     636                 "_Hotkey:")
     637        self.add("prefs_sounds_pilotHotkey_tooltip",
     638                 "The key to press possibly together with modifiers to play "
     639                 "the sound relevant to the current flight status.")
     640        self.add("prefs_sounds_pilotHotkeyCtrl_tooltip",
     641                 "If checked, the Ctrl key should be pressed together with the "
     642                 "main key.")
     643        self.add("prefs_sounds_pilotHotkeyShift_tooltip",
     644                 "If checked, the Shift key should be pressed together with the "
     645                 "main key.")
     646        self.add("prefs_sounds_approachCallOuts",
     647                 "Enable approach callouts")
     648        self.add("prefs_sounds_approachCallOuts_tooltip",
     649                 "If checked, the approach callouts will be played at "
     650                 "certain altitudes.")
     651        self.add("prefs_sounds_speedbrakeAtTD",
     652                 "Enable speed_brake sound at touchdown")
     653        self.add("prefs_sounds_speedbrakeAtTD_tooltip",
     654                 "If checked, a speedbrake sound will be played after "
     655                 "touchdown, when the speedbrakes deploy.")
     656        self.add("prefs_sounds_frame_checklists", "Checklists")
     657        self.add("prefs_sounds_enableChecklists",
     658                 "E_nable aircraft-specific checklists")
     659        self.add("prefs_sounds_enableChecklists_tooltip",
     660                 "If checked, the program will play back pre-recorded "
     661                 "aircraft-specific checklists at the pilot's discretion.")
     662        self.add("prefs_sounds_checklistHotkey",
     663                 "Checklist hot_key:")
     664        self.add("prefs_sounds_checklistHotkey_tooltip",
     665                 "The key to press possibly together with modifiers to play the next "
     666                 "checklist item.")
     667        self.add("prefs_sounds_checklistHotkeyCtrl_tooltip",
     668                 "If checked, the Ctrl key should be pressed together with the "
     669                 "main key.")
     670        self.add("prefs_sounds_checklistHotkeyShift_tooltip",
     671                 "If checked, the Shift key should be pressed together with the "
     672                 "main key.")
     673       
    617674        self.add("prefs_update_auto", "Update the program auto_matically")
    618675        self.add("prefs_update_auto_tooltip",
Note: See TracChangeset for help on using the changeset viewer.