reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

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:
Msrc/main.cpp | 22++++++++++++++++++++--
Asrc/menu.cpp | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/menu.hpp | 21+++++++++++++++++++++
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