fix for empty submenus

svn path=/trunk/; revision=7421
This commit is contained in:
Martin Fuchs 2004-01-03 10:24:47 +00:00
parent 955c62bf6a
commit b1f2f1ed55
2 changed files with 24 additions and 18 deletions

View file

@ -51,7 +51,7 @@ StartMenu::StartMenu(HWND hwnd)
_border_top = 0; _border_top = 0;
_last_pos = WindowRect(hwnd).pos(); _last_pos = WindowRect(hwnd).pos();
#ifdef _LIGHT_STARTMENU #ifdef _LIGHT_STARTMENU
_selected_id = 0; _selected_id = -1;
#endif #endif
} }
@ -69,7 +69,7 @@ StartMenu::StartMenu(HWND hwnd, const StartMenuCreateInfo& create_info)
_border_top = create_info._border_top; _border_top = create_info._border_top;
_last_pos = WindowRect(hwnd).pos(); _last_pos = WindowRect(hwnd).pos();
#ifdef _LIGHT_STARTMENU #ifdef _LIGHT_STARTMENU
_selected_id = 0; _selected_id = -1;
#endif #endif
} }
@ -162,7 +162,7 @@ LRESULT StartMenu::Init(LPCREATESTRUCT pcs)
#else #else
if (!GetWindow(_hwnd, GW_CHILD)) if (!GetWindow(_hwnd, GW_CHILD))
#endif #endif
AddButton(ResString(IDS_EMPTY), 0, false, -1, false); AddButton(ResString(IDS_EMPTY), 0, false, 0, false);
#ifdef _LIGHT_STARTMENU #ifdef _LIGHT_STARTMENU
ResizeToButtons(); ResizeToButtons();
@ -347,7 +347,8 @@ LRESULT StartMenu::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
void StartMenu::Paint(PaintCanvas& canvas) void StartMenu::Paint(PaintCanvas& canvas)
{ {
DrawFloatingButton(canvas); if (_border_top)
DrawFloatingButton(canvas);
#ifdef _LIGHT_STARTMENU #ifdef _LIGHT_STARTMENU
ClientRect clnt(_hwnd); ClientRect clnt(_hwnd);
@ -358,7 +359,7 @@ void StartMenu::Paint(PaintCanvas& canvas)
FontSelection font(canvas, GetStockFont(DEFAULT_GUI_FONT)); FontSelection font(canvas, GetStockFont(DEFAULT_GUI_FONT));
BkMode bk_mode(canvas, TRANSPARENT); BkMode bk_mode(canvas, TRANSPARENT);
for(SMBtnList::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) { for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) {
const SMBtnInfo& info = *it; const SMBtnInfo& info = *it;
if (rect.top > canvas.rcPaint.bottom) if (rect.top > canvas.rcPaint.bottom)
@ -395,7 +396,7 @@ int StartMenu::ButtonHitTest(POINT pt)
if (pt.x<rect.left || pt.x>rect.right) if (pt.x<rect.left || pt.x>rect.right)
return 0; return 0;
for(SMBtnList::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) { for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) {
const SMBtnInfo& info = *it; const SMBtnInfo& info = *it;
if (rect.top > pt.y) if (rect.top > pt.y)
@ -420,7 +421,7 @@ void StartMenu::InvalidateSelection()
ClientRect clnt(_hwnd); ClientRect clnt(_hwnd);
RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT}; RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT};
for(SMBtnList::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) { for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) {
const SMBtnInfo& info = *it; const SMBtnInfo& info = *it;
rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT: STARTMENU_LINE_HEIGHT); rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT: STARTMENU_LINE_HEIGHT);
@ -436,7 +437,7 @@ void StartMenu::InvalidateSelection()
const SMBtnInfo* StartMenu::GetButtonInfo(int id) const const SMBtnInfo* StartMenu::GetButtonInfo(int id) const
{ {
for(SMBtnList::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it)
if (it->_id == id) if (it->_id == id)
return &*it; return &*it;
@ -447,17 +448,21 @@ void StartMenu::SelectButton(int id)
{ {
InvalidateSelection(); InvalidateSelection();
_selected_id = id; const SMBtnInfo* btn = GetButtonInfo(id);
InvalidateSelection(); if (btn && btn->_enabled) {
_selected_id = id;
// automatically open submenus InvalidateSelection();
if (_selected_id)
if (GetButtonInfo(_selected_id)->_hasSubmenu) { // automatically open submenus
if (btn->_hasSubmenu) {
UpdateWindow(_hwnd); // draw focused button before waiting on submenu creation UpdateWindow(_hwnd); // draw focused button before waiting on submenu creation
Command(_selected_id, BN_CLICKED); Command(_selected_id, BN_CLICKED);
} else } else
CloseOtherSubmenus(0); // close any open submenu CloseOtherSubmenus(0); // close any open submenu
} else
_selected_id = -1;
} }
#endif #endif
@ -469,7 +474,7 @@ bool StartMenu::GetButtonRect(int id, PRECT prect)
ClientRect clnt(_hwnd); ClientRect clnt(_hwnd);
RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT}; RECT rect = {_border_left, _border_top, clnt.right, STARTMENU_LINE_HEIGHT};
for(SMBtnList::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) { for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) {
const SMBtnInfo& info = *it; const SMBtnInfo& info = *it;
rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT: STARTMENU_LINE_HEIGHT); rect.bottom = rect.top + (info._id==-1? STARTMENU_SEP_HEIGHT: STARTMENU_LINE_HEIGHT);
@ -843,7 +848,8 @@ void DrawStartMenuButton(HDC hdc, const RECT& rect, LPCTSTR title, HICON hIcon,
static SmallIcon selArrowIcon(IDI_ARROW_SELECTED); static SmallIcon selArrowIcon(IDI_ARROW_SELECTED);
DrawIconEx(hdc, rect.right-16, iconPos.y, DrawIconEx(hdc, rect.right-16, iconPos.y,
has_focus?selArrowIcon:arrowIcon, 16, 16, 0, bk_brush, DI_NORMAL); has_focus? selArrowIcon: arrowIcon,
16, 16, 0, bk_brush, DI_NORMAL);
} }
BkMode bk_mode(hdc, TRANSPARENT); BkMode bk_mode(hdc, TRANSPARENT);
@ -869,7 +875,7 @@ void StartMenu::ResizeToButtons()
int max_width = STARTMENU_WIDTH_MIN; int max_width = STARTMENU_WIDTH_MIN;
int height = 0; int height = 0;
for(SMBtnList::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) { for(SMBtnVector::const_iterator it=_buttons.begin(); it!=_buttons.end(); ++it) {
int w = GetStartMenuBtnTextWidth(canvas, it->_title, _hwnd); int w = GetStartMenuBtnTextWidth(canvas, it->_title, _hwnd);
if (w > max_width) if (w > max_width)

View file

@ -181,7 +181,7 @@ struct SMBtnInfo
bool _enabled; bool _enabled;
}; };
typedef list<SMBtnInfo> SMBtnList; typedef vector<SMBtnInfo> SMBtnVector;
#endif #endif
@ -235,7 +235,7 @@ protected:
StartMenuCreateInfo _create_info; // copy of the original create info StartMenuCreateInfo _create_info; // copy of the original create info
#ifdef _LIGHT_STARTMENU #ifdef _LIGHT_STARTMENU
SMBtnList _buttons; SMBtnVector _buttons;
int _selected_id; int _selected_id;
void ResizeToButtons(); void ResizeToButtons();