added overdrawDC for drawing selection

git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@107 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
twanvl
2006-12-10 18:28:26 +00:00
parent 95a5c2f42b
commit 2f1b2756ee
5 changed files with 76 additions and 32 deletions
+41 -3
View File
@@ -14,6 +14,7 @@
CardViewer::CardViewer(Window* parent, int id, long style)
: wxControl(parent, id, wxDefaultPosition, wxDefaultSize, style)
, up_to_date(false)
{}
wxSize CardViewer::DoGetBestSize() const {
@@ -29,17 +30,54 @@ wxSize CardViewer::DoGetBestSize() const {
void CardViewer::onChange() {
Refresh(false);
up_to_date = false;
}
#ifdef _DEBUG
DECLARE_DYNAMIC_ARG(bool, inOnPaint);
IMPLEMENT_DYNAMIC_ARG(bool, inOnPaint, false);
#endif
void CardViewer::onPaint(wxPaintEvent&) {
#ifdef _DEBUG
// we don't want recursion
assert(!inOnPaint());
WITH_DYNAMIC_ARG(inOnPaint, true);
#endif
wxSize cs = GetClientSize();
if (!buffer.Ok() || buffer.GetWidth() != cs.GetWidth() || buffer.GetHeight() != cs.GetHeight()) {
buffer = Bitmap(cs.GetWidth(), cs.GetHeight());
up_to_date = false;
}
wxBufferedPaintDC dc(this, buffer);
dc.BeginDrawing();
draw(dc);
dc.EndDrawing();
if (!up_to_date) {
up_to_date = true;
dc.BeginDrawing();
draw(dc);
dc.EndDrawing();
}
}
// helper class for overdrawDC()
class CardViewer::OverdrawDC : private wxClientDC, public wxBufferedDC {
public:
OverdrawDC(CardViewer* window)
: wxClientDC(window)
{
wxBufferedDC::Init((wxClientDC*)this, window->buffer);
wxBufferedDC::BeginDrawing();
}
~OverdrawDC() {
wxBufferedDC::EndDrawing();
}
};
shared_ptr<DC> CardViewer::overdrawDC() {
#ifdef _DEBUG
// don't call from onPaint
assert(!inOnPaint());
#endif
return shared_ptr<DC>((wxBufferedDC*)(new OverdrawDC(this)));
}
// ----------------------------------------------------------------------------- : Event table
+8 -1
View File
@@ -19,6 +19,10 @@ class CardViewer : public wxControl, public DataViewer {
public:
CardViewer(Window* parent, int id, long style = 0);
/// Get a dc to draw on the card outside onPaint
/** May NOT be called while in onPaint/draw */
shared_ptr<DC> overdrawDC();
protected:
/// Return the desired size of control
virtual wxSize DoGetBestSize() const;
@@ -30,7 +34,10 @@ class CardViewer : public wxControl, public DataViewer {
void onPaint(wxPaintEvent&);
Bitmap buffer; /// < Off-screen buffer we draw to
Bitmap buffer; ///< Off-screen buffer we draw to
bool up_to_date; ///< Is the buffer up to date?
class OverdrawDC;
};
// ----------------------------------------------------------------------------- : EOF
+21 -22
View File
@@ -448,31 +448,30 @@ void TextValueEditor::moveSelection(size_t new_end, bool also_move_start, Moveme
moveSelectionNoRedraw(new_end, also_move_start, dir);
return;
}
// First redraw selection
// Hide caret
wxCaret* caret = editor().GetCaret();
if (caret->IsVisible()) caret->Hide();
{
/* DCP dc = editor.overdrawDC();
RotatedDC rdc(*dc, editor.rotation);
if (nativeLook) {
// clip the dc to the region of this control
rdc.SetClippingRegion(style->left, style->top, style->width, style->height);
}
// clear old
v.drawSelection(rdc, style(), selection_start, selection_end);
// move
*/ moveSelectionNoRedraw(new_end, also_move_start, dir);
// scroll?
// scrollWithCursor = true;
// if (onMove()) {
// // we can't redraw just the selection because we must scroll
// updateScrollbar();
// editor.refreshEditor();
// } else {
// // draw new selection
// v.drawSelection(rdc, style(), selection_start, selection_end);
// }
// Move selection
shared_ptr<DC> dc = editor().overdrawDC();
RotatedDC rdc(*dc, viewer.getRotation(), false);
if (nativeLook()) {
// clip the dc to the region of this control
rdc.SetClippingRegion(style().getRect());
}
// clear old selection by drawing it again
v.drawSelection(rdc, style(), selection_start, selection_end);
// move
moveSelectionNoRedraw(new_end, also_move_start, dir);
// scroll?
// scrollWithCursor = true;
// if (onMove()) {
// // we can't redraw just the selection because we must scroll
// updateScrollbar();
// editor.refreshEditor();
// } else {
// draw new selection
v.drawSelection(rdc, style(), selection_start, selection_end);
// }
showCaret();
}