make MenuItem responsible for decision to close menu when clicked

This commit is contained in:
Mark Tiefenbruck 2007-12-17 21:09:20 -08:00
parent c39af52bfc
commit 31df2d8bd6
8 changed files with 43 additions and 31 deletions

View file

@ -34,11 +34,13 @@ public:
FbTk::MenuItem(label, cmd), m_item(item) { FbTk::MenuItem(label, cmd), m_item(item) {
FbTk::MenuItem::setSelected(m_item); FbTk::MenuItem::setSelected(m_item);
setToggleItem(true); setToggleItem(true);
setCloseOnClick(false);
} }
BoolMenuItem(const FbTk::FbString &label, bool &item): BoolMenuItem(const FbTk::FbString &label, bool &item):
FbTk::MenuItem(label), m_item(item) { FbTk::MenuItem(label), m_item(item) {
FbTk::MenuItem::setSelected(m_item); FbTk::MenuItem::setSelected(m_item);
setToggleItem(true); setToggleItem(true);
setCloseOnClick(false);
} }
bool isSelected() const { return m_item; } bool isSelected() const { return m_item; }
// toggle state // toggle state

View file

@ -199,15 +199,15 @@ Menu::~Menu() {
} }
int Menu::insert(const FbString &label, RefCount<Command> &cmd, int pos) { int Menu::insert(const FbString &label, RefCount<Command> &cmd, int pos) {
return insert(new MenuItem(label, cmd), pos); return insert(new MenuItem(label, cmd, this), pos);
} }
int Menu::insert(const FbString &label, int pos) { int Menu::insert(const FbString &label, int pos) {
return insert(new MenuItem(label), pos); return insert(new MenuItem(label, *this), pos);
} }
int Menu::insert(const FbString &label, Menu *submenu, int pos) { int Menu::insert(const FbString &label, Menu *submenu, int pos) {
return insert(new MenuItem(label, submenu), pos); return insert(new MenuItem(label, submenu, this), pos);
} }
int Menu::insert(MenuItem *item, int pos) { int Menu::insert(MenuItem *item, int pos) {
@ -516,15 +516,15 @@ void Menu::show() {
raise(); raise();
if (shown && shown != this && shown != m_parent) if (shown && shown != this && shown != m_parent)
shown->hide(true); shown->hide();
shown = this; shown = this;
} }
void Menu::hide(bool force) { void Menu::hide() {
if (!isVisible() || m_torn && !force) if (!isVisible())
return; return;
// if parent is visible, go to first parent and hide it // if parent is visible, go to first parent and hide it
@ -570,6 +570,9 @@ void Menu::redrawFrame(FbDrawable &drawable) {
void Menu::internal_hide(bool first) { void Menu::internal_hide(bool first) {
if (!first && m_torn)
return;
if (validIndex(m_which_sub)) { if (validIndex(m_which_sub)) {
MenuItem *tmp = menuitems[m_which_sub]; MenuItem *tmp = menuitems[m_which_sub];
tmp->submenu()->internal_hide(false); tmp->submenu()->internal_hide(false);
@ -815,8 +818,6 @@ void Menu::handleEvent(XEvent &event) {
if (event.type == FocusOut) { if (event.type == FocusOut) {
if (s_focused == this) if (s_focused == this)
s_focused = 0; s_focused = 0;
if (shown == this && !m_torn)
hide();
// I don't know why, but I get a FocusIn event when closing the menu with // I don't know why, but I get a FocusIn event when closing the menu with
// the mouse over it -- probably an xorg bug, but it's easy to address here // the mouse over it -- probably an xorg bug, but it's easy to address here
} else if (event.type == FocusIn && m_visible) { } else if (event.type == FocusIn && m_visible) {
@ -1275,9 +1276,9 @@ void Menu::drawLine(int index, int size){
item->drawLine(menu.frame, theme(), size, item_x, item_y, menu.item_w); item->drawLine(menu.frame, theme(), size, item_x, item_y, menu.item_w);
} }
void Menu::hideShownMenu(bool force) { void Menu::hideShownMenu() {
if (shown) if (shown)
shown->hide(force); shown->hide();
} }
}; // end namespace FbTk }; // end namespace FbTk

View file

@ -124,7 +124,7 @@ public:
/// show menu /// show menu
virtual void show(); virtual void show();
/// hide menu /// hide menu
virtual void hide(bool force = false); virtual void hide();
virtual void clearWindow(); virtual void clearWindow();
#ifdef NOT_USED #ifdef NOT_USED
void setActiveIndex(int index) { m_active_index = index; } void setActiveIndex(int index) { m_active_index = index; }
@ -160,7 +160,7 @@ public:
inline unsigned char alpha() const { return theme().alpha(); } inline unsigned char alpha() const { return theme().alpha(); }
inline static Menu *shownMenu() { return shown; } inline static Menu *shownMenu() { return shown; }
inline static Menu *focused() { return s_focused; } inline static Menu *focused() { return s_focused; }
static void hideShownMenu(bool force = true); static void hideShownMenu();
/// @return menuitem at index /// @return menuitem at index
inline const MenuItem *find(unsigned int index) const { return menuitems[index]; } inline const MenuItem *find(unsigned int index) const { return menuitems[index]; }
inline MenuItem *find(unsigned int index) { return menuitems[index]; } inline MenuItem *find(unsigned int index) { return menuitems[index]; }

View file

@ -35,6 +35,8 @@ namespace FbTk {
void MenuItem::click(int button, int time) { void MenuItem::click(int button, int time) {
if (m_command.get() != 0) { if (m_command.get() != 0) {
if (m_menu && m_close_on_click)
m_menu->hide();
// we need a local variable, since the command may destroy this object // we need a local variable, since the command may destroy this object
RefCount<Command> tmp(m_command); RefCount<Command> tmp(m_command);
tmp->execute(); tmp->execute();

View file

@ -47,15 +47,16 @@ public:
m_submenu(0), m_submenu(0),
m_enabled(true), m_enabled(true),
m_selected(false), m_selected(false),
m_close_on_click(true),
m_toggle_item(false) m_toggle_item(false)
{ } { }
explicit MenuItem( explicit MenuItem(const FbString &label)
const FbString &label)
: m_label(label), : m_label(label),
m_menu(0), m_menu(0),
m_submenu(0), m_submenu(0),
m_enabled(true), m_enabled(true),
m_selected(false), m_selected(false),
m_close_on_click(true),
m_toggle_item(false) m_toggle_item(false)
{ } { }
@ -65,26 +66,28 @@ public:
m_submenu(0), m_submenu(0),
m_enabled(true), m_enabled(true),
m_selected(false), m_selected(false),
m_close_on_click(true),
m_toggle_item(false) m_toggle_item(false)
{ } { }
/// create a menu item with a specific command to be executed on click /// create a menu item with a specific command to be executed on click
MenuItem(const FbString &label, RefCount<Command> &cmd, Menu *menu = 0): MenuItem(const FbString &label, RefCount<Command> &cmd, Menu *menu = 0)
m_label(label), : m_label(label),
m_menu(menu), m_menu(menu),
m_submenu(0), m_submenu(0),
m_command(cmd), m_command(cmd),
m_enabled(true), m_enabled(true),
m_selected(false), m_selected(false),
m_toggle_item(false) { m_close_on_click(true),
m_toggle_item(false)
} { }
MenuItem(const FbString &label, Menu *submenu, Menu *host_menu = 0) MenuItem(const FbString &label, Menu *submenu, Menu *host_menu = 0)
: m_label(label) : m_label(label),
, m_menu(host_menu) m_menu(host_menu),
, m_submenu(submenu) m_submenu(submenu),
, m_enabled(true) m_enabled(true),
, m_selected(false), m_selected(false),
m_close_on_click(true),
m_toggle_item(false) m_toggle_item(false)
{ } { }
virtual ~MenuItem() { } virtual ~MenuItem() { }
@ -94,6 +97,7 @@ public:
virtual void setEnabled(bool enabled) { m_enabled = enabled; } virtual void setEnabled(bool enabled) { m_enabled = enabled; }
virtual void setLabel(const FbString &label) { m_label = label; } virtual void setLabel(const FbString &label) { m_label = label; }
virtual void setToggleItem(bool val) { m_toggle_item = val; } virtual void setToggleItem(bool val) { m_toggle_item = val; }
void setCloseOnClick(bool val) { m_close_on_click = val; }
void setIcon(const std::string &filename, int screen_num); void setIcon(const std::string &filename, int screen_num);
virtual Menu *submenu() { return m_submenu; } virtual Menu *submenu() { return m_submenu; }
/** /**
@ -150,7 +154,7 @@ private:
Menu *m_submenu; ///< a submenu, 0 if we don't have one Menu *m_submenu; ///< a submenu, 0 if we don't have one
RefCount<Command> m_command; ///< command to be executed RefCount<Command> m_command; ///< command to be executed
bool m_enabled, m_selected; bool m_enabled, m_selected;
bool m_toggle_item; bool m_close_on_click, m_toggle_item;
int m_index; int m_index;
struct Icon { struct Icon {

View file

@ -37,6 +37,7 @@ public:
FbTk::MenuItem(label, host_menu), m_org_label(FbTk::MenuItem::label()), FbTk::MenuItem(label, host_menu), m_org_label(FbTk::MenuItem::label()),
m_max(max_val), m_min(min_val), m_res(res) { m_max(max_val), m_min(min_val), m_res(res) {
updateLabel(); updateLabel();
setCloseOnClick(false);
} }
/* Utility, but doesn't get found in anonymous namespace? */ /* Utility, but doesn't get found in anonymous namespace? */

View file

@ -40,6 +40,7 @@ RootCmdMenuItem::RootCmdMenuItem(const FbTk::FbString &label,
setwp_cmd(new FbCommands::ExecuteCmd(prog + " \"" + m_filename + "\"")); setwp_cmd(new FbCommands::ExecuteCmd(prog + " \"" + m_filename + "\""));
setCommand(setwp_cmd); setCommand(setwp_cmd);
setToggleItem(true); setToggleItem(true);
setCloseOnClick(false);
} }

View file

@ -39,6 +39,7 @@ StyleMenuItem::StyleMenuItem(const FbTk::FbString &label, const std::string &fil
SetStyleCmd(m_filename)); SetStyleCmd(m_filename));
setCommand(setstyle_cmd); setCommand(setstyle_cmd);
setToggleItem(true); setToggleItem(true);
setCloseOnClick(false);
} }