Program Listing for File menu_handler.hpp

Return to documentation for file (/tmp/ws/src/interactive_markers/include/interactive_markers/menu_handler.hpp)

// Copyright (c) 2011, Willow Garage, Inc.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//    * Redistributions of source code must retain the above copyright
//      notice, this list of conditions and the following disclaimer.
//
//    * Redistributions in binary form must reproduce the above copyright
//      notice, this list of conditions and the following disclaimer in the
//      documentation and/or other materials provided with the distribution.
//
//    * Neither the name of the copyright holder nor the names of its
//      contributors may be used to endorse or promote products derived from
//      this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

// Author: David Gossow

#ifndef INTERACTIVE_MARKERS__MENU_HANDLER_HPP_
#define INTERACTIVE_MARKERS__MENU_HANDLER_HPP_

#include <functional>
#include <set>
#include <string>
#include <unordered_map>
#include <vector>

#include "visualization_msgs/msg/menu_entry.hpp"

#include "interactive_markers/interactive_marker_server.hpp"
#include "interactive_markers/visibility_control.hpp"

namespace interactive_markers
{

// Simple non-intrusive helper class which creates a menu and maps its
// entries to function callbacks
class MenuHandler
{
public:
  typedef uint32_t EntryHandle;

  typedef visualization_msgs::msg::InteractiveMarkerFeedback::ConstSharedPtr FeedbackConstPtr;
  typedef std::function<void (const FeedbackConstPtr &)> FeedbackCallback;

  enum CheckState
  {
    NO_CHECKBOX,
    CHECKED,
    UNCHECKED
  };

  INTERACTIVE_MARKERS_PUBLIC
  MenuHandler();

  INTERACTIVE_MARKERS_PUBLIC
  EntryHandle insert(const std::string & title, const FeedbackCallback & feedback_cb);

  INTERACTIVE_MARKERS_PUBLIC
  EntryHandle insert(
    const std::string & title,
    const uint8_t command_type = visualization_msgs::msg::MenuEntry::FEEDBACK,
    const std::string & command = "");

  INTERACTIVE_MARKERS_PUBLIC
  EntryHandle insert(
    EntryHandle parent, const std::string & title,
    const FeedbackCallback & feedback_cb);

  INTERACTIVE_MARKERS_PUBLIC
  EntryHandle insert(
    EntryHandle parent, const std::string & title,
    const uint8_t command_type = visualization_msgs::msg::MenuEntry::FEEDBACK,
    const std::string & command = "");

  INTERACTIVE_MARKERS_PUBLIC
  bool setVisible(EntryHandle handle, bool visible);

  INTERACTIVE_MARKERS_PUBLIC
  bool setCheckState(EntryHandle handle, CheckState check_state);

  INTERACTIVE_MARKERS_PUBLIC
  bool getCheckState(EntryHandle handle, CheckState & check_state) const;

  INTERACTIVE_MARKERS_PUBLIC
  bool apply(InteractiveMarkerServer & server, const std::string & marker_name);

  INTERACTIVE_MARKERS_PUBLIC
  bool reApply(InteractiveMarkerServer & server);

  INTERACTIVE_MARKERS_PUBLIC
  bool getTitle(EntryHandle handle, std::string & title) const;

private:
  struct EntryContext
  {
    std::string title;
    std::string command;
    uint8_t command_type;
    std::vector<EntryHandle> sub_entries;
    bool visible;
    CheckState check_state;
    FeedbackCallback feedback_cb;
  };

  // Call registered callback functions for given feedback command
  void processFeedback(
    const visualization_msgs::msg::InteractiveMarkerFeedback::ConstSharedPtr & feedback);

  // Create and push MenuEntry objects from handles_in onto
  // entries_out.  Calls itself recursively to add the entire menu
  // tree.
  bool pushMenuEntries(
    std::vector<EntryHandle> & handles_in,
    std::vector<visualization_msgs::msg::MenuEntry> & entries_out,
    EntryHandle parent_handle);

  visualization_msgs::msg::MenuEntry makeEntry(
    EntryContext & context, EntryHandle handle,
    EntryHandle parent_handle);

  // Insert without adding a top-level entry
  EntryHandle doInsert(
    const std::string & title,
    const uint8_t command_type,
    const std::string & command,
    const FeedbackCallback & feedback_cb);

  std::vector<EntryHandle> top_level_handles_;

  std::unordered_map<EntryHandle, EntryContext> entry_contexts_;

  EntryHandle current_handle_;

  std::set<std::string> managed_markers_;
};  // class MenuHandler

}  // namespace interactive_markers

#endif  // INTERACTIVE_MARKERS__MENU_HANDLER_HPP_