VR-Vantage 3.0 API Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
exampleCustomMenu

Table of Contents

Overview

This example shows how to build a custom Menu and menu items using the VR-Vantage application framework and existing parts and pieces.

Expected Result

exampleCustomMenu.png
Custom Menu Application Result

Example details

Say you want to use the existing VR-Vantage application but create your own menus, menu items and sub menu items. The example shows the simplest possible way to achieve this by registering custom menus with VR-Vantage. Once the menus are created, one can add their own logic to the GUI items.

The basic strategy here is let the DtVrvApplication do its thing, then just customize the way it looks. Let it load plug-ins, settings, data, etc. and then just what GUI elements are assembled right before the code that assembles the GUI executes. In this way, you get all the benefits of the plug-in architecture, but all the control of programatically created GUI.

The trick to doing that is to install an application transform, which is really just a function that gets called at a certain point. In this example we are going to install a function that gets called right after the plug-ins are loaded and before the GUI is assembled.

Here is the function we want to install. It's signature has to be the same as the DtVrvApplication::ApplicationTransform funtor:

void postPluginTransform(DtDeInitializer& initializer, DtDe& de, DtVrvApplicationConfiguration& appConfig)
{
// Register the Menu and Menu item so they can be added to the gui.
DtQtMenuAssembler::instance(de).registerMenu(new DtCustomMenu(de));
DtQtMenuAssembler::instance(de).registerMenu(new CustomMenuItem(de));
// Create menu configuration with our custom menu
DtMenuConfiguration myMenu;
myMenu.addMenuPath(DtMenuPath::mainMenu("DtCustomMenu"));
myMenu.addMenuPath(DtMenuPath::mainMenu("DtCustomMenu").item("CustomMenuItem"));
// Minimal UI - Just our custom menu (no pages or toolbars)
appConfig.setMasterModePageConfiguration(DtPageConfiguration());
appConfig.setMasterModeMenuConfiguration(myMenu);
appConfig.setMasterModeToolbarConfiguration(DtToolbarConfiguration());
appConfig.masterModeUIConfiguration().myShowStartupScreen = false;
}

We install the functor into the DtVrvApplication in main before the applications initialize method is called.

Building the Example

VR-Vantage includes pre-built versions of the example application. To build it yourself, follow the instructions at Building VR-Vantage Examples, Applications, and Plug-ins.

Running the Example

This example is a plug-in. You can run it by running vrvStealth.exe –plugin ../examples/plugins/release/exampleCustomMenu.dll (on Windows) or vrvStealth.exe –plugin ../examples/plugins/release/libexampleCustomMenu.so (on Linux) from the command prompt. Once the application is started, click on the "Customize" menu to see the popup. For more information about running examples, please see Running Applications and Examples.

Example Source Files


exampleCustomMenu.cxx

/******************************************************************************
** Copyright (c) 2019 MAK Technologies, Inc.
** All rights reserved.
******************************************************************************/
#include "CustomMenu.h"
#include <vrvCore/DtDe.h>
using namespace makVrv;
void postPluginTransform(DtDeInitializer& initializer, DtDe& de, DtVrvApplicationConfiguration& appConfig)
{
// Register the Menu and Menu item so they can be added to the gui.
// Create menu configuration with our custom menu
myMenu.addMenuPath(DtMenuPath::mainMenu("DtCustomMenu"));
myMenu.addMenuPath(DtMenuPath::mainMenu("DtCustomMenu").item("CustomMenuItem"));
// Minimal UI - Just our custom menu (no pages or toolbars)
appConfig.setMasterModeMenuConfiguration(myMenu);
}
void init(DtDe& de)
{
// Ensure that init only gets called once
// (not strictly necessary here, but this is good practice in general)
if (de.isInMasterMode())
{
// Add example menu
if (app)
{
DtVrvApplication::ApplicationTransform functor = boost::bind(&postPluginTransform, _1, _2, _3);
app->installPostPluginTransform(functor, "SetupGUIPostPluginTransform");
}
}
}
bool initDeModule(DtDe* de)
{
init(*de);
return true;
}

[<< Examples] [Home] [Top of Page]



Copyright © 2005-2022 MAK Technologies. All Rights Reserved (www.mak.com)