Changeset 132:92f78dc5b965


Ignore:
Timestamp:
04/30/12 10:55:37 (12 years ago)
Author:
István Váradi <ivaradi@…>
Branch:
default
Phase:
public
Message:

Added support for enabling/disabling message types

Location:
src/mlx
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/mlx/config.py

    r131 r132  
    33
    44#-------------------------------------------------------------------------------
     5
     6import const
    57
    68import os
     
    2426    """Our configuration."""
    2527    DEFAULT_UPDATE_URL = "http://mlx.varadiistvan.hu/update"
     28
     29    _messageTypesSection = "messageTypes"
    2630   
    2731    def __init__(self):
     
    3236        self._rememberPassword = False
    3337
     38        self._language = ""
     39        self._flareTimeFromFS = False
     40       
    3441        self._autoUpdate = True       
    3542        self._updateURL = Config.DEFAULT_UPDATE_URL
    36        
    37         self._language = ""
    38         self._flareTimeFromFS = False
    39 
     43
     44        self._messageTypeLevels = {}
     45       
    4046        self._modified = False
    4147
     
    102108            self._modified = True
    103109
     110    def getMessageTypeLevel(self, messageType):
     111        """Get the level for the given message type."""
     112        return self._messageTypeLevels[messageType] \
     113               if messageType in self._messageTypeLevels \
     114               else const.MESSAGELEVEL_NONE
     115
     116    def setMessageTypeLevel(self, messageType, level):
     117        """Set the level of the given message type."""
     118        if messageType not in self._messageTypeLevels or \
     119           self._messageTypeLevels[messageType]!=level:
     120            self._messageTypeLevels[messageType] = level
     121            self._modified = True
     122
    104123    @property
    105124    def autoUpdate(self):
     
    136155                                                  "rememberPassword", False)
    137156
    138         self._autoUpdate = self._getBoolean(config, "update", "auto", True)
    139         self._updateURL = self._get(config, "update", "url",
    140                                     Config.DEFAULT_UPDATE_URL)
    141 
    142157        self._language = self._get(config, "general", "language", "")
    143158        self._flareTimeFromFS = self._getBoolean(config, "general",
    144159                                                 "flareTimeFromFS",
    145160                                                 False)
    146        
     161
     162        self._messageTypeLevels = {}
     163        for messageType in const.messageTypes:
     164            self._messageTypeLevels[messageType] = \
     165                self._getMessageTypeLevel(config, messageType)
     166           
     167        self._autoUpdate = self._getBoolean(config, "update", "auto", True)
     168        self._updateURL = self._get(config, "update", "url",
     169                                    Config.DEFAULT_UPDATE_URL)
     170
    147171        self._modified = False
    148172
     
    160184                   "yes" if self._rememberPassword else "no")
    161185
    162         config.add_section("update")
    163         config.set("update", "auto",
    164                    "yes" if self._autoUpdate else "no")
    165         config.set("update", "url", self._updateURL)
    166 
    167186        config.add_section("general")
    168187        if self._language:
     
    170189        config.set("general", "flareTimeFromFS",
    171190                   "yes" if self._flareTimeFromFS else "no")
    172        
     191
     192        config.add_section(Config._messageTypesSection)
     193        for messageType in const.messageTypes:
     194            if messageType in self._messageTypeLevels:
     195                option = self._getMessageTypeLevelOptionName(messageType)
     196                level = self._messageTypeLevels[messageType]               
     197                config.set(Config._messageTypesSection, option,
     198                           const.messageLevel2string(level))
     199       
     200        config.add_section("update")
     201        config.set("update", "auto",
     202                   "yes" if self._autoUpdate else "no")
     203        config.set("update", "url", self._updateURL)
     204
    173205        try:
    174206            fd = os.open(configPath, os.O_CREAT|os.O_TRUNC|os.O_WRONLY,
     
    194226               else default
    195227
     228    def _getMessageTypeLevel(self, config, messageType):
     229        """Get the message type level for the given message type."""
     230        option = self._getMessageTypeLevelOptionName(messageType)
     231        if config.has_option(Config._messageTypesSection, option):
     232            value = config.get(Config._messageTypesSection, option)
     233            return const.string2messageLevel(value)
     234        else:
     235            return const.MESSAGELEVEL_NONE
     236
     237    def _getMessageTypeLevelOptionName(self, messageType):
     238        """Get the option name for the given message type level."""
     239        return const.messageType2string(messageType)
     240       
    196241    def getLanguage(self):
    197242        """Get the language to be used."""
  • src/mlx/const.py

    r129 r132  
    115115# Flight stage: end
    116116STAGE_END = 12
    117 
    118 #-------------------------------------------------------------------------------
    119 
    120 # Plane status: unknown
    121 PLANE_UNKNOWN = 0
    122 
    123 # Plane status: at home, i.e. LHBP
    124 PLANE_HOME = 1
    125 
    126 # Plane status: away
    127 PLANE_AWAY = 2
    128 
    129 # Plane status: parking
    130 PLANE_PARKING = 3
    131 
    132 #-------------------------------------------------------------------------------
    133 
    134 # Flight type: scheduled
    135 FLIGHTTYPE_SCHEDULED = 0
    136 
    137 # Flight type: old-timer
    138 FLIGHTTYPE_OLDTIMER = 1
    139 
    140 # Flight type: VIP
    141 FLIGHTTYPE_VIP = 2
    142 
    143 # Flight type: charter
    144 FLIGHTTYPE_CHARTER = 3
    145 
    146 #-------------------------------------------------------------------------------
    147 
    148 # Delay code: loading problems
    149 DELAYCODE_LOADING = 0
    150 
    151 # Delay code: VATSIM problem
    152 DELAYCODE_VATSIM = 1
    153 
    154 # Delay code: network problems
    155 DELAYCODE_NETWORK = 2
    156 
    157 # Delay code: controller's fault
    158 DELAYCODE_CONTROLLER = 3
    159 
    160 # Delay code: system crash or freeze
    161 DELAYCODE_SYSTEM = 4
    162 
    163 # Delay code: navigation problem
    164 DELAYCODE_NAVIGATION = 5
    165 
    166 # Delay code: traffic problems
    167 DELAYCODE_TRAFFIC = 6
    168 
    169 # Delay code: apron navigation
    170 DELAYCODE_APRON = 7
    171 
    172 # Delay code: weather problems
    173 DELAYCODE_WEATHER = 8
    174 
    175 # Delay code: personal reasons
    176 DELAYCODE_PERSONAL = 9
    177 
    178 #-------------------------------------------------------------------------------
    179 
    180 # The available gates at LHBP
    181 lhbpGateNumbers = []
    182 
    183 for i in range(1, 7):
    184     lhbpGateNumbers.append(str(i))
    185 
    186 for i in range(10, 19):
    187     lhbpGateNumbers.append(str(i))
    188 
    189 for i in range(24, 28):
    190     lhbpGateNumbers.append(str(i))
    191 
    192 for i in range(31, 39):
    193     lhbpGateNumbers.append(str(i))
    194 
    195 for i in range(42, 47):
    196     lhbpGateNumbers.append(str(i))
    197 
    198 for i in range(60, 84):
    199     if i!=70 and i!=80:
    200         lhbpGateNumbers.append(str(i))
    201117
    202118#-------------------------------------------------------------------------------
     
    221137#-------------------------------------------------------------------------------
    222138
     139# Plane status: unknown
     140PLANE_UNKNOWN = 0
     141
     142# Plane status: at home, i.e. LHBP
     143PLANE_HOME = 1
     144
     145# Plane status: away
     146PLANE_AWAY = 2
     147
     148# Plane status: parking
     149PLANE_PARKING = 3
     150
     151#-------------------------------------------------------------------------------
     152
     153# Flight type: scheduled
     154FLIGHTTYPE_SCHEDULED = 0
     155
     156# Flight type: old-timer
     157FLIGHTTYPE_OLDTIMER = 1
     158
     159# Flight type: VIP
     160FLIGHTTYPE_VIP = 2
     161
     162# Flight type: charter
     163FLIGHTTYPE_CHARTER = 3
     164
     165#-------------------------------------------------------------------------------
     166
     167# Delay code: loading problems
     168DELAYCODE_LOADING = 0
     169
     170# Delay code: VATSIM problem
     171DELAYCODE_VATSIM = 1
     172
     173# Delay code: network problems
     174DELAYCODE_NETWORK = 2
     175
     176# Delay code: controller's fault
     177DELAYCODE_CONTROLLER = 3
     178
     179# Delay code: system crash or freeze
     180DELAYCODE_SYSTEM = 4
     181
     182# Delay code: navigation problem
     183DELAYCODE_NAVIGATION = 5
     184
     185# Delay code: traffic problems
     186DELAYCODE_TRAFFIC = 6
     187
     188# Delay code: apron navigation
     189DELAYCODE_APRON = 7
     190
     191# Delay code: weather problems
     192DELAYCODE_WEATHER = 8
     193
     194# Delay code: personal reasons
     195DELAYCODE_PERSONAL = 9
     196
     197#-------------------------------------------------------------------------------
     198
     199# Message type: logger error
     200MESSAGETYPE_LOGGER_ERROR = 1
     201
     202# Message type: information
     203MESSAGETYPE_INFORMATION = 2
     204
     205# Message type: fault messages
     206MESSAGETYPE_FAULT = 3
     207
     208# Message type: NO-GO fault messages
     209MESSAGETYPE_NOGO = 4
     210
     211# Message type: gate system messages
     212MESSAGETYPE_GATE_SYSTEM = 5
     213
     214# Message type: environment messages
     215MESSAGETYPE_ENVIRONMENT = 6
     216
     217# Message type: help messages
     218MESSAGETYPE_HELP = 7
     219
     220# Message type: visibility messages
     221MESSAGETYPE_VISIBILITY = 8
     222
     223#-------------------------------------------------------------------------------
     224
     225messageTypes = [ MESSAGETYPE_LOGGER_ERROR,
     226                 MESSAGETYPE_INFORMATION,
     227                 MESSAGETYPE_FAULT,
     228                 MESSAGETYPE_NOGO,
     229                 MESSAGETYPE_GATE_SYSTEM,
     230                 MESSAGETYPE_ENVIRONMENT,
     231                 MESSAGETYPE_HELP,
     232                 MESSAGETYPE_VISIBILITY ]
     233
     234#-------------------------------------------------------------------------------
     235
     236_messageTypeStrings = { MESSAGETYPE_LOGGER_ERROR : "loggerError",
     237                        MESSAGETYPE_INFORMATION : "information",
     238                        MESSAGETYPE_FAULT : "fault",
     239                        MESSAGETYPE_NOGO : "nogo",
     240                        MESSAGETYPE_GATE_SYSTEM : "gateSystem",
     241                        MESSAGETYPE_ENVIRONMENT : "environment",
     242                        MESSAGETYPE_HELP : "help",
     243                        MESSAGETYPE_VISIBILITY : "visibility" }
     244
     245def messageType2string(messageType):
     246    """Get the string equivalent of the given message type."""
     247    return _messageTypeStrings[messageType] \
     248           if messageType in _messageTypeStrings else None   
     249
     250#-------------------------------------------------------------------------------
     251
     252# Message display level: none
     253MESSAGELEVEL_NONE = 0
     254
     255# Message display level: only message in the simulator
     256MESSAGELEVEL_FS = 1
     257
     258# Message display level: only sound
     259MESSAGELEVEL_SOUND = 2
     260
     261# Message display level: both
     262MESSAGELEVEL_BOTH = 3
     263
     264#-------------------------------------------------------------------------------
     265
     266messageLevels = [ MESSAGELEVEL_NONE,
     267                  MESSAGELEVEL_FS,
     268                  MESSAGELEVEL_SOUND,
     269                  MESSAGELEVEL_BOTH ]
     270
     271#-------------------------------------------------------------------------------
     272
     273_messageLevelStrings = { MESSAGELEVEL_NONE : "none",
     274                         MESSAGELEVEL_FS : "fs",
     275                         MESSAGELEVEL_SOUND : "sound",
     276                         MESSAGELEVEL_BOTH : "both" }
     277
     278def messageLevel2string(messageLevel):
     279    """Get the string equivalent of the given message level."""
     280    return _messageLevelStrings[messageLevel] \
     281           if messageLevel in _messageLevelStrings else None   
     282
     283def string2messageLevel(str):
     284    """Get the message level for the given string."""
     285    for (value, s) in _messageLevelStrings.iteritems():
     286        if str==s:
     287            return value
     288    return MESSAGELEVEL_NONE
     289
     290#-------------------------------------------------------------------------------
     291
     292# The available gates at LHBP
     293lhbpGateNumbers = []
     294
     295for i in range(1, 7):
     296    lhbpGateNumbers.append(str(i))
     297
     298for i in range(10, 19):
     299    lhbpGateNumbers.append(str(i))
     300
     301for i in range(24, 28):
     302    lhbpGateNumbers.append(str(i))
     303
     304for i in range(31, 39):
     305    lhbpGateNumbers.append(str(i))
     306
     307for i in range(42, 47):
     308    lhbpGateNumbers.append(str(i))
     309
     310for i in range(60, 84):
     311    if i!=70 and i!=80:
     312        lhbpGateNumbers.append(str(i))
     313
     314#-------------------------------------------------------------------------------
     315
    223316languages = ["$system", "en_GB", "hu_HU"]
     317
  • src/mlx/gui/common.py

    r127 r132  
    3333    DIALOG_MODAL = gtk.DIALOG_MODAL
    3434    WRAP_WORD = gtk.WRAP_WORD
     35    JUSTIFY_CENTER = gtk.JUSTIFY_CENTER
    3536
    3637    def text2unicode(text):
     
    5960    DIALOG_MODAL = gtk.DialogFlags.MODAL
    6061    WRAP_WORD = gtk.WrapMode.WORD
     62    JUSTIFY_CENTER = gtk.Justification.CENTER
    6163
    6264    import codecs
  • src/mlx/gui/prefs.py

    r131 r132  
    3737        notebook.append_page(general, label)
    3838
     39        messages = self._buildMessages()
     40        label = gtk.Label(xstr("prefs_tab_messages"))
     41        label.set_use_underline(True)
     42        label.set_tooltip_text(xstr("prefs_tab_message_tooltip"))
     43        notebook.append_page(messages, label)
     44
    3945        advanced = self._buildAdvanced()
    4046        label = gtk.Label(xstr("prefs_tab_advanced"))
     
    6268        self._setLanguage(config.language)
    6369        self._flareTimeFromFS.set_active(config.flareTimeFromFS)
     70
     71        for messageType in const.messageTypes:
     72            level = config.getMessageTypeLevel(messageType)
     73            button = self._msgFSCheckButtons[messageType]
     74            button.set_active(level == const.MESSAGELEVEL_FS or
     75                              level == const.MESSAGELEVEL_BOTH)
     76            button = self._msgSoundCheckButtons[messageType]
     77            button.set_active(level == const.MESSAGELEVEL_SOUND or
     78                              level == const.MESSAGELEVEL_BOTH)
    6479
    6580        self._togglingAutoUpdate = True
     
    7590        config.language = self._getLanguage()
    7691        config.flareTimeFromFS = self._flareTimeFromFS.get_active()
     92
     93        for messageType in const.messageTypes:
     94            fsButtonActive = self._msgFSCheckButtons[messageType].get_active()
     95            soundButtonActive = self._msgSoundCheckButtons[messageType].get_active()
     96            if fsButtonActive:
     97                level = const.MESSAGELEVEL_BOTH if soundButtonActive \
     98                        else const.MESSAGELEVEL_FS
     99            elif soundButtonActive:
     100                level = const.MESSAGELEVEL_SOUND
     101            else:
     102                level = const.MESSAGELEVEL_NONE
     103            config.setMessageTypeLevel(messageType, level)
     104
    77105        config.autoUpdate = self._autoUpdate.get_active()
    78106        config.updateURL = self._updateURL.get_text()
     
    155183            self._warnedRestartNeeded = True
    156184
     185    def _buildMessages(self):
     186        """Build the page for the message settings."""
     187
     188        mainAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.0,
     189                                      xscale = 0.0, yscale = 0.0)
     190        mainAlignment.set_padding(padding_top = 16, padding_bottom = 8,
     191                                  padding_left = 4, padding_right = 4)
     192        mainBox = gtk.VBox()
     193        mainAlignment.add(mainBox)
     194
     195        table = gtk.Table(len(const.messageTypes) + 1, 3)
     196        table.set_row_spacings(8)
     197        table.set_col_spacings(32)
     198        table.set_homogeneous(False)
     199        mainBox.pack_start(table, False, False, 4)
     200       
     201        label = gtk.Label(xstr("prefs_msgs_fs"))
     202        label.set_justify(JUSTIFY_CENTER)
     203        label.set_alignment(0.5, 1.0)
     204        table.attach(label, 1, 2, 0, 1)
     205       
     206        label = gtk.Label(xstr("prefs_msgs_sound"))
     207        label.set_justify(JUSTIFY_CENTER)
     208        label.set_alignment(0.5, 1.0)
     209        table.attach(label, 2, 3, 0, 1)
     210
     211        self._msgFSCheckButtons = {}
     212        self._msgSoundCheckButtons = {}       
     213        row = 1
     214        for messageType in const.messageTypes:
     215            messageTypeStr = const.messageType2string(messageType)
     216            label = gtk.Label(xstr("prefs_msgs_type_" + messageTypeStr))
     217            label.set_justify(JUSTIFY_CENTER)
     218            label.set_use_underline(True)
     219            label.set_alignment(0.5, 0.5)
     220            table.attach(label, 0, 1, row, row+1)
     221
     222            fsCheckButton = gtk.CheckButton()
     223            alignment = gtk.Alignment(xscale = 0.0, yscale = 0.0,
     224                                      xalign = 0.5, yalign = 0.5)
     225            alignment.add(fsCheckButton)
     226            table.attach(alignment, 1, 2, row, row+1)
     227            self._msgFSCheckButtons[messageType] = fsCheckButton
     228           
     229            soundCheckButton = gtk.CheckButton()
     230            alignment = gtk.Alignment(xscale = 0.0, yscale = 0.0,
     231                                      xalign = 0.5, yalign = 0.5)
     232            alignment.add(soundCheckButton)
     233            table.attach(alignment, 2, 3, row, row+1)           
     234            self._msgSoundCheckButtons[messageType] = soundCheckButton
     235
     236            mnemonicWidget = gtk.Label("")
     237            table.attach(mnemonicWidget, 3, 4, row, row+1)
     238            label.set_mnemonic_widget(mnemonicWidget)
     239            mnemonicWidget.connect("mnemonic-activate",
     240                                   self._msgLabelActivated,
     241                                   messageType)
     242
     243            row += 1
     244
     245        return mainAlignment
     246
     247    def _msgLabelActivated(self, button, cycle_group, messageType):
     248        """Called when the mnemonic of a label is activated.
     249
     250        It cycles the corresponding options."""
     251        fsCheckButton = self._msgFSCheckButtons[messageType]
     252        soundCheckButton = self._msgSoundCheckButtons[messageType]
     253
     254        num = 1 if fsCheckButton.get_active() else 0
     255        num += 2 if soundCheckButton.get_active() else 0
     256        num += 1
     257
     258        fsCheckButton.set_active((num&0x01)==0x01)
     259        soundCheckButton.set_active((num&0x02)==0x02)
     260
     261        return True
     262           
    157263    def _buildAdvanced(self):
    158264        """Build the page for the advanced settings."""
  • src/mlx/i18n.py

    r131 r132  
    543543        self.add("prefs_tab_general", "_General")
    544544        self.add("prefs_tab_general_tooltip", "General preferences")
     545        self.add("prefs_tab_messages", "_Messages")
     546        self.add("prefs_tab_message_tooltip",
     547                 "Enable/disable message notifications in FS and/or by sound")
    545548        self.add("prefs_tab_advanced", "_Advanced")
    546549        self.add("prefs_tab_advanced_tooltip",
     
    577580                 "The URL from which to download the updates. Change this "
    578581                 "only if you know what you are doing!")
     582
     583        # A C G M O S
     584       
     585        self.add("prefs_msgs_fs", "Displayed in FS")
     586        self.add("prefs_msgs_sound", "Sound alert")
     587        self.add("prefs_msgs_type_loggerError", "Logger _Error Messages")
     588        self.add("prefs_msgs_type_information",
     589                 "_Information Messages\n(e.g. flight status)")
     590        self.add("prefs_msgs_type_fault",
     591                 "_Fault Messages\n(e.g. strobe light fault)")
     592        self.add("prefs_msgs_type_nogo",
     593                 "_NOGO Fault messages\n(e.g. MTOW NOGO)")
     594        self.add("prefs_msgs_type_gateSystem",
     595                 "Ga_te System Messages\n(e.g. available gates)")
     596        self.add("prefs_msgs_type_environment",
     597                 "Envi_ronment Messages\n(e.g. \"welcome to XY aiport\")")
     598        self.add("prefs_msgs_type_help",
     599                 "_Help Messages\n(e.g. \"don't forget to set VREF\")")
     600        self.add("prefs_msgs_type_visibility",
     601                 "_Visibility Messages")
    579602
    580603#------------------------------------------------------------------------------
     
    10141037        self.add("prefs_tab_general", "_Általános")
    10151038        self.add("prefs_tab_general_tooltip", "Általános beállítások")
    1016         self.add("prefs_tab_advanced", "_Haladó")
     1039        self.add("prefs_tab_messages", "_Üzenetek")
     1040        self.add("prefs_tab_message_tooltip",
     1041                 "A szimulátorba és/vagy hangjelzés általi üzenetküldés be- "
     1042                 "és kikapcsolása")
     1043        self.add("prefs_tab_advanced", "H_aladó")
    10171044        self.add("prefs_tab_advanced_tooltip",
    10181045                 "Haladó beállítások: óvatosan módosítsd őket!")
     
    10491076                 "változtasd meg, ha biztos vagy a dolgodban!")
    10501077
     1078        # A Á H M O Ü
     1079
     1080        self.add("prefs_msgs_fs", "Szimulátorban\nmegjelenítés")
     1081        self.add("prefs_msgs_sound", "Hangjelzés")
     1082        self.add("prefs_msgs_type_loggerError", "_Logger hibaüzenetek")
     1083        self.add("prefs_msgs_type_information",
     1084                 "_Információs üzenetek\n(pl. a repülés fázisa)")
     1085        self.add("prefs_msgs_type_fault",
     1086                 "Hi_baüzenetek\n(pl. a villogó fény hiba)")
     1087        self.add("prefs_msgs_type_nogo",
     1088                 "_NOGO hibaüzenetek\n(pl. MTOW NOGO)")
     1089        self.add("prefs_msgs_type_gateSystem",
     1090                 "_Kapukezelő rendszer üzenetei\n(pl. a szabad kapuk listája)")
     1091        self.add("prefs_msgs_type_environment",
     1092                 "Kö_rnyezeti üzenetek\n(pl. \"welcome to XY aiport\")")
     1093        self.add("prefs_msgs_type_help",
     1094                 "_Segítő üzenetek\n(pl. \"don't forget to set VREF\")")
     1095        self.add("prefs_msgs_type_visibility",
     1096                 "Lá_tótávolság üzenetek")
     1097
    10511098#------------------------------------------------------------------------------
    10521099
Note: See TracChangeset for help on using the changeset viewer.