Commit fe82334a authored by twanvl's avatar twanvl

fixed flickering cursor in text control

parent 3cd40a7d
...@@ -26,15 +26,16 @@ Rotation TextCtrl::getRotation() const { ...@@ -26,15 +26,16 @@ Rotation TextCtrl::getRotation() const {
} }
void TextCtrl::draw(DC& dc) { void TextCtrl::draw(DC& dc) {
if (!viewers.empty()) {
wxSize cs = GetClientSize();
Style& style = *viewers.front()->getStyle();
style.width = cs.GetWidth() - 2;
style.height = cs.GetHeight() - 2;
}
RotatedDC rdc(dc, getRotation(), false); RotatedDC rdc(dc, getRotation(), false);
DataViewer::draw(rdc, wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); DataViewer::draw(rdc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
} }
void TextCtrl::drawViewer(RotatedDC& dc, ValueViewer& v) { void TextCtrl::drawViewer(RotatedDC& dc, ValueViewer& v) {
// draw background
Style& s = *v.getStyle();
dc.SetPen(*wxTRANSPARENT_PEN);
dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
dc.DrawRectangle(s.getRect().grow(1));
// draw viewer // draw viewer
v.draw(dc); v.draw(dc);
} }
...@@ -49,6 +50,7 @@ void TextCtrl::setValue(String* value) { ...@@ -49,6 +50,7 @@ void TextCtrl::setValue(String* value) {
TextValueP value(new TextValue(field)); TextValueP value(new TextValue(field));
// set stuff // set stuff
field->index = 0; field->index = 0;
field->multi_line = true;
style->width = 100; style->width = 100;
style->height = 20; style->height = 20;
style->left = style->top = 1; style->left = style->top = 1;
...@@ -95,12 +97,7 @@ void TextCtrl::onInit() { ...@@ -95,12 +97,7 @@ void TextCtrl::onInit() {
} }
void TextCtrl::onSize(wxSizeEvent&) { void TextCtrl::onSize(wxSizeEvent&) {
if (!viewers.empty()) { Refresh(false);
wxSize cs = GetClientSize();
Style& style = *viewers.front()->getStyle();
style.width = cs.GetWidth() - 2;
style.height = cs.GetHeight() - 2;
}
} }
BEGIN_EVENT_TABLE(TextCtrl, DataEditor) BEGIN_EVENT_TABLE(TextCtrl, DataEditor)
......
...@@ -78,8 +78,13 @@ void TextValueEditor::onMotion(const RealPoint& pos, wxMouseEvent& ev) { ...@@ -78,8 +78,13 @@ void TextValueEditor::onMotion(const RealPoint& pos, wxMouseEvent& ev) {
if (ev.LeftIsDown()) { if (ev.LeftIsDown()) {
size_t index = v.indexAt(style().getRotation().trInv(pos)); size_t index = v.indexAt(style().getRotation().trInv(pos));
if (select_words) { if (select_words) {
// TODO: on the left, swap start and end // on the left, swap start and end
moveSelection(TYPE_INDEX, index < selection_start_i ? prevWordBoundry(index) : nextWordBoundry(index), false, MOVE_MID); bool left = index < max(selection_start_i, selection_end_i);
if (left != (selection_end_i < selection_start_i)) {
swap(selection_start_i, selection_end_i);
}
// //if (left && selection_end_i < selection_start_i
moveSelection(TYPE_INDEX, left ? prevWordBoundry(index) : nextWordBoundry(index), false, MOVE_MID);
} else { } else {
moveSelection(TYPE_INDEX, index, false, MOVE_MID); moveSelection(TYPE_INDEX, index, false, MOVE_MID);
} }
...@@ -472,27 +477,30 @@ void TextValueEditor::moveSelection(IndexType t, size_t new_end, bool also_move_ ...@@ -472,27 +477,30 @@ void TextValueEditor::moveSelection(IndexType t, size_t new_end, bool also_move_
// Hide caret // Hide caret
wxCaret* caret = editor().GetCaret(); wxCaret* caret = editor().GetCaret();
if (caret->IsVisible()) caret->Hide(); if (caret->IsVisible()) caret->Hide();
// Move selection // Destroy the clientDC before reshowing the caret, prevent flicker on MSW
shared_ptr<DC> dc = editor().overdrawDC(); {
RotatedDC rdc(*dc, viewer.getRotation(), false); // Move selection
if (nativeLook()) { shared_ptr<DC> dc = editor().overdrawDC();
// clip the dc to the region of this control RotatedDC rdc(*dc, viewer.getRotation(), false);
rdc.SetClippingRegion(style().getRect()); if (nativeLook()) {
} // clip the dc to the region of this control
// clear old selection by drawing it again rdc.SetClippingRegion(style().getRect());
v.drawSelection(rdc, style(), selection_start_i, selection_end_i); }
// move // clear old selection by drawing it again
moveSelectionNoRedraw(t, 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_i, selection_end_i); v.drawSelection(rdc, style(), selection_start_i, selection_end_i);
// } // move
moveSelectionNoRedraw(t, 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_i, selection_end_i);
// }
}
showCaret(); showCaret();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment