[ROOT] Painting...?

From: Paolo ADRAGNA (paolo.adragna@pi.infn.it)
Date: Sat Jun 21 2003 - 15:37:28 MEST


Hi all,

I would like to hear your opinion about the following ideas.

In my program I built a Display Window which is essentially composed by a 
matrix of TRootEmbeddedCanvas. In every Embedded Canvas is painted an 
histogram. Now I would like to fill completely the picture in memory to 
display it only when it is needed: the effect should be of a "ready to see" 
picture appearing on the screen. I know that TRootEmbeddedCanvas creates a 
TGCanvas in which a TCanvas is created, and that a TCanvas is built using 
"double buffer" tecnique, but I can't figure out how I can achieve the  
"ready to see" effect (perhaps using TPad::CopyPixmaps()?).

Just for example I attach my present code.
Thanks,

					Paolo


/***************************************************************************
                          TC_ScrollingTabFrame.cpp  -  description
                             -------------------
    begin                : Thu May 8 2003
    copyright            : (C) 2003 by Paolo ADRAGNA
    email                : paolo.adragna@pi.infn.it
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include "TC_ScrollingTabFrame.h"
#include "TC_CanvasUpdateAsynch.h"

ClassImp(TC_ScrollingTabFrame)

TC_ScrollingTabFrame::TC_ScrollingTabFrame() : TGCanvas(GetViewPort(),700,650) 
{}

TC_ScrollingTabFrame::TC_ScrollingTabFrame(TGTab * tab, char *grp, char * nam, 
Int_t id_, Int_t nhs, TH1 *hist[], char *options[], char *Poptions[]) : 
TGCanvas(tab,550,650)
{

  status  = 0;
  group   = new TString(grp);
  name    = new TString(nam);
  id      = id_;

  // Make a new tab explicitly building it, instead of calling Add in order to 
add a ScrollingTabFrame
  tab->AddFrame(new TGTabElement(tab, new TGString(nam), 50, 20,
				 tab->GetDefaultGC().GetGC(),
				 tab->GetDefaultFontStruct()),
		    0);

  fFrame = new TGCompositeFrame(GetViewPort(), 60, 20);
  fFrame->SetLayoutManager(new TGMatrixLayout(fFrame,0,2,10));
  SetContainer(fFrame);

  TStyle *myStyle = (TStyle*) gROOT->FindObject("Plain1");
  if(myStyle) 
    {
      myStyle->cd();
    } 
  else 
    {
      printf("Warning. Style Plain1 not founded\n");
    }
  
  int i;
  for (i=0;i<nhs;i++) 
    {
      char *s = new char[30];
      sprintf(s,"%s_%i",nam,i);
      TRootEmbeddedCanvas *fECanvas = new 
TRootEmbeddedCanvas(s,fFrame,300,250);
      ecanvas.push_back(fECanvas);
      TCanvas *c = fECanvas->GetCanvas();
      if(strcmp(Poptions[i],"Logy") == 0) c->SetLogy();
      c->cd();
      c->AddExec("Popuppad","TC_ScrollingTabFrame::PopUpPad()");
      hist[i]->Draw(options[i]);
      AddFrame(fECanvas);
  }

}

TC_ScrollingTabFrame::~TC_ScrollingTabFrame() 
{
  for(int i=0; i<(int)ecanvas.size(); i++) 
    {
      delete ecanvas[i];
    }
  delete fFrame;
}

void TC_ScrollingTabFrame::PopUpPad() 
{
  int event = gPad->GetEvent();
  if(event == 61) 
    {
      TObject *select = gPad->GetSelected();
      if (!select) return;
    // For a TH1 the selectd object is a TFrame, not the TH1
    // So we must select it
      if (!select->InheritsFrom("TH1")) 
	{
	  TList *primitives = gPad->GetListOfPrimitives();
	  TListIter next(primitives);
	  TObject *to;
	  while ((to=next())) 
	    {
	      if(to->InheritsFrom("TH1")) {select = to;}
	    }
	}
      if (select->InheritsFrom("TH1")) 
	{
	  Int_t logy = gPad->GetLogy();
	  TH1 *h = (TH1*)gROOT->FindObject(select->GetName());
	  char *name = new char[100];
	  sprintf(name,"padCanvas%s",h->GetName());
	  TCanvas *canvas = new TCanvas(name,h->GetTitle(),600,400);
	  new TC_CanvasUpdateAsynch(canvas,(Long_t)2000);
	  sprintf(name,"padPad%s",h->GetName());
	  TPad *p = new TPad(name,h->GetTitle(),0.05,0.05,0.95,0.95);
	  if(logy) p->SetLogy();
	  p->Draw();
	  p->cd();
	  //TStyle *myStyle = new TStyle("Plain2","Generic");
	  //myStyle->SetTitleFont(42);
	  if(select->InheritsFrom("TH2F")) 
	    {
	      //myStyle->SetOptStat(10);
	      TStyle *myStyle = (TStyle*) gROOT->FindObject("PlainPopup2");
	      if(myStyle) 
		{
		  myStyle->cd();
		} 
	      else 
		{
		  printf("Warning. Style PlainPopup2 not founded\n");
		}
	      h->Draw("lego2");
	    } 
	  else 
	    {
	      //myStyle->SetOptStat(111111);
	      TStyle *myStyle = (TStyle*) gROOT->FindObject("PlainPopup1");
	      if(myStyle) 
		{
		  myStyle->cd();
		} 
	      else 
		{
		  printf("Warning. Style PlainPopup1 not founded\n");
		}
	      h->Draw("hist");
	    }

	}
    }
}

void TC_ScrollingTabFrame::SetVisibleFlag(bool flag)
{
  status = GetSelectedFlag();
  if (flag) { status = DW_SELECTED | DW_VISIBLE; }
}

void TC_ScrollingTabFrame::SetSelectedFlag(bool flag)
{
  status = 0;
  SetVisibleFlag(flag);
}

Bool_t TC_ScrollingTabFrame::ProcessMessage(Long_t msg, Long_t parm1, Long_t 
parm2) 
{
  return TGCanvas::ProcessMessage(msg,parm1,parm2);
}

void TC_ScrollingTabFrame::Update() 
{
  
  if((!GetVisibleFlag()) || (ecanvas.size()<=0) ) {return;}

  TStyle *myStyle = (TStyle*) gROOT->FindObject("Plain1");
  if(myStyle) 
    {
      myStyle->cd();
    } 
  else 
    {
      printf("Warning. Style Plain1 not founded\n");
    }
  for(int i=0; i<(int)ecanvas.size(); i++) 
    {
      TCanvas *c = ecanvas[i]->GetCanvas();
      c->Modified();
      c->Update();
    }
}



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:12 MET