Skip to content

Commit 774b3a6

Browse files
committed
[RAPPS] Correctly update the Install/Uninstall/... buttons (reactos#7351)
The Install/Uninstall/Modify/... buttons stay disabled by default, unless: - For installed apps: when an app item is selected, Uninstall (and Registry-remove) are enabled, and Modify is enabled under certain conditions. - For available apps: * Modify, Uninstall and Registry-remove are always disabled. * When an app item is selected, Install is enabled. * Install is also enabled if there is at least one application selected for installation (box checked), in which case the button stays enabled even while changing across apps categories.
1 parent 1e6e552 commit 774b3a6

File tree

2 files changed

+76
-34
lines changed

2 files changed

+76
-34
lines changed

base/applications/rapps/appview.cpp

Lines changed: 73 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1644,6 +1644,11 @@ CApplicationView::ProcessWindowMessage(
16441644
ItemCheckStateChanged(FALSE, (LPVOID)pnic->lParam);
16451645
}
16461646
}
1647+
1648+
/* Ensure that if there are any items still focused/selected,
1649+
* the ID_INSTALL menu item and toolbar button stay enabled */
1650+
if ((pnic->uChanged & LVIF_STATE) && !m_MainWindow->bUpdating)
1651+
_UpdateInstallBtn();
16471652
}
16481653
break;
16491654

@@ -2039,25 +2044,19 @@ BOOL
20392044
CApplicationView::SetDisplayAppType(APPLICATION_VIEW_TYPE AppType)
20402045
{
20412046
if (!m_ListView->SetDisplayAppType(AppType))
2042-
{
20432047
return FALSE;
2044-
}
2048+
20452049
ApplicationViewType = AppType;
20462050
m_AppsInfo->SetWelcomeText(m_MainWindow->m_bAppwizMode);
20472051

2048-
HMENU hMenu = ::GetMenu(m_hWnd);
2052+
HMENU hMenu = GetMenu();
20492053
switch (AppType)
20502054
{
20512055
case AppViewTypeInstalledApps:
20522056
{
20532057
EnableMenuItem(hMenu, ID_INSTALL, MF_GRAYED);
2054-
EnableMenuItem(hMenu, ID_UNINSTALL, MF_ENABLED);
2055-
EnableMenuItem(hMenu, ID_MODIFY, MF_ENABLED);
2056-
EnableMenuItem(hMenu, ID_REGREMOVE, MF_ENABLED);
2057-
20582058
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_INSTALL, FALSE);
2059-
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_UNINSTALL, TRUE);
2060-
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_MODIFY, TRUE);
2059+
20612060
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_CHECK_ALL, FALSE);
20622061
break;
20632062
}
@@ -2067,18 +2066,22 @@ CApplicationView::SetDisplayAppType(APPLICATION_VIEW_TYPE AppType)
20672066
// We shouldn't get there in APPWIZ-mode.
20682067
ATLASSERT(!m_MainWindow->m_bAppwizMode);
20692068

2070-
EnableMenuItem(hMenu, ID_INSTALL, MF_ENABLED);
2071-
EnableMenuItem(hMenu, ID_UNINSTALL, MF_GRAYED);
2072-
EnableMenuItem(hMenu, ID_MODIFY, MF_GRAYED);
2073-
EnableMenuItem(hMenu, ID_REGREMOVE, MF_GRAYED);
2069+
/* Even if no ListView item is focused at this point, enable
2070+
* or disable ID_INSTALL if there are selected applications. */
2071+
_UpdateInstallBtn();
20742072

2075-
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_INSTALL, TRUE);
2076-
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_UNINSTALL, FALSE);
2077-
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_MODIFY, FALSE);
20782073
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_CHECK_ALL, TRUE);
20792074
break;
20802075
}
20812076
}
2077+
2078+
/* Always disable these items by default */
2079+
EnableMenuItem(hMenu, ID_UNINSTALL, MF_GRAYED);
2080+
EnableMenuItem(hMenu, ID_MODIFY, MF_GRAYED);
2081+
EnableMenuItem(hMenu, ID_REGREMOVE, MF_GRAYED);
2082+
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_UNINSTALL, FALSE);
2083+
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_MODIFY, FALSE);
2084+
20822085
return TRUE;
20832086
}
20842087

@@ -2163,30 +2166,70 @@ CApplicationView::RefreshDetailsPane(CAppInfo &Info, bool OnlyUpdateText)
21632166
m_AppsInfo->ShowAppInfo(Info, OnlyUpdateText);
21642167
}
21652168

2166-
// this function is called when a item of listview get focus.
2167-
// CallbackParam is the param passed to listview when adding the item (the one getting focus now).
2169+
void
2170+
CApplicationView::_UpdateInstallBtn()
2171+
{
2172+
if (ApplicationViewType == AppViewTypeInstalledApps)
2173+
{
2174+
EnableMenuItem(GetMenu(), ID_INSTALL, MF_GRAYED);
2175+
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_INSTALL, FALSE);
2176+
}
2177+
else if (ApplicationViewType == AppViewTypeAvailableApps)
2178+
{
2179+
// We shouldn't get there in APPWIZ-mode.
2180+
ATLASSERT(!m_MainWindow->m_bAppwizMode);
2181+
2182+
/* Even if no ListView item is focused at this point, enable
2183+
* or disable ID_INSTALL if there are selected applications. */
2184+
BOOL CanInstall = !m_MainWindow->m_Selected.IsEmpty();
2185+
CanInstall = CanInstall || (m_ListView->GetSelectedCount() > 0);
2186+
EnableMenuItem(GetMenu(), ID_INSTALL, CanInstall ? MF_ENABLED : MF_GRAYED);
2187+
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_INSTALL, CanInstall);
2188+
}
2189+
}
2190+
2191+
// This function is called when a ListView item gets the focus.
2192+
// CallbackParam is the param passed to the ListView when adding the item (the one getting focus now).
21682193
VOID
21692194
CApplicationView::ItemGetFocus(LPVOID CallbackParam)
21702195
{
2171-
if (CallbackParam)
2196+
if (!CallbackParam)
2197+
return;
2198+
2199+
CAppInfo *Info = static_cast<CAppInfo *>(CallbackParam);
2200+
RefreshDetailsPane(*Info);
2201+
2202+
HMENU hMenu = GetMenu();
2203+
if (ApplicationViewType == AppViewTypeInstalledApps)
21722204
{
2173-
CAppInfo *Info = static_cast<CAppInfo *>(CallbackParam);
2174-
RefreshDetailsPane(*Info);
2205+
/* ID_INSTALL is left disabled */
21752206

2176-
if (ApplicationViewType == AppViewTypeInstalledApps)
2177-
{
2178-
HMENU hMenu = ::GetMenu(m_hWnd);
2207+
EnableMenuItem(hMenu, ID_UNINSTALL, MF_ENABLED);
2208+
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_UNINSTALL, TRUE);
21792209

2180-
BOOL CanModify = Info->CanModify();
2210+
BOOL CanModify = Info->CanModify();
2211+
EnableMenuItem(hMenu, ID_MODIFY, CanModify ? MF_ENABLED : MF_GRAYED);
2212+
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_MODIFY, CanModify);
21812213

2182-
EnableMenuItem(hMenu, ID_MODIFY, CanModify ? MF_ENABLED : MF_GRAYED);
2183-
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_MODIFY, CanModify);
2184-
}
2214+
EnableMenuItem(hMenu, ID_REGREMOVE, MF_ENABLED);
2215+
}
2216+
else if (ApplicationViewType == AppViewTypeAvailableApps)
2217+
{
2218+
// We shouldn't get there in APPWIZ-mode.
2219+
ATLASSERT(!m_MainWindow->m_bAppwizMode);
2220+
2221+
EnableMenuItem(hMenu, ID_INSTALL, MF_ENABLED);
2222+
m_Toolbar->SendMessageW(TB_ENABLEBUTTON, ID_INSTALL, TRUE);
2223+
2224+
/* ID_UNINSTALL, ID_MODIFY and ID_REGREMOVE are left disabled */
2225+
// TODO: When we are able to detect whether this selected available
2226+
// application is already installed (could be an older version),
2227+
// do also what's done in the AppViewTypeInstalledApps case above.
21852228
}
21862229
}
21872230

2188-
// this function is called when a item of listview is checked/unchecked
2189-
// CallbackParam is the param passed to listview when adding the item (the one getting changed now).
2231+
// This function is called when a ListView item (an application) is checked/unchecked.
2232+
// CallbackParam is the param passed to the ListView when adding the item (the one getting changed now).
21902233
VOID
21912234
CApplicationView::ItemCheckStateChanged(BOOL bChecked, LPVOID CallbackParam)
21922235
{

base/applications/rapps/include/appview.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,9 @@ class CApplicationView : public CUiWindow<CWindowImpl<CApplicationView>>
376376
VOID
377377
OnCommand(WPARAM wParam, LPARAM lParam);
378378

379+
void
380+
_UpdateInstallBtn();
381+
379382
public:
380383
CApplicationView(CMainWindow *MainWindow);
381384
~CApplicationView();
@@ -420,13 +423,9 @@ class CApplicationView : public CUiWindow<CWindowImpl<CApplicationView>>
420423
VOID
421424
RefreshDetailsPane(CAppInfo &Info, bool OnlyUpdateText = false);
422425

423-
// this function is called when a item of listview get focus.
424-
// CallbackParam is the param passed to listview when adding the item (the one getting focus now).
425426
VOID
426427
ItemGetFocus(LPVOID CallbackParam);
427428

428-
// this function is called when a item of listview is checked/unchecked
429-
// CallbackParam is the param passed to listview when adding the item (the one getting focus now).
430429
VOID
431430
ItemCheckStateChanged(BOOL bChecked, LPVOID CallbackParam);
432431
};

0 commit comments

Comments
 (0)