guiviewer.cxx

Go to the documentation of this file.
00001 // @(#)root/test:$Id: guiviewer.cxx 20882 2007-11-19 11:31:26Z rdm $
00002 // Author: Brett Viren   04/15/2001
00003 
00004 // guiviewer.cxx: GUI test program showing TGTableLayout widget manager,
00005 // embedded ROOT canvases, axis and sliders.
00006 // To run it do: make guiviewer; guiviewer
00007 
00008 #include "guiviewer.h"
00009 
00010 #include "TROOT.h"
00011 #include "TApplication.h"
00012 #include "TGTableLayout.h"
00013 #include "TGFrame.h"
00014 #include "TList.h"
00015 #include "TGWindow.h"
00016 #include "TRootEmbeddedCanvas.h"
00017 #include "TEllipse.h"
00018 #include "TBox.h"
00019 #include "TArrow.h"
00020 #include "TPolyLine.h"
00021 #include "TGButton.h"
00022 #include "TCanvas.h"
00023 #include "TRandom.h"
00024 #include "TGDoubleSlider.h"
00025 #include "TGaxis.h"
00026 #include "Riostream.h"
00027 
00028 
00029 Viewer::Viewer(const TGWindow *win) : TGMainFrame(win,500,500)
00030 {
00031    const UInt_t max_size = 300;
00032 
00033    // Memory management isn't the best in this class, but make a half
00034    // hearted attempts not to gush too much....
00035    fCleanup = new TList;
00036 
00037    TGCompositeFrame *table = new TGCompositeFrame(this,400,400,kSunkenFrame);
00038    fCleanup->Add(table);
00039 
00040    TGTableLayout* tlo = new TGTableLayout(table, 9, 6);
00041    table->SetLayoutManager(tlo);
00042    TGLayoutHints* loh = new TGLayoutHints(kLHintsTop|kLHintsLeft|
00043                                           kLHintsExpandX|kLHintsExpandY);
00044    AddFrame(table,loh);
00045 
00046    TGTableLayoutHints* tloh;
00047 
00048    // The Canvas
00049    TRootEmbeddedCanvas* recanvas =
00050        new TRootEmbeddedCanvas("Shapes",table,max_size,max_size);
00051    tloh = new TGTableLayoutHints(2,5,2,6,
00052                                  kLHintsExpandX|kLHintsExpandY |
00053                                  kLHintsShrinkX|kLHintsShrinkY |
00054                                  kLHintsFillX|kLHintsFillY);
00055    table->AddFrame(recanvas,tloh);
00056 
00057    fCanvas = recanvas->GetCanvas();
00058 
00059    // The sliders
00060    fHSlider = new TGDoubleHSlider(table,max_size,kDoubleScaleBoth,100,
00061                                   kHorizontalFrame,GetDefaultFrameBackground(),
00062                                   kFALSE, kTRUE);
00063    tloh = new TGTableLayoutHints(2,5,0,1,
00064                                  kLHintsExpandX|kLHintsShrinkX|kLHintsFillX);
00065    table->AddFrame(fHSlider,tloh);
00066    fHSlider->Connect("PositionChanged()","Viewer",this,"DoSlider()");
00067 
00068    fVSlider = new TGDoubleVSlider(table,max_size,kDoubleScaleBoth,200,
00069                                   kVerticalFrame,GetDefaultFrameBackground(),
00070                                   kTRUE,kTRUE);
00071    tloh = new TGTableLayoutHints(0,1,2,6,
00072                                  kLHintsExpandY|kLHintsShrinkY|kLHintsFillY);
00073    table->AddFrame(fVSlider,tloh);
00074    fVSlider->Connect("PositionChanged()","Viewer",this,"DoSlider()");
00075 
00076    // The scales
00077    fHScaleCanvas =
00078        new TRootEmbeddedCanvas("H Scale",table,max_size,50);
00079    tloh = new TGTableLayoutHints(2,5,1,2,
00080                                  kLHintsExpandX|kLHintsShrinkX|kLHintsFillX);
00081    table->AddFrame(fHScaleCanvas,tloh);
00082    fHScaleCanvas->GetCanvas()->cd();
00083 
00084    fHScaleCanvas->GetCanvas()->Range(0,0,1,1);
00085    fHScale = new TGaxis(0.0,0.5, 1.0,0.5, 0.0,100.0, 510, "-");
00086    fHScale->SetLabelSize(0.4);
00087    fHScale->SetName("X Scale");
00088    fHScale->Draw();
00089    fHScaleCanvas->GetCanvas()->SetEditable(kFALSE);
00090 
00091    fVScaleCanvas =
00092        new TRootEmbeddedCanvas("V Scale",table,50,max_size);
00093    tloh = new TGTableLayoutHints(1,2,2,6,
00094                                  kLHintsExpandY|kLHintsShrinkY|kLHintsFillY);
00095    table->AddFrame(fVScaleCanvas,tloh);
00096    fVScaleCanvas->GetCanvas()->cd();
00097 
00098    fVScaleCanvas->GetCanvas()->Range(0,0,1,1);
00099    fVScale = new TGaxis(0.5,0.0, 0.50001,1.0, 0.0,100.0, 510, "-");
00100    fVScale->SetLabelSize(0.4);
00101    fVScale->SetName("Y Scale");
00102    fVScale->Draw();
00103    fVScaleCanvas->GetCanvas()->SetEditable(kFALSE);
00104 
00105    // Call this after scales/sliders are setup
00106    SetRange(0,0,100,100);
00107 
00108    // The shape buttons
00109    const char* shape_button_name[] = {
00110        "Ellipse", "Box", "Triangle", "Arrow", "Zoom Out", "Zoom In", "Close"
00111    };
00112    UInt_t ind;
00113    for (ind = 0; ind < 7; ++ind) {
00114       TGTextButton* button =
00115           new TGTextButton(table,shape_button_name[ind],ind);
00116       tloh = new TGTableLayoutHints(5,6,ind+2,ind+1+2,
00117                                     kLHintsExpandX|kLHintsExpandY |
00118                                     kLHintsShrinkX|kLHintsShrinkY |
00119                                     kLHintsFillX|kLHintsFillY);
00120       table->AddFrame(button,tloh);
00121       button->Resize(100,button->GetDefaultHeight());
00122       button->Connect("Clicked()","Viewer",this,"DoButton()");
00123    }
00124 
00125    const char* ctrl_button_name[3][3] = {
00126       { "NW", "N", "NE" },
00127       { "W" , "C", "E" },
00128       { "SW", "S", "SE" }
00129    };
00130    UInt_t indx, indy;
00131    for (indx = 0; indx < 3; ++indx) for (indy = 0; indy < 3; ++indy) {
00132       TGTextButton* button = new TGTextButton(table,
00133                                               ctrl_button_name[indy][indx],
00134                                               (indx+1)*10 + indy +1);
00135       tloh = new TGTableLayoutHints(indx+2,indx+1+2, 6+indy,6+indy+1,
00136                                     kLHintsExpandX|kLHintsExpandY |
00137                                     kLHintsShrinkX|kLHintsShrinkY |
00138                                     kLHintsFillX|kLHintsFillY);
00139       table->AddFrame(button,tloh);
00140       button->Resize(100,button->GetDefaultHeight());
00141       button->Connect("Clicked()","Viewer",this,"DoButton()");
00142    }
00143 
00144    table->Layout();
00145 
00146    // exit on close window
00147    Connect("CloseWindow()","TApplication",gApplication,"Terminate(=0)");
00148 
00149    MapSubwindows();
00150    Layout();
00151    MapWindow();
00152 }
00153 
00154 Viewer::~Viewer()
00155 {
00156    fCanvas->Clear();
00157    delete fCanvas;
00158    fCleanup->Delete();
00159    delete fCleanup;
00160 }
00161 
00162 void Viewer::DoButton()
00163 {
00164    TGButton* button = (TGButton*)gTQSender;
00165    UInt_t id = button->WidgetId();
00166 
00167    double xmin, ymin, xmax, ymax;
00168    double xdiff, ydiff;
00169    fCanvas->GetRange(xmin,ymin,xmax,ymax);
00170    xdiff = xmax - xmin; ydiff = ymax - ymin;
00171 
00172    fCanvas->cd();
00173 
00174    switch (id) {
00175    case 0: {                   // Ellipse
00176       TEllipse* ellipse = new TEllipse(gRandom->Uniform(.8*xdiff)+.1*xdiff,
00177                                        gRandom->Uniform(.8*ydiff)+.1*ydiff,
00178                                        gRandom->Uniform(.1*xdiff),
00179                                        gRandom->Uniform(.1*ydiff));
00180       ellipse->SetFillColor(Color_t(gRandom->Uniform(10)));
00181       ellipse->Draw();
00182       fCanvas->Modified();
00183       fCanvas->Update();
00184       break;
00185    }
00186    case 1: {                   // Box
00187       TBox* box = new TBox(gRandom->Uniform(xdiff)+xmin,
00188                            gRandom->Uniform(ydiff)+ymin,
00189                            gRandom->Uniform(xdiff)+xmin,
00190                            gRandom->Uniform(ydiff)+ymin);
00191       box->SetFillColor(Color_t(gRandom->Uniform(10)));
00192       box->Draw();
00193       fCanvas->Modified();
00194       fCanvas->Update();
00195       break;
00196    }
00197    case 2: {                   // Triangle
00198       double x[4], y[4];
00199       x[0] = x[3] = gRandom->Uniform(xdiff)+xmin;
00200       y[0] = y[3] = gRandom->Uniform(ydiff)+ymin;
00201       x[1] = gRandom->Uniform(xdiff)+xmin;
00202       y[1] = gRandom->Uniform(ydiff)+ymin;
00203       x[2] = gRandom->Uniform(xdiff)+xmin;
00204       y[2] = gRandom->Uniform(ydiff)+ymin;
00205       TPolyLine* pl = new TPolyLine(4, x, y);
00206       pl->SetLineColor(Color_t(gRandom->Uniform(10)));
00207       pl->Draw();
00208       fCanvas->Modified();
00209       fCanvas->Update();
00210       break;
00211    }
00212    case 3: {                   // Arrow
00213       TArrow* arrow = new TArrow(gRandom->Uniform(xdiff)+xmin,
00214                                  gRandom->Uniform(ydiff)+ymin,
00215                                  gRandom->Uniform(xdiff)+xmin,
00216                                  gRandom->Uniform(ydiff)+ymin);
00217       arrow->SetLineColor(Color_t(gRandom->Uniform(10)));
00218       arrow->Draw();
00219       fCanvas->Modified();
00220       fCanvas->Update();
00221       break;
00222    }
00223    case 4:                     // Zoom out
00224       SetRange(xmin-xdiff*.1, ymin-ydiff*.1, xmax+xdiff*.1, ymax+ydiff*.1);
00225       break;
00226    case 5:                     // Zoom in
00227       SetRange(xmin+xdiff*.1, ymin+ydiff*.1, xmax-xdiff*.1, ymax-ydiff*.1);
00228       break;
00229    case 6:
00230       gApplication->Terminate(0);
00231       break;
00232    case 11:                    // nw
00233       SetRange(xmin-xdiff*.1, ymin+ydiff*.1, xmax-xdiff*.1, ymax+ydiff*.1);
00234       break;
00235    case 12:                    // w
00236       SetRange(xmin-xdiff*.1, ymin, xmax-xdiff*.1, ymax);
00237       break;
00238    case 13:                    // sw
00239       SetRange(xmin-xdiff*.1, ymin-ydiff*.1, xmax-xdiff*.1, ymax-ydiff*.1);
00240       break;
00241    case 23:                    // s
00242       SetRange(xmin, ymin-ydiff*.1, xmax, ymax-ydiff*.1);
00243       break;
00244    case 33:                    // se
00245       SetRange(xmin+xdiff*.1, ymin-ydiff*.1, xmax+xdiff*.1, ymax-ydiff*.1);
00246       break;
00247    case 32:                    // e
00248       SetRange(xmin+xdiff*.1, ymin, xmax+xdiff*.1, ymax);
00249       break;
00250    case 31:                    // ne
00251       SetRange(xmin+xdiff*.1, ymin+ydiff*.1, xmax+xdiff*.1, ymax+ydiff*.1);
00252       break;
00253    case 21:                    // n
00254       SetRange(xmin, ymin+ydiff*.1, xmax, ymax+ydiff*.1);
00255       break;
00256    case 22:                    // c
00257       SetRange(50.0-xdiff/2,50-ydiff/2,50+xdiff/2,50+ydiff/2);
00258       break;
00259    } // end switch(id)
00260 }
00261 
00262 void Viewer::DoSlider()
00263 {
00264    float xmin, ymin, xmax, ymax;
00265    fHSlider->GetPosition(xmin,xmax);
00266    fVSlider->GetPosition(ymin,ymax);
00267 
00268    SetRange(xmin,ymin,xmax,ymax, kFALSE);
00269 }
00270 
00271 void Viewer::SetRange(Float_t xmin, Float_t ymin, Float_t xmax, Float_t ymax,
00272                       Bool_t move_slider)
00273 {
00274    fCanvas->Range(xmin,ymin,xmax,ymax);
00275 
00276    //cerr << "x=[" << xmin << " - " << xmax << "], "
00277    //     << "y=[" << ymin << " - " << ymax << "]\n";
00278 
00279    fHScale->SetWmin(xmin);
00280    fHScale->SetWmax(xmax);
00281    fVScale->SetWmin(ymin);
00282    fVScale->SetWmax(ymax);
00283 
00284    // Set position of slider - don't if DoSlider called SetRange
00285    if (move_slider) {
00286       fHSlider->SetPosition(xmin,xmax);
00287       fVSlider->SetPosition(ymin,ymax);
00288    }
00289 
00290    fCanvas->Modified();
00291    fHScaleCanvas->GetCanvas()->Modified();
00292    fVScaleCanvas->GetCanvas()->Modified();
00293    fCanvas->Update();
00294    fHScaleCanvas->GetCanvas()->Update();
00295    fVScaleCanvas->GetCanvas()->Update();
00296    fClient->ForceRedraw();  //prevent GUI from being starved of redraws
00297 
00298 }
00299 
00300 
00301 //---- Main program ------------------------------------------------------------
00302 
00303 int main(int argc, char **argv)
00304 {
00305    TApplication theApp("App", &argc, argv);
00306 
00307    if (gROOT->IsBatch()) {
00308       fprintf(stderr, "%s: cannot run in batch mode\n", argv[0]);
00309       return 1;
00310    }
00311 
00312    Viewer viewer(gClient->GetRoot());
00313 
00314    theApp.Run();
00315 
00316    return 0;
00317 }

Generated on Tue Jul 5 15:15:01 2011 for ROOT_528-00b_version by  doxygen 1.5.1