cooper@gecrux.steinmetz.ge.com (Clark Cooper) (11/22/88)
I found the sample programs provided in the InterViews distribution confusing and difficult to use as templates. After some trial and error, I got the following simple program working. I offer it to the net as a simpler InterViews demonstration. ================================================================ #include <InterViews/interactor.h> #include <InterViews/world.h> #include <InterViews/frame.h> #include <InterViews/banner.h> #include <InterViews/sensor.h> #include <InterViews/painter.h> #include <InterViews/shape.h> #include <InterViews/menu.h> #include <InterViews/brush.h> Brush* WideBrush; class Dobj : public Interactor { Coord lastx, lasty; int drawing; Menu* menu; Menu* confirm; public: Dobj(); void Handle(Event& ev); }; Dobj::Dobj () { input = new Sensor(updownEvents); input->Catch(OnEvent); if (shape) delete shape; shape = new Shape; shape->Square(400); shape->Rigid(hfil, hfil, vfil, vfil); drawing = 0; menu = new Menu; menu->Insert(new TextItem("Invert Video", 'i')); menu->Insert(new TextItem("Thick Brush", 'w')); menu->Insert(new TextItem("Thin Brush", 'n')); menu->Insert(new TextItem("Exit", 'E')); menu->Compose(); confirm = new Menu; confirm->Insert(new TextItem("Yes, Really Quit", 'y')); confirm->Insert(new TextItem("No, I didn't mean it", 'n')); confirm->Compose(); SetCanvasType(CanvasSaveContents); } void Dobj::Handle(Event& ev) { switch (ev.eventType) { case DownEvent: switch (ev.button) { case LEFTMOUSE: lastx = ev.x; lasty = ev.y; drawing = 1; Listen(allEvents); break; case MIDDLEMOUSE: output->ClearRect(canvas, 0, 0, xmax, ymax); break; case RIGHTMOUSE: TextItem* item; menu->Popup(ev, item); if (item) switch (item->tag) { case 'i': output->SetColors(output->GetBgColor(), output->GetFgColor()); break; case 'w': output->SetBrush(WideBrush); break; case 'n': output->SetBrush(single); break; case 'E': confirm->Popup(ev, item); if (item && item->tag == 'y') exit(0); break; } break; } break; case UpEvent: if (ev.button == LEFTMOUSE) { drawing = 0; Listen(input); } break; case MotionEvent: if (drawing) { output->Line(canvas, lastx, lasty, ev.x, ev.y); lastx = ev.x; lasty = ev.y; } break; case OffEvent: drawing = 0; break; case OnEvent: Poll(ev); if (ev.leftmouse) { lastx = ev.x; lasty = ev.y; drawing = 1; Listen(allEvents); } else Listen(input); } } World *world; main(int argc, char** argv) { world = new World(argv[0], argc, argv); WideBrush = new Brush(0xffff, 3); world->Insert(new TitleFrame(new Banner("", "Test Window", ""), new Dobj, 2)); world->Run(); } -- Clark Cooper cooper@gecrux.steinmetz.ge.com, coopercc@crd.ge.com, coopercc@ge-crd.arpa, ...!uunet!steinmetz!cooper