Skip to content

Commit bb26cec

Browse files
thisismy-githubIbuprophen
authored andcommitted
Added option to single-expand any Win7 style item
Expands the "display as a list of drives" option from This PC to work on almost any item in the Windows 7 style. Incompatible items have a new setting called ITEM_NODRIVES which blocks the option from appearing. This PC still uses the original "list of drives" text, while other items use "list of links" instead. Sorting has been updated to account for this option by adding a property called bFolderLink which marks any folder, even if it is not explicitly expandable.
1 parent ef663d2 commit bb26cec

File tree

8 files changed

+36
-20
lines changed

8 files changed

+36
-20
lines changed

Src/StartMenu/StartMenuDLL/CustomMenu.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,13 @@ CStdCommand7 g_StdCommands7[]={
9595
{L"user_videos",0,NULL,L"$Menu.UserVideosTip",NULL,&FOLDERID_Videos},
9696
{L"control_panel",0,L"$Menu.ControlPanel",L"$Menu.ControlPanelTip",NULL,&FOLDERID_ControlPanelFolder,NULL,StdMenuItem::MENU_TRACK},
9797
{L"pc_settings",IDS_PCSETTINGS,L"$Menu.PCSettings",L"",L"%windir%\\ImmersiveControlPanel\\SystemSettings.exe,10",NULL,NULL,StdMenuItem::MENU_TRACK,CStdCommand7::ITEM_SINGLE},
98-
{L"network_connections",0,NULL,L"$Menu.NetworkTip",NULL,&FOLDERID_ConnectionsFolder},
98+
{L"network_connections",0,NULL,L"$Menu.NetworkTip",NULL,&FOLDERID_ConnectionsFolder,NULL,0,CStdCommand7::ITEM_NODRIVES},
9999
{L"network",0,NULL,NULL,NULL,&FOLDERID_NetworkFolder,NULL,0,CStdCommand7::ITEM_SINGLE},
100-
{L"printers",0,NULL,L"$Menu.PrintersTip",NULL,&FOLDERID_PrintersFolder},
100+
{L"printers",0,NULL,L"$Menu.PrintersTip",NULL,&FOLDERID_PrintersFolder,NULL,0,CStdCommand7::ITEM_NODRIVES},
101101
{L"fonts",0,NULL,NULL,NULL,&FOLDERID_Fonts},
102102
{L"desktop",0,NULL,NULL,NULL,&FOLDERID_Desktop},
103-
{L"admin",0,NULL,L"$Menu.AdminToolsTip",L"imageres.dll,114",&FOLDERID_CommonAdminTools,NULL,StdMenuItem::MENU_TRACK},
104-
{L"startup",0,NULL,NULL,NULL,&FOLDERID_Startup,NULL,StdMenuItem::MENU_TRACK},
103+
{L"admin",0,NULL,L"$Menu.AdminToolsTip",L"imageres.dll,114",&FOLDERID_CommonAdminTools,NULL,StdMenuItem::MENU_TRACK,CStdCommand7::ITEM_NODRIVES},
104+
{L"startup",0,NULL,NULL,NULL,&FOLDERID_Startup,NULL,StdMenuItem::MENU_TRACK,CStdCommand7::ITEM_NODRIVES},
105105
{L"downloads",0,NULL,L"$Menu.DownloadTip",NULL,&FOLDERID_Downloads},
106106
{L"games",0,NULL,L"$Menu.GamesTip",NULL,&FOLDERID_Games,NULL,StdMenuItem::MENU_TRACK},
107107
{L"links",0,NULL,NULL,NULL,&FOLDERID_Links},
@@ -112,7 +112,7 @@ CStdCommand7 g_StdCommands7[]={
112112
{L"lib_videos",IDS_LIB_VIDEOS_ITEM,NULL,L"$Menu.VideosLibTip",NULL,&FOLDERID_VideosLibrary},
113113
{L"lib_tv",IDS_LIB_TV_ITEM,NULL,L"$Menu.RecordingsLibTip",NULL,&FOLDERID_RecordedTVLibrary},
114114
{L"homegroup",0,NULL,L"$Menu.HomegroupTip",NULL,&FOLDERID_HomeGroup,NULL,0,CStdCommand7::ITEM_SINGLE},
115-
{L"devices",0,NULL,NULL,NULL,NULL,L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"},
115+
{L"devices",0,NULL,NULL,NULL,NULL,L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{A8A91A66-3A7D-4424-8D24-04E180695C7A}",0,CStdCommand7::ITEM_NODRIVES},
116116
{L"defaults",0,NULL,NULL,NULL,NULL,L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{17CD9488-1228-4B2F-88CE-4298E93E0966}",0,CStdCommand7::ITEM_SINGLE},
117117
{L"apps",IDS_METRO_APPS,L"$Menu.Apps",NULL,L",2",NULL,NULL,StdMenuItem::MENU_TRACK,CStdCommand7::ITEM_FOLDER},
118118

Src/StartMenu/StartMenuDLL/CustomMenu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ struct CStdCommand7
1515
ITEM_SINGLE=1, // this item never has sub-menu
1616
ITEM_FOLDER=2, // this item always has sub-menu
1717
ITEM_COMPUTER=4, // this item can be expanded only one level
18+
ITEM_NODRIVES=8, // this item can never be expanded only one level
1819
};
1920
const wchar_t *command;
2021
int nameID;

Src/StartMenu/StartMenuDLL/DragDrop.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -903,7 +903,7 @@ HRESULT STDMETHODCALLTYPE CMenuContainer::Drop( IDataObject *pDataObj, DWORD grf
903903
else if (i<before)
904904
skip++;
905905
}
906-
SortMenuItem ins(L"",FNV_HASH0,false,false,folderIndex*2,0);
906+
SortMenuItem ins(L"",FNV_HASH0,false,false,false,folderIndex*2,0);
907907
items.insert(items.begin()+(before-skip),ins);
908908
SaveItemOrder(items);
909909
}

Src/StartMenu/StartMenuDLL/MenuContainer.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -861,7 +861,8 @@ void CMenuContainer::AddFirstFolder( IShellItem *pFolder, std::vector<MenuItem>
861861

862862
if (bLibrary) flags&=~SFGAO_STREAM;
863863
item.bLink=(flags&SFGAO_LINK)!=0;
864-
item.bFolder=(!(options&CONTAINER_CONTROLPANEL) && !(options&CONTAINER_NOSUBFOLDERS) && (flags&SFGAO_FOLDER) && (!(flags&(SFGAO_STREAM|SFGAO_LINK)) || (s_bExpandLinks && item.bLink)));
864+
item.bFolderLink=(flags&SFGAO_FOLDER && (!(flags&(SFGAO_STREAM|SFGAO_LINK)) || (s_bExpandLinks && item.bLink)));
865+
item.bFolder=(!(options&CONTAINER_CONTROLPANEL) && !(options&CONTAINER_NOSUBFOLDERS) && item.bFolderLink);
865866
{
866867
CItemManager::RWLock lock(&g_ItemManager,false,CItemManager::RWLOCK_ITEMS);
867868
if (item.pItemInfo->IsMetroLink())
@@ -2505,9 +2506,9 @@ void CMenuContainer::InitItems( void )
25052506
m_Items.resize(MAX_MENU_ITEMS);
25062507
}
25072508

2508-
if (m_Options&CONTAINER_CONTROLPANEL)
2509+
if (m_Options&CONTAINER_CONTROLPANEL && !(m_Options&CONTAINER_NOSUBFOLDERS))
25092510
{
2510-
// expand Administrative Tools. must be done after the sorting because we don't want the folder to jump to the top
2511+
// expand Administrative Tools when displaying as a menu. must be done after the sorting because we don't want the folder to jump to the top
25112512
unsigned int AdminToolsHash=CalcFNVHash(L"::{D20EA4E1-3957-11D2-A40B-0C5020524153}");
25122513
for (std::vector<MenuItem>::iterator it=m_Items.begin();it!=m_Items.end();++it)
25132514
if (it->nameHash==AdminToolsHash)

Src/StartMenu/StartMenuDLL/MenuContainer.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ class CMenuContainer: public IDropTarget, public IFrameworkInputPaneHandler, pub
453453
drawType=MenuSkin::COLUMN1_ITEM;
454454
column=row=0;
455455
memset(&itemRect,0,sizeof(itemRect));
456-
bFolder=bLink=bPrograms=bAlignBottom=bBreak=bInline=bInlineFirst=bInlineLast=bSplit=bHasJumpList=bMetroLink=bMetroApp=bBlankSeparator=bNew=bStartScreen=bCustomAccelerator=false;
456+
bFolder=bLink=bFolderLink=bPrograms=bAlignBottom=bBreak=bInline=bInlineFirst=bInlineLast=bSplit=bHasJumpList=bMetroLink=bMetroApp=bBlankSeparator=bNew=bStartScreen=bCustomAccelerator=false;
457457
priority=0;
458458
pItem1=pItem2=NULL;
459459
mfuHash=0;
@@ -477,6 +477,7 @@ class CMenuContainer: public IDropTarget, public IFrameworkInputPaneHandler, pub
477477
RECT itemRect;
478478
bool bFolder:1; // this is a folder - draw arrow
479479
bool bLink:1; // this is a link (if a link to a folder is expanded it is always single-column)
480+
bool bFolderLink:1; // this is a folder that is not explicitly expandable - used for sorting the list-of-links style
480481
bool bPrograms:1; // this item is part of the Start Menu folder hierarchy
481482
bool bAlignBottom:1; // two-column menu: this item is aligned to the bottom
482483
bool bBreak:1; // two-column menu: this item starts the second column
@@ -512,8 +513,8 @@ class CMenuContainer: public IDropTarget, public IFrameworkInputPaneHandler, pub
512513
if (priority>item.priority) return false;
513514
if (row<item.row) return true;
514515
if (row>item.row) return false;
515-
if ((bFolder && !bHasJumpList) && !(item.bFolder && !item.bHasJumpList)) return true;
516-
if (!(bFolder && !bHasJumpList) && (item.bFolder && !item.bHasJumpList)) return false;
516+
if (((bFolder || bFolderLink) && !bHasJumpList) && !((item.bFolder || item.bFolderLink) && !item.bHasJumpList)) return true;
517+
if (!((bFolder || bFolderLink) && !bHasJumpList) && ((item.bFolder || item.bFolderLink) && !item.bHasJumpList)) return false;
517518
if (drive && !item.drive) return true;
518519
if (!drive && item.drive) return false;
519520
if (drive && item.drive) return drive<item.drive;
@@ -578,18 +579,19 @@ class CMenuContainer: public IDropTarget, public IFrameworkInputPaneHandler, pub
578579
CString name;
579580
unsigned int nameHash;
580581
bool bFolder;
582+
bool bFolderLink;
581583
bool bHasJumpList;
582584
char priority;
583585
char drive;
584586

585-
SortMenuItem( const CString &_name, unsigned _nameHash, bool _bFolder, bool _bHasJumpList, char _priority ,char _drive) { name=_name; nameHash=_nameHash; bFolder=_bFolder; bHasJumpList=_bHasJumpList; priority=_priority; drive=_drive; }
586-
SortMenuItem( const MenuItem &item ) { name=item.name; nameHash=item.nameHash; bFolder=item.bFolder; bHasJumpList=item.bHasJumpList; priority=item.priority; drive=item.drive; }
587+
SortMenuItem( const CString &_name, unsigned _nameHash, bool _bFolder, bool _bFolderLink, bool _bHasJumpList, char _priority ,char _drive) { name=_name; nameHash=_nameHash; bFolder=_bFolder; bFolderLink=_bFolderLink; bHasJumpList=_bHasJumpList; priority=_priority; drive=_drive; }
588+
SortMenuItem( const MenuItem &item ) { name=item.name; nameHash=item.nameHash; bFolder=item.bFolder; bFolderLink=item.bFolderLink; bHasJumpList=item.bHasJumpList; priority=item.priority; drive=item.drive; }
587589
bool operator<( const SortMenuItem &x ) const
588590
{
589591
if (priority<x.priority) return true;
590592
if (priority>x.priority) return false;
591-
if ((bFolder && !bHasJumpList) && !(x.bFolder && !x.bHasJumpList)) return true;
592-
if (!(bFolder && !bHasJumpList) && (x.bFolder && !x.bHasJumpList)) return false;
593+
if (((bFolder || bFolderLink) && !bHasJumpList) && !((x.bFolder || x.bFolderLink) && !x.bHasJumpList)) return true;
594+
if (!((bFolder || bFolderLink) && !bHasJumpList) && ((x.bFolder || x.bFolderLink) && !x.bHasJumpList)) return false;
593595
if (drive && !x.drive) return true;
594596
if (!drive && x.drive) return false;
595597
if (drive && x.drive) return drive<x.drive;

Src/StartMenu/StartMenuDLL/SettingsUI.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2725,8 +2725,11 @@ void CCustomMenuDlg7::CItemList::UpdateItem( int index )
27252725
str=LoadStringEx(IDS_ITEM_SHOW2);
27262726
else if ((menuItem.settings&StdMenuItem::MENU_NOEXPAND) && !(g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_FOLDER))
27272727
str=LoadStringEx(IDS_ITEM_SHOW);
2728-
else if ((menuItem.settings&StdMenuItem::MENU_SINGLE_EXPAND) && (g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_COMPUTER))
2729-
str=LoadStringEx(IDS_ITEM_DRIVES);
2728+
else if ((menuItem.settings&StdMenuItem::MENU_SINGLE_EXPAND) && !(g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_NODRIVES))
2729+
if (g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_COMPUTER)
2730+
str=LoadStringEx(IDS_ITEM_DRIVES);
2731+
else
2732+
str=LoadStringEx(IDS_ITEM_LINKS);
27302733
else
27312734
str=LoadStringEx(IDS_ITEM_MENU);
27322735
ListView_SetItemText(m_hWnd,index,2,(wchar_t*)(const wchar_t*)str);
@@ -3160,7 +3163,7 @@ LRESULT CCustomMenuDlg7::CItemList::OnSelEndOk( WORD wNotifyCode, WORD wID, HWND
31603163
menuItem.settings|=StdMenuItem::MENU_ITEM_DISABLED;
31613164
else if (sel==1 && !(g_StdCommands7[menuItem.stdItemIndex].flags&(CStdCommand7::ITEM_SINGLE|CStdCommand7::ITEM_FOLDER)))
31623165
menuItem.settings|=StdMenuItem::MENU_NOEXPAND;
3163-
else if (sel==3 && (g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_COMPUTER))
3166+
else if (sel==3 && !(g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_NODRIVES))
31643167
menuItem.settings|=StdMenuItem::MENU_SINGLE_EXPAND;
31653168
}
31663169
UpdateItem(m_Line);
@@ -3307,12 +3310,17 @@ void CCustomMenuDlg7::CItemList::CreateCombo( int line, int column )
33073310
str=LoadStringEx(IDS_ITEM_DRIVES);
33083311
m_Combo.SendMessage(CB_ADDSTRING,0,(LPARAM)(const wchar_t*)str);
33093312
}
3313+
else if (!(g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_NODRIVES))
3314+
{
3315+
str=LoadStringEx(IDS_ITEM_LINKS);
3316+
m_Combo.SendMessage(CB_ADDSTRING,0,(LPARAM)(const wchar_t*)str);
3317+
}
33103318
}
33113319
if (menuItem.settings&StdMenuItem::MENU_ITEM_DISABLED)
33123320
m_Combo.SendMessage(CB_SETCURSEL,0);
33133321
else if ((g_StdCommands7[menuItem.stdItemIndex].flags&(CStdCommand7::ITEM_SINGLE|CStdCommand7::ITEM_FOLDER)) || (menuItem.settings&StdMenuItem::MENU_NOEXPAND))
33143322
m_Combo.SendMessage(CB_SETCURSEL,1);
3315-
else if ((g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_COMPUTER) && (menuItem.settings&StdMenuItem::MENU_SINGLE_EXPAND))
3323+
else if (!(g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_NODRIVES) && (menuItem.settings&StdMenuItem::MENU_SINGLE_EXPAND))
33163324
m_Combo.SendMessage(CB_SETCURSEL,3);
33173325
else
33183326
m_Combo.SendMessage(CB_SETCURSEL,2);

Src/StartMenu/StartMenuDLL/StartMenuDLL.rc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,6 +1311,8 @@ BEGIN
13111311
IDS_OPEN_CMD_TIP "The action will run a user-defined command"
13121312
IDS_OPEN_CMD_TEXT "Command to run"
13131313
IDS_OPEN_CMD_TEXT_TIP "Enter the command to run when you use this control"
1314+
IDS_ITEM_LINKS "Display as a list of links"
1315+
IDS_ITEM_LINKS_TIP "This item will appear as a sub-menu showing only its top-level contents"
13141316
END
13151317

13161318
#endif // English (U.S.) resources

Src/StartMenu/StartMenuDLL/resource.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,8 @@
774774
#define IDS_OPEN_CMD_TIP 3677
775775
#define IDS_OPEN_CMD_TEXT 3678
776776
#define IDS_OPEN_CMD_TEXT_TIP 3679
777+
#define IDS_ITEM_LINKS 3680
778+
#define IDS_ITEM_LINKS_TIP 3681
777779
#define IDS_STRING7001 7001
778780
#define IDS_STRING7002 7002
779781
#define IDS_STRING7003 7003

0 commit comments

Comments
 (0)