]> git.saurik.com Git - wxWidgets.git/commitdiff
overlay implementation
authorStefan Csomor <csomor@advancedconcepts.ch>
Tue, 10 Oct 2006 10:28:04 +0000 (10:28 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Tue, 10 Oct 2006 10:28:04 +0000 (10:28 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41875 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dc.h
include/wx/generic/caret.h

index b11ec40d9a410dc3841a24eb592aa6dff2b146a5..faed2c0dce3f1189824925cc53db49daf269f0f7 100644 (file)
@@ -963,5 +963,66 @@ private:
     DECLARE_NO_COPY_CLASS(wxDCClipper)
 };
 
+// ----------------------------------------------------------------------------
+// creates an overlay over an existing window, allowing for manipulations like
+// rubberbanding etc. this API is not stable yet, not to be used outside wx 
+// internal code
+// ----------------------------------------------------------------------------
+
+class wxOverlayImpl ;
+class wxWindowDC ;
+
+class WXDLLEXPORT wxOverlay 
+{
+public :
+    wxOverlay();    
+    ~wxOverlay();
+    
+    // clears the overlay without restoring the former state
+    // to be done eg when the window content has been changed and repainted
+    void Reset();
+    
+private :
+    friend class WXDLLEXPORT wxDCOverlay;
+    
+    // returns true if it has been setup
+    bool IsOk();
+
+    void Init( wxWindowDC* dc, int x , int y , int width , int height );
+    
+    void BeginDrawing( wxWindowDC* dc);
+    
+    void EndDrawing( wxWindowDC* dc);
+    
+    void Clear( wxWindowDC* dc);
+
+    wxOverlayImpl* m_impl;
+    
+    bool m_inDrawing;
+} ;
+
+class WXDLLEXPORT wxDCOverlay
+{
+public :
+    // connects this overlay to the corresponding drawing dc, if the overlay is not initialized yet
+    // this call will do so
+    wxDCOverlay(wxOverlay &overlay, wxWindowDC *dc, int x , int y , int width , int height);    
+    
+    // convenience wrapper that behaves the same using the entire area of the dc
+    wxDCOverlay(wxOverlay &overlay, wxWindowDC *dc);    
+
+    // removes the connection between the overlay and the dc
+    virtual ~wxDCOverlay();    
+    
+    // clears the layer, restoring the state at the last init
+    void Clear();
+private :
+    void Init(wxWindowDC *dc, int x , int y , int width , int height);
+
+    wxOverlay& m_overlay;
+
+    wxWindowDC* m_dc;
+} ;
+
 #endif
     // _WX_DC_H_BASE_
index 644917c28ae0dccbd0d62c4c5a4f73ec4fcfa07d..78ca72141ea88a900313af0f3ca1a9046acb3864 100644 (file)
@@ -26,6 +26,18 @@ private:
     wxCaret *m_caret;
 };
 
+#ifndef wxUSE_OVERLAY
+    #if defined(wxMAC_USE_CORE_GRAPHICS) && wxMAC_USE_CORE_GRAPHICS
+        #define wxUSE_OVERLAY 1
+    #else
+        #define wxUSE_OVERLAY 0
+    #endif
+#endif
+
+#if wxUSE_OVERLAY
+    #include "wx/dc.h"
+#endif
+
 class WXDLLIMPEXP_CORE wxCaret : public wxCaretBase
 {
 public:
@@ -70,11 +82,16 @@ private:
     // GTK specific initialization
     void InitGeneric();
 
+#if wxUSE_OVERLAY
+    // the overlay for displaying the caret
+    wxOverlay   m_overlay;
+#else
     // the bitmap holding the part of window hidden by the caret when it was
     // at (m_xOld, m_yOld)
     wxBitmap      m_bmpUnderCaret;
     int           m_xOld,
                   m_yOld;
+#endif
 
     wxCaretTimer  m_timer;
     bool          m_blinkedOut,     // true => caret hidden right now