From 50f0df78ca33cd5bedd4a8fbd214e322bc9a7896 Mon Sep 17 00:00:00 2001 From: adipose <3324395+adipose@users.noreply.github.com> Date: Wed, 17 Mar 2021 16:21:26 -0700 Subject: [PATCH 1/9] Dynamic Toolbars --- src/mpc-hc/AppSettings.cpp | 417 ++++++++++++++++-------------- src/mpc-hc/AppSettings.h | 15 +- src/mpc-hc/PlayerToolBar.cpp | 308 ++++++++++++++++------ src/mpc-hc/PlayerToolBar.h | 8 +- src/mpc-hc/SettingsDefines.h | 2 + src/mpc-hc/mpc-hc.vcxproj | 4 +- src/mpc-hc/mpc-hc.vcxproj.filters | 6 + 7 files changed, 482 insertions(+), 278 deletions(-) diff --git a/src/mpc-hc/AppSettings.cpp b/src/mpc-hc/AppSettings.cpp index 72047c276d5..fbf38c08572 100644 --- a/src/mpc-hc/AppSettings.cpp +++ b/src/mpc-hc/AppSettings.cpp @@ -37,6 +37,9 @@ #include #include "../Subtitles/SubRendererSettings.h" +std::map CAppSettings::CommandStrToID; +std::map CAppSettings::CommandIDToWMCMD; + #pragma warning(push) #pragma warning(disable: 4351) // new behavior: elements of array 'array' will be default initialized CAppSettings::CAppSettings() @@ -459,212 +462,219 @@ CAppSettings::CAppSettings() } #pragma warning(pop) +#define CMDID(X) #X, ID_##X + static constexpr wmcmd_base default_wmcmds[] = { - { ID_FILE_OPENQUICK, 'Q', FVIRTKEY | FCONTROL | FNOINVERT, IDS_MPLAYERC_0 }, - { ID_FILE_OPENMEDIA, 'O', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_OPEN_FILE }, - { ID_FILE_OPENDVDBD, 'D', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_OPEN_DVD }, - { ID_FILE_OPENDEVICE, 'V', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_OPEN_DEVICE }, - { ID_FILE_REOPEN, 'E', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_REOPEN }, - { ID_FILE_RECYCLE, VK_DELETE, FVIRTKEY | FNOINVERT, IDS_FILE_RECYCLE }, - - { ID_FILE_SAVE_COPY, 0, FVIRTKEY | FNOINVERT, IDS_AG_SAVE_COPY }, - { ID_FILE_SAVE_IMAGE, 'I', FVIRTKEY | FALT | FNOINVERT, IDS_AG_SAVE_IMAGE }, - { ID_FILE_SAVE_IMAGE_AUTO, VK_F5, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_6 }, - { ID_FILE_SAVE_THUMBNAILS, 0, FVIRTKEY | FNOINVERT, IDS_FILE_SAVE_THUMBNAILS }, - - { ID_FILE_SUBTITLES_LOAD, 'L', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_LOAD_SUBTITLES }, - { ID_FILE_SUBTITLES_SAVE, 'S', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_SAVE_SUBTITLES }, - { ID_FILE_SUBTITLES_DOWNLOAD, 'D', FVIRTKEY | FNOINVERT, IDS_SUBTITLES_DOWNLOAD }, - { ID_FILE_SUBTITLES_UPLOAD, 'U', FVIRTKEY | FCONTROL | FNOINVERT, IDS_SUBTITLES_UPLOAD }, - { ID_FILE_CLOSE_AND_RESTORE, 'C', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_CLOSE }, - { ID_FILE_PROPERTIES, VK_F10, FVIRTKEY | FSHIFT | FNOINVERT, IDS_AG_PROPERTIES }, - { ID_FILE_OPEN_LOCATION, VK_F10, FVIRTKEY | FCONTROL | FSHIFT | FNOINVERT,IDS_AG_OPEN_FILE_LOCATION }, - { ID_FILE_EXIT, 'X', FVIRTKEY | FALT | FNOINVERT, IDS_AG_EXIT }, - { ID_PLAY_PLAYPAUSE, VK_SPACE, FVIRTKEY | FNOINVERT, IDS_AG_PLAYPAUSE, APPCOMMAND_MEDIA_PLAY_PAUSE, wmcmd::LUP, wmcmd::LUP }, - { ID_PLAY_PLAY, 0, FVIRTKEY | FNOINVERT, IDS_AG_PLAY, APPCOMMAND_MEDIA_PLAY }, - { ID_PLAY_PAUSE, 0, FVIRTKEY | FNOINVERT, IDS_AG_PAUSE, APPCOMMAND_MEDIA_PAUSE }, - { ID_PLAY_STOP, VK_OEM_PERIOD, FVIRTKEY | FNOINVERT, IDS_AG_STOP, APPCOMMAND_MEDIA_STOP }, - { ID_PLAY_FRAMESTEP, VK_RIGHT, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_FRAMESTEP }, - { ID_PLAY_FRAMESTEPCANCEL, VK_LEFT, FVIRTKEY | FCONTROL | FNOINVERT, IDS_MPLAYERC_16 }, - { ID_NAVIGATE_GOTO, 'G', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_GO_TO }, - { ID_PLAY_INCRATE, VK_UP, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_INCREASE_RATE }, - { ID_PLAY_DECRATE, VK_DOWN, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_DECREASE_RATE }, - { ID_PLAY_RESETRATE, 'R', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_RESET_RATE }, - { ID_PLAY_INCAUDDELAY, VK_ADD, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_21 }, - { ID_PLAY_DECAUDDELAY, VK_SUBTRACT, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_22 }, - { ID_PLAY_SEEKFORWARDSMALL, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_23 }, - { ID_PLAY_SEEKBACKWARDSMALL, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_24 }, - { ID_PLAY_SEEKFORWARDMED, VK_RIGHT, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_25 }, - { ID_PLAY_SEEKBACKWARDMED, VK_LEFT, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_26 }, - { ID_PLAY_SEEKFORWARDLARGE, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_27, 0, wmcmd::WUP, wmcmd::WUP, FVIRTKEY | FCONTROL, FVIRTKEY | FCONTROL }, - { ID_PLAY_SEEKBACKWARDLARGE, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_28, 0, wmcmd::WDOWN, wmcmd::WDOWN, FVIRTKEY | FCONTROL, FVIRTKEY | FCONTROL }, - { ID_PLAY_SEEKKEYFORWARD, VK_RIGHT, FVIRTKEY | FSHIFT | FNOINVERT, IDS_MPLAYERC_29 }, - { ID_PLAY_SEEKKEYBACKWARD, VK_LEFT, FVIRTKEY | FSHIFT | FNOINVERT, IDS_MPLAYERC_30 }, - { ID_PLAY_SEEKSET, VK_HOME, FVIRTKEY | FNOINVERT, IDS_AG_SEEKSET }, - { ID_PLAY_REPEAT_FOREVER, 0, FVIRTKEY | FNOINVERT, IDS_PLAYLOOP_FOREVER }, - { ID_PLAY_REPEAT_ONEFILE, 0, FVIRTKEY | FNOINVERT, IDS_PLAYLOOPMODE_FILE }, - { ID_PLAY_REPEAT_WHOLEPLAYLIST, 0, FVIRTKEY | FNOINVERT, IDS_PLAYLOOPMODE_PLAYLIST }, - { ID_PLAY_REPEAT_AB, 0, FVIRTKEY | FNOINVERT, IDS_PLAYLOOPMODE_AB }, - { ID_PLAY_REPEAT_AB_MARK_A, VK_OEM_4, FVIRTKEY | FNOINVERT, IDS_PLAYLOOPMODE_AB_MARK_A }, - { ID_PLAY_REPEAT_AB_MARK_B, VK_OEM_6, FVIRTKEY | FNOINVERT, IDS_PLAYLOOPMODE_AB_MARK_B }, - { ID_NAVIGATE_SKIPFORWARD, VK_NEXT, FVIRTKEY | FNOINVERT, IDS_AG_NEXT, APPCOMMAND_MEDIA_NEXTTRACK, wmcmd::X2DOWN, wmcmd::X2DOWN }, - { ID_NAVIGATE_SKIPBACK, VK_PRIOR, FVIRTKEY | FNOINVERT, IDS_AG_PREVIOUS, APPCOMMAND_MEDIA_PREVIOUSTRACK, wmcmd::X1DOWN, wmcmd::X1DOWN }, - { ID_NAVIGATE_SKIPFORWARDFILE, VK_NEXT, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_NEXT_FILE }, - { ID_NAVIGATE_SKIPBACKFILE, VK_PRIOR, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PREVIOUS_FILE }, - { ID_NAVIGATE_TUNERSCAN, 'T', FVIRTKEY | FSHIFT | FNOINVERT, IDS_NAVIGATE_TUNERSCAN }, - { ID_FAVORITES_QUICKADDFAVORITE, 'Q', FVIRTKEY | FSHIFT | FNOINVERT, IDS_FAVORITES_QUICKADDFAVORITE }, - { ID_FAVORITES_ORGANIZE, 0, FVIRTKEY | FNOINVERT, IDS_FAVORITES_ORGANIZE }, - { ID_VIEW_CAPTIONMENU, '0', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_CAPTION }, - { ID_VIEW_SEEKER, '1', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_SEEKER }, - { ID_VIEW_CONTROLS, '2', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_CONTROLS }, - { ID_VIEW_INFORMATION, '3', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_INFO }, - { ID_VIEW_STATISTICS, '4', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_STATS }, - { ID_VIEW_STATUS, '5', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_STATUS }, - { ID_VIEW_SUBRESYNC, '6', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_SUBRESYNC }, - { ID_VIEW_PLAYLIST, '7', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_PLAYLIST }, - { ID_VIEW_CAPTURE, '8', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_CAPTURE }, - { ID_VIEW_NAVIGATION, '9', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_NAVIGATION }, - { ID_VIEW_DEBUGSHADERS, 0, FVIRTKEY | FNOINVERT, IDS_AG_TOGGLE_DEBUGSHADERS }, - { ID_PRESIZE_SHADERS_TOGGLE, 'P', FVIRTKEY | FCONTROL | FNOINVERT, IDS_PRESIZE_SHADERS_TOGGLE }, - { ID_POSTSIZE_SHADERS_TOGGLE, 'P', FVIRTKEY | FCONTROL | FALT | FNOINVERT, IDS_POSTSIZE_SHADERS_TOGGLE }, - { ID_VIEW_MPCTHEME, 0, FVIRTKEY | FNOINVERT, IDS_AG_TOGGLE_MPCTHEME }, - { ID_SUBTITLES_DEFAULT_STYLE, 0, FVIRTKEY | FNOINVERT, IDS_AG_TOGGLE_DEFAULT_SUBTITLE_STYLE }, - { ID_VIEW_PRESETS_MINIMAL, '1', FVIRTKEY | FNOINVERT, IDS_AG_VIEW_MINIMAL }, - { ID_VIEW_PRESETS_COMPACT, '2', FVIRTKEY | FNOINVERT, IDS_AG_VIEW_COMPACT }, - { ID_VIEW_PRESETS_NORMAL, '3', FVIRTKEY | FNOINVERT, IDS_AG_VIEW_NORMAL }, - { ID_VIEW_FULLSCREEN, VK_RETURN, FVIRTKEY | FALT | FNOINVERT, IDS_AG_FULLSCREEN, 0, wmcmd::LDBLCLK, wmcmd::LDBLCLK }, - { ID_VIEW_FULLSCREEN_SECONDARY, VK_F11, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_39 }, - { ID_VIEW_ZOOM_25, VK_OEM_3, FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_25 }, /* VK_OEM_3 is `~ on US keyboards*/ - { ID_VIEW_ZOOM_50, '1', FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_50 }, - { ID_VIEW_ZOOM_100, '2', FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_100 }, - { ID_VIEW_ZOOM_200, '3', FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_200 }, - { ID_VIEW_ZOOM_AUTOFIT, '4', FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_AUTO_FIT }, - { ID_VIEW_ZOOM_AUTOFIT_LARGER, '5', FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_AUTO_FIT_LARGER }, - { ID_ASPECTRATIO_NEXT, 0, FVIRTKEY | FNOINVERT, IDS_AG_NEXT_AR_PRESET }, - { ID_VIEW_VF_HALF, 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_HALF }, - { ID_VIEW_VF_NORMAL, 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_NORMAL }, - { ID_VIEW_VF_DOUBLE, 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_DOUBLE }, - { ID_VIEW_VF_STRETCH, 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_STRETCH }, - { ID_VIEW_VF_FROMINSIDE, 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_INSIDE }, - { ID_VIEW_VF_ZOOM1, 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_ZOOM1 }, - { ID_VIEW_VF_ZOOM2, 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_ZOOM2 }, - { ID_VIEW_VF_FROMOUTSIDE, 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_OUTSIDE }, - { ID_VIEW_VF_SWITCHZOOM, 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_SWITCHZOOM }, - { ID_ONTOP_ALWAYS, 'A', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_ALWAYS_ON_TOP }, - { ID_VIEW_RESET, VK_NUMPAD5, FVIRTKEY | FNOINVERT, IDS_AG_PNS_RESET }, - { ID_VIEW_INCSIZE, VK_NUMPAD9, FVIRTKEY | FNOINVERT, IDS_AG_PNS_INC_SIZE }, - { ID_VIEW_INCWIDTH, VK_NUMPAD6, FVIRTKEY | FNOINVERT, IDS_AG_PNS_INC_WIDTH }, - { ID_VIEW_INCHEIGHT, VK_NUMPAD8, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_47 }, - { ID_VIEW_DECSIZE, VK_NUMPAD1, FVIRTKEY | FNOINVERT, IDS_AG_PNS_DEC_SIZE }, - { ID_VIEW_DECWIDTH, VK_NUMPAD4, FVIRTKEY | FNOINVERT, IDS_AG_PNS_DEC_WIDTH }, - { ID_VIEW_DECHEIGHT, VK_NUMPAD2, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_50 }, - { ID_PANSCAN_CENTER, VK_NUMPAD5, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_CENTER }, - { ID_PANSCAN_MOVELEFT, VK_NUMPAD4, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_LEFT }, - { ID_PANSCAN_MOVERIGHT, VK_NUMPAD6, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_RIGHT }, - { ID_PANSCAN_MOVEUP, VK_NUMPAD8, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_UP }, - { ID_PANSCAN_MOVEDOWN, VK_NUMPAD2, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_DOWN }, - { ID_PANSCAN_MOVEUPLEFT, VK_NUMPAD7, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_UPLEFT }, - { ID_PANSCAN_MOVEUPRIGHT, VK_NUMPAD9, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_UPRIGHT }, - { ID_PANSCAN_MOVEDOWNLEFT, VK_NUMPAD1, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_DOWNLEFT }, - { ID_PANSCAN_MOVEDOWNRIGHT, VK_NUMPAD3, FVIRTKEY | FCONTROL | FNOINVERT, IDS_MPLAYERC_59 }, - { ID_PANSCAN_ROTATEXP, VK_NUMPAD8, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEX_P }, - { ID_PANSCAN_ROTATEXM, VK_NUMPAD2, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEX_M }, - { ID_PANSCAN_ROTATEYP, VK_NUMPAD4, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEY_P }, - { ID_PANSCAN_ROTATEYM, VK_NUMPAD6, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEY_M }, - { ID_PANSCAN_ROTATEZP, VK_NUMPAD1, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEZ_P }, - { ID_PANSCAN_ROTATEZM, VK_NUMPAD3, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEZ_M }, - { ID_VOLUME_UP, VK_UP, FVIRTKEY | FNOINVERT, IDS_AG_VOLUME_UP, 0, wmcmd::WUP, wmcmd::WUP }, - { ID_VOLUME_DOWN, VK_DOWN, FVIRTKEY | FNOINVERT, IDS_AG_VOLUME_DOWN, 0, wmcmd::WDOWN, wmcmd::WDOWN }, - { ID_VOLUME_MUTE, 'M', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_VOLUME_MUTE, 0 }, - { ID_VOLUME_BOOST_INC, 0, FVIRTKEY | FNOINVERT, IDS_VOLUME_BOOST_INC }, - { ID_VOLUME_BOOST_DEC, 0, FVIRTKEY | FNOINVERT, IDS_VOLUME_BOOST_DEC }, - { ID_VOLUME_BOOST_MIN, 0, FVIRTKEY | FNOINVERT, IDS_VOLUME_BOOST_MIN }, - { ID_VOLUME_BOOST_MAX, 0, FVIRTKEY | FNOINVERT, IDS_VOLUME_BOOST_MAX }, - { ID_CUSTOM_CHANNEL_MAPPING, 0, FVIRTKEY | FNOINVERT, IDS_CUSTOM_CHANNEL_MAPPING }, - { ID_NORMALIZE, 0, FVIRTKEY | FNOINVERT, IDS_NORMALIZE }, - { ID_REGAIN_VOLUME, 0, FVIRTKEY | FNOINVERT, IDS_REGAIN_VOLUME }, - { ID_COLOR_BRIGHTNESS_INC, 0, FVIRTKEY | FNOINVERT, IDS_BRIGHTNESS_INC }, - { ID_COLOR_BRIGHTNESS_DEC, 0, FVIRTKEY | FNOINVERT, IDS_BRIGHTNESS_DEC }, - { ID_COLOR_CONTRAST_INC, 0, FVIRTKEY | FNOINVERT, IDS_CONTRAST_INC }, - { ID_COLOR_CONTRAST_DEC, 0, FVIRTKEY | FNOINVERT, IDS_CONTRAST_DEC }, - { ID_COLOR_HUE_INC, 0, FVIRTKEY | FNOINVERT, IDS_HUE_INC }, - { ID_COLOR_HUE_DEC, 0, FVIRTKEY | FNOINVERT, IDS_HUE_DEC }, - { ID_COLOR_SATURATION_INC, 0, FVIRTKEY | FNOINVERT, IDS_SATURATION_INC }, - { ID_COLOR_SATURATION_DEC, 0, FVIRTKEY | FNOINVERT, IDS_SATURATION_DEC }, - { ID_COLOR_RESET, 0, FVIRTKEY | FNOINVERT, IDS_RESET_COLOR }, - { ID_NAVIGATE_TITLEMENU, 'T', FVIRTKEY | FALT | FNOINVERT, IDS_MPLAYERC_63 }, - { ID_NAVIGATE_ROOTMENU, 'R', FVIRTKEY | FALT | FNOINVERT, IDS_AG_DVD_ROOT_MENU }, - { ID_NAVIGATE_SUBPICTUREMENU, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_65 }, - { ID_NAVIGATE_AUDIOMENU, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_66 }, - { ID_NAVIGATE_ANGLEMENU, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_67 }, - { ID_NAVIGATE_CHAPTERMENU, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_68 }, - { ID_NAVIGATE_MENU_LEFT, VK_LEFT, FVIRTKEY | FCONTROL | FSHIFT | FNOINVERT, IDS_AG_DVD_MENU_LEFT }, - { ID_NAVIGATE_MENU_RIGHT, VK_RIGHT, FVIRTKEY | FCONTROL | FSHIFT | FNOINVERT, IDS_MPLAYERC_70 }, - { ID_NAVIGATE_MENU_UP, VK_UP, FVIRTKEY | FCONTROL | FSHIFT | FNOINVERT, IDS_AG_DVD_MENU_UP }, - { ID_NAVIGATE_MENU_DOWN, VK_DOWN, FVIRTKEY | FCONTROL | FSHIFT | FNOINVERT, IDS_AG_DVD_MENU_DOWN }, - { ID_NAVIGATE_MENU_ACTIVATE, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_73 }, - { ID_NAVIGATE_MENU_BACK, 0, FVIRTKEY | FNOINVERT, IDS_AG_DVD_MENU_BACK }, - { ID_NAVIGATE_MENU_LEAVE, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_75 }, - { ID_BOSS, 'B', FVIRTKEY | FNOINVERT, IDS_AG_BOSS_KEY }, - { ID_MENU_PLAYER_SHORT, VK_APPS, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_77, 0, wmcmd::RUP, wmcmd::RUP }, - { ID_MENU_PLAYER_LONG, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_78 }, - { ID_MENU_FILTERS, 0, FVIRTKEY | FNOINVERT, IDS_AG_FILTERS_MENU }, - { ID_VIEW_OPTIONS, 'O', FVIRTKEY | FNOINVERT, IDS_AG_OPTIONS }, - { ID_STREAM_AUDIO_NEXT, 'A', FVIRTKEY | FNOINVERT, IDS_AG_NEXT_AUDIO }, - { ID_STREAM_AUDIO_PREV, 'A', FVIRTKEY | FSHIFT | FNOINVERT, IDS_AG_PREV_AUDIO }, - { ID_STREAM_SUB_NEXT, 'S', FVIRTKEY | FNOINVERT, IDS_AG_NEXT_SUBTITLE }, - { ID_STREAM_SUB_PREV, 'S', FVIRTKEY | FSHIFT | FNOINVERT, IDS_AG_PREV_SUBTITLE }, - { ID_STREAM_SUB_ONOFF, 'W', FVIRTKEY | FNOINVERT, IDS_MPLAYERC_85 }, - { ID_SUBTITLES_SUBITEM_START + 2, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_86 }, - { ID_DVD_ANGLE_NEXT, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_91 }, - { ID_DVD_ANGLE_PREV, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_92 }, - { ID_DVD_AUDIO_NEXT, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_93 }, - { ID_DVD_AUDIO_PREV, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_94 }, - { ID_DVD_SUB_NEXT, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_95 }, - { ID_DVD_SUB_PREV, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_96 }, - { ID_DVD_SUB_ONOFF, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_97 }, - { ID_VIEW_TEARING_TEST, 'T', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TEARING_TEST }, - { ID_VIEW_OSD_DISPLAY_TIME, 'I', FVIRTKEY | FCONTROL | FNOINVERT, IDS_OSD_DISPLAY_CURRENT_TIME }, - { ID_VIEW_OSD_SHOW_FILENAME, 'N', FVIRTKEY | FNOINVERT, IDS_OSD_SHOW_FILENAME }, - { ID_SHADERS_PRESET_NEXT, 0, FVIRTKEY | FNOINVERT, IDS_AG_SHADERS_PRESET_NEXT }, - { ID_SHADERS_PRESET_PREV, 0, FVIRTKEY | FNOINVERT, IDS_AG_SHADERS_PRESET_PREV }, - { ID_D3DFULLSCREEN_TOGGLE, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_99 }, - { ID_GOTO_PREV_SUB, 'Y', FVIRTKEY | FNOINVERT, IDS_MPLAYERC_100 }, - { ID_GOTO_NEXT_SUB, 'U', FVIRTKEY | FNOINVERT, IDS_MPLAYERC_101 }, - { ID_SHIFT_SUB_DOWN, VK_NEXT, FVIRTKEY | FALT | FNOINVERT, IDS_MPLAYERC_102 }, - { ID_SHIFT_SUB_UP, VK_PRIOR, FVIRTKEY | FALT | FNOINVERT, IDS_MPLAYERC_103 }, - { ID_VIEW_DISPLAY_RENDERER_STATS, 'J', FVIRTKEY | FCONTROL | FNOINVERT, IDS_OSD_DISPLAY_RENDERER_STATS }, - { ID_VIEW_RESET_RENDERER_STATS, 'R', FVIRTKEY | FCONTROL | FALT | FNOINVERT, IDS_OSD_RESET_RENDERER_STATS }, - { ID_VIEW_VSYNC, 'V', FVIRTKEY | FNOINVERT, IDS_AG_VSYNC }, - { ID_VIEW_ENABLEFRAMETIMECORRECTION, 0, FVIRTKEY | FNOINVERT, IDS_AG_ENABLEFRAMETIMECORRECTION }, - { ID_VIEW_VSYNCACCURATE, 'V', FVIRTKEY | FCONTROL | FALT | FNOINVERT, IDS_AG_VSYNCACCURATE }, - { ID_VIEW_VSYNCOFFSET_DECREASE, VK_UP, FVIRTKEY | FCONTROL | FALT | FNOINVERT, IDS_AG_VSYNCOFFSET_DECREASE }, - { ID_VIEW_VSYNCOFFSET_INCREASE, VK_DOWN, FVIRTKEY | FCONTROL | FALT | FNOINVERT, IDS_AG_VSYNCOFFSET_INCREASE }, - { ID_SUB_DELAY_DOWN, VK_F1, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_104 }, - { ID_SUB_DELAY_UP, VK_F2, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_105 }, - - { ID_AFTERPLAYBACK_DONOTHING, 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_DONOTHING }, - { ID_AFTERPLAYBACK_PLAYNEXT, 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_PLAYNEXT }, - { ID_AFTERPLAYBACK_MONITOROFF, 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_MONITOROFF }, - { ID_AFTERPLAYBACK_EXIT, 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_EXIT }, - { ID_AFTERPLAYBACK_STANDBY, 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_STANDBY }, - { ID_AFTERPLAYBACK_HIBERNATE, 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_HIBERNATE }, - { ID_AFTERPLAYBACK_SHUTDOWN, 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_SHUTDOWN }, - { ID_AFTERPLAYBACK_LOGOFF, 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_LOGOFF }, - { ID_AFTERPLAYBACK_LOCK, 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_LOCK }, - - { ID_VIEW_EDITLISTEDITOR, 0, FVIRTKEY | FNOINVERT, IDS_AG_TOGGLE_EDITLISTEDITOR }, - { ID_EDL_IN, 0, FVIRTKEY | FNOINVERT, IDS_AG_EDL_IN }, - { ID_EDL_OUT, 0, FVIRTKEY | FNOINVERT, IDS_AG_EDL_OUT }, - { ID_EDL_NEWCLIP, 0, FVIRTKEY | FNOINVERT, IDS_AG_EDL_NEW_CLIP }, - { ID_EDL_SAVE, 0, FVIRTKEY | FNOINVERT, IDS_AG_EDL_SAVE } + { CMDID(FILE_OPENQUICK), 'Q', FVIRTKEY | FCONTROL | FNOINVERT, IDS_MPLAYERC_0 }, + { CMDID(FILE_OPENMEDIA), 'O', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_OPEN_FILE }, + { CMDID(FILE_OPENDVDBD), 'D', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_OPEN_DVD }, + { CMDID(FILE_OPENDEVICE), 'V', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_OPEN_DEVICE }, + { CMDID(FILE_REOPEN), 'E', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_REOPEN }, + { CMDID(FILE_RECYCLE), VK_DELETE, FVIRTKEY | FNOINVERT, IDS_FILE_RECYCLE }, + + { CMDID(FILE_SAVE_COPY), 0, FVIRTKEY | FNOINVERT, IDS_AG_SAVE_COPY }, + { CMDID(FILE_SAVE_IMAGE), 'I', FVIRTKEY | FALT | FNOINVERT, IDS_AG_SAVE_IMAGE }, + { CMDID(FILE_SAVE_IMAGE_AUTO), VK_F5, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_6 }, + { CMDID(FILE_SAVE_THUMBNAILS), 0, FVIRTKEY | FNOINVERT, IDS_FILE_SAVE_THUMBNAILS }, + + { CMDID(FILE_SUBTITLES_LOAD), 'L', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_LOAD_SUBTITLES }, + { CMDID(FILE_SUBTITLES_SAVE), 'S', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_SAVE_SUBTITLES }, + { CMDID(FILE_SUBTITLES_DOWNLOAD), 'D', FVIRTKEY | FNOINVERT, IDS_SUBTITLES_DOWNLOAD }, + { CMDID(FILE_SUBTITLES_UPLOAD), 'U', FVIRTKEY | FCONTROL | FNOINVERT, IDS_SUBTITLES_UPLOAD }, + { CMDID(FILE_CLOSE_AND_RESTORE), 'C', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_CLOSE }, + { CMDID(FILE_PROPERTIES), VK_F10, FVIRTKEY | FSHIFT | FNOINVERT, IDS_AG_PROPERTIES }, + { CMDID(FILE_OPEN_LOCATION), VK_F10, FVIRTKEY | FCONTROL | FSHIFT | FNOINVERT,IDS_AG_OPEN_FILE_LOCATION }, + { CMDID(FILE_EXIT), 'X', FVIRTKEY | FALT | FNOINVERT, IDS_AG_EXIT }, + { CMDID(PLAY_PLAYPAUSE), VK_SPACE, FVIRTKEY | FNOINVERT, IDS_AG_PLAYPAUSE, APPCOMMAND_MEDIA_PLAY_PAUSE, wmcmd::LUP, wmcmd::LUP }, + { CMDID(PLAY_PLAY), 0, FVIRTKEY | FNOINVERT, IDS_AG_PLAY, APPCOMMAND_MEDIA_PLAY }, + { CMDID(PLAY_PAUSE), 0, FVIRTKEY | FNOINVERT, IDS_AG_PAUSE, APPCOMMAND_MEDIA_PAUSE }, + { CMDID(PLAY_STOP), VK_OEM_PERIOD, FVIRTKEY | FNOINVERT, IDS_AG_STOP, APPCOMMAND_MEDIA_STOP }, + { CMDID(PLAY_FRAMESTEP), VK_RIGHT, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_FRAMESTEP }, + { CMDID(PLAY_FRAMESTEPCANCEL), VK_LEFT, FVIRTKEY | FCONTROL | FNOINVERT, IDS_MPLAYERC_16 }, + { CMDID(NAVIGATE_GOTO), 'G', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_GO_TO }, + { CMDID(PLAY_INCRATE), VK_UP, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_INCREASE_RATE }, + { CMDID(PLAY_DECRATE), VK_DOWN, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_DECREASE_RATE }, + { CMDID(PLAY_RESETRATE), 'R', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_RESET_RATE }, + { CMDID(PLAY_INCAUDDELAY), VK_ADD, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_21 }, + { CMDID(PLAY_DECAUDDELAY), VK_SUBTRACT, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_22 }, + { CMDID(PLAY_SEEKFORWARDSMALL), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_23 }, + { CMDID(PLAY_SEEKBACKWARDSMALL), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_24 }, + { CMDID(PLAY_SEEKFORWARDMED), VK_RIGHT, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_25 }, + { CMDID(PLAY_SEEKBACKWARDMED), VK_LEFT, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_26 }, + { CMDID(PLAY_SEEKFORWARDLARGE), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_27, 0, wmcmd::WUP, wmcmd::WUP, FVIRTKEY | FCONTROL, FVIRTKEY | FCONTROL }, + { CMDID(PLAY_SEEKBACKWARDLARGE), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_28, 0, wmcmd::WDOWN, wmcmd::WDOWN, FVIRTKEY | FCONTROL, FVIRTKEY | FCONTROL }, + { CMDID(PLAY_SEEKKEYFORWARD), VK_RIGHT, FVIRTKEY | FSHIFT | FNOINVERT, IDS_MPLAYERC_29 }, + { CMDID(PLAY_SEEKKEYBACKWARD), VK_LEFT, FVIRTKEY | FSHIFT | FNOINVERT, IDS_MPLAYERC_30 }, + { CMDID(PLAY_SEEKSET), VK_HOME, FVIRTKEY | FNOINVERT, IDS_AG_SEEKSET }, + { CMDID(PLAY_REPEAT_FOREVER), 0, FVIRTKEY | FNOINVERT, IDS_PLAYLOOP_FOREVER }, + { CMDID(PLAY_REPEAT_ONEFILE), 0, FVIRTKEY | FNOINVERT, IDS_PLAYLOOPMODE_FILE }, + { CMDID(PLAY_REPEAT_WHOLEPLAYLIST), 0, FVIRTKEY | FNOINVERT, IDS_PLAYLOOPMODE_PLAYLIST }, + { CMDID(PLAY_REPEAT_AB), 0, FVIRTKEY | FNOINVERT, IDS_PLAYLOOPMODE_AB }, + { CMDID(PLAY_REPEAT_AB_MARK_A), VK_OEM_4, FVIRTKEY | FNOINVERT, IDS_PLAYLOOPMODE_AB_MARK_A }, + { CMDID(PLAY_REPEAT_AB_MARK_B), VK_OEM_6, FVIRTKEY | FNOINVERT, IDS_PLAYLOOPMODE_AB_MARK_B }, + { CMDID(NAVIGATE_SKIPFORWARD), VK_NEXT, FVIRTKEY | FNOINVERT, IDS_AG_NEXT, APPCOMMAND_MEDIA_NEXTTRACK, wmcmd::X2DOWN, wmcmd::X2DOWN }, + { CMDID(NAVIGATE_SKIPBACK), VK_PRIOR, FVIRTKEY | FNOINVERT, IDS_AG_PREVIOUS, APPCOMMAND_MEDIA_PREVIOUSTRACK, wmcmd::X1DOWN, wmcmd::X1DOWN }, + { CMDID(NAVIGATE_SKIPFORWARDFILE), VK_NEXT, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_NEXT_FILE }, + { CMDID(NAVIGATE_SKIPBACKFILE), VK_PRIOR, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PREVIOUS_FILE }, + { CMDID(NAVIGATE_TUNERSCAN), 'T', FVIRTKEY | FSHIFT | FNOINVERT, IDS_NAVIGATE_TUNERSCAN }, + { CMDID(FAVORITES_QUICKADDFAVORITE), 'Q', FVIRTKEY | FSHIFT | FNOINVERT, IDS_FAVORITES_QUICKADDFAVORITE }, + { CMDID(FAVORITES_ORGANIZE), 0, FVIRTKEY | FNOINVERT, IDS_FAVORITES_ORGANIZE }, + { CMDID(VIEW_CAPTIONMENU), '0', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_CAPTION }, + { CMDID(VIEW_SEEKER), '1', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_SEEKER }, + { CMDID(VIEW_CONTROLS), '2', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_CONTROLS }, + { CMDID(VIEW_INFORMATION), '3', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_INFO }, + { CMDID(VIEW_STATISTICS), '4', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_STATS }, + { CMDID(VIEW_STATUS), '5', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_STATUS }, + { CMDID(VIEW_SUBRESYNC), '6', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_SUBRESYNC }, + { CMDID(VIEW_PLAYLIST), '7', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_PLAYLIST }, + { CMDID(VIEW_CAPTURE), '8', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_CAPTURE }, + { CMDID(VIEW_NAVIGATION), '9', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TOGGLE_NAVIGATION }, + { CMDID(VIEW_DEBUGSHADERS), 0, FVIRTKEY | FNOINVERT, IDS_AG_TOGGLE_DEBUGSHADERS }, + { CMDID(PRESIZE_SHADERS_TOGGLE), 'P', FVIRTKEY | FCONTROL | FNOINVERT, IDS_PRESIZE_SHADERS_TOGGLE }, + { CMDID(POSTSIZE_SHADERS_TOGGLE), 'P', FVIRTKEY | FCONTROL | FALT | FNOINVERT, IDS_POSTSIZE_SHADERS_TOGGLE }, + { CMDID(VIEW_MPCTHEME), 0, FVIRTKEY | FNOINVERT, IDS_AG_TOGGLE_MPCTHEME }, + { CMDID(SUBTITLES_DEFAULT_STYLE), 0, FVIRTKEY | FNOINVERT, IDS_AG_TOGGLE_DEFAULT_SUBTITLE_STYLE }, + { CMDID(VIEW_PRESETS_MINIMAL), '1', FVIRTKEY | FNOINVERT, IDS_AG_VIEW_MINIMAL }, + { CMDID(VIEW_PRESETS_COMPACT), '2', FVIRTKEY | FNOINVERT, IDS_AG_VIEW_COMPACT }, + { CMDID(VIEW_PRESETS_NORMAL), '3', FVIRTKEY | FNOINVERT, IDS_AG_VIEW_NORMAL }, + { CMDID(VIEW_FULLSCREEN), VK_RETURN, FVIRTKEY | FALT | FNOINVERT, IDS_AG_FULLSCREEN, 0, wmcmd::LDBLCLK, wmcmd::LDBLCLK }, + { CMDID(VIEW_FULLSCREEN_SECONDARY), VK_F11, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_39 }, + { CMDID(VIEW_ZOOM_25), VK_OEM_3, FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_25 }, /* VK_OEM_3 is `~ on US keyboards*/ + { CMDID(VIEW_ZOOM_50), '1', FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_50 }, + { CMDID(VIEW_ZOOM_100), '2', FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_100 }, + { CMDID(VIEW_ZOOM_200), '3', FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_200 }, + { CMDID(VIEW_ZOOM_AUTOFIT), '4', FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_AUTO_FIT }, + { CMDID(VIEW_ZOOM_AUTOFIT_LARGER), '5', FVIRTKEY | FALT | FNOINVERT, IDS_AG_ZOOM_AUTO_FIT_LARGER }, + { CMDID(ASPECTRATIO_NEXT), 0, FVIRTKEY | FNOINVERT, IDS_AG_NEXT_AR_PRESET }, + { CMDID(VIEW_VF_HALF), 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_HALF }, + { CMDID(VIEW_VF_NORMAL), 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_NORMAL }, + { CMDID(VIEW_VF_DOUBLE), 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_DOUBLE }, + { CMDID(VIEW_VF_STRETCH), 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_STRETCH }, + { CMDID(VIEW_VF_FROMINSIDE), 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_INSIDE }, + { CMDID(VIEW_VF_ZOOM1), 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_ZOOM1 }, + { CMDID(VIEW_VF_ZOOM2), 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_ZOOM2 }, + { CMDID(VIEW_VF_FROMOUTSIDE), 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_OUTSIDE }, + { CMDID(VIEW_VF_SWITCHZOOM), 0, FVIRTKEY | FNOINVERT, IDS_AG_VIDFRM_SWITCHZOOM }, + { CMDID(ONTOP_ALWAYS), 'A', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_ALWAYS_ON_TOP }, + { CMDID(VIEW_RESET), VK_NUMPAD5, FVIRTKEY | FNOINVERT, IDS_AG_PNS_RESET }, + { CMDID(VIEW_INCSIZE), VK_NUMPAD9, FVIRTKEY | FNOINVERT, IDS_AG_PNS_INC_SIZE }, + { CMDID(VIEW_INCWIDTH), VK_NUMPAD6, FVIRTKEY | FNOINVERT, IDS_AG_PNS_INC_WIDTH }, + { CMDID(VIEW_INCHEIGHT), VK_NUMPAD8, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_47 }, + { CMDID(VIEW_DECSIZE), VK_NUMPAD1, FVIRTKEY | FNOINVERT, IDS_AG_PNS_DEC_SIZE }, + { CMDID(VIEW_DECWIDTH), VK_NUMPAD4, FVIRTKEY | FNOINVERT, IDS_AG_PNS_DEC_WIDTH }, + { CMDID(VIEW_DECHEIGHT), VK_NUMPAD2, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_50 }, + { CMDID(PANSCAN_CENTER), VK_NUMPAD5, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_CENTER }, + { CMDID(PANSCAN_MOVELEFT), VK_NUMPAD4, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_LEFT }, + { CMDID(PANSCAN_MOVERIGHT), VK_NUMPAD6, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_RIGHT }, + { CMDID(PANSCAN_MOVEUP), VK_NUMPAD8, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_UP }, + { CMDID(PANSCAN_MOVEDOWN), VK_NUMPAD2, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_DOWN }, + { CMDID(PANSCAN_MOVEUPLEFT), VK_NUMPAD7, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_UPLEFT }, + { CMDID(PANSCAN_MOVEUPRIGHT), VK_NUMPAD9, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_UPRIGHT }, + { CMDID(PANSCAN_MOVEDOWNLEFT), VK_NUMPAD1, FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_PNS_DOWNLEFT }, + { CMDID(PANSCAN_MOVEDOWNRIGHT), VK_NUMPAD3, FVIRTKEY | FCONTROL | FNOINVERT, IDS_MPLAYERC_59 }, + { CMDID(PANSCAN_ROTATEXP), VK_NUMPAD8, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEX_P }, + { CMDID(PANSCAN_ROTATEXM), VK_NUMPAD2, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEX_M }, + { CMDID(PANSCAN_ROTATEYP), VK_NUMPAD4, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEY_P }, + { CMDID(PANSCAN_ROTATEYM), VK_NUMPAD6, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEY_M }, + { CMDID(PANSCAN_ROTATEZP), VK_NUMPAD1, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEZ_P }, + { CMDID(PANSCAN_ROTATEZM), VK_NUMPAD3, FVIRTKEY | FALT | FNOINVERT, IDS_AG_PNS_ROTATEZ_M }, + { CMDID(VOLUME_UP), VK_UP, FVIRTKEY | FNOINVERT, IDS_AG_VOLUME_UP, 0, wmcmd::WUP, wmcmd::WUP }, + { CMDID(VOLUME_DOWN), VK_DOWN, FVIRTKEY | FNOINVERT, IDS_AG_VOLUME_DOWN, 0, wmcmd::WDOWN, wmcmd::WDOWN }, + { CMDID(VOLUME_MUTE), 'M', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_VOLUME_MUTE, 0 }, + { CMDID(VOLUME_BOOST_INC), 0, FVIRTKEY | FNOINVERT, IDS_VOLUME_BOOST_INC }, + { CMDID(VOLUME_BOOST_DEC), 0, FVIRTKEY | FNOINVERT, IDS_VOLUME_BOOST_DEC }, + { CMDID(VOLUME_BOOST_MIN), 0, FVIRTKEY | FNOINVERT, IDS_VOLUME_BOOST_MIN }, + { CMDID(VOLUME_BOOST_MAX), 0, FVIRTKEY | FNOINVERT, IDS_VOLUME_BOOST_MAX }, + { CMDID(CUSTOM_CHANNEL_MAPPING), 0, FVIRTKEY | FNOINVERT, IDS_CUSTOM_CHANNEL_MAPPING }, + { CMDID(NORMALIZE), 0, FVIRTKEY | FNOINVERT, IDS_NORMALIZE }, + { CMDID(REGAIN_VOLUME), 0, FVIRTKEY | FNOINVERT, IDS_REGAIN_VOLUME }, + { CMDID(COLOR_BRIGHTNESS_INC), 0, FVIRTKEY | FNOINVERT, IDS_BRIGHTNESS_INC }, + { CMDID(COLOR_BRIGHTNESS_DEC), 0, FVIRTKEY | FNOINVERT, IDS_BRIGHTNESS_DEC }, + { CMDID(COLOR_CONTRAST_INC), 0, FVIRTKEY | FNOINVERT, IDS_CONTRAST_INC }, + { CMDID(COLOR_CONTRAST_DEC), 0, FVIRTKEY | FNOINVERT, IDS_CONTRAST_DEC }, + { CMDID(COLOR_HUE_INC), 0, FVIRTKEY | FNOINVERT, IDS_HUE_INC }, + { CMDID(COLOR_HUE_DEC), 0, FVIRTKEY | FNOINVERT, IDS_HUE_DEC }, + { CMDID(COLOR_SATURATION_INC), 0, FVIRTKEY | FNOINVERT, IDS_SATURATION_INC }, + { CMDID(COLOR_SATURATION_DEC), 0, FVIRTKEY | FNOINVERT, IDS_SATURATION_DEC }, + { CMDID(COLOR_RESET), 0, FVIRTKEY | FNOINVERT, IDS_RESET_COLOR }, + { CMDID(NAVIGATE_TITLEMENU), 'T', FVIRTKEY | FALT | FNOINVERT, IDS_MPLAYERC_63 }, + { CMDID(NAVIGATE_ROOTMENU), 'R', FVIRTKEY | FALT | FNOINVERT, IDS_AG_DVD_ROOT_MENU }, + { CMDID(NAVIGATE_SUBPICTUREMENU), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_65 }, + { CMDID(NAVIGATE_AUDIOMENU), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_66 }, + { CMDID(NAVIGATE_ANGLEMENU), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_67 }, + { CMDID(NAVIGATE_CHAPTERMENU), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_68 }, + { CMDID(NAVIGATE_MENU_LEFT), VK_LEFT, FVIRTKEY | FCONTROL | FSHIFT | FNOINVERT, IDS_AG_DVD_MENU_LEFT }, + { CMDID(NAVIGATE_MENU_RIGHT), VK_RIGHT, FVIRTKEY | FCONTROL | FSHIFT | FNOINVERT, IDS_MPLAYERC_70 }, + { CMDID(NAVIGATE_MENU_UP), VK_UP, FVIRTKEY | FCONTROL | FSHIFT | FNOINVERT, IDS_AG_DVD_MENU_UP }, + { CMDID(NAVIGATE_MENU_DOWN), VK_DOWN, FVIRTKEY | FCONTROL | FSHIFT | FNOINVERT, IDS_AG_DVD_MENU_DOWN }, + { CMDID(NAVIGATE_MENU_ACTIVATE), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_73 }, + { CMDID(NAVIGATE_MENU_BACK), 0, FVIRTKEY | FNOINVERT, IDS_AG_DVD_MENU_BACK }, + { CMDID(NAVIGATE_MENU_LEAVE), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_75 }, + { CMDID(BOSS), 'B', FVIRTKEY | FNOINVERT, IDS_AG_BOSS_KEY }, + { CMDID(MENU_PLAYER_SHORT), VK_APPS, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_77, 0, wmcmd::RUP, wmcmd::RUP }, + { CMDID(MENU_PLAYER_LONG), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_78 }, + { CMDID(MENU_FILTERS), 0, FVIRTKEY | FNOINVERT, IDS_AG_FILTERS_MENU }, + { CMDID(VIEW_OPTIONS), 'O', FVIRTKEY | FNOINVERT, IDS_AG_OPTIONS }, + { CMDID(STREAM_AUDIO_NEXT), 'A', FVIRTKEY | FNOINVERT, IDS_AG_NEXT_AUDIO }, + { CMDID(STREAM_AUDIO_PREV), 'A', FVIRTKEY | FSHIFT | FNOINVERT, IDS_AG_PREV_AUDIO }, + { CMDID(STREAM_SUB_NEXT), 'S', FVIRTKEY | FNOINVERT, IDS_AG_NEXT_SUBTITLE }, + { CMDID(STREAM_SUB_PREV), 'S', FVIRTKEY | FSHIFT | FNOINVERT, IDS_AG_PREV_SUBTITLE }, + { CMDID(STREAM_SUB_ONOFF), 'W', FVIRTKEY | FNOINVERT, IDS_MPLAYERC_85 }, + { "", ID_SUBTITLES_SUBITEM_START + 2, 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_86 }, + { CMDID(DVD_ANGLE_NEXT), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_91 }, + { CMDID(DVD_ANGLE_PREV), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_92 }, + { CMDID(DVD_AUDIO_NEXT), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_93 }, + { CMDID(DVD_AUDIO_PREV), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_94 }, + { CMDID(DVD_SUB_NEXT), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_95 }, + { CMDID(DVD_SUB_PREV), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_96 }, + { CMDID(DVD_SUB_ONOFF), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_97 }, + { CMDID(VIEW_TEARING_TEST), 'T', FVIRTKEY | FCONTROL | FNOINVERT, IDS_AG_TEARING_TEST }, + { CMDID(VIEW_OSD_DISPLAY_TIME), 'I', FVIRTKEY | FCONTROL | FNOINVERT, IDS_OSD_DISPLAY_CURRENT_TIME }, + { CMDID(VIEW_OSD_SHOW_FILENAME), 'N', FVIRTKEY | FNOINVERT, IDS_OSD_SHOW_FILENAME }, + { CMDID(SHADERS_PRESET_NEXT), 0, FVIRTKEY | FNOINVERT, IDS_AG_SHADERS_PRESET_NEXT }, + { CMDID(SHADERS_PRESET_PREV), 0, FVIRTKEY | FNOINVERT, IDS_AG_SHADERS_PRESET_PREV }, + { CMDID(D3DFULLSCREEN_TOGGLE), 0, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_99 }, + { CMDID(GOTO_PREV_SUB), 'Y', FVIRTKEY | FNOINVERT, IDS_MPLAYERC_100 }, + { CMDID(GOTO_NEXT_SUB), 'U', FVIRTKEY | FNOINVERT, IDS_MPLAYERC_101 }, + { CMDID(SHIFT_SUB_DOWN), VK_NEXT, FVIRTKEY | FALT | FNOINVERT, IDS_MPLAYERC_102 }, + { CMDID(SHIFT_SUB_UP), VK_PRIOR, FVIRTKEY | FALT | FNOINVERT, IDS_MPLAYERC_103 }, + { CMDID(VIEW_DISPLAY_RENDERER_STATS), 'J', FVIRTKEY | FCONTROL | FNOINVERT, IDS_OSD_DISPLAY_RENDERER_STATS }, + { CMDID(VIEW_RESET_RENDERER_STATS), 'R', FVIRTKEY | FCONTROL | FALT | FNOINVERT, IDS_OSD_RESET_RENDERER_STATS }, + { CMDID(VIEW_VSYNC), 'V', FVIRTKEY | FNOINVERT, IDS_AG_VSYNC }, + { CMDID(VIEW_ENABLEFRAMETIMECORRECTION), 0, FVIRTKEY | FNOINVERT, IDS_AG_ENABLEFRAMETIMECORRECTION }, + { CMDID(VIEW_VSYNCACCURATE), 'V', FVIRTKEY | FCONTROL | FALT | FNOINVERT, IDS_AG_VSYNCACCURATE }, + { CMDID(VIEW_VSYNCOFFSET_DECREASE), VK_UP, FVIRTKEY | FCONTROL | FALT | FNOINVERT, IDS_AG_VSYNCOFFSET_DECREASE }, + { CMDID(VIEW_VSYNCOFFSET_INCREASE), VK_DOWN, FVIRTKEY | FCONTROL | FALT | FNOINVERT, IDS_AG_VSYNCOFFSET_INCREASE }, + { CMDID(SUB_DELAY_DOWN), VK_F1, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_104 }, + { CMDID(SUB_DELAY_UP), VK_F2, FVIRTKEY | FNOINVERT, IDS_MPLAYERC_105 }, + + { CMDID(AFTERPLAYBACK_DONOTHING), 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_DONOTHING }, + { CMDID(AFTERPLAYBACK_PLAYNEXT), 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_PLAYNEXT }, + { CMDID(AFTERPLAYBACK_MONITOROFF), 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_MONITOROFF }, + { CMDID(AFTERPLAYBACK_EXIT), 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_EXIT }, + { CMDID(AFTERPLAYBACK_STANDBY), 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_STANDBY }, + { CMDID(AFTERPLAYBACK_HIBERNATE), 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_HIBERNATE }, + { CMDID(AFTERPLAYBACK_SHUTDOWN), 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_SHUTDOWN }, + { CMDID(AFTERPLAYBACK_LOGOFF), 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_LOGOFF }, + { CMDID(AFTERPLAYBACK_LOCK), 0, FVIRTKEY | FNOINVERT, IDS_AFTERPLAYBACK_LOCK }, + + { CMDID(VIEW_EDITLISTEDITOR), 0, FVIRTKEY | FNOINVERT, IDS_AG_TOGGLE_EDITLISTEDITOR }, + { CMDID(EDL_IN), 0, FVIRTKEY | FNOINVERT, IDS_AG_EDL_IN }, + { CMDID(EDL_OUT), 0, FVIRTKEY | FNOINVERT, IDS_AG_EDL_OUT }, + { CMDID(EDL_NEWCLIP), 0, FVIRTKEY | FNOINVERT, IDS_AG_EDL_NEW_CLIP }, + { CMDID(EDL_SAVE), 0, FVIRTKEY | FNOINVERT, IDS_AG_EDL_SAVE } }; void CAppSettings::CreateCommands() { + CommandStrToID.clear(); for (const auto& wc : default_wmcmds) { + CommandStrToID[wc.cmdidStr] = wc.cmd; + CommandIDToWMCMD[wc.cmd] = &wc; wmcmds.AddTail(wmcmd(wc)); } + CommandStrToID["DUMMYSEPARATOR"] = ID_DUMMYSEPARATOR; + CommandStrToID["BUTTONSEP"] = ID_BUTTONSEP; } CAppSettings::~CAppSettings() @@ -1130,6 +1140,9 @@ void CAppSettings::SaveSettings() pApp->WriteProfileInt(IDS_R_SETTINGS, IDS_RS_LOGGING, bEnableLogging); pApp->WriteProfileInt(IDS_R_SETTINGS, IDS_RS_USE_LEGACY_TOOLBAR, bUseLegacyToolbar); + CString toolbarLayout; + pApp->WriteProfileString(IDS_R_SETTINGS, IDS_RS_TOOLBAR_LAYOUT, toolbarLayout <<= toolBarLayout); + VERIFY(pApp->WriteProfileInt(IDS_R_SETTINGS, IDS_RS_SUBTITLE_RENDERER, static_cast(eSubtitleRenderer))); @@ -1949,6 +1962,14 @@ void CAppSettings::LoadSettings() bEnableLogging = !!pApp->GetProfileInt(IDS_R_SETTINGS, IDS_RS_LOGGING, FALSE); bUseLegacyToolbar = !!pApp->GetProfileInt(IDS_R_SETTINGS, IDS_RS_USE_LEGACY_TOOLBAR, FALSE); + { + CString temp = pApp->GetProfileString(IDS_R_SETTINGS, IDS_RS_TOOLBAR_LAYOUT); + if (temp.IsEmpty()) { + temp = "<|PLAY_PLAY|-1|><|PLAY_PAUSE|-1|><|PLAY_STOP|-1|><|BUTTONSEP|-1|><|NAVIGATE_SKIPBACK|-1|><|PLAY_DECRATE|-1|><|PLAY_INCRATE|-1|><|NAVIGATE_SKIPFORWARD|-1|><|BUTTONSEP|-1|><|PLAY_FRAMESTEP|-1|><|BUTTONSEP|-1|><|DUMMYSEPARATOR|-1|><|VOLUME_MUTE|-1|>"; + } + toolBarLayout <<= temp; + } + eSubtitleRenderer = static_cast(pApp->GetProfileInt(IDS_R_SETTINGS, IDS_RS_SUBTITLE_RENDERER, static_cast(SubtitleRenderer::INTERNAL))); diff --git a/src/mpc-hc/AppSettings.h b/src/mpc-hc/AppSettings.h index efa0ae60d71..57a21ced0a5 100644 --- a/src/mpc-hc/AppSettings.h +++ b/src/mpc-hc/AppSettings.h @@ -31,6 +31,7 @@ #include "../filters/renderer/VideoRenderers/RenderersSettings.h" #include "SettingsDefines.h" #include "Shaders.h" +#include "MPCToolbarLayout.h" #include #include @@ -262,6 +263,7 @@ struct AutoChangeFullscreenMode { }; struct wmcmd_base : public ACCEL { + const char* cmdidStr; BYTE mouse; BYTE mouseFS; BYTE mouseVirt; @@ -294,9 +296,8 @@ struct wmcmd_base : public ACCEL { }; wmcmd_base() - : ACCEL( { - 0, 0, 0 - }) + : cmdidStr("") + , ACCEL{ 0, 0, 0 } , mouse(NONE) , mouseFS(NONE) , mouseVirt(0) @@ -304,8 +305,9 @@ struct wmcmd_base : public ACCEL { , dwname(0) , appcmd(0) {} - constexpr wmcmd_base(WORD _cmd, WORD _key, BYTE _fVirt, DWORD _dwname, UINT _appcmd = 0, BYTE _mouse = NONE, BYTE _mouseFS = NONE, BYTE _mouseVirt = 0, BYTE _mouseFSVirt = 0) - : ACCEL{ _fVirt, _key, _cmd } + constexpr wmcmd_base(const char *_cmdidStr, WORD _cmd, WORD _key, BYTE _fVirt, DWORD _dwname, UINT _appcmd = 0, BYTE _mouse = NONE, BYTE _mouseFS = NONE, BYTE _mouseVirt = 0, BYTE _mouseFSVirt = 0) + : cmdidStr(_cmdidStr) + , ACCEL{ _fVirt, _key, _cmd } , mouse(_mouse) , mouseFS(_mouseFS) , mouseVirt(_mouseVirt) @@ -496,6 +498,8 @@ class CAppSettings // cmdline params UINT64 nCLSwitches; CAtlList slFiles, slDubs, slSubs, slFilters; + static std::map CommandStrToID; + static std::map CommandIDToWMCMD; // Initial position (used by command line flags) REFERENCE_TIME rtShift; @@ -816,6 +820,7 @@ class CAppSettings bool bEnableLogging; bool bUseLegacyToolbar; + MPCToolbarLayout toolBarLayout; bool IsD3DFullscreen() const; CString SelectedAudioRenderer() const; diff --git a/src/mpc-hc/PlayerToolBar.cpp b/src/mpc-hc/PlayerToolBar.cpp index 4760800d9ef..01ba17e5071 100644 --- a/src/mpc-hc/PlayerToolBar.cpp +++ b/src/mpc-hc/PlayerToolBar.cpp @@ -34,12 +34,18 @@ // CPlayerToolBar +#define USE_LEGACY_TOOLBAR 0 + IMPLEMENT_DYNAMIC(CPlayerToolBar, CToolBar) CPlayerToolBar::CPlayerToolBar(CMainFrame* pMainFrame) : m_pMainFrame(pMainFrame) , m_nButtonHeight(16) , m_volumeMinSizeInc(0) , mouseDown(false) + , volumeButtonIndex(12) + , dummyButtonIndex(11) + , flexibleSpaceIndex(10) + , useFlexibleSpace(true) { GetEventd().Connect(m_eventc, { MpcEvent::DPI_CHANGED, @@ -51,7 +57,7 @@ CPlayerToolBar::~CPlayerToolBar() { } -bool CPlayerToolBar::LoadExternalToolBar(CImage& image, bool useColor) +bool CPlayerToolBar::LoadExternalToolBar(CImage& image, bool useColor, bool dynamicIcons /*=false*/) { // Paths and extensions to try (by order of preference) std::vector paths({ PathUtils::GetProgramPath() }); @@ -59,7 +65,6 @@ bool CPlayerToolBar::LoadExternalToolBar(CImage& image, bool useColor) if (AfxGetMyApp()->GetAppDataPath(appDataPath)) { paths.emplace_back(appDataPath); } - const std::vector extensions({ _T("png"), _T("bmp") }); CString basetbname; if (AppIsThemeLoaded()) { basetbname = _T("toolbar_dark."); @@ -71,6 +76,10 @@ bool CPlayerToolBar::LoadExternalToolBar(CImage& image, bool useColor) basetbname = _T("color_") + basetbname; } + if (dynamicIcons) { + basetbname = _T("dynamic_") + basetbname; + } + // TODO: Find a better solution? float dpiScaling = (float)std::min(m_pMainFrame->m_dpi.ScaleFactorX(), m_pMainFrame->m_dpi.ScaleFactorY()); @@ -79,12 +88,6 @@ bool CPlayerToolBar::LoadExternalToolBar(CImage& image, bool useColor) if (SUCCEEDED(SVGImage::Load(PathUtils::CombinePaths(path, basetbname + _T("svg")), image, dpiScaling))) { return true; } - - for (const auto& ext : extensions) { - if (SUCCEEDED(image.Load(PathUtils::CombinePaths(path, basetbname + ext)))) { - return true; - } - } } return false; @@ -98,10 +101,11 @@ void CPlayerToolBar::LoadToolbarImage() float svgscale = targetsize / 16.0f; CImage image, themedImage, origImage; + CImage dynamicButtonsImage, dynamicThemedButtonsImage, dynamicOrigImage; m_pButtonsImages.reset(); m_pDisabledButtonsImages.reset(); - bool colorToolbar = false, toolbarImageLoaded = false; + bool colorToolbar = false, toolbarImageLoaded = false, dynamicButtonsImageLoaded=false; if (LoadExternalToolBar(origImage, true)) { colorToolbar = true; toolbarImageLoaded = true; @@ -109,13 +113,28 @@ void CPlayerToolBar::LoadToolbarImage() toolbarImageLoaded = true; } - if (toolbarImageLoaded || (!AfxGetAppSettings().bUseLegacyToolbar && SUCCEEDED(SVGImage::Load(IDF_SVG_TOOLBAR, origImage, svgscale)))) { + if (toolbarImageLoaded || SUCCEEDED(SVGImage::Load(IDF_SVG_TOOLBAR, origImage, svgscale))) { + if (0 == USE_LEGACY_TOOLBAR && LoadExternalToolBar(dynamicOrigImage, colorToolbar, true)) { + if (dynamicOrigImage.GetHeight() == origImage.GetHeight() && 0 == dynamicOrigImage.GetWidth() % origImage.GetHeight()) { + dynamicButtonsImageLoaded = true; + } else { + dynamicButtonsImageLoaded = false; + } + } + if (AppIsThemeLoaded() && colorToolbar == false) { ImageGrayer::UpdateColor(origImage, themedImage, false, ImageGrayer::mpcMono); image = themedImage; + if (dynamicButtonsImageLoaded) { + ImageGrayer::UpdateColor(dynamicOrigImage, dynamicThemedButtonsImage, false, ImageGrayer::mpcMono); + dynamicButtonsImage = dynamicThemedButtonsImage; + } } else { image = origImage; + dynamicButtonsImage = dynamicOrigImage; } + CImage imageDisabled; + bool createdDisabledImage = false; CBitmap* bmp = CBitmap::FromHandle(image); int width = image.GetWidth(); int height = image.GetHeight(); @@ -127,34 +146,91 @@ void CPlayerToolBar::LoadToolbarImage() m_pButtonsImages.reset(DEBUG_NEW CImageList()); if (bpp == 32) { m_pButtonsImages->Create(height, height, ILC_COLOR32 | ILC_MASK, 1, 0); - m_pButtonsImages->Add(bmp, nullptr); // alpha is the mask - - if (colorToolbar == false) {//if color toolbar, we assume the imagelist can grey itself nicely, rather than using imagegrayer - CImage imageDisabled; - if (ImageGrayer::UpdateColor(origImage, imageDisabled, true, AppIsThemeLoaded() ? ImageGrayer::mpcMono : ImageGrayer::classicGrayscale)) { - m_pDisabledButtonsImages.reset(DEBUG_NEW CImageList()); - m_pDisabledButtonsImages->Create(height, height, ILC_COLOR32 | ILC_MASK, 1, 0); - m_pDisabledButtonsImages->Add(CBitmap::FromHandle(imageDisabled), nullptr); // alpha is the mask - imageDisabled.Destroy(); - } else { - m_pDisabledButtonsImages = nullptr; - } + } else { + m_pButtonsImages->Create(height, height, ILC_COLOR24 | ILC_MASK, 1, 0); + } + + if (USE_LEGACY_TOOLBAR) { + if (bpp == 32) { + m_pButtonsImages->Add(bmp, nullptr); // alpha is the mask } else { - m_pDisabledButtonsImages = nullptr; + m_pButtonsImages->Add(bmp, RGB(255, 0, 255)); + } + if (colorToolbar == false && bpp == 32) {//if color toolbar, we assume the imagelist can gray itself nicely, rather than using imagegrayer + createdDisabledImage = ImageGrayer::UpdateColor(origImage, imageDisabled, true, AppIsThemeLoaded() ? ImageGrayer::mpcMono : ImageGrayer::classicGrayscale); + } + } else { //dynamic toolbar + CImage dynamicToolbar; + int dynamicWidth = width; + if (dynamicButtonsImageLoaded) { + dynamicWidth += dynamicButtonsImage.GetWidth(); } + dynamicToolbar.Create(dynamicWidth, height, bpp, 32 == bpp ? CImage::createAlphaChannel : 0); + + CBitmap* pOldTargetBmp = nullptr; + CBitmap* pOldSourceBmp = nullptr; + + CDC targetDC; + CDC sourceDC; + CDC* pDC = this->GetDC(); + targetDC.CreateCompatibleDC(pDC); + sourceDC.CreateCompatibleDC(pDC); + pOldTargetBmp = targetDC.SelectObject(CBitmap::FromHandle(dynamicToolbar)); + pOldSourceBmp = sourceDC.GetCurrentBitmap(); + + sourceDC.SelectObject(CBitmap::FromHandle(image)); + targetDC.BitBlt(0, 0, image.GetWidth(), height, &sourceDC, 0, 0, SRCCOPY); + + if (dynamicButtonsImageLoaded) { + sourceDC.SelectObject(CBitmap::FromHandle(dynamicButtonsImage)); + targetDC.BitBlt(image.GetWidth(), 0, dynamicButtonsImage.GetWidth(), height, &sourceDC, 0, 0, SRCCOPY); + } + + sourceDC.SelectObject(pOldSourceBmp); + targetDC.SelectObject(pOldTargetBmp); + + sourceDC.DeleteDC(); + targetDC.DeleteDC(); + + ReleaseDC(pDC); + + if (32 == bpp) { + m_pButtonsImages->Add(CBitmap::FromHandle(dynamicToolbar), nullptr); + } else { + m_pButtonsImages->Add(CBitmap::FromHandle(dynamicToolbar), RGB(255, 0, 255)); + } + dynamicToolbar.Save(_T("c:\\temp\\toolbar.bmp")); + if (colorToolbar == false && bpp == 32) {//if color toolbar, we assume the imagelist can gray itself nicely, rather than using imagegrayer + createdDisabledImage = ImageGrayer::UpdateColor(dynamicToolbar, imageDisabled, true, AppIsThemeLoaded() ? ImageGrayer::mpcMono : ImageGrayer::classicGrayscale); + } + dynamicToolbar.Destroy(); + } + if (createdDisabledImage) { + m_pDisabledButtonsImages.reset(DEBUG_NEW CImageList()); + m_pDisabledButtonsImages->Create(height, height, ILC_COLOR32 | ILC_MASK, 1, 0); + m_pDisabledButtonsImages->Add(CBitmap::FromHandle(imageDisabled), nullptr); // alpha is the mask + imageDisabled.Destroy(); } else { - m_pButtonsImages->Create(height, height, ILC_COLOR24 | ILC_MASK, 1, 0); - m_pButtonsImages->Add(bmp, RGB(255, 0, 255)); + m_pDisabledButtonsImages = nullptr; } + m_nButtonHeight = height; + GetToolBarCtrl().SetImageList(m_pButtonsImages.get()); GetToolBarCtrl().SetDisabledImageList(m_pDisabledButtonsImages.get()); } if (themedImage) { themedImage.Destroy(); } + if (dynamicThemedButtonsImage) { + dynamicThemedButtonsImage.Destroy(); + } } origImage.Destroy(); + if (dynamicOrigImage) { + dynamicOrigImage.Destroy(); + } + } BOOL CPlayerToolBar::Create(CWnd* pParentWnd) @@ -164,17 +240,9 @@ BOOL CPlayerToolBar::Create(CWnd* pParentWnd) WS_CHILD | WS_VISIBLE | CBRS_BOTTOM /*| CBRS_TOOLTIPS*/, CRect(2, 2, 0, 1))); - VERIFY(LoadToolBar(IDB_PLAYERTOOLBAR)); - - // Should never be RTLed - ModifyStyleEx(WS_EX_LAYOUTRTL, WS_EX_NOINHERITLAYOUT); + auto& s = AfxGetAppSettings(); CToolBarCtrl& tb = GetToolBarCtrl(); - tb.DeleteButton(tb.GetButtonCount() - 1); - tb.DeleteButton(tb.GetButtonCount() - 1); - - SetMute(AfxGetAppSettings().fMute); - UINT styles[] = { TBBS_CHECKGROUP, TBBS_CHECKGROUP, TBBS_CHECKGROUP, TBBS_SEPARATOR, @@ -186,15 +254,96 @@ BOOL CPlayerToolBar::Create(CWnd* pParentWnd) TBBS_CHECKBOX, }; - for (int i = 0; i < _countof(styles); ++i) { - // This fixes missing separator in Win 7 - if (styles[i] & TBBS_SEPARATOR) { - SetButtonInfo(i, GetItemID(i), styles[i], -1); - } else { - SetButtonStyle(i, styles[i] | TBBS_DISABLED); + if (USE_LEGACY_TOOLBAR) { + VERIFY(LoadToolBar(IDB_PLAYERTOOLBAR)); + tb.DeleteButton(tb.GetButtonCount() - 1); + tb.DeleteButton(tb.GetButtonCount() - 1); + + for (int i = 0; i < _countof(styles); ++i) { + // This fixes missing separator in Win 7 + if (styles[i] & TBBS_SEPARATOR) { + SetButtonInfo(i, GetItemID(i), styles[i], -1); + } else { + SetButtonStyle(i, styles[i] | TBBS_DISABLED); + } + } + } else { + CToolBar legacyTB; + legacyTB.CreateEx(pParentWnd, TBSTYLE_FLAT, WS_CHILD, CRect(2, 2, 0, 1)); + VERIFY(legacyTB.LoadToolBar(IDB_PLAYERTOOLBAR)); + auto& ltbCtrl = legacyTB.GetToolBarCtrl(); + ASSERT(ltbCtrl.GetButtonCount() == 15); + + idToLegacyButtonIndex.clear(); + dummyButtonIndex = -1; + volumeButtonIndex = -1; + flexibleSpaceIndex = -1; + useFlexibleSpace = false; //can be enabled with right conditions: ID_DUMMYSEPARATOR placed directly before ID_VOLUME_MUTE + + for (int i = 0; i < ltbCtrl.GetButtonCount(); i++) { + TBBUTTON button; + ltbCtrl.GetButton(i, &button); + idToLegacyButtonIndex[button.idCommand] = i; + } + + auto addLegacyButton = [&](int cmdid) { + int legacyButtonIndex = idToLegacyButtonIndex[cmdid]; + TBBUTTON lb; + ltbCtrl.GetButton(legacyButtonIndex, &lb); + + tb.AddButtons(1, &lb); + SetButtonStyle(tb.GetButtonCount() - 1, styles[legacyButtonIndex] | TBBS_DISABLED); + if (cmdid == ID_VOLUME_MUTE) { + volumeButtonIndex = tb.GetButtonCount() - 1; + if (dummyButtonIndex == volumeButtonIndex -1) { + flexibleSpaceIndex = dummyButtonIndex - 1; + useFlexibleSpace = true; + } + } else if (cmdid == ID_DUMMYSEPARATOR) { + dummyButtonIndex = tb.GetButtonCount() - 1; + } + }; + + auto addSeparator = [&]() { + TBBUTTON button = { 0 }; + button.iBitmap = -1; + button.iString = -1; + button.fsStyle = BTNS_SEP; + tb.AddButtons(1, &button); + }; + + auto addDynamicButton = [&](int cmdid, int index) { + TBBUTTON button = { 0 }; + button.iBitmap = index; + button.idCommand = cmdid; + button.iString = -1; + button.fsStyle = BTNS_BUTTON; + tb.AddButtons(1, &button); + SetButtonStyle(tb.GetButtonCount()-1, TBBS_BUTTON | TBBS_DISABLED); + }; + + for (std::vector::size_type i = 0; i < s.toolBarLayout.buttons.size(); ++i) { + int cmdid = s.toolBarLayout.buttons[i]; + int svgIndex = s.toolBarLayout.SVGIndex[i]; + if (cmdid == ID_BUTTONSEP) { + addSeparator(); + } else if (cmdid == ID_DUMMYSEPARATOR || (idToLegacyButtonIndex.count(cmdid) > 0 && svgIndex == -1)) { //is a legacy button included in toolbar.svg, or is special case dummyseparator + addLegacyButton(cmdid); + } else if (!useFlexibleSpace) { //any command not included in legacy toolbar.svg. if we've already passed the spacer for volume, ignore it as there's nowhere to put it + addDynamicButton(cmdid, svgIndex); + } + int xxx = tb.GetButtonCount(); + xxx = 1; } + + ltbCtrl.DestroyWindow(); } + // Should never be RTLed + ModifyStyleEx(WS_EX_LAYOUTRTL, WS_EX_NOINHERITLAYOUT); + + SetMute(AfxGetAppSettings().fMute); + m_volctrl.Create(this); m_volctrl.SetRange(0, 100); @@ -213,8 +362,7 @@ BOOL CPlayerToolBar::Create(CWnd* pParentWnd) return TRUE; } -void CPlayerToolBar::ArrangeControls() -{ +void CPlayerToolBar::ArrangeControls() { if (!::IsWindow(m_volctrl.m_hWnd)) { return; } @@ -224,9 +372,6 @@ void CPlayerToolBar::ArrangeControls() CRect br = GetBorders(); - CRect r10; - GetItemRect(10, &r10); - CRect vr(r.right + br.right - 60, r.top - 2, r.right + br.right + 6, r.bottom); m_volctrl.MoveWindow(vr); @@ -237,33 +382,41 @@ void CPlayerToolBar::ArrangeControls() vr.left -= m_volumeMinSizeInc = MulDiv(thumbRect.Height(), 50, 19) - 50; m_volctrl.MoveWindow(vr); - UINT nID; - UINT nStyle; - int iImage; - GetButtonInfo(12, nID, nStyle, iImage); - SetButtonInfo(11, GetItemID(11), TBBS_SEPARATOR, vr.left - iImage - r10.right - (r10.bottom - r10.top) + 11); + if (useFlexibleSpace) { + UINT nID; + UINT nStyle; + int iImage; + + CRect rFlexible; + GetItemRect(flexibleSpaceIndex, &rFlexible); + + GetButtonInfo(volumeButtonIndex, nID, nStyle, iImage); + SetButtonInfo(dummyButtonIndex, GetItemID(dummyButtonIndex), TBBS_SEPARATOR, vr.left - iImage - rFlexible.right - (rFlexible.bottom - rFlexible.top) + 11); + } } -void CPlayerToolBar::SetMute(bool fMute) -{ +void CPlayerToolBar::SetMute(bool fMute) { CToolBarCtrl& tb = GetToolBarCtrl(); - TBBUTTONINFO bi; - bi.cbSize = sizeof(bi); - bi.dwMask = TBIF_IMAGE; - bi.iImage = fMute ? 13 : 12; - tb.SetButtonInfo(ID_VOLUME_MUTE, &bi); + TBBUTTONINFO bi = { sizeof(bi) }; + if (-1 != tb.GetButtonInfo(ID_VOLUME_MUTE, &bi)) {//volume icon may not appear if dynamic toolbar + bi.dwMask = TBIF_IMAGE; + bi.iImage = fMute ? volumeButtonIndex+1 : volumeButtonIndex; + tb.SetButtonInfo(ID_VOLUME_MUTE, &bi); + } AfxGetAppSettings().fMute = fMute; } bool CPlayerToolBar::IsMuted() const { CToolBarCtrl& tb = GetToolBarCtrl(); - TBBUTTONINFO bi; - bi.cbSize = sizeof(bi); - bi.dwMask = TBIF_IMAGE; - tb.GetButtonInfo(ID_VOLUME_MUTE, &bi); - return (bi.iImage == 13); + TBBUTTONINFO bi = { sizeof(bi) }; + if (-1 != tb.GetButtonInfo(ID_VOLUME_MUTE, &bi)) {//volume icon may not appear if dynamic toolbar + bi.dwMask = TBIF_IMAGE; + tb.GetButtonInfo(ID_VOLUME_MUTE, &bi); + return (bi.iImage == volumeButtonIndex+1); + } + return AfxGetAppSettings().fMute; } int CPlayerToolBar::GetVolume() const @@ -377,7 +530,7 @@ void CPlayerToolBar::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) CDC dc; dc.Attach(pTBCD->nmcd.hdc); RECT r; - GetItemRect(11, &r); + GetItemRect(dummyButtonIndex, &r); if (AppIsThemeLoaded()) { dc.FillSolidRect(&r, CMPCTheme::PlayerBGColor); } else { @@ -483,7 +636,7 @@ void CPlayerToolBar::OnLButtonDown(UINT nFlags, CPoint point) int CPlayerToolBar::getHitButtonIdx(CPoint point) { - int hit = -1; // -1 means not on any buttons, mute button is 12/13, others < 10, 11 is empty space between + int hit = -1; // -1 means not on any buttons, mute button is 12/13, others < 10, 11 is empty space between (adipose: dynamic toolbar positions may differ) CRect r; for (int i = 0, j = GetToolBarCtrl().GetButtonCount(); i < j; i++) { @@ -502,12 +655,15 @@ BOOL CPlayerToolBar::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) { TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR; - UINT_PTR nID = pNMHDR->idFrom; + int nID; if (pTTT->uFlags & TTF_IDISHWND) { - nID = ::GetDlgCtrlID((HWND)nID); + nID = ::GetDlgCtrlID((HWND)pNMHDR->idFrom); + } else { + nID = (int)pNMHDR->idFrom; } - - if (nID != ID_VOLUME_MUTE) { + const auto& s = AfxGetAppSettings(); + auto& buttonIDs = s.toolBarLayout.buttons; + if (nID != ID_VOLUME_MUTE && std::find(buttonIDs.begin(),buttonIDs.end(),nID) == buttonIDs.end()) { return FALSE; } CToolBarCtrl& tb = GetToolBarCtrl(); @@ -515,14 +671,22 @@ BOOL CPlayerToolBar::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) TBBUTTONINFO bi; bi.cbSize = sizeof(bi); bi.dwMask = TBIF_IMAGE; - tb.GetButtonInfo(ID_VOLUME_MUTE, &bi); + if (-1 == tb.GetButtonInfo(nID, &bi)) { //should only fail if they choose not to show volume button + return FALSE; + } static CString strTipText; - if (bi.iImage == 12) { + if (nID != ID_VOLUME_MUTE) { //handle any buttons that don't exist on legacy toolbar + if (idToLegacyButtonIndex.count(nID) == 0 && s.CommandIDToWMCMD.count(nID) > 0) { + strTipText.LoadString(s.CommandIDToWMCMD[nID]->dwname); + } else { + return FALSE; + } + } else if (bi.iImage == volumeButtonIndex) { strTipText.LoadString(ID_VOLUME_MUTE); - } else if (bi.iImage == 13) { + } else if (bi.iImage == volumeButtonIndex+1) { strTipText.LoadString(ID_VOLUME_MUTE_OFF); - } else if (bi.iImage == 14) { + } else if (bi.iImage == volumeButtonIndex+2) { strTipText.LoadString(ID_VOLUME_MUTE_DISABLED); } else { return FALSE; diff --git a/src/mpc-hc/PlayerToolBar.h b/src/mpc-hc/PlayerToolBar.h index 1b90a75fa41..4789cfa98c4 100644 --- a/src/mpc-hc/PlayerToolBar.h +++ b/src/mpc-hc/PlayerToolBar.h @@ -23,6 +23,7 @@ #include "VolumeCtrl.h" #include "CMPCThemeToolTipCtrl.h" +#include "MPCToolbarLayout.h" #include @@ -46,16 +47,19 @@ class CPlayerToolBar : public CToolBar int m_nButtonHeight; std::unique_ptr m_pButtonsImages; std::unique_ptr m_pDisabledButtonsImages; + int m_volumeMinSizeInc; EventClient m_eventc; void EventCallback(MpcEvent ev); - + std::map idToLegacyButtonIndex; //holds a map of cmdids -> button index into toolbar.svg + int volumeButtonIndex, dummyButtonIndex, flexibleSpaceIndex; + bool useFlexibleSpace; public: CPlayerToolBar(CMainFrame* pMainFrame); virtual ~CPlayerToolBar(); - bool LoadExternalToolBar(CImage& image, bool useColor); + bool LoadExternalToolBar(CImage& image, bool useColor, bool dynamicIcons = false); int GetVolume() const; int GetMinWidth() const; diff --git a/src/mpc-hc/SettingsDefines.h b/src/mpc-hc/SettingsDefines.h index 525b2113df5..adde91ab96d 100644 --- a/src/mpc-hc/SettingsDefines.h +++ b/src/mpc-hc/SettingsDefines.h @@ -333,6 +333,8 @@ #define IDS_RS_COVER_ART_SIZE_LIMIT _T("CoverArtSizeLimit") #define IDS_RS_LOGGING _T("EnableLogging") #define IDS_RS_USE_LEGACY_TOOLBAR _T("UseLegacyToolbar") +#define IDS_RS_TOOLBAR_LAYOUT _T("ToolbarLayout") + #define IDS_RS_SUBTITLE_RENDERER _T("SubtitleRenderer") diff --git a/src/mpc-hc/mpc-hc.vcxproj b/src/mpc-hc/mpc-hc.vcxproj index 893951e91a4..e74ff2f8551 100644 --- a/src/mpc-hc/mpc-hc.vcxproj +++ b/src/mpc-hc/mpc-hc.vcxproj @@ -226,6 +226,7 @@ + @@ -416,6 +417,7 @@ + @@ -803,4 +805,4 @@ - + \ No newline at end of file diff --git a/src/mpc-hc/mpc-hc.vcxproj.filters b/src/mpc-hc/mpc-hc.vcxproj.filters index ae2dd00a3aa..fedda234aef 100644 --- a/src/mpc-hc/mpc-hc.vcxproj.filters +++ b/src/mpc-hc/mpc-hc.vcxproj.filters @@ -608,6 +608,9 @@ Toolbars + + Toolbars + @@ -1149,6 +1152,9 @@ Toolbars + + Toolbars + From 2a429b59c1f39063f4ff1b77b00bedad805c97e6 Mon Sep 17 00:00:00 2001 From: adipose <3324395+adipose@users.noreply.github.com> Date: Mon, 22 Mar 2021 11:23:05 -0700 Subject: [PATCH 2/9] add support for buttons.svg with multiple styles; remove code for arbitrary commands --- src/mpc-hc/AppSettings.cpp | 2 +- src/mpc-hc/PlayerToolBar.cpp | 320 ++++++++++++----------------------- src/mpc-hc/PlayerToolBar.h | 4 +- src/mpc-hc/res/buttons.svg | 162 ++++++++++++++++++ src/mpc-hc/res/mpc-hc.rc2 | Bin 20396 -> 20550 bytes src/mpc-hc/resource.h | 1 + 6 files changed, 277 insertions(+), 212 deletions(-) create mode 100644 src/mpc-hc/res/buttons.svg diff --git a/src/mpc-hc/AppSettings.cpp b/src/mpc-hc/AppSettings.cpp index fbf38c08572..8bf9ad31444 100644 --- a/src/mpc-hc/AppSettings.cpp +++ b/src/mpc-hc/AppSettings.cpp @@ -1965,7 +1965,7 @@ void CAppSettings::LoadSettings() { CString temp = pApp->GetProfileString(IDS_R_SETTINGS, IDS_RS_TOOLBAR_LAYOUT); if (temp.IsEmpty()) { - temp = "<|PLAY_PLAY|-1|><|PLAY_PAUSE|-1|><|PLAY_STOP|-1|><|BUTTONSEP|-1|><|NAVIGATE_SKIPBACK|-1|><|PLAY_DECRATE|-1|><|PLAY_INCRATE|-1|><|NAVIGATE_SKIPFORWARD|-1|><|BUTTONSEP|-1|><|PLAY_FRAMESTEP|-1|><|BUTTONSEP|-1|><|DUMMYSEPARATOR|-1|><|VOLUME_MUTE|-1|>"; + temp = _T(""); } toolBarLayout <<= temp; } diff --git a/src/mpc-hc/PlayerToolBar.cpp b/src/mpc-hc/PlayerToolBar.cpp index 01ba17e5071..cd65b7e2369 100644 --- a/src/mpc-hc/PlayerToolBar.cpp +++ b/src/mpc-hc/PlayerToolBar.cpp @@ -34,7 +34,32 @@ // CPlayerToolBar -#define USE_LEGACY_TOOLBAR 0 +static std::map supportedButtons = { + {ID_PLAY_PLAY, 0}, + {ID_PLAY_PAUSE, 1}, + {ID_PLAY_STOP, 2}, + {ID_NAVIGATE_SKIPBACK, 4}, + {ID_PLAY_DECRATE, 5}, + {ID_PLAY_INCRATE, 6}, + {ID_NAVIGATE_SKIPFORWARD, 7}, + {ID_PLAY_FRAMESTEP, 9}, + {ID_DUMMYSEPARATOR, 11}, + {ID_VOLUME_MUTE, 12}, +}; + +static UINT styles[] = { + TBBS_CHECKGROUP, + TBBS_CHECKGROUP, + TBBS_CHECKGROUP, + TBBS_BUTTON, + TBBS_BUTTON, + TBBS_BUTTON, + TBBS_BUTTON, + TBBS_BUTTON, + TBBS_SEPARATOR, + TBBS_CHECKBOX, +}; + IMPLEMENT_DYNAMIC(CPlayerToolBar, CToolBar) CPlayerToolBar::CPlayerToolBar(CMainFrame* pMainFrame) @@ -57,7 +82,7 @@ CPlayerToolBar::~CPlayerToolBar() { } -bool CPlayerToolBar::LoadExternalToolBar(CImage& image, bool useColor, bool dynamicIcons /*=false*/) +bool CPlayerToolBar::LoadExternalToolBar(CImage& image, float svgscale) { // Paths and extensions to try (by order of preference) std::vector paths({ PathUtils::GetProgramPath() }); @@ -66,26 +91,11 @@ bool CPlayerToolBar::LoadExternalToolBar(CImage& image, bool useColor, bool dyna paths.emplace_back(appDataPath); } CString basetbname; - if (AppIsThemeLoaded()) { - basetbname = _T("toolbar_dark."); - } else { - basetbname = _T("toolbar."); - } - - if (useColor) { - basetbname = _T("color_") + basetbname; - } - - if (dynamicIcons) { - basetbname = _T("dynamic_") + basetbname; - } - - // TODO: Find a better solution? - float dpiScaling = (float)std::min(m_pMainFrame->m_dpi.ScaleFactorX(), m_pMainFrame->m_dpi.ScaleFactorY()); + basetbname = _T("buttons."); // Try loading the external toolbar for (const auto& path : paths) { - if (SUCCEEDED(SVGImage::Load(PathUtils::CombinePaths(path, basetbname + _T("svg")), image, dpiScaling))) { + if (SUCCEEDED(SVGImage::Load(PathUtils::CombinePaths(path, basetbname + _T("svg")), image, svgscale))) { return true; } } @@ -100,136 +110,82 @@ void CPlayerToolBar::LoadToolbarImage() int targetsize = int(dpiScaling * AfxGetAppSettings().nDefaultToolbarSize); float svgscale = targetsize / 16.0f; - CImage image, themedImage, origImage; - CImage dynamicButtonsImage, dynamicThemedButtonsImage, dynamicOrigImage; + CImage image; + m_pButtonsImages.reset(); m_pDisabledButtonsImages.reset(); - bool colorToolbar = false, toolbarImageLoaded = false, dynamicButtonsImageLoaded=false; - if (LoadExternalToolBar(origImage, true)) { - colorToolbar = true; - toolbarImageLoaded = true; - } else if (LoadExternalToolBar(origImage, false)) { - toolbarImageLoaded = true; + bool buttonsImageLoaded = false; + if (LoadExternalToolBar(image, svgscale) && image.GetHeight() % 4 == 0 && image.GetWidth() % (image.GetHeight()/4) == 0) { + buttonsImageLoaded = true; } - if (toolbarImageLoaded || SUCCEEDED(SVGImage::Load(IDF_SVG_TOOLBAR, origImage, svgscale))) { - if (0 == USE_LEGACY_TOOLBAR && LoadExternalToolBar(dynamicOrigImage, colorToolbar, true)) { - if (dynamicOrigImage.GetHeight() == origImage.GetHeight() && 0 == dynamicOrigImage.GetWidth() % origImage.GetHeight()) { - dynamicButtonsImageLoaded = true; - } else { - dynamicButtonsImageLoaded = false; - } - } - - if (AppIsThemeLoaded() && colorToolbar == false) { - ImageGrayer::UpdateColor(origImage, themedImage, false, ImageGrayer::mpcMono); - image = themedImage; - if (dynamicButtonsImageLoaded) { - ImageGrayer::UpdateColor(dynamicOrigImage, dynamicThemedButtonsImage, false, ImageGrayer::mpcMono); - dynamicButtonsImage = dynamicThemedButtonsImage; - } - } else { - image = origImage; - dynamicButtonsImage = dynamicOrigImage; - } + if (buttonsImageLoaded || SUCCEEDED(SVGImage::Load(IDF_SVG_BUTTONS, image, svgscale))) { CImage imageDisabled; - bool createdDisabledImage = false; CBitmap* bmp = CBitmap::FromHandle(image); + int width = image.GetWidth(); - int height = image.GetHeight(); + int height = image.GetHeight() / 4; int bpp = image.GetBPP(); - if (width == height * 15) { + if (width % height == 0) { //todo: dynamically determine which buttons are supported by this toolbar, otherwise show generic buttons? // the manual specifies that sizeButton should be sizeImage inflated by (7, 6) SetSizes(CSize(height + 7, height + 6), CSize(height, height)); m_pButtonsImages.reset(DEBUG_NEW CImageList()); - if (bpp == 32) { - m_pButtonsImages->Create(height, height, ILC_COLOR32 | ILC_MASK, 1, 0); - } else { - m_pButtonsImages->Create(height, height, ILC_COLOR24 | ILC_MASK, 1, 0); + m_pButtonsImages->Create(height, height, ILC_COLOR32 | ILC_MASK, 1, 64); + m_pDisabledButtonsImages.reset(DEBUG_NEW CImageList()); + m_pDisabledButtonsImages->Create(height, height, ILC_COLOR32 | ILC_MASK, 1, 64); + + CImage dynamicToolbar, dynamicToolbarDisabled; + + dynamicToolbar.Create(width, height, bpp, CImage::createAlphaChannel); + dynamicToolbarDisabled.Create(width, height, bpp, CImage::createAlphaChannel); + + CBitmap* pOldTargetBmp = nullptr; + CBitmap* pOldSourceBmp = nullptr; + + CDC targetDC; + CDC sourceDC; + CDC* pDC = this->GetDC(); + targetDC.CreateCompatibleDC(pDC); + sourceDC.CreateCompatibleDC(pDC); + pOldTargetBmp = targetDC.SelectObject(CBitmap::FromHandle(dynamicToolbar)); + pOldSourceBmp = sourceDC.GetCurrentBitmap(); + + int imageOffset = 0, imageDisabledOffset=height; + if (AppIsThemeLoaded()) { + imageOffset = height * 2; + imageDisabledOffset = height * 3; } - if (USE_LEGACY_TOOLBAR) { - if (bpp == 32) { - m_pButtonsImages->Add(bmp, nullptr); // alpha is the mask - } else { - m_pButtonsImages->Add(bmp, RGB(255, 0, 255)); - } - if (colorToolbar == false && bpp == 32) {//if color toolbar, we assume the imagelist can gray itself nicely, rather than using imagegrayer - createdDisabledImage = ImageGrayer::UpdateColor(origImage, imageDisabled, true, AppIsThemeLoaded() ? ImageGrayer::mpcMono : ImageGrayer::classicGrayscale); - } - } else { //dynamic toolbar - CImage dynamicToolbar; - int dynamicWidth = width; - if (dynamicButtonsImageLoaded) { - dynamicWidth += dynamicButtonsImage.GetWidth(); - } - dynamicToolbar.Create(dynamicWidth, height, bpp, 32 == bpp ? CImage::createAlphaChannel : 0); - - CBitmap* pOldTargetBmp = nullptr; - CBitmap* pOldSourceBmp = nullptr; + sourceDC.SelectObject(bmp); + targetDC.BitBlt(0, 0, image.GetWidth(), height, &sourceDC, 0, imageOffset, SRCCOPY); - CDC targetDC; - CDC sourceDC; - CDC* pDC = this->GetDC(); - targetDC.CreateCompatibleDC(pDC); - sourceDC.CreateCompatibleDC(pDC); - pOldTargetBmp = targetDC.SelectObject(CBitmap::FromHandle(dynamicToolbar)); - pOldSourceBmp = sourceDC.GetCurrentBitmap(); + targetDC.SelectObject(CBitmap::FromHandle(dynamicToolbarDisabled)); + targetDC.BitBlt(0, 0, image.GetWidth(), height, &sourceDC, 0, imageDisabledOffset, SRCCOPY); - sourceDC.SelectObject(CBitmap::FromHandle(image)); - targetDC.BitBlt(0, 0, image.GetWidth(), height, &sourceDC, 0, 0, SRCCOPY); - if (dynamicButtonsImageLoaded) { - sourceDC.SelectObject(CBitmap::FromHandle(dynamicButtonsImage)); - targetDC.BitBlt(image.GetWidth(), 0, dynamicButtonsImage.GetWidth(), height, &sourceDC, 0, 0, SRCCOPY); - } + sourceDC.SelectObject(pOldSourceBmp); + targetDC.SelectObject(pOldTargetBmp); - sourceDC.SelectObject(pOldSourceBmp); - targetDC.SelectObject(pOldTargetBmp); + sourceDC.DeleteDC(); + targetDC.DeleteDC(); - sourceDC.DeleteDC(); - targetDC.DeleteDC(); + ReleaseDC(pDC); - ReleaseDC(pDC); + m_pButtonsImages->Add(CBitmap::FromHandle(dynamicToolbar), nullptr); + dynamicToolbar.Destroy(); - if (32 == bpp) { - m_pButtonsImages->Add(CBitmap::FromHandle(dynamicToolbar), nullptr); - } else { - m_pButtonsImages->Add(CBitmap::FromHandle(dynamicToolbar), RGB(255, 0, 255)); - } - dynamicToolbar.Save(_T("c:\\temp\\toolbar.bmp")); - if (colorToolbar == false && bpp == 32) {//if color toolbar, we assume the imagelist can gray itself nicely, rather than using imagegrayer - createdDisabledImage = ImageGrayer::UpdateColor(dynamicToolbar, imageDisabled, true, AppIsThemeLoaded() ? ImageGrayer::mpcMono : ImageGrayer::classicGrayscale); - } - dynamicToolbar.Destroy(); - } - if (createdDisabledImage) { - m_pDisabledButtonsImages.reset(DEBUG_NEW CImageList()); - m_pDisabledButtonsImages->Create(height, height, ILC_COLOR32 | ILC_MASK, 1, 0); - m_pDisabledButtonsImages->Add(CBitmap::FromHandle(imageDisabled), nullptr); // alpha is the mask - imageDisabled.Destroy(); - } else { - m_pDisabledButtonsImages = nullptr; - } + m_pDisabledButtonsImages->Add(CBitmap::FromHandle(dynamicToolbarDisabled), nullptr); + dynamicToolbarDisabled.Destroy(); m_nButtonHeight = height; GetToolBarCtrl().SetImageList(m_pButtonsImages.get()); GetToolBarCtrl().SetDisabledImageList(m_pDisabledButtonsImages.get()); } - if (themedImage) { - themedImage.Destroy(); - } - if (dynamicThemedButtonsImage) { - dynamicThemedButtonsImage.Destroy(); - } - } - origImage.Destroy(); - if (dynamicOrigImage) { - dynamicOrigImage.Destroy(); } + image.Destroy(); } @@ -243,100 +199,48 @@ BOOL CPlayerToolBar::Create(CWnd* pParentWnd) auto& s = AfxGetAppSettings(); CToolBarCtrl& tb = GetToolBarCtrl(); - UINT styles[] = { - TBBS_CHECKGROUP, TBBS_CHECKGROUP, TBBS_CHECKGROUP, - TBBS_SEPARATOR, - TBBS_BUTTON, TBBS_BUTTON, TBBS_BUTTON, TBBS_BUTTON, - TBBS_SEPARATOR, - TBBS_BUTTON, - TBBS_SEPARATOR, - TBBS_SEPARATOR, - TBBS_CHECKBOX, - }; - if (USE_LEGACY_TOOLBAR) { - VERIFY(LoadToolBar(IDB_PLAYERTOOLBAR)); - tb.DeleteButton(tb.GetButtonCount() - 1); - tb.DeleteButton(tb.GetButtonCount() - 1); - - for (int i = 0; i < _countof(styles); ++i) { - // This fixes missing separator in Win 7 - if (styles[i] & TBBS_SEPARATOR) { - SetButtonInfo(i, GetItemID(i), styles[i], -1); - } else { - SetButtonStyle(i, styles[i] | TBBS_DISABLED); + dummyButtonIndex = -1; + volumeButtonIndex = -1; + flexibleSpaceIndex = -1; + useFlexibleSpace = false; //can be enabled with right conditions: ID_DUMMYSEPARATOR placed directly before ID_VOLUME_MUTE + + auto addButton = [&](int cmdid, int index) { + TBBUTTON button = { 0 }; + button.iBitmap = index; + button.idCommand = cmdid; + button.iString = -1; + tb.AddButtons(1, &button); + SetButtonStyle(tb.GetButtonCount() - 1, styles[index] | TBBS_DISABLED); + if (cmdid == ID_VOLUME_MUTE) { + volumeButtonIndex = tb.GetButtonCount() - 1; + if (dummyButtonIndex == volumeButtonIndex -1) { + flexibleSpaceIndex = dummyButtonIndex - 1; + useFlexibleSpace = true; } + } else if (cmdid == ID_DUMMYSEPARATOR) { + dummyButtonIndex = tb.GetButtonCount() - 1; } - } else { - CToolBar legacyTB; - legacyTB.CreateEx(pParentWnd, TBSTYLE_FLAT, WS_CHILD, CRect(2, 2, 0, 1)); - VERIFY(legacyTB.LoadToolBar(IDB_PLAYERTOOLBAR)); - auto& ltbCtrl = legacyTB.GetToolBarCtrl(); - ASSERT(ltbCtrl.GetButtonCount() == 15); - - idToLegacyButtonIndex.clear(); - dummyButtonIndex = -1; - volumeButtonIndex = -1; - flexibleSpaceIndex = -1; - useFlexibleSpace = false; //can be enabled with right conditions: ID_DUMMYSEPARATOR placed directly before ID_VOLUME_MUTE - - for (int i = 0; i < ltbCtrl.GetButtonCount(); i++) { - TBBUTTON button; - ltbCtrl.GetButton(i, &button); - idToLegacyButtonIndex[button.idCommand] = i; - } + }; - auto addLegacyButton = [&](int cmdid) { - int legacyButtonIndex = idToLegacyButtonIndex[cmdid]; - TBBUTTON lb; - ltbCtrl.GetButton(legacyButtonIndex, &lb); - - tb.AddButtons(1, &lb); - SetButtonStyle(tb.GetButtonCount() - 1, styles[legacyButtonIndex] | TBBS_DISABLED); - if (cmdid == ID_VOLUME_MUTE) { - volumeButtonIndex = tb.GetButtonCount() - 1; - if (dummyButtonIndex == volumeButtonIndex -1) { - flexibleSpaceIndex = dummyButtonIndex - 1; - useFlexibleSpace = true; - } - } else if (cmdid == ID_DUMMYSEPARATOR) { - dummyButtonIndex = tb.GetButtonCount() - 1; - } - }; - - auto addSeparator = [&]() { - TBBUTTON button = { 0 }; - button.iBitmap = -1; - button.iString = -1; - button.fsStyle = BTNS_SEP; - tb.AddButtons(1, &button); - }; - - auto addDynamicButton = [&](int cmdid, int index) { - TBBUTTON button = { 0 }; - button.iBitmap = index; - button.idCommand = cmdid; - button.iString = -1; - button.fsStyle = BTNS_BUTTON; - tb.AddButtons(1, &button); - SetButtonStyle(tb.GetButtonCount()-1, TBBS_BUTTON | TBBS_DISABLED); - }; - - for (std::vector::size_type i = 0; i < s.toolBarLayout.buttons.size(); ++i) { - int cmdid = s.toolBarLayout.buttons[i]; - int svgIndex = s.toolBarLayout.SVGIndex[i]; + auto addSeparator = [&]() { + TBBUTTON button = { 0 }; + button.iBitmap = -1; + button.iString = -1; + button.fsStyle = BTNS_SEP; + tb.AddButtons(1, &button); + }; + + for (std::vector::size_type i = 0; i < s.toolBarLayout.buttons.size(); ++i) { + int cmdid = s.toolBarLayout.buttons[i]; + if (supportedButtons.count(cmdid)) { + int svgIndex = supportedButtons[cmdid]; if (cmdid == ID_BUTTONSEP) { addSeparator(); - } else if (cmdid == ID_DUMMYSEPARATOR || (idToLegacyButtonIndex.count(cmdid) > 0 && svgIndex == -1)) { //is a legacy button included in toolbar.svg, or is special case dummyseparator - addLegacyButton(cmdid); - } else if (!useFlexibleSpace) { //any command not included in legacy toolbar.svg. if we've already passed the spacer for volume, ignore it as there's nowhere to put it - addDynamicButton(cmdid, svgIndex); + } else if (!useFlexibleSpace) { + addButton(cmdid, svgIndex); } - int xxx = tb.GetButtonCount(); - xxx = 1; } - - ltbCtrl.DestroyWindow(); } // Should never be RTLed @@ -676,8 +580,8 @@ BOOL CPlayerToolBar::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) } static CString strTipText; - if (nID != ID_VOLUME_MUTE) { //handle any buttons that don't exist on legacy toolbar - if (idToLegacyButtonIndex.count(nID) == 0 && s.CommandIDToWMCMD.count(nID) > 0) { + if (nID != ID_VOLUME_MUTE) { + if (s.CommandIDToWMCMD.count(nID) > 0) { strTipText.LoadString(s.CommandIDToWMCMD[nID]->dwname); } else { return FALSE; diff --git a/src/mpc-hc/PlayerToolBar.h b/src/mpc-hc/PlayerToolBar.h index 4789cfa98c4..9cc91d587d7 100644 --- a/src/mpc-hc/PlayerToolBar.h +++ b/src/mpc-hc/PlayerToolBar.h @@ -39,7 +39,6 @@ class CPlayerToolBar : public CToolBar bool IsMuted() const; void SetMute(bool fMute = true); int getHitButtonIdx(CPoint point); - bool LoadExternalToolBar(CImage& image); void LoadToolbarImage(); bool mouseDown; CMPCThemeToolTipCtrl themedToolTip; @@ -52,14 +51,13 @@ class CPlayerToolBar : public CToolBar EventClient m_eventc; void EventCallback(MpcEvent ev); - std::map idToLegacyButtonIndex; //holds a map of cmdids -> button index into toolbar.svg int volumeButtonIndex, dummyButtonIndex, flexibleSpaceIndex; bool useFlexibleSpace; public: CPlayerToolBar(CMainFrame* pMainFrame); virtual ~CPlayerToolBar(); - bool LoadExternalToolBar(CImage& image, bool useColor, bool dynamicIcons = false); + bool LoadExternalToolBar(CImage& image, float svgscale); int GetVolume() const; int GetMinWidth() const; diff --git a/src/mpc-hc/res/buttons.svg b/src/mpc-hc/res/buttons.svg new file mode 100644 index 00000000000..7c37b02ea9a --- /dev/null +++ b/src/mpc-hc/res/buttons.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mpc-hc/res/mpc-hc.rc2 b/src/mpc-hc/res/mpc-hc.rc2 index 08a055dd4519eb24d8a9e723a567fbe836b5b5c9..86d5ae5605182eaac63a159366d3d1ffa78ebd8c 100644 GIT binary patch delta 66 zcmZ28pYhlN#tpYzWjz^O7~B}*8G;$Y7~Fxh6GJFN2oU-+_%Q@eX5> Date: Mon, 22 Mar 2021 11:35:46 -0700 Subject: [PATCH 3/9] fix styles lookup table --- src/mpc-hc/PlayerToolBar.cpp | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/mpc-hc/PlayerToolBar.cpp b/src/mpc-hc/PlayerToolBar.cpp index cd65b7e2369..8476ea8a48e 100644 --- a/src/mpc-hc/PlayerToolBar.cpp +++ b/src/mpc-hc/PlayerToolBar.cpp @@ -48,15 +48,13 @@ static std::map supportedButtons = { }; static UINT styles[] = { - TBBS_CHECKGROUP, - TBBS_CHECKGROUP, - TBBS_CHECKGROUP, - TBBS_BUTTON, - TBBS_BUTTON, - TBBS_BUTTON, - TBBS_BUTTON, + TBBS_CHECKGROUP, TBBS_CHECKGROUP, TBBS_CHECKGROUP, + TBBS_SEPARATOR, + TBBS_BUTTON, TBBS_BUTTON, TBBS_BUTTON, TBBS_BUTTON, + TBBS_SEPARATOR, TBBS_BUTTON, TBBS_SEPARATOR, + TBBS_SEPARATOR, TBBS_CHECKBOX, }; @@ -205,13 +203,13 @@ BOOL CPlayerToolBar::Create(CWnd* pParentWnd) flexibleSpaceIndex = -1; useFlexibleSpace = false; //can be enabled with right conditions: ID_DUMMYSEPARATOR placed directly before ID_VOLUME_MUTE - auto addButton = [&](int cmdid, int index) { + auto addButton = [&](int cmdid, int svgIndex) { TBBUTTON button = { 0 }; - button.iBitmap = index; + button.iBitmap = svgIndex; button.idCommand = cmdid; button.iString = -1; tb.AddButtons(1, &button); - SetButtonStyle(tb.GetButtonCount() - 1, styles[index] | TBBS_DISABLED); + SetButtonStyle(tb.GetButtonCount() - 1, styles[svgIndex] | TBBS_DISABLED); if (cmdid == ID_VOLUME_MUTE) { volumeButtonIndex = tb.GetButtonCount() - 1; if (dummyButtonIndex == volumeButtonIndex -1) { @@ -233,11 +231,11 @@ BOOL CPlayerToolBar::Create(CWnd* pParentWnd) for (std::vector::size_type i = 0; i < s.toolBarLayout.buttons.size(); ++i) { int cmdid = s.toolBarLayout.buttons[i]; - if (supportedButtons.count(cmdid)) { - int svgIndex = supportedButtons[cmdid]; - if (cmdid == ID_BUTTONSEP) { - addSeparator(); - } else if (!useFlexibleSpace) { + if (cmdid == ID_BUTTONSEP) { + addSeparator(); + } else if (!useFlexibleSpace) { + if (supportedButtons.count(cmdid)) { + int svgIndex = supportedButtons[cmdid]; addButton(cmdid, svgIndex); } } From e82ec9e23580a965fd71cdcfa94a72cf0a5d7e76 Mon Sep 17 00:00:00 2001 From: adipose <3324395+adipose@users.noreply.github.com> Date: Fri, 18 Feb 2022 12:22:26 -0800 Subject: [PATCH 4/9] rebuild MPCToolbarLayout as it was never committed previously --- src/mpc-hc/AppSettings.cpp | 2 +- src/mpc-hc/MPCToolbarLayout.cpp | 62 +++++++++++++++++++++++++++++++ src/mpc-hc/MPCToolbarLayout.h | 10 +++++ src/mpc-hc/mpc-hc.vcxproj.filters | 1 - 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 src/mpc-hc/MPCToolbarLayout.cpp create mode 100644 src/mpc-hc/MPCToolbarLayout.h diff --git a/src/mpc-hc/AppSettings.cpp b/src/mpc-hc/AppSettings.cpp index 9321dbc711f..45a471b0dd6 100644 --- a/src/mpc-hc/AppSettings.cpp +++ b/src/mpc-hc/AppSettings.cpp @@ -1995,7 +1995,7 @@ void CAppSettings::LoadSettings() { CString temp = pApp->GetProfileString(IDS_R_SETTINGS, IDS_RS_TOOLBAR_LAYOUT); if (temp.IsEmpty()) { - temp = "<|PLAY_PLAY|-1|><|PLAY_PAUSE|-1|><|PLAY_STOP|-1|><|BUTTONSEP|-1|><|NAVIGATE_SKIPBACK|-1|><|PLAY_DECRATE|-1|><|PLAY_INCRATE|-1|><|NAVIGATE_SKIPFORWARD|-1|><|BUTTONSEP|-1|><|PLAY_FRAMESTEP|-1|><|BUTTONSEP|-1|><|DUMMYSEPARATOR|-1|><|VOLUME_MUTE|-1|>"; + temp = MPCToolbarLayout::defaultLayout; } toolBarLayout <<= temp; } diff --git a/src/mpc-hc/MPCToolbarLayout.cpp b/src/mpc-hc/MPCToolbarLayout.cpp new file mode 100644 index 00000000000..7dcc5d8dc11 --- /dev/null +++ b/src/mpc-hc/MPCToolbarLayout.cpp @@ -0,0 +1,62 @@ +#include "stdafx.h" +#include "MPCToolbarLayout.h" +#include "RegexUtil.h" +#include "AppSettings.h" + + +MPCToolbarLayout& operator <<= (MPCToolbarLayout& tbLayout, const CStringW& strLayout) { + RegexUtil::wregexResults results; + std::wregex tbPattern(LR"(<\|([^<>\|]*)\|([0-9-]*)\|>)"); + tbLayout.buttons.clear(); + tbLayout.SVGIndex.clear(); + RegexUtil::wstringMatch(tbPattern, (const wchar_t*)strLayout, results); + if (results.size() > 0) { + for (RegexUtil::wregexResult tbElement: results) { + if (tbElement.size() == 2) { + int index = -1; + if (StrToInt32(tbElement[1].c_str(), index)) { + int id = -1; + if (tbElement[0] == L"BUTTONSEP") { + id = ID_BUTTONSEP; + } else if (tbElement[0] == L"DUMMYSEPARATOR") { + id = ID_DUMMYSEPARATOR; + } else if (CAppSettings::CommandStrToID.count(tbElement[0].c_str()) > 0) { + id = CAppSettings::CommandStrToID[tbElement[0].c_str()]; + } + if (-1 != id) { + tbLayout.buttons.push_back(id); + tbLayout.SVGIndex.push_back(index); + } + } + } + } + } + + return tbLayout; +} + +CStringW& operator <<= (CStringW& strLayout, const MPCToolbarLayout& tbLayout) { + if (tbLayout.buttons.size() > 0 && tbLayout.SVGIndex.size() == tbLayout.buttons.size()) { + strLayout = L""; + for (std::vector::size_type i = 0; i < tbLayout.buttons.size(); ++i) { + int button = tbLayout.buttons[i]; + if (CAppSettings::CommandIDToWMCMD.count(button) || button==ID_BUTTONSEP || button==ID_DUMMYSEPARATOR) { + CStringW t; + int idx = tbLayout.SVGIndex[i]; + if (button == ID_BUTTONSEP) { + t.Format(L"<|BUTTONSEP|%d|>", idx); + } else if (button == ID_DUMMYSEPARATOR) { + t.Format(L"<|DUMMYSEPARATOR|%d|>", idx); + } else { + const char* cmdStr = CAppSettings::CommandIDToWMCMD[button]->cmdidStr; + t.Format(L"<|%hs|%d|>", cmdStr, idx); + } + strLayout += t; + } + } + } else { + strLayout = MPCToolbarLayout::defaultLayout; + } + + return strLayout; +} diff --git a/src/mpc-hc/MPCToolbarLayout.h b/src/mpc-hc/MPCToolbarLayout.h new file mode 100644 index 00000000000..feec73200a9 --- /dev/null +++ b/src/mpc-hc/MPCToolbarLayout.h @@ -0,0 +1,10 @@ +#pragma once + +class MPCToolbarLayout { +public: + std::vector buttons; + std::vector SVGIndex; + static constexpr wchar_t *defaultLayout = L"<|PLAY_PLAY|-1|><|PLAY_PAUSE|-1|><|PLAY_STOP|-1|><|BUTTONSEP|-1|><|NAVIGATE_SKIPBACK|-1|><|PLAY_DECRATE|-1|><|PLAY_INCRATE|-1|><|NAVIGATE_SKIPFORWARD|-1|><|BUTTONSEP|-1|><|PLAY_FRAMESTEP|-1|><|BUTTONSEP|-1|><|DUMMYSEPARATOR|-1|><|VOLUME_MUTE|-1|>"; + friend CStringW& operator <<= (CStringW& strLayout, const MPCToolbarLayout& tbLayout); + friend MPCToolbarLayout& operator <<= (MPCToolbarLayout& tbLayout, const CStringW& strLayout); +}; diff --git a/src/mpc-hc/mpc-hc.vcxproj.filters b/src/mpc-hc/mpc-hc.vcxproj.filters index 4394f04d81a..d88a5fab401 100644 --- a/src/mpc-hc/mpc-hc.vcxproj.filters +++ b/src/mpc-hc/mpc-hc.vcxproj.filters @@ -590,7 +590,6 @@ Toolbars -<<<<<<< HEAD Toolbars From efe58fc19d8d79281deff1e522e2d2e57c60a32d Mon Sep 17 00:00:00 2001 From: adipose <3324395+adipose@users.noreply.github.com> Date: Sat, 23 Apr 2022 22:55:17 -0700 Subject: [PATCH 5/9] never offset pressed buttons --- src/mpc-hc/PlayerToolBar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mpc-hc/PlayerToolBar.cpp b/src/mpc-hc/PlayerToolBar.cpp index 9720a314f9f..f83fdf33eef 100644 --- a/src/mpc-hc/PlayerToolBar.cpp +++ b/src/mpc-hc/PlayerToolBar.cpp @@ -513,10 +513,10 @@ void CPlayerToolBar::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) lr |= CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYPOSTPAINT; break; case CDDS_ITEMPREPAINT: - lr |= CDRF_NOTIFYPOSTPAINT; + lr |= CDRF_NOTIFYPOSTPAINT | TBCDRF_NOOFFSET; { if (AppIsThemeLoaded()) { - lr |= TBCDRF_NOBACKGROUND | TBCDRF_NOOFFSET; + lr |= TBCDRF_NOBACKGROUND; if (pTBCD->nmcd.uItemState & CDIS_CHECKED) { drawButtonBG(pTBCD->nmcd, CMPCTheme::PlayerButtonCheckedColor); } else if (pTBCD->nmcd.uItemState & CDIS_HOT) { From 40fae11ac34970e7d42ef69866c5f8627858af40 Mon Sep 17 00:00:00 2001 From: adipose <3324395+adipose@users.noreply.github.com> Date: Tue, 31 May 2022 18:09:09 -0700 Subject: [PATCH 6/9] support custom volume draw --- src/mpc-hc/PlayerToolBar.cpp | 35 +++++++--- src/mpc-hc/PlayerToolBar.h | 5 +- src/mpc-hc/VolumeCtrl.cpp | 125 +++++++++++------------------------ src/mpc-hc/res/buttons.svg | 22 +++--- src/mpc-hc/res/mpc-hc.rc2 | Bin 20016 -> 20170 bytes 5 files changed, 82 insertions(+), 105 deletions(-) diff --git a/src/mpc-hc/PlayerToolBar.cpp b/src/mpc-hc/PlayerToolBar.cpp index 494ce09c9c6..53473016c54 100644 --- a/src/mpc-hc/PlayerToolBar.cpp +++ b/src/mpc-hc/PlayerToolBar.cpp @@ -122,6 +122,7 @@ void CPlayerToolBar::LoadToolbarImage() CImage imageDisabled; CBitmap* bmp = CBitmap::FromHandle(image); + int width = image.GetWidth(); int height = image.GetHeight() / 4; int bpp = image.GetBPP(); @@ -129,6 +130,12 @@ void CPlayerToolBar::LoadToolbarImage() // the manual specifies that sizeButton should be sizeImage inflated by (7, 6) SetSizes(CSize(height + 7, height + 6), CSize(height, height)); + int volumeIndex = supportedButtons[ID_VOLUME_MUTE] + 3; + volumeOn.Destroy(); + volumeOff.Destroy(); + volumeOn.Create(height * 2, height, bpp, CImage::createAlphaChannel); + volumeOff.Create(height * 2, height, bpp, CImage::createAlphaChannel); + m_pButtonsImages.reset(DEBUG_NEW CImageList()); m_pButtonsImages->Create(height, height, ILC_COLOR32 | ILC_MASK, 1, 64); m_pDisabledButtonsImages.reset(DEBUG_NEW CImageList()); @@ -141,12 +148,14 @@ void CPlayerToolBar::LoadToolbarImage() CBitmap* pOldTargetBmp = nullptr; CBitmap* pOldSourceBmp = nullptr; + CDC targetDC; CDC sourceDC; CDC* pDC = this->GetDC(); targetDC.CreateCompatibleDC(pDC); sourceDC.CreateCompatibleDC(pDC); + pOldTargetBmp = targetDC.SelectObject(CBitmap::FromHandle(dynamicToolbar)); pOldSourceBmp = sourceDC.GetCurrentBitmap(); @@ -162,6 +171,13 @@ void CPlayerToolBar::LoadToolbarImage() targetDC.SelectObject(CBitmap::FromHandle(dynamicToolbarDisabled)); targetDC.BitBlt(0, 0, image.GetWidth(), height, &sourceDC, 0, imageDisabledOffset, SRCCOPY); + targetDC.SelectObject(CBitmap::FromHandle(volumeOn)); + targetDC.BitBlt(0, 0, height * 2, height, &sourceDC, volumeIndex * height, imageOffset, SRCCOPY); + targetDC.SelectObject(CBitmap::FromHandle(volumeOff)); + targetDC.BitBlt(0, 0, height * 2, height, &sourceDC, volumeIndex * height, imageDisabledOffset, SRCCOPY); + + //volumeOn.Save(_T("c:\\temp\\vON.bmp")); + //volumeOff.Save(_T("c:\\temp\\vOFF.bmp")); sourceDC.SelectObject(pOldSourceBmp); targetDC.SelectObject(pOldTargetBmp); @@ -202,6 +218,8 @@ BOOL CPlayerToolBar::Create(CWnd* pParentWnd) volumeButtonIndex = -1; flexibleSpaceIndex = -1; useFlexibleSpace = false; //can be enabled with right conditions: ID_DUMMYSEPARATOR placed directly before ID_VOLUME_MUTE + buttonCount = 0; + sepCount = 0; auto addButton = [&](int cmdid, int svgIndex) { TBBUTTON button = { 0 }; @@ -219,6 +237,7 @@ BOOL CPlayerToolBar::Create(CWnd* pParentWnd) } else if (cmdid == ID_DUMMYSEPARATOR) { dummyButtonIndex = tb.GetButtonCount() - 1; } + buttonCount++; }; auto addSeparator = [&]() { @@ -227,6 +246,7 @@ BOOL CPlayerToolBar::Create(CWnd* pParentWnd) button.iString = -1; button.fsStyle = BTNS_SEP; tb.AddButtons(1, &button); + sepCount++; }; for (std::vector::size_type i = 0; i < s.toolBarLayout.buttons.size(); ++i) { @@ -273,16 +293,13 @@ void CPlayerToolBar::ArrangeControls() { GetClientRect(&r); CRect br = GetBorders(); + int imageWidth = volumeOn.GetWidth(), imageHeight=volumeOn.GetHeight(); + int volSpace = MulDiv(imageWidth, 12, 10); + int top = r.top + (r.Height() - imageHeight) / 2; + CRect vr(r.right + br.right - volSpace, top, r.right + br.right, top+imageHeight); - CRect vr(r.right + br.right - 60, r.top - 2, r.right + br.right + 6, r.bottom); - m_volctrl.MoveWindow(vr); - - CRect thumbRect; - m_volctrl.GetThumbRect(thumbRect); - m_volctrl.MapWindowPoints(this, thumbRect); - vr.top += std::max((r.bottom - thumbRect.bottom - 4) / 2, 0l); - vr.left -= m_volumeMinSizeInc = MulDiv(thumbRect.Height(), 50, 19) - 50; m_volctrl.MoveWindow(vr); + m_volumeMinSizeInc = imageWidth; if (useFlexibleSpace) { UINT nID; @@ -335,7 +352,7 @@ int CPlayerToolBar::GetVolume() const int CPlayerToolBar::GetMinWidth() const { - return m_nButtonHeight * 9 + 155 + m_volumeMinSizeInc; + return (m_nButtonHeight + 1 + 7) * buttonCount + (1 + 7) * sepCount + m_volumeMinSizeInc; } void CPlayerToolBar::SetVolume(int volume) diff --git a/src/mpc-hc/PlayerToolBar.h b/src/mpc-hc/PlayerToolBar.h index 9cc91d587d7..446870d9752 100644 --- a/src/mpc-hc/PlayerToolBar.h +++ b/src/mpc-hc/PlayerToolBar.h @@ -36,6 +36,7 @@ class CPlayerToolBar : public CToolBar private: CMainFrame* m_pMainFrame; + CImage volumeOn, volumeOff; bool IsMuted() const; void SetMute(bool fMute = true); int getHitButtonIdx(CPoint point); @@ -47,7 +48,7 @@ class CPlayerToolBar : public CToolBar std::unique_ptr m_pButtonsImages; std::unique_ptr m_pDisabledButtonsImages; - int m_volumeMinSizeInc; + int m_volumeMinSizeInc, buttonCount, sepCount; EventClient m_eventc; void EventCallback(MpcEvent ev); @@ -65,6 +66,8 @@ class CPlayerToolBar : public CToolBar __declspec(property(get = GetVolume, put = SetVolume)) int Volume; void ArrangeControls(); + CImage& GetVolumeImageOn() { return volumeOn; }; + CImage& GetVolumeImageOff() { return volumeOff; }; CVolumeCtrl m_volctrl; diff --git a/src/mpc-hc/VolumeCtrl.cpp b/src/mpc-hc/VolumeCtrl.cpp index 43c7f36eb45..53aeaccd875 100644 --- a/src/mpc-hc/VolumeCtrl.cpp +++ b/src/mpc-hc/VolumeCtrl.cpp @@ -24,6 +24,8 @@ #include "VolumeCtrl.h" #include "AppSettings.h" #include "CMPCTheme.h" +#include "PlayerToolBar.h" +#include "CMPCThemeUtil.h" #undef SubclassWindow @@ -131,98 +133,48 @@ void CVolumeCtrl::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult) case CDDS_ITEMPREPAINT: if (pNMCD->dwItemSpec == TBCD_CHANNEL) { + CRect rect; + GetClientRect(rect); + CDC dc; dc.Attach(pNMCD->hdc); - - if (usetheme) { - CRect rect; - GetClientRect(rect); - dc.FillSolidRect(&rect, CMPCTheme::PlayerBGColor); - } - - getCustomChannelRect(&pNMCD->rc); - - if (usetheme) { - DpiHelper dpiWindow; - dpiWindow.Override(GetSafeHwnd()); - - CRect r(pNMCD->rc); - if (!modernStyle) { - r.DeflateRect(0, dpiWindow.ScaleFloorY(6), 0, dpiWindow.ScaleFloorY(6)); - dc.FillSolidRect(r, CMPCTheme::ScrollBGColor); - CBrush fb; - fb.CreateSolidBrush(CMPCTheme::NoBorderColor); - dc.FrameRect(r, &fb); - fb.DeleteObject(); - } else { - r.DeflateRect(0, dpiWindow.ScaleFloorY(3), 0, dpiWindow.ScaleFloorY(2)); - CRect filledRect, unfilledRect; - filledRect = r; - filledRect.right = r.left + lround(r.Width() * float(GetPos()) / 100); - dc.FillSolidRect(&filledRect, CMPCTheme::ScrollProgressColor); - if (filledRect.right < r.right) { //do not fill bg if already full - unfilledRect = r; - unfilledRect.left = filledRect.right; - dc.FillSolidRect(&unfilledRect, CMPCTheme::ScrollBGColor); - } - - CBrush fb; - fb.CreateSolidBrush(CMPCTheme::NoBorderColor); - dc.FrameRect(r, &fb); - fb.DeleteObject(); + CDC dcMem; + CBitmap bmMem; + CRect memRect = { 0, 0, rect.right, rect.bottom }; + CMPCThemeUtil::initMemDC(&dc, dcMem, bmMem, memRect); + + dcMem.FillSolidRect(&rect, CMPCTheme::PlayerBGColor); + + DpiHelper dpiWindow; + dpiWindow.Override(GetSafeHwnd()); + + CPlayerToolBar* tb = DYNAMIC_DOWNCAST(CPlayerToolBar, GetParent()); + if (tb) { + CImage& vOn = tb->GetVolumeImageOn(); + CImage& vOff = tb->GetVolumeImageOff(); + CRect dr, drOn, drOff, src; + dr.SetRect(0, 0, vOn.GetWidth(), vOn.GetHeight()); + dr.OffsetRect((rect.Width() - vOn.GetWidth()) / 2, (rect.Height() - vOn.GetHeight()) / 2); + drOn = dr; + drOn.right = dr.left + lround(dr.Width() * float(GetPos()) / 100); + if (drOn.Width() > 0) { + src = drOn; + src.OffsetRect(-src.TopLeft()); + vOn.Draw(dcMem, drOn, src); + } + drOff = dr; + drOff.left = drOn.right; + if (drOff.Width() > 0) { + src = drOff; + src.OffsetRect(-src.TopLeft()); + src.OffsetRect(drOn.right-drOn.left, 0); + vOff.Draw(dcMem, drOff, src); } - } else { - CPen shadow; - CPen light; - shadow.CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW)); - light.CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DHILIGHT)); - CPen* old = dc.SelectObject(&light); - dc.MoveTo(pNMCD->rc.right, pNMCD->rc.top); - dc.LineTo(pNMCD->rc.right, pNMCD->rc.bottom); - dc.LineTo(pNMCD->rc.left, pNMCD->rc.bottom); - dc.SelectObject(&shadow); - dc.LineTo(pNMCD->rc.right, pNMCD->rc.top); - dc.SelectObject(old); - shadow.DeleteObject(); - light.DeleteObject(); } - + CMPCThemeUtil::flushMemDC(&dc, dcMem, memRect); dc.Detach(); lr = CDRF_SKIPDEFAULT; } else if (pNMCD->dwItemSpec == TBCD_THUMB) { - CDC dc; - dc.Attach(pNMCD->hdc); - pNMCD->rc.bottom--; - CRect r(pNMCD->rc); - r.DeflateRect(0, 0, 1, 0); - - COLORREF shadow = GetSysColor(COLOR_3DSHADOW); - COLORREF light = GetSysColor(COLOR_3DHILIGHT); - if (usetheme) { - if (!modernStyle) { - CBrush fb; - if (m_bDrag) { - dc.FillSolidRect(r, CMPCTheme::ScrollThumbDragColor); - } else if (m_bHover) { - dc.FillSolidRect(r, CMPCTheme::ScrollThumbHoverColor); - } else { - dc.FillSolidRect(r, CMPCTheme::ScrollThumbColor); - } - fb.CreateSolidBrush(CMPCTheme::NoBorderColor); - dc.FrameRect(r, &fb); - fb.DeleteObject(); - } - } else { - - dc.Draw3dRect(&r, light, 0); - r.DeflateRect(0, 0, 1, 1); - dc.Draw3dRect(&r, light, shadow); - r.DeflateRect(1, 1, 1, 1); - dc.FillSolidRect(&r, GetSysColor(COLOR_BTNFACE)); - dc.SetPixel(r.left + 7, r.top - 1, GetSysColor(COLOR_BTNFACE)); - } - - dc.Detach(); lr = CDRF_SKIPDEFAULT; } @@ -393,7 +345,8 @@ void CVolumeCtrl::updateModernVolCtrl(CPoint point) } RECT ur; - getCustomChannelRect(&ur); + //getCustomChannelRect(&ur); + GetClientRect(&ur); RedrawWindow(&ur, nullptr, RDW_INVALIDATE); //we must redraw the whole channel with the modern volume ctrl. by default only areas where thumb has been are invalidated } diff --git a/src/mpc-hc/res/buttons.svg b/src/mpc-hc/res/buttons.svg index 7c37b02ea9a..c76cb044c59 100644 --- a/src/mpc-hc/res/buttons.svg +++ b/src/mpc-hc/res/buttons.svg @@ -1,9 +1,9 @@ + id="svg3341" inkscape:export-filename="D:\src\mpc-hc\src\mpc-hc\res\toolbar2.png" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 272 64" + style="enable-background:new 0 0 272 64;" xml:space="preserve"> @@ -127,9 +127,9 @@ - - - + + + @@ -152,11 +152,15 @@ - - - + + + + + + + diff --git a/src/mpc-hc/res/mpc-hc.rc2 b/src/mpc-hc/res/mpc-hc.rc2 index 003d5a3912222b1aa82587cb8d1d352333d83e79..ad3ebd2f037d26c0093f19df80ad71c6a944f07f 100644 GIT binary patch delta 56 zcmdlmhw;>0#tm^Uld~+jCZBU=<91>QWe5R6e+IwF2W{0Sv$@#tCNY#UlmKBqLmor% JW`CE5oB#vX5cU87 delta 14 WcmX>#mvO@!#tm^Un}4`m;sgLRQU=lh From 4f1a73786dbecbebbb906d1b10c07834f4903939 Mon Sep 17 00:00:00 2001 From: adipose <3324395+adipose@users.noreply.github.com> Date: Tue, 7 Jun 2022 15:46:27 -0700 Subject: [PATCH 7/9] fix redraw issue --- src/mpc-hc/PlayerToolBar.cpp | 2 +- src/mpc-hc/VolumeCtrl.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mpc-hc/PlayerToolBar.cpp b/src/mpc-hc/PlayerToolBar.cpp index 53473016c54..7b04e104446 100644 --- a/src/mpc-hc/PlayerToolBar.cpp +++ b/src/mpc-hc/PlayerToolBar.cpp @@ -299,7 +299,7 @@ void CPlayerToolBar::ArrangeControls() { CRect vr(r.right + br.right - volSpace, top, r.right + br.right, top+imageHeight); m_volctrl.MoveWindow(vr); - m_volumeMinSizeInc = imageWidth; + m_volumeMinSizeInc = volSpace; if (useFlexibleSpace) { UINT nID; diff --git a/src/mpc-hc/VolumeCtrl.cpp b/src/mpc-hc/VolumeCtrl.cpp index 53aeaccd875..4aa8ce06f99 100644 --- a/src/mpc-hc/VolumeCtrl.cpp +++ b/src/mpc-hc/VolumeCtrl.cpp @@ -75,6 +75,7 @@ void CVolumeCtrl::SetPosInternal(int pos) ::GetCursorPos(&p); ScreenToClient(&p); checkHover(p); + RedrawWindow(nullptr, nullptr, RDW_INVALIDATE); //we must redraw the whole window as it can be larger than volctrl expects } void CVolumeCtrl::IncreaseVolume() From 2643648dc6cf3dffd4d64016aacfa0a4917f1f9d Mon Sep 17 00:00:00 2001 From: adipose <3324395+adipose@users.noreply.github.com> Date: Wed, 8 Jun 2022 11:29:26 -0700 Subject: [PATCH 8/9] support alpha blending --- src/mpc-hc/ImageGrayer.cpp | 17 +++++++++++++++++ src/mpc-hc/ImageGrayer.h | 1 + src/mpc-hc/PlayerToolBar.cpp | 8 ++++++-- src/mpc-hc/VolumeCtrl.cpp | 4 ++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/mpc-hc/ImageGrayer.cpp b/src/mpc-hc/ImageGrayer.cpp index 213b3eb73f5..5ac172c4dbe 100644 --- a/src/mpc-hc/ImageGrayer.cpp +++ b/src/mpc-hc/ImageGrayer.cpp @@ -222,3 +222,20 @@ bool ImageGrayer::UpdateColor(const CImage& imgSource, CImage& imgDest, bool dis return true; } + +void ImageGrayer::PreMultiplyAlpha(CImage& imgSource) { + BYTE* bits = static_cast(imgSource.GetBits()); + for (int y = 0; y < imgSource.GetHeight(); y++, bits += imgSource.GetPitch()) { + RGBQUAD* p = reinterpret_cast(bits); + for (int x = 0; x < imgSource.GetWidth(); x++) { + HLS hls(p[x]); + + RGBQUAD rgb = hls.toRGBQUAD(); + + p[x].rgbRed = static_cast(round((float)p[x].rgbRed * p[x].rgbReserved / 255.0f)); + p[x].rgbBlue = static_cast(round((float)p[x].rgbBlue * p[x].rgbReserved / 255.0f)); + p[x].rgbGreen = static_cast(round((float)p[x].rgbGreen * p[x].rgbReserved / 255.0f)); + } + } +} + diff --git a/src/mpc-hc/ImageGrayer.h b/src/mpc-hc/ImageGrayer.h index ec6a7e81d10..ae653a123c2 100644 --- a/src/mpc-hc/ImageGrayer.h +++ b/src/mpc-hc/ImageGrayer.h @@ -30,4 +30,5 @@ namespace ImageGrayer bool Gray(const CImage& imgSource, CImage& imgDest, float brightness = 1.0f); bool UpdateColor(const CImage& imgSource, CImage& imgDest, bool disabled, mpcColorStyle colorStyle); + void PreMultiplyAlpha(CImage& imgSource); } diff --git a/src/mpc-hc/PlayerToolBar.cpp b/src/mpc-hc/PlayerToolBar.cpp index 7b04e104446..9efc1993e8f 100644 --- a/src/mpc-hc/PlayerToolBar.cpp +++ b/src/mpc-hc/PlayerToolBar.cpp @@ -31,6 +31,7 @@ #include "SVGImage.h" #include "ImageGrayer.h" #include "CMPCTheme.h" +#include "Gdiplusimaging.h" // CPlayerToolBar @@ -176,8 +177,11 @@ void CPlayerToolBar::LoadToolbarImage() targetDC.SelectObject(CBitmap::FromHandle(volumeOff)); targetDC.BitBlt(0, 0, height * 2, height, &sourceDC, volumeIndex * height, imageDisabledOffset, SRCCOPY); - //volumeOn.Save(_T("c:\\temp\\vON.bmp")); - //volumeOff.Save(_T("c:\\temp\\vOFF.bmp")); + volumeOn.Save(L"c:\\temp\\vON.png", Gdiplus::ImageFormatPNG); + volumeOff.Save(L"c:\\temp\\vOFF.png", Gdiplus::ImageFormatPNG); + + ImageGrayer::PreMultiplyAlpha(volumeOn); + ImageGrayer::PreMultiplyAlpha(volumeOff); sourceDC.SelectObject(pOldSourceBmp); targetDC.SelectObject(pOldTargetBmp); diff --git a/src/mpc-hc/VolumeCtrl.cpp b/src/mpc-hc/VolumeCtrl.cpp index 4aa8ce06f99..179bc2f4bb8 100644 --- a/src/mpc-hc/VolumeCtrl.cpp +++ b/src/mpc-hc/VolumeCtrl.cpp @@ -161,7 +161,7 @@ void CVolumeCtrl::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult) if (drOn.Width() > 0) { src = drOn; src.OffsetRect(-src.TopLeft()); - vOn.Draw(dcMem, drOn, src); + vOn.AlphaBlend(dcMem, drOn, src); } drOff = dr; drOff.left = drOn.right; @@ -169,7 +169,7 @@ void CVolumeCtrl::OnNMCustomdraw(NMHDR* pNMHDR, LRESULT* pResult) src = drOff; src.OffsetRect(-src.TopLeft()); src.OffsetRect(drOn.right-drOn.left, 0); - vOff.Draw(dcMem, drOff, src); + vOff.AlphaBlend(dcMem, drOff, src); } } CMPCThemeUtil::flushMemDC(&dc, dcMem, memRect); From 81387758bfa3aa13714d6c0d88d24c81f1c981ec Mon Sep 17 00:00:00 2001 From: adipose <3324395+adipose@users.noreply.github.com> Date: Wed, 8 Jun 2022 12:51:56 -0700 Subject: [PATCH 9/9] . --- src/mpc-hc/PlayerToolBar.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mpc-hc/PlayerToolBar.cpp b/src/mpc-hc/PlayerToolBar.cpp index 9efc1993e8f..fb6129c3d8a 100644 --- a/src/mpc-hc/PlayerToolBar.cpp +++ b/src/mpc-hc/PlayerToolBar.cpp @@ -177,8 +177,8 @@ void CPlayerToolBar::LoadToolbarImage() targetDC.SelectObject(CBitmap::FromHandle(volumeOff)); targetDC.BitBlt(0, 0, height * 2, height, &sourceDC, volumeIndex * height, imageDisabledOffset, SRCCOPY); - volumeOn.Save(L"c:\\temp\\vON.png", Gdiplus::ImageFormatPNG); - volumeOff.Save(L"c:\\temp\\vOFF.png", Gdiplus::ImageFormatPNG); + //volumeOn.Save(L"c:\\temp\\vON.png", Gdiplus::ImageFormatPNG); + //volumeOff.Save(L"c:\\temp\\vOFF.png", Gdiplus::ImageFormatPNG); ImageGrayer::PreMultiplyAlpha(volumeOn); ImageGrayer::PreMultiplyAlpha(volumeOff);