// @(#)root/gl:$Id$
// Author:  Matevz Tadel, Feb 2007

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TGLOverlay_H
#define ROOT_TGLOverlay_H

#include <GuiTypes.h>

class TGLRnrCtx;
class TGLOvlSelectRecord;

#include <list>

class TGLOverlayElement
{
public:
   enum ERole  { kUser, kViewer, kAnnotation, kAll };

   enum EState { kInvisible = 1, kDisabled = 2, kActive = 4,
                 kAllVisible = kDisabled | kActive };

private:
   TGLOverlayElement(const TGLOverlayElement&);            // Not implemented
   TGLOverlayElement& operator=(const TGLOverlayElement&); // Not implemented

protected:
   ERole   fRole;
   EState  fState;

   void ProjectionMatrixPushIdentity();

public:
   TGLOverlayElement(ERole r=kUser, EState s=kActive) :
      fRole(r), fState(s) {}
   virtual ~TGLOverlayElement() {}

   virtual Bool_t MouseEnter(TGLOvlSelectRecord& selRec);
   virtual Bool_t MouseStillInside(TGLOvlSelectRecord& selRec);
   virtual Bool_t Handle(TGLRnrCtx& rnrCtx, TGLOvlSelectRecord& selRec,
                         Event_t* event);
   virtual void   MouseLeave();

   virtual void Render(TGLRnrCtx& rnrCtx) = 0;

   ERole   GetRole() const  { return fRole; }
   void    SetRole(ERole r) { fRole = r; }

   EState  GetState() const   { return fState; }
   void    SetState(EState s) { fState = s; }

   void    SetBinaryState(Bool_t s) { SetState(s ? kActive : kInvisible); }

   ClassDef(TGLOverlayElement, 0) // Base class for GL overlay elements.
};


class TGLOverlayList
{
private:
   TGLOverlayList(const TGLOverlayList&);            // Not implemented
   TGLOverlayList& operator=(const TGLOverlayList&); // Not implemented

protected:
   std::list<TGLOverlayElement*> fElements;

public:
   TGLOverlayList() : fElements() {}
   virtual ~TGLOverlayList() {}

   // void AddElement(TGLOverlayElement* element);
   // void RemoveElement(TGLOverlayElement* element);

   // TGLOverlayElement* SelectElement(TGLSelectRecord& selRec, Int_t nameOff);

   ClassDef(TGLOverlayList, 0) // Collection of overlay elements to draw/select together.
};


#endif
 TGLOverlay.h:1
 TGLOverlay.h:2
 TGLOverlay.h:3
 TGLOverlay.h:4
 TGLOverlay.h:5
 TGLOverlay.h:6
 TGLOverlay.h:7
 TGLOverlay.h:8
 TGLOverlay.h:9
 TGLOverlay.h:10
 TGLOverlay.h:11
 TGLOverlay.h:12
 TGLOverlay.h:13
 TGLOverlay.h:14
 TGLOverlay.h:15
 TGLOverlay.h:16
 TGLOverlay.h:17
 TGLOverlay.h:18
 TGLOverlay.h:19
 TGLOverlay.h:20
 TGLOverlay.h:21
 TGLOverlay.h:22
 TGLOverlay.h:23
 TGLOverlay.h:24
 TGLOverlay.h:25
 TGLOverlay.h:26
 TGLOverlay.h:27
 TGLOverlay.h:28
 TGLOverlay.h:29
 TGLOverlay.h:30
 TGLOverlay.h:31
 TGLOverlay.h:32
 TGLOverlay.h:33
 TGLOverlay.h:34
 TGLOverlay.h:35
 TGLOverlay.h:36
 TGLOverlay.h:37
 TGLOverlay.h:38
 TGLOverlay.h:39
 TGLOverlay.h:40
 TGLOverlay.h:41
 TGLOverlay.h:42
 TGLOverlay.h:43
 TGLOverlay.h:44
 TGLOverlay.h:45
 TGLOverlay.h:46
 TGLOverlay.h:47
 TGLOverlay.h:48
 TGLOverlay.h:49
 TGLOverlay.h:50
 TGLOverlay.h:51
 TGLOverlay.h:52
 TGLOverlay.h:53
 TGLOverlay.h:54
 TGLOverlay.h:55
 TGLOverlay.h:56
 TGLOverlay.h:57
 TGLOverlay.h:58
 TGLOverlay.h:59
 TGLOverlay.h:60
 TGLOverlay.h:61
 TGLOverlay.h:62
 TGLOverlay.h:63
 TGLOverlay.h:64
 TGLOverlay.h:65
 TGLOverlay.h:66
 TGLOverlay.h:67
 TGLOverlay.h:68
 TGLOverlay.h:69
 TGLOverlay.h:70
 TGLOverlay.h:71
 TGLOverlay.h:72
 TGLOverlay.h:73
 TGLOverlay.h:74
 TGLOverlay.h:75
 TGLOverlay.h:76
 TGLOverlay.h:77
 TGLOverlay.h:78
 TGLOverlay.h:79
 TGLOverlay.h:80
 TGLOverlay.h:81
 TGLOverlay.h:82
 TGLOverlay.h:83
 TGLOverlay.h:84
 TGLOverlay.h:85
 TGLOverlay.h:86
 TGLOverlay.h:87