add selection box to various "choose one of these" menu items
jump to
@@ -1,6 +1,9 @@
(Format: Year/Month/Day) Changes for 1.1 *08/08/04: + * Add selection box to various "choose one of these" menu items (Mark) + Toolbar.cc Slit.cc Screen.cc LayerMenu.hh Xinerama.hh StyleMenuItem.cc/hh + added FbTk/RadioMenuItem.hh * Add window list argument to ArrangeWindows (Mark) WorkspaceCmd.cc/hh *08/06/26:
@@ -170,7 +170,7 @@
1 Clients 2 Cycle Down 3 Cycle Up -4 Slit Direction +4 Slit Direction: 5 Slit Layer 6 Slit on Head 7 Slit Placement
@@ -170,7 +170,7 @@
1 Clients 2 Cycle Down 3 Cycle Up -4 Slit Direction +4 Slit Direction: 5 Slit Layer 6 Slit on Head 7 Slit Placement
@@ -170,7 +170,7 @@
1 Clients 2 Cycle Down 3 Cycle Up -4 Slit Direction +4 Slit Direction: 5 Slit Layer 6 Slit on Head 7 Slit Placement
@@ -170,7 +170,7 @@
1 Clients 2 Cycle Down 3 Cycle Up -4 Slit Direction +4 Slit Direction: 5 Slit Layer 6 Slit on Head 7 Slit Placement
@@ -170,7 +170,7 @@
1 Clients 2 Cycle Down 3 Cycle Up -4 Slit Direction +4 Slit Direction: 5 Slit Layer 6 Slit on Head 7 Slit Placement
@@ -170,7 +170,7 @@
1 Clients 2 Cycle Down 3 Cycle Up -4 Slit Direction +4 Slit Direction: 5 Slit Layer 6 Slit on Head 7 Slit Placement
@@ -170,7 +170,7 @@
1 Clients 2 Cycle Down 3 Cycle Up -4 Slit Direction +4 Slit Direction: 5 Slit Layer 6 Slit on Head 7 Slit Placement
@@ -0,0 +1,63 @@
+// RadioMenuItem.hh +// Copyright (c) 2008 Fluxbox Team (fluxgen at fluxbox dot org) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +#ifndef FBTK_RADIOMENUITEM_HH +#define FBTK_RADIOMENUITEM_HH + +#include "MenuItem.hh" + +namespace FbTk { + +class RadioMenuItem: public MenuItem { +public: + RadioMenuItem(): MenuItem() { setToggleItem(true); } + + explicit RadioMenuItem(const FbString &label): + MenuItem(label) { + setToggleItem(true); + } + + RadioMenuItem(const FbString &label, Menu &host_menu): + MenuItem(label, host_menu) { + setToggleItem(true); + } + + /// create a menu item with a specific command to be executed on click + RadioMenuItem(const FbString &label, RefCount<Command<void> > &cmd, + Menu *menu = 0): + MenuItem(label, cmd, menu) { + setToggleItem(true); + } + + RadioMenuItem(const FbString &label, Menu *submenu, Menu *host_menu = 0): + MenuItem(label, submenu, host_menu) { + setToggleItem(true); + } + + virtual ~RadioMenuItem() { } + + virtual bool isSelected() const = 0; + bool isEnabled() const { return !isSelected(); } +}; + +} // end namespace FbTk + +#endif // FBTK_RADIOMENUITEM_HH
@@ -24,7 +24,7 @@ #ifndef FOCUSMODELMENUITEM_HH
#define FOCUSMODELMENUITEM_HH -#include "FbTk/MenuItem.hh" +#include "FbTk/RadioMenuItem.hh" #include "FbTk/RefCount.hh" namespace FbTk {@@ -33,22 +33,22 @@ }
#include "FocusControl.hh" -class FocusModelMenuItem : public FbTk::MenuItem { +class FocusModelMenuItem : public FbTk::RadioMenuItem { public: FocusModelMenuItem(const FbTk::FbString &label, FocusControl &focus_control, FocusControl::FocusModel model, FbTk::RefCount<FbTk::Command<void> > &cmd): - FbTk::MenuItem(label, cmd), + FbTk::RadioMenuItem(label, cmd), m_focus_control(focus_control), m_focusmodel(model) { setCloseOnClick(false); } - bool isEnabled() const { return m_focus_control.focusModel() != m_focusmodel; } + bool isSelected() const { return m_focus_control.focusModel() == m_focusmodel; } void click(int button, int time, unsigned int mods) { m_focus_control.setFocusModel(m_focusmodel); - FbTk::MenuItem::click(button, time, mods); + FbTk::RadioMenuItem::click(button, time, mods); } private:@@ -56,23 +56,23 @@ FocusControl &m_focus_control;
FocusControl::FocusModel m_focusmodel; }; -class TabFocusModelMenuItem : public FbTk::MenuItem { +class TabFocusModelMenuItem : public FbTk::RadioMenuItem { public: TabFocusModelMenuItem(const FbTk::FbString &label, FocusControl &focus_control, FocusControl::TabFocusModel model, FbTk::RefCount<FbTk::Command<void> > &cmd): - FbTk::MenuItem(label, cmd), + FbTk::RadioMenuItem(label, cmd), m_focus_control(focus_control), m_tabfocusmodel(model) { setCloseOnClick(false); } - bool isEnabled() const { return m_focus_control.tabFocusModel() != m_tabfocusmodel; } + bool isSelected() const { return m_focus_control.tabFocusModel() == m_tabfocusmodel; } void click(int button, int time, unsigned int mods) { m_focus_control.setTabFocusModel(m_tabfocusmodel); - FbTk::MenuItem::click(button, time, mods); + FbTk::RadioMenuItem::click(button, time, mods); } private:
@@ -39,7 +39,7 @@
#include "FbTk/STLUtil.hh" #include "FbTk/I18n.hh" #include "FbTk/Menu.hh" -#include "FbTk/MenuItem.hh" +#include "FbTk/RadioMenuItem.hh" #include "FbTk/BoolMenuItem.hh" #include "FbTk/RefCount.hh" #include "FbTk/SimpleCommand.hh"@@ -99,18 +99,18 @@ } // end namespace FbTk
namespace { -class ToolbarModeMenuItem : public FbTk::MenuItem { +class ToolbarModeMenuItem : public FbTk::RadioMenuItem { public: ToolbarModeMenuItem(const FbTk::FbString &label, IconbarTool &handler, string mode, FbTk::RefCount<FbTk::Command<void> > &cmd): - FbTk::MenuItem(label, cmd), m_handler(handler), m_mode(mode) { + FbTk::RadioMenuItem(label, cmd), m_handler(handler), m_mode(mode) { setCloseOnClick(false); } - bool isEnabled() const { return m_handler.mode() != m_mode; } + bool isSelected() const { return m_handler.mode() == m_mode; } void click(int button, int time, unsigned int mods) { m_handler.setMode(m_mode); - FbTk::MenuItem::click(button, time, mods); + FbTk::RadioMenuItem::click(button, time, mods); } private:@@ -118,18 +118,18 @@ IconbarTool &m_handler;
string m_mode; }; -class ToolbarAlignMenuItem: public FbTk::MenuItem { +class ToolbarAlignMenuItem: public FbTk::RadioMenuItem { public: ToolbarAlignMenuItem(const FbTk::FbString &label, IconbarTool &handler, FbTk::Container::Alignment mode, FbTk::RefCount<FbTk::Command<void> > &cmd): - FbTk::MenuItem(label, cmd), m_handler(handler), m_mode(mode) { + FbTk::RadioMenuItem(label, cmd), m_handler(handler), m_mode(mode) { setCloseOnClick(false); } - bool isEnabled() const { return m_handler.alignment() != m_mode; } + bool isSelected() const { return m_handler.alignment() == m_mode; } void click(int button, int time, unsigned int mods) { m_handler.setAlignment(m_mode); - FbTk::MenuItem::click(button, time, mods); + FbTk::RadioMenuItem::click(button, time, mods); } private:
@@ -26,7 +26,7 @@
#include "ToggleMenu.hh" -#include "FbTk/MenuItem.hh" +#include "FbTk/RadioMenuItem.hh" class LayerObject { public:@@ -37,20 +37,20 @@ };
/// this class holds the layermenu items -class LayerMenuItem : public FbTk::MenuItem { +class LayerMenuItem : public FbTk::RadioMenuItem { public: LayerMenuItem(const FbTk::FbString &label, LayerObject *object, int layernum, FbTk::RefCount<FbTk::Command<void> > &cmd): - FbTk::MenuItem(label, cmd), m_object(object), m_layernum(layernum) {} + FbTk::RadioMenuItem(label, cmd), m_object(object), m_layernum(layernum) {} LayerMenuItem(const FbTk::FbString &label, LayerObject *object, int layernum): - FbTk::MenuItem(label), m_object(object), m_layernum(layernum) {} + FbTk::RadioMenuItem(label), m_object(object), m_layernum(layernum) {} - bool isEnabled() const { return m_object->layerNumber() != m_layernum; } + bool isSelected() const { return m_object->layerNumber() == m_layernum; } void click(int button, int time, unsigned int mods) { m_object->moveToLayer(m_layernum); - FbTk::MenuItem::click(button, time, mods); + FbTk::RadioMenuItem::click(button, time, mods); } private:
@@ -38,6 +38,7 @@ // menu items
#include "FbTk/BoolMenuItem.hh" #include "FbTk/IntMenuItem.hh" #include "FocusModelMenuItem.hh" +#include "RadioMenuItem.hh" // menus #include "FbMenu.hh"@@ -174,21 +175,21 @@ return -1;
} -class TabPlacementMenuItem: public FbTk::MenuItem { +class TabPlacementMenuItem: public FbTk::RadioMenuItem { public: TabPlacementMenuItem(FbTk::FbString & label, BScreen &screen, FbWinFrame::TabPlacement place, FbTk::RefCount<FbTk::Command<void> > &cmd): - FbTk::MenuItem(label, cmd), + FbTk::RadioMenuItem(label, cmd), m_screen(screen), m_place(place) { setCloseOnClick(false); } - bool isEnabled() const { return m_screen.getTabPlacement() != m_place; } + bool isSelected() const { return m_screen.getTabPlacement() == m_place; } void click(int button, int time, unsigned int mods) { m_screen.saveTabPlacement(m_place); - FbTk::MenuItem::click(button, time, mods); + FbTk::RadioMenuItem::click(button, time, mods); }
@@ -57,6 +57,7 @@ #include "FbTk/StringUtil.hh"
#include "FbTk/I18n.hh" #include "FbTk/BoolMenuItem.hh" #include "FbTk/IntMenuItem.hh" +#include "FbTk/RadioMenuItem.hh" #ifdef HAVE_SYS_STAT_H #include <sys/types.h>@@ -236,16 +237,16 @@ Slit &m_slit;
string m_label; }; -class PlaceSlitMenuItem: public FbTk::MenuItem { +class PlaceSlitMenuItem: public FbTk::RadioMenuItem { public: PlaceSlitMenuItem(const FbTk::FbString &label, Slit &slit, Slit::Placement place, FbTk::RefCount<FbTk::Command<void> > &cmd): - FbTk::MenuItem(label, cmd), m_slit(slit), m_place(place) { + FbTk::RadioMenuItem(label, cmd), m_slit(slit), m_place(place) { setCloseOnClick(false); } - bool isEnabled() const { return m_slit.placement() != m_place; } + bool isSelected() const { return m_slit.placement() == m_place; } void click(int button, int time, unsigned int mods) { m_slit.setPlacement(m_place); - FbTk::MenuItem::click(button, time, mods); + FbTk::RadioMenuItem::click(button, time, mods); } private: Slit &m_slit;@@ -1291,7 +1292,7 @@ alpha_menuitem->setCommand(set_alpha_cmd);
m_slitmenu.insert(alpha_menuitem); - m_slitmenu.insert(new SlitDirMenuItem(_FB_XTEXT(Slit, Direction, "Slit Direction", "Orientation of slit"), + m_slitmenu.insert(new SlitDirMenuItem(_FB_XTEXT(Slit, Direction, "Slit Direction:", "Orientation of slit"), *this, save_and_reconfigure)); m_slitmenu.insert(_FB_XTEXT(Slit, ClientsMenu, "Clients", "Slit client menu"), &m_clientlist_menu);
@@ -28,7 +28,7 @@
#include "FbTk/StringUtil.hh" StyleMenuItem::StyleMenuItem(const FbTk::FbString &label, const std::string &filename): - FbTk::MenuItem(label), + FbTk::RadioMenuItem(label), m_filename(filename) { // perform shell style ~ home directory expansion // and insert style
@@ -23,9 +23,9 @@
#ifndef STYLEMENUITEM_HH #define STYLEMENUITEM_HH -#include "FbTk/MenuItem.hh" +#include "FbTk/RadioMenuItem.hh" -class StyleMenuItem: public FbTk::MenuItem { +class StyleMenuItem: public FbTk::RadioMenuItem { public: StyleMenuItem(const FbTk::FbString &label, const std::string &filename); bool isSelected() const;
@@ -156,16 +156,22 @@ }
} // end namespace FbTk namespace { -class SetToolbarPlacementCmd: public FbTk::Command<void> { + +class PlaceToolbarMenuItem: public FbTk::RadioMenuItem { public: - SetToolbarPlacementCmd(Toolbar &tbar, Toolbar::Placement place):m_tbar(tbar), m_place(place) { } - void execute() { - m_tbar.setPlacement(m_place); - m_tbar.reconfigure(); + PlaceToolbarMenuItem(const FbTk::FbString &label, Toolbar &toolbar, + Toolbar::Placement place): + FbTk::RadioMenuItem(label), m_toolbar(toolbar), m_place(place) { + setCloseOnClick(false); + } + bool isSelected() const { return m_toolbar.placement() == m_place; } + void click(int button, int time, unsigned int mods) { + m_toolbar.setPlacement(m_place); + m_toolbar.reconfigure(); Fluxbox::instance()->save_rc(); } private: - Toolbar &m_tbar; + Toolbar &m_toolbar; Toolbar::Placement m_place; };@@ -909,11 +915,10 @@
if (str == "") { placementMenu().insert(""); placementMenu().setItemEnabled(i, false); - } else { - RefCommand setplace(new SetToolbarPlacementCmd(*this, placement)); - placementMenu().insert(str, setplace); + } else + placementMenu().insert(new PlaceToolbarMenuItem(str, *this, + placement)); - } place_menu.pop_front(); } }
@@ -29,7 +29,7 @@ #include "Screen.hh"
#include "FbTk/RefCount.hh" #include "FbTk/SimpleCommand.hh" -#include "FbTk/MenuItem.hh" +#include "FbTk/RadioMenuItem.hh" // provides a generic way for giving an object a xinerama head menu // The object must have two functions:@@ -38,18 +38,18 @@ // void setOnHead(int)
/// this class holds the xinerama items template <typename ItemType> -class XineramaHeadMenuItem : public FbTk::MenuItem { +class XineramaHeadMenuItem : public FbTk::RadioMenuItem { public: XineramaHeadMenuItem(const FbTk::FbString &label, ItemType &object, int headnum, FbTk::RefCount<FbTk::Command<void> > &cmd): - FbTk::MenuItem(label,cmd), m_object(object), m_headnum(headnum) {} + FbTk::RadioMenuItem(label,cmd), m_object(object), m_headnum(headnum) {} XineramaHeadMenuItem(const FbTk::FbString &label, ItemType &object, int headnum): - FbTk::MenuItem(label), m_object(object), m_headnum(headnum) {} + FbTk::RadioMenuItem(label), m_object(object), m_headnum(headnum) {} - bool isEnabled() const { return m_object.getOnHead() != m_headnum; } + bool isSelected() const { return m_object.getOnHead() == m_headnum; } void click(int button, int time, unsigned int mods) { m_object.saveOnHead(m_headnum); - FbTk::MenuItem::click(button, time, mods); + FbTk::RadioMenuItem::click(button, time, mods); } private: