Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TButton.cxx
Go to the documentation of this file.
1// @(#)root/gpad:$Id$
2// Author: Rene Brun 01/07/96
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#include "TROOT.h"
13#include "TButton.h"
14#include "TCanvas.h"
15#include "TLatex.h"
16
17#include <cstring>
18#include <iostream>
19
21
22
23/** \class TButton
24\ingroup gpad
25
26A TButton object is a user interface object.
27
28A TButton has a name and an associated action.
29When the button is clicked with the left mouse button, the corresponding
30action is executed.
31
32A TButton can be created by direct invocation of the constructors
33or via the graphics editor.
34
35The action can be set via TButton::SetMethod.
36The action can be any command. Examples of actions:
37 - "34+78" When the button is clicked, the result of addition is printed.
38 - ".x macro.C" . Clicking the button executes the macro macro.C
39The action can be modified at any time via TButton::SetMethod.
40
41To modify the layout/size/contents of one or several buttons
42in a canvas, you must set the canvas editable via TCanvas::SetEditable.
43By default a TCanvas is editable.
44By default a TDialogCanvas is not editable.
45TButtons are in general placed in a TDialogCanvas.
46
47A TButton being a TPad, one can draw graphics primitives in it
48when the TCanvas/TDialogCanvas is editable.
49
50Example of a macro creating a dialog canvas with buttons:
51~~~ {.cpp}
52void but() {
53// example of a dialog canvas with a few buttons
54
55 TDialogCanvas *dialog = new TDialogCanvas("dialog","",200,300);
56
57// Create first button. Clicking on this button will execute 34+56
58 TButton *but1 = new TButton("button1","34+56",.05,.8,.45,.88);
59 but1->Draw();
60
61// Create second button. Clicking on this button will create a new canvas
62 TButton *but2 = new TButton("canvas","c2 = new TCanvas(\"c2\")",.55,.8,.95,.88);
63 but2->Draw();
64
65// Create third button. Clicking on this button will invoke the browser
66 but3 = new TButton("Browser","br = new TBrowser(\"br\")",0.25,0.54,0.75,0.64);
67 but3->SetFillColor(42);
68 but3->Draw();
69
70// Create last button with no name. Instead a graph is draw inside the button
71// Clicking on this button will invoke the macro $ROOTSYS/tutorials/graphs/graph.C
72 button = new TButton("",".x tutorials/graphs/graph.C",0.15,0.15,0.85,0.38);
73 button->SetFillColor(42);
74 button->Draw();
75 button->SetEditable(kTRUE);
76 button->cd();
77
78 Double_t x[8] = {0.08,0.21,0.34,0.48,0.61,0.7,0.81,0.92};
79 Double_t y[8] = {0.2,0.65,0.4,0.34,0.24,0.43,0.75,0.52};
80 TGraph *graph = new TGraph(8,x,y);
81 graph->SetMarkerColor(4);
82 graph->SetMarkerStyle(21);
83 graph->Draw("lp");
84
85 dialog->cd();
86}
87~~~
88Executing the macro above produces the following dialog canvas:
89
90\image html gpad_dialogbuttons.png
91*/
92
93////////////////////////////////////////////////////////////////////////////////
94/// Button default constructor.
95
97{
99 fMethod = "";
100 fLogx = kFALSE;
101 fLogy = kFALSE;
104}
105
106////////////////////////////////////////////////////////////////////////////////
107/// Button normal constructor.
108///
109/// Note that the button coordinates x1,y1,x2,y2 are always in the range [0,1]
110
111TButton::TButton(const char *title, const char *method, Double_t x1, Double_t y1,Double_t x2, Double_t y2)
112 :TPad("button",title,x1,y1,x2,y2,18,2,1), TAttText(22,0,1,61,0.65)
113{
117 fMethod = method;
118 if (title && strlen(title)) {
119 TLatex *text = new TLatex(0.5 * (fX1 + fX2), 0.5 * (fY1 + fY2), title);
121 }
122 fLogx = 0;
123 fLogy = 0;
126}
127
128////////////////////////////////////////////////////////////////////////////////
129/// Button default destructor.
130
132{
134}
135
136////////////////////////////////////////////////////////////////////////////////
137/// Draw this button with its current attributes.
138
140{
142}
143
144////////////////////////////////////////////////////////////////////////////////
145/// Execute action corresponding to one event.
146///
147/// This member function is called when a Button object is clicked.
148
150{
151 //check case where pressing a button deletes itself
152 if (ROOT::Detail::HasBeenDeleted(this)) return;
153
154 if (IsEditable()) {
156 return;
157 }
158
159 auto cdpad = gROOT->GetSelectedPad();
161
162 switch (event) {
163
164 case kMouseEnter:
166 break;
167
168 case kButton1Down:
169 SetBorderMode(-1);
170 fFocused = kTRUE;
171 Modified();
172 Update();
173 break;
174
175 case kMouseMotion:
176
177 break;
178
179 case kButton1Motion:
180 if (px<XtoAbsPixel(1) && px>XtoAbsPixel(0) &&
181 py<YtoAbsPixel(0) && py>YtoAbsPixel(1)) {
182 if (!fFocused) {
183 SetBorderMode(-1);
184 fFocused = kTRUE;
185 Modified();
186 GetCanvas()->Modified();
187 Update();
188 }
189 } else if (fFocused) {
190 SetBorderMode(1);
192 Modified();
193 GetCanvas()->Modified();
194 Update();
195 }
196 break;
197
198 case kButton1Up:
200 if (fFocused) {
201 TVirtualPad::TContext ctxt(cdpad, kTRUE, kTRUE);
202 gROOT->ProcessLine(GetMethod());
203 }
204 //check case where pressing a button deletes itself
205 if (ROOT::Detail::HasBeenDeleted(this)) return;
206 SetBorderMode(1);
207 Modified();
208 Update();
210 break;
211 }
212}
213
214////////////////////////////////////////////////////////////////////////////////
215/// Paint this button with its current attributes.
216
218{
219 if (!fCanvas) return;
220 if (!fPrimitives) fPrimitives = new TList();
222 if (obj && obj->InheritsFrom(TLatex::Class())) {
223 TLatex *text = (TLatex*)obj;
224 text->SetTitle(GetTitle());
225 text->SetTextSize(GetTextSize());
226 text->SetTextFont(GetTextFont());
227 text->SetTextAlign(GetTextAlign());
228 text->SetTextColor(GetTextColor());
229 text->SetTextAngle(GetTextAngle());
230 }
231 SetLogx(0);
232 SetLogy(0);
233 TPad::Paint(option); //only called for Postscript print
234}
235
236////////////////////////////////////////////////////////////////////////////////
237/// Paint is modified.
238
240{
241 if (!fCanvas) return;
242 if (!fPrimitives) fPrimitives = new TList();
244 if (obj && obj->InheritsFrom(TLatex::Class())) {
245 TLatex *text = (TLatex*)obj;
246 text->SetTitle(GetTitle());
247 text->SetTextSize(GetTextSize());
248 text->SetTextFont(GetTextFont());
249 text->SetTextAlign(GetTextAlign());
250 text->SetTextColor(GetTextColor());
251 text->SetTextAngle(GetTextAngle());
252 }
253 SetLogx(0);
254 SetLogy(0);
256}
257
258////////////////////////////////////////////////////////////////////////////////
259/// Set world coordinate system for the pad.
260
262{
264}
265
266////////////////////////////////////////////////////////////////////////////////
267/// Save primitive as a C++ statement(s) on output stream out
268
269void TButton::SavePrimitive(std::ostream &out, Option_t * /*= ""*/)
270{
271 char quote = '"';
272 if (gROOT->ClassSaved(TButton::Class()))
273 out<<" ";
274 else
275 out<<" TButton *";
276
277 TString cmethod = GetMethod();
278
279 out << "button = new TButton(" << quote << GetTitle() << quote << ","
280 << quote << cmethod.ReplaceSpecialCppChars() << quote << "," << fXlowNDC << "," << fYlowNDC
281 << "," << fXlowNDC + fWNDC << "," << fYlowNDC + fHNDC << ");"
282 << std::endl;
283
284 SaveFillAttributes(out,"button",0,1001);
285 SaveLineAttributes(out,"button",1,1,1);
286 SaveTextAttributes(out,"button",22,0,1,61,.65);
287
288 if (GetBorderSize() != 2)
289 out<<" button->SetBorderSize("<<GetBorderSize()<<");"<<std::endl;
290 if (GetBorderMode() != 1)
291 out<<" button->SetBorderMode("<<GetBorderMode()<<");"<<std::endl;
292
293 if (GetFraming()) out<<"button->SetFraming();"<<std::endl;
294 if (IsEditable()) out<<"button->SetEditable(kTRUE);"<<std::endl;
295
296 out<<" button->Draw();"<<std::endl;
297
299 next(); //do not save first primitive which should be text
300
301 Int_t nprim = 0;
302 while (auto obj = next()) {
303 if (nprim++ == 0)
304 out<<" button->cd();"<<std::endl;
305 obj->SavePrimitive(out, next.GetOption());
306 }
307
308 if ((nprim > 0) && gPad)
309 out<<" "<<gPad->GetName()<<"->cd();"<<std::endl;
310}
311
312////////////////////////////////////////////////////////////////////////////////
313/// if framing is set, button will be highlighted
314
316{
317 fFraming = f;
318 if (f) SetBit(kFraming);
319 else ResetBit(kFraming);
320}
@ kMouseMotion
Definition Buttons.h:23
@ kButton1Motion
Definition Buttons.h:20
@ kButton1Up
Definition Buttons.h:19
@ kButton1Down
Definition Buttons.h:17
@ kMouseEnter
Definition Buttons.h:23
@ kWatch
Definition GuiTypes.h:375
@ kCross
Definition GuiTypes.h:374
#define f(i)
Definition RSha256.hxx:104
constexpr Bool_t kFALSE
Definition RtypesCore.h:101
constexpr Bool_t kTRUE
Definition RtypesCore.h:100
const char Option_t
Definition RtypesCore.h:66
#define ClassImp(name)
Definition Rtypes.h:377
Option_t Option_t option
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void SetCursor
Option_t Option_t TPoint TPoint const char text
Option_t Option_t TPoint TPoint const char y1
#define gROOT
Definition TROOT.h:405
#define gPad
virtual void SaveFillAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1001)
Save fill attributes as C++ statement(s) on output stream out.
Definition TAttFill.cxx:236
virtual void SaveLineAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1, Int_t widdef=1)
Save line attributes as C++ statement(s) on output stream out.
Definition TAttLine.cxx:273
Text Attributes class.
Definition TAttText.h:18
virtual Float_t GetTextSize() const
Return the text size.
Definition TAttText.h:36
virtual Short_t GetTextAlign() const
Return the text alignment.
Definition TAttText.h:32
virtual Font_t GetTextFont() const
Return the text font.
Definition TAttText.h:35
virtual Color_t GetTextColor() const
Return the text color.
Definition TAttText.h:34
virtual Float_t GetTextAngle() const
Return the text angle.
Definition TAttText.h:33
virtual void SaveTextAttributes(std::ostream &out, const char *name, Int_t alidef=12, Float_t angdef=0, Int_t coldef=1, Int_t fondef=61, Float_t sizdef=1)
Save text attributes as C++ statement(s) on output stream out.
Definition TAttText.cxx:375
A TButton object is a user interface object.
Definition TButton.h:18
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
Definition TButton.cxx:149
void SetLogy(Int_t=1) override
Definition TButton.h:47
virtual Bool_t GetFraming()
Definition TButton.h:44
void Range(Double_t x1, Double_t y1, Double_t x2, Double_t y2) override
Set world coordinate system for the pad.
Definition TButton.cxx:261
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
Definition TButton.cxx:269
virtual const char * GetMethod() const
Definition TButton.h:37
void SetLogx(Int_t=1) override
Definition TButton.h:46
void Draw(Option_t *option="") override
Draw this button with its current attributes.
Definition TButton.cxx:139
Bool_t fFraming
True if you want a frame to be painted when pressed.
Definition TButton.h:22
void Paint(Option_t *option="") override
Paint this button with its current attributes.
Definition TButton.cxx:217
static TClass * Class()
virtual ~TButton()
Button default destructor.
Definition TButton.cxx:131
void PaintModified() override
Paint is modified.
Definition TButton.cxx:239
Bool_t fFocused
If cursor is in...
Definition TButton.h:21
void SetBorderMode(Short_t bordermode) override
Definition TButton.h:42
virtual void SetFraming(Bool_t f=kTRUE)
if framing is set, button will be highlighted
Definition TButton.cxx:315
TButton()
Button default constructor.
Definition TButton.cxx:96
TString fMethod
Method to be executed by this button.
Definition TButton.h:28
Option_t * GetOption() const
To draw Mathematical Formula.
Definition TLatex.h:18
static TClass * Class()
A doubly linked list.
Definition TList.h:38
void Add(TObject *obj) override
Definition TList.h:81
TObject * First() const override
Return the first object in the list. Returns 0 when list is empty.
Definition TList.cxx:659
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
Definition TList.cxx:470
Mother of all ROOT objects.
Definition TObject.h:41
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
Definition TObject.cxx:184
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:774
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition TObject.cxx:525
void ResetBit(UInt_t f)
Definition TObject.h:200
@ kCanDelete
if object in a list can be deleted
Definition TObject.h:62
The most important graphics class in the ROOT system.
Definition TPad.h:28
Short_t GetBorderMode() const override
Definition TPad.h:197
virtual void HideToolTip(Int_t event)
Hide tool tip depending on the event type.
Definition TPad.cxx:2742
Double_t fWNDC
Width of pad along X in Normalized Coordinates (NDC)
Definition TPad.h:66
Double_t fX2
X of upper X coordinate.
Definition TPad.h:38
void PaintModified() override
Traverse pad hierarchy and (re)paint only modified pads.
Definition TPad.cxx:3676
void SetEditable(Bool_t mode=kTRUE) override
Set pad editable yes/no If a pad is not editable:
Definition TPad.cxx:5889
const char * GetTitle() const override
Returns title of object.
Definition TPad.h:259
Double_t fX1
X of lower X coordinate.
Definition TPad.h:36
TList * GetListOfPrimitives() const override
Definition TPad.h:243
void Range(Double_t x1, Double_t y1, Double_t x2, Double_t y2) override
Set world coordinate system for the pad.
Definition TPad.cxx:5193
Double_t fY1
Y of lower Y coordinate.
Definition TPad.h:37
Double_t fYlowNDC
Y bottom left corner of pad in NDC [0,1].
Definition TPad.h:63
Bool_t fModified
Set to true when pad is modified.
Definition TPad.h:99
void Update() override
Update pad.
Definition TPad.cxx:2823
void Modified(Bool_t flag=1) override
Definition TPad.h:417
TCanvas * fCanvas
! Pointer to mother canvas
Definition TPad.h:106
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
Definition TPad.cxx:1685
Short_t GetBorderSize() const override
Definition TPad.h:198
Int_t fLogx
(=0 if X linear scale, =1 if log scale)
Definition TPad.h:91
Int_t YtoAbsPixel(Double_t y) const override
Definition TPad.h:503
@ kFraming
Frame is requested.
Definition TPad.h:154
TList * fPrimitives
->List of primitives (subpads)
Definition TPad.h:107
TCanvas * GetCanvas() const override
Definition TPad.h:260
void Paint(Option_t *option="") override
Paint all primitives in pad.
Definition TPad.cxx:3448
Int_t fLogy
(=0 if Y linear scale, =1 if log scale)
Definition TPad.h:92
Double_t fHNDC
Height of pad along Y in Normalized Coordinates (NDC)
Definition TPad.h:67
virtual Bool_t IsEditable() const override
Definition TPad.h:270
Double_t fXlowNDC
X bottom left corner of pad in NDC [0,1].
Definition TPad.h:62
Double_t fY2
Y of upper Y coordinate.
Definition TPad.h:39
Int_t XtoAbsPixel(Double_t x) const override
Definition TPad.h:481
Basic string class.
Definition TString.h:139
TString & ReplaceSpecialCppChars()
Find special characters which are typically used in printf() calls and replace them by appropriate es...
Definition TString.cxx:1102
small helper class to store/restore gPad context in TPad methods
Definition TVirtualPad.h:61
R__ALWAYS_INLINE bool HasBeenDeleted(const TObject *obj)
Check if the TObject's memory has been deleted.
Definition TObject.h:404