From a6cf6c93b6671210ec79650e559255b1373b7ae8 Mon Sep 17 00:00:00 2001 From: Olivier Couet <Olivier.Couet@cern.ch> Date: Thu, 29 Jun 2006 12:16:26 +0000 Subject: [PATCH] - From Timur: Complete the "File" menu in the GL viewer (Save, and Quit ROOT) git-svn-id: http://root.cern.ch/svn/root/trunk@15610 27541ba8-7e3a-0410-8455-c3a389f83636 --- gl/inc/TGLSAViewer.h | 18 +++++-- gl/src/TGLSAViewer.cxx | 116 ++++++++++++++++++++++++++++++++++------- 2 files changed, 110 insertions(+), 24 deletions(-) diff --git a/gl/inc/TGLSAViewer.h b/gl/inc/TGLSAViewer.h index 2ffbf75f8af..7d71aa9d94d 100644 --- a/gl/inc/TGLSAViewer.h +++ b/gl/inc/TGLSAViewer.h @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLSAViewer.h,v 1.11 2006/03/13 09:33:49 brun Exp $ +// @(#)root/gl:$Name: $:$Id: TGLSAViewer.h,v 1.12 2006/04/07 08:43:59 brun Exp $ // Author: Richard Maunder / Timur Pocheptsov /************************************************************************* @@ -16,6 +16,10 @@ #include "TGLViewer.h" #endif +#ifndef ROOT_TString +#include "TString.h" +#endif + class TGFrame; class TGCompositeFrame; class TGPopupMenu; @@ -42,14 +46,15 @@ class TGLRenderArea; // Remove - replace with TGLManager class TGLSAViewer : public TGLViewer { public: enum EGLSACommands { kGLHelpAbout, kGLHelpViewer, kGLXOY, - kGLXOZ, kGLZOY, kGLPerspYOZ, kGLPerspXOZ, kGLPerspXOY, kGLPrintEPS_SIMPLE, - kGLPrintEPS_BSP, kGLPrintPDF_SIMPLE, kGLPrintPDF_BSP, - kGLExit }; + kGLXOZ, kGLZOY, kGLPerspYOZ, kGLPerspXOZ, kGLPerspXOY, + kGLSaveEPS, kGLSavePDF, kGLSavePNG, kGLSaveGIF, + kGLSaveJPG, kGLSaveAS, kGLCloseViewer, kGLQuitROOT}; private: // GUI components TGLSAFrame *fFrame; TGPopupMenu *fFileMenu; + TGPopupMenu *fFileSaveMenu; TGPopupMenu *fCameraMenu; TGPopupMenu *fHelpMenu; TGLRenderArea *fGLArea; @@ -61,6 +66,9 @@ private: TGLColorEditor *fColorEd; TGLGeometryEditor *fGeomEd; + TString fDirName; + Int_t fTypeIdx; + Bool_t fOverwrite; // Initial window positioning static const Int_t fgInitX; @@ -77,6 +85,8 @@ private: TGLSAViewer(const TGLSAViewer &); TGLSAViewer & operator = (const TGLSAViewer &); + void SavePicture(const TString &fileName); + protected: // Overloadable virtual void PostSceneBuildSetup(); diff --git a/gl/src/TGLSAViewer.cxx b/gl/src/TGLSAViewer.cxx index 13e6ebb10e8..c3284a2311a 100644 --- a/gl/src/TGLSAViewer.cxx +++ b/gl/src/TGLSAViewer.cxx @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLSAViewer.cxx,v 1.17 2006/03/20 21:43:42 pcanal Exp $ +// @(#)root/gl:$Name: $:$Id: TGLSAViewer.cxx,v 1.18 2006/04/07 08:43:59 brun Exp $ // Author: Timur Pocheptsov / Richard Maunder /************************************************************************* @@ -8,10 +8,11 @@ * For the licensing terms see $ROOTSYS/LICENSE. * * For the list of contributors see $ROOTSYS/README/CREDITS. * *************************************************************************/ -#include <iostream> +#include <memory> #include "TRootHelpDialog.h" #include "TPluginManager.h" +#include "TApplication.h" #include "TGClient.h" #include "TGCanvas.h" #include "HelpText.h" @@ -23,6 +24,9 @@ #include "TGTab.h" #include "TGSplitter.h" #include "TColor.h" +#include "TString.h" +#include "TGFileDialog.h" +#include "TImage.h" #include "TGLEditor.h" #include "TGLOutput.h" @@ -128,18 +132,33 @@ const Int_t TGLSAViewer::fgInitH = 670; //A lot of raw pointers/naked new-expressions - good way to discredit C++ (or C++ programmer :) ) :( //ROOT has system to cleanup - I'll try to use it +const char *gGLSaveAsTypes[] = { + "Encapsulated PostScript", "*.eps", + "PDF", "*.pdf", + "GIF", "*.gif", + "JPEG", "*.jpg", + "PNG", "*.png", + 0, 0 + }; + //______________________________________________________________________________ TGLSAViewer::TGLSAViewer(TVirtualPad * pad) : TGLViewer(pad, fgInitX, fgInitY, fgInitW, fgInitH), fFrame(0), - fFileMenu(0), + fFileMenu(0), + fFileSaveMenu(0), fCameraMenu(0), fHelpMenu(0), fGLArea(0), fLeftVerticalFrame(0), fEditorTab(0), fGLEd(0), - fObjEdTab(0) + fObjEdTab(0), + fColorEd(0), + fGeomEd(0), + fDirName("."), + fTypeIdx(0), + fOverwrite(kFALSE) { // Construct a standalone viewer, bound to supplied 'pad'. // First create gVirtualGL/kernel - to be replaced with TGLManager @@ -181,11 +200,18 @@ void TGLSAViewer::CreateMenus() { //File/Camera/Help menus fFileMenu = new TGPopupMenu(fFrame->GetClient()->GetRoot()); - fFileMenu->AddEntry("Print &EPS", kGLPrintEPS_SIMPLE); - fFileMenu->AddEntry("Print EP&S (High quality)", kGLPrintEPS_BSP); - fFileMenu->AddEntry("Print &PDF", kGLPrintPDF_SIMPLE); - fFileMenu->AddEntry("Print P&DF (High quality)", kGLPrintPDF_BSP); - fFileMenu->AddEntry("E&xit", kGLExit); + fFileMenu->AddEntry("&Close Viewer", kGLCloseViewer); + fFileMenu->AddSeparator(); + fFileSaveMenu = new TGPopupMenu(fFrame->GetClient()->GetRoot()); + fFileSaveMenu->AddEntry("viewer.&eps", kGLSaveEPS); + fFileSaveMenu->AddEntry("viewer.&pdf", kGLSavePDF); + fFileSaveMenu->AddEntry("viewer.&gif", kGLSaveGIF); + fFileSaveMenu->AddEntry("viewer.&jpg", kGLSaveJPG); + fFileSaveMenu->AddEntry("viewer.p&ng", kGLSavePNG); + fFileMenu->AddPopup("&Save", fFileSaveMenu); + fFileMenu->AddEntry("Save &As...", kGLSaveAS); + fFileMenu->AddSeparator(); + fFileMenu->AddEntry("&Quit ROOT", kGLQuitROOT); fFileMenu->Associate(fFrame); fCameraMenu = new TGPopupMenu(fFrame->GetClient()->GetRoot()); @@ -338,6 +364,7 @@ TGLSAViewer::~TGLSAViewer() delete fGLArea; delete fHelpMenu; delete fCameraMenu; + delete fFileSaveMenu; delete fFileMenu; delete fFrame; } @@ -399,17 +426,11 @@ Bool_t TGLSAViewer::ProcessFrameMessage(Long_t msg, Long_t parm1, Long_t) hd->Popup(); break; } - case kGLPrintEPS_SIMPLE: - gVirtualGL->CaptureViewer(this, TGLOutput::kEPS_SIMPLE); - break; - case kGLPrintEPS_BSP: - gVirtualGL->CaptureViewer(this, TGLOutput::kEPS_BSP); + case kGLSaveEPS: + gVirtualGL->CaptureViewer(this, TGLOutput::kEPS_BSP, "viewer.eps"); break; - case kGLPrintPDF_SIMPLE: - gVirtualGL->CaptureViewer(this, TGLOutput::kPDF_SIMPLE); - break; - case kGLPrintPDF_BSP: - gVirtualGL->CaptureViewer(this, TGLOutput::kPDF_BSP); + case kGLSavePDF: + gVirtualGL->CaptureViewer(this, TGLOutput::kPDF_BSP, "viewer.pdf"); break; case kGLXOY: SetCurrentCamera(TGLViewer::kCameraOrthoXOY); @@ -429,11 +450,52 @@ Bool_t TGLSAViewer::ProcessFrameMessage(Long_t msg, Long_t parm1, Long_t) case kGLPerspXOY: SetCurrentCamera(TGLViewer::kCameraPerspXOY); break; - case kGLExit: + case kGLSaveGIF: + SavePicture("viewer.gif"); + break; + case kGLSaveJPG: + SavePicture("viewer.jpg"); + case kGLSavePNG: + SavePicture("viewer.png"); + break; + case kGLSaveAS: + { + TGFileInfo fi; + fi.fFileTypes = gGLSaveAsTypes; + fi.fIniDir = StrDup(fDirName); + fi.fFileTypeIdx = fTypeIdx; + fi.fOverwrite = fOverwrite; + new TGFileDialog(gClient->GetDefaultRoot(), fFrame, kFDSave, &fi); + if (!fi.fFilename) return kTRUE; + TString fileName(fi.fFilename); + TString ft(fi.fFileTypes[fi.fFileTypeIdx+1]); + fDirName = fi.fIniDir; + fTypeIdx = fi.fFileTypeIdx; + fOverwrite = fi.fOverwrite; + + if (!fileName.EndsWith(".eps") && !fileName.EndsWith(".pdf") && + !fileName.EndsWith(".jpg") && !fileName.EndsWith(".gif") && + !fileName.EndsWith(".png")) + if (ft.Index(".") != kNPOS) + fileName += ft(ft.Index("."), ft.Length()); + else { + Warning("ProcessMessage", "file %s cannot be saved with this extension", fi.fFilename); + return kTRUE; + } + + SavePicture(fileName); + } + + break; + case kGLCloseViewer: // Exit needs to be delayed to avoid bad drawable X ids - GUI // will all be changed in future anyway TTimer::SingleShot(50, "TGLSAFrame", fFrame, "SendCloseMessage()"); break; + case kGLQuitROOT: + if (!gApplication->ReturnFromRun()) + delete this; + gApplication->Terminate(0); default: break; } @@ -506,3 +568,17 @@ void TGLSAViewer::PostSceneBuildSetup() // Now synconise the GUI-removed } + +//______________________________________________________________________________ +void TGLSAViewer::SavePicture(const TString &fileName) +{ + if (fileName.EndsWith(".eps")) + gVirtualGL->CaptureViewer(this, TGLOutput::kEPS_BSP, fileName.Data()); + else if (fileName.EndsWith(".pdf")) + gVirtualGL->CaptureViewer(this, TGLOutput::kPDF_BSP, fileName.Data()); + else if (fileName.EndsWith(".gif") || fileName.EndsWith(".jpg") || fileName.EndsWith(".png")) { + std::auto_ptr<TImage>gif(TImage::Create()); + gif->FromWindow(fGLArea->GetGLWindow()->GetId()); + gif->WriteImage(fileName.Data()); + } +} -- GitLab