ParallelPlane::ParallelPlane(osg::Geode *geode,osg::MatrixTransform *transform,Database *db): geode_(geode), db_(db), transform_(transform), filter_radius_(-1.0f), filter_width_(-1.0f), filter_height_(-1.0f), filter_angle_(0.0f), filter_position_(osg::Vec3f(0,0,0)), is_filtered_(false) { QSettings settings("massheatmap.ini",QSettings::IniFormat); QString imageFileName = settings.value("gradient_image","gradient3.bmp").toString(); QString colorImageFileName = settings.value("color_image","gradient2.bmp").toString(); image_ = osgDB::readImageFile(imageFileName.toStdString()); image_color_ = osgDB::readImageFile(colorImageFileName.toStdString()); osg::ref_ptr<osg::Drawable> drawable = myCreateTexturedQuadGeometry(osg::Vec3(0,0,0),1,1,image_,false,true,false); osgText::Font* font = osgText::readFontFile("./fonts/arial_bold.ttf"); osg::Vec4 layoutColor(0.0f,0.0f,0.0f,1.0f); float layoutCharacterSize = 0.05f; { text_ = new osgText::Text; text_->setFont(font); text_->setColor(layoutColor); text_->setCharacterSize(layoutCharacterSize); text_->setPosition(osg::Vec3(0.02,0.1,0.01f)); // right to left layouts would be used for hebrew or arabic fonts. text_->setLayout(osgText::Text::LEFT_TO_RIGHT); text_->setFontResolution(20,20); geode_->addDrawable(text_); } geode_->addDrawable(drawable); }
PropertyEditor::PropertyEditor(QDesignerFormEditorInterface *core, QWidget *parent, Qt::WindowFlags flags) : QDesignerPropertyEditor(parent, flags), m_core(core), m_propertySheet(0), m_currentBrowser(0), m_treeBrowser(0), m_propertyManager(new DesignerPropertyManager(m_core, this)), m_dynamicGroup(0), m_updatingBrowser(false), m_stackedWidget(new QStackedWidget), m_filterWidget(new FilterWidget(0, FilterWidget::LayoutAlignNone)), m_buttonIndex(-1), m_treeIndex(-1), m_addDynamicAction(new QAction(createIconSet(QLatin1String("plus.png")), tr("Add Dynamic Property..."), this)), m_removeDynamicAction(new QAction(createIconSet(QLatin1String("minus.png")), tr("Remove Dynamic Property"), this)), m_sortingAction(new QAction(createIconSet(QLatin1String("sort.png")), tr("Sorting"), this)), m_coloringAction(new QAction(createIconSet(QLatin1String("color.png")), tr("Color Groups"), this)), m_treeAction(new QAction(tr("Tree View"), this)), m_buttonAction(new QAction(tr("Drop Down Button View"), this)), m_classLabel(new QLabel), m_sorting(false), m_coloring(false), m_brightness(false) { QVector<QColor> colors; colors.reserve(6); colors.push_back(QColor(255, 230, 191)); colors.push_back(QColor(255, 255, 191)); colors.push_back(QColor(191, 255, 191)); colors.push_back(QColor(199, 255, 255)); colors.push_back(QColor(234, 191, 255)); colors.push_back(QColor(255, 191, 239)); m_colors.reserve(colors.count()); for (int i = 0; i < colors.count(); i++) { QColor c = colors.at(i); m_colors.push_back(qMakePair(c, c.darker(150))); } QColor dynamicColor(191, 207, 255); QColor layoutColor(255, 191, 191); m_dynamicColor = qMakePair(dynamicColor, dynamicColor.darker(150)); m_layoutColor = qMakePair(layoutColor, layoutColor.darker(150)); updateForegroundBrightness(); QActionGroup *actionGroup = new QActionGroup(this); m_treeAction->setCheckable(true); m_treeAction->setIcon(createIconSet(QLatin1String("widgets/listview.png"))); m_buttonAction->setCheckable(true); m_buttonAction->setIcon(createIconSet(QLatin1String("dropdownbutton.png"))); actionGroup->addAction(m_treeAction); actionGroup->addAction(m_buttonAction); connect(actionGroup, SIGNAL(triggered(QAction*)), this, SLOT(slotViewTriggered(QAction*))); QWidget *classWidget = new QWidget; QHBoxLayout *l = new QHBoxLayout(classWidget); l->setContentsMargins(5, 0, 5, 0); l->addWidget(m_classLabel); // Add actions QActionGroup *addDynamicActionGroup = new QActionGroup(this); connect(addDynamicActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(slotAddDynamicProperty(QAction*))); QMenu *addDynamicActionMenu = new QMenu(this); m_addDynamicAction->setMenu(addDynamicActionMenu); m_addDynamicAction->setEnabled(false); QAction *addDynamicAction = addDynamicActionGroup->addAction(tr("String...")); addDynamicAction->setData(static_cast<int>(QVariant::String)); addDynamicActionMenu->addAction(addDynamicAction); addDynamicAction = addDynamicActionGroup->addAction(tr("Bool...")); addDynamicAction->setData(static_cast<int>(QVariant::Bool)); addDynamicActionMenu->addAction(addDynamicAction); addDynamicActionMenu->addSeparator(); addDynamicAction = addDynamicActionGroup->addAction(tr("Other...")); addDynamicAction->setData(static_cast<int>(QVariant::Invalid)); addDynamicActionMenu->addAction(addDynamicAction); // remove m_removeDynamicAction->setEnabled(false); connect(m_removeDynamicAction, SIGNAL(triggered()), this, SLOT(slotRemoveDynamicProperty())); // Configure QAction *configureAction = new QAction(tr("Configure Property Editor"), this); configureAction->setIcon(createIconSet(QLatin1String("configure.png"))); QMenu *configureMenu = new QMenu(this); configureAction->setMenu(configureMenu); m_sortingAction->setCheckable(true); connect(m_sortingAction, SIGNAL(toggled(bool)), this, SLOT(slotSorting(bool))); m_coloringAction->setCheckable(true); connect(m_coloringAction, SIGNAL(toggled(bool)), this, SLOT(slotColoring(bool))); configureMenu->addAction(m_sortingAction); configureMenu->addAction(m_coloringAction); #if QT_VERSION >= 0x040600 configureMenu->addSeparator(); configureMenu->addAction(m_treeAction); configureMenu->addAction(m_buttonAction); #endif // Assemble toolbar QToolBar *toolBar = new QToolBar; toolBar->addWidget(classWidget); toolBar->addWidget(m_filterWidget); toolBar->addWidget(createDropDownButton(m_addDynamicAction)); toolBar->addAction(m_removeDynamicAction); toolBar->addWidget(createDropDownButton(configureAction)); // Views QScrollArea *buttonScroll = new QScrollArea(m_stackedWidget); m_buttonBrowser = new QtButtonPropertyBrowser(buttonScroll); buttonScroll->setWidgetResizable(true); buttonScroll->setWidget(m_buttonBrowser); m_buttonIndex = m_stackedWidget->addWidget(buttonScroll); connect(m_buttonBrowser, SIGNAL(currentItemChanged(QtBrowserItem*)), this, SLOT(slotCurrentItemChanged(QtBrowserItem*))); m_treeBrowser = new QtTreePropertyBrowser(m_stackedWidget); m_treeBrowser->setRootIsDecorated(false); m_treeBrowser->setPropertiesWithoutValueMarked(true); m_treeBrowser->setResizeMode(QtTreePropertyBrowser::Interactive); m_treeIndex = m_stackedWidget->addWidget(m_treeBrowser); connect(m_treeBrowser, SIGNAL(currentItemChanged(QtBrowserItem*)), this, SLOT(slotCurrentItemChanged(QtBrowserItem*))); connect(m_filterWidget, SIGNAL(filterChanged(QString)), this, SLOT(setFilter(QString))); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(toolBar); layout->addWidget(m_stackedWidget); layout->setMargin(0); layout->setSpacing(0); m_treeFactory = new DesignerEditorFactory(m_core, this); m_treeFactory->setSpacing(0); m_groupFactory = new DesignerEditorFactory(m_core, this); QtVariantPropertyManager *variantManager = m_propertyManager; m_buttonBrowser->setFactoryForManager(variantManager, m_groupFactory); m_treeBrowser->setFactoryForManager(variantManager, m_treeFactory); m_stackedWidget->setCurrentIndex(m_treeIndex); m_currentBrowser = m_treeBrowser; m_treeAction->setChecked(true); connect(m_groupFactory, SIGNAL(resetProperty(QtProperty*)), this, SLOT(slotResetProperty(QtProperty*))); connect(m_treeFactory, SIGNAL(resetProperty(QtProperty*)), this, SLOT(slotResetProperty(QtProperty*))); connect(variantManager, SIGNAL(valueChanged(QtProperty*,QVariant,bool)), this, SLOT(slotValueChanged(QtProperty*,QVariant,bool))); // retrieve initial settings QDesignerSettingsInterface *settings = m_core->settingsManager(); settings->beginGroup(QLatin1String(SettingsGroupC)); #if QT_VERSION >= 0x040500 const SettingsView view = settings->value(QLatin1String(ViewKeyC), TreeView).toInt() == TreeView ? TreeView : ButtonView; #endif // Coloring not available unless treeview and not sorted m_sorting = settings->value(QLatin1String(SortedKeyC), false).toBool(); m_coloring = settings->value(QLatin1String(ColorKeyC), true).toBool(); const QVariantMap expansionState = settings->value(QLatin1String(ExpansionKeyC), QVariantMap()).toMap(); settings->endGroup(); // Apply settings m_sortingAction->setChecked(m_sorting); m_coloringAction->setChecked(m_coloring); #if QT_VERSION >= 0x040500 switch (view) { case TreeView: m_currentBrowser = m_treeBrowser; m_stackedWidget->setCurrentIndex(m_treeIndex); m_treeAction->setChecked(true); break; case ButtonView: m_currentBrowser = m_buttonBrowser; m_stackedWidget->setCurrentIndex(m_buttonIndex); m_buttonAction->setChecked(true); break; } #endif // Restore expansionState from QVariant map if (!expansionState.empty()) { const QVariantMap::const_iterator cend = expansionState.constEnd(); for (QVariantMap::const_iterator it = expansionState.constBegin(); it != cend; ++it) m_expansionState.insert(it.key(), it.value().toBool()); } updateActionsState(); }
osg::Group* createHUDText() { osg::Group* rootNode = new osg::Group; osgText::Font* font = new osgText::Font(new osgQt::QFontImplementation(QFont("Arial"))); osg::Geode* geode = new osg::Geode; rootNode->addChild(geode); float windowHeight = 1024.0f; float windowWidth = 1280.0f; float margin = 50.0f; //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Examples of how to set up different text layout // osg::Vec4 layoutColor(1.0f,1.0f,0.0f,1.0f); float layoutCharacterSize = 20.0f; { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(layoutColor); text->setCharacterSize(layoutCharacterSize); text->setPosition(osg::Vec3(margin,windowHeight-margin,0.0f)); // the default layout is left to right, typically used in languages // originating from europe such as English, French, German, Spanish etc.. text->setLayout(osgText::Text::LEFT_TO_RIGHT); text->setText("text->setLayout(osgText::Text::LEFT_TO_RIGHT);"); geode->addDrawable(text); } { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(layoutColor); text->setCharacterSize(layoutCharacterSize); text->setPosition(osg::Vec3(windowWidth-margin,windowHeight-margin,0.0f)); // right to left layouts would be used for hebrew or arabic fonts. text->setLayout(osgText::Text::RIGHT_TO_LEFT); text->setAlignment(osgText::Text::RIGHT_BASE_LINE); text->setText("text->setLayout(osgText::Text::RIGHT_TO_LEFT);"); geode->addDrawable(text); } { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(layoutColor); text->setPosition(osg::Vec3(margin,windowHeight-margin,0.0f)); text->setCharacterSize(layoutCharacterSize); // vertical font layout would be used for asian fonts. text->setLayout(osgText::Text::VERTICAL); text->setText("text->setLayout(osgText::Text::VERTICAL);"); geode->addDrawable(text); } //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Examples of how to set up different font resolution // osg::Vec4 fontSizeColor(0.0f,1.0f,1.0f,1.0f); float fontSizeCharacterSize = 30; osg::Vec3 cursor = osg::Vec3(margin*2,windowHeight-margin*2,0.0f); { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(fontSizeColor); text->setCharacterSize(fontSizeCharacterSize); text->setPosition(cursor); // use text that uses 10 by 10 texels as a target resolution for fonts. text->setFontResolution(10,10); // blocky but small texture memory usage text->setText("text->setFontResolution(10,10); // blocky but small texture memory usage"); geode->addDrawable(text); } cursor.y() -= fontSizeCharacterSize; { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(fontSizeColor); text->setCharacterSize(fontSizeCharacterSize); text->setPosition(cursor); // use text that uses 20 by 20 texels as a target resolution for fonts. text->setFontResolution(20,20); // smoother but higher texture memory usage (but still quite low). text->setText("text->setFontResolution(20,20); // smoother but higher texture memory usage (but still quite low)."); geode->addDrawable(text); } cursor.y() -= fontSizeCharacterSize; { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(fontSizeColor); text->setCharacterSize(fontSizeCharacterSize); text->setPosition(cursor); // use text that uses 40 by 40 texels as a target resolution for fonts. text->setFontResolution(40,40); // even smoother but again higher texture memory usage. text->setText("text->setFontResolution(40,40); // even smoother but again higher texture memory usage."); geode->addDrawable(text); } //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Examples of how to set up different sized text // osg::Vec4 characterSizeColor(1.0f,0.0f,1.0f,1.0f); cursor.y() -= fontSizeCharacterSize*2.0f; { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(characterSizeColor); text->setFontResolution(20,20); text->setPosition(cursor); // use text that is 20 units high. text->setCharacterSize(20); // small text->setText("text->setCharacterSize(20.0f); // small"); geode->addDrawable(text); } cursor.y() -= 30.0f; { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(characterSizeColor); text->setFontResolution(30,30); text->setPosition(cursor); // use text that is 30 units high. text->setCharacterSize(30.0f); // medium text->setText("text->setCharacterSize(30.0f); // medium"); geode->addDrawable(text); } cursor.y() -= 50.0f; { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(characterSizeColor); text->setFontResolution(40,40); text->setPosition(cursor); // use text that is 60 units high. text->setCharacterSize(60.0f); // large text->setText("text->setCharacterSize(60.0f); // large"); geode->addDrawable(text); } //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Examples of how to set up different alignments // osg::Vec4 alignmentSizeColor(0.0f,1.0f,0.0f,1.0f); float alignmentCharacterSize = 25.0f; cursor.x() = 640; cursor.y() = margin*4.0f; typedef std::pair<osgText::Text::AlignmentType,std::string> AlignmentPair; typedef std::vector<AlignmentPair> AlignmentList; AlignmentList alignmentList; alignmentList.push_back(AlignmentPair(osgText::Text::LEFT_TOP,"text->setAlignment(\nosgText::Text::LEFT_TOP);")); alignmentList.push_back(AlignmentPair(osgText::Text::LEFT_CENTER,"text->setAlignment(\nosgText::Text::LEFT_CENTER);")); alignmentList.push_back(AlignmentPair(osgText::Text::LEFT_BOTTOM,"text->setAlignment(\nosgText::Text::LEFT_BOTTOM);")); alignmentList.push_back(AlignmentPair(osgText::Text::CENTER_TOP,"text->setAlignment(\nosgText::Text::CENTER_TOP);")); alignmentList.push_back(AlignmentPair(osgText::Text::CENTER_CENTER,"text->setAlignment(\nosgText::Text::CENTER_CENTER);")); alignmentList.push_back(AlignmentPair(osgText::Text::CENTER_BOTTOM,"text->setAlignment(\nosgText::Text::CENTER_BOTTOM);")); alignmentList.push_back(AlignmentPair(osgText::Text::RIGHT_TOP,"text->setAlignment(\nosgText::Text::RIGHT_TOP);")); alignmentList.push_back(AlignmentPair(osgText::Text::RIGHT_CENTER,"text->setAlignment(\nosgText::Text::RIGHT_CENTER);")); alignmentList.push_back(AlignmentPair(osgText::Text::RIGHT_BOTTOM,"text->setAlignment(\nosgText::Text::RIGHT_BOTTOM);")); alignmentList.push_back(AlignmentPair(osgText::Text::LEFT_BASE_LINE,"text->setAlignment(\nosgText::Text::LEFT_BASE_LINE);")); alignmentList.push_back(AlignmentPair(osgText::Text::CENTER_BASE_LINE,"text->setAlignment(\nosgText::Text::CENTER_BASE_LINE);")); alignmentList.push_back(AlignmentPair(osgText::Text::RIGHT_BASE_LINE,"text->setAlignment(\nosgText::Text::RIGHT_BASE_LINE);")); alignmentList.push_back(AlignmentPair(osgText::Text::LEFT_BOTTOM_BASE_LINE,"text->setAlignment(\nosgText::Text::LEFT_BOTTOM_BASE_LINE);")); alignmentList.push_back(AlignmentPair(osgText::Text::CENTER_BOTTOM_BASE_LINE,"text->setAlignment(\nosgText::Text::CENTER_BOTTOM_BASE_LINE);")); alignmentList.push_back(AlignmentPair(osgText::Text::RIGHT_BOTTOM_BASE_LINE,"text->setAlignment(\nosgText::Text::RIGHT_BOTTOM_BASE_LINE);")); osg::Sequence* sequence = new osg::Sequence; { for(AlignmentList::iterator itr=alignmentList.begin(); itr!=alignmentList.end(); ++itr) { osg::Geode* alignmentGeode = new osg::Geode; sequence->addChild(alignmentGeode); sequence->setTime(sequence->getNumChildren(), 1.0f); osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(alignmentSizeColor); text->setCharacterSize(alignmentCharacterSize); text->setPosition(cursor); text->setDrawMode(osgText::Text::TEXT|osgText::Text::ALIGNMENT|osgText::Text::BOUNDINGBOX); text->setAlignment(itr->first); text->setText(itr->second); alignmentGeode->addDrawable(text); } } sequence->setMode(osg::Sequence::START); sequence->setInterval(osg::Sequence::LOOP, 0, -1); sequence->setDuration(1.0f, -1); rootNode->addChild(sequence); //////////////////////////////////////////////////////////////////////////////////////////////////////// // // Examples of how to set up different fonts... // cursor.x() = margin*2.0f; cursor.y() = margin*2.0f; osg::Vec4 fontColor(1.0f,0.5f,0.0f,1.0f); float fontCharacterSize = 20.0f; float spacing = 40.0f; { osgText::Text* text = new osgText::Text; text->setColor(fontColor); text->setPosition(cursor); text->setCharacterSize(fontCharacterSize); text->setFont(0); text->setText("text->setFont(0); // inbuilt font."); geode->addDrawable(text); cursor.x() = text->getBoundingBox().xMax() + spacing ; } { osgText::Font* arial = new osgText::Font(new osgQt::QFontImplementation(QFont("Arial"))); osgText::Text* text = new osgText::Text; text->setColor(fontColor); text->setPosition(cursor); text->setCharacterSize(fontCharacterSize); text->setFont(arial); text->setText(arial!=0? "text->setFont(\"fonts/arial.ttf\");": "unable to load \"fonts/arial.ttf\""); geode->addDrawable(text); cursor.x() = text->getBoundingBox().xMax() + spacing ; } { osgText::Font* times = new osgText::Font(new osgQt::QFontImplementation(QFont("Times"))); osgText::Text* text = new osgText::Text; text->setColor(fontColor); text->setPosition(cursor); text->setCharacterSize(fontCharacterSize); geode->addDrawable(text); text->setFont(times); text->setText(times!=0? "text->setFont(\"fonts/times.ttf\");": "unable to load \"fonts/times.ttf\""); cursor.x() = text->getBoundingBox().xMax() + spacing ; } cursor.x() = margin*2.0f; cursor.y() = margin; { osgText::Font* dirtydoz = new osgText::Font(new osgQt::QFontImplementation(QFont("Times"))); osgText::Text* text = new osgText::Text; text->setColor(fontColor); text->setPosition(cursor); text->setCharacterSize(fontCharacterSize); text->setFont(dirtydoz); text->setText(dirtydoz!=0? "text->setFont(\"fonts/dirtydoz.ttf\");": "unable to load \"fonts/dirtydoz.ttf\""); geode->addDrawable(text); cursor.x() = text->getBoundingBox().xMax() + spacing ; } { osgText::Font* fudd = new osgText::Font(new osgQt::QFontImplementation(QFont("Times"))); osgText::Text* text = new osgText::Text; text->setColor(fontColor); text->setPosition(cursor); text->setCharacterSize(fontCharacterSize); text->setFont(fudd); text->setText(fudd!=0? "text->setFont(\"fonts/fudd.ttf\");": "unable to load \"fonts/fudd.ttf\""); geode->addDrawable(text); cursor.x() = text->getBoundingBox().xMax() + spacing ; } return rootNode; }