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