commit 829875e621575e493b0a46ff3166221d7182bbd1
parent 0da62729749ba95896c718e7ef2f1982cc95362a
Author: cfillion <cfillion@users.noreply.github.com>
Date: Fri, 4 Dec 2015 23:06:35 -0500
add a submenu in REAPER's Extensions menu
Diffstat:
3 files changed, 95 insertions(+), 2 deletions(-)
diff --git a/src/main.cpp b/src/main.cpp
@@ -1,3 +1,4 @@
+#include "menu.hpp"
#include "reapack.hpp"
#define REAPERAPI_IMPLEMENT
@@ -5,11 +6,25 @@
static ReaPack reapack;
-bool commandHook(const int id, const int flag)
+static bool commandHook(const int id, const int flag)
{
return reapack.execActions(id, flag);
}
+static void menuHook(const char *name, HMENU handle, int f)
+{
+ if(strcmp(name, "Main extensions") || f != 0)
+ return;
+
+ Menu menu = Menu(handle).addMenu("ReaPack");
+
+ menu.addAction("Synchronize packages",
+ NamedCommandLookup("_REAPACK_SYNC"));
+
+ menu.addAction("Import remote repository...",
+ NamedCommandLookup("_REAPACK_IMPORT"));
+}
+
extern "C" REAPER_PLUGIN_DLL_EXPORT int REAPER_PLUGIN_ENTRYPOINT(
REAPER_PLUGIN_HINSTANCE instance, reaper_plugin_info_t *rec)
{
@@ -26,10 +41,13 @@ extern "C" REAPER_PLUGIN_DLL_EXPORT int REAPER_PLUGIN_ENTRYPOINT(
reapack.init(instance, rec);
- reapack.setupAction("REAPACKSYNC", "ReaPack: Synchronize Packages",
+ reapack.setupAction("REAPACK_SYNC", "ReaPack: Synchronize Packages",
&reapack.action, std::bind(&ReaPack::synchronize, reapack));
rec->Register("hookcommand", (void *)commandHook);
+ rec->Register("hookcustommenu", (void *)menuHook);
+
+ AddExtensionsMainMenu();
return 1;
}
diff --git a/src/menu.cpp b/src/menu.cpp
@@ -0,0 +1,54 @@
+#include "menu.hpp"
+
+Menu::Menu(HMENU handle)
+ : m_handle(handle)
+{
+ m_index = GetMenuItemCount(m_handle);
+
+ if(m_index)
+ addSeparator();
+}
+
+void Menu::addAction(const char *label, const int commandId)
+{
+ MENUITEMINFO mii{};
+
+ mii.fMask |= MIIM_TYPE;
+ mii.fType = MFT_STRING;
+ mii.dwTypeData = const_cast<char *>(label);
+
+ mii.fMask |= MIIM_ID;
+ mii.wID = commandId;
+
+ append(mii);
+}
+
+void Menu::addSeparator()
+{
+ MENUITEMINFO mii{};
+ mii.fMask = MIIM_TYPE;
+ mii.fType = MFT_SEPARATOR;
+
+ append(mii);
+}
+
+Menu Menu::addMenu(const char *label)
+{
+ MENUITEMINFO mii{};
+
+ mii.fMask |= MIIM_TYPE;
+ mii.fType = MFT_STRING;
+ mii.dwTypeData = const_cast<char *>(label);
+
+ mii.fMask |= MIIM_SUBMENU;
+ mii.hSubMenu = CreatePopupMenu();
+
+ append(mii);
+
+ return Menu(mii.hSubMenu);
+}
+
+void Menu::append(MENUITEMINFO &mii)
+{
+ InsertMenuItem(m_handle, m_index++, true, &mii);
+}
diff --git a/src/menu.hpp b/src/menu.hpp
@@ -0,0 +1,21 @@
+#ifndef REAPACK_MENU_HPP
+#define REAPACK_MENU_HPP
+
+#include <swell/swell.h>
+
+class Menu {
+public:
+ Menu(HMENU handle);
+
+ void addAction(const char *label, const int commandId);
+ void addSeparator();
+ Menu addMenu(const char *label);
+
+private:
+ void append(MENUITEMINFO &);
+
+ HMENU m_handle;
+ unsigned int m_index;
+};
+
+#endif