Rapid Application Design Rapid Application Design with the ROOT GUI Classeswith the ROOT GUI Classes
24 April 2007
Ilka Antcheva, Bertrand Bellenot, René Brun,
Fons Rademakers, Valeriy Onuchin*
CERN, Geneva, Switzerland* IHEP, Protvino, Russia
I. Antcheva ACAT07 NIKEF, Amsterdam 2
OverviewOverview
• Main Features• Benefits from Using CINT• Application Design
• Signals & Slots• Scripting• C++ Code Generation• Dialogs• GUI Builder
• Automatic Context Menus• External Applications• Conclusions
I. Antcheva ACAT07 NIKEF, Amsterdam 3
• ROOT GUI classes form a rich and complete set of widgets
• Fully cross platform with the same look and feel on either Unix, Linux, Windows and Mac OS X
• Fully scriptable allowing fast prototyping via the embedded CINT C++ interpreter
• The GUI builder (under development) makes the task of designing complex GUI’s easier and faster
• High level GUI’s in ROOT : the browser, tree viewer, graphics editor, fit panel, session viewer of PROOF, etc.
Main Features Main Features
I. Antcheva ACAT07 NIKEF, Amsterdam 4
fText = new TGTextEntry(fMain, new TGTextBuffer(100)); fText->SetToolTipText("Enter the label and hit Enter key"); fText->Connect("ReturnPressed()", "MyDialog", this, "DoSetlabel()"); fMain->AddFrame(fText, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5)); fGframe = new TGGroupFrame(fMain, "Last File"); fLabel = new TGLabel(fGframe, "No Intut "); fGframe->AddFrame(fLabel, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5)); fMain->AddFrame(fGframe, new TGLayoutHints(kLHintsExpandX, 2, 2, 1, 1));
…
// fText = new TGTextEntry(fMain, new TGTextBuffer(100));// fText->SetToolTipText("Enter the label and hit Enter key");// fText->Connect("ReturnPressed()", "MyDialog", this, "DoSetlabel()");// fMain->AddFrame(fText, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5)); fGframe = new TGGroupFrame(fMain, "Last File"); fLabel = new TGLabel(fGframe, "No Intut "); fGframe->AddFrame(fLabel, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5)); fText = new TGTextEntry(fGframe, new TGTextBuffer(100)); fText->SetToolTipText("Enter the label and hit Enter key"); fText->Connect("ReturnPressed()", "MyDialog", this, "DoSetlabel()"); fText->Resize(150, fText->GetDefaultHeight()); fGframe->AddFrame(fText, new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5)); fMain->AddFrame(fGframe, new TGLayoutHints(kLHintsExpandX, 2, 2, 1, 1));
root [0] .x myDialog.Croot [1]root [0] .x myDialog.Croot [1] .x myDialog.C
Prototyping via the CINT C++ interpreter• Supports from simple sequence of
statements to complex C++ class and method definitions
• Remove edit compile cycle• Macros can be edited and re-executed• Transparent interface to native C++
compiler to run macro with native machine performance
Benefits from Using CINTBenefits from Using CINT
I. Antcheva ACAT07 NIKEF, Amsterdam 5
Application DesignApplication Design
• Map user requirements and logically organize the GUI• Application window is handled by TGMainFrame• Select widgets from ROOT GUI classes• Layout the GUI components
• Parent-children relationship• Different layout managers
• Program them to perform actions• Signal/slot mechanism• Conventional model of event processing
• Run and validate … or iterate to improve
I. Antcheva ACAT07 NIKEF, Amsterdam 6
• Signal/Slot communication mechanism is integrated into ROOT core by TQObject, TQConnection, TQClass
• Uses dictionary information and the CINT interpreter to connect signal methods to slot methods
• Total independence of the interacting classes (easy programming)
Signals & SlotsSignals & Slots
I. Antcheva ACAT07 NIKEF, Amsterdam 7
ScriptingScripting
• Macros via the ROOT Object Browser
I. Antcheva ACAT07 NIKEF, Amsterdam 8
• TGTextEditor - basic editor for compiling and executing macros
More ScriptingMore Scripting
Drag & Dropmacros from the browser
I. Antcheva ACAT07 NIKEF, Amsterdam 9
C++ Code GenerationC++ Code Generation
• Using ctrl+S any GUI can be saved as a C++ macro file thanks to the SavePrimitive methods implemented in all GUI classes.
• The generated macro can be modified and executed
• It restores the complete original GUI and all existing signal/slot connections
// transient frame TGTransientFrame *frame2 = new TGTransientFrame(gClient->GetRoot(),760,590); // group frame TGButtonGroupe *frame3 = new TGGroupFrame(frame2,“Operation");
TGRadioButton *frame4 = new TGRadioButton(frame3,“Nop",10); frame3->AddFrame(frame4);
root [0] .x example.C
I. Antcheva ACAT07 NIKEF, Amsterdam 10
DialogsDialogs
Standard set of common dialogs• Files selection (multiple files)TGFileInfo fi;new TGFileDialog(fClient->GetDefaultRoot(), this, kFDOpen,&fi);if (fi.fMultipleSelection && fi.fFileNamesList) { TObjString *el; TIter next(fi.fFileNamesList); while ((el = (TObjString *) next())) { new TFile(el->GetString(), "update"); }} else if (fi.fFilename) { new TFile(fi.fFilename, "update");}
• Input dialog• Message window• Search dialog• Print dialog
I. Antcheva ACAT07 NIKEF, Amsterdam 11
More DialogsMore Dialogs
// Change background color via color selector.
TGFrame *fr; TGColorDialog *cd = GetGlobalColorDialog(); cd->SetCurrentColor(fr->GetBackground()); cd->Connect("ColorSelected(Pixel_t)", "TGFrame", fr, ChangeBackground(Pixel_t)"); fClient->WaitForUnmap(cd); TQObject::Disconnect(cd);
// Change text font via font selection dialog.
TGGroupFrame *gfr; TGFontDialog *fd = GetGlobalFontDialog(); TGResourcePool *rc = gc=fClient->GetResourcePool(); TGGC *gc = rc->GetGCPool()->FindGC(fr->GetNormGC()); TGFont *font = 0; Font = rc->GetFontPool()->FindFont(fr->GetFontStruct()); fd->SetColor(gc->GetForeground()); fd->SetFont(font); fd->Connect("FontSelected(char*)", "TGGroupFrame", gfr, "SetTextFont(char*)"); fd->Connect("ColorSelected(Pixel_t)", "TGGroupFrame", gfr, "SetTextColor(Pixel_t)"); fClient->WaitForUnmap(fd); TQObject::Disconnect(fd);
I. Antcheva ACAT07 NIKEF, Amsterdam 12
Complex DialogsComplex Dialogs
I. Antcheva ACAT07 NIKEF, Amsterdam 13
GUI BuilderGUI Builder
• Visual design without coding
• Design process• Mainly based on Drag &
Drop• Flexible layout settings• Ends up as C++ source code
reflecting parents-children relationship
• Establish signal/slot connections and their concrete implementation (to be done)
I. Antcheva ACAT07 NIKEF, Amsterdam 14
• Context sensitive popup menu
• Automatically generated by ROOT
• Gives direct access to class member functions
• Any context menu can be retrieved
• Can be extended with user- defined entries
Automatic Context MenusAutomatic Context Menus
TClass *cl = Graph->IsA(); TList *mnl = cl->GetMenuList();
I. Antcheva ACAT07 NIKEF, Amsterdam 15
TCanvas can be embedded into any 3rd party GUI environment when it is possible to:• Obtain a Window ID (XID on X11, HWND on Windows)• Create a timer to handle ROOT events• Forward events to the ROOT canvas
External ApplicationsExternal Applications
I. Antcheva ACAT07 NIKEF, Amsterdam 16
ConclusionsConclusions• The ROOT GUI classes form a rich
and powerful scriptable cross-platform GUI library
• Solid basis for the development of additional GUIs: help browser, object editors, fit panel, event displays
• The GUI builder makes designing GUIs easier
• Easy application distribution by storing the GUIs with data in the same ROOT file
• The future - to provide users with access through multiple interfaces from any location, with any device at any time.
Top Related