aboutsummaryrefslogtreecommitdiff
path: root/src/FbTk
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbTk')
-rw-r--r--src/FbTk/Menu.cc58
-rw-r--r--src/FbTk/Menu.hh4
2 files changed, 41 insertions, 21 deletions
diff --git a/src/FbTk/Menu.cc b/src/FbTk/Menu.cc
index 40f81c8..7128152 100644
--- a/src/FbTk/Menu.cc
+++ b/src/FbTk/Menu.cc
@@ -109,7 +109,8 @@ Menu::Menu(FbTk::ThemeProxy<MenuTheme> &tm, ImageControl &imgctrl):
109 m_alignment(ALIGNDONTCARE), 109 m_alignment(ALIGNDONTCARE),
110 m_active_index(-1), 110 m_active_index(-1),
111 m_shape(0), 111 m_shape(0),
112 m_need_update(true) { 112 m_need_update(true),
113 m_single_trigger(false) {
113 // setup timers 114 // setup timers
114 115
115 RefCount<Command<void> > show_cmd(new SimpleCommand<Menu>(*this, &Menu::openSubmenu)); 116 RefCount<Command<void> > show_cmd(new SimpleCommand<Menu>(*this, &Menu::openSubmenu));
@@ -861,6 +862,10 @@ bool Menu::isItemSelectable(unsigned int index) const {
861 return (!item || !item->isEnabled()) ? false : true; 862 return (!item || !item->isEnabled()) ? false : true;
862} 863}
863 864
865bool Menu::isSingleTrigger() const {
866
867 return m_single_trigger || (parent() && parent()->isSingleTrigger());
868}
864 869
865void Menu::handleEvent(XEvent &event) { 870void Menu::handleEvent(XEvent &event) {
866 if (event.type == FocusOut) { 871 if (event.type == FocusOut) {
@@ -1123,19 +1128,7 @@ void Menu::keyPressEvent(XKeyEvent &event) {
1123 break; 1128 break;
1124 case XK_KP_Enter: 1129 case XK_KP_Enter:
1125 case XK_Return: 1130 case XK_Return:
1126 resetTypeAhead(); 1131 goto click_on_item;
1127 if (validIndex(m_active_index) &&
1128 isItemEnabled(m_active_index)) {
1129 // send fake button click
1130 int button = (event.state & ShiftMask) ? 3 : 1;
1131 if (menuitems[m_active_index]->submenu() != 0 && button == 1)
1132 enterSubmenu();
1133 else {
1134 find(m_active_index)->click(button, event.time, event.state);
1135 m_need_update = true;
1136 updateMenu();
1137 }
1138 }
1139 break; 1132 break;
1140 case XK_Tab: 1133 case XK_Tab:
1141 case XK_ISO_Left_Tab: 1134 case XK_ISO_Left_Tab:
@@ -1150,15 +1143,38 @@ void Menu::keyPressEvent(XKeyEvent &event) {
1150 drawTypeAheadItems(); 1143 drawTypeAheadItems();
1151 break; 1144 break;
1152 default: 1145 default:
1153 m_type_ahead.putCharacter(keychar[0]); 1146 {
1154 // if current item doesn't match new search string, find the next one 1147 m_type_ahead.putCharacter(keychar[0]);
1155 drawTypeAheadItems(); 1148 drawTypeAheadItems();
1156 if (!m_matches.empty() && (!validIndex(m_active_index) || 1149 // if current item doesn't match new search string, find the next one
1157 std::find(m_matches.begin(), m_matches.end(), 1150 if (!m_matches.empty() && (!validIndex(m_active_index) ||
1158 find(m_active_index)) == m_matches.end())) 1151 std::find(m_matches.begin(), m_matches.end(),
1159 cycleItems(false); 1152 find(m_active_index)) == m_matches.end()))
1153 cycleItems(false);
1154
1155 if (isSingleTrigger() && m_matches.size() == 1) {
1156 goto click_on_item;
1157 }
1158 }
1160 break; 1159 break;
1161 } 1160 }
1161 return;
1162
1163// TODO: 'goto' is just the temporary solution to this code sharing
1164click_on_item:
1165 resetTypeAhead();
1166 if (validIndex(m_active_index) &&
1167 isItemEnabled(m_active_index)) {
1168 // send fake button click
1169 int button = (event.state & ShiftMask) ? 3 : 1;
1170 if (menuitems[m_active_index]->submenu() != 0 && button == 1)
1171 enterSubmenu();
1172 else {
1173 find(m_active_index)->click(button, event.time, event.state);
1174 m_need_update = true;
1175 updateMenu();
1176 }
1177 }
1162} 1178}
1163 1179
1164void Menu::leaveNotifyEvent(XCrossingEvent &ce) { 1180void Menu::leaveNotifyEvent(XCrossingEvent &ce) {
diff --git a/src/FbTk/Menu.hh b/src/FbTk/Menu.hh
index bd830b4..114872b 100644
--- a/src/FbTk/Menu.hh
+++ b/src/FbTk/Menu.hh
@@ -91,6 +91,9 @@ public:
91 91
92 void setScreen(int x, int y, int w, int h); 92 void setScreen(int x, int y, int w, int h);
93 93
94 void setSingleTrigger(bool flag) { m_single_trigger = flag; };
95 bool isSingleTrigger() const;
96
94 /** 97 /**
95 @name event handlers 98 @name event handlers
96 */ 99 */
@@ -201,6 +204,7 @@ private:
201 Menuitems menuitems; 204 Menuitems menuitems;
202 TypeAhead<Menuitems, MenuItem *> m_type_ahead; 205 TypeAhead<Menuitems, MenuItem *> m_type_ahead;
203 Menuitems m_matches; 206 Menuitems m_matches;
207 bool m_single_trigger;
204 208
205 void resetTypeAhead(); 209 void resetTypeAhead();
206 void drawTypeAheadItems(); 210 void drawTypeAheadItems();