修改ui显示和osg的库
This commit is contained in:
parent
9b47b518d5
commit
65cbe121bf
@ -26,7 +26,7 @@ QString Application::GetWorkSpacePath() {
|
|||||||
|
|
||||||
void Application::Init() {
|
void Application::Init() {
|
||||||
Singleton<MeshManager>::Create(this);
|
Singleton<MeshManager>::Create(this);
|
||||||
Singleton<OsgViewer>::Create(this);
|
//Singleton<OsgViewer>::Create(this);
|
||||||
Singleton<RecourceHelper>::Create(this);
|
Singleton<RecourceHelper>::Create(this);
|
||||||
Singleton<EntitiesManager>::Create(this);
|
Singleton<EntitiesManager>::Create(this);
|
||||||
Singleton<WorkSpaceManager>::Create(this);
|
Singleton<WorkSpaceManager>::Create(this);
|
||||||
@ -40,6 +40,6 @@ void Application::Uninit() {
|
|||||||
Singleton<WorkSpaceManager>::Destory();
|
Singleton<WorkSpaceManager>::Destory();
|
||||||
Singleton<EntitiesManager>::Destory();
|
Singleton<EntitiesManager>::Destory();
|
||||||
Singleton<RecourceHelper>::Destory();
|
Singleton<RecourceHelper>::Destory();
|
||||||
Singleton<OsgViewer>::Destory();
|
//Singleton<OsgViewer>::Destory();
|
||||||
Singleton<MeshManager>::Destory();
|
Singleton<MeshManager>::Destory();
|
||||||
}
|
}
|
||||||
|
23
src/main.cpp
23
src/main.cpp
@ -374,7 +374,7 @@ int main(int argc, char* argv[]) {
|
|||||||
SpdLogger logger("logs/log.txt", 5);
|
SpdLogger logger("logs/log.txt", 5);
|
||||||
//
|
//
|
||||||
Application::setAttribute(Qt::AA_EnableHighDpiScaling);
|
Application::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||||
//
|
////
|
||||||
Application app(argc, argv);
|
Application app(argc, argv);
|
||||||
app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
|
app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
|
||||||
// InstallCrashHandler();
|
// InstallCrashHandler();
|
||||||
@ -387,15 +387,14 @@ int main(int argc, char* argv[]) {
|
|||||||
int ret = app.exec();
|
int ret = app.exec();
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
osg::ArgumentParser arguments(&argc, argv);
|
//osg::ArgumentParser arguments(&argc, argv);
|
||||||
|
|
||||||
// Qt5 is currently crashing and reporting "Cannot make QOpenGLContext current in a different thread" when the viewer is run multi-threaded, this is regression from Qt4
|
//QMainWindow* mainWindow = new QMainWindow;
|
||||||
osgViewer::ViewerBase::ThreadingModel threadingModel = osgViewer::ViewerBase::SingleThreaded;
|
//OsgWidget* viewWidget = new OsgWidget(nullptr, Qt::Widget);
|
||||||
|
//mainWindow->setCentralWidget(viewWidget);
|
||||||
OsgWidget* viewWidget = new OsgWidget(nullptr, Qt::Widget);
|
//// ViewerWidget* viewWidget = new ViewerWidget(nullptr, Qt::Widget, threadingModel);
|
||||||
// ViewerWidget* viewWidget = new ViewerWidget(nullptr, Qt::Widget, threadingModel);
|
////viewWidget->setGeometry( 100, 100, 800, 600 );
|
||||||
viewWidget->setGeometry( 100, 100, 800, 600 );
|
//viewWidget->Initialize();
|
||||||
viewWidget->Initialize();
|
//mainWindow->show();
|
||||||
viewWidget->show();
|
//return app.exec();
|
||||||
return app.exec();
|
|
||||||
}
|
}
|
||||||
|
1066
src/osgqt/GraphicsWindowQt.cpp
Normal file
1066
src/osgqt/GraphicsWindowQt.cpp
Normal file
File diff suppressed because it is too large
Load Diff
195
src/osgqt/GraphicsWindowQt.h
Normal file
195
src/osgqt/GraphicsWindowQt.h
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 2009 Wang Rui
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OSGVIEWER_GRAPHICSWINDOWQT
|
||||||
|
#define OSGVIEWER_GRAPHICSWINDOWQT
|
||||||
|
|
||||||
|
#define USE_NO_STATIC_REGISTRATION 1
|
||||||
|
|
||||||
|
#include <osgViewer/GraphicsWindow>
|
||||||
|
|
||||||
|
#include <QMutex>
|
||||||
|
#include <QEvent>
|
||||||
|
#include <QQueue>
|
||||||
|
#include <QSet>
|
||||||
|
#include <QGLWidget>
|
||||||
|
|
||||||
|
class QInputEvent;
|
||||||
|
class QGestureEvent;
|
||||||
|
|
||||||
|
namespace osgViewer {
|
||||||
|
class ViewerBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace osgQt
|
||||||
|
{
|
||||||
|
|
||||||
|
// forward declarations
|
||||||
|
class GraphicsWindowQt;
|
||||||
|
|
||||||
|
#if USE_NO_STATIC_REGISTRATION
|
||||||
|
/// The function sets the WindowingSystem to Qt.
|
||||||
|
void initQtWindowingSystem();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** The function sets the viewer that will be used after entering
|
||||||
|
* the Qt main loop (QCoreApplication::exec()).
|
||||||
|
*
|
||||||
|
* The function also initializes internal structures required for proper
|
||||||
|
* scene rendering.
|
||||||
|
*
|
||||||
|
* The method must be called from main thread. */
|
||||||
|
void setViewer( osgViewer::ViewerBase *viewer );
|
||||||
|
|
||||||
|
|
||||||
|
class GLWidget : public QGLWidget
|
||||||
|
{
|
||||||
|
typedef QGLWidget inherited;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
GLWidget( QWidget* parent = NULL, const QGLWidget* shareWidget = NULL, Qt::WindowFlags f = 0, bool forwardKeyEvents = false );
|
||||||
|
GLWidget( QGLContext* context, QWidget* parent = NULL, const QGLWidget* shareWidget = NULL, Qt::WindowFlags f = 0, bool forwardKeyEvents = false );
|
||||||
|
GLWidget( const QGLFormat& format, QWidget* parent = NULL, const QGLWidget* shareWidget = NULL, Qt::WindowFlags f = 0, bool forwardKeyEvents = false );
|
||||||
|
virtual ~GLWidget();
|
||||||
|
|
||||||
|
inline void setGraphicsWindow( GraphicsWindowQt* gw ) { _gw = gw; }
|
||||||
|
inline GraphicsWindowQt* getGraphicsWindow() { return _gw; }
|
||||||
|
inline const GraphicsWindowQt* getGraphicsWindow() const { return _gw; }
|
||||||
|
|
||||||
|
inline bool getForwardKeyEvents() const { return _forwardKeyEvents; }
|
||||||
|
virtual void setForwardKeyEvents( bool f ) { _forwardKeyEvents = f; }
|
||||||
|
|
||||||
|
inline bool getTouchEventsEnabled() const { return _touchEventsEnabled; }
|
||||||
|
void setTouchEventsEnabled( bool e );
|
||||||
|
|
||||||
|
void setKeyboardModifiers( QInputEvent* event );
|
||||||
|
|
||||||
|
virtual void keyPressEvent( QKeyEvent* event );
|
||||||
|
virtual void keyReleaseEvent( QKeyEvent* event );
|
||||||
|
virtual void mousePressEvent( QMouseEvent* event );
|
||||||
|
virtual void mouseReleaseEvent( QMouseEvent* event );
|
||||||
|
virtual void mouseDoubleClickEvent( QMouseEvent* event );
|
||||||
|
virtual void mouseMoveEvent( QMouseEvent* event );
|
||||||
|
virtual void wheelEvent( QWheelEvent* event );
|
||||||
|
virtual bool gestureEvent( QGestureEvent* event );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
int getNumDeferredEvents()
|
||||||
|
{
|
||||||
|
QMutexLocker lock(&_deferredEventQueueMutex);
|
||||||
|
return _deferredEventQueue.count();
|
||||||
|
}
|
||||||
|
void enqueueDeferredEvent(QEvent::Type eventType, QEvent::Type removeEventType = QEvent::None)
|
||||||
|
{
|
||||||
|
QMutexLocker lock(&_deferredEventQueueMutex);
|
||||||
|
|
||||||
|
if (removeEventType != QEvent::None)
|
||||||
|
{
|
||||||
|
if (_deferredEventQueue.removeOne(removeEventType))
|
||||||
|
_eventCompressor.remove(eventType);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_eventCompressor.find(eventType) == _eventCompressor.end())
|
||||||
|
{
|
||||||
|
_deferredEventQueue.enqueue(eventType);
|
||||||
|
_eventCompressor.insert(eventType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void processDeferredEvents();
|
||||||
|
|
||||||
|
friend class GraphicsWindowQt;
|
||||||
|
GraphicsWindowQt* _gw;
|
||||||
|
|
||||||
|
QMutex _deferredEventQueueMutex;
|
||||||
|
QQueue<QEvent::Type> _deferredEventQueue;
|
||||||
|
QSet<QEvent::Type> _eventCompressor;
|
||||||
|
|
||||||
|
bool _touchEventsEnabled;
|
||||||
|
|
||||||
|
bool _forwardKeyEvents;
|
||||||
|
qreal _devicePixelRatio;
|
||||||
|
|
||||||
|
virtual void resizeEvent( QResizeEvent* event );
|
||||||
|
virtual void moveEvent( QMoveEvent* event );
|
||||||
|
virtual void glDraw();
|
||||||
|
virtual bool event( QEvent* event );
|
||||||
|
};
|
||||||
|
|
||||||
|
class GraphicsWindowQt : public osgViewer::GraphicsWindow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GraphicsWindowQt( osg::GraphicsContext::Traits* traits, QWidget* parent = NULL, const QGLWidget* shareWidget = NULL, Qt::WindowFlags f = 0 );
|
||||||
|
GraphicsWindowQt( GLWidget* widget );
|
||||||
|
virtual ~GraphicsWindowQt();
|
||||||
|
|
||||||
|
inline GLWidget* getGLWidget() { return _widget; }
|
||||||
|
inline const GLWidget* getGLWidget() const { return _widget; }
|
||||||
|
|
||||||
|
/// deprecated
|
||||||
|
inline GLWidget* getGraphWidget() { return _widget; }
|
||||||
|
/// deprecated
|
||||||
|
inline const GLWidget* getGraphWidget() const { return _widget; }
|
||||||
|
|
||||||
|
struct WindowData : public osg::Referenced
|
||||||
|
{
|
||||||
|
WindowData( GLWidget* widget = NULL, QWidget* parent = NULL ): _widget(widget), _parent(parent) {}
|
||||||
|
GLWidget* _widget;
|
||||||
|
QWidget* _parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool init( QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f );
|
||||||
|
|
||||||
|
static QGLFormat traits2qglFormat( const osg::GraphicsContext::Traits* traits );
|
||||||
|
static void qglFormat2traits( const QGLFormat& format, osg::GraphicsContext::Traits* traits );
|
||||||
|
static osg::GraphicsContext::Traits* createTraits( const QGLWidget* widget );
|
||||||
|
|
||||||
|
virtual bool setWindowRectangleImplementation( int x, int y, int width, int height );
|
||||||
|
virtual void getWindowRectangle( int& x, int& y, int& width, int& height );
|
||||||
|
virtual bool setWindowDecorationImplementation( bool windowDecoration );
|
||||||
|
virtual bool getWindowDecoration() const;
|
||||||
|
virtual void grabFocus();
|
||||||
|
virtual void grabFocusIfPointerInWindow();
|
||||||
|
virtual void raiseWindow();
|
||||||
|
virtual void setWindowName( const std::string& name );
|
||||||
|
virtual std::string getWindowName();
|
||||||
|
virtual void useCursor( bool cursorOn );
|
||||||
|
virtual void setCursor( MouseCursor cursor );
|
||||||
|
inline bool getTouchEventsEnabled() const { return _widget->getTouchEventsEnabled(); }
|
||||||
|
virtual void setTouchEventsEnabled( bool e ) { _widget->setTouchEventsEnabled(e); }
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool valid() const;
|
||||||
|
virtual bool realizeImplementation();
|
||||||
|
virtual bool isRealizedImplementation() const;
|
||||||
|
virtual void closeImplementation();
|
||||||
|
virtual bool makeCurrentImplementation();
|
||||||
|
virtual bool releaseContextImplementation();
|
||||||
|
virtual void swapBuffersImplementation();
|
||||||
|
virtual void runOperations();
|
||||||
|
|
||||||
|
virtual void requestWarpPointer( float x, float y );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
friend class GLWidget;
|
||||||
|
GLWidget* _widget;
|
||||||
|
bool _ownsWidget;
|
||||||
|
QCursor _currentCursor;
|
||||||
|
bool _realized;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
149
src/osgqt/QFontImplementation.cpp
Normal file
149
src/osgqt/QFontImplementation.cpp
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 2009-2010 Mathias Froehlich
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
#include "osgqt/QFontImplementation.h"
|
||||||
|
|
||||||
|
#include <osgDB/FileNameUtils>
|
||||||
|
#include <osgDB/Registry>
|
||||||
|
#include <osgText/Font>
|
||||||
|
|
||||||
|
#include <QFont>
|
||||||
|
#include <QFontMetrics>
|
||||||
|
#include <QImage>
|
||||||
|
#include <QPainter>
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef OSGTEXT_GLYPH_INTERNALFORMAT
|
||||||
|
#define OSGTEXT_GLYPH_INTERNALFORMAT GL_LUMINANCE_ALPHA
|
||||||
|
#endif
|
||||||
|
#ifndef OSGTEXT_GLYPH_FORMAT
|
||||||
|
#define OSGTEXT_GLYPH_FORMAT GL_LUMINANCE_ALPHA
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
namespace osgQt {
|
||||||
|
|
||||||
|
QFontImplementation::QFontImplementation(const QFont& font) :
|
||||||
|
_filename(font.toString().toStdString() + ".qfont"),
|
||||||
|
_font(font)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QFontImplementation::~QFontImplementation()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
QFontImplementation::getFileName() const
|
||||||
|
{
|
||||||
|
return _filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
osgText::Glyph*
|
||||||
|
QFontImplementation::getGlyph(const osgText::FontResolution& fontRes, unsigned int charcode)
|
||||||
|
{
|
||||||
|
unsigned int fontSize = fontRes.second;
|
||||||
|
_font.setPixelSize(fontSize);
|
||||||
|
|
||||||
|
float coord_scale = 1.0f/float(fontSize);
|
||||||
|
|
||||||
|
QFontMetrics fontMetrics(_font);
|
||||||
|
QFontMetricsF fontMetricsF(_font);
|
||||||
|
|
||||||
|
QRect rect = fontMetrics.boundingRect(QChar(charcode));
|
||||||
|
QRectF rectF = fontMetricsF.boundingRect(QChar(charcode));
|
||||||
|
|
||||||
|
int margin = 1;
|
||||||
|
|
||||||
|
int imageWidth = rect.width() + 2*margin;
|
||||||
|
int imageHeight = rect.height() + 2*margin;
|
||||||
|
|
||||||
|
// Now paint the glyph into the image
|
||||||
|
QImage image(imageWidth, imageHeight, QImage::Format_ARGB32);
|
||||||
|
image.fill(0);
|
||||||
|
QPainter painter(&image);
|
||||||
|
painter.setRenderHint(QPainter::TextAntialiasing);
|
||||||
|
|
||||||
|
painter.setFont(_font);
|
||||||
|
|
||||||
|
painter.setBackgroundMode(Qt::TransparentMode);
|
||||||
|
painter.setBrush(Qt::white);
|
||||||
|
painter.setPen(Qt::white);
|
||||||
|
|
||||||
|
painter.drawText(margin - rect.left(), imageHeight - 1 - (margin + rect.bottom()), QString(QChar(charcode)));
|
||||||
|
painter.end();
|
||||||
|
|
||||||
|
// Transfer the rendered image to osg
|
||||||
|
osg::ref_ptr<osgText::Glyph> glyph = new osgText::Glyph(_facade, charcode);
|
||||||
|
|
||||||
|
unsigned int dataSize = imageWidth*imageHeight;
|
||||||
|
unsigned char* data = new unsigned char[dataSize];
|
||||||
|
|
||||||
|
// copy the qimage into the texture memory
|
||||||
|
for (int x = 0; x < imageWidth; ++x)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < imageHeight; ++y)
|
||||||
|
{
|
||||||
|
data[x + y*imageWidth] = qAlpha(image.pixel(x, imageHeight - 1 - y));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// the glyph texture in osg
|
||||||
|
glyph->setImage(imageWidth, imageHeight, 1,
|
||||||
|
OSGTEXT_GLYPH_INTERNALFORMAT,
|
||||||
|
OSGTEXT_GLYPH_FORMAT, GL_UNSIGNED_BYTE,
|
||||||
|
data,
|
||||||
|
osg::Image::USE_NEW_DELETE,
|
||||||
|
1);
|
||||||
|
glyph->setInternalTextureFormat(OSGTEXT_GLYPH_INTERNALFORMAT);
|
||||||
|
|
||||||
|
glyph->setWidth((float)imageWidth * coord_scale);
|
||||||
|
glyph->setHeight((float)imageHeight * coord_scale);
|
||||||
|
|
||||||
|
// Layout parameters
|
||||||
|
float leftBearing = fontMetricsF.leftBearing(QChar(charcode));
|
||||||
|
float rightBearing = fontMetricsF.rightBearing(QChar(charcode));
|
||||||
|
|
||||||
|
// for horizonal layout
|
||||||
|
osg::Vec2 bottomLeft(leftBearing - margin, - rectF.bottom() - margin);
|
||||||
|
glyph->setHorizontalBearing(bottomLeft * coord_scale);
|
||||||
|
glyph->setHorizontalAdvance(fontMetricsF.width(QChar(charcode)) * coord_scale);
|
||||||
|
|
||||||
|
// for vertical layout
|
||||||
|
osg::Vec2 topMiddle(- margin + 0.5*(leftBearing - rect.width() - rightBearing),
|
||||||
|
rectF.top() - margin);
|
||||||
|
glyph->setVerticalBearing(topMiddle * coord_scale);
|
||||||
|
glyph->setVerticalAdvance((rectF.height() + fontMetricsF.overlinePos() - fontMetricsF.xHeight()) * coord_scale);
|
||||||
|
|
||||||
|
// ... ready
|
||||||
|
//addGlyph(fontRes, charcode, glyph.get());
|
||||||
|
|
||||||
|
return glyph.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
//osg::Vec2
|
||||||
|
//QFontImplementation::getKerning(const osgText::FontResolution& /*fontRes*/, unsigned int /*leftcharcode*/, unsigned int /*rightcharcode*/, osgText::KerningType /*kerningType*/)
|
||||||
|
//{
|
||||||
|
// return osg::Vec2(0, 0);
|
||||||
|
//}
|
||||||
|
|
||||||
|
osg::Vec2 QFontImplementation::getKerning(unsigned int leftcharcode, unsigned int rightcharcode, osgText::KerningType kerningType) {
|
||||||
|
return osg::Vec2(0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
QFontImplementation::hasVertical() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
52
src/osgqt/QFontImplementation.h
Normal file
52
src/osgqt/QFontImplementation.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 2009-2010 Mathias Froehlich
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
#ifndef QFontImplementation_H
|
||||||
|
#define QFontImplementation_H
|
||||||
|
|
||||||
|
#include <osgText/Font>
|
||||||
|
|
||||||
|
#include <QtGui/QFont>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace osgQt {
|
||||||
|
|
||||||
|
class QFontImplementation : public osgText::Font::FontImplementation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QFontImplementation(const QFont& font);
|
||||||
|
virtual ~QFontImplementation();
|
||||||
|
|
||||||
|
virtual std::string getFileName() const;
|
||||||
|
|
||||||
|
virtual bool supportsMultipleFontResolutions() const { return true; }
|
||||||
|
|
||||||
|
virtual osgText::Glyph* getGlyph(const osgText::FontResolution& fontRes, unsigned int charcode);
|
||||||
|
|
||||||
|
//virtual osgText::Glyph3D* getGlyph3D(const osgText::FontResolution& /*fontRes*/, unsigned int /*charcode*/) { return 0; }
|
||||||
|
virtual osgText::Glyph3D* getGlyph3D(unsigned int charcode) { return 0; }
|
||||||
|
|
||||||
|
//virtual osg::Vec2 getKerning(const osgText::FontResolution& fontRes, unsigned int leftcharcode, unsigned int rightcharcode, osgText::KerningType kerningType);
|
||||||
|
virtual osg::Vec2 getKerning(unsigned int leftcharcode, unsigned int rightcharcode, osgText::KerningType kerningType);
|
||||||
|
|
||||||
|
virtual bool hasVertical() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
std::string _filename;
|
||||||
|
QFont _font;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
613
src/osgqt/QGraphicsViewAdapter.cpp
Normal file
613
src/osgqt/QGraphicsViewAdapter.cpp
Normal file
@ -0,0 +1,613 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "osgqt/QGraphicsViewAdapter.h"
|
||||||
|
#include "osgqt/QWidgetImage.h"
|
||||||
|
|
||||||
|
#include <QtOpenGL/QGLWidget>
|
||||||
|
|
||||||
|
#include <osg/Version>
|
||||||
|
#include <osgGA/GUIEventAdapter>
|
||||||
|
|
||||||
|
#include <osg/NodeVisitor>
|
||||||
|
#include <osg/io_utils>
|
||||||
|
#include <QGraphicsItem>
|
||||||
|
#include <QGraphicsProxyWidget>
|
||||||
|
|
||||||
|
#define MYQKEYEVENT 2000
|
||||||
|
#define MYQPOINTEREVENT 2001
|
||||||
|
|
||||||
|
namespace osgQt
|
||||||
|
{
|
||||||
|
|
||||||
|
QCoreApplication* getOrCreateQApplication()
|
||||||
|
{
|
||||||
|
if (QApplication::instance()==0)
|
||||||
|
{
|
||||||
|
static char** argv = 0;
|
||||||
|
static int argc = 0;
|
||||||
|
static QApplication app(argc,argv);
|
||||||
|
}
|
||||||
|
return QApplication::instance();
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyQKeyEvent : public QEvent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MyQKeyEvent( int key, bool down ):
|
||||||
|
QEvent( QEvent::Type(MYQKEYEVENT) ),
|
||||||
|
_key(key), _down(down) {}
|
||||||
|
|
||||||
|
int _key;
|
||||||
|
bool _down;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MyQPointerEvent : public QEvent
|
||||||
|
{
|
||||||
|
MyQPointerEvent(int x, int y, unsigned int buttonMask):
|
||||||
|
QEvent( QEvent::Type(MYQPOINTEREVENT) ),
|
||||||
|
_x(x), _y(y),_buttonMask(buttonMask) {}
|
||||||
|
|
||||||
|
int _x, _y;
|
||||||
|
unsigned int _buttonMask;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const QImage::Format s_imageFormat = QImage::Format_ARGB32_Premultiplied;
|
||||||
|
|
||||||
|
QGraphicsViewAdapter::QGraphicsViewAdapter(osg::Image* image, QWidget* widget):
|
||||||
|
_image(image),
|
||||||
|
_backgroundWidget(0),
|
||||||
|
_previousButtonMask(0),
|
||||||
|
_previousMouseX(-1),
|
||||||
|
_previousMouseY(-1),
|
||||||
|
_previousQtMouseX(-1),
|
||||||
|
_previousQtMouseY(-1),
|
||||||
|
_previousSentEvent(false),
|
||||||
|
_requiresRendering(false),
|
||||||
|
_qtKeyModifiers(Qt::NoModifier),
|
||||||
|
_backgroundColor(255, 255, 255),
|
||||||
|
_widget(widget)
|
||||||
|
{
|
||||||
|
// make sure we have a valid QApplication before we start creating widgets.
|
||||||
|
getOrCreateQApplication();
|
||||||
|
|
||||||
|
|
||||||
|
setUpKeyMap();
|
||||||
|
|
||||||
|
_graphicsScene = new QGraphicsScene;
|
||||||
|
_graphicsScene->addWidget(widget);
|
||||||
|
|
||||||
|
_graphicsView = new QGraphicsView;
|
||||||
|
_graphicsView->setScene(_graphicsScene);
|
||||||
|
_graphicsView->viewport()->setParent(0);
|
||||||
|
|
||||||
|
#if (QT_VERSION_CHECK(4, 5, 0) <= QT_VERSION)
|
||||||
|
_graphicsScene->setStickyFocus(true);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_width = static_cast<int>(_graphicsScene->width());
|
||||||
|
_height = static_cast<int>(_graphicsScene->height());
|
||||||
|
|
||||||
|
_qimages[0] = QImage(QSize(_width, _height), s_imageFormat);
|
||||||
|
_qimages[1] = QImage(QSize(_width, _height), s_imageFormat);
|
||||||
|
_qimages[2] = QImage(QSize(_width, _height), s_imageFormat);
|
||||||
|
|
||||||
|
_currentRead = 0;
|
||||||
|
_currentWrite = 1;
|
||||||
|
_previousWrite = 2;
|
||||||
|
_previousFrameNumber = osg::UNINITIALIZED_FRAME_NUMBER;
|
||||||
|
_newImageAvailable = false;
|
||||||
|
|
||||||
|
connect(_graphicsScene, SIGNAL(changed(const QList<QRectF> &)),
|
||||||
|
this, SLOT(repaintRequestedSlot(const QList<QRectF> &)));
|
||||||
|
connect(_graphicsScene, SIGNAL(sceneRectChanged(const QRectF &)),
|
||||||
|
this, SLOT(repaintRequestedSlot(const QRectF &)));
|
||||||
|
|
||||||
|
assignImage(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QGraphicsViewAdapter::repaintRequestedSlot(const QList<QRectF>&)
|
||||||
|
{
|
||||||
|
// OSG_NOTICE<<"QGraphicsViewAdapter::repaintRequestedSlot"<<std::endl;
|
||||||
|
_requiresRendering = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QGraphicsViewAdapter::repaintRequestedSlot(const QRectF&)
|
||||||
|
{
|
||||||
|
// OSG_NOTICE<<"QGraphicsViewAdapter::repaintRequestedSlot"<<std::endl;
|
||||||
|
_requiresRendering = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QGraphicsViewAdapter::customEvent ( QEvent * event )
|
||||||
|
{
|
||||||
|
if (event->type()==MYQKEYEVENT)
|
||||||
|
{
|
||||||
|
MyQKeyEvent* keyEvent = (MyQKeyEvent*)event;
|
||||||
|
handleKeyEvent(keyEvent->_key, keyEvent->_down);
|
||||||
|
}
|
||||||
|
else if (event->type()==MYQPOINTEREVENT)
|
||||||
|
{
|
||||||
|
MyQPointerEvent* pointerEvent = (MyQPointerEvent*)event;
|
||||||
|
handlePointerEvent(pointerEvent->_x, pointerEvent->_y, pointerEvent->_buttonMask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void QGraphicsViewAdapter::setUpKeyMap()
|
||||||
|
{
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_BackSpace] = Qt::Key_Backspace;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Tab] = Qt::Key_Tab;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Linefeed] = Qt::Key_Return; // No LineFeed in Qt!
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Clear] = Qt::Key_Clear;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Return] = Qt::Key_Return;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Pause] = Qt::Key_Pause;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Scroll_Lock] = Qt::Key_ScrollLock;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Sys_Req] = Qt::Key_SysReq;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Escape] = Qt::Key_Escape;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Delete] = Qt::Key_Delete;
|
||||||
|
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Home] = Qt::Key_Home;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Left] = Qt::Key_Left;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Up] = Qt::Key_Up;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Right] = Qt::Key_Right;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Down] = Qt::Key_Down;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Prior] = Qt::Key_Left; // no Prior in Qt
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Page_Up] = Qt::Key_PageUp;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Next] = Qt::Key_Right; // No Next in Qt
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Page_Down] = Qt::Key_PageDown;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_End] = Qt::Key_End;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Begin] = Qt::Key_Home; // No Begin in Qt
|
||||||
|
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Select] = Qt::Key_Select;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Print] = Qt::Key_Print;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Execute] = Qt::Key_Execute;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Insert] = Qt::Key_Insert;
|
||||||
|
//_keyMap[osgGA::GUIEventAdapter::KEY_Undo] = Qt::Key_; // no Undo
|
||||||
|
//_keyMap[osgGA::GUIEventAdapter::KEY_Redo] = Qt::Key_; // no Redo
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Menu] = Qt::Key_Menu;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Find] = Qt::Key_Search; // no Qt Find
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Cancel] = Qt::Key_Cancel;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Help] = Qt::Key_Help;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Break] = Qt::Key_Escape; // no break
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Mode_switch] = Qt::Key_Mode_switch;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Script_switch] = Qt::Key_Mode_switch; // no Script switch
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Num_Lock] = Qt::Key_NumLock;
|
||||||
|
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Shift_L] = Qt::Key_Shift;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Shift_R] = Qt::Key_Shift;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Control_L] = Qt::Key_Control;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Control_R] = Qt::Key_Control;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Caps_Lock] = Qt::Key_CapsLock;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Shift_Lock] = Qt::Key_CapsLock;
|
||||||
|
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Meta_L] = Qt::Key_Meta; // Qt doesn't have a Meta L
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Meta_R] = Qt::Key_Meta; // Qt doesn't have a Meta R
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Alt_L] = Qt::Key_Alt; // Qt doesn't have a Alt L
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Alt_R] = Qt::Key_Alt; // Qt doesn't have a Alt R
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Super_L] = Qt::Key_Super_L;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Super_R] = Qt::Key_Super_R;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Hyper_L] = Qt::Key_Hyper_L;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_Hyper_R] = Qt::Key_Hyper_R;
|
||||||
|
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Space] = Qt::Key_Space;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Tab] = Qt::Key_Tab;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Enter] = Qt::Key_Enter;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_F1] = Qt::Key_F1;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_F2] = Qt::Key_F2;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_F3] = Qt::Key_F3;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_F4] = Qt::Key_F4;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Home] = Qt::Key_Home;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Left] = Qt::Key_Left;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Up] = Qt::Key_Up;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Right] = Qt::Key_Right;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Down] = Qt::Key_Down;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Prior] = Qt::Key_Left;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Page_Up] = Qt::Key_PageUp;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Next] = Qt::Key_Right;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Page_Down] = Qt::Key_PageDown;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_End] = Qt::Key_End;
|
||||||
|
|
||||||
|
// _keyMap[osgGA::GUIEventAdapter::KEY_KP_Begin] = Qt::Key_Begin;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Insert] = Qt::Key_Insert;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Delete] = Qt::Key_Delete;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Equal] = Qt::Key_Equal;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Multiply] = Qt::Key_Asterisk;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Add] = Qt::Key_Plus;
|
||||||
|
//_keyMap[osgGA::GUIEventAdapter::KEY_KP_Separator] = Qt::Key_;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Subtract] = Qt::Key_Minus;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Decimal] = Qt::Key_Period;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_Divide] = Qt::Key_division;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_0] = Qt::Key_0;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_1] = Qt::Key_1;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_2] = Qt::Key_2;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_3] = Qt::Key_3;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_4] = Qt::Key_4;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_5] = Qt::Key_5;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_6] = Qt::Key_6;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_7] = Qt::Key_7;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_8] = Qt::Key_8;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_KP_9] = Qt::Key_9;
|
||||||
|
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F1] = Qt::Key_F1;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F2] = Qt::Key_F2;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F3] = Qt::Key_F3;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F4] = Qt::Key_F4;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F5] = Qt::Key_F5;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F6] = Qt::Key_F6;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F7] = Qt::Key_F7;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F8] = Qt::Key_F8;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F9] = Qt::Key_F9;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F10] = Qt::Key_F10;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F11] = Qt::Key_F11;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F12] = Qt::Key_F12;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F13] = Qt::Key_F13;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F14] = Qt::Key_F14;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F15] = Qt::Key_F15;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F16] = Qt::Key_F16;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F17] = Qt::Key_F17;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F18] = Qt::Key_F18;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F19] = Qt::Key_F19;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F20] = Qt::Key_F20;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F21] = Qt::Key_F21;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F22] = Qt::Key_F22;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F23] = Qt::Key_F23;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F24] = Qt::Key_F24;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F25] = Qt::Key_F25;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F26] = Qt::Key_F26;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F27] = Qt::Key_F27;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F28] = Qt::Key_F28;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F29] = Qt::Key_F29;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F30] = Qt::Key_F30;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F31] = Qt::Key_F31;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F32] = Qt::Key_F32;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F33] = Qt::Key_F33;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F34] = Qt::Key_F34;
|
||||||
|
_keyMap[osgGA::GUIEventAdapter::KEY_F35] = Qt::Key_F35;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget* QGraphicsViewAdapter::getWidgetAt(const QPoint& pos)
|
||||||
|
{
|
||||||
|
QWidget* childAt = _graphicsView->childAt(pos);
|
||||||
|
if(childAt)
|
||||||
|
{
|
||||||
|
return childAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
QGraphicsItem* item = _graphicsView->itemAt(pos);
|
||||||
|
if(item /*&& item->contains(item->mapFromScene(pos))*/)
|
||||||
|
{
|
||||||
|
QGraphicsProxyWidget* p = qgraphicsitem_cast<QGraphicsProxyWidget*>(item);
|
||||||
|
if(p)
|
||||||
|
{
|
||||||
|
childAt = p->widget();
|
||||||
|
QWidget* c;
|
||||||
|
while( (c = childAt->childAt(childAt->mapFromGlobal(pos)))!=0 )
|
||||||
|
{
|
||||||
|
childAt = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Widgets like QTextEdit will automatically add child scroll area widgets
|
||||||
|
// that will be selected by childAt(), we have to change to parents at that moment
|
||||||
|
// Hardcoded by the internal widget's name 'qt_scrollarea_viewport' at present
|
||||||
|
if (childAt->objectName() == "qt_scrollarea_viewport")
|
||||||
|
{
|
||||||
|
childAt = childAt->parentWidget();
|
||||||
|
}
|
||||||
|
return childAt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QGraphicsViewAdapter::sendPointerEvent(int x, int y, int buttonMask)
|
||||||
|
{
|
||||||
|
_previousQtMouseX = x;
|
||||||
|
_previousQtMouseY = _graphicsView->size().height() - y;
|
||||||
|
|
||||||
|
QPoint pos(_previousQtMouseX, _previousQtMouseY);
|
||||||
|
|
||||||
|
QWidget* targetWidget = getWidgetAt(pos);
|
||||||
|
OSG_INFO << "Get " << (targetWidget ? targetWidget->metaObject()->className() : std::string("NULL"))
|
||||||
|
<< " at global pos " << x << ", " << y << std::endl;
|
||||||
|
|
||||||
|
if (_backgroundWidget && _backgroundWidget == targetWidget)
|
||||||
|
{
|
||||||
|
// Mouse is at background widget, so ignore such events
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetWidget != NULL || (_previousSentEvent && buttonMask != 0))
|
||||||
|
{
|
||||||
|
QCoreApplication::postEvent(this, new MyQPointerEvent(x,y,buttonMask));
|
||||||
|
OSG_INFO<<"sendPointerEvent("<<x<<", "<<y<<") sent"<<std::endl;
|
||||||
|
_previousSentEvent = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
OSG_INFO<<"sendPointerEvent("<<x<<", "<<y<<") not sent"<<std::endl;
|
||||||
|
_previousSentEvent = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QGraphicsViewAdapter::handlePointerEvent(int x, int y, int buttonMask)
|
||||||
|
{
|
||||||
|
OSG_INFO<<"dispatchPointerEvent("<<x<<", "<<y<<", "<<buttonMask<<")"<<std::endl;
|
||||||
|
|
||||||
|
y = _graphicsView->size().height()-y;
|
||||||
|
|
||||||
|
bool leftButtonPressed = (buttonMask & osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)!=0;
|
||||||
|
bool middleButtonPressed = (buttonMask & osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON)!=0;
|
||||||
|
bool rightButtonPressed = (buttonMask & osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON)!=0;
|
||||||
|
|
||||||
|
bool prev_leftButtonPressed = (_previousButtonMask & osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)!=0;
|
||||||
|
bool prev_middleButtonPressed = (_previousButtonMask & osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON)!=0;
|
||||||
|
bool prev_rightButtonPressed = (_previousButtonMask & osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON)!=0;
|
||||||
|
|
||||||
|
OSG_INFO<<"leftButtonPressed "<<leftButtonPressed<<std::endl;
|
||||||
|
OSG_INFO<<"middleButtonPressed "<<middleButtonPressed<<std::endl;
|
||||||
|
OSG_INFO<<"rightButtonPressed "<<rightButtonPressed<<std::endl;
|
||||||
|
|
||||||
|
Qt::MouseButtons qtMouseButtons =
|
||||||
|
(leftButtonPressed ? Qt::LeftButton : Qt::NoButton) |
|
||||||
|
(middleButtonPressed ? Qt::MidButton : Qt::NoButton) |
|
||||||
|
(rightButtonPressed ? Qt::RightButton : Qt::NoButton);
|
||||||
|
|
||||||
|
const QPoint globalPos(x, y);
|
||||||
|
QWidget* targetWidget = getWidgetAt(globalPos);
|
||||||
|
|
||||||
|
if (buttonMask != _previousButtonMask)
|
||||||
|
{
|
||||||
|
Qt::MouseButton qtButton = Qt::NoButton;
|
||||||
|
QEvent::Type eventType = QEvent::None;
|
||||||
|
if (leftButtonPressed != prev_leftButtonPressed)
|
||||||
|
{
|
||||||
|
qtButton = Qt::LeftButton;
|
||||||
|
eventType = leftButtonPressed ? QEvent::MouseButtonPress : QEvent::MouseButtonRelease ;
|
||||||
|
}
|
||||||
|
else if (middleButtonPressed != prev_middleButtonPressed)
|
||||||
|
{
|
||||||
|
qtButton = Qt::MidButton;
|
||||||
|
eventType = middleButtonPressed ? QEvent::MouseButtonPress : QEvent::MouseButtonRelease ;
|
||||||
|
}
|
||||||
|
else if (rightButtonPressed != prev_rightButtonPressed)
|
||||||
|
{
|
||||||
|
qtButton = Qt::RightButton;
|
||||||
|
eventType = rightButtonPressed ? QEvent::MouseButtonPress : QEvent::MouseButtonRelease ;
|
||||||
|
if(!rightButtonPressed)
|
||||||
|
{
|
||||||
|
if(targetWidget)
|
||||||
|
{
|
||||||
|
QPoint localPos = targetWidget->mapFromGlobal(globalPos);
|
||||||
|
QContextMenuEvent* cme = new QContextMenuEvent(QContextMenuEvent::Mouse, localPos, globalPos);
|
||||||
|
QCoreApplication::postEvent(targetWidget, cme);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eventType==QEvent::MouseButtonPress)
|
||||||
|
{
|
||||||
|
_image->sendFocusHint(true);
|
||||||
|
if (targetWidget) targetWidget->setFocus(Qt::MouseFocusReason);
|
||||||
|
}
|
||||||
|
|
||||||
|
QMouseEvent event(eventType, globalPos, qtButton, qtMouseButtons, 0);
|
||||||
|
QCoreApplication::sendEvent(_graphicsView->viewport(), &event);
|
||||||
|
|
||||||
|
_previousButtonMask = buttonMask;
|
||||||
|
}
|
||||||
|
else if (x != _previousMouseX || y != _previousMouseY)
|
||||||
|
{
|
||||||
|
QMouseEvent event(QEvent::MouseMove, globalPos, Qt::NoButton, qtMouseButtons, 0);
|
||||||
|
QCoreApplication::sendEvent(_graphicsView->viewport(), &event);
|
||||||
|
|
||||||
|
_previousMouseX = x;
|
||||||
|
_previousMouseY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QGraphicsViewAdapter::sendKeyEvent(int key, bool keyDown)
|
||||||
|
{
|
||||||
|
QPoint pos(_previousQtMouseX, _previousQtMouseY);
|
||||||
|
QWidget* targetWidget = getWidgetAt(pos);
|
||||||
|
if (_backgroundWidget && _backgroundWidget == targetWidget)
|
||||||
|
{
|
||||||
|
// Mouse is at background widget, so ignore such events
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetWidget != NULL)
|
||||||
|
{
|
||||||
|
QCoreApplication::postEvent(this, new MyQKeyEvent(key,keyDown));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QGraphicsViewAdapter::handleKeyEvent(int key, bool keyDown)
|
||||||
|
{
|
||||||
|
QEvent::Type eventType = keyDown ? QEvent::KeyPress : QEvent::KeyRelease;
|
||||||
|
|
||||||
|
OSG_INFO<<"sendKeyEvent("<<key<<", "<<keyDown<<")"<<std::endl;
|
||||||
|
|
||||||
|
if (key==Qt::Key_Shift)
|
||||||
|
{
|
||||||
|
_qtKeyModifiers = (_qtKeyModifiers & ~Qt::ShiftModifier) | (keyDown ? Qt::ShiftModifier : Qt::NoModifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key==Qt::Key_Control)
|
||||||
|
{
|
||||||
|
_qtKeyModifiers = (_qtKeyModifiers & ~Qt::ControlModifier) | (keyDown ? Qt::ControlModifier : Qt::NoModifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key==Qt::Key_Alt || key==Qt::Key_AltGr)
|
||||||
|
{
|
||||||
|
_qtKeyModifiers = (_qtKeyModifiers & ~Qt::ControlModifier) | (keyDown ? Qt::ControlModifier : Qt::NoModifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key==Qt::Key_Meta)
|
||||||
|
{
|
||||||
|
_qtKeyModifiers = (_qtKeyModifiers & ~Qt::MetaModifier) | (keyDown ? Qt::MetaModifier : Qt::NoModifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
Qt::Key qtkey;
|
||||||
|
QChar input;
|
||||||
|
|
||||||
|
KeyMap::iterator itr = _keyMap.find(key);
|
||||||
|
if (itr != _keyMap.end())
|
||||||
|
{
|
||||||
|
qtkey = itr->second;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qtkey = (Qt::Key)key;
|
||||||
|
input = QChar(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
QKeyEvent event(eventType, qtkey, _qtKeyModifiers, input);
|
||||||
|
QCoreApplication::sendEvent(_graphicsScene.data(), &event);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QGraphicsViewAdapter::setFrameLastRendered(const osg::FrameStamp* frameStamp)
|
||||||
|
{
|
||||||
|
OSG_INFO<<"setFrameLastRendered("<<frameStamp->getFrameNumber()<<")"<<std::endl;
|
||||||
|
|
||||||
|
if (_newImageAvailable && _previousFrameNumber!=frameStamp->getFrameNumber())
|
||||||
|
{
|
||||||
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_qimagesMutex);
|
||||||
|
|
||||||
|
// make sure that _previousFrameNumber hasn't been updated by another thread since we entered this branch.
|
||||||
|
if (_previousFrameNumber==frameStamp->getFrameNumber()) return;
|
||||||
|
_previousFrameNumber = frameStamp->getFrameNumber();
|
||||||
|
|
||||||
|
std::swap(_currentRead, _previousWrite);
|
||||||
|
_newImageAvailable = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
assignImage(_currentRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void QGraphicsViewAdapter::clearWriteBuffer()
|
||||||
|
{
|
||||||
|
QImage& image = _qimages[_currentWrite];
|
||||||
|
image.fill(_backgroundColor.rgba ());
|
||||||
|
image = QGLWidget::convertToGLFormat(image);
|
||||||
|
|
||||||
|
// swap the write buffers in a thread safe way
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_qimagesMutex);
|
||||||
|
std::swap(_currentWrite, _previousWrite);
|
||||||
|
_newImageAvailable = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QGraphicsViewAdapter::render()
|
||||||
|
{
|
||||||
|
OSG_INFO<<"Current write = "<<_currentWrite<<std::endl;
|
||||||
|
QImage& image = _qimages[_currentWrite];
|
||||||
|
_requiresRendering = false;
|
||||||
|
|
||||||
|
// If we got a resize, act on it, first by resizing the view, then the current image
|
||||||
|
|
||||||
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_qresizeMutex);
|
||||||
|
if (_graphicsView->size().width() != _width || _graphicsView->size().height() != _height)
|
||||||
|
{
|
||||||
|
_graphicsView->setGeometry(0, 0, _width, _height);
|
||||||
|
_graphicsView->viewport()->setGeometry(0, 0, _width, _height);
|
||||||
|
|
||||||
|
_widget->setGeometry(0, 0, _width, _height);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (image.width() != _width || image.height() != _height)
|
||||||
|
{
|
||||||
|
_qimages[_currentWrite] = QImage(_width, _height, s_imageFormat);
|
||||||
|
image = _qimages[_currentWrite];
|
||||||
|
}
|
||||||
|
OSG_INFO << "render image " << _currentWrite << " with size (" << _width << "," << _height << ")" <<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
// paint the image with the graphics view
|
||||||
|
QPainter painter(&image);
|
||||||
|
|
||||||
|
// Clear the image otherwise there are artifacts for some widgets that overpaint.
|
||||||
|
painter.setCompositionMode(QPainter::CompositionMode_Source);
|
||||||
|
painter.fillRect(0, 0, image.width(), image.height(), _backgroundColor);
|
||||||
|
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
|
||||||
|
|
||||||
|
QRectF destinationRect(0, 0, image.width(), image.height());
|
||||||
|
QRect sourceRect(0, 0, image.width(), image.height());
|
||||||
|
_graphicsView->render(&painter, destinationRect, sourceRect, Qt::IgnoreAspectRatio);
|
||||||
|
painter.end();
|
||||||
|
#elif 0
|
||||||
|
QPixmap pixmap(QPixmap::grabWidget(_graphicsView.data(), QRect(0, 0, image.width(), image.height())));
|
||||||
|
image = pixmap.toImage();
|
||||||
|
#else
|
||||||
|
// paint the image with the graphics view
|
||||||
|
QPixmap pixmap(image.width(), image.height());
|
||||||
|
// Clear the image otherwise there are artifacts for some widgets that overpaint.
|
||||||
|
pixmap.fill(Qt::transparent);
|
||||||
|
QPainter painter(&pixmap);
|
||||||
|
|
||||||
|
QRectF destinationRect(0, 0, image.width(), image.height());
|
||||||
|
QRect sourceRect(0, 0, image.width(), image.height());
|
||||||
|
_graphicsView->render(&painter, destinationRect, _graphicsView->viewport()->rect());
|
||||||
|
painter.end();
|
||||||
|
|
||||||
|
image = pixmap.toImage();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// convert into OpenGL format - flipping around the Y axis and swizzling the pixels
|
||||||
|
image = QGLWidget::convertToGLFormat(image);
|
||||||
|
|
||||||
|
// swap the write buffers in a thread safe way
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_qimagesMutex);
|
||||||
|
std::swap(_currentWrite, _previousWrite);
|
||||||
|
_newImageAvailable = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QGraphicsViewAdapter::assignImage(unsigned int i)
|
||||||
|
{
|
||||||
|
QImage& image = _qimages[i];
|
||||||
|
unsigned char* data = image.bits();
|
||||||
|
|
||||||
|
OSG_INFO<<"assignImage("<<i<<") image = "<<&image<<" size = ("<<image.width()<<","<<image.height()<<") data = "<<(void*)data<<std::endl;
|
||||||
|
|
||||||
|
_image->setImage(image.width(), image.height(), 1,
|
||||||
|
4, GL_RGBA, GL_UNSIGNED_BYTE,
|
||||||
|
data, osg::Image::NO_DELETE, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QGraphicsViewAdapter::resize(int width, int height)
|
||||||
|
{
|
||||||
|
OSG_INFO << "resize to (" << width << "," << height << ")" <<std::endl;
|
||||||
|
|
||||||
|
// Save the new width and height which will take effect on the next render() (in the Qt thread).
|
||||||
|
|
||||||
|
{
|
||||||
|
OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_qresizeMutex);
|
||||||
|
_width = width;
|
||||||
|
_height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force an update so render() will be called.
|
||||||
|
_graphicsScene->update(_graphicsScene->sceneRect());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
122
src/osgqt/QGraphicsViewAdapter.h
Normal file
122
src/osgqt/QGraphicsViewAdapter.h
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QGRAPHICSVIEWADAPTER
|
||||||
|
#define QGRAPHICSVIEWADAPTER
|
||||||
|
|
||||||
|
#include <QGLWidget>
|
||||||
|
|
||||||
|
#include <osg/Image>
|
||||||
|
#include <osg/observer_ptr>
|
||||||
|
|
||||||
|
#include <QPointer>
|
||||||
|
#include <QGraphicsScene>
|
||||||
|
#include <QGraphicsView>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QtEvents>
|
||||||
|
|
||||||
|
namespace osgQt
|
||||||
|
{
|
||||||
|
|
||||||
|
extern QCoreApplication* getOrCreateQApplication();
|
||||||
|
|
||||||
|
class QGraphicsViewAdapter : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
QGraphicsViewAdapter(osg::Image* image, QWidget* widget);
|
||||||
|
|
||||||
|
void setUpKeyMap();
|
||||||
|
|
||||||
|
bool sendPointerEvent(int x, int y, int buttonMask);
|
||||||
|
|
||||||
|
|
||||||
|
bool sendKeyEvent(int key, bool keyDown);
|
||||||
|
|
||||||
|
|
||||||
|
void setFrameLastRendered(const osg::FrameStamp* frameStamp);
|
||||||
|
|
||||||
|
void clearWriteBuffer();
|
||||||
|
|
||||||
|
bool requiresRendering() const { return _requiresRendering; }
|
||||||
|
void render();
|
||||||
|
|
||||||
|
void assignImage(unsigned int i);
|
||||||
|
|
||||||
|
void resize(int width, int height);
|
||||||
|
|
||||||
|
void setBackgroundColor(QColor color) { _backgroundColor = color; }
|
||||||
|
QColor getBackgroundColor() const { return _backgroundColor; }
|
||||||
|
|
||||||
|
/** The 'background widget' will ignore mouse/keyboard events and let following handlers handle them
|
||||||
|
It is mainly used for integrating scene graph and full-screen UIs
|
||||||
|
*/
|
||||||
|
void setBackgroundWidget(QWidget* w) { _backgroundWidget = w; }
|
||||||
|
QWidget* getBackgroundWidget() { return _backgroundWidget; }
|
||||||
|
|
||||||
|
QGraphicsView* getQGraphicsView() { return _graphicsView; }
|
||||||
|
QGraphicsScene* getQGraphicsScene() { return _graphicsScene; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
bool handlePointerEvent(int x, int y, int buttonMask);
|
||||||
|
bool handleKeyEvent(int key, bool keyDown);
|
||||||
|
QWidget* getWidgetAt(const QPoint& pos);
|
||||||
|
|
||||||
|
osg::observer_ptr<osg::Image> _image;
|
||||||
|
QWidget* _backgroundWidget;
|
||||||
|
|
||||||
|
int _previousButtonMask;
|
||||||
|
int _previousMouseX;
|
||||||
|
int _previousMouseY;
|
||||||
|
int _previousQtMouseX;
|
||||||
|
int _previousQtMouseY;
|
||||||
|
bool _previousSentEvent;
|
||||||
|
bool _requiresRendering;
|
||||||
|
|
||||||
|
int _width;
|
||||||
|
int _height;
|
||||||
|
|
||||||
|
typedef std::map<int, Qt::Key> KeyMap;
|
||||||
|
KeyMap _keyMap;
|
||||||
|
Qt::KeyboardModifiers _qtKeyModifiers;
|
||||||
|
|
||||||
|
QColor _backgroundColor;
|
||||||
|
QPointer<QGraphicsView> _graphicsView;
|
||||||
|
QPointer<QGraphicsScene> _graphicsScene;
|
||||||
|
QPointer<QWidget> _widget;
|
||||||
|
|
||||||
|
OpenThreads::Mutex _qimagesMutex;
|
||||||
|
OpenThreads::Mutex _qresizeMutex;
|
||||||
|
unsigned int _previousFrameNumber;
|
||||||
|
bool _newImageAvailable;
|
||||||
|
unsigned int _currentRead;
|
||||||
|
unsigned int _currentWrite;
|
||||||
|
unsigned int _previousWrite;
|
||||||
|
QImage _qimages[3];
|
||||||
|
|
||||||
|
virtual void customEvent ( QEvent * event ) ;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void repaintRequestedSlot(const QList<QRectF> ®ions);
|
||||||
|
void repaintRequestedSlot(const QRectF ®ion);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
108
src/osgqt/QWebViewImage.h
Normal file
108
src/osgqt/QWebViewImage.h
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QWEBVIEWIMAGE
|
||||||
|
#define QWEBVIEWIMAGE
|
||||||
|
|
||||||
|
// make sure this header isn't built as par of osgQt, leaving it to applications to build
|
||||||
|
#if !defined(OSGQT_LIBRARY) && !defined(OSG_LIBRARY_STATIC)
|
||||||
|
|
||||||
|
#if QT_VERSION >= 0x050000
|
||||||
|
# include <QtWebKitWidgets>
|
||||||
|
#else
|
||||||
|
# include <QtWebKit>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <osgWidget/Browser>
|
||||||
|
#include "osgqt/QGraphicsViewAdapter.h"
|
||||||
|
|
||||||
|
namespace osgQt
|
||||||
|
{
|
||||||
|
|
||||||
|
class QWebViewImage : public osgWidget::BrowserImage
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
QWebViewImage()
|
||||||
|
{
|
||||||
|
// make sure we have a valid QApplication before we start creating widgets.
|
||||||
|
getOrCreateQApplication();
|
||||||
|
|
||||||
|
_webView = new QWebView;
|
||||||
|
|
||||||
|
_webPage = new QWebPage;
|
||||||
|
_webPage->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);
|
||||||
|
_webPage->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
|
||||||
|
|
||||||
|
_webView->setPage(_webPage);
|
||||||
|
|
||||||
|
_adapter = new QGraphicsViewAdapter(this, _webView.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void navigateTo(const std::string& url)
|
||||||
|
{
|
||||||
|
_webView->load(QUrl(url.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
QWebView* getQWebView() { return _webView; }
|
||||||
|
QWebPage* getQWebPage() { return _webPage; }
|
||||||
|
QGraphicsViewAdapter* getQGraphicsViewAdapter() { return _adapter; }
|
||||||
|
|
||||||
|
void clearWriteBuffer()
|
||||||
|
{
|
||||||
|
_adapter->clearWriteBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void render()
|
||||||
|
{
|
||||||
|
if (_adapter->requiresRendering()) _adapter->render();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool requiresUpdateCall() const { return true; }
|
||||||
|
virtual void update( osg::NodeVisitor* nv ) { render(); }
|
||||||
|
|
||||||
|
virtual bool sendFocusHint(bool focus)
|
||||||
|
{
|
||||||
|
QFocusEvent event(focus ? QEvent::FocusIn : QEvent::FocusOut, Qt::OtherFocusReason);
|
||||||
|
QCoreApplication::sendEvent(_webPage, &event);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool sendPointerEvent(int x, int y, int buttonMask)
|
||||||
|
{
|
||||||
|
return _adapter->sendPointerEvent(x,y,buttonMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool sendKeyEvent(int key, bool keyDown)
|
||||||
|
{
|
||||||
|
return QWebViewImage::_adapter->sendKeyEvent(key, keyDown);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void setFrameLastRendered(const osg::FrameStamp* frameStamp)
|
||||||
|
{
|
||||||
|
_adapter->setFrameLastRendered(frameStamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
QPointer<QGraphicsViewAdapter> _adapter;
|
||||||
|
QPointer<QWebView> _webView;
|
||||||
|
QPointer<QWebPage> _webPage;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
66
src/osgqt/QWidgetImage.cpp
Normal file
66
src/osgqt/QWidgetImage.cpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "osgqt/QWidgetImage.h"
|
||||||
|
#include <QLayout>
|
||||||
|
|
||||||
|
namespace osgQt
|
||||||
|
{
|
||||||
|
|
||||||
|
QWidgetImage::QWidgetImage( QWidget* widget )
|
||||||
|
{
|
||||||
|
// make sure we have a valid QApplication before we start creating widgets.
|
||||||
|
getOrCreateQApplication();
|
||||||
|
|
||||||
|
_widget = widget;
|
||||||
|
_adapter = new QGraphicsViewAdapter(this, _widget.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QWidgetImage::sendFocusHint(bool focus)
|
||||||
|
{
|
||||||
|
QFocusEvent event(focus ? QEvent::FocusIn : QEvent::FocusOut, Qt::OtherFocusReason);
|
||||||
|
QCoreApplication::sendEvent(_widget, &event);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void QWidgetImage::clearWriteBuffer()
|
||||||
|
{
|
||||||
|
_adapter->clearWriteBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QWidgetImage::render()
|
||||||
|
{
|
||||||
|
if (_adapter->requiresRendering()) _adapter->render();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QWidgetImage::scaleImage(int s,int t,int /*r*/, GLenum /*newDataType*/)
|
||||||
|
{
|
||||||
|
_adapter->resize(s, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QWidgetImage::setFrameLastRendered(const osg::FrameStamp* frameStamp)
|
||||||
|
{
|
||||||
|
_adapter->setFrameLastRendered(frameStamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QWidgetImage::sendPointerEvent(int x, int y, int buttonMask)
|
||||||
|
{
|
||||||
|
return _adapter->sendPointerEvent(x,y,buttonMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QWidgetImage::sendKeyEvent(int key, bool keyDown)
|
||||||
|
{
|
||||||
|
return _adapter->sendKeyEvent(key, keyDown);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
60
src/osgqt/QWidgetImage.h
Normal file
60
src/osgqt/QWidgetImage.h
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2009 Robert Osfield
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QWIDGETIMAGE
|
||||||
|
#define QWIDGETIMAGE
|
||||||
|
|
||||||
|
#include <osg/Image>
|
||||||
|
|
||||||
|
#include "osgQt/QGraphicsViewAdapter.h"
|
||||||
|
|
||||||
|
namespace osgQt
|
||||||
|
{
|
||||||
|
|
||||||
|
class QWidgetImage : public osg::Image
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
QWidgetImage( QWidget* widget=0 );
|
||||||
|
|
||||||
|
QWidget* getQWidget() { return _widget; }
|
||||||
|
QGraphicsViewAdapter* getQGraphicsViewAdapter() { return _adapter; }
|
||||||
|
|
||||||
|
virtual bool requiresUpdateCall() const { return true; }
|
||||||
|
virtual void update( osg::NodeVisitor* /*nv*/ ) { render(); }
|
||||||
|
|
||||||
|
void clearWriteBuffer();
|
||||||
|
|
||||||
|
void render();
|
||||||
|
|
||||||
|
/// Overridden scaleImage used to catch cases where the image is
|
||||||
|
/// fullscreen and the window is resized.
|
||||||
|
virtual void scaleImage(int s,int t,int r, GLenum newDataType);
|
||||||
|
|
||||||
|
virtual bool sendFocusHint(bool focus);
|
||||||
|
|
||||||
|
virtual bool sendPointerEvent(int x, int y, int buttonMask);
|
||||||
|
|
||||||
|
virtual bool sendKeyEvent(int key, bool keyDown);
|
||||||
|
|
||||||
|
virtual void setFrameLastRendered(const osg::FrameStamp* frameStamp);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
QPointer<QGraphicsViewAdapter> _adapter;
|
||||||
|
QPointer<QWidget> _widget;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
66
src/osgqt/ReaderQFont.cpp
Normal file
66
src/osgqt/ReaderQFont.cpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 2009-2010 Mathias Froehlich
|
||||||
|
*
|
||||||
|
* This library is open source and may be redistributed and/or modified under
|
||||||
|
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
|
||||||
|
* (at your option) any later version. The full license is in LICENSE file
|
||||||
|
* included with this distribution, and on the openscenegraph.org website.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* OpenSceneGraph Public License for more details.
|
||||||
|
*/
|
||||||
|
#include "osgqt/QFontImplementation.h"
|
||||||
|
|
||||||
|
#include <osgDB/FileNameUtils>
|
||||||
|
#include <osgDB/Registry>
|
||||||
|
#include <osgText/Font>
|
||||||
|
|
||||||
|
#include <QtCore/QThread>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QtGui/QFont>
|
||||||
|
#include <QtGui/QFontDatabase>
|
||||||
|
|
||||||
|
namespace osgQFont {
|
||||||
|
|
||||||
|
class ReaderQFont : public osgDB::ReaderWriter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ReaderQFont()
|
||||||
|
{
|
||||||
|
supportsExtension("qfont", "Qt font meta loader");
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual const char* className() const { return "QFont Font Reader"; }
|
||||||
|
|
||||||
|
virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* /*options*/) const
|
||||||
|
{
|
||||||
|
if (!acceptsExtension(osgDB::getLowerCaseFileExtension(file)))
|
||||||
|
return ReadResult::FILE_NOT_HANDLED;
|
||||||
|
|
||||||
|
if (!QApplication::instance())
|
||||||
|
{
|
||||||
|
OSG_WARN << "Trying to load qfont \"" << file << "\" from within a non qt application!" << std::endl;
|
||||||
|
return ReadResult::FILE_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!QFontDatabase::supportsThreadedFontRendering() && QApplication::instance()->thread() != QThread::currentThread())
|
||||||
|
{
|
||||||
|
OSG_WARN << "Trying to load qfont \"" << file << "\" from a non gui thread "
|
||||||
|
"within qt application without threaded font rendering!" << std::endl;
|
||||||
|
return ReadResult::FILE_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFont font;
|
||||||
|
if (!font.fromString(QString::fromStdString(osgDB::getNameLessExtension(file))))
|
||||||
|
return ReadResult::FILE_NOT_FOUND;
|
||||||
|
|
||||||
|
return new osgText::Font(new osgQt::QFontImplementation(font));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// now register with Registry to instantiate the above
|
||||||
|
// reader/writer.
|
||||||
|
REGISTER_OSGPLUGIN(qfont, ReaderQFont)
|
||||||
|
|
||||||
|
}
|
@ -267,6 +267,22 @@
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Dialog</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/Dialog.ui" line="14"/>
|
||||||
|
<source>Dialog</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>DialogTitleBar</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/DialogTitleBar.ui" line="14"/>
|
||||||
|
<source>DialogTitleBar</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>DockChildList</name>
|
<name>DockChildList</name>
|
||||||
<message>
|
<message>
|
||||||
@ -428,17 +444,17 @@
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/FrameTitleBar.cpp" line="114"/>
|
<location filename="../ui/FrameTitleBar.cpp" line="157"/>
|
||||||
<source>default</source>
|
<source>default</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/FrameTitleBar.cpp" line="114"/>
|
<location filename="../ui/FrameTitleBar.cpp" line="157"/>
|
||||||
<source>silver</source>
|
<source>silver</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/FrameTitleBar.cpp" line="114"/>
|
<location filename="../ui/FrameTitleBar.cpp" line="157"/>
|
||||||
<source>blue</source>
|
<source>blue</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@ -1727,52 +1743,52 @@
|
|||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="27"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="21"/>
|
||||||
<source>new workspace</source>
|
<source>new workspace</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="51"/>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="57"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="57"/>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="63"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="67"/>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="73"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="74"/>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="80"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="83"/>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="89"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="89"/>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="95"/>
|
|
||||||
<source>warning</source>
|
<source>warning</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="57"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="51"/>
|
||||||
<source>name or save path is empty, please check it</source>
|
<source>name or save path is empty, please check it</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="63"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="57"/>
|
||||||
<source>save current workspace?</source>
|
<source>save current workspace?</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="73"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="67"/>
|
||||||
<source>current path is contains current folder, do you want to overwrite it?</source>
|
<source>current path is contains current folder, do you want to overwrite it?</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="80"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="74"/>
|
||||||
<source>removeRecursively failed</source>
|
<source>removeRecursively failed</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="89"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="83"/>
|
||||||
<source>mkpath failed</source>
|
<source>mkpath failed</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="95"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="89"/>
|
||||||
<source>name is exits</source>
|
<source>name is exits</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="110"/>
|
<location filename="../ui/WorkSpace/WorkSpaceDlg.cpp" line="104"/>
|
||||||
<source>save spaceWork directory</source>
|
<source>save spaceWork directory</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -9,30 +9,35 @@
|
|||||||
|
|
||||||
Dialog::Dialog(QWidget* parent)
|
Dialog::Dialog(QWidget* parent)
|
||||||
: QDialog(parent)
|
: QDialog(parent)
|
||||||
, delegate_(FramelessDelegate::Create(this)) {
|
, ui_(new Ui::Dialog)
|
||||||
|
/*, delegate_(FramelessDelegate::Create(this)) */{
|
||||||
setWindowFlags(windowFlags() | Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
|
setWindowFlags(windowFlags() | Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
|
||||||
|
ui_->setupUi(this);
|
||||||
|
|
||||||
|
ui_->titleBar->SetMainWidget(this);
|
||||||
InitFrame();
|
InitFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Dialog::~Dialog() {
|
||||||
|
delete ui_;
|
||||||
|
//delete delegate_;
|
||||||
|
//delegate_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void Dialog::DeleteThisOnClose() {
|
void Dialog::DeleteThisOnClose() {
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Dialog::SetTitleBar(FrameTitleBar* titleBar) {
|
void Dialog::SetTitleBar(FrameTitleBar* titleBar) {
|
||||||
delegate_->SetTitleBar(titleBar);
|
/* delegate_->SetTitleBar(titleBar);
|
||||||
|
|
||||||
QVBoxLayout* layout = reinterpret_cast<QVBoxLayout*>(this->layout());
|
QVBoxLayout* layout = reinterpret_cast<QVBoxLayout*>(this->layout());
|
||||||
layout->insertWidget(0, titleBar, 0);
|
layout->insertWidget(0, titleBar, 0);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dialog::SetTitle(const QString& title) {
|
void Dialog::SetTitle(const QString& title) {
|
||||||
if (!delegate_) {
|
ui_->titleBar->SetTitle(title);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
delegate_->SetTitle(title);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dialog::hideEvent(QHideEvent*) {
|
void Dialog::hideEvent(QHideEvent*) {
|
||||||
@ -47,9 +52,10 @@ bool Dialog::nativeEvent(const QByteArray& eventType, void* message, long* resul
|
|||||||
#else
|
#else
|
||||||
bool Dialog::nativeEvent(const QByteArray& eventType, void* message, qintptr* result) {
|
bool Dialog::nativeEvent(const QByteArray& eventType, void* message, qintptr* result) {
|
||||||
#endif
|
#endif
|
||||||
if (!delegate_->nativeEvent(eventType, message, result)) {
|
return QDialog::nativeEvent(eventType, message, result);
|
||||||
|
/*if (!delegate_->nativeEvent(eventType, message, result)) {
|
||||||
return QDialog::nativeEvent(eventType, message, result);
|
return QDialog::nativeEvent(eventType, message, result);
|
||||||
}
|
}*/
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,6 +68,7 @@ void Dialog::paintEvent(QPaintEvent* event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Dialog::InitFrame() {
|
void Dialog::InitFrame() {
|
||||||
|
/* ui->
|
||||||
FrameTitleBar* titleBar = new FrameTitleBar(this);
|
FrameTitleBar* titleBar = new FrameTitleBar(this);
|
||||||
titleBar->SetMainWidget(this);
|
titleBar->SetMainWidget(this);
|
||||||
|
|
||||||
@ -77,5 +84,5 @@ void Dialog::InitFrame() {
|
|||||||
SetTitleBar(titleBar);
|
SetTitleBar(titleBar);
|
||||||
|
|
||||||
mainDilag_ = new QWidget(this);
|
mainDilag_ = new QWidget(this);
|
||||||
layout->addWidget(mainDilag_, 1);
|
layout->addWidget(mainDilag_, 1);*/
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
|
||||||
|
#include "ui_Dialog.h"
|
||||||
|
|
||||||
class FrameTitleBar;
|
class FrameTitleBar;
|
||||||
class FramelessDelegate;
|
class FramelessDelegate;
|
||||||
|
|
||||||
@ -10,7 +12,7 @@ class Dialog : public QDialog {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
Dialog(QWidget* parent);
|
Dialog(QWidget* parent);
|
||||||
~Dialog() override = default;
|
~Dialog() override;
|
||||||
|
|
||||||
void DeleteThisOnClose();
|
void DeleteThisOnClose();
|
||||||
void SetTitleBar(FrameTitleBar* titleBar);
|
void SetTitleBar(FrameTitleBar* titleBar);
|
||||||
@ -27,16 +29,18 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
void paintEvent(QPaintEvent* event) override;
|
void paintEvent(QPaintEvent* event) override;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
template<typename UI>
|
template<typename UI>
|
||||||
void SetupUI(UI* ui) {
|
void SetupUI(UI* ui) {
|
||||||
ui->setupUi(mainDilag_);
|
//ui->setupUi(mainDilag_);
|
||||||
|
ui->setupUi(ui_->mianWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void InitFrame();
|
void InitFrame();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Ui::Dialog* ui_;
|
||||||
FramelessDelegate* delegate_;
|
FramelessDelegate* delegate_;
|
||||||
QWidget* mainDilag_{ nullptr };
|
|
||||||
};
|
};
|
65
src/ui/Dialog.ui
Normal file
65
src/ui/Dialog.ui
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Dialog</class>
|
||||||
|
<widget class="QDialog" name="Dialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>654</width>
|
||||||
|
<height>509</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Dialog</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="DialogTitleBar" name="titleBar" native="true">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QWidget" name="mianWidget" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>DialogTitleBar</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>DialogTitleBar.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<resources>
|
||||||
|
<include location="../Hydro.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
74
src/ui/DialogTitleBar.cpp
Normal file
74
src/ui/DialogTitleBar.cpp
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#include "DialogTitleBar.h"
|
||||||
|
|
||||||
|
#include <QStyleOption>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
#include <QButtonGroup>
|
||||||
|
|
||||||
|
#include "common/RecourceHelper.h"
|
||||||
|
#include "ui/Dialog.h"
|
||||||
|
|
||||||
|
#include "ui_DialogTitleBar.h"
|
||||||
|
|
||||||
|
DialogTitleBar::DialogTitleBar(QWidget* parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
, ui(new Ui::DialogTitleBar) {
|
||||||
|
ui->setupUi(this);
|
||||||
|
connect(ui->sys_close, &QPushButton::clicked, this, &DialogTitleBar::closeDialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
DialogTitleBar::~DialogTitleBar() {
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
//QSize DockTitleBar::minimumSizeHint() const {
|
||||||
|
// QSize s = size();
|
||||||
|
// return s;
|
||||||
|
//}
|
||||||
|
|
||||||
|
void DialogTitleBar::SetTitle(const QString& title) {
|
||||||
|
ui->sys_title->setText(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogTitleBar::paintEvent(QPaintEvent* event) {
|
||||||
|
QStyleOption opt;
|
||||||
|
opt.initFrom(this);
|
||||||
|
|
||||||
|
QPainter p(this);
|
||||||
|
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogTitleBar::mouseReleaseEvent(QMouseEvent* event) {
|
||||||
|
if (pressed_) {
|
||||||
|
pressed_ = false;
|
||||||
|
point_ = event->pos();
|
||||||
|
}
|
||||||
|
QWidget::mouseReleaseEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogTitleBar::mousePressEvent(QMouseEvent* event) {
|
||||||
|
if (event->button() == Qt::LeftButton) {
|
||||||
|
pressed_ = true;
|
||||||
|
point_ = event->pos();
|
||||||
|
}
|
||||||
|
QWidget::mousePressEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogTitleBar::mouseMoveEvent(QMouseEvent* event) {
|
||||||
|
if (pressed_) {
|
||||||
|
QPoint movePoint = event->globalPos() - point_;
|
||||||
|
if (nullptr != mainDialog_) {
|
||||||
|
mainDialog_->move(movePoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QWidget::mouseMoveEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DialogTitleBar::closeDialog() {
|
||||||
|
if (nullptr != mainDialog_) {
|
||||||
|
mainDialog_->reject();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
36
src/ui/DialogTitleBar.h
Normal file
36
src/ui/DialogTitleBar.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class DialogTitleBar;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DialogTitleBar : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
DialogTitleBar(QWidget* parent = 0);
|
||||||
|
~DialogTitleBar() override;
|
||||||
|
|
||||||
|
//QSize minimumSizeHint() const override;
|
||||||
|
|
||||||
|
void SetMainWidget(class Dialog* dialog) { mainDialog_ = dialog; }
|
||||||
|
void SetTitle(const QString& title);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent(QPaintEvent* event) override;
|
||||||
|
void mouseReleaseEvent(QMouseEvent* event) override;
|
||||||
|
void mousePressEvent(QMouseEvent* event) override;
|
||||||
|
void mouseMoveEvent(QMouseEvent* event) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void closeDialog();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::DialogTitleBar* ui;
|
||||||
|
class Dialog* mainDialog_{ nullptr };
|
||||||
|
|
||||||
|
bool pressed_{ false };
|
||||||
|
QPoint point_;
|
||||||
|
};
|
71
src/ui/DialogTitleBar.ui
Normal file
71
src/ui/DialogTitleBar.ui
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>DialogTitleBar</class>
|
||||||
|
<widget class="QWidget" name="DialogTitleBar">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>451</width>
|
||||||
|
<height>42</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>DialogTitleBar</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="sys_title">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>612</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="sys_close">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>32</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources>
|
||||||
|
<include location="../Hydro.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -4,6 +4,7 @@
|
|||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QAction>
|
#include <QAction>
|
||||||
#include <QButtonGroup>
|
#include <QButtonGroup>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
|
||||||
#include <qDebug>
|
#include <qDebug>
|
||||||
|
|
||||||
@ -44,7 +45,10 @@ void FrameTitleBar::SetTitle(const QString& title) {
|
|||||||
|
|
||||||
void FrameTitleBar::SetMainWidget(QWidget* widget) {
|
void FrameTitleBar::SetMainWidget(QWidget* widget) {
|
||||||
mainWidget_ = widget;
|
mainWidget_ = widget;
|
||||||
|
if (nullptr == mainWidget_) {
|
||||||
|
qDebug() << __FUNCTION__ << "mainWidget is nullptr";
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void FrameTitleBar::OnMaximized(bool maximized) {
|
void FrameTitleBar::OnMaximized(bool maximized) {
|
||||||
ui->sys_restore->setVisible(maximized);
|
ui->sys_restore->setVisible(maximized);
|
||||||
@ -72,6 +76,28 @@ void FrameTitleBar::paintEvent(QPaintEvent* event) {
|
|||||||
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
|
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FrameTitleBar::mouseReleaseEvent(QMouseEvent* event) {
|
||||||
|
Q_UNUSED(event);
|
||||||
|
pressed_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FrameTitleBar::mousePressEvent(QMouseEvent* event) {
|
||||||
|
if (nullptr == mainWidget_ || mainWidget_->isMaximized()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->button() == Qt::LeftButton) {
|
||||||
|
pressed_ = true;
|
||||||
|
point_ = event->pos();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FrameTitleBar::mouseMoveEvent(QMouseEvent* event) {
|
||||||
|
if (pressed_ && nullptr != mainWidget_) {
|
||||||
|
mainWidget_->move(event->pos() - point_ + mainWidget_->pos());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void FrameTitleBar::OnMinBtnClicked() {
|
void FrameTitleBar::OnMinBtnClicked() {
|
||||||
if (nullptr == mainWidget_) {
|
if (nullptr == mainWidget_) {
|
||||||
qDebug() << __FUNCTION__ << "mainWidget is nullptr";
|
qDebug() << __FUNCTION__ << "mainWidget is nullptr";
|
||||||
@ -82,13 +108,20 @@ void FrameTitleBar::OnMinBtnClicked() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FrameTitleBar::OnMaxBtnClicked() {
|
void FrameTitleBar::OnMaxBtnClicked() {
|
||||||
|
|
||||||
if (nullptr == mainWidget_) {
|
if (nullptr == mainWidget_) {
|
||||||
qDebug() << __FUNCTION__ << "mainWidget is nullptr";
|
qDebug() << __FUNCTION__ << "mainWidget is nullptr";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mainWidget_->showMaximized();
|
if (mainWidget_->isMaximized()) {
|
||||||
|
mainWidget_->showNormal();
|
||||||
|
} else {
|
||||||
|
mainWidget_->showMaximized();
|
||||||
|
}
|
||||||
|
ui->sys_max->hide();
|
||||||
|
ui->sys_restore->show();
|
||||||
|
|
||||||
|
ui->sys_restore->setFocusPolicy(Qt::NoFocus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FrameTitleBar::OnRestorClicked() {
|
void FrameTitleBar::OnRestorClicked() {
|
||||||
@ -97,7 +130,17 @@ void FrameTitleBar::OnRestorClicked() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mainWidget_->showNormal();
|
if (!mainWidget_->isMaximized()) {
|
||||||
|
mainWidget_->showMaximized();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mainWidget_->showNormal();
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->sys_max->show();
|
||||||
|
ui->sys_restore->hide();
|
||||||
|
|
||||||
|
ui->sys_max->setFocusPolicy(Qt::NoFocus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FrameTitleBar::OnCloseBtnClicked() {
|
void FrameTitleBar::OnCloseBtnClicked() {
|
||||||
|
@ -41,6 +41,9 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void paintEvent(QPaintEvent* event) override;
|
void paintEvent(QPaintEvent* event) override;
|
||||||
|
void mouseReleaseEvent(QMouseEvent* event) override;
|
||||||
|
void mousePressEvent(QMouseEvent* event) override;
|
||||||
|
void mouseMoveEvent(QMouseEvent* event) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void OnMinBtnClicked();
|
void OnMinBtnClicked();
|
||||||
@ -55,4 +58,7 @@ private:
|
|||||||
class QBoxLayout* menuLayout_{ nullptr };
|
class QBoxLayout* menuLayout_{ nullptr };
|
||||||
class QButtonGroup* buttonCourp_{ nullptr };
|
class QButtonGroup* buttonCourp_{ nullptr };
|
||||||
unsigned int ftbButton_{ 0 };
|
unsigned int ftbButton_{ 0 };
|
||||||
|
|
||||||
|
bool pressed_{ false };
|
||||||
|
QPoint point_;
|
||||||
};
|
};
|
@ -32,7 +32,7 @@ bool FramelessDelegate::nativeEvent(const QByteArray & eventType, void* message,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FramelessDelegate::SetTitleBar(FrameTitleBar* titleBar) {
|
void FramelessDelegate::SetTitleBar(FrameTitleBar* titleBar) {
|
||||||
if (nullptr == titleBar || titleBar_ == titleBar) {
|
/* if (nullptr == titleBar || titleBar_ == titleBar) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (nullptr != titleBar_) {
|
if (nullptr != titleBar_) {
|
||||||
@ -43,7 +43,7 @@ void FramelessDelegate::SetTitleBar(FrameTitleBar* titleBar) {
|
|||||||
|
|
||||||
if (nullptr != titleBar_) {
|
if (nullptr != titleBar_) {
|
||||||
titleBar_->installEventFilter(this);
|
titleBar_->installEventFilter(this);
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramelessDelegate::SetTitle(const QString& title) {
|
void FramelessDelegate::SetTitle(const QString& title) {
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
FramelessWindow::FramelessWindow(QWidget* parent)
|
FramelessWindow::FramelessWindow(QWidget* parent)
|
||||||
: QFrame(parent)
|
: QFrame(parent)
|
||||||
, delegate_(FramelessDelegate::Create(this)) {
|
/* , delegate_(FramelessDelegate::Create(this))*/ {
|
||||||
//setWindowFlags(windowFlags() | Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
|
setWindowFlags(windowFlags() | Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -15,7 +15,8 @@ FramelessWindow::~FramelessWindow() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FramelessWindow::SetTitleBar(FrameTitleBar* titleBar) {
|
void FramelessWindow::SetTitleBar(FrameTitleBar* titleBar) {
|
||||||
delegate_->SetTitleBar(titleBar);
|
/*delegate_->SetTitleBar(titleBar);*/
|
||||||
|
titleBar->SetMainWidget(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||||
@ -23,8 +24,9 @@ bool FramelessWindow::nativeEvent(const QByteArray& eventType, void* message, qi
|
|||||||
#else
|
#else
|
||||||
bool FramelessWindow::nativeEvent(const QByteArray & eventType, void* message, long* result) {
|
bool FramelessWindow::nativeEvent(const QByteArray & eventType, void* message, long* result) {
|
||||||
#endif
|
#endif
|
||||||
if (!delegate_->nativeEvent(eventType, message, result)) {
|
/* if (!delegate_->nativeEvent(eventType, message, result)) {
|
||||||
return QFrame::nativeEvent(eventType, message, result);
|
return QFrame::nativeEvent(eventType, message, result);
|
||||||
}
|
}*/
|
||||||
|
return QFrame::nativeEvent(eventType, message, result);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -22,5 +22,5 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FramelessDelegate* delegate_;
|
FramelessDelegate* delegate_{ nullptr };
|
||||||
};
|
};
|
@ -38,7 +38,7 @@ MainWindow::MainWindow(QWidget* parent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow() {
|
MainWindow::~MainWindow() {
|
||||||
OsgViewer::Get().Uninitialize();
|
//OsgViewer::Get().Uninitialize();
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,8 +178,8 @@ void MainWindow::InitUI() {
|
|||||||
|
|
||||||
//ui->viewWidget->layout()->addWidget(qtOsgViewWidget_);
|
//ui->viewWidget->layout()->addWidget(qtOsgViewWidget_);
|
||||||
qtOsgViewWidget_->LoadDefaultScene();
|
qtOsgViewWidget_->LoadDefaultScene();
|
||||||
OsgViewer::Get().Initialize();
|
/*OsgViewer::Get().Initialize();
|
||||||
OsgViewer::Get().OnFrame();
|
OsgViewer::Get().OnFrame();*/
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
// MatlabObject* mtlb = new MatlabObject;
|
// MatlabObject* mtlb = new MatlabObject;
|
||||||
@ -205,8 +205,8 @@ void MainWindow::InitDockLayout() {
|
|||||||
tabWidget_->insertTab(i, mainWindow_, strTabName);
|
tabWidget_->insertTab(i, mainWindow_, strTabName);
|
||||||
if (listDocArea[0].toList().size() > 0) {
|
if (listDocArea[0].toList().size() > 0) {
|
||||||
mainWindow_->setCentralWidget(qtOsgViewWidget_);
|
mainWindow_->setCentralWidget(qtOsgViewWidget_);
|
||||||
OsgViewer::Get().Initialize();
|
//OsgViewer::Get().Initialize();
|
||||||
OsgViewer::Get().OnFrame();
|
//OsgViewer::Get().OnFrame();
|
||||||
} else {
|
} else {
|
||||||
mainWindow_->takeCentralWidget();
|
mainWindow_->takeCentralWidget();
|
||||||
}
|
}
|
||||||
|
@ -320,35 +320,35 @@ void ModelTreeWidget::OnAddSatelliteEntity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ModelTreeWidget::OnTrackEntity(Entity* entity) {
|
void ModelTreeWidget::OnTrackEntity(Entity* entity) {
|
||||||
OsgCameraManipulator* manipulator = OsgViewer::Get().GetView()->GetCameraManipulator();
|
//OsgCameraManipulator* manipulator = OsgViewer::Get().GetView()->GetCameraManipulator();
|
||||||
if (nullptr == manipulator) {
|
//if (nullptr == manipulator) {
|
||||||
LOG_WARN("manipulator is nullptr");
|
// LOG_WARN("manipulator is nullptr");
|
||||||
return;
|
// return;
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
//
|
||||||
osgGA::CameraManipulator* gaManipulator = manipulator->GetManipulator();
|
//osgGA::CameraManipulator* gaManipulator = manipulator->GetManipulator();
|
||||||
osgEarth::Util::EarthManipulator* ccm = dynamic_cast<osgEarth::Util::EarthManipulator*>(gaManipulator);
|
//osgEarth::Util::EarthManipulator* ccm = dynamic_cast<osgEarth::Util::EarthManipulator*>(gaManipulator);
|
||||||
if (nullptr != ccm) {
|
//if (nullptr != ccm) {
|
||||||
if (nullptr != entity) {
|
// if (nullptr != entity) {
|
||||||
osg::MatrixTransform* mt = entity->GetRootComponent()->GetMatrixTransform();
|
// osg::MatrixTransform* mt = entity->GetRootComponent()->GetMatrixTransform();
|
||||||
ccm->setNode(mt);
|
// ccm->setNode(mt);
|
||||||
ccm->getSettings()->setTetherMode(osgEarth::Util::EarthManipulator::TETHER_CENTER);
|
// ccm->getSettings()->setTetherMode(osgEarth::Util::EarthManipulator::TETHER_CENTER);
|
||||||
osgEarth::Util::Viewpoint newVP;
|
// osgEarth::Util::Viewpoint newVP;
|
||||||
newVP.setNode(mt);
|
// newVP.setNode(mt);
|
||||||
double range = mt->getBound().radius() * 10.0;
|
// double range = mt->getBound().radius() * 10.0;
|
||||||
newVP.range()->set(range, osgEarth::Units::METERS);
|
// newVP.range()->set(range, osgEarth::Units::METERS);
|
||||||
|
|
||||||
const osg::Vec3 rotation = entity->GetRootComponent()->GetTransform()->GetRotation();
|
// const osg::Vec3 rotation = entity->GetRootComponent()->GetTransform()->GetRotation();
|
||||||
newVP.heading()->set(rotation.x(), osgEarth::Units::DEGREES);
|
// newVP.heading()->set(rotation.x(), osgEarth::Units::DEGREES);
|
||||||
newVP.pitch()->set(rotation.y() - 15.0, osgEarth::Units::DEGREES);
|
// newVP.pitch()->set(rotation.y() - 15.0, osgEarth::Units::DEGREES);
|
||||||
//newVP.roll()->set(rotation.z(), osgEarth::Units::DEGREES);
|
// //newVP.roll()->set(rotation.z(), osgEarth::Units::DEGREES);
|
||||||
ccm->setViewpoint(newVP, 1.5);
|
// ccm->setViewpoint(newVP, 1.5);
|
||||||
//ccm->setTetherMode(osgGA::CameraManipulator::TETHER_CENTER_AND_ROTATION);
|
// //ccm->setTetherMode(osgGA::CameraManipulator::TETHER_CENTER_AND_ROTATION);
|
||||||
} else {
|
// } else {
|
||||||
ccm->clearViewpoint();
|
// ccm->clearViewpoint();
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelTreeWidget::AddEntity(class QTreeWidgetItem* parent, Entity* entity) {
|
void ModelTreeWidget::AddEntity(class QTreeWidgetItem* parent, Entity* entity) {
|
||||||
|
@ -15,12 +15,6 @@
|
|||||||
WorkSpaceDlg::WorkSpaceDlg(QWidget* parent)
|
WorkSpaceDlg::WorkSpaceDlg(QWidget* parent)
|
||||||
: Dialog(parent)
|
: Dialog(parent)
|
||||||
, ui(new Ui::WorkSpaceDlg) {
|
, ui(new Ui::WorkSpaceDlg) {
|
||||||
/* setWindowFlags(windowFlags() | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint);
|
|
||||||
setAttribute(Qt::WA_TranslucentBackground);*/
|
|
||||||
|
|
||||||
|
|
||||||
//QWidget* mainDilag_ = new QWidget(this);
|
|
||||||
//layout->addWidget(mainDilag_, 1);
|
|
||||||
SetupUI(ui);
|
SetupUI(ui);
|
||||||
InitConnect();
|
InitConnect();
|
||||||
|
|
||||||
@ -116,23 +110,23 @@ void WorkSpaceDlg::OnSelectSavePath() {
|
|||||||
ui->lePath->setText(QString("%1/%2").arg(path_).arg(ui->leName->text()));
|
ui->lePath->setText(QString("%1/%2").arg(path_).arg(ui->leName->text()));
|
||||||
LOG_INFO("save path: {}", path_.toLocal8Bit().constData());
|
LOG_INFO("save path: {}", path_.toLocal8Bit().constData());
|
||||||
}
|
}
|
||||||
|
//
|
||||||
void WorkSpaceDlg::InitFrame() {
|
//void WorkSpaceDlg::InitFrame() {
|
||||||
FrameTitleBar* titleBar = new FrameTitleBar(this);
|
// FrameTitleBar* titleBar = new FrameTitleBar(this);
|
||||||
titleBar->SetMainWidget(this);
|
// titleBar->SetMainWidget(this);
|
||||||
|
//
|
||||||
titleBar->SetSysButton(FrameTitleBar::FTB_ICON | FrameTitleBar::FTB_CLOSE);
|
// titleBar->SetSysButton(FrameTitleBar::FTB_ICON | FrameTitleBar::FTB_CLOSE);
|
||||||
|
//
|
||||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
// QVBoxLayout* layout = new QVBoxLayout(this);
|
||||||
layout->setContentsMargins(0, 0, 0, 0);
|
// layout->setContentsMargins(0, 0, 0, 0);
|
||||||
layout->setSpacing(0);
|
// layout->setSpacing(0);
|
||||||
|
//
|
||||||
layout->setStretch(0, 0);
|
// layout->setStretch(0, 0);
|
||||||
layout->setStretch(1, 1);
|
// layout->setStretch(1, 1);
|
||||||
layout->setAlignment(Qt::AlignLeft | Qt::AlignTop);
|
// layout->setAlignment(Qt::AlignLeft | Qt::AlignTop);
|
||||||
SetTitleBar(titleBar);
|
// SetTitleBar(titleBar);
|
||||||
|
//
|
||||||
QWidget* mainDilag_ = new QWidget(this);
|
// QWidget* mainDilag_ = new QWidget(this);
|
||||||
layout->addWidget(mainDilag_, 1);
|
// layout->addWidget(mainDilag_, 1);
|
||||||
ui->setupUi(mainDilag_);
|
// ui->setupUi(mainDilag_);
|
||||||
}
|
//}
|
||||||
|
@ -19,7 +19,7 @@ protected:
|
|||||||
void OnSure();
|
void OnSure();
|
||||||
void OnSelectSavePath();
|
void OnSelectSavePath();
|
||||||
|
|
||||||
void InitFrame();
|
//void InitFrame();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::WorkSpaceDlg* ui;
|
Ui::WorkSpaceDlg* ui;
|
||||||
|
@ -10,130 +10,130 @@
|
|||||||
#include "viewer/OsgView.h"
|
#include "viewer/OsgView.h"
|
||||||
#include "viewer/IUpdateRender.h"
|
#include "viewer/IUpdateRender.h"
|
||||||
#include "workspace/WorkSpaceManager.h"
|
#include "workspace/WorkSpaceManager.h"
|
||||||
|
//
|
||||||
template<> OsgViewer* Singleton<OsgViewer>::instance_ = nullptr;
|
//template<> OsgViewer* Singleton<OsgViewer>::instance_ = nullptr;
|
||||||
|
//
|
||||||
constexpr QEvent::Type sOsgViewUpdateEvent{ QEvent::Type(QEvent::User + 1) };
|
//constexpr QEvent::Type sOsgViewUpdateEvent{ QEvent::Type(QEvent::User + 1) };
|
||||||
|
//
|
||||||
OsgViewer::OsgViewer(QObject* parent) noexcept
|
//OsgViewer::OsgViewer(QObject* parent) noexcept
|
||||||
: QObject(parent) {
|
// : QObject(parent) {
|
||||||
LOG_INFO("actor, self={}", fmt::ptr(this));
|
// LOG_INFO("actor, self={}", fmt::ptr(this));
|
||||||
|
//
|
||||||
//compositeViewer_->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false);
|
// //compositeViewer_->getDatabasePager()->setUnrefImageDataAfterApplyPolicy(true, false);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
OsgViewer::~OsgViewer() {
|
//OsgViewer::~OsgViewer() {
|
||||||
compositeViewer_ = nullptr;
|
// compositeViewer_ = nullptr;
|
||||||
LOG_INFO("dctor, self={}", fmt::ptr(this));
|
// LOG_INFO("dctor, self={}", fmt::ptr(this));
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void OsgViewer::OnDestory() {
|
//void OsgViewer::OnDestory() {
|
||||||
|
//
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void OsgViewer::OnFrame(void) {
|
//void OsgViewer::OnFrame(void) {
|
||||||
assert(nullptr != compositeViewer_);
|
// assert(nullptr != compositeViewer_);
|
||||||
|
//
|
||||||
WorkSpaceManager::Get().OnFrame();
|
// WorkSpaceManager::Get().OnFrame();
|
||||||
|
//
|
||||||
if (IsDone()) {
|
// if (IsDone()) {
|
||||||
RenderUpdate();
|
// RenderUpdate();
|
||||||
|
//
|
||||||
compositeViewer_->frame();
|
// compositeViewer_->frame();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
qApp->postEvent(this, new QEvent(sOsgViewUpdateEvent));
|
// qApp->postEvent(this, new QEvent(sOsgViewUpdateEvent));
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
bool OsgViewer::IsDone() const {
|
//bool OsgViewer::IsDone() const {
|
||||||
assert(nullptr != compositeViewer_);
|
// assert(nullptr != compositeViewer_);
|
||||||
bool done = compositeViewer_->done();
|
// bool done = compositeViewer_->done();
|
||||||
return !done && initalized_;
|
// return !done && initalized_;
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
OsgView* OsgViewer::GetView() const {
|
//OsgView* OsgViewer::GetView() const {
|
||||||
if (osgViews_.empty()) {
|
// if (osgViews_.empty()) {
|
||||||
return nullptr;
|
// return nullptr;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
return *(osgViews_.begin());
|
// return *(osgViews_.begin());
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
bool OsgViewer::Initialize(void) {
|
//bool OsgViewer::Initialize(void) {
|
||||||
if (initalized_) {
|
// if (initalized_) {
|
||||||
return initalized_;
|
// return initalized_;
|
||||||
}
|
// }
|
||||||
initalized_ = true;
|
// initalized_ = true;
|
||||||
return initalized_;
|
// return initalized_;
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void OsgViewer::Uninitialize(void) {
|
//void OsgViewer::Uninitialize(void) {
|
||||||
initalized_ = false;
|
// initalized_ = false;
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void OsgViewer::RegistRender(IUpdateRender* render) {
|
//void OsgViewer::RegistRender(IUpdateRender* render) {
|
||||||
if (nullptr == render) {
|
// if (nullptr == render) {
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
auto itor = std::find_if(updateRenderList_.begin(), updateRenderList_.end(), [render](auto& item) {
|
// auto itor = std::find_if(updateRenderList_.begin(), updateRenderList_.end(), [render](auto& item) {
|
||||||
return render == item;
|
// return render == item;
|
||||||
}
|
// }
|
||||||
);
|
// );
|
||||||
|
//
|
||||||
if (itor != updateRenderList_.end()) {
|
// if (itor != updateRenderList_.end()) {
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
updateRenderList_.push_back(render);
|
// updateRenderList_.push_back(render);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void OsgViewer::UnRegistRender(IUpdateRender* render) {
|
//void OsgViewer::UnRegistRender(IUpdateRender* render) {
|
||||||
if (nullptr == render) {
|
// if (nullptr == render) {
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
auto itor = std::find_if(updateRenderList_.begin(), updateRenderList_.end(), [render](auto& item) {
|
// auto itor = std::find_if(updateRenderList_.begin(), updateRenderList_.end(), [render](auto& item) {
|
||||||
return render == item;
|
// return render == item;
|
||||||
}
|
// }
|
||||||
);
|
// );
|
||||||
if (itor != updateRenderList_.end()) {
|
// if (itor != updateRenderList_.end()) {
|
||||||
updateRenderList_.erase(itor);
|
// updateRenderList_.erase(itor);
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void OsgViewer::customEvent(QEvent* event) {
|
//void OsgViewer::customEvent(QEvent* event) {
|
||||||
if (sOsgViewUpdateEvent == event->type()) {
|
// if (sOsgViewUpdateEvent == event->type()) {
|
||||||
OnFrame();
|
// OnFrame();
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void OsgViewer::OnStartPlay() {
|
//void OsgViewer::OnStartPlay() {
|
||||||
compositeViewer_->setStartTick(0);
|
// compositeViewer_->setStartTick(0);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void OsgViewer::OnAddView(OsgView* osgView, int x, int y, int width, int height) {
|
//void OsgViewer::OnAddView(OsgView* osgView, int x, int y, int width, int height) {
|
||||||
osgViewer::View* view = new osgViewer::View;
|
// osgViewer::View* view = new osgViewer::View;
|
||||||
osgView->InitView(view);
|
// osgView->InitView(view);
|
||||||
|
//
|
||||||
compositeViewer_->addView(view);
|
// compositeViewer_->addView(view);
|
||||||
osgViews_.insert(osgView);
|
// osgViews_.insert(osgView);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void OsgViewer::OnRemoveView(OsgView* osgView) {
|
//void OsgViewer::OnRemoveView(OsgView* osgView) {
|
||||||
if (nullptr == osgView || nullptr == osgView->GetView()) {
|
// if (nullptr == osgView || nullptr == osgView->GetView()) {
|
||||||
LOG_WARN("osgview is nullptr or getview is nullptr");
|
// LOG_WARN("osgview is nullptr or getview is nullptr");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
osgViews_.erase(osgView);
|
// osgViews_.erase(osgView);
|
||||||
compositeViewer_->removeView(osgView->GetView());
|
// compositeViewer_->removeView(osgView->GetView());
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void OsgViewer::RenderUpdate() {
|
//void OsgViewer::RenderUpdate() {
|
||||||
osg::FrameStamp* frameStamp = compositeViewer_->getFrameStamp();
|
// osg::FrameStamp* frameStamp = compositeViewer_->getFrameStamp();
|
||||||
double dt = frameStamp->getSimulationTime();
|
// double dt = frameStamp->getSimulationTime();
|
||||||
for (auto render : updateRenderList_) {
|
// for (auto render : updateRenderList_) {
|
||||||
render->Render(dt);
|
// render->Render(dt);
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
@ -11,47 +11,47 @@
|
|||||||
|
|
||||||
class OsgView;
|
class OsgView;
|
||||||
class IUpdateRender;
|
class IUpdateRender;
|
||||||
|
//
|
||||||
class OsgViewer : public QObject, public Singleton<OsgViewer> {
|
//class OsgViewer : public QObject, public Singleton<OsgViewer> {
|
||||||
Q_OBJECT
|
// Q_OBJECT
|
||||||
|
//
|
||||||
public:
|
//public:
|
||||||
explicit OsgViewer(QObject* parent = nullptr) noexcept;
|
// explicit OsgViewer(QObject* parent = nullptr) noexcept;
|
||||||
~OsgViewer() override;
|
// ~OsgViewer() override;
|
||||||
|
//
|
||||||
void SetViewer(osgViewer::CompositeViewer* viewer) {
|
// void SetViewer(osgViewer::CompositeViewer* viewer) {
|
||||||
compositeViewer_ = viewer;
|
// compositeViewer_ = viewer;
|
||||||
}
|
// }
|
||||||
void OnDestory();
|
// void OnDestory();
|
||||||
|
//
|
||||||
void OnFrame(void);
|
// void OnFrame(void);
|
||||||
|
//
|
||||||
bool IsDone(void) const;
|
// bool IsDone(void) const;
|
||||||
|
//
|
||||||
OsgView* GetView() const;
|
// OsgView* GetView() const;
|
||||||
|
//
|
||||||
bool Initialize(void);
|
// bool Initialize(void);
|
||||||
void Uninitialize(void);
|
// void Uninitialize(void);
|
||||||
|
//
|
||||||
void RegistRender(IUpdateRender* render);
|
// void RegistRender(IUpdateRender* render);
|
||||||
void UnRegistRender(IUpdateRender* render);
|
// void UnRegistRender(IUpdateRender* render);
|
||||||
|
//
|
||||||
protected:
|
//protected:
|
||||||
void customEvent(QEvent* event) override;
|
// void customEvent(QEvent* event) override;
|
||||||
|
//
|
||||||
void OnStartPlay();
|
// void OnStartPlay();
|
||||||
|
//
|
||||||
void OnAddView(OsgView* view, int x, int y, int width, int height);
|
// void OnAddView(OsgView* view, int x, int y, int width, int height);
|
||||||
void OnRemoveView(OsgView* view);
|
// void OnRemoveView(OsgView* view);
|
||||||
void RenderUpdate();
|
// void RenderUpdate();
|
||||||
|
//
|
||||||
private:
|
//private:
|
||||||
osgViewer::CompositeViewer* compositeViewer_;
|
// osgViewer::CompositeViewer* compositeViewer_;
|
||||||
bool initalized_{ false };
|
// bool initalized_{ false };
|
||||||
|
//
|
||||||
using OsgViewSet = std::set<OsgView*>;
|
// using OsgViewSet = std::set<OsgView*>;
|
||||||
OsgViewSet osgViews_;
|
// OsgViewSet osgViews_;
|
||||||
|
//
|
||||||
using UpdateRenderList = std::vector<IUpdateRender*>;
|
// using UpdateRenderList = std::vector<IUpdateRender*>;
|
||||||
UpdateRenderList updateRenderList_;
|
// UpdateRenderList updateRenderList_;
|
||||||
};
|
//};
|
||||||
|
@ -33,11 +33,11 @@ static void ConfigureView( osgViewer::View* view ) {
|
|||||||
OsgWidget::OsgWidget(QWidget* parent, Qt::WindowFlags f)
|
OsgWidget::OsgWidget(QWidget* parent, Qt::WindowFlags f)
|
||||||
: QWidget(parent, f)
|
: QWidget(parent, f)
|
||||||
{
|
{
|
||||||
// // setAttribute(Qt::WA_PaintOnScreen, true);
|
// setAttribute(Qt::WA_PaintOnScreen, true);
|
||||||
// // setAttribute(Qt::WA_StaticContents, true);
|
// setAttribute(Qt::WA_StaticContents, true);
|
||||||
// // setAttribute(Qt::WA_NoSystemBackground, true);
|
// setAttribute(Qt::WA_NoSystemBackground, true);
|
||||||
// setAttribute(Qt::WA_OpaquePaintEvent, true);
|
//setAttribute(Qt::WA_OpaquePaintEvent, true);
|
||||||
// // setAttribute(Qt::WA_DontCreateNativeAncestors, false);
|
// setAttribute(Qt::WA_DontCreateNativeAncestors, false);
|
||||||
|
|
||||||
setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
|
setThreadingModel(osgViewer::ViewerBase::SingleThreaded);
|
||||||
setMouseTracking(true);
|
setMouseTracking(true);
|
||||||
|
@ -85,19 +85,19 @@ void QtOsgViewWidget::Initialize(void) {
|
|||||||
if (nullptr == workspace) {
|
if (nullptr == workspace) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
OsgCameraManipulator* manipulator = OsgViewer::Get().GetView()->GetCameraManipulator();
|
//OsgCameraManipulator* manipulator = OsgViewer::Get().GetView()->GetCameraManipulator();
|
||||||
if (nullptr == manipulator) {
|
//if (nullptr == manipulator) {
|
||||||
LOG_WARN("manipulator is nullptr");
|
// LOG_WARN("manipulator is nullptr");
|
||||||
return;
|
// return;
|
||||||
}
|
//}
|
||||||
osgGA::CameraManipulator* gaManipulator = manipulator->GetManipulator();
|
//osgGA::CameraManipulator* gaManipulator = manipulator->GetManipulator();
|
||||||
osgEarth::Util::EarthManipulator* ccm = dynamic_cast<osgEarth::Util::EarthManipulator*>(gaManipulator);
|
//osgEarth::Util::EarthManipulator* ccm = dynamic_cast<osgEarth::Util::EarthManipulator*>(gaManipulator);
|
||||||
if (nullptr == ccm) {
|
//if (nullptr == ccm) {
|
||||||
LOG_WARN("ccm is nullptr");
|
// LOG_WARN("ccm is nullptr");
|
||||||
return;
|
// return;
|
||||||
}
|
//}
|
||||||
|
|
||||||
ccm->setViewpoint(workspace->GetHomeViewpoint(), 3.0);
|
//ccm->setViewpoint(workspace->GetHomeViewpoint(), 3.0);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include "viewer/OsgViewer.h"
|
#include "viewer/OsgViewer.h"
|
||||||
|
|
||||||
UpdateRenderStd::UpdateRenderStd() {
|
UpdateRenderStd::UpdateRenderStd() {
|
||||||
OsgViewer::Get().RegistRender(this);
|
//OsgViewer::Get().RegistRender(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateRenderStd::~UpdateRenderStd() {
|
UpdateRenderStd::~UpdateRenderStd() {
|
||||||
@ -11,5 +11,5 @@ UpdateRenderStd::~UpdateRenderStd() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void UpdateRenderStd::OnDestroy() {
|
void UpdateRenderStd::OnDestroy() {
|
||||||
OsgViewer::Get().UnRegistRender(this);
|
//OsgViewer::Get().UnRegistRender(this);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user