diff --git a/include/osgUI/Dialog b/include/osgUI/Dialog new file mode 100644 index 000000000..cfd5aab26 --- /dev/null +++ b/include/osgUI/Dialog @@ -0,0 +1,55 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2014 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 OSGUI_DIALOG +#define OSGUI_DIALOG + +#include +#include +#include + +namespace osgUI +{ + +class OSGUI_EXPORT Dialog : public osgUI::Widget +{ +public: + Dialog(); + Dialog(const Dialog& dialog, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY); + META_Node(osgUI, Dialog); + + void setTitle(const std::string& text) { _title = text; dirty(); } + std::string& getTitle() { return _title; } + const std::string& getTitle() const { return _title; } + + void close(); + void open(); + + bool handleImplementation(osgGA::EventVisitor* ev, osgGA::Event* event); + + virtual void createGraphicsImplementation(); + +protected: + virtual ~Dialog() {} + + std::string _title; + + osg::ref_ptr _transform; + + // implementation detail + osg::ref_ptr _titleDrawable; +}; + +} + +#endif diff --git a/src/osgUI/CMakeLists.txt b/src/osgUI/CMakeLists.txt index bbbc1e38c..84c77fcb5 100644 --- a/src/osgUI/CMakeLists.txt +++ b/src/osgUI/CMakeLists.txt @@ -12,6 +12,7 @@ SET(TARGET_H ${HEADER_PATH}/Widget ${HEADER_PATH}/Label ${HEADER_PATH}/LineEdit + ${HEADER_PATH}/Dialog ${HEADER_PATH}/PushButton ${HEADER_PATH}/ComboBox ${HEADER_PATH}/Style @@ -24,6 +25,7 @@ SET(TARGET_SRC Widget.cpp Label.cpp LineEdit.cpp + Dialog.cpp PushButton.cpp ComboBox.cpp Style.cpp diff --git a/src/osgUI/Dialog.cpp b/src/osgUI/Dialog.cpp new file mode 100644 index 000000000..b4d8daa84 --- /dev/null +++ b/src/osgUI/Dialog.cpp @@ -0,0 +1,104 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2014 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 +#include +#include +#include +#include + +using namespace osgUI; + +Dialog::Dialog() +{ +} + +Dialog::Dialog(const osgUI::Dialog& dialog, const osg::CopyOp& copyop): + Widget(dialog, copyop), + _title(dialog._title) +{ +} + +bool Dialog::handleImplementation(osgGA::EventVisitor* ev, osgGA::Event* event) +{ + OSG_NOTICE<<"Dialog::handleImplementation"<asGUIEventAdapter(); + if (!ea) return false; + + switch(ea->getEventType()) + { + case(osgGA::GUIEventAdapter::KEYDOWN): + OSG_NOTICE<<"Key pressed : "<getKey()<getKey()==osgGA::GUIEventAdapter::KEY_Escape) + { + close(); + dirty(); + return true; + } + + break; + default: + break; + } + + return false; +} + +void Dialog::close() +{ + if (_transform.valid()) _transform->setNodeMask(0x0); +} + +void Dialog::open() +{ + if (_transform.valid()) _transform->setNodeMask(0xffffffff); +} + +void Dialog::createGraphicsImplementation() +{ + + if (_titleDrawable.valid()) + { + OSG_NOTICE<<"Dialog::createGraphicsImplementation() updating existing TextDrawable"<setText(_title); + _graphicsInitialized = true; + } + else + { + OSG_NOTICE<<"Dialog::createGraphicsImplementation()"< node = style->createText(titleBarExents, getAlignmentSettings(), getTextSettings(), _title); + _titleDrawable = dynamic_cast(node.get()); + _titleDrawable->setDataVariance(osg::Object::DYNAMIC); + _transform->addChild(_titleDrawable.get()); + + osg::Vec4 dialogBackgroundColor(0.8,0.8,0.8,1.0); + osg::Vec4 dialogTitleBackgroundColor(0.5,0.5,1.0,1.0); + + _transform->addChild( style->createPanel(_extents, dialogBackgroundColor) ); + _transform->addChild( style->createPanel(titleBarExents, dialogTitleBackgroundColor) ); + } +} diff --git a/src/osgWrappers/serializers/osgUI/Dialog.cpp b/src/osgWrappers/serializers/osgUI/Dialog.cpp new file mode 100644 index 000000000..422042768 --- /dev/null +++ b/src/osgWrappers/serializers/osgUI/Dialog.cpp @@ -0,0 +1,14 @@ +#include +#include +#include +#include +#include + + +REGISTER_OBJECT_WRAPPER( Dialog, + new osgUI::Dialog, + osgUI::Dialog, + "osg::Object osg::Node osg::Group osgUI::Widget osgUI::Dialog" ) +{ + ADD_STRING_SERIALIZER( Title, std::string()); +}