Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TPieEditor.cxx
Go to the documentation of this file.
1// @(#)root/ged:$Id$
2// Author: Guido Volpi 12/10/2007
3
4/*************************************************************************
5 * Copyright (C) 1995-2004, 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
13/** \class TPieEditor
14 \ingroup ged
15
16Implements GUI for pie-chart attributes.
17
18'Title': set the title of the graph
19
20*/
21
22
23#include "TGedEditor.h"
24#include "TGComboBox.h"
25#include "TGButtonGroup.h"
26#include "TPieEditor.h"
27#include "TGTextEntry.h"
28#include "TGNumberEntry.h"
29#include "TPie.h"
30#include "TVirtualPad.h"
31#include "TGColorSelect.h"
32#include "TColor.h"
33#include "TBox.h"
34#include "TPaveLabel.h"
35#include "TVirtualX.h"
36#include "snprintf.h"
37
39
55
56////////////////////////////////////////////////////////////////////////////////
57/// Constructor of graph editor.
58
60 Int_t height, UInt_t options, Pixel_t back)
61 : TGedFrame(p, width, height, options | kVerticalFrame, back)
62{
63 fPie = 0;
64 // TextEntry to change the title
65 MakeTitle("Pie Chart");
66
67 fTitle = new TGTextEntry(this, new TGTextBuffer(50), kPIE_TITLE);
68 fTitle->Resize(135, fTitle->GetDefaultHeight());
69 fTitle->SetToolTipText("Enter the pie title string");
70 // better take kLHintsLeft and Right - Right is not working at the moment
71 AddFrame(fTitle, new TGLayoutHints(kLHintsLeft, 3, 1, 2, 5));
72
73 // Radio Buttons to change the draw options of the graph
74 TGCompositeFrame *f2 = new TGCompositeFrame(this, 80, 20, kVerticalFrame);
75 fgr = new TGButtonGroup(f2,3,1,3,5,"Label direction");
76 fgr->SetRadioButtonExclusive(kTRUE);
77 fLblDirH = new TGRadioButton(fgr,"Horizontal",kPIE_HOR); // no draw option
78 fLblDirH->SetToolTipText("Draw horizontal labels");
79 fLblDirR = new TGRadioButton(fgr,"Radial",kPIE_RAD); // option C
80 fLblDirR->SetToolTipText("Draw labels radially");
81 fLblDirT = new TGRadioButton(fgr,"Tangential",kPIE_TAN); // option L
82 fLblDirT->SetToolTipText("Draw labels tangential to the piechart");
83
84 fgr->SetLayoutHints(fShape1lh=new TGLayoutHints(kLHintsLeft, 0,3,0,0), fLblDirH);
85 fgr->Show();
87 f2->AddFrame(fgr, new TGLayoutHints(kLHintsLeft, 4, 0, 0, 0));
88
89 // CheckBox to activate/deactivate the drawing of the Marker
90 fOutlineOnOff = new TGCheckButton(f2,"Outline",kPIE_OUTLINE);
91 fOutlineOnOff->SetToolTipText("Draw a line to mark the pie");
92 f2->AddFrame(fOutlineOnOff, new TGLayoutHints(kLHintsTop, 5, 1, 0, 3));
93 AddFrame(f2, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
94
95 // Exclusion zone parameters
96 MakeTitle("3D options");
97 TGCompositeFrame *f3 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
98 AddFrame(f3, new TGLayoutHints(kLHintsTop, 1, 1, 5, 0));
99
100 fIs3D = new TGCheckButton(f3,"3D",kPIE_3D);
101 fIs3D->SetToolTipText("Draw a 3D charts");
102 f3->AddFrame(fIs3D, new TGLayoutHints(kLHintsTop, 5, 1, 0, 0));
103
105 //f3DAngle->SetToolTipText("3D angle: 0-90")
106 f3DAngle->Resize(50, 20);
107 f3->AddFrame(f3DAngle, new TGLayoutHints(kLHintsLeft, 7, 1, 1, 1));
108 f3DAngle->Associate(f3);
109
111 //f3DHeight->SetToolTipText("3D thick")
112 f3DHeight->Resize(50, 20);
113 f3->AddFrame(f3DHeight, new TGLayoutHints(kLHintsLeft, 7, 1, 1, 1));
114 f3DHeight->Associate(f3);
115
116 MakeTitle("Text");
117 TGCompositeFrame *f4 = new TGCompositeFrame(this, 80, 20, kHorizontalFrame);
119 f4->AddFrame(fColorSelect, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1));
120 fColorSelect->Associate(this);
122 f4->AddFrame(fSizeCombo, new TGLayoutHints(kLHintsLeft, 3, 1, 1, 1));
123 fSizeCombo->Resize(91, 20);
124 fSizeCombo->Associate(this);
125 AddFrame(f4, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0));
127 fTypeCombo->Resize(137, 20);
128 AddFrame(fTypeCombo, new TGLayoutHints(kLHintsLeft, 3, 1, 1, 1));
129}
130
131
132////////////////////////////////////////////////////////////////////////////////
133/// Destructor of pie editor.
134
138
139
140////////////////////////////////////////////////////////////////////////////////
141/// Connect signals to slots.
142
144{
145 fTitle->Connect("TextChanged(const char *)","TPieEditor",this,"DoTitle(const char *)");
146 fgr->Connect("Clicked(Int_t)","TPieEditor",this,"DoShape()");
147 fOutlineOnOff->Connect("Toggled(Bool_t)","TPieEditor",this,"DoMarkerOnOff(Bool_t)");
148 f3DAngle->Connect("ValueSet(Long_t)", "TPieEditor", this, "DoChange3DAngle()");
149 f3DHeight->Connect("ValueSet(Long_t)", "TPieEditor", this, "DoChange3DAngle()");
150 fIs3D->Connect("Clicked()","TPieEditor",this,"DoGraphLineWidth()");
151
152 // text attributes connection
153 fTypeCombo->Connect("Selected(Int_t)","TPieEditor",this,"DoTextChange()");
154 fSizeCombo->Connect("Selected(Int_t)","TPieEditor",this,"DoTextChange()");
155 fColorSelect->Connect("ColorSelected(Pixel_t)","TPieEditor",this,"DoTextChange()");
156
157 fInit = kFALSE; // connect the slots to the signals only once
158}
159
160
161////////////////////////////////////////////////////////////////////////////////
162/// Exclude TAttTextEditor from this interface.
163
170
171
172////////////////////////////////////////////////////////////////////////////////
173/// Pick up the used values of graph attributes.
174
176{
177 fPie = (TPie *)obj;
179
180 // set the Title TextEntry
181 const char *text = fPie->GetTitle();
182 fTitle->SetText(text);
183
184 TString soption = GetDrawOption();
185
186 // For the label orientation there are 3 possibilities:
187 // 0: horizontal
188 // 1: radial
189 // 2: tangent
190 Int_t lblor(0);
191
192 // Parse the options
193 Int_t idx;
194 // Paint the TPie in an existing canvas
195 if ( (idx=soption.Index("same"))>=0 ) {
196 // optionSame = kTRUE;
197 soption.Remove(idx,4);
198 }
199
200 if ( (idx=soption.Index("nol"))>=0 ) {
201 fOutlineOnOff->SetState(kButtonUp,kFALSE);
202 soption.Remove(idx,3);
203 }
204 else {
206 }
207
208 // check if is active the pseudo-3d
209 if ( (idx=soption.Index("3d"))>=0 ) {
210 fIs3D->SetState(kButtonDown, kFALSE);
211 f3DAngle->SetNumber(fPie->GetAngle3D());
212 f3DHeight->SetNumber(fPie->GetHeight());
213 soption.Remove(idx,2);
214 } else {
215 fIs3D->SetState(kButtonUp, kFALSE);
216 }
217
218 // seek if have to draw the labels around the pie chart
219 if ( (idx=soption.Index("t"))>=0 ) {
220 lblor = 2;
221 soption.Remove(idx,1);
222 }
223
224 // Seek if have to paint the labels along the radii
225 if ( (idx=soption.Index("r"))>=0 ) {
226 lblor = 1;
227 soption.Remove(idx,1);
228 }
229
230 switch(lblor) {
231 case 0:
232 fLblDirH->SetState(kButtonDown,kTRUE);
233 break;
234 case 1:
235 fLblDirR->SetState(kButtonDown,kTRUE);
236 break;
237 case 2:
238 fLblDirT->SetState(kButtonDown,kTRUE);
239 break;
240 }
241
242 // set text attributes
243 fTypeCombo->Select(fPie->GetTextFont() / 10);
244
245 Color_t c = fPie->GetTextColor();
247 fColorSelect->SetColor(p, kFALSE);
248
249 Float_t s = fPie->GetTextSize();
250 Float_t dy;
251
252 if (obj->InheritsFrom(TPaveLabel::Class())) {
253 TBox *pl = (TBox*)obj;
254 dy = s * (pl->GetY2() - pl->GetY1());
255 }
256 else
257 dy = s * (fGedEditor->GetPad()->GetY2() - fGedEditor->GetPad()->GetY1());
258
259 Int_t size = fGedEditor->GetPad()->YtoPixel(0.0) - fGedEditor->GetPad()->YtoPixel(dy);
260 if (size > 50) size = 50;
261 if (size < 0) size = 0;
262 fSizeCombo->Select(size, kFALSE);
263
266}
267
268
269////////////////////////////////////////////////////////////////////////////////
270/// Slot for setting the graph title.
271
272void TPieEditor::DoTitle(const char *text)
273{
274 if (fAvoidSignal) return;
275 fPie->SetTitle(text);
276 Update();
277}
278
279
280////////////////////////////////////////////////////////////////////////////////
281/// Slot connected to the draw options.
282
284{
285 if (fAvoidSignal) return;
286
287 TString opt = GetDrawOption();
288
289 if (fLblDirH->GetState()==kButtonDown) {
290 if (opt.Contains("t")) opt.Remove(opt.First("t"),1);
291 if (opt.Contains("r")) opt.Remove(opt.First("r"),1);
292 }
293 else if (fLblDirR->GetState()==kButtonDown) {
294 if (opt.Contains("t")) opt.Remove(opt.First("t"),1);
295 if (!opt.Contains("r")) opt += "r";
296 }
297 else if (fLblDirT->GetState()==kButtonDown) {
298 if (!opt.Contains("t")) opt += "t";
299 if (opt.Contains("r")) opt.Remove(opt.First("r"),1);
300 }
301
302 SetDrawOption(opt);
303 if (gPad && gPad->GetVirtCanvas()) gPad->GetVirtCanvas()->SetCursor(kPointer);
304 gVirtualX->SetCursor(GetId(), gVirtualX->CreateCursor(kPointer));
305}
306
307
308////////////////////////////////////////////////////////////////////////////////
309/// Slot for setting markers as visible/invisible.
310
312{
313 if (fAvoidSignal) return;
315
316 if (t.Contains("nol") && fOutlineOnOff->GetState() == kButtonDown) {
317 t.Remove(t.First("nol"),3);
318 }
319 else if (!t.Contains("nol") && fOutlineOnOff->GetState() == kButtonUp) {
320 t += "nol";
321 }
322
323 SetDrawOption(t);
324}
325
326
327////////////////////////////////////////////////////////////////////////////////
328/// Slot for setting the 3D angle
329
331{
332 if (fAvoidSignal) return;
333
334 fPie->SetAngle3D(static_cast<Int_t>(f3DAngle->GetNumber()));
335 fPie->SetHeight(f3DHeight->GetNumber());
336
337 Update();
338
339}
340
341
342////////////////////////////////////////////////////////////////////////////////
343/// Slot connected to the graph line width.
344
346{
347 if (fAvoidSignal) return;
348
349 TString opt = GetDrawOption();
350 if (!opt.Contains("3d") && fIs3D->IsDown())
351 opt += "3d";
352 else if (opt.Contains("3d") && !fIs3D->IsDown())
353 opt.Remove(opt.First("3d"),2);
354
355 SetDrawOption(opt);
356
357 Update();
358}
359
360
361
362////////////////////////////////////////////////////////////////////////////////
363/// Change text.
364
366{
367 if (fAvoidSignal) return;
368
369 // font color
370 fPie->SetTextColor(TColor::GetColor(fColorSelect->GetColor()));
371
372 // font type
373 Int_t fontPrec = fPie->GetTextFont()%10;
374 Int_t fontType = fTypeCombo->GetSelected();
375 fPie->SetTextFont(fontType*10+fontPrec);
376
377 // font size
378 TVirtualPad* pad = fGedEditor->GetPad();
379
380 Float_t val = TString(fSizeCombo->GetSelectedEntry()->GetTitle()).Atoi();
381
382 Float_t dy = pad->AbsPixeltoY(0) - pad->AbsPixeltoY((Int_t)val);
383 Float_t textSize;
384
385 if (fGedEditor->GetModel()->InheritsFrom(TPaveLabel::Class())) {
386 TBox *pl = (TBox*)fGedEditor->GetModel();
387 textSize = dy/(pl->GetY2() - pl->GetY1());
388 }
389 else
390 textSize = dy/(pad->GetY2() - pad->GetY1());
391
392 fPie->SetTextSize(textSize);
393
394 Update();
395
396}
397
398
399////////////////////////////////////////////////////////////////////////////////
400/// Create text size combo box.
401
403{
404 char a[100];
405 TGComboBox *c = new TGComboBox(parent, id);
406
407 c->AddEntry("Default", 0);
408 for (int i = 1; i <= 50; i++) {
409 snprintf(a, 99, "%d", i);
410 c->AddEntry(a, i);
411 }
412
413 return c;
414}
@ kPointer
Definition GuiTypes.h:375
@ kChildFrame
Definition GuiTypes.h:379
@ kVerticalFrame
Definition GuiTypes.h:381
@ kFitWidth
Definition GuiTypes.h:386
@ kHorizontalFrame
Definition GuiTypes.h:382
ULong_t Pixel_t
Pixel value.
Definition GuiTypes.h:40
#define c(i)
Definition RSha256.hxx:101
#define a(i)
Definition RSha256.hxx:99
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
bool Bool_t
Definition RtypesCore.h:63
int Int_t
Definition RtypesCore.h:45
short Color_t
Definition RtypesCore.h:92
unsigned int UInt_t
Definition RtypesCore.h:46
float Float_t
Definition RtypesCore.h:57
constexpr Bool_t kFALSE
Definition RtypesCore.h:101
constexpr Bool_t kTRUE
Definition RtypesCore.h:100
#define ClassImp(name)
Definition Rtypes.h:377
@ kFONT_STYLE
@ kFONT_SIZE
@ kButtonDown
Definition TGButton.h:54
@ kButtonUp
Definition TGButton.h:53
@ kLHintsLeft
Definition TGLayout.h:24
@ kLHintsTop
Definition TGLayout.h:27
Option_t Option_t width
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
Option_t Option_t TPoint TPoint const char text
Int_t i
EPieWid
@ kPIE_3DTHICKNESS
@ kPie
@ kPIE_RAD
@ kPIE_3D
@ kPIE_FILL
@ kPIE_TAN
@ kFONT_COLOR
@ kPIE_TITLE
@ kPIE_HOR
@ kPIE_OUTLINE
@ kPIE_3DANGLE
#define gPad
#define gVirtualX
Definition TVirtualX.h:337
#define snprintf
Definition civetweb.c:1540
static TClass * Class()
Create a Box.
Definition TBox.h:22
Double_t GetY1() const
Definition TBox.h:53
Double_t GetY2() const
Definition TBox.h:54
TClass instances represent classes, structs and namespaces in the ROOT type system.
Definition TClass.h:81
static ULong_t Number2Pixel(Int_t ci)
Static method that given a color index number, returns the corresponding pixel value.
Definition TColor.cxx:2320
static Int_t GetColor(const char *hexcolor)
Static method returning color number for color specified by hex color string of form: "#rrggbb",...
Definition TColor.cxx:1839
Organizes TGButton widgets in a group.
Selects different options.
Definition TGButton.h:264
Like a checkbutton but instead of the check mark there is color area with a little down arrow.
A combobox (also known as a drop down listbox) allows the selection of one item out of a list of item...
Definition TGComboBox.h:47
virtual void AddFrame(TGFrame *f, TGLayoutHints *l=nullptr)
Add frame to the composite frame using the specified layout hints.
Definition TGFrame.cxx:1117
TGCompositeFrame(const TGCompositeFrame &)=delete
The TGFontTypeComboBox is user callable and it creates a combobox for selecting the font.
Definition TGComboBox.h:178
TGFrame(const TGFrame &)=delete
This class describes layout hints used by the layout classes.
Definition TGLayout.h:50
TGNumberEntry is a number entry input widget with up/down buttons.
@ kNEANonNegative
Non-negative number.
@ kNESReal
Real number.
@ kNESInteger
Style of number entry field.
@ kNELLimitMinMax
Both lower and upper limits.
Handle_t GetId() const
Definition TGObject.h:41
Selects different options.
Definition TGButton.h:321
A text buffer is used in several widgets, like TGTextEntry, TGFileDialog, etc.
A TGTextEntry is a one line text input widget.
Definition TGTextEntry.h:24
ROOT GUI Window base class.
Definition TGWindow.h:23
void ExcludeClassEditor(TClass *cl, Bool_t recurse=kFALSE)
Exclude editor for class cl from current construction.
virtual void ActivateBaseClassEditors(TClass *cl)
Provide list of editors for base-classes.
TGedEditor * fGedEditor
manager of this frame
Definition TGedFrame.h:48
TGedFrame(const TGedFrame &)=delete
Bool_t fInit
init flag for setting signals/slots
Definition TGedFrame.h:47
virtual void MakeTitle(const char *title)
Create attribute frame title.
Definition TGedFrame.cxx:95
void SetDrawOption(Option_t *option="") override
Set drawing option for object.
virtual void Update()
Update the current pad when an attribute is changed via GUI.
Definition TGedFrame.cxx:72
Option_t * GetDrawOption() const override
Get draw options of the selected object.
Definition TGedFrame.cxx:80
TGedEditor * GetGedEditor()
Definition TGedFrame.h:71
Bool_t fAvoidSignal
flag for executing slots
Definition TGedFrame.h:50
Mother of all ROOT objects.
Definition TObject.h:41
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
Definition TObject.cxx:525
static TClass * Class()
Implements GUI for pie-chart attributes.
Definition TPieEditor.h:28
void ActivateBaseClassEditors(TClass *) override
Exclude TAttTextEditor from this interface.
TGRadioButton * fLblDirH
Draw slice's labels horizontal.
Definition TPieEditor.h:36
TGNumberEntry * f3DAngle
set the pseudo 3D angle
Definition TPieEditor.h:43
virtual void DoTextChange()
Change text.
TPie * fPie
Pie object.
Definition TPieEditor.h:34
TGColorSelect * fColorSelect
font color selector
Definition TPieEditor.h:44
virtual void ConnectSignals2Slots()
Connect signals to slots.
virtual void DoChange3DAngle()
Slot for setting the 3D angle.
TGNumberEntry * f3DHeight
set the 3D tickness
Definition TPieEditor.h:42
TGCheckButton * fIs3D
set if is enabled the pseudo-3d mode
Definition TPieEditor.h:41
virtual void DoMarkerOnOff(Bool_t on)
Slot for setting markers as visible/invisible.
virtual void DoGraphLineWidth()
Slot connected to the graph line width.
void SetModel(TObject *) override
Pick up the used values of graph attributes.
TGLayoutHints * fShape1lh
layout-hints for fShape1
Definition TPieEditor.h:39
static TGComboBox * BuildFontSizeComboBox(TGFrame *, Int_t)
Create text size combo box.
TGRadioButton * fLblDirT
Draw slice's labels tangential to the piechart's circle.
Definition TPieEditor.h:38
TGRadioButton * fLblDirR
Draw slice's labels radial to the piechart.
Definition TPieEditor.h:37
TGComboBox * fSizeCombo
font size
Definition TPieEditor.h:46
TGButtonGroup * fgr
Group the Radiobuttons:
Definition TPieEditor.h:35
TGTextEntry * fTitle
Contains the title of the graph.
Definition TPieEditor.h:32
TGCheckButton * fOutlineOnOff
set piechart outline visible/unvisible
Definition TPieEditor.h:40
TGFontTypeComboBox * fTypeCombo
font style
Definition TPieEditor.h:45
TPieEditor(const TGWindow *p=nullptr, Int_t width=140, Int_t height=30, UInt_t options=kChildFrame, Pixel_t back=GetDefaultFrameBackground())
Constructor of graph editor.
virtual void DoShape()
Slot connected to the draw options.
virtual void DoTitle(const char *text)
Slot for setting the graph title.
~TPieEditor() override
Destructor of pie editor.
Draw a Pie Chart,.
Definition TPie.h:23
Basic string class.
Definition TString.h:139
Int_t Atoi() const
Return integer value of string.
Definition TString.cxx:1988
Ssiz_t First(char c) const
Find first occurrence of a character c.
Definition TString.cxx:538
TString & Remove(Ssiz_t pos)
Definition TString.h:685
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Definition TString.h:632
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Definition TString.h:651
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition TVirtualPad.h:51
virtual Double_t GetY1() const =0
virtual Double_t AbsPixeltoY(Int_t py)=0
virtual Double_t GetY2() const =0