// $Log: wslide.cc,v $ // Revision 1.1.1.1 2000/12/16 20:45:47 stuart // Released TUIPeer sources // extern "C" { #include } #include void Window::slide(const Rect &r,Dir direct,int dist) { slide(r,direct,dist,true); } void Window::slide(const Rect &r,Dir direct,int dist,bool redraw) { // rectangle to move in absolute coords Rect r1(r.moverel(loc.r1,loc.c1).intersect(screenloc)); if (r1.isempty()) return; // trivially succeed if off screen Rect r2(r1); // new location of r1 after slide Rect r0(r1); // area to redraw after slide int d = direct; if (dist < 0) { dist = -dist; d ^= 1; } switch (d) { case DIR_UP: r2 = r1.moverel(-dist).intersect(screenloc); r1 = r2.moverel(dist); r0.r1 = r2.r2 + 1; break; case DIR_DOWN: r2 = r1.moverel(dist).intersect(screenloc); r1 = r2.moverel(-dist); r0.r2 = r2.r1 - 1; break; case DIR_LEFT: r2 = r1.moverel(0,-dist).intersect(screenloc); r1 = r2.moverel(0,dist); r0.c1 = r2.c2 + 1; break; case DIR_RIGHT: r2 = r1.moverel(0,dist).intersect(screenloc); r1 = r2.moverel(0,-dist); r0.c2 = r2.c1 - 1; break; } if (!redraw) { if (!ontop() || r1.isempty() || !PSslide((RECT *)&r1,(dir)d,dist)) _draw(r2); } else { if (!ontop() || r1.isempty() || !PSslide((RECT *)&r1,(dir)d,dist)) _draw(r1.enclose(r2)); else _draw(r0); } }