156 lines
4.5 KiB
C++
156 lines
4.5 KiB
C++
/**
|
|
* @file GenericMainMenu.h
|
|
* Declares the GenericMainMenu class.
|
|
* @ingroup generic-ui
|
|
*/
|
|
|
|
/*
|
|
* Copyright 2012 Joel Baxter
|
|
*
|
|
* This file is part of MeshTex.
|
|
*
|
|
* MeshTex is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* MeshTex 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
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with MeshTex. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#if !defined(INCLUDED_GENERICMAINMENU_H)
|
|
#define INCLUDED_GENERICMAINMENU_H
|
|
|
|
#include <string>
|
|
#include <map>
|
|
|
|
#include "RefCounted.h"
|
|
#include "GenericDialog.h"
|
|
|
|
#include "generic/callback.h"
|
|
#include "generic/referencecounted.h"
|
|
|
|
/**
|
|
* String used in lists of command tokens or command labels to separate groups
|
|
* of commands.
|
|
*/
|
|
#define MENU_SEPARATOR "-"
|
|
|
|
/**
|
|
* Framework for a Radiant plugin's main menu. This object handles the menu
|
|
* logic: what commands exist and how to execute them. The actual menu
|
|
* display is handled by Radiant.
|
|
*
|
|
* A subclass should handle creating the command list.
|
|
*
|
|
* @ingroup generic-ui
|
|
*/
|
|
class GenericMainMenu : public RefCounted
|
|
{
|
|
protected: // protected methods
|
|
|
|
/// @name Lifecycle
|
|
//@{
|
|
GenericMainMenu();
|
|
virtual ~GenericMainMenu();
|
|
//@}
|
|
|
|
private: // private methods
|
|
|
|
/// @name Unimplemented to prevent copy/assignment
|
|
//@{
|
|
GenericMainMenu(const GenericMainMenu&);
|
|
const GenericMainMenu& operator=(const GenericMainMenu&);
|
|
//@}
|
|
|
|
public: // public methods
|
|
|
|
/// @name Service the plugin interface
|
|
//@{
|
|
virtual void Dispatch(const char *command);
|
|
virtual void CommandDialogShow(const std::string& commandString);
|
|
const std::string& GetCommandList() const;
|
|
const std::string& GetCommandLabelList() const;
|
|
//@}
|
|
|
|
protected: // protected types
|
|
/**
|
|
* Function signature for a menu command callback. The callback takes a
|
|
* string argument (the command token); it has no return value.
|
|
*/
|
|
typedef Callback1<const std::string&, void> CommandCallback;
|
|
|
|
/**
|
|
* An instance of this class can be used as a
|
|
* GenericMainMenu::CommandCallback, in situations where the callback is a
|
|
* method to be invoked on a target object. When invoking this constructor,
|
|
* the target object is the constructor argument, and the target object class
|
|
* and method are template parameters. The target object's method must have
|
|
* an appropriate signature for CommandCallback: one string argument, void
|
|
* return.
|
|
*/
|
|
template<typename ObjectClass, void (ObjectClass::*member)(const std::string&)>
|
|
class CommandCallbackMethod :
|
|
public MemberCaller1<ObjectClass, const std::string&, member>
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param object The object on which to invoke the callback method.
|
|
*/
|
|
CommandCallbackMethod(ObjectClass& object) :
|
|
MemberCaller1<ObjectClass, const std::string&, member>(object) {}
|
|
};
|
|
|
|
protected: // protected methods
|
|
|
|
/// @name Command list construction
|
|
//@{
|
|
virtual void BeginEntries();
|
|
virtual void AddSeparator();
|
|
virtual std::string AddEntry(const char *commandLabel,
|
|
const char *command,
|
|
const CommandCallback& commandCallback);
|
|
virtual void AddDialogShowEntry(const char *commandLabel,
|
|
const char *command,
|
|
const SmartPointer<GenericDialog>& dialog);
|
|
virtual void EndEntries();
|
|
//@}
|
|
|
|
private: // private types
|
|
|
|
/**
|
|
* Type for a map between string and reference-counted dialog window.
|
|
*/
|
|
typedef std::map<std::string, SmartPointer<GenericDialog> > DialogMap;
|
|
|
|
private: // private member vars
|
|
|
|
/**
|
|
* Semicolon-separated string of command tokens.
|
|
*/
|
|
std::string _menuCommands;
|
|
|
|
/**
|
|
* Semicolon-separated string of command labels.
|
|
*/
|
|
std::string _menuCommandLabels;
|
|
|
|
/**
|
|
* Associations between command tokens and callbacks.
|
|
*/
|
|
std::map<std::string, CommandCallback> _dispatchMap;
|
|
|
|
/**
|
|
* Associations between command tokens and dialog windows.
|
|
*/
|
|
DialogMap _dialogMap;
|
|
};
|
|
|
|
#endif // #if !defined(INCLUDED_GENERICMAINMENU_H)
|