#include #include void Zoomable::zoom(const Rect &r) { if (!zoomed) { orig = loc; zoomed = 1; } setphys(r); } void Zoomable::unzoom() { if (zoomed) { setphys(orig); zoomed = 0; } } struct sizeFrame: Controller, Frame { Rect r; sizeFrame(const Rect &size): r(size), Frame("MOVE/SIZE","Arrows, hjklHJKL, ENTER when done") { settype(2); setphys(size); setfocus(this); sync(); } void key(int); }; void sizeFrame::key(int ky) { switch (ky) { case KEY_UP: case 'k': // move up one setphys(r = r.moverel(-1,0)); break; case KEY_DOWN: case 'j': setphys(r = r.moverel(1,0)); break; case KEY_LEFT: case 'h': setphys(r = r.moverel(0,-1)); break; case KEY_RIGHT: case 'l': setphys(r = r.moverel(0,1)); break; case 'K': if (r.r2) setphys(Rect(r.r1,r.c1,--r.r2,r.c2)); break; case 'J': setphys(Rect(r.r1,r.c1,++r.r2,r.c2)); break; case KEY_SLEFT: case 'H': if (r.c2) setphys(Rect(r.r1,r.c1,r.r2,--r.c2)); break; case KEY_SRIGHT: case 'L': setphys(Rect(r.r1,r.c1,r.r2,++r.c2)); break; case KEY_ENTER: case KEY_F(1): case '\r': case '\n': setfocus(0); break; default: Controller::key(ky); return; } sync(); } void Zoomable::sizeFromUser() { hide(); sizeFrame f(loc); f.run(); zoomed = 0; setphys(f.r); }