Developer Documentation
QtBaseViewerSnapshot.cc
1 /*===========================================================================*\
2  * *
3  * OpenFlipper *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openflipper.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenFlipper. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39  * *
40 \*===========================================================================*/
41 
42 
43 
44 
45 
46 //=============================================================================
47 //
48 // CLASS QtBaseViewer - IMPLEMENTATION
49 //
50 //=============================================================================
51 
52 
53 //== INCLUDES =================================================================
54 
55 #include "QtBaseViewer.hh"
56 #include "QtGLGraphicsScene.hh"
57 #include "QtGLGraphicsView.hh"
58 
59 #include <QApplication>
60 #include <QStatusBar>
61 #include <QFileInfo>
62 #include <QFileDialog>
63 
64 //== NAMESPACES ===============================================================
65 
66 namespace ACG {
67 namespace QtWidgets {
68 
69 
70 //== IMPLEMENTATION ==========================================================
71 
72 void QtBaseViewer::snapshotBaseFileName(const QString& _fname)
73 {
74  snapshotName_=_fname;
76 }
77 
78 
79 //-----------------------------------------------------------------------------
80 
81 
83 {
84  makeCurrent();
85 
86  glView_->raise();
87  qApp->processEvents();
88  makeCurrent();
89  paintGL();
90  glFinish();
91  copyToImage(*snapshot_, 0, 0, glWidth(), glHeight(), GL_BACK);
92 
93  QFileInfo fi(snapshotName_);
94 
95  QString fname = fi.path() + QDir::separator() +fi.baseName() + "." + QString::number(snapshotCounter_).rightJustified(7, '0') + ".";
96 
97  QString format="png";
98 
99  if (fi.completeSuffix() == "ppm")
100  format="ppmraw";
101 
102  fname += format;
103 
104  bool rval=snapshot_->save(fname,format.toUpper().toLatin1());
105 
106 
107  assert(statusbar_!=0);
108  if (rval)
109  {
110  statusbar_->showMessage(QString("snapshot: ")+fname,5000);
111  if ( action_["SnapshotSavesView"]->isChecked() )
112  {
113  QString view; encodeView(view);
114  QFile f(fname+".view"); f.open(QIODevice::WriteOnly|QIODevice::Truncate);
115  QTextStream sf(&f); sf << view; f.close();
116  }
117  }
118  else
119  {
120  statusbar_->showMessage(QString("could not save snapshot to ")+fname);
121  }
122 
124 }
125 
126 //-----------------------------------------------------------------------------
127 
128 
130 {
131  snapshot();
132 }
133 
134 
135 //-----------------------------------------------------------------------------
136 
137 
139 {
140  QString fname=snapshotName_;
141 
142  fname.replace('%', '$');
143  fname = QFileDialog::getSaveFileName ( 0, "Save snapshot name" );
144  if (!fname.isEmpty())
145  {
146  fname.replace('$', '%');
147 
148  snapshotBaseFileName(fname);
149  assert(statusbar_!=0);
150  QString msg="next snapshot: ";
151  statusbar_->showMessage(msg);
152  }
153 }
154 
155 
156 //-----------------------------------------------------------------------------
157 
158 
160 {
161 }
162 
163 //=============================================================================
164 } // namespace QtWidgets
165 } // namespace ACG
166 //=============================================================================
void encodeView(QString &_view)
convert current view to text representation
Namespace providing different geometric functions concerning angles.
virtual void makeCurrent()
Makes this widget the current widget for OpenGL operations.
virtual void paintGL()
draw the scene. Triggered by updateGL().
void copyToImage(QImage &_image, GLenum _buffer=GL_BACK)
copy current framebuffer to an QImage
unsigned int glWidth() const
get width of QGLWidget
virtual void snapshotBaseFileName(const QString &_fname)
unsigned int glHeight() const
get height of QGLWidget