Bind accelerator key from the FMenuItem to the root widget

This commit is contained in:
Markus Gans 2016-07-14 00:12:16 +02:00
parent 2acda53224
commit 9ef3bd3243
4 changed files with 39 additions and 58 deletions

View File

@ -1,3 +1,6 @@
2016-07-13 Markus Gans <guru.mail@muenster.de>
* Bind accelerator key from the FMenuItem to the root widget
2016-07-12 Markus Gans <guru.mail@muenster.de>
* The status bar and the menu bar insert now the accelerator keys
into the global scope of the root widget

View File

@ -177,8 +177,11 @@ Class digramm
: : │ ┌───┤ FMenuBar │ :
: : ┌───────────┐ └─────┤ └──────────┘ :
: : │ FMenuList │◄──────────┤ ┌───────┐ :
: : └────┬──────┘ └───┤ FMenu │ :
: : : └───────┘ :
: : └────┬──────┘ └───┤ FMenu │◄──┐ :
: : : └───────┘ │ :
: : : ┌─────────────────┐ │ :
: : : │ FDialogListMenu ├───┘ :
: : : └─────────────────┘ :
: : 1: ┌────────────────┐* :
: : : *┌───────────┐ ┌──┤ FCheckMenuItem ├-┐ :
: : ├--┤ FMenuItem │◄─┤ └────────────────┘ : :

View File

@ -78,8 +78,11 @@
: : │ ┌───┤ FMenuBar │ :
: : ┌───────────┐ └─────┤ └──────────┘ :
: : │ FMenuList │◄──────────┤ ┌───────┐ :
: : └────┬──────┘ └───┤ FMenu │ :
: : : └───────┘ :
: : └────┬──────┘ └───┤ FMenu │◄──┐ :
: : : └───────┘ │ :
: : : ┌─────────────────┐ │ :
: : : │ FDialogListMenu ├───┘ :
: : : └─────────────────┘ :
: : 1: ┌────────────────┐* :
: : : *┌───────────┐ ┌──┤ FCheckMenuItem ├-┐ :
: : ├--┤ FMenuItem │◄─┤ └────────────────┘ : :

View File

@ -319,12 +319,15 @@ void FMenuItem::processClicked()
//----------------------------------------------------------------------
bool FMenuItem::isWindowsMenu (FWidget* w) const
{
return w->isDialog();
return ( ! w ) ? false : w->isDialog();
}
//----------------------------------------------------------------------
bool FMenuItem::isMenuBar (FWidget* w) const
{
if ( ! w )
return false;
else
return bool( strcmp ( w->getClassName()
, const_cast<char*>("FMenuBar") ) == 0 );
}
@ -332,6 +335,9 @@ bool FMenuItem::isMenuBar (FWidget* w) const
//----------------------------------------------------------------------
bool FMenuItem::isMenu (FWidget* w) const
{
if ( ! w )
return false;
bool m1 = ( strcmp ( w->getClassName()
, const_cast<char*>("FMenu") ) == 0 );
bool m2 = ( strcmp ( w->getClassName()
@ -344,30 +350,13 @@ bool FMenuItem::isMenu (FWidget* w) const
//----------------------------------------------------------------------
void FMenuItem::addAccelerator (int key, FWidget* obj)
{
FWidget* super = super_menu;
if ( ! super )
return;
while ( super && strncmp ( super->getClassName()
, const_cast<char*>("FMenu"), 5) == 0 )
{
super = super->getParentWidget();
}
if ( super )
{
FWidget* window = FWindow::getWindowWidget(super);
FWidget* root = getRootWidget();
accelerator accel = { key, obj };
if ( ! window )
window = getRootWidget();
if ( window && window->accelerator_list )
if ( root && root->accelerator_list )
{
accel_key = key;
window->accelerator_list->push_back(accel);
}
root->accelerator_list->push_back(accel);
}
if ( isMenu(super_menu) )
@ -382,43 +371,26 @@ void FMenuItem::addAccelerator (int key, FWidget* obj)
//----------------------------------------------------------------------
void FMenuItem::delAccelerator (FWidget* obj)
{
FWidget* super = super_menu;
FWidget* root = getRootWidget();
if ( ! super )
return;
while ( super && strncmp ( super->getClassName()
, const_cast<char*>("FMenu"), 5) == 0 )
{
super = super->getParentWidget();
}
if ( super )
{
FWidget* window = FWindow::getWindowWidget(super);
if ( ! window )
window = getRootWidget();
if ( window
&& window->accelerator_list
&& ! window->accelerator_list->empty() )
if ( root
&& root->accelerator_list
&& ! root->accelerator_list->empty() )
{
FWidget::Accelerators::iterator iter;
iter = window->accelerator_list->begin();
iter = root->accelerator_list->begin();
while ( iter != window->accelerator_list->end() )
while ( iter != root->accelerator_list->end() )
{
if ( iter->object == obj )
{
accel_key = 0;
iter = window->accelerator_list->erase(iter);
iter = root->accelerator_list->erase(iter);
}
else
++iter;
}
}
}
if ( isMenu(super_menu) )
{