Revision: 4901
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4901&view=rev
Author:   dsdale
Date:     2008-01-27 07:17:28 -0800 (Sun, 27 Jan 2008)

Log Message:
-----------
backend_qt4 improvements, see bug 1288848

Modified Paths:
--------------
    trunk/matplotlib/CHANGELOG
    trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py
    trunk/matplotlib/lib/matplotlib/backends/backend_qt4agg.py

Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG  2008-01-26 13:22:33 UTC (rev 4900)
+++ trunk/matplotlib/CHANGELOG  2008-01-27 15:17:28 UTC (rev 4901)
@@ -1,3 +1,7 @@
+2008-01-27 Applied  Martin Teichmann's patch to improve the Qt4
+           backend. Uses Qt's builtin toolbars and statusbars.
+           See bug 1828848 - DSD
+
 2008-01-10 Moved toolkits to mpl_toolkits, made mpl_toolkits
            a namespace package - JSWHIT
 

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py     2008-01-26 
13:22:33 UTC (rev 4900)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_qt4.py     2008-01-27 
15:17:28 UTC (rev 4901)
@@ -195,9 +195,6 @@
         image = os.path.join( 
matplotlib.rcParams['datapath'],'images','matplotlib.png' )
         self.window.setWindowIcon(QtGui.QIcon( image ))
 
-        centralWidget = QtGui.QWidget( self.window )
-        self.canvas.setParent( centralWidget )
-
         # Give the keyboard focus to the figure instead of the manager
         self.canvas.setFocusPolicy( QtCore.Qt.ClickFocus )
         self.canvas.setFocus()
@@ -206,31 +203,13 @@
                             self._widgetclosed )
         self.window._destroying = False
 
-        self.toolbar = self._get_toolbar(self.canvas, centralWidget)
+        self.toolbar = self._get_toolbar(self.canvas, self.window)
+        self.window.addToolBar(self.toolbar)
+        QtCore.QObject.connect(self.toolbar, QtCore.SIGNAL("message"),
+                self.window.statusBar().showMessage)
 
-        # Use a vertical layout for the plot and the toolbar.  Set the
-        # stretch to all be in the plot so the toolbar doesn't resize.
-        layout = QtGui.QVBoxLayout( centralWidget )
-        layout.setMargin( 0 )
-        layout.addWidget( self.canvas, 1 )
-        if self.toolbar:
-           layout.addWidget( self.toolbar, 0 )
+        self.window.setCentralWidget(self.canvas)
 
-        self.window.setCentralWidget( centralWidget )
-
-        # Reset the window height so the canvas will be the right
-        # size.  This ALMOST works right.  The first issue is that the
-        # reported toolbar height does not include the margin (so
-        # we add the margin).  The second is that the total width/height
-        # is slightly smaller that we actually want.  It seems like
-        # the border of the window is being included in the size but
-        # AFAIK there is no way to get that size.
-        w = self.canvas.width()
-        h = self.canvas.height()
-        if self.toolbar:
-           h += self.toolbar.height() + NavigationToolbar2QT.margin
-        self.window.resize( w, h )
-
         if matplotlib.is_interactive():
             self.window.show()
 
@@ -251,9 +230,9 @@
         # must be inited after the window, drawingArea and figure
         # attrs are set
         if matplotlib.rcParams['toolbar'] == 'classic':
-            print "Classic toolbar is not yet supported"
+            print "Classic toolbar is not supported"
         elif matplotlib.rcParams['toolbar'] == 'toolbar2':
-            toolbar = NavigationToolbar2QT(canvas, parent)
+            toolbar = NavigationToolbar2QT(canvas, parent, False)
         else:
             toolbar = None
         return toolbar
@@ -274,68 +253,53 @@
     def set_window_title(self, title):
         self.window.setWindowTitle(title)
 
-class NavigationToolbar2QT( NavigationToolbar2, QtGui.QWidget ):
-    # list of toolitems to add to the toolbar, format is:
-    # text, tooltip_text, image_file, callback(str)
-    toolitems = (
-        ('Home', 'Reset original view', 'home.ppm', 'home'),
-        ('Back', 'Back to  previous view','back.ppm', 'back'),
-        ('Forward', 'Forward to next view','forward.ppm', 'forward'),
-        (None, None, None, None),
-        ('Pan', 'Pan axes with left mouse, zoom with right', 'move.ppm', 
'pan'),
-        ('Zoom', 'Zoom to rectangle','zoom_to_rect.ppm', 'zoom'),
-        (None, None, None, None),
-        ('Subplots', 'Configure subplots','subplots.png', 
'configure_subplots'),
-        ('Save', 'Save the figure','filesave.ppm', 'save_figure'),
-        )
-
-    margin = 12 # extra margin for the toolbar
-
-    def __init__(self, canvas, parent):
+class NavigationToolbar2QT( NavigationToolbar2, QtGui.QToolBar ):
+    def __init__(self, canvas, parent, coordinates=True):
+        """ coordinates: should we show the coordinates on the right? """
         self.canvas = canvas
-        QtGui.QWidget.__init__( self, parent )
-
-        # Layout toolbar buttons horizontally.
-        self.layout = QtGui.QHBoxLayout( self )
-        self.layout.setMargin( 2 )
-        self.layout.setSpacing( 0 )
-
+        self.coordinates = coordinates
+        QtGui.QToolBar.__init__( self, parent )
         NavigationToolbar2.__init__( self, canvas )
 
-    def _init_toolbar( self ):
-        basedir = os.path.join(matplotlib.rcParams[ 'datapath' ],'images')
-        self.buttons = {}
+    def _icon(self, name):
+        return QtGui.QIcon(os.path.join(self.basedir, name))
 
-        for text, tooltip_text, image_file, callback in self.toolitems:
-            if text == None:
-                self.layout.addSpacing( 8 )
-                continue
+    def _init_toolbar(self):
+        self.basedir = os.path.join(matplotlib.rcParams[ 'datapath' ],'images')
 
-            fname = os.path.join( basedir, image_file )
-            image = QtGui.QPixmap()
-            image.load( fname )
+        a = self.addAction(self._icon('home.svg'), 'Home', self.home)
+        a.setToolTip('Reset original view')
+        a = self.addAction(self._icon('back.svg'), 'Back', self.back)
+        a.setToolTip('Back to previous view')
+        a = self.addAction(self._icon('forward.svg'), 'Forward', self.forward)
+        a.setToolTip('Forward to next view')
+        self.addSeparator()
+        a = self.addAction(self._icon('move.svg'), 'Pan', self.pan)
+        a.setToolTip('Pan axes with left mouse, zoom with right')
+        a = self.addAction(self._icon('zoom_to_rect.svg'), 'Zoom', self.zoom)
+        a.setToolTip('Zoom to rectangle')
+        self.addSeparator()
+        a = self.addAction(self._icon('subplots.png'), 'Subplots',
+                self.configure_subplots)
+        a.setToolTip('Configure subplots')
+        a = self.addAction(self._icon('filesave.svg'), 'Save',
+                self.save_figure)
+        a.setToolTip('Save the figure')
 
-            button = QtGui.QPushButton( QtGui.QIcon( image ), "", self )
-            button.setToolTip(tooltip_text)
-            self.buttons[ text ] = button
+        self.buttons = {}
 
-            # The automatic layout doesn't look that good - it's too close
-            # to the images so add a margin around it.
-            margin = self.margin
-            button.setFixedSize( image.width()+margin, image.height()+margin )
-
-            QtCore.QObject.connect( button, QtCore.SIGNAL( 'clicked()' ),
-                                getattr( self, callback ) )
-            self.layout.addWidget( button )
-
         # Add the x,y location widget at the right side of the toolbar
         # The stretch factor is 1 which means any resizing of the toolbar
         # will resize this label instead of the buttons.
-        self.locLabel = QtGui.QLabel( "", self )
-        self.locLabel.setAlignment( QtCore.Qt.AlignRight | QtCore.Qt.AlignTop )
-        
self.locLabel.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored,
-                                                      
QtGui.QSizePolicy.Ignored))
-        self.layout.addWidget( self.locLabel, 1 )
+        if self.coordinates:
+            self.locLabel = QtGui.QLabel( "", self )
+            self.locLabel.setAlignment(
+                    QtCore.Qt.AlignRight | QtCore.Qt.AlignTop )
+            self.locLabel.setSizePolicy(
+                QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
+                                  QtGui.QSizePolicy.Ignored))
+            labelAction = self.addWidget(self.locLabel)
+            labelAction.setVisible(True)
 
         # reference holder for subplots_adjust window
         self.adj_window = None
@@ -351,7 +315,9 @@
         self.canvas.draw()
 
     def set_message( self, s ):
-        self.locLabel.setText( s.replace(', ', '\n') )
+        self.emit(QtCore.SIGNAL("message"), s)
+        if self.coordinates:
+            self.locLabel.setText(s.replace(', ', '\n'))
 
     def set_cursor( self, cursor ):
         if DEBUG: print 'Set cursor' , cursor
@@ -384,28 +350,6 @@
 
         win.show()
 
-#        self.adj_window = QtGui.QDialog()
-#        win = self.adj_window
-#        win.setAttribute(QtCore.Qt.WA_DeleteOnClose)
-#        win.setWindowTitle("Subplot Configuration Tool")
-#        image = os.path.join( 
matplotlib.rcParams['datapath'],'images','matplotlib.png' )
-#        win.setWindowIcon(QtGui.QIcon( image ))
-#
-#        toolfig = Figure(figsize=(6,3))
-#        toolfig.subplots_adjust(top=0.9)
-#        canvas = self._get_canvas(toolfig)
-#        tool = SubplotTool(self.canvas.figure, toolfig)
-#
-#        canvas.setParent(win)
-#        w = int (toolfig.bbox.width())
-#        h = int (toolfig.bbox.height())
-#
-#        win.resize(w, h)
-#        canvas.setFocus()
-#
-#        canvas.show()
-#        win.show()
-
     def _get_canvas(self, fig):
         return FigureCanvasQT(fig)
 
@@ -425,7 +369,7 @@
                 selectedFilter = filter
             filters.append(filter)
         filters = ';;'.join(filters)
-           
+
         fname = QtGui.QFileDialog.getSaveFileName(
             self, "Choose a filename to save to", start, filters, 
selectedFilter)
         if fname:

Modified: trunk/matplotlib/lib/matplotlib/backends/backend_qt4agg.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/backends/backend_qt4agg.py  2008-01-26 
13:22:33 UTC (rev 4900)
+++ trunk/matplotlib/lib/matplotlib/backends/backend_qt4agg.py  2008-01-27 
15:17:28 UTC (rev 4901)
@@ -35,7 +35,7 @@
         # must be inited after the window, drawingArea and figure
         # attrs are set
         if matplotlib.rcParams['toolbar']=='classic':
-            print "Classic toolbar is not yet supported"
+            print "Classic toolbar is not supported"
         elif matplotlib.rcParams['toolbar']=='toolbar2':
             toolbar = NavigationToolbar2QTAgg(canvas, parent)
         else:


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to