-Geom/Draw: fixed empty outline for circular mark

.Geom/Ctrl: new drag & drop modes in PlotterCtrl (automatic zoom & pan)

git-svn-id: svn://ultimatepp.org/upp/trunk@2750 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
rylek 2010-10-05 01:33:27 +00:00
parent d87dc9aa10
commit 90e309e714
4 changed files with 92 additions and 41 deletions

View file

@ -666,7 +666,15 @@ void PlotterCtrl::RefreshBuffer(const Rect& rc)
Image PlotterCtrl::CursorImage(Point pt, dword keyflags)
{
Image out = Image::Arrow();
if(drag_drop) {
if(!custom_drag) {
if(keyflags & K_SHIFT)
out = PlotterImg::view_zoom_in();
else if(keyflags & K_CTRL)
out = PlotterImg::view_zoom_out();
else if(keyflags & K_MOUSELEFT)
out = PlotterImg::view_pan();
}
else if(drag_drop) {
lock_drag_drop = true;
out = drag_drop->Cursor(FromClient(pt), keyflags, IsDragging());
lock_drag_drop = false;
@ -685,9 +693,8 @@ bool PlotterCtrl::Push(Point pt, dword keyflags)
bool push = false;
SyncPush();
drag_start = FromPushClient(pt);
if(drag_drop)
push = drag_drop->Push(drag_start, keyflags);
return push;
custom_drag = (drag_drop && drag_drop->Push(drag_start, keyflags));
return true;
}
void PlotterCtrl::Drag(Point start, Point prev, Point curr, dword keyflags)
@ -696,7 +703,20 @@ void PlotterCtrl::Drag(Point start, Point prev, Point curr, dword keyflags)
// LLOG("PlotterCtrl::Drag, short = " << ~short_drag_drop << ", " << (~short_drag_drop
// ? typeid(*short_drag_drop).name() : "NULL") << ", long = " << ~drag_drop << ", "
// << (~drag_drop ? typeid(*drag_drop).name() : "NULL"));
if(drag_drop) {
if(!custom_drag) {
if(keyflags & (K_SHIFT | K_CTRL)) {
Rect rc_prev = Null, rc_curr = Null;
if(!IsNull(prev)) rc_prev = RectSort(start, prev);
if(!IsNull(curr)) rc_curr = RectSort(start, curr);
ViewDraw draw(this);
DrawDragDropRect(draw, rc_prev, rc_curr, 2);
}
else {
if(!IsNull(curr))
PanOffset(curr - start);
}
}
else if(drag_drop) {
lock_drag_drop = true;
// LLOG("PlotterCtrl::Drag->drag_drop::Drag");
drag_drop->Drag(drag_start, FromPushClientNull(prev), FromPushClientNull(curr), keyflags);
@ -708,7 +728,31 @@ void PlotterCtrl::Drag(Point start, Point prev, Point curr, dword keyflags)
void PlotterCtrl::Drop(Point start, Point end, dword keyflags)
{
if(drag_drop)
if(!custom_drag) {
Rect rc = RectSort(start, end);
Rectf log = FromClient(rc);
Pointf log_center = log.CenterPoint();
Rectf view = GetViewRect();
double ratio = max(1e-10, fpabsmax(log.Size() / view.GetSize()));
if(keyflags & K_SHIFT) {
Sizef new_scale = GetScale() / ratio;
Pointf new_delta = Sizef(GetSize() >> 1) - Sizef(log_center) * new_scale;
SetZoom(new_scale, new_delta);
WhenUserZoom();
}
else if(keyflags & K_CTRL) {
Point scr_center = ToClient(log_center);
Sizef new_scale = GetScale() * ratio;
Pointf new_delta = Pointf(scr_center) - Sizef(view.CenterPoint()) * new_scale;
SetZoom(new_scale, new_delta);
WhenUserZoom();
}
else {
SetDelta(push_delta + Sizef(end - start));
PanOffset(Point(0, 0));
}
}
else if(drag_drop)
drag_drop->Drop(drag_start, FromPushClient(end), keyflags);
}
@ -720,6 +764,7 @@ void PlotterCtrl::Click(Point pt, dword keyflags)
void PlotterCtrl::Cancel()
{
PanOffset(Size(0, 0));
if(drag_drop) {
drag_drop->Cancel();
}

View file

@ -234,6 +234,7 @@ private:
bool show_scroll;
bool lock_drag_drop;
bool lock_short_drag_drop;
bool custom_drag;
};
template <class T>

View file

@ -20,35 +20,36 @@ IMAGE_ID(zoom_lyr)
IMAGE_ID(zoom_sel)
IMAGE_BEGIN_DATA
IMAGE_DATA(120,156,237,90,91,114,219,48,12,212,79,58,249,73,38,147,19,235,104,190,25,43,59,162,2,130,120,44,8,90,109,90)
IMAGE_DATA(193,131,177,76,98,23,224,3,4,227,120,121,95,222,151,95,219,107,182,20,34,17,251,251,99,85,15,207,236,59,58,161)
IMAGE_DATA(157,227,142,38,163,207,106,47,158,13,107,43,130,34,56,216,223,232,248,106,159,52,231,108,109,52,105,214,140,175,165,131)
IMAGE_DATA(93,20,59,20,107,241,141,203,199,246,122,217,94,34,123,112,131,115,28,9,16,230,137,108,248,146,220,24,119,124,49,250)
IMAGE_DATA(57,158,219,84,124,229,136,36,66,145,52,233,63,59,254,106,131,38,136,52,255,116,236,137,68,105,120,132,241,4,56,196)
IMAGE_DATA(61,231,224,229,229,81,184,2,28,81,201,96,41,7,40,87,165,196,250,128,74,113,70,165,76,199,234,245,161,7,129,4)
IMAGE_DATA(103,20,209,3,96,66,226,139,124,227,114,175,148,160,175,68,198,102,78,140,236,137,197,121,70,37,130,151,236,52,60,111)
IMAGE_DATA(27,61,145,233,179,55,87,86,37,200,224,179,241,211,54,196,78,179,69,253,68,100,70,181,155,149,3,35,2,96,193,195)
IMAGE_DATA(32,122,234,29,184,117,93,31,186,7,178,233,246,188,250,60,119,204,237,118,35,216,29,71,85,225,168,62,31,88,142,241)
IMAGE_DATA(57,30,126,171,186,28,12,95,227,110,99,103,170,115,236,152,47,158,198,86,195,90,120,209,86,242,191,18,142,114,196,239)
IMAGE_DATA(142,91,240,111,142,179,177,39,235,202,252,183,186,118,216,175,49,114,61,214,64,224,105,57,90,188,84,157,133,117,235,98)
IMAGE_DATA(23,125,43,28,212,15,197,28,207,146,24,246,244,179,43,82,238,202,184,55,241,239,103,239,244,25,169,102,94,5,147,108)
IMAGE_DATA(71,170,14,90,105,148,254,151,109,74,76,131,46,64,111,64,153,114,134,138,231,195,155,80,99,194,222,196,9,65,2,240)
IMAGE_DATA(236,35,117,46,83,91,17,91,111,199,252,244,29,31,205,8,212,134,199,144,89,215,136,24,246,215,253,166,175,111,215,253)
IMAGE_DATA(230,186,223,168,107,118,244,139,190,21,14,234,135,98,142,103,73,12,123,250,217,21,41,119,101,28,86,189,102,203,104,53)
IMAGE_DATA(177,78,125,173,159,191,107,177,104,215,1,228,179,22,183,230,11,245,163,97,60,95,210,88,248,179,135,177,226,246,218,159)
IMAGE_DATA(40,248,87,117,105,209,179,198,183,215,190,27,85,177,220,158,126,6,190,151,141,226,37,30,21,35,113,11,28,16,94,137)
IMAGE_DATA(165,155,55,73,188,113,122,120,206,197,237,81,60,27,59,236,83,193,135,57,50,120,100,15,13,226,161,245,51,176,46,71)
IMAGE_DATA(135,255,88,94,27,88,163,188,252,93,253,255,118,255,43,173,12,220,248,108,229,193,157,173,255,251,248,207,185,38,172,133)
IMAGE_DATA(93,208,7,113,17,158,214,182,10,198,209,251,210,241,18,135,23,183,133,215,125,235,254,41,135,220,255,115,240,243,231,159)
IMAGE_DATA(203,232,30,200,238,193,121,121,240,36,249,220,94,39,75,33,154,225,176,62,207,226,61,131,67,178,71,219,104,95,132,199)
IMAGE_DATA(106,231,26,181,153,21,143,133,201,216,141,138,54,118,68,27,158,178,223,2,162,239,245,219,76,202,19,21,137,103,84,25)
IMAGE_DATA(79,243,77,115,84,135,86,228,217,18,188,41,101,7,49,225,80,44,25,142,29,175,114,0,155,162,88,28,172,31,209,134)
IMAGE_DATA(99,0,223,112,252,1,124,147,36,225,249,163,201,1,36,144,138,141,225,123,44,40,25,236,146,196,46,217,131,196,197,6)
IMAGE_DATA(254,55,56,42,19,146,119,8,239,37,62,136,133,255,182,85,176,127,123,50,127,227,251,132,139,227,101,14,124,254,188,196)
IMAGE_DATA(71,42,173,149,252,104,165,110,57,198,246,47,227,24,146,25,55,9,24,159,248,161,128,150,12,34,158,94,1,129,171,28)
IMAGE_DATA(132,167,254,17,188,116,29,53,252,55,252,220,167,22,127,93,124,42,117,65,121,12,138,255,110,126,36,78,37,126,97,118)
IMAGE_DATA(203,225,91,227,64,240,44,49,58,181,240,116,12,64,66,138,248,5,76,40,109,174,30,190,99,73,217,224,202,254,30,228)
IMAGE_DATA(248,142,107,50,199,8,190,114,168,157,103,29,6,139,176,25,133,205,28,194,83,255,16,190,140,31,6,20,47,197,161,29)
IMAGE_DATA(6,143,95,223,212,126,22,131,226,191,105,63,126,193,67,99,208,227,239,252,210,95,64,105,28,28,223,141,125,231,145,218)
IMAGE_DATA(217,252,119,254,234,51,245,227,29,6,28,63,114,24,112,191,203,117,24,28,28,90,223,111,154,36,191,69,0,0,0,0)
IMAGE_END_DATA(992, 19)
IMAGE_DATA(120,156,237,90,219,114,27,49,8,221,151,116,210,135,100,50,253,226,253,52,255,153,186,235,172,54,8,129,56,128,188,109)
IMAGE_DATA(90,227,97,188,150,56,7,116,65,40,142,151,247,229,125,249,177,189,102,75,33,226,177,223,31,171,90,120,102,223,209,9)
IMAGE_DATA(237,28,119,54,13,250,70,237,197,178,97,109,69,80,4,7,251,139,142,175,246,73,115,206,214,70,147,102,205,248,90,26)
IMAGE_DATA(216,69,177,67,177,35,190,184,124,108,175,151,237,37,178,59,55,56,199,145,0,97,30,207,134,47,201,141,177,227,203,160)
IMAGE_DATA(159,227,185,77,197,87,14,79,34,20,73,147,254,179,227,175,54,104,130,72,243,79,199,158,72,148,134,71,24,143,131,67)
IMAGE_DATA(220,115,6,94,94,30,133,203,193,225,149,12,150,114,128,242,172,148,88,31,80,41,174,168,148,233,88,173,62,244,32,144)
IMAGE_DATA(224,140,194,123,0,76,72,124,145,47,46,123,165,4,125,37,50,54,115,98,100,79,44,206,19,21,15,94,178,211,240,188)
IMAGE_DATA(45,122,34,211,103,107,174,70,149,32,131,207,198,79,219,16,59,205,22,245,227,145,25,213,110,86,14,68,4,192,130,135)
IMAGE_DATA(129,247,212,59,113,235,186,222,245,8,100,211,237,121,181,121,118,204,237,118,35,216,3,71,85,225,168,62,239,88,142,177)
IMAGE_DATA(57,238,126,171,154,28,12,95,227,110,99,103,170,115,28,152,79,158,198,86,195,142,240,162,173,228,127,37,28,229,140,223)
IMAGE_DATA(28,183,224,127,56,206,198,158,172,43,243,223,234,218,97,63,199,200,245,92,3,129,167,229,104,241,82,117,22,214,173,139)
IMAGE_DATA(93,244,173,112,80,63,20,115,62,75,50,176,167,159,77,145,114,87,198,189,137,127,63,91,167,79,164,154,89,21,76,178)
IMAGE_DATA(141,84,29,180,210,40,253,47,219,148,12,13,186,0,173,1,101,202,25,42,150,15,107,66,7,19,246,38,78,8,18,128)
IMAGE_DATA(101,239,169,115,153,218,138,216,90,59,230,187,239,120,111,70,160,54,60,134,204,186,122,100,96,255,188,223,244,245,237,121)
IMAGE_DATA(191,121,222,111,212,53,59,251,69,223,10,7,245,67,49,231,179,36,3,123,250,217,20,41,119,101,28,86,189,102,75,180)
IMAGE_DATA(154,140,78,125,173,159,191,107,177,104,215,1,228,179,22,183,230,11,245,163,97,44,95,210,88,248,179,133,25,197,109,181)
IMAGE_DATA(63,80,246,234,245,186,252,188,194,149,158,53,182,189,246,221,168,138,229,246,244,51,240,189,172,23,47,241,168,24,137,91)
IMAGE_DATA(224,128,240,74,44,221,188,73,98,141,211,194,115,46,110,143,226,217,216,97,159,10,222,205,145,193,35,123,40,136,135,214)
IMAGE_DATA(111,128,53,57,58,252,126,20,80,88,163,188,252,61,251,255,237,254,87,250,119,13,55,190,90,121,112,87,235,255,62,126)
IMAGE_DATA(252,63,122,25,89,11,187,160,7,113,30,158,214,182,10,198,209,251,210,241,18,135,21,247,8,175,251,214,253,83,14,185)
IMAGE_DATA(255,251,224,231,207,63,151,232,30,200,238,193,121,121,240,32,249,181,189,46,150,66,52,195,49,250,60,139,247,10,14,201)
IMAGE_DATA(30,109,163,125,30,158,81,59,87,175,205,172,120,70,152,140,93,84,180,177,35,218,240,148,227,22,224,125,175,223,102,82)
IMAGE_DATA(30,175,72,60,81,101,60,205,55,205,94,13,173,200,163,197,121,83,202,14,98,194,161,88,50,28,7,94,229,0,54,69)
IMAGE_DATA(25,113,176,126,68,27,142,0,190,225,248,3,248,38,73,220,243,71,147,3,72,32,21,235,195,247,88,80,50,216,37,137)
IMAGE_DATA(93,178,7,137,137,117,252,111,48,42,19,146,55,132,183,18,31,196,194,127,219,42,216,191,61,153,191,240,125,194,249,241)
IMAGE_DATA(50,7,62,127,86,226,35,149,118,148,252,104,165,110,57,98,251,151,113,132,100,198,77,2,198,39,126,40,160,37,131,136)
IMAGE_DATA(167,87,64,224,42,7,225,169,127,4,47,93,71,7,254,27,126,238,83,139,191,46,62,149,186,160,60,6,197,127,55,63)
IMAGE_DATA(18,167,18,191,48,187,229,244,173,113,32,120,150,24,157,142,240,116,12,64,66,138,248,5,76,40,109,174,238,190,125,73)
IMAGE_DATA(217,224,202,241,238,228,248,138,107,50,71,4,95,57,212,206,171,14,131,69,216,140,194,102,118,225,169,127,8,95,226,135)
IMAGE_DATA(1,197,75,113,104,135,193,253,215,55,181,159,197,160,248,111,218,207,95,240,208,24,244,248,59,191,244,23,80,26,7,199)
IMAGE_DATA(119,99,63,120,164,118,54,255,157,191,250,76,253,88,135,1,199,71,14,3,238,119,121,30,6,39,135,214,247,27,211,176)
IMAGE_DATA(191,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
IMAGE_END_DATA(1024, 19)

View file

@ -1947,18 +1947,22 @@ One<MarkTool::Marker> MarkTool::Nabla(int size, Color color, Color outline, int
class CircleMarker : public AreaMarker
{
public:
CircleMarker(int size, Color color, Color outline, int outline_width)
: AreaMarker(size, color, outline, outline_width) {}
CircleMarker(int size, Color color, Color outline, int outline_width);
virtual void Paint(Draw& draw, const Vector<Point>& pt);
};
CircleMarker::CircleMarker(int size, Color color, Color outline, int outline_width)
: AreaMarker(size, color, Nvl(outline, color), IsNull(outline) ? 0 : outline_width)
{
}
void CircleMarker::Paint(Draw& draw, const Vector<Point>& pt)
{
int half = size >> 1;
for(int t = 0; t < pt.GetCount(); t++)
draw.DrawEllipse(RectC(pt[t].x - half, pt[t].y - half, size, size),
color, outline_width, outline);
color, outline_width, Nvl(outline, color));
}
One<MarkTool::Marker> MarkTool::Circle(int size, Color color, Color outline, int outline_width)