25 #define YUILogComponent "ncurses"
26 #include <yui/YUILog.h>
27 #include "NCPopupMenu.h"
34 YTableItem * tableItem;
39 bool isSelectable()
const
44 return menuItem->isEnabled() && !menuItem->isSeparator();
50 NCPopupMenu::NCPopupMenu(
const wpos & at, YItemIterator begin, YItemIterator end )
54 std::vector<std::string> row( 2 );
57 for ( YItemIterator it = begin; it != end; ++it )
59 YMenuItem * menuItem =
dynamic_cast<YMenuItem *
>( *it );
60 YUI_CHECK_PTR( menuItem );
62 if ( ! menuItem->isVisible() )
65 row[0] = menuItem->label();
66 row[1] = menuItem->hasChildren() ?
"..." :
"";
68 YTableItem *tableItem =
new YTableItem( row[0], row[1] );
71 NCTableLine::STATE state = menuItem->isEnabled() ? NCTableLine::S_NORMAL : NCTableLine::S_DISABLED;
73 addItem( tableItem, state );
76 item->tableItem = tableItem;
77 item->menuItem = menuItem;
88 NCPopupMenu::~NCPopupMenu()
90 for (Item * item : _items)
103 Item * item = selectedItem();
107 if ( item->menuItem->hasChildren() )
108 event = NCursesEvent::button;
111 event = NCursesEvent::key;
112 event.keySymbol =
"CursorRight";
120 event = NCursesEvent::key;
122 event.keySymbol =
"CursorLeft";
123 event.detail = NCursesEvent::CONTINUE;
132 selectPreviousItem();
136 event = NCursesEvent::key;
137 event.keySymbol =
"BackSpace";
143 Item * item = selectedItem();
145 if ( item && ! item->menuItem->hasChildren() )
147 event = NCursesEvent::SelectionChanged;
148 event.detail = item->tableItem->index();
152 event = NCPopup::wHandleInput( ch );
158 event = wHandleHotkey( ch );
160 if ( event == NCursesEvent::none )
161 event = NCPopup::wHandleInput( ch );
172 NCursesEvent event = NCPopupTable::wHandleHotkey( key );
174 if ( event == NCursesEvent::none )
176 event = NCursesEvent::key;
177 event.keySymbol =
"Hotkey";
185 bool NCPopupMenu::postAgain()
189 int selection = ( postevent == NCursesEvent::button ) ? getCurrentItem() : -1;
191 Item * item = selectedItem();
196 yuiDebug() <<
"Menu item: " << item->menuItem->label() << std::endl;
198 if ( selection != -1 )
200 if ( item->menuItem->hasChildren() )
203 wpos at( ScreenPos() +
wpos( selection, inparent.Sze.W - 1 ) );
205 item->menuItem->childrenBegin(),
206 item->menuItem->childrenEnd() );
207 YUI_CHECK_NEW( dialog );
209 again = ( dialog->post( &postevent ) == NCursesEvent::CONTINUE );
211 YDialog::deleteTopmostDialog();
216 postevent.selection = item->menuItem;
226 updateSelectedItem();
228 return *_items.current();
232 void NCPopupMenu::selectNextItem()
234 selectItem( _items.next() );
238 void NCPopupMenu::selectPreviousItem()
240 selectItem( _items.previous() );
244 void NCPopupMenu::updateSelectedItem()
246 YTableItem * tableItem =
dynamic_cast<YTableItem *
> ( getCurrentItemPointer() );
251 CyclicContainer<Item>::Iterator newCurrent = findItem( tableItem);
253 if ( newCurrent == _items.end() )
256 if ( _items.current() != newCurrent )
257 selectItem( newCurrent );
263 return find_if( _items.begin(), _items.end(), [tableItem](Item * item) {
264 return item->tableItem == tableItem;
269 void NCPopupMenu::selectItem( CyclicContainer<Item>::Iterator item )
271 _items.setCurrent( item );
273 if ( item != _items.end() )
275 int index = std::distance(_items.begin(), item);
277 setCurrentItem(index);