finalcut/src/fmenuitem.cpp

911 lines
19 KiB
C++
Raw Normal View History

// File: fmenuitem.cpp
// Provides: class FMenuItem
2015-10-29 21:10:50 +01:00
#include "fapp.h"
2016-06-12 23:06:58 +02:00
#include "fdialog.h"
2015-09-15 23:07:24 +02:00
#include "fmenu.h"
2015-08-16 20:05:39 +02:00
#include "fmenubar.h"
#include "fmenulist.h"
#include "fmenuitem.h"
2015-10-29 21:10:50 +01:00
#include "fstatusbar.h"
//----------------------------------------------------------------------
// class FMenuItem
//----------------------------------------------------------------------
// constructor and destructor
//----------------------------------------------------------------------
2015-09-22 04:18:20 +02:00
FMenuItem::FMenuItem (FWidget* parent)
: FWidget(parent)
, text()
, selected(false)
, separator(false)
, checkable(false)
2015-09-22 04:18:20 +02:00
, checked(false)
, radio_button(false)
, dialog_index(false)
, text_length(0)
2015-09-22 04:18:20 +02:00
, hotkey(0)
2015-11-12 01:33:16 +01:00
, accel_key(0)
2015-09-22 04:18:20 +02:00
, menu(0)
, super_menu(0)
, associated_window(0)
{
init (parent);
}
//----------------------------------------------------------------------
2015-09-22 04:18:20 +02:00
FMenuItem::FMenuItem (FString& txt, FWidget* parent)
: FWidget(parent)
, text(txt)
, selected(false)
, separator(false)
, checkable(false)
2015-09-22 04:18:20 +02:00
, checked(false)
, radio_button(false)
, dialog_index(false)
, text_length(0)
2015-09-22 04:18:20 +02:00
, hotkey(0)
2015-11-12 01:33:16 +01:00
, accel_key(0)
2015-09-22 04:18:20 +02:00
, menu(0)
, super_menu(0)
, associated_window(0)
{
init (parent);
}
//----------------------------------------------------------------------
2015-09-22 04:18:20 +02:00
FMenuItem::FMenuItem (const std::string& txt, FWidget* parent)
: FWidget(parent)
, text(txt)
, selected(false)
, separator(false)
, checkable(false)
2015-09-22 04:18:20 +02:00
, checked(false)
, radio_button(false)
, dialog_index(false)
, text_length(0)
2015-09-22 04:18:20 +02:00
, hotkey(0)
2015-11-12 01:33:16 +01:00
, accel_key(0)
2015-09-22 04:18:20 +02:00
, menu(0)
, super_menu(0)
, associated_window(0)
{
init (parent);
}
//----------------------------------------------------------------------
2015-09-22 04:18:20 +02:00
FMenuItem::FMenuItem (const char* txt, FWidget* parent)
: FWidget(parent)
, text(txt)
, selected(false)
, separator(false)
, checkable(false)
2015-09-22 04:18:20 +02:00
, checked(false)
, radio_button(false)
, dialog_index(false)
, text_length(0)
2015-09-22 04:18:20 +02:00
, hotkey(0)
2015-11-12 01:33:16 +01:00
, accel_key(0)
, menu(0)
, super_menu(0)
, associated_window(0)
2015-11-12 01:33:16 +01:00
{
init (parent);
}
2015-11-12 01:33:16 +01:00
//----------------------------------------------------------------------
FMenuItem::FMenuItem (int k, FString& txt, FWidget* parent)
: FWidget(parent)
, text(txt)
, selected(false)
, separator(false)
, checkable(false)
2015-11-12 01:33:16 +01:00
, checked(false)
, radio_button(false)
, dialog_index(false)
2015-11-12 01:33:16 +01:00
, text_length(0)
, hotkey(0)
, accel_key(k)
, menu(0)
, super_menu(0)
, associated_window(0)
2015-11-12 01:33:16 +01:00
{
init (parent);
}
//----------------------------------------------------------------------
FMenuItem::FMenuItem (int k, const std::string& txt, FWidget* parent)
: FWidget(parent)
, text(txt)
, selected(false)
, separator(false)
, checkable(false)
2015-11-12 01:33:16 +01:00
, checked(false)
, radio_button(false)
, dialog_index(false)
2015-11-12 01:33:16 +01:00
, text_length(0)
, hotkey(0)
, accel_key(k)
2015-09-22 04:18:20 +02:00
, menu(0)
, super_menu(0)
, associated_window(0)
{
init (parent);
}
2015-11-12 01:33:16 +01:00
//----------------------------------------------------------------------
FMenuItem::FMenuItem (int k, const char* txt, FWidget* parent)
: FWidget(parent)
, text(txt)
, selected(false)
, separator(false)
, checkable(false)
2015-11-12 01:33:16 +01:00
, checked(false)
, radio_button(false)
, dialog_index(false)
2015-11-12 01:33:16 +01:00
, text_length(0)
, hotkey(0)
, accel_key(k)
, menu(0)
, super_menu(0)
, associated_window(0)
2015-11-12 01:33:16 +01:00
{
init (parent);
}
//----------------------------------------------------------------------
FMenuItem::~FMenuItem() // destructor
{
delAccelerator();
// remove dialog list item callback from the dialog
if ( associated_window )
associated_window->delCallback(this);
}
// private methods of FMenuItem
//----------------------------------------------------------------------
void FMenuItem::init (FWidget* parent)
{
text_length = text.getLength();
hotkey = hotKey();
2015-11-12 01:33:16 +01:00
if ( hotkey )
text_length--;
2015-11-12 01:33:16 +01:00
2015-10-04 19:01:34 +02:00
setGeometry (1,1,int(text_length+2),1, false);
2015-09-15 23:07:24 +02:00
if ( parent )
{
2015-11-12 01:33:16 +01:00
FMenuList* menu_list;
setSuperMenu (parent);
if ( accel_key )
addAccelerator (accel_key);
menu_list = dynamic_cast<FMenuList*>(parent);
2015-11-07 23:16:09 +01:00
if ( menu_list )
menu_list->insert(this);
2015-10-01 04:44:26 +02:00
2015-09-15 23:07:24 +02:00
if ( isMenuBar(parent) ) // Parent is menubar
{
2015-09-30 22:39:02 +02:00
FMenuBar* menubar_ptr = dynamic_cast<FMenuBar*>(parent);
2015-09-30 22:39:02 +02:00
if ( menubar_ptr )
2015-11-25 22:10:23 +01:00
{
menubar_ptr->calculateDimensions();
2015-11-25 22:10:23 +01:00
if ( hotkey ) // Meta + hotkey
menubar_ptr->addAccelerator (fc::Fmkey_meta + std::tolower(hotkey), this);
2015-11-25 22:10:23 +01:00
}
2015-09-30 22:39:02 +02:00
this->addCallback
(
"deactivate",
_METHOD_CALLBACK (parent, &FMenuBar::cb_item_deactivated)
2015-09-30 22:39:02 +02:00
);
2015-09-15 23:07:24 +02:00
}
else if ( isMenu(parent) ) // Parent is menu
{
2015-11-07 23:16:09 +01:00
FMenu* menu_ptr = dynamic_cast<FMenu*>(parent);
2015-11-07 23:16:09 +01:00
if ( menu_ptr )
menu_ptr->calculateDimensions();
2015-09-15 23:07:24 +02:00
}
}
2015-10-29 21:10:50 +01:00
if ( hasFocus() )
2016-01-24 14:53:09 +01:00
flags = fc::focus;
2015-10-29 21:10:50 +01:00
if ( isEnabled() )
2016-01-24 14:53:09 +01:00
flags |= fc::active;
}
2015-08-16 20:05:39 +02:00
//----------------------------------------------------------------------
uChar FMenuItem::hotKey()
2015-08-16 20:05:39 +02:00
{
uInt length;
if ( text.isEmpty() )
return 0;
length = text.getLength();
for (uInt i=0; i < length; i++)
2015-09-30 22:39:02 +02:00
{
try
{
if ( (i+1 < length) && (text[i] == '&') )
return uChar(text[++i]);
}
catch (const std::out_of_range&)
{
return 0;;
}
}
2015-08-16 20:05:39 +02:00
return 0;
}
//----------------------------------------------------------------------
void FMenuItem::processActivate()
{
emitCallback("activate");
}
2015-09-15 23:07:24 +02:00
//----------------------------------------------------------------------
void FMenuItem::processDeactivate()
2015-09-15 23:07:24 +02:00
{
emitCallback("deactivate");
2015-09-15 23:07:24 +02:00
}
//----------------------------------------------------------------------
void FMenuItem::createDialogList (FMenu* winmenu)
{
winmenu->clear();
if ( dialog_list && ! dialog_list->empty() )
{
widgetList::const_iterator iter, begin;
iter = begin = dialog_list->begin();
while ( iter != dialog_list->end() && *iter )
{
FDialog* win = dynamic_cast<FDialog*>(*iter);
if ( win )
{
2016-07-23 20:56:20 +02:00
int n = int(std::distance(begin, iter));
// get the dialog title
FString name = win->getText();
// create a new dialog list item
FMenuItem* win_item = new FMenuItem (name, winmenu);
if ( n < 9 )
win_item->addAccelerator (fc::Fmkey_1 + n); // Meta + 1..9
win_item->addCallback
(
"clicked",
_METHOD_CALLBACK (win_item, &FMenuItem::cb_switchToDialog),
dynamic_cast<FWidget::data_ptr>(win)
);
win->addCallback
(
"destroy",
_METHOD_CALLBACK (win_item, &FMenuItem::cb_destroyDialog)
);
2016-07-31 20:25:25 +02:00
win_item->associated_window = win;
}
++iter;
}
}
winmenu->calculateDimensions();
}
//----------------------------------------------------------------------
void FMenuItem::cb_switchToDialog (FWidget*, void* data_ptr)
{
FDialog* win = static_cast<FDialog*>(data_ptr);
2016-07-25 23:50:57 +02:00
if ( win )
{
2016-07-25 23:50:57 +02:00
FWidget* focus_widget = getFocusWidget();
FAccelEvent a_ev (fc::Accelerator_Event, focus_widget);
FApplication::sendEvent (win, &a_ev);
}
}
//----------------------------------------------------------------------
void FMenuItem::cb_destroyDialog (FWidget* widget, void*)
{
FDialog* win = static_cast<FDialog*>(widget);
2016-07-28 23:38:17 +02:00
FApplication* fapp = static_cast<FApplication*>(getRootWidget());
if ( win && fapp )
{
delAccelerator(win);
delCallback(win);
associated_window = 0;
}
}
//----------------------------------------------------------------------
void FMenuItem::processClicked()
{
emitCallback("clicked");
}
// protected methods of FMenuItem
2016-06-12 23:06:58 +02:00
//----------------------------------------------------------------------
bool FMenuItem::isWindowsMenu (FWidget* w) const
{
return ( ! w ) ? false : w->isDialogWidget();
2016-06-12 23:06:58 +02:00
}
2015-09-30 22:39:02 +02:00
//----------------------------------------------------------------------
bool FMenuItem::isMenuBar (FWidget* w) const
2015-09-30 22:39:02 +02:00
{
if ( ! w )
return false;
else
return bool( std::strcmp ( w->getClassName()
, const_cast<char*>("FMenuBar") ) == 0 );
2015-09-30 22:39:02 +02:00
}
2015-08-22 18:53:52 +02:00
//----------------------------------------------------------------------
bool FMenuItem::isMenu (FWidget* w) const
2015-08-22 18:53:52 +02:00
{
if ( ! w )
return false;
bool m1 = ( std::strcmp ( w->getClassName()
, const_cast<char*>("FMenu") ) == 0 );
bool m2 = ( std::strcmp ( w->getClassName()
, const_cast<char*>("FDialogListMenu") ) == 0 );
return bool( m1 || m2 );
2015-08-22 18:53:52 +02:00
}
// public methods of FMenuItem
2015-11-12 01:33:16 +01:00
//----------------------------------------------------------------------
void FMenuItem::addAccelerator (int key, FWidget* obj)
{
FWidget* root = getRootWidget();
accelerator accel = { key, obj };
2015-11-12 01:33:16 +01:00
if ( root && root->accelerator_list )
2015-11-12 01:33:16 +01:00
{
accel_key = key;
root->accelerator_list->push_back(accel);
}
if ( isMenu(super_menu) )
{
FMenu* menu_ptr = dynamic_cast<FMenu*>(super_menu);
if ( menu_ptr )
menu_ptr->calculateDimensions();
2015-11-12 01:33:16 +01:00
}
}
//----------------------------------------------------------------------
void FMenuItem::delAccelerator (FWidget* obj)
{
FWidget* root = getRootWidget();
if ( root
&& root->accelerator_list
&& ! root->accelerator_list->empty() )
2015-11-12 01:33:16 +01:00
{
FWidget::Accelerators::iterator iter;
iter = root->accelerator_list->begin();
2015-11-12 01:33:16 +01:00
while ( iter != root->accelerator_list->end() )
2015-11-12 01:33:16 +01:00
{
if ( iter->object == obj )
2015-11-12 01:33:16 +01:00
{
accel_key = 0;
iter = root->accelerator_list->erase(iter);
2015-11-12 01:33:16 +01:00
}
else
++iter;
2015-11-12 01:33:16 +01:00
}
}
if ( isMenu(super_menu) )
{
FMenu* menu_ptr = dynamic_cast<FMenu*>(super_menu);
if ( menu_ptr )
menu_ptr->calculateDimensions();
}
2015-11-12 01:33:16 +01:00
}
//----------------------------------------------------------------------
2015-10-29 21:10:50 +01:00
void FMenuItem::onKeyPress (FKeyEvent* ev)
{
if ( ! super_menu )
return;
if ( isMenu(super_menu) )
{
FMenu* smenu = dynamic_cast<FMenu*>(super_menu);
if ( smenu )
smenu->onKeyPress(ev);
}
2015-10-29 21:10:50 +01:00
if ( isMenuBar(super_menu) )
{
FMenuBar* mbar = dynamic_cast<FMenuBar*>(super_menu);
if ( mbar )
{
if ( mbar->hotkeyMenu(ev) )
return;
mbar->onKeyPress(ev);
}
}
}
2016-06-12 23:06:58 +02:00
//----------------------------------------------------------------------
void FMenuItem::onMouseDoubleClick (FMouseEvent* ev)
{
if ( ! super_menu )
return;
const FPoint& t = ev->getTermPos();
int b = ev->getButton();
if ( isMenu(super_menu) )
2016-06-12 23:06:58 +02:00
{
FMenu* smenu = dynamic_cast<FMenu*>(super_menu);
2016-06-12 23:06:58 +02:00
if ( smenu )
2016-06-12 23:06:58 +02:00
{
const FPoint& p2 = smenu->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseDoubleClick_Event, p2, t, b);
smenu->onMouseDoubleClick(_ev);
delete _ev;
2016-06-12 23:06:58 +02:00
}
}
2016-06-12 23:06:58 +02:00
if ( isMenuBar(super_menu) )
{
FMenuBar* mbar = dynamic_cast<FMenuBar*>(super_menu);
if ( mbar )
{
const FPoint& p2 = mbar->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseDoubleClick_Event, p2, t, b);
mbar->onMouseDoubleClick(_ev);
delete _ev;
2016-06-12 23:06:58 +02:00
}
}
2016-06-12 23:06:58 +02:00
if ( isWindowsMenu(super_menu) )
{
FDialog* dgl = dynamic_cast<FDialog*>(super_menu);
if ( dgl )
{
const FPoint& p2 = dgl->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseDoubleClick_Event, p2, t, b);
dgl->onMouseDoubleClick(_ev);
delete _ev;
2016-06-12 23:06:58 +02:00
}
}
}
2015-09-28 04:31:29 +02:00
//----------------------------------------------------------------------
void FMenuItem::onMouseDown (FMouseEvent* ev)
{
if ( ! super_menu )
return;
const FPoint& t = ev->getTermPos();
int b = ev->getButton();
if ( isMenu(super_menu) )
2015-09-30 22:39:02 +02:00
{
FMenu* smenu = dynamic_cast<FMenu*>(super_menu);
if ( smenu )
2015-10-01 04:44:26 +02:00
{
const FPoint& p2 = smenu->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseDown_Event, p2, t, b);
smenu->onMouseDown(_ev);
delete _ev;
2015-10-01 04:44:26 +02:00
}
}
2015-10-01 03:48:58 +02:00
if ( isMenuBar(super_menu) )
{
FMenuBar* mbar = dynamic_cast<FMenuBar*>(super_menu);
if ( mbar )
{
const FPoint& p2 = mbar->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseDown_Event, p2, t, b);
mbar->onMouseDown(_ev);
delete _ev;
2015-10-01 04:44:26 +02:00
}
}
2016-06-12 23:06:58 +02:00
if ( isWindowsMenu(super_menu) )
{
FDialog* dgl = dynamic_cast<FDialog*>(super_menu);
if ( dgl )
{
const FPoint& p2 = dgl->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseDown_Event, p2, t, b);
dgl->onMouseDown(_ev);
delete _ev;
2016-06-12 23:06:58 +02:00
}
}
2015-09-28 04:31:29 +02:00
}
//----------------------------------------------------------------------
void FMenuItem::onMouseUp (FMouseEvent* ev)
{
if ( ! super_menu )
return;
const FPoint& t = ev->getTermPos();
int b = ev->getButton();
if ( isMenu(super_menu) )
2015-09-30 22:39:02 +02:00
{
FMenu* smenu = dynamic_cast<FMenu*>(super_menu);
if ( smenu )
2015-10-01 04:44:26 +02:00
{
const FPoint& p2 = smenu->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseUp_Event, p2, t, b);
smenu->onMouseUp(_ev);
delete _ev;
2015-10-01 04:44:26 +02:00
}
}
2015-10-01 03:48:58 +02:00
if ( isMenuBar(super_menu) )
{
FMenuBar* mbar = dynamic_cast<FMenuBar*>(super_menu);
if ( mbar )
{
const FPoint& p2 = mbar->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseUp_Event, p2, t, b);
mbar->onMouseUp(_ev);
delete _ev;
2015-10-01 04:44:26 +02:00
}
}
2016-06-12 23:06:58 +02:00
if ( isWindowsMenu(super_menu) )
{
FDialog* dgl = dynamic_cast<FDialog*>(super_menu);
if ( dgl )
{
const FPoint& p2 = dgl->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseUp_Event, p2, t, b);
dgl->onMouseUp(_ev);
delete _ev;
2016-06-12 23:06:58 +02:00
}
}
2015-09-28 04:31:29 +02:00
}
//----------------------------------------------------------------------
void FMenuItem::onMouseMove (FMouseEvent* ev)
{
if ( ! super_menu )
return;
const FPoint& t = ev->getTermPos();
int b = ev->getButton();
if ( isMenu(super_menu) )
2015-09-30 22:39:02 +02:00
{
FMenu* smenu = dynamic_cast<FMenu*>(super_menu);
if ( smenu )
2015-10-01 04:44:26 +02:00
{
const FPoint& p2 = smenu->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseMove_Event, p2, t, b);
smenu->onMouseMove(_ev);
delete _ev;
2015-10-01 04:44:26 +02:00
}
}
2015-10-01 03:48:58 +02:00
if ( isMenuBar(super_menu) )
{
FMenuBar* mbar = dynamic_cast<FMenuBar*>(super_menu);
if ( mbar )
{
const FPoint& p2 = mbar->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseMove_Event, p2, t, b);
mbar->onMouseMove(_ev);
delete _ev;
2015-10-01 04:44:26 +02:00
}
}
2015-09-28 04:31:29 +02:00
if ( isWindowsMenu(super_menu) )
{
FDialog* dgl = dynamic_cast<FDialog*>(super_menu);
if ( dgl )
{
const FPoint& p2 = dgl->termToWidgetPos(t);
FMouseEvent* _ev = new FMouseEvent (fc::MouseMove_Event, p2, t, b);
dgl->onMouseMove(_ev);
delete _ev;
2016-06-12 23:06:58 +02:00
}
}
2015-09-28 04:31:29 +02:00
}
2015-10-29 21:10:50 +01:00
//----------------------------------------------------------------------
void FMenuItem::onAccel (FAccelEvent* ev)
{
if ( ! isEnabled() || isSelected() )
return;
if ( ! super_menu || ! isMenuBar(super_menu) )
2015-10-29 21:10:50 +01:00
{
processClicked();
return;
}
FMenuBar* mbar = dynamic_cast<FMenuBar*>(super_menu);
if ( ! mbar )
return;
if ( menu )
{
FWidget* focused_widget;
if ( mbar->getSelectedItem() )
mbar->getSelectedItem()->unsetSelected();
setSelected();
mbar->selected_item = this;
openMenu();
focused_widget = static_cast<FWidget*>(ev->focusedWidget());
FFocusEvent out (fc::FocusOut_Event);
FApplication::queueEvent(focused_widget, &out);
menu->unselectItem();
menu->selectFirstItem();
if ( menu->getSelectedItem() )
menu->getSelectedItem()->setFocus();
if ( focused_widget )
focused_widget->redraw();
menu->redraw();
if ( statusBar() )
statusBar()->drawMessage();
mbar->redraw();
mbar->drop_down = true;
}
else
{
unsetSelected();
mbar->selected_item = 0;
mbar->redraw();
processClicked();
mbar->drop_down = false;
2015-10-29 21:10:50 +01:00
}
ev->accept();
2015-10-29 21:10:50 +01:00
}
//----------------------------------------------------------------------
void FMenuItem::onFocusIn (FFocusEvent*)
{
if ( statusBar() )
statusBar()->drawMessage();
}
//----------------------------------------------------------------------
void FMenuItem::onFocusOut (FFocusEvent*)
{
unsetSelected();
if ( super_menu && isMenuBar(super_menu) )
{
FMenuBar* mbar = dynamic_cast<FMenuBar*>(super_menu);
if ( mbar )
mbar->redraw();
}
2015-10-29 21:10:50 +01:00
if ( statusBar() )
{
statusBar()->clearMessage();
statusBar()->drawMessage();
}
}
//----------------------------------------------------------------------
bool FMenuItem::setEnable (bool on)
{
FWidget::setEnable(on);
FWidget* super = getSuperMenu();
if ( on )
{
2016-01-24 14:53:09 +01:00
flags |= fc::active;
2015-10-29 21:10:50 +01:00
if ( super && isMenuBar(super) )
{
// Meta + hotkey
super->addAccelerator (fc::Fmkey_meta + std::tolower(hotkey), this);
2015-10-29 21:10:50 +01:00
}
}
else
{
2016-01-24 14:53:09 +01:00
flags &= ~fc::active;
2015-10-29 21:10:50 +01:00
if ( super && isMenuBar(super) )
super->delAccelerator (this);
}
2015-10-29 21:10:50 +01:00
return on;
}
//----------------------------------------------------------------------
bool FMenuItem::setFocus (bool on)
{
FWidget::setFocus(on);
if ( on )
{
2016-01-24 14:53:09 +01:00
flags |= fc::focus;
2015-10-29 21:10:50 +01:00
if ( isEnabled() )
{
2015-11-07 23:16:09 +01:00
if ( ! selected )
{
FMenuList* menu_list = dynamic_cast<FMenuList*>(getSuperMenu());
setSelected();
2015-11-08 02:01:35 +01:00
if ( menu_list )
{
menu_list->unselectItem();
menu_list->setSelectedItem(this);
}
2015-11-07 23:16:09 +01:00
if ( statusBar() )
statusBar()->drawMessage();
FWidget* parent = getSuperMenu();
2015-11-07 23:16:09 +01:00
if ( isMenuBar(parent) )
{
FMenuBar* menubar_ptr = dynamic_cast<FMenuBar*>(parent);
2015-11-07 23:16:09 +01:00
if ( menubar_ptr )
menubar_ptr->redraw();
}
else if ( isMenu(parent) )
{
FMenu* menu_ptr = dynamic_cast<FMenu*>(parent);
2015-11-07 23:16:09 +01:00
if ( menu_ptr )
menu_ptr->redraw();
}
}
if ( statusBar() )
2015-10-29 21:10:50 +01:00
{
FString msg = getStatusbarMessage();
FString curMsg = statusBar()->getMessage();
2015-10-29 21:10:50 +01:00
if ( curMsg != msg )
statusBar()->setMessage(msg);
}
2015-10-29 21:10:50 +01:00
}
}
else
{
2016-01-24 14:53:09 +01:00
flags &= ~fc::focus;
2015-10-29 21:10:50 +01:00
if ( isEnabled() && statusBar() )
statusBar()->clearMessage();
}
2015-10-29 21:10:50 +01:00
return on;
}
//----------------------------------------------------------------------
2015-08-16 20:05:39 +02:00
void FMenuItem::setSelected()
{
2015-10-29 21:10:50 +01:00
if ( isEnabled() )
2015-08-22 18:53:52 +02:00
{
2015-09-22 04:18:20 +02:00
selected = true;
2015-08-22 18:53:52 +02:00
processActivate();
}
}
//----------------------------------------------------------------------
2015-09-30 22:39:02 +02:00
void FMenuItem::unsetSelected()
{
selected = false;
processDeactivate();
}
//----------------------------------------------------------------------
void FMenuItem::openMenu()
{
2015-11-25 22:10:23 +01:00
FMenu* dd_menu; // Drop-down menu
FMenu* open_menu;
if ( ! hasMenu() )
return;
dd_menu = getMenu(); // Drop-down menu
if ( dd_menu->isVisible() )
return;
open_menu = static_cast<FMenu*>(getOpenMenu());
if ( open_menu && open_menu != dd_menu )
{
open_menu->hide();
open_menu->hideSubMenus();
}
if ( dialog_index )
createDialogList (dd_menu);
setOpenMenu(dd_menu);
dd_menu->setVisible();
dd_menu->show();
dd_menu->raiseWindow(dd_menu);
dd_menu->redraw();
updateTerminal();
flush_out();
}
2015-09-30 22:39:02 +02:00
//----------------------------------------------------------------------
void FMenuItem::setText (FString& txt)
{
2015-09-22 04:18:20 +02:00
text = txt;
text_length = text.getLength();
hotkey = hotKey();
if ( hotkey )
text_length--;
2015-10-04 19:01:34 +02:00
setWidth(int(text_length));
}
//----------------------------------------------------------------------
2015-10-04 19:01:34 +02:00
void FMenuItem::setText (const std::string& txt)
{
2015-10-04 19:01:34 +02:00
FString s = FString(txt);
setText (s);
2015-08-16 20:05:39 +02:00
}
//----------------------------------------------------------------------
2015-10-04 19:01:34 +02:00
void FMenuItem::setText (const char* txt)
2015-08-16 20:05:39 +02:00
{
2015-10-04 19:01:34 +02:00
FString s = FString(txt);
setText (s);
}