[gnu.g++] Simpler InterViews demo

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