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
20
21/** \class TButton
22\ingroup gpad
23
24A TButton object is a user interface object.
25
26A TButton has a name and an associated action.
27When the button is clicked with the left mouse button, the corresponding
28action is executed.
29
30A TButton can be created by direct invocation of the constructors
31or via the graphics editor.
32
33The action can be set via TButton::SetMethod.
34The action can be any command. Examples of actions:
35 - "34+78" When the button is clicked, the result of addition is printed.
36 - ".x macro.C" . Clicking the button executes the macro macro.C
37The action can be modified at any time via TButton::SetMethod.
38
39To modify the layout/size/contents of one or several buttons
40in a canvas, you must set the canvas editable via TCanvas::SetEditable.
41By default a TCanvas is editable.
42By default a TDialogCanvas is not editable.
43TButtons are in general placed in a TDialogCanvas.
44
45A TButton being a TPad, one can draw graphics primitives in it
46when the TCanvas/TDialogCanvas is editable.
47
48Example of a macro creating a dialog canvas with buttons:
49~~~ {.cpp}
50void but() {
51// example of a dialog canvas with a few buttons
52
53 TDialogCanvas *dialog = new TDialogCanvas("dialog","",200,300);
54
55// Create first button. Clicking on this button will execute 34+56
56 TButton *but1 = new TButton("button1","34+56",.05,.8,.45,.88);
57 but1->Draw();
58
59// Create second button. Clicking on this button will create a new canvas
60 TButton *but2 = new TButton("canvas","c2 = new TCanvas(\"c2\")",.55,.8,.95,.88);
61 but2->Draw();
62
63// Create third button. Clicking on this button will invoke the browser
64 but3 = new TButton("Browser","br = new TBrowser(\"br\")",0.25,0.54,0.75,0.64);
65 but3->SetFillColor(42);
66 but3->Draw();
67
68// Create last button with no name. Instead a graph is draw inside the button
69// Clicking on this button will invoke the macro gr001_simple.C
70 button = new TButton("",".x tutorials/visualisation/graphs/gr001_simple.C",0.15,0.15,0.85,0.38);
71 button->SetFillColor(42);
72 button->Draw();
73 button->SetEditable(kTRUE);
74 button->cd();
75
76 Double_t x[8] = {0.08,0.21,0.34,0.48,0.61,0.7,0.81,0.92};
77 Double_t y[8] = {0.2,0.65,0.4,0.34,0.24,0.43,0.75,0.52};
78 TGraph *graph = new TGraph(8,x,y);
79 graph->SetMarkerColor(4);
80 graph->SetMarkerStyle(21);
81 graph->Draw("lp");
82
83 dialog->cd();
84}
85~~~
86Executing the macro above produces the following dialog canvas:
87
88\image html gpad_dialogbuttons.png
89*/
90
91////////////////////////////////////////////////////////////////////////////////
92/// Button default constructor.
93
95{
97 fMethod = "";
98 fLogx = kFALSE;
99 fLogy = kFALSE;
102 for (UChar_t n = 0; n < 128; ++n)
103 fValidPattern[n] = n;
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 for (UChar_t n = 0; n < 128; ++n)
127 fValidPattern[n] = n;
128}
129
130////////////////////////////////////////////////////////////////////////////////
131/// Button default destructor.
132
134{
135 for (UChar_t n = 0; n < 128; ++n)
136 fValidPattern[n] = 255 - n;
137 if (fPrimitives)
139}
140
141
142////////////////////////////////////////////////////////////////////////////////
143/// Draw this button with its current attributes.
144
149
150////////////////////////////////////////////////////////////////////////////////
151/// Execute action corresponding to one event.
152///
153/// This member function is called when a Button object is clicked.
154
156{
157 //check case where pressing a button deletes itself
158 if (ROOT::Detail::HasBeenDeleted(this)) return;
159
160 if (IsEditable()) {
161 TPad::ExecuteEvent(event,px,py);
162 return;
163 }
164
165 auto cdpad = gROOT->GetSelectedPad();
166 auto patt = fValidPattern;
167 HideToolTip(event);
168
169 switch (event) {
170
171 case kMouseEnter:
172 TPad::ExecuteEvent(event,px,py);
173 break;
174
175 case kButton1Down:
176 SetBorderMode(-1);
177 fFocused = kTRUE;
178 Modified();
179 Update();
180 break;
181
182 case kMouseMotion:
183
184 break;
185
186 case kButton1Motion:
187 if (px<XtoAbsPixel(1) && px>XtoAbsPixel(0) &&
188 py<YtoAbsPixel(0) && py>YtoAbsPixel(1)) {
189 if (!fFocused) {
190 SetBorderMode(-1);
191 fFocused = kTRUE;
192 Modified();
193 GetCanvas()->Modified();
194 Update();
195 }
196 } else if (fFocused) {
197 SetBorderMode(1);
199 Modified();
200 GetCanvas()->Modified();
201 Update();
202 }
203 break;
204
205 case kButton1Up:
207 if (fFocused) {
208 if (cdpad) cdpad->cd();
209 gROOT->ProcessLine(GetMethod());
210 }
211 //check case where pressing a button deletes itself
213 return;
214
215 // extra check when simple one does not work
216 for (UChar_t n = 0; n < 128; ++n)
217 if (patt[n] != n)
218 return;
219
220 SetBorderMode(1);
221 Modified();
222 Update();
224 break;
225 }
226}
227
228////////////////////////////////////////////////////////////////////////////////
229/// Paint this button with its current attributes.
230
232{
233 if (!fCanvas) return;
234 if (!fPrimitives) fPrimitives = new TList();
236 if (obj && obj->InheritsFrom(TLatex::Class())) {
237 TLatex *text = (TLatex*)obj;
238 text->SetTitle(GetTitle());
239 text->SetTextSize(GetTextSize());
240 text->SetTextFont(GetTextFont());
241 text->SetTextAlign(GetTextAlign());
242 text->SetTextColor(GetTextColor());
243 text->SetTextAngle(GetTextAngle());
244 }
245 SetLogx(0);
246 SetLogy(0);
247 TPad::Paint(option); //only called for Postscript print
248}
249
250////////////////////////////////////////////////////////////////////////////////
251/// Paint is modified.
252
254{
255 if (!fCanvas) return;
256 if (!fPrimitives) fPrimitives = new TList();
258 if (obj && obj->InheritsFrom(TLatex::Class())) {
259 TLatex *text = (TLatex*)obj;
260 text->SetTitle(GetTitle());
261 text->SetTextSize(GetTextSize());
262 text->SetTextFont(GetTextFont());
263 text->SetTextAlign(GetTextAlign());
264 text->SetTextColor(GetTextColor());
265 text->SetTextAngle(GetTextAngle());
266 }
267 SetLogx(0);
268 SetLogy(0);
270}
271
272////////////////////////////////////////////////////////////////////////////////
273/// Set world coordinate system for the pad.
274
279
280////////////////////////////////////////////////////////////////////////////////
281/// Save primitive as a C++ statement(s) on output stream out
282
283void TButton::SavePrimitive(std::ostream &out, Option_t * /*= ""*/)
284{
285 SavePrimitiveConstructor(out, Class(), "button",
286 TString::Format("\"%s\", \"%s\", %g, %g, %g, %g",
287 TString(GetTitle()).ReplaceSpecialCppChars().Data(),
288 TString(GetMethod()).ReplaceSpecialCppChars().Data(), fXlowNDC, fYlowNDC,
290
291 SaveFillAttributes(out, "button", 0, 1001);
292 SaveLineAttributes(out, "button", 1, 1, 1);
293 SaveTextAttributes(out, "button", 22, 0, 1, 61, .65);
294
295 if (GetBorderSize() != 2)
296 out << " button->SetBorderSize(" << GetBorderSize() << ");\n";
297 if (GetBorderMode() != 1)
298 out << " button->SetBorderMode(" << GetBorderMode() << ");\n";
299
300 if (GetFraming())
301 out << "button->SetFraming();\n";
302 if (IsEditable())
303 out << "button->SetEditable(kTRUE);\n";
304
305 out << " button->Draw();\n";
306
308 next(); // do not save first primitive which should be text
309
310 Int_t nprim = 0;
311 while (auto obj = next()) {
312 if (nprim++ == 0)
313 out << " button->cd();\n";
314 obj->SavePrimitive(out, next.GetOption());
315 }
316
317 if ((nprim > 0) && gPad)
318 out << " " << gPad->GetName() << "->cd();\n";
319}
320
321////////////////////////////////////////////////////////////////////////////////
322/// if framing is set, button will be highlighted
323
325{
326 fFraming = f;
327 if (f) SetBit(kFraming);
328 else ResetBit(kFraming);
329}
@ 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:108
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
const char Option_t
Option string (const char)
Definition RtypesCore.h:80
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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:411
#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:238
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:274
Text Attributes class.
Definition TAttText.h:20
virtual Float_t GetTextSize() const
Return the text size.
Definition TAttText.h:38
virtual Short_t GetTextAlign() const
Return the text alignment.
Definition TAttText.h:34
virtual Font_t GetTextFont() const
Return the text font.
Definition TAttText.h:37
virtual Color_t GetTextColor() const
Return the text color.
Definition TAttText.h:36
virtual Float_t GetTextAngle() const
Return the text angle.
Definition TAttText.h:35
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:372
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
Definition TButton.cxx:155
void SetLogy(Int_t=1) override
Definition TButton.h:48
virtual Bool_t GetFraming()
Definition TButton.h:45
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:275
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
Definition TButton.cxx:283
virtual const char * GetMethod() const
Definition TButton.h:38
void SetLogx(Int_t=1) override
Definition TButton.h:47
void Draw(Option_t *option="") override
Draw this button with its current attributes.
Definition TButton.cxx:145
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:231
static TClass * Class()
void PaintModified() override
Paint is modified.
Definition TButton.cxx:253
Bool_t fFocused
If cursor is in...
Definition TButton.h:21
~TButton() override
Button default destructor.
Definition TButton.cxx:133
void SetBorderMode(Short_t bordermode) override
Definition TButton.h:43
UChar_t fValidPattern[128]
! pattern in memory to detect button deletion
Definition TButton.h:23
virtual void SetFraming(Bool_t f=kTRUE)
if framing is set, button will be highlighted
Definition TButton.cxx:324
TButton()
Button default constructor.
Definition TButton.cxx:94
TString fMethod
Method to be executed by this button.
Definition TButton.h:29
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:656
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
Definition TList.cxx:467
Mother of all ROOT objects.
Definition TObject.h:41
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
Definition TObject.cxx:203
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:864
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition TObject.cxx:543
static void SavePrimitiveConstructor(std::ostream &out, TClass *cl, const char *variable_name, const char *constructor_agrs="", Bool_t empty_line=kTRUE)
Save object constructor in the output stream "out".
Definition TObject.cxx:771
void ResetBit(UInt_t f)
Definition TObject.h:201
@ kCanDelete
if object in a list can be deleted
Definition TObject.h:68
The most important graphics class in the ROOT system.
Definition TPad.h:28
Short_t GetBorderMode() const override
Definition TPad.h:200
virtual void HideToolTip(Int_t event)
Hide tool tip depending on the event type.
Definition TPad.cxx:2963
Double_t fWNDC
Width of pad along X in Normalized Coordinates (NDC)
Definition TPad.h:66
Bool_t IsEditable() const override
Definition TPad.h:273
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:3928
void SetEditable(Bool_t mode=kTRUE) override
Set pad editable yes/no If a pad is not editable:
Definition TPad.cxx:6126
const char * GetTitle() const override
Returns title of object.
Definition TPad.h:262
Double_t fX1
X of lower X coordinate.
Definition TPad.h:36
TList * GetListOfPrimitives() const override
Definition TPad.h:246
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:5453
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:3051
TCanvas * fCanvas
! Pointer to mother canvas
Definition TPad.h:106
void Modified(Bool_t flag=true) override
Mark pad modified Will be repainted when TCanvas::Update() will be called next time.
Definition TPad.cxx:7459
void ExecuteEvent(Int_t event, Int_t px, Int_t py) override
Execute action corresponding to one event.
Definition TPad.cxx:1897
Short_t GetBorderSize() const override
Definition TPad.h:201
Int_t fLogx
(=0 if X linear scale, =1 if log scale)
Definition TPad.h:91
Int_t YtoAbsPixel(Double_t y) const override
Convert Y coordinate to absolute pixel.
Definition TPad.cxx:7589
TList * fPrimitives
->List of primitives (subpads)
Definition TPad.h:107
TCanvas * GetCanvas() const override
Definition TPad.h:263
void Paint(Option_t *option="") override
Paint all primitives in pad.
Definition TPad.cxx:3700
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
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
@ kFraming
Frame is requested.
Definition TPad.h:154
Int_t XtoAbsPixel(Double_t x) const override
Convert X coordinate to absolute pixel.
Definition TPad.cxx:7565
Basic string class.
Definition TString.h:138
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition TString.cxx:2384
const Int_t n
Definition legend1.C:16
R__ALWAYS_INLINE bool HasBeenDeleted(const TObject *obj)
Check if the TObject's memory has been deleted.
Definition TObject.h:405