/** * @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 . */ #if !defined(INCLUDED_GENERICMAINMENU_H) #define INCLUDED_GENERICMAINMENU_H #include #include #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 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 class CommandCallbackMethod : public MemberCaller1 { public: /** * Constructor. * * @param object The object on which to invoke the callback method. */ CommandCallbackMethod(ObjectClass& object) : MemberCaller1(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& dialog); virtual void EndEntries(); //@} private: // private types /** * Type for a map between string and reference-counted dialog window. */ typedef std::map > 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 _dispatchMap; /** * Associations between command tokens and dialog windows. */ DialogMap _dialogMap; }; #endif // #if !defined(INCLUDED_GENERICMAINMENU_H)