render pages in print preview at idle time, not from OnPaint, to make the UI appear more responsive when preview takes long time to create

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54133 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2008-06-11 20:56:41 +00:00
parent 7c748f5e5e
commit b88bf07395
2 changed files with 38 additions and 7 deletions

View File

@@ -338,6 +338,8 @@ public:
const wxString& name = wxT("canvas")); const wxString& name = wxT("canvas"));
virtual ~wxPreviewCanvas(); virtual ~wxPreviewCanvas();
void SetPreview(wxPrintPreviewBase *preview) { m_printPreview = preview; }
void OnPaint(wxPaintEvent& event); void OnPaint(wxPaintEvent& event);
void OnChar(wxKeyEvent &event); void OnChar(wxKeyEvent &event);
// Responds to colour changes // Responds to colour changes
@@ -347,6 +349,7 @@ private:
#if wxUSE_MOUSEWHEEL #if wxUSE_MOUSEWHEEL
void OnMouseWheel(wxMouseEvent& event); void OnMouseWheel(wxMouseEvent& event);
#endif // wxUSE_MOUSEWHEEL #endif // wxUSE_MOUSEWHEEL
void OnIdle(wxIdleEvent& event);
wxPrintPreviewBase* m_printPreview; wxPrintPreviewBase* m_printPreview;
@@ -519,6 +522,10 @@ public:
// The preview canvas should call this from OnPaint // The preview canvas should call this from OnPaint
virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc); virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc);
// Updates rendered page by calling RenderPage() if needed, returns true
// if there was some change. Preview canvas should call it at idle time
virtual bool UpdatePageRendering();
// This draws a blank page onto the preview canvas // This draws a blank page onto the preview canvas
virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc); virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc);
@@ -608,6 +615,7 @@ public:
virtual wxFrame *GetFrame() const; virtual wxFrame *GetFrame() const;
virtual wxPreviewCanvas *GetCanvas() const; virtual wxPreviewCanvas *GetCanvas() const;
virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc); virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc);
virtual bool UpdatePageRendering();
virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc); virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc);
virtual void AdjustScrollbars(wxPreviewCanvas *canvas); virtual void AdjustScrollbars(wxPreviewCanvas *canvas);
virtual bool RenderPage(int pageNum); virtual bool RenderPage(int pageNum);

View File

@@ -808,6 +808,7 @@ IMPLEMENT_CLASS(wxPreviewCanvas, wxWindow)
BEGIN_EVENT_TABLE(wxPreviewCanvas, wxScrolledWindow) BEGIN_EVENT_TABLE(wxPreviewCanvas, wxScrolledWindow)
EVT_PAINT(wxPreviewCanvas::OnPaint) EVT_PAINT(wxPreviewCanvas::OnPaint)
EVT_CHAR(wxPreviewCanvas::OnChar) EVT_CHAR(wxPreviewCanvas::OnChar)
EVT_IDLE(wxPreviewCanvas::OnIdle)
EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged) EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged)
#if wxUSE_MOUSEWHEEL #if wxUSE_MOUSEWHEEL
EVT_MOUSEWHEEL(wxPreviewCanvas::OnMouseWheel) EVT_MOUSEWHEEL(wxPreviewCanvas::OnMouseWheel)
@@ -859,6 +860,16 @@ void wxPreviewCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
} }
} }
void wxPreviewCanvas::OnIdle(wxIdleEvent& event)
{
if ( m_printPreview )
{
if ( m_printPreview->UpdatePageRendering() )
Refresh();
}
event.Skip();
}
// Responds to colour changes, and passes event on to children. // Responds to colour changes, and passes event on to children.
void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event) void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event)
{ {
@@ -1272,7 +1283,9 @@ void wxPreviewFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
m_printPreview->SetCanvas(NULL); m_printPreview->SetCanvas(NULL);
m_printPreview->SetFrame(NULL); m_printPreview->SetFrame(NULL);
} }
delete m_printPreview;
m_previewCanvas->SetPreview(NULL);
wxDELETE(m_printPreview);
Destroy(); Destroy();
} }
@@ -1396,8 +1409,6 @@ bool wxPrintPreviewBase::SetCurrentPage(int pageNum)
{ {
AdjustScrollbars(m_previewCanvas); AdjustScrollbars(m_previewCanvas);
if (!RenderPage(pageNum))
return false;
m_previewCanvas->Refresh(); m_previewCanvas->Refresh();
m_previewCanvas->SetFocus(); m_previewCanvas->SetFocus();
} }
@@ -1454,13 +1465,21 @@ void wxPrintPreviewBase::CalcRects(wxPreviewCanvas *canvas, wxRect& pageRect, wx
} }
bool wxPrintPreviewBase::UpdatePageRendering()
{
if ( m_previewBitmap )
return false;
if ( !RenderPage(m_currentPage) )
return false;
return true;
}
bool wxPrintPreviewBase::PaintPage(wxPreviewCanvas *canvas, wxDC& dc) bool wxPrintPreviewBase::PaintPage(wxPreviewCanvas *canvas, wxDC& dc)
{ {
DrawBlankPage(canvas, dc); DrawBlankPage(canvas, dc);
if (!m_previewBitmap)
if (!RenderPage(m_currentPage))
return false;
if (!m_previewBitmap) if (!m_previewBitmap)
return false; return false;
if (!canvas) if (!canvas)
@@ -1616,7 +1635,6 @@ void wxPrintPreviewBase::SetZoom(int percent)
if (m_previewCanvas) if (m_previewCanvas)
{ {
AdjustScrollbars(m_previewCanvas); AdjustScrollbars(m_previewCanvas);
RenderPage(m_currentPage);
((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0); ((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0);
m_previewCanvas->ClearBackground(); m_previewCanvas->ClearBackground();
m_previewCanvas->Refresh(); m_previewCanvas->Refresh();
@@ -1724,6 +1742,11 @@ bool wxPrintPreview::PaintPage(wxPreviewCanvas *canvas, wxDC& dc)
return m_pimpl->PaintPage( canvas, dc ); return m_pimpl->PaintPage( canvas, dc );
} }
bool wxPrintPreview::UpdatePageRendering()
{
return m_pimpl->UpdatePageRendering();
}
bool wxPrintPreview::DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc) bool wxPrintPreview::DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc)
{ {
return m_pimpl->DrawBlankPage( canvas, dc ); return m_pimpl->DrawBlankPage( canvas, dc );