dabo Commit
Revision 5442
Date: 2009-09-29 16:14:21 -0700 (Tue, 29 Sep 2009)
Author: Paul
Trac: http://trac.dabodev.com/changeset/5442

Changed:
U   trunk/dabo/dEvents.py
U   trunk/dabo/dReportWriter.py
U   trunk/dabo/lib/reportWriter.py
U   trunk/dabo/ui/uiwx/dReportProgress.py

Log:
Added ReportCancel event. Determined that the problem with cancelling
the dReportProgress was the modeless/modal problem on Gtk. Reworked
dReportProgress to be a panel instead of a form, so that the developer
can put it whereever they want, and to surmount the Gtk problem.

Now, the cancel button works, and will stop writing the report 
on the next iteration of the report cursor.



Diff:
Modified: trunk/dabo/dEvents.py
===================================================================
--- trunk/dabo/dEvents.py       2009-09-29 18:33:02 UTC (rev 5441)
+++ trunk/dabo/dEvents.py       2009-09-29 23:14:21 UTC (rev 5442)
@@ -889,6 +889,10 @@
        appliesToClass = classmethod(appliesToClass)
 
 
+class ReportCancel(ReportEvent):
+       """Occurs when the user cancels the report."""
+       pass
+
 class ReportBegin(ReportEvent):
        """Occurs at the beginning of the report."""
        pass

Modified: trunk/dabo/dReportWriter.py
===================================================================
--- trunk/dabo/dReportWriter.py 2009-09-29 18:33:02 UTC (rev 5441)
+++ trunk/dabo/dReportWriter.py 2009-09-29 23:14:21 UTC (rev 5442)
@@ -22,36 +22,46 @@
        There is also a pure-python interface available.
        """
 
+       def _onReportCancel(self):
+               self.super()
+               self.raiseEvent(dabo.dEvents.ReportCancel)
+               self._hideProgress()
+
        def _onReportBegin(self):
                self.super()
                self.raiseEvent(dabo.dEvents.ReportBegin)
-               if self.ShowProgress:
-                       self._createProgress()
+               self._showProgress()
 
        def _onReportEnd(self):
                self.super()
                self.raiseEvent(dabo.dEvents.ReportEnd)
-               if self.ShowProgress:
-                       self._hideProgress()
+               self._hideProgress()
 
        def _onReportIteration(self):
-               dabo.ui.yieldUI()
                self.super()
                self.raiseEvent(dabo.dEvents.ReportIteration)
-               if self.ShowProgress:
-                       self._updateProgress()
+               self._updateProgress()
 
-       def _createProgress(self):      
-               win = self._progressWindow = 
dabo.ui.dReportProgress(self.Application.ActiveForm)
-               win.updateProgress(0, len(self.Cursor))
-               win.Visible = True
+       def _showProgress(self):
+               win = self.ProgressControl
+               if win:
+                       win.updateProgress(0, len(self.Cursor))
+                       win.Visible = True
+                       win.Form.fitToSizer()
+                       dabo.ui.yieldUI()
 
        def _updateProgress(self):
-               self._progressWindow.updateProgress(self.RecordNumber+1, 
len(self.Cursor))
+               win = self.ProgressControl
+               if win:
+                       win.updateProgress(self.RecordNumber+1, 
len(self.Cursor))
+                       dabo.ui.yieldUI()
 
        def _hideProgress(self):
-               self._progressWindow.close()
-               dabo.ui.yieldUI()  ## or else a segfault occurs when the parent 
dialog is closed
+               win = self.ProgressControl
+               if win:
+                       win.Visible = False
+                       win.Form.fitToSizer()
+                       dabo.ui.yieldUI()
 
        def _getEncoding(self):
                try:
@@ -79,15 +89,15 @@
                self._homeDirectory = val
 
        
-       def _getShowProgress(self):
+       def _getProgressControl(self):
                try:
-                       v = self._showProgress
+                       v = self._progressControl
                except AttributeError:
-                       v = self._showProgress = True
+                       v = self._progressControl = None
                return v
 
-       def _setShowProgress(self, val):
-               self._showProgress = bool(val)
+       def _setProgressControl(self, val):
+               self._progressControl = val
 
 
        Encoding = property(_getEncoding, _setEncoding, None,
@@ -102,14 +112,15 @@
                self.ReportFormFile, HomeDirectory will be set for you 
automatically.
                Otherwise, it will get set to 
self.Application.HomeDirectory."""))
 
-       ShowProgress = property(_getShowProgress, _setShowProgress, None,
-               _("""Specified whether a default progress window is shown at 
runtime.
+       ProgressControl = property(_getProgressControl, _setProgressControl, 
None,
+               _("""Specifies the control to receive progress updates.
 
-               If True, a progress bar will be shown during the processing of 
the report.
-               Note that you can provide your own progress window by binding 
to the 
-               dabo.dEvents.ReportIteration event and setting this 
ShowProgress property
-               to False."""))
+               The specified control will be updated with every record 
processed. It must have
+               a updateProgress(current_row, num_rows) method.
 
+               For the default control, use dabo.ui.dReportProgress.
+               """))
+
 if __name__ == "__main__":
        ## run a test:
        rw = dReportWriter(Name="dReportWriter1", OutputFile="./dRW-test.pdf")

Modified: trunk/dabo/lib/reportWriter.py
===================================================================
--- trunk/dabo/lib/reportWriter.py      2009-09-29 18:33:02 UTC (rev 5441)
+++ trunk/dabo/lib/reportWriter.py      2009-09-29 23:14:21 UTC (rev 5442)
@@ -972,6 +972,15 @@
                        return
                obj.setProp(prop, oldval, logUndo=False)
 
+       def cancel(self):
+               """Cancel the report printout on the next iteration of 
self.Cursor."""
+               self._cancel = True
+
+       def _onReportCancel(self):
+               if self.PrintStatus:
+                       print "Report cancelled."
+                       sys.stdout.flush()
+
        def _onReportBegin(self):
                if self.PrintStatus:
                        print "Report Begin."
@@ -1649,6 +1658,7 @@
                the PDF file will be left open so that additional pages can be 
added 
                with another call, perhaps after creating a different report 
form.
                """
+               self._cancel = False
                self._calcObjectHeights = {}
                _form = self.ReportForm
                if _form is None:
@@ -2006,6 +2016,9 @@
                # Print the dynamic bands (Detail, GroupHeader, GroupFooter):
                y = None
                for cursor_idx, record in enumerate(self.Cursor):
+                       if self._cancel:
+                               self._onReportCancel()
+                               return
                        _lastRecord = self.Record
                        self.Record = record
 

Modified: trunk/dabo/ui/uiwx/dReportProgress.py
===================================================================
--- trunk/dabo/ui/uiwx/dReportProgress.py       2009-09-29 18:33:02 UTC (rev 
5441)
+++ trunk/dabo/ui/uiwx/dReportProgress.py       2009-09-29 23:14:21 UTC (rev 
5442)
@@ -1,30 +1,45 @@
+# -*- coding: utf-8 -*-
 import dabo
-from dForm import dBorderlessForm
+if __name__ == "__main__":
+       dabo.ui.loadUI("wx")
+from dabo.dLocalize import _
+from dPanel import dPanel
 from dGauge import dGauge
 from dLabel import dLabel
 from dButton import dButton
 
-class dReportProgress(dBorderlessForm):
+
+class dReportProgress(dPanel):
        def afterInit(self):
-               self.gauge = dGauge(self)
-               lblTitle = dLabel(self, Caption="Processing report...", 
FontBold=True, FontSize=12)
+               ms = self.Sizer = dabo.ui.dBorderSizer(self, "v", 
DefaultBorder=5)
+               self.gauge = dGauge(self, Size=(75,12))
+               lblTitle = dLabel(self, Caption="Processing report...", 
FontBold=True)
                butCancel = dButton(self, CancelButton=True, Caption="Cancel", 
OnHit=self.onCancel)
-               ms = self.Sizer = dabo.ui.dBorderSizer(self, "v", 
DefaultBorder=10)
                ms.append(lblTitle)
                ms.append(self.gauge, "expand")
                ms.append(butCancel, alignment="right")
-               butCancel.setFocus()
                self.fitToSizer()
+               self.Visible = False
 
-       def initProperties(self):
-               self.Centered = True
-
        def updateProgress(self, val, range):
                self.gauge.Range = range
                self.gauge.Value = val
                self.gauge.refresh()
-               dabo.ui.yieldUI()
                
        def onCancel(self, evt):
-               print "cancel"
+               evt.stop()  ## keep dialogs from automatically being closed.
+               if not self.Visible:
+                       return
+               self.ReportWriter.cancel()
 
+
+       def _getReportWriter(self):
+               self._reportWriter = getattr(self, "_reportWriter", None)
+               return self._reportWriter
+
+       def _setReportWriter(self, val):
+               self._reportWriter = val
+
+       ReportWriter = property(_getReportWriter, _setReportWriter, None,
+                       _("""Specifies the dReportWriter instance."""))
+




_______________________________________________
Post Messages to: [email protected]
Subscription Maintenance: http://leafe.com/mailman/listinfo/dabo-dev
Searchable Archives: http://leafe.com/archives/search/dabo-dev
This message: 
http://leafe.com/archives/byMID/[email protected]

Reply via email to