From d9857ffa8622652440889c15509b5157f6c3c4bc Mon Sep 17 00:00:00 2001
From: Ilka Antcheva <Ilka.Antcheva@cern.ch>
Date: Mon, 23 Jan 2006 16:30:05 +0000
Subject: [PATCH] From Bertrand: - New tutorial Slider3Demo.C showing the
 properties    of these new sliders.

git-svn-id: http://root.cern.ch/svn/root/trunk@13891 27541ba8-7e3a-0410-8455-c3a389f83636
---
 tutorials/Slider3Demo.C | 265 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 265 insertions(+)
 create mode 100644 tutorials/Slider3Demo.C

diff --git a/tutorials/Slider3Demo.C b/tutorials/Slider3Demo.C
new file mode 100644
index 00000000000..91fedc885db
--- /dev/null
+++ b/tutorials/Slider3Demo.C
@@ -0,0 +1,265 @@
+
+// Simple macro showing capabilities of triple slider
+
+#include "TGButton.h"
+#include "TRootEmbeddedCanvas.h"
+#include "TGLayout.h"
+#include "TF1.h"
+#include "TMath.h"
+#include "TCanvas.h"
+#include "TGTextEntry.h"
+#include "TGTripleSlider.h"
+
+enum ETestCommandIdentifiers {
+   HId1,
+   HId2,
+   HId3,
+   HCId1,
+   HCId2,
+
+   HSId1
+};
+
+class TTripleSliderDemo : public TGMainFrame {
+
+private:
+   TRootEmbeddedCanvas *fCanvas;
+   TGLayoutHints       *fLcan;
+   TF1                 *fFitFcn;
+   TGHorizontalFrame   *fHframe0, *fHframe1, *fHframe2;
+   TGLayoutHints       *fBly, *fBfly1, *fBfly2, *fBfly3;
+   TGTripleHSlider     *fHslider1;
+   TGTextEntry         *fTeh1, *fTeh2, *fTeh3;
+   TGTextBuffer        *fTbh1, *fTbh2, *fTbh3;
+   TGCheckButton       *fCheck1, *fCheck2;
+
+public:
+   TTripleSliderDemo();
+   virtual ~TTripleSliderDemo();
+
+   void CloseWindow();
+   void DoText(const char *text);
+   void DoSlider();
+   void HandleButtons();
+
+   ClassDef(TTripleSliderDemo, 0)
+};
+
+//______________________________________________________________________________
+TTripleSliderDemo::TTripleSliderDemo() : TGMainFrame(gClient->GetRoot(), 100, 100)
+{
+
+   char buf[32];
+   SetCleanup(kDeepCleanup);
+   // Create an embedded canvas and add to the main frame, centered in x and y
+   // and with 30 pixel margins all around
+   fCanvas = new TRootEmbeddedCanvas("Canvas", this, 600, 400);
+   fLcan = new TGLayoutHints(kLHintsCenterX|kLHintsCenterY|kLHintsExpandX|kLHintsExpandY,10,10,10,10);
+   AddFrame(fCanvas, fLcan);
+   fCanvas->GetCanvas()->SetFillColor(33);
+   fCanvas->GetCanvas()->SetFrameFillColor(41);
+   fCanvas->GetCanvas()->SetBorderMode(0);
+   fCanvas->GetCanvas()->SetGrid();
+   fCanvas->GetCanvas()->SetLogy();
+
+   fHframe0 = new TGHorizontalFrame(this, 0, 0, 0);
+
+   fCheck1 = new TGCheckButton(fHframe0, "&Constrained", HCId1);
+   fCheck2 = new TGCheckButton(fHframe0, "&Relative", HCId2);
+   fCheck1->SetState(kButtonUp);
+   fCheck2->SetState(kButtonUp);
+   fCheck1->SetToolTipText("Pointer position constrained to slider sides");
+   fCheck2->SetToolTipText("Pointer position relative to slider position");
+
+   fHframe0->Resize(200, 50);
+
+   fHframe1 = new TGHorizontalFrame(this, 0, 0, 0);
+
+   fHslider1 = new TGTripleHSlider(fHframe1, 190, kDoubleScaleBoth, HSId1,
+                                   kHorizontalFrame, GetDefaultFrameBackground(),
+                                   kFALSE, kFALSE, kFALSE, kFALSE);
+   fHslider1->Connect("PointerPositionChanged()", "TTripleSliderDemo", this, "DoSlider()");
+   fHslider1->Connect("PositionChanged()", "TTripleSliderDemo", this, "DoSlider()");
+   fHslider1->SetRange(0.05,5.0);
+
+   fHframe1->Resize(200, 25);
+
+   fHframe2 = new TGHorizontalFrame(this, 0, 0, 0);
+
+   fTeh1 = new TGTextEntry(fHframe2, fTbh1 = new TGTextBuffer(5), HId1);
+   fTeh2 = new TGTextEntry(fHframe2, fTbh2 = new TGTextBuffer(5), HId2);
+   fTeh3 = new TGTextEntry(fHframe2, fTbh3 = new TGTextBuffer(5), HId3);
+
+   fTeh1->SetToolTipText("Minimum (left) Value of Slider");
+   fTeh2->SetToolTipText("Pointer Position Value");
+   fTeh3->SetToolTipText("Maximum (right) Value of Slider");
+
+   fTbh1->AddText(0, "0.0");
+   fTbh2->AddText(0, "0.0");
+   fTbh3->AddText(0, "0.0");
+
+   fTeh1->Connect("TextChanged(char*)", "TTripleSliderDemo", this, "DoText(char*)");
+   fTeh2->Connect("TextChanged(char*)", "TTripleSliderDemo", this, "DoText(char*)");
+   fTeh3->Connect("TextChanged(char*)", "TTripleSliderDemo", this, "DoText(char*)");
+
+   fCheck1->Connect("Clicked()", "TTripleSliderDemo", this, "HandleButtons()");
+   fCheck2->Connect("Clicked()", "TTripleSliderDemo", this, "HandleButtons()");
+
+   fHframe2->Resize(100, 25);
+
+   //--- layout for buttons: top align, equally expand horizontally
+   fBly = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 5, 5, 5, 5);
+
+   //--- layout for the frame: place at bottom, right aligned
+   fBfly1 = new TGLayoutHints(kLHintsTop | kLHintsCenterX, 5, 5, 5, 5);
+   fBfly2 = new TGLayoutHints(kLHintsTop | kLHintsLeft,    5, 5, 5, 5);
+   fBfly3 = new TGLayoutHints(kLHintsTop | kLHintsRight,   5, 5, 5, 5);
+
+   fHframe0->AddFrame(fCheck1, fBfly2);
+   fHframe0->AddFrame(fCheck2, fBfly2);
+   fHframe1->AddFrame(fHslider1, fBly);
+   fHframe2->AddFrame(fTeh1, fBfly2);
+   fHframe2->AddFrame(fTeh2, fBfly1);
+   fHframe2->AddFrame(fTeh3, fBfly3);
+
+   AddFrame(fHframe0, fBly);
+   AddFrame(fHframe1, fBly);
+   AddFrame(fHframe2, fBly);
+
+   // Set main frame name, map sub windows (buttons), initialize layout
+   // algorithm via Resize() and map main frame
+   SetWindowName("Triple Slider Demo");
+   MapSubwindows();
+   Resize(GetDefaultSize());
+   MapWindow();
+
+   fFitFcn = new TF1("fFitFcn", "TMath::LogNormal(x, [0], [1], [2])", 0, 5);
+   fFitFcn->SetRange(0.0, 2.5);
+   fFitFcn->SetParameters(1.0, 0, 1);
+   fFitFcn->SetMinimum(1.0e-3);
+   fFitFcn->SetMaximum(10.0);
+   fFitFcn->SetLineColor(kRed);
+   fFitFcn->SetLineWidth(1);
+   fFitFcn->Draw();
+
+   fHslider1->SetPosition(0.05,2.5);
+   fHslider1->SetPointerPosition(1.0);
+
+   sprintf(buf, "%.3f", fHslider1->GetMinPosition());
+   fTbh1->Clear();
+   fTbh1->AddText(0, buf);
+   sprintf(buf, "%.3f", fHslider1->GetPointerPosition());
+   fTbh2->Clear();
+   fTbh2->AddText(0, buf);
+   sprintf(buf, "%.3f", fHslider1->GetMaxPosition());
+   fTbh3->Clear();
+   fTbh3->AddText(0, buf);
+}
+
+//______________________________________________________________________________
+TTripleSliderDemo::~TTripleSliderDemo()
+{
+   // Clean up
+
+   Cleanup();
+}
+
+//______________________________________________________________________________
+void TTripleSliderDemo::CloseWindow()
+{
+   // Called when window is closed via the window manager.
+
+   delete this;
+}
+
+//______________________________________________________________________________
+void TTripleSliderDemo::DoText(const char * /*text*/)
+{
+   // Handle text entry widgets.
+
+   TGTextEntry *te = (TGTextEntry *) gTQSender;
+   Int_t id = te->WidgetId();
+
+   switch (id) {
+      case HId1:
+         fHslider1->SetPosition(atof(fTbh1->GetString()),
+                                fHslider1->GetMaxPosition());
+         break;
+      case HId2:
+         fHslider1->SetPointerPosition(atof(fTbh2->GetString()));
+         break;
+      case HId3:
+         fHslider1->SetPosition(fHslider1->GetMinPosition(),
+                                atof(fTbh1->GetString()));
+         break;
+      default:
+         break;
+   }
+   fFitFcn->SetParameters(fHslider1->GetPointerPosition(), 0, 1);
+   fFitFcn->SetRange(fHslider1->GetMinPosition()-0.05, fHslider1->GetMaxPosition());
+   fFitFcn->Draw();
+   fCanvas->GetCanvas()->Modified();
+   fCanvas->GetCanvas()->Update();
+}
+
+//______________________________________________________________________________
+void TTripleSliderDemo::DoSlider()
+{
+   // Handle slider widgets.
+
+   char buf[32];
+
+   sprintf(buf, "%.3f", fHslider1->GetMinPosition());
+   fTbh1->Clear();
+   fTbh1->AddText(0, buf);
+   fTeh1->SetCursorPosition(fTeh1->GetCursorPosition());
+   fTeh1->Deselect();
+   gClient->NeedRedraw(fTeh1);
+
+   sprintf(buf, "%.3f", fHslider1->GetPointerPosition());
+   fTbh2->Clear();
+   fTbh2->AddText(0, buf);
+   fTeh2->SetCursorPosition(fTeh2->GetCursorPosition());
+   fTeh2->Deselect();
+   gClient->NeedRedraw(fTeh2);
+
+   sprintf(buf, "%.3f", fHslider1->GetMaxPosition());
+   fTbh3->Clear();
+   fTbh3->AddText(0, buf);
+   fTeh3->SetCursorPosition(fTeh3->GetCursorPosition());
+   fTeh3->Deselect();
+   gClient->NeedRedraw(fTeh3);
+
+   fFitFcn->SetParameters(fHslider1->GetPointerPosition(), 0, 1);
+   fFitFcn->SetRange(fHslider1->GetMinPosition()-0.05, fHslider1->GetMaxPosition());
+   fFitFcn->Draw();
+   fCanvas->GetCanvas()->Modified();
+   fCanvas->GetCanvas()->Update();
+}
+
+//______________________________________________________________________________
+void TTripleSliderDemo::HandleButtons()
+{
+   // Handle different buttons.
+
+   TGButton *btn = (TGButton *) gTQSender;
+   Int_t id = btn->WidgetId();
+
+   switch (id) {
+      case HCId1:
+         fHslider1->SetConstrained(fCheck1->GetState());
+         break;
+      case HCId2:
+         fHslider1->SetRelative(fCheck2->GetState());
+         break;
+      default:
+         break;
+   }
+}
+
+
+void Slider3Demo()
+{
+   new TTripleSliderDemo();
+}
+
-- 
GitLab