ROOT logo
// @(#)root/gl:$Id$
// Author: Bertrand Bellenot 2008

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

#include "TGLOverlayButton.h"
#include "TColor.h"
#include "TMath.h"

#include <TGLRnrCtx.h>
#include <TGLIncludes.h>
#include <TGLSelectRecord.h>
#include <TGLUtil.h>
#include <TGLCamera.h>
#include <TGLViewerBase.h>

//______________________________________________________________________________
//
//
// GL-overaly button.
//
//

ClassImp(TGLOverlayButton);

//______________________________________________________________________________
TGLOverlayButton::TGLOverlayButton(TGLViewerBase *parent, const char *text,
   Float_t posx, Float_t posy, Float_t width, Float_t height) :
   TGLOverlayElement(),
   fText(text),
   fActiveID(-1),
   fBackColor(0x8080ff),
   fTextColor(0xffffff),
   fNormAlpha(0.2),
   fHighAlpha(1.0),
   fPosX(posx),
   fPosY(posy),
   fWidth(width),
   fHeight(height)
{
   // Constructor.

   if (parent)
      parent->AddOverlayElement(this);
}

/******************************************************************************/
void TGLOverlayButton::Render(TGLRnrCtx& rnrCtx)
{
   // Render the overlay elements.

   Float_t r, g, b;
   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
   glLoadIdentity();
   if (rnrCtx.Selection())
   {
      TGLRect rect(*rnrCtx.GetPickRectangle());
      rnrCtx.GetCamera()->WindowToViewport(rect);
      gluPickMatrix(rect.X(), rect.Y(), rect.Width(), rect.Height(),
                    (Int_t*) rnrCtx.GetCamera()->RefViewport().CArr());
   }
   const TGLRect& vp = rnrCtx.RefCamera().RefViewport();
   glOrtho(vp.X(), vp.Width(), vp.Y(), vp.Height(), 0, 1);
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   glLoadIdentity();

   Float_t offset = (fPosY >= 0.0)? 0.0 : vp.Height()-fHeight;

   TGLCapabilitySwitch lights_off(GL_LIGHTING, kFALSE);
   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
   glDisable(GL_CULL_FACE);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   glShadeModel(GL_FLAT);
   glClearColor(0.0, 0.0, 0.0, 0.0);
   glPushName(1);

   // Button rendering
   {
      TGLCapabilitySwitch move_to_back(GL_POLYGON_OFFSET_FILL, kTRUE);
      glPolygonOffset(0.5f, 0.5f);
      glPushMatrix();
      glTranslatef(fPosX, offset+fPosY, 0);
      // First the border, same color as text
      TColor::Pixel2RGB(fTextColor, r, g, b);
      (fActiveID == 1) ? TGLUtil::Color4f(r, g, b, fHighAlpha):TGLUtil::Color4f(r, g, b, fNormAlpha);
      TGLUtil::LineWidth(1);
      glBegin(GL_LINE_LOOP);
      glVertex2f(0.0, 0.0);
      glVertex2f(0.0, fHeight);
      glVertex2f(fWidth, fHeight);
      glVertex2f(fWidth, 0.0);
      glEnd();
      // then the button itself, with its own color
      // decrease a bit the highlight, to avoid bad effects...
      TColor::Pixel2RGB(fBackColor, r, g, b);
      (fActiveID == 1) ? TGLUtil::Color4f(r, g, b, fHighAlpha * 0.8):TGLUtil::Color4f(r, g, b, fNormAlpha);
      glBegin(GL_QUADS);
      glVertex2f(0.0, 0.0);
      glVertex2f(0.0, fHeight);
      glVertex2f(fWidth, fHeight);
      glVertex2f(fWidth, 0.0);
      glEnd();
      glPopMatrix();
   }

   // Text rendering
   {
      rnrCtx.RegisterFontNoScale(TMath::Nint(fHeight*0.8), "arial",  TGLFont::kPixmap, fFont);
      fFont.PreRender(kFALSE);

      TColor::Pixel2RGB(fTextColor, r, g, b);
      (fActiveID == 1) ? TGLUtil::Color4f(r, g, b, fHighAlpha):TGLUtil::Color4f(r, g, b, fNormAlpha);
      glPushMatrix();
      glTranslatef(fPosX+(fWidth/2.0), offset+fPosY+(fHeight/2.0), 0);
      Float_t llx, lly, llz, urx, ury, urz;
      fFont.BBox(fText.Data(), llx, lly, llz, urx, ury, urz);
      glRasterPos2i(0, 0);
      glBitmap(0, 0, 0, 0, -urx*0.5f, -ury*0.5f, 0);
      fFont.Render(fText.Data());
      fFont.PostRender();
      glPopMatrix();
   }
   glPopName();

   glMatrixMode(GL_PROJECTION);
   glPopMatrix();
   glMatrixMode(GL_MODELVIEW);
   glPopMatrix();
}

//______________________________________________________________________________
void TGLOverlayButton::Clicked(TGLViewerBase *viewer)
{
   // Emits "Clicked(TGLViewerBase*)" signal.
   // Called when user click on the GL button.

   Emit("Clicked(TGLViewerBase*)", (Long_t)viewer);
}

/******************************************************************************/
// Virtual event handlers from TGLOverlayElement
/******************************************************************************/

//______________________________________________________________________________
Bool_t TGLOverlayButton::Handle(TGLRnrCtx         & rnrCtx,
                               TGLOvlSelectRecord & rec,
                               Event_t            * event)
{
   // Handle overlay event.
   // Return TRUE if event was handled.

   if (event->fCode != kButton1) {
      return kFALSE;
   }
   switch (event->fType) {
      case kButtonPress:
         if (rec.GetItem(1) == 1) {
            return kTRUE;
         }
         break;
      case kButtonRelease:
         if (rec.GetItem(1) == 1) {
            Clicked(rnrCtx.GetViewer());
            return kTRUE;
         }
         break;
      default:
         break;
   }
   return kFALSE;
}

//______________________________________________________________________________
Bool_t TGLOverlayButton::MouseEnter(TGLOvlSelectRecord& /*rec*/)
{
   // Mouse has entered overlay area.

   fActiveID = 1;
   return kTRUE;
}

//______________________________________________________________________________
void TGLOverlayButton::MouseLeave()
{
   // Mouse has left overlay area.

   fActiveID = -1;
}
 TGLOverlayButton.cxx:1
 TGLOverlayButton.cxx:2
 TGLOverlayButton.cxx:3
 TGLOverlayButton.cxx:4
 TGLOverlayButton.cxx:5
 TGLOverlayButton.cxx:6
 TGLOverlayButton.cxx:7
 TGLOverlayButton.cxx:8
 TGLOverlayButton.cxx:9
 TGLOverlayButton.cxx:10
 TGLOverlayButton.cxx:11
 TGLOverlayButton.cxx:12
 TGLOverlayButton.cxx:13
 TGLOverlayButton.cxx:14
 TGLOverlayButton.cxx:15
 TGLOverlayButton.cxx:16
 TGLOverlayButton.cxx:17
 TGLOverlayButton.cxx:18
 TGLOverlayButton.cxx:19
 TGLOverlayButton.cxx:20
 TGLOverlayButton.cxx:21
 TGLOverlayButton.cxx:22
 TGLOverlayButton.cxx:23
 TGLOverlayButton.cxx:24
 TGLOverlayButton.cxx:25
 TGLOverlayButton.cxx:26
 TGLOverlayButton.cxx:27
 TGLOverlayButton.cxx:28
 TGLOverlayButton.cxx:29
 TGLOverlayButton.cxx:30
 TGLOverlayButton.cxx:31
 TGLOverlayButton.cxx:32
 TGLOverlayButton.cxx:33
 TGLOverlayButton.cxx:34
 TGLOverlayButton.cxx:35
 TGLOverlayButton.cxx:36
 TGLOverlayButton.cxx:37
 TGLOverlayButton.cxx:38
 TGLOverlayButton.cxx:39
 TGLOverlayButton.cxx:40
 TGLOverlayButton.cxx:41
 TGLOverlayButton.cxx:42
 TGLOverlayButton.cxx:43
 TGLOverlayButton.cxx:44
 TGLOverlayButton.cxx:45
 TGLOverlayButton.cxx:46
 TGLOverlayButton.cxx:47
 TGLOverlayButton.cxx:48
 TGLOverlayButton.cxx:49
 TGLOverlayButton.cxx:50
 TGLOverlayButton.cxx:51
 TGLOverlayButton.cxx:52
 TGLOverlayButton.cxx:53
 TGLOverlayButton.cxx:54
 TGLOverlayButton.cxx:55
 TGLOverlayButton.cxx:56
 TGLOverlayButton.cxx:57
 TGLOverlayButton.cxx:58
 TGLOverlayButton.cxx:59
 TGLOverlayButton.cxx:60
 TGLOverlayButton.cxx:61
 TGLOverlayButton.cxx:62
 TGLOverlayButton.cxx:63
 TGLOverlayButton.cxx:64
 TGLOverlayButton.cxx:65
 TGLOverlayButton.cxx:66
 TGLOverlayButton.cxx:67
 TGLOverlayButton.cxx:68
 TGLOverlayButton.cxx:69
 TGLOverlayButton.cxx:70
 TGLOverlayButton.cxx:71
 TGLOverlayButton.cxx:72
 TGLOverlayButton.cxx:73
 TGLOverlayButton.cxx:74
 TGLOverlayButton.cxx:75
 TGLOverlayButton.cxx:76
 TGLOverlayButton.cxx:77
 TGLOverlayButton.cxx:78
 TGLOverlayButton.cxx:79
 TGLOverlayButton.cxx:80
 TGLOverlayButton.cxx:81
 TGLOverlayButton.cxx:82
 TGLOverlayButton.cxx:83
 TGLOverlayButton.cxx:84
 TGLOverlayButton.cxx:85
 TGLOverlayButton.cxx:86
 TGLOverlayButton.cxx:87
 TGLOverlayButton.cxx:88
 TGLOverlayButton.cxx:89
 TGLOverlayButton.cxx:90
 TGLOverlayButton.cxx:91
 TGLOverlayButton.cxx:92
 TGLOverlayButton.cxx:93
 TGLOverlayButton.cxx:94
 TGLOverlayButton.cxx:95
 TGLOverlayButton.cxx:96
 TGLOverlayButton.cxx:97
 TGLOverlayButton.cxx:98
 TGLOverlayButton.cxx:99
 TGLOverlayButton.cxx:100
 TGLOverlayButton.cxx:101
 TGLOverlayButton.cxx:102
 TGLOverlayButton.cxx:103
 TGLOverlayButton.cxx:104
 TGLOverlayButton.cxx:105
 TGLOverlayButton.cxx:106
 TGLOverlayButton.cxx:107
 TGLOverlayButton.cxx:108
 TGLOverlayButton.cxx:109
 TGLOverlayButton.cxx:110
 TGLOverlayButton.cxx:111
 TGLOverlayButton.cxx:112
 TGLOverlayButton.cxx:113
 TGLOverlayButton.cxx:114
 TGLOverlayButton.cxx:115
 TGLOverlayButton.cxx:116
 TGLOverlayButton.cxx:117
 TGLOverlayButton.cxx:118
 TGLOverlayButton.cxx:119
 TGLOverlayButton.cxx:120
 TGLOverlayButton.cxx:121
 TGLOverlayButton.cxx:122
 TGLOverlayButton.cxx:123
 TGLOverlayButton.cxx:124
 TGLOverlayButton.cxx:125
 TGLOverlayButton.cxx:126
 TGLOverlayButton.cxx:127
 TGLOverlayButton.cxx:128
 TGLOverlayButton.cxx:129
 TGLOverlayButton.cxx:130
 TGLOverlayButton.cxx:131
 TGLOverlayButton.cxx:132
 TGLOverlayButton.cxx:133
 TGLOverlayButton.cxx:134
 TGLOverlayButton.cxx:135
 TGLOverlayButton.cxx:136
 TGLOverlayButton.cxx:137
 TGLOverlayButton.cxx:138
 TGLOverlayButton.cxx:139
 TGLOverlayButton.cxx:140
 TGLOverlayButton.cxx:141
 TGLOverlayButton.cxx:142
 TGLOverlayButton.cxx:143
 TGLOverlayButton.cxx:144
 TGLOverlayButton.cxx:145
 TGLOverlayButton.cxx:146
 TGLOverlayButton.cxx:147
 TGLOverlayButton.cxx:148
 TGLOverlayButton.cxx:149
 TGLOverlayButton.cxx:150
 TGLOverlayButton.cxx:151
 TGLOverlayButton.cxx:152
 TGLOverlayButton.cxx:153
 TGLOverlayButton.cxx:154
 TGLOverlayButton.cxx:155
 TGLOverlayButton.cxx:156
 TGLOverlayButton.cxx:157
 TGLOverlayButton.cxx:158
 TGLOverlayButton.cxx:159
 TGLOverlayButton.cxx:160
 TGLOverlayButton.cxx:161
 TGLOverlayButton.cxx:162
 TGLOverlayButton.cxx:163
 TGLOverlayButton.cxx:164
 TGLOverlayButton.cxx:165
 TGLOverlayButton.cxx:166
 TGLOverlayButton.cxx:167
 TGLOverlayButton.cxx:168
 TGLOverlayButton.cxx:169
 TGLOverlayButton.cxx:170
 TGLOverlayButton.cxx:171
 TGLOverlayButton.cxx:172
 TGLOverlayButton.cxx:173
 TGLOverlayButton.cxx:174
 TGLOverlayButton.cxx:175
 TGLOverlayButton.cxx:176
 TGLOverlayButton.cxx:177
 TGLOverlayButton.cxx:178
 TGLOverlayButton.cxx:179
 TGLOverlayButton.cxx:180
 TGLOverlayButton.cxx:181
 TGLOverlayButton.cxx:182
 TGLOverlayButton.cxx:183
 TGLOverlayButton.cxx:184
 TGLOverlayButton.cxx:185
 TGLOverlayButton.cxx:186
 TGLOverlayButton.cxx:187
 TGLOverlayButton.cxx:188
 TGLOverlayButton.cxx:189
 TGLOverlayButton.cxx:190
 TGLOverlayButton.cxx:191
 TGLOverlayButton.cxx:192
 TGLOverlayButton.cxx:193
 TGLOverlayButton.cxx:194
 TGLOverlayButton.cxx:195
 TGLOverlayButton.cxx:196
 TGLOverlayButton.cxx:197