Ignore:
Timestamp:
05/05/12 11:02:52 (12 years ago)
Author:
István Váradi <ivaradi@…>
Branch:
default
Phase:
public
Message:

Added support for saving and loading PIREPs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/mlx/gui/gui.py

    r148 r151  
    1919import mlx.web as web
    2020from  mlx.i18n import xstr
     21from mlx.pirep import PIREP
    2122
    2223import time
     
    6162        self._stdioText = ""
    6263
     64        self._sendPIREPCallback = None
     65
    6366        self.webHandler = web.Handler()
    6467        self.webHandler.start()
     
    145148        self._busyCursor = gdk.Cursor(gdk.CursorType.WATCH if pygobject
    146149                                      else gdk.WATCH)
     150
     151        self._loadPIREPDialog = None
     152        self._lastLoadedPIREP = None
    147153
    148154    @property
     
    730736        menuBar.append(fileMenuItem)
    731737
     738        loadPIREPMenuItem = gtk.ImageMenuItem(gtk.STOCK_OPEN)
     739        loadPIREPMenuItem.set_use_stock(True)
     740        loadPIREPMenuItem.set_label(xstr("menu_file_loadPIREP"))
     741        loadPIREPMenuItem.add_accelerator("activate", accelGroup,
     742                                          ord(xstr("menu_file_loadPIREP_key")),
     743                                          CONTROL_MASK, ACCEL_VISIBLE)
     744        loadPIREPMenuItem.connect("activate", self._loadPIREP)
     745        fileMenu.append(loadPIREPMenuItem)
     746
     747        fileMenu.append(gtk.SeparatorMenuItem())
     748
    732749        quitMenuItem = gtk.ImageMenuItem(gtk.STOCK_QUIT)
    733750        quitMenuItem.set_use_stock(True)
     
    865882            else:
    866883                simulator.disableTimeSync()
     884
     885    def _loadPIREP(self, menuItem):
     886        """Load a PIREP for sending."""
     887        dialog = self._getLoadPirepDialog()
     888
     889        if self._lastLoadedPIREP:
     890            dialog.set_current_folder(os.path.dirname(self._lastLoadedPIREP))
     891        else:
     892            pirepDirectory = self.config.pirepDirectory
     893            if pirepDirectory is not None:
     894                dialog.set_current_folder(pirepDirectory)
     895       
     896        result = dialog.run()
     897        dialog.hide()
     898
     899        if result==RESPONSETYPE_OK:
     900            self._lastLoadedPIREP = dialog.get_filename()
     901
     902            pirep = PIREP.load(self._lastLoadedPIREP)
     903            if pirep is None:
     904                dialog = gtk.MessageDialog(parent = self._mainWindow,
     905                                           type = MESSAGETYPE_ERROR,
     906                                           message_format = xstr("loadPIREP_failed"))
     907                dialog.add_button(xstr("button_ok"), RESPONSETYPE_OK)
     908                dialog.set_title(WINDOW_TITLE_BASE)
     909                dialog.format_secondary_markup(xstr("loadPIREP_failed_sec"))
     910                dialog.run()
     911                dialog.hide()
     912            else:
     913                dialog = self._getSendLoadedDialog(pirep)
     914                dialog.show_all()
     915                result = dialog.run()
     916                dialog.hide()
     917
     918                if result==RESPONSETYPE_OK:
     919                    self.sendPIREP(pirep)
     920
     921    def _getLoadPirepDialog(self):
     922        """Get the PIREP loading file chooser dialog.
     923
     924        If it is not created yet, it will be created."""
     925        if self._loadPIREPDialog is None:
     926            dialog = gtk.FileChooserDialog(title = WINDOW_TITLE_BASE + " - " +
     927                                           xstr("loadPIREP_browser_title"),
     928                                           action = FILE_CHOOSER_ACTION_OPEN,
     929                                           buttons = (gtk.STOCK_CANCEL,
     930                                                      RESPONSETYPE_CANCEL,
     931                                                      gtk.STOCK_OK, RESPONSETYPE_OK),
     932                                           parent = self._mainWindow)
     933            dialog.set_modal(True)
     934           
     935
     936            filter = gtk.FileFilter()
     937            filter.set_name(xstr("loadPIREP_filter_pireps"))
     938            filter.add_pattern("*.pirep")
     939            dialog.add_filter(filter)
     940           
     941            filter = gtk.FileFilter()
     942            filter.set_name(xstr("loadPIREP_filter_all"))
     943            filter.add_pattern("*.*")
     944            dialog.add_filter(filter)
     945
     946            self._loadPIREPDialog = dialog
     947
     948        return self._loadPIREPDialog
     949
     950    def _getSendLoadedDialog(self, pirep):
     951        """Get a dialog displaying the main information of the flight from the
     952        PIREP and providing Cancel and Send buttons."""
     953        dialog = gtk.Dialog(title = WINDOW_TITLE_BASE + " - " +
     954                            xstr("loadPIREP_send_title"),
     955                            parent = self._mainWindow,
     956                            flags = DIALOG_MODAL)
     957
     958        contentArea = dialog.get_content_area()
     959
     960        label = gtk.Label(xstr("loadPIREP_send_help"))
     961        alignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
     962                                  xscale = 0.0, yscale = 0.0)
     963        alignment.set_padding(padding_top = 16, padding_bottom = 0,
     964                              padding_left = 48, padding_right = 48)
     965        alignment.add(label)
     966        contentArea.pack_start(alignment, False, False, 8)
     967
     968        table = gtk.Table(5, 2)
     969        tableAlignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
     970                                       xscale = 0.0, yscale = 0.0)
     971        tableAlignment.set_padding(padding_top = 0, padding_bottom = 32,
     972                                   padding_left = 48, padding_right = 48)
     973        table.set_row_spacings(4)
     974        table.set_col_spacings(16)
     975        tableAlignment.add(table)
     976        contentArea.pack_start(tableAlignment, True, True, 8)
     977
     978        bookedFlight = pirep.bookedFlight
     979
     980        label = gtk.Label("<b>" + xstr("loadPIREP_send_flightno") + "</b>")
     981        label.set_use_markup(True)
     982        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
     983                                       xscale = 0.0, yscale = 0.0)
     984        labelAlignment.add(label)
     985        table.attach(labelAlignment, 0, 1, 0, 1)
     986       
     987        label = gtk.Label(bookedFlight.callsign)
     988        labelAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
     989                                       xscale = 0.0, yscale = 0.0)
     990        labelAlignment.add(label)
     991        table.attach(labelAlignment, 1, 2, 0, 1)
     992
     993        label = gtk.Label("<b>" + xstr("loadPIREP_send_date") + "</b>")
     994        label.set_use_markup(True)
     995        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
     996                                       xscale = 0.0, yscale = 0.0)
     997        labelAlignment.add(label)
     998        table.attach(labelAlignment, 0, 1, 1, 2)
     999       
     1000        label = gtk.Label(str(bookedFlight.departureTime.date()))
     1001        labelAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
     1002                                       xscale = 0.0, yscale = 0.0)
     1003        labelAlignment.add(label)
     1004        table.attach(labelAlignment, 1, 2, 1, 2)
     1005
     1006        label = gtk.Label("<b>" + xstr("loadPIREP_send_from") + "</b>")
     1007        label.set_use_markup(True)
     1008        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
     1009                                       xscale = 0.0, yscale = 0.0)
     1010        labelAlignment.add(label)
     1011        table.attach(labelAlignment, 0, 1, 2, 3)
     1012       
     1013        label = gtk.Label(bookedFlight.departureICAO)
     1014        labelAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
     1015                                       xscale = 0.0, yscale = 0.0)
     1016        labelAlignment.add(label)
     1017        table.attach(labelAlignment, 1, 2, 2, 3)
     1018
     1019        label = gtk.Label("<b>" + xstr("loadPIREP_send_to") + "</b>")
     1020        label.set_use_markup(True)
     1021        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
     1022                                       xscale = 0.0, yscale = 0.0)
     1023        labelAlignment.add(label)
     1024        table.attach(labelAlignment, 0, 1, 3, 4)
     1025       
     1026        label = gtk.Label(bookedFlight.arrivalICAO)
     1027        labelAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
     1028                                       xscale = 0.0, yscale = 0.0)
     1029        labelAlignment.add(label)
     1030        table.attach(labelAlignment, 1, 2, 3, 4)
     1031
     1032        label = gtk.Label("<b>" + xstr("loadPIREP_send_rating") + "</b>")
     1033        label.set_use_markup(True)
     1034        labelAlignment = gtk.Alignment(xalign = 1.0, yalign = 0.5,
     1035                                       xscale = 0.0, yscale = 0.0)
     1036        labelAlignment.add(label)
     1037        table.attach(labelAlignment, 0, 1, 4, 5)
     1038
     1039        rating = pirep.rating
     1040        label = gtk.Label()
     1041        if rating<0:
     1042            label.set_markup('<b><span foreground="red">NO GO</span></b>')
     1043        else:
     1044            label.set_text("%.1f %%" % (rating,))
     1045       
     1046        labelAlignment = gtk.Alignment(xalign = 0.0, yalign = 0.5,
     1047                                       xscale = 0.0, yscale = 0.0)
     1048        labelAlignment.add(label)
     1049        table.attach(labelAlignment, 1, 2, 4, 5)
     1050
     1051        dialog.add_button(xstr("button_cancel"), RESPONSETYPE_REJECT)
     1052        dialog.add_button(xstr("sendPIREP"), RESPONSETYPE_OK)
     1053       
     1054        return dialog
     1055                           
     1056    def sendPIREP(self, pirep, callback = None):
     1057        """Send the given PIREP."""
     1058        self.beginBusy(xstr("sendPIREP_busy"))
     1059        self._sendPIREPCallback = callback
     1060        self.webHandler.sendPIREP(self._pirepSentCallback, pirep)
     1061
     1062    def _pirepSentCallback(self, returned, result):
     1063        """Callback for the PIREP sending result."""
     1064        gobject.idle_add(self._handlePIREPSent, returned, result)
     1065
     1066    def _handlePIREPSent(self, returned, result):
     1067        """Callback for the PIREP sending result."""
     1068        self.endBusy()
     1069        secondaryMarkup = None
     1070        type = MESSAGETYPE_ERROR
     1071        if returned:
     1072            if result.success:
     1073                type = MESSAGETYPE_INFO
     1074                messageFormat = xstr("sendPIREP_success")
     1075                secondaryMarkup = xstr("sendPIREP_success_sec")
     1076            elif result.alreadyFlown:
     1077                messageFormat = xstr("sendPIREP_already")
     1078                secondaryMarkup = xstr("sendPIREP_already_sec")
     1079            elif result.notAvailable:
     1080                messageFormat = xstr("sendPIREP_notavail")
     1081            else:
     1082                messageFormat = xstr("sendPIREP_unknown")
     1083                secondaryMarkup = xstr("sendPIREP_unknown_sec")
     1084        else:
     1085            print "PIREP sending failed", result
     1086            messageFormat = xstr("sendPIREP_failed")
     1087            secondaryMarkup = xstr("sendPIREP_failed_sec")
     1088       
     1089        dialog = gtk.MessageDialog(parent = self._wizard.gui.mainWindow,
     1090                                   type = type, message_format = messageFormat)
     1091        dialog.add_button(xstr("button_ok"), RESPONSETYPE_OK)
     1092        dialog.set_title(WINDOW_TITLE_BASE)
     1093        if secondaryMarkup is not None:
     1094            dialog.format_secondary_markup(secondaryMarkup)
     1095
     1096        dialog.run()
     1097        dialog.hide()
     1098
     1099        callback = self._sendPIREPCallback
     1100        self._sendPIREPCallback = None
     1101        if callback is not None:
     1102            callback(returned, result)
Note: See TracChangeset for help on using the changeset viewer.