Ignore:
Timestamp:
04/19/12 18:06:56 (13 years ago)
Author:
István Váradi <ivaradi@…>
Branch:
default
Phase:
public
Message:

Implemented the beginnings of the main menu and the separate debug log tab

Location:
src/mlx/gui
Files:
4 edited

Legend:

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

    r86 r93  
    2424    BUTTONSTYPE_YES_NO = gtk.BUTTONS_YES_NO
    2525    RESPONSETYPE_YES = gtk.RESPONSE_YES
     26    ACCEL_VISIBLE = gtk.ACCEL_VISIBLE
     27    CONTROL_MASK = gdk.CONTROL_MASK
    2628else:
    2729    print "Using PyGObject"
     
    3941    BUTTONSTYPE_YES_NO = gtk.ButtonsType.YES_NO
    4042    RESPONSETYPE_YES = gtk.ResponseType.YES
     43    ACCEL_VISIBLE = gtk.AccelFlags.VISIBLE
     44    CONTROL_MASK = gdk.ModifierType.CONTROL_MASK
    4145
    4246import cairo
  • src/mlx/gui/flight.py

    r92 r93  
    359359            flight = self._wizard.loginResult.flights[index]
    360360            self._wizard._bookedFlight = flight
     361            # FIXME: with PyGObject this call causes error messages to
     362            # appear on the standard output
     363            self._wizard.gui.enableFlightInfo()
    361364
    362365            self._updateDepartureGate()
  • src/mlx/gui/gui.py

    r92 r93  
    4040        self._stdioLock = threading.Lock()
    4141        self._stdioText = ""
    42         self._stdioAfterNewLine = True
    4342
    4443        self.webHandler = web.Handler()
     
    5655                       lambda a, b: self.hideMainWindow())
    5756        window.connect("window-state-event", self._handleMainWindowState)
     57        accelGroup = gtk.AccelGroup()
     58        window.add_accel_group(accelGroup)
    5859
    5960        mainVBox = gtk.VBox()
    6061        window.add(mainVBox)
    6162
     63        menuBar = self._buildMenuBar(accelGroup)
     64        mainVBox.pack_start(menuBar, False, False, 0)
     65
    6266        self._notebook = gtk.Notebook()
    63         mainVBox.add(self._notebook)
     67        mainVBox.pack_start(self._notebook, True, True, 4)
    6468
    6569        self._wizard = Wizard(self)
     
    7478        label.set_tooltip_text("Flight information")
    7579        self._notebook.append_page(self._flightInfo, label)
    76 
    77         logVBox = gtk.VBox()
     80        self._flightInfo.disable()
     81
     82        (logWidget, self._logView)  = self._buildLogWidget()
    7883        label = gtk.Label("_Log")
    7984        label.set_use_underline(True)
    80         label.set_tooltip_text("Flight log")
    81         self._notebook.append_page(logVBox, label)
    82        
    83         logFrame = self._buildLogFrame()
    84         logFrame.set_border_width(8)
    85         logVBox.pack_start(logFrame, True, True, 0)
     85        label.set_tooltip_text("The log of your flight that will be sent to the MAVA website")
     86        self._notebook.append_page(logWidget, label)
     87
     88        (self._debugLogWidget, self._debugLogView) = self._buildLogWidget()
     89        self._debugLogWidget.show_all()
    8690
    8791        mainVBox.pack_start(gtk.HSeparator(), False, False, 0)
     
    9397
    9498        self._monitorWindow = MonitorWindow(self, iconDirectory)
     99        self._monitorWindow.add_accel_group(accelGroup)
    95100        self._monitorWindowX = None
    96101        self._monitorWindowY = None
     102        self._selfToggling = False
    97103
    98104        window.show_all()
     
    237243            self.reset()
    238244
     245    def enableFlightInfo(self):
     246        """Enable the flight info tab."""
     247        self._flightInfo.enable()
     248
    239249    def reset(self):
    240250        """Reset the GUI."""
     
    242252
    243253        self._flightInfo.reset()
     254        self._flightInfo.disable()
    244255        self.resetFlightStatus()
    245256
     
    263274    def write(self, msg):
    264275        """Write the given message to the log."""
    265         gobject.idle_add(self._writeLog, msg)
     276        gobject.idle_add(self._writeLog, msg, self._logView)
    266277       
    267278    def check(self, flight, aircraft, logger, oldState, state):
     
    350361        self._monitorWindow.hide()
    351362        self._statusIcon.monitorWindowHidden()
     363        if self._showMonitorMenuItem.get_active():
     364            self._selfToggling = True
     365            self._showMonitorMenuItem.set_active(False)
    352366        return True
    353367
     
    358372        self._monitorWindow.show_all()
    359373        self._statusIcon.monitorWindowShown()
     374        if not self._showMonitorMenuItem.get_active():
     375            self._selfToggling = True
     376            self._showMonitorMenuItem.set_active(True)
     377
     378    def _toggleMonitorWindow(self, menuItem):
     379        if self._selfToggling:
     380            self._selfToggling = False
     381        elif self._monitorWindow.get_visible():
     382            self.hideMonitorWindow()
     383        else:
     384            self.showMonitorWindow()
    360385
    361386    def restart(self):
     
    378403    def beginBusy(self, message):
    379404        """Begin a period of background processing."""
     405        self._wizard.set_sensitive(False)
    380406        self._mainWindow.get_window().set_cursor(self._busyCursor)
    381407        self._statusbar.updateBusyState(message)
     
    384410        """End a period of background processing."""
    385411        self._mainWindow.get_window().set_cursor(None)
     412        self._wizard.set_sensitive(True)
    386413        self._statusbar.updateBusyState(None)
    387414
     
    401428           
    402429        for line in lines:
    403             if self._stdioAfterNewLine:
    404                 line = "[STDIO] " + line
    405             self._writeLog(line + "\n")
    406             self._stdioAfterNewLine = True
     430            print >> sys.__stdout__, line
     431            self._writeLog(line + "\n", self._debugLogView)
    407432
    408433        if text:
    409             if self._stdioAfterNewLine:
    410                 text = "[STDIO] " + text
    411             self._writeLog(text)
    412             self._stdioAfterNewLine = False
     434            print >> sys.__stdout__, line,
     435            self._writeLog(text, self._debugLogView)
    413436
    414437    def connectSimulator(self, aircraftType):
     
    444467            self._monitoring = False
    445468
    446     def _buildLogFrame(self):
    447         """Build the frame for the log."""
    448         logFrame = gtk.Frame(label = "Log")
    449 
    450         frameAlignment = gtk.Alignment(xscale = 1.0, yscale = 1.0)
    451 
    452         frameAlignment.set_padding(padding_top = 4, padding_bottom = 10,
    453                                    padding_left = 16, padding_right = 16)
    454 
    455         logFrame.add(frameAlignment)
     469    def _buildMenuBar(self, accelGroup):
     470        """Build the main menu bar."""
     471        menuBar = gtk.MenuBar()
     472       
     473        fileMenuItem = gtk.MenuItem("File")
     474        fileMenu = gtk.Menu()
     475        fileMenuItem.set_submenu(fileMenu)
     476        menuBar.append(fileMenuItem)
     477
     478        quitMenuItem = gtk.ImageMenuItem(gtk.STOCK_QUIT)
     479        quitMenuItem.set_use_stock(True)
     480        quitMenuItem.add_accelerator("activate", accelGroup,
     481                                     ord("q"), CONTROL_MASK,
     482                                     ACCEL_VISIBLE)
     483        quitMenuItem.connect("activate", self._quit)
     484        fileMenu.append(quitMenuItem)
     485
     486
     487        viewMenuItem = gtk.MenuItem("View")
     488        viewMenu = gtk.Menu()
     489        viewMenuItem.set_submenu(viewMenu)
     490        menuBar.append(viewMenuItem)
     491
     492        self._showMonitorMenuItem = gtk.CheckMenuItem()
     493        self._showMonitorMenuItem.set_label("Show _monitor window")
     494        self._showMonitorMenuItem.set_use_underline(True)
     495        self._showMonitorMenuItem.set_active(False)
     496        self._showMonitorMenuItem.add_accelerator("activate", accelGroup,
     497                                                  ord("m"), CONTROL_MASK,
     498                                                  ACCEL_VISIBLE)
     499        self._showMonitorMenuItem.connect("toggled", self._toggleMonitorWindow)
     500        viewMenu.append(self._showMonitorMenuItem)
     501
     502        showDebugMenuItem = gtk.CheckMenuItem()
     503        showDebugMenuItem.set_label("Show _debug log")
     504        showDebugMenuItem.set_use_underline(True)
     505        showDebugMenuItem.set_active(False)
     506        showDebugMenuItem.add_accelerator("activate", accelGroup,
     507                                          ord("d"), CONTROL_MASK,
     508                                          ACCEL_VISIBLE)
     509        showDebugMenuItem.connect("toggled", self._toggleDebugLog)
     510        viewMenu.append(showDebugMenuItem)
     511
     512        return menuBar
     513
     514    def _toggleDebugLog(self, menuItem):
     515        """Toggle the debug log."""
     516        if menuItem.get_active():
     517            label = gtk.Label("_Debug log")
     518            label.set_use_underline(True)
     519            label.set_tooltip_text("Log with debugging information.")       
     520            self._debugLogPage = self._notebook.append_page(self._debugLogWidget, label)
     521            self._notebook.set_current_page(self._debugLogPage)
     522        else:
     523            self._notebook.remove_page(self._debugLogPage)
     524
     525    def _buildLogWidget(self):
     526        """Build the widget for the log."""
     527        alignment = gtk.Alignment(xscale = 1.0, yscale = 1.0)
     528
     529        alignment.set_padding(padding_top = 8, padding_bottom = 8,
     530                              padding_left = 16, padding_right = 16)
    456531
    457532        logScroller = gtk.ScrolledWindow()
    458         self._logView = gtk.TextView()
    459         self._logView.set_editable(False)
    460         logScroller.add(self._logView)
     533        # FIXME: these should be constants in common
     534        logScroller.set_policy(gtk.PolicyType.AUTOMATIC if pygobject
     535                               else gtk.POLICY_AUTOMATIC,
     536                               gtk.PolicyType.AUTOMATIC if pygobject
     537                               else gtk.POLICY_AUTOMATIC)
     538        logScroller.set_shadow_type(gtk.ShadowType.IN if pygobject
     539                                    else gtk.SHADOW_IN)
     540        logView = gtk.TextView()
     541        logView.set_editable(False)
     542        logScroller.add(logView)
    461543
    462544        logBox = gtk.VBox()
     
    464546        logBox.set_size_request(-1, 200)
    465547
    466         frameAlignment.add(logBox)
    467 
    468         return logFrame
    469 
    470     def _writeLog(self, msg):
     548        alignment.add(logBox)
     549
     550        return (alignment, logView)
     551
     552    def _writeLog(self, msg, logView):
    471553        """Write the given message to the log."""
    472         buffer = self._logView.get_buffer()
     554        buffer = logView.get_buffer()
    473555        buffer.insert(buffer.get_end_iter(), msg)
    474         self._logView.scroll_mark_onscreen(buffer.get_insert())
     556        logView.scroll_mark_onscreen(buffer.get_insert())
    475557
    476558    def _quit(self, what = None, force = False):
  • src/mlx/gui/info.py

    r90 r93  
    4343        self._gui = gui
    4444
     45        self._commentsAlignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
     46                                                xscale = 1.0, yscale = 1.0)
    4547        commentsBox = gtk.HBox()
    4648
     
    5153        commentsBox.pack_start(frame, True, True, 8)
    5254
    53         self.pack_start(commentsBox, True, True, 8)
     55        self._commentsAlignment.add(commentsBox)
     56        self.pack_start(self._commentsAlignment, True, True, 8)
    5457
    5558        frame = gtk.Frame(label = "Delay codes")
     
    108111        frame.add(alignment)
    109112
    110         alignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
    111                                   xscale = 0.0, yscale = 0.0)
    112         alignment.add(frame)
     113        self._delayAlignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
     114                                             xscale = 0.0, yscale = 0.0)
     115        self._delayAlignment.add(frame)
    113116
    114         self.pack_start(alignment, False, False, 8)
     117        self.pack_start(self._delayAlignment, False, False, 8)
     118
     119    def enable(self):
     120        """Enable the flight info tab."""
     121        #gobject.idle_add(self.set_sensitive, True)
     122        self._commentsAlignment.set_sensitive(True)
     123        self._delayAlignment.set_sensitive(True)
     124       
     125    def disable(self):
     126        """Enable the flight info tab."""
     127        #gobject.idle_add(self.set_sensitive, False)
     128        self._commentsAlignment.set_sensitive(False)
     129        self._delayAlignment.set_sensitive(False)
    115130
    116131    def reset(self):
Note: See TracChangeset for help on using the changeset viewer.