Home » U++ Library support » Menus&Toolbars » Menubar rendering problem when navigating with keyboard
Re: Menubar rendering problem when navigating with keyboard [message #17059 is a reply to message #16968] |
Sat, 26 July 2008 20:04   |
 |
mirek
Messages: 14257 Registered: November 2005
|
Ultimate Member |
|
|
Thanks, fixed.
Quick fix:
bool MenuBar::Key(dword key, int count)
{
LLOG("KEY " << GetKeyDesc(key));
bool horz = IsChild();
if((horz ? key == K_RIGHT : key == K_DOWN)) {
Ctrl *ctrl = GetFocusChildDeep();
LLOG("MenuBar::Key(" << key << ") -> IterateFocusForward for " << UPP::Name(ctrl) << ", pane " << UPP::Name(&pane));
if(HasMouseDeep())
GetMouseCtrl()->Refresh();
if(ctrl && IterateFocusForward(ctrl, &pane, false, false, true))
return true;
Ctrl *f = pane.GetFirstChild();
if(!f) return true;
if(f->IsEnabled()) {
f->SetFocus();
return true;
}
if(IterateFocusForward(pane.GetFirstChild(), &pane, false, false, true)) return true;
}
else
if((horz ? key == K_LEFT : key == K_UP)) {
Ctrl *ctrl = GetFocusChildDeep();
LLOG("MenuBar::Key(" << key << ") -> IterateFocusBackward for " << UPP::Name(ctrl) << ", pane " << UPP::Name(&pane));
if(HasMouseDeep())
GetMouseCtrl()->Refresh();
if(ctrl && IterateFocusBackward(ctrl, &pane, false, true))
return true;
Ctrl *f = pane.GetLastChild();
if(!f) return true;
if(f->IsEnabled()) {
f->SetFocus();
return true;
}
if(IterateFocusBackward(pane.GetLastChild(), &pane, false, true)) return true;
}
else
if(parentmenu && !parentmenu->IsChild() && key == K_LEFT || key == K_ESCAPE) {
if(HasMouseDeep())
GetMouseCtrl()->Refresh();
if(parentmenu && parentmenu->submenu)
parentmenu->submenuitem->SetFocus();
else
if(IsChild() && HasFocusDeep()) {
if(restorefocus)
restorefocus->SetFocus();
doeffect = true;
return true;
}
if(IsPopUp()) {
SubmenuClose();
return true;
}
doeffect = true;
}
if(parentmenu && parentmenu->IsChild() && parentmenu->GetActiveSubmenu() &&
parentmenu->pane.GetFirstChild() && parentmenu->submenuitem) {
Ctrl *smi = parentmenu->submenuitem;
Ctrl *q = smi;
q->Refresh();
if(key == K_RIGHT)
for(;;) {
q = q->GetNext();
if(!q)
q = parentmenu->pane.GetFirstChild();
if(q == smi)
break;
if(PullMenu(q)) {
q->Refresh(); // This is the fix (1/2)
SyncState();
return true;
}
}
if(key == K_LEFT)
for(;;) {
q = q->GetPrev();
if(!q)
q = parentmenu->pane.GetLastChild();
if(q == smi)
break;
if(PullMenu(q)) {
q->Refresh(); // This is the fix (2/2)
SyncState();
return true;
}
}
}
return HotKey(key);
}
Mirek
|
|
|
Goto Forum:
Current Time: Sat May 10 18:33:04 CEST 2025
Total time taken to generate the page: 0.02520 seconds
|