void WMenuItem::setMenu(WMenu *menu) { subMenu_ = menu; subMenu_->parentItem_ = this; Wt::WContainerWidget *sparent = dynamic_cast<Wt::WContainerWidget *>(subMenu_->parent()); if (sparent) sparent->removeWidget(subMenu_); addWidget(subMenu_); if (subMenu_->isPopup() && parentMenu() && parentMenu()->isPopup()) { subMenu_->webWidget()->setZIndex(std::max(parentMenu()->zIndex() + 100, subMenu_->zIndex())); } WPopupMenu *popup = dynamic_cast<WPopupMenu *>(subMenu_); if (popup) { popup->setJavaScriptMember("wtNoReparent", "true"); setSelectable(false); popup->setButton(anchor()); updateInternalPath(); // WPopupMenus are hidden by default, 'show' this WPopupMenu // but not really, since the parent is still hidden. This fixes // an issue where child widgets would remain unexposed, even // though this submenu was open (e.g. in a submenu where items // are checkable) if (dynamic_cast<WPopupMenu*>(menu_)) popup->show(); } }
WPopupMenu * WEXPORT WMdiWindow::getMdiPopup() { /**********************************************/ WPopupMenu *mdipopup = new WPopupMenu( "&Window" ); mdipopup->insertItem( new WMenuItem( "&Cascade", this, (cbm)&WMdiWindow::cascadeChildren ), 0 ); mdipopup->setMdiPopup(); return( mdipopup ); }
void WsMenu::onMouseWentOver(WPushButton* pButton) { if ( !pButton ) return; if ( !pButton->menu() ) return; WPopupMenu* pPopup = dynamic_cast<WPopupMenu*>(pButton->menu()); if ( asString(option("align")) == "right" ) pPopup->popup(pButton, Wt::Horizontal); else pPopup->popup(pButton, Wt::Vertical); }
void WPopupMenu::connectSignals(WPopupMenu * const topLevel) { topLevel_ = topLevel; itemSelected().connect(topLevel, &WPopupMenu::done); for (int i = 0; i < count(); ++i) { WMenuItem *item = itemAt(i); WPopupMenu *subMenu = dynamic_cast<WPopupMenu *>(item->menu()); if (subMenu) subMenu->connectSignals(topLevel); } }
/** \brief Process the result of the popup menu */ void popupAction() { if (popup_->result()) { /* * You could also bind extra data to an item using setData() and * check here for the action asked. For now, we just use the text. */ WString text = popup_->result()->text(); popup_->hide(); popupActionBox_ = new WMessageBox("Sorry.","Action '" + text + "' is not implemented.", NoIcon, Ok); popupActionBox_->buttonClicked() .connect(this, &TreeViewDragDrop::dialogDone); popupActionBox_->show(); } else { popup_->hide(); } }
void WMenuItem::setMenu(WMenu *menu) { subMenu_ = menu; subMenu_->parentItem_ = this; Wt::WContainerWidget *sparent = dynamic_cast<Wt::WContainerWidget *>(subMenu_->parent()); if (sparent) sparent->removeWidget(subMenu_); addWidget(subMenu_); WPopupMenu *popup = dynamic_cast<WPopupMenu *>(subMenu_); if (popup) { popup->setJavaScriptMember("wtNoReparent", "true"); setSelectable(false); popup->setButton(anchor()); updateInternalPath(); } }
void WPopupMenu::adjustPadding() { bool needPadding = false; for (int i = 0; i < count(); ++i) { WMenuItem *item = itemAt(i); if (!item->icon().empty() || item->isCheckable()) { needPadding = true; break; } } for (int i = 0; i < count(); ++i) { WMenuItem *item = itemAt(i); item->setItemPadding(needPadding); WPopupMenu *subMenu = dynamic_cast<WPopupMenu *>(item->menu()); if (subMenu) subMenu->adjustPadding(); } }
void WsMenu::createMenu(NodePtr curNode, WMenu* menuParent) { std::string path2Icon; WsUser* pUser = WsApp->wsUser(); std::string sIcon = curNode.get()->getProperties().get()->get("global", "icon", ""); if ( sIcon.size() > 1 ) { NodePtr tmpNode = curNode; if ( tmpNode.get()->isRegularFile() ) tmpNode = curNode.get()->getParent(); if ( tmpNode.get() ) { path2Icon = tmpNode.get()->getFullPath().string() + "/ws.res/icones/" + sIcon; if ( !boost::filesystem::exists(path2Icon) ) path2Icon.clear(); else { boost::algorithm::replace_first(path2Icon, WsApp->docRoot(), ""); } } } if ( asString(option("useButtons")) == "true" ) { if ( curNode.get()->getPath().string() != "/" ) if ( asString(option("useSeparator")) == "true" ) { WText* pText = new WText("|", this); pText->addStyleClass("WsMenuSep"); } WPushButton* button = new WPushButton(curNode.get()->getDisplayName(true), this); m_vPushButton.push_back(button); if ( path2Icon.size() > 1 ) { button->setIcon(WLink(WLink::Url, path2Icon)); if ( curNode.get()->getProperties().get()->get("global", "button_text", "true") == "false" ) button->setText(""); } // TODO : Ameliorer cette fonction if ( (curNode.get()->isDirectory() && asString(option("directorySelectable")) == "true") || pUser->isAdministrator() || pUser->isEditor() || (asString(option("showRoot")) == "true" && curNode.get()->getPath() == "/") ) { button->setLink(WLink(WLink::InternalPath, curNode.get()->getPath().string())); } if ( curNode.get()->isRegularFile() ) { button->setLink(makeLink(curNode.get()->getPath().string(), false)); if ( button->link().type() == WLink::Url ) button->setLinkTarget(TargetNewWindow); } bool popupAllowed = (curNode.get()->getProperties().get()->get("global", "allow_popup", "true") == "true" ? true : false); if ( curNode.get()->isDirectory() && popupAllowed && asString(option("usePopupMenu")) == "true" ) { if ( !(asString(option("noRootPopup")) == "true" && curNode.get()->getPath() == "/") ) { WPopupMenu* pPopup = new WPopupMenu(); pPopup->addStyleClass("wt-no-reparent"); loadPopupMenu(curNode, pPopup); button->setMenu(pPopup); pPopup->setAutoHide(true); button->mouseWentOver().connect(boost::bind(&WsMenu::onMouseWentOver, this, button)); button->setMouseOverDelay(50); } } } else { // No buttons, standard menu if ( curNode.get()->getPath().string() != "/" ) menuParent->addSeparator(); WMenuItem* pItem = menuParent->addItem(curNode.get()->getDisplayName(true)); pItem->setLink(WLink(WLink::InternalPath, curNode.get()->getPath().string())); if ( path2Icon.size() > 1 ) pItem->setIcon(path2Icon); if ( curNode.get()->isDirectory() && asString(option("usePopupMenu")) == "true" ) if ( curNode.get()->getDirectories().size() ) { WPopupMenu* pPopup = new WPopupMenu(); pPopup->addStyleClass("wt-no-reparent"); loadPopupMenu(curNode, pPopup); pItem->setMenu(pPopup); } } }
/*! \brief Show a popup for a folder item. */ void showPopup(const WModelIndex& item, const WMouseEvent& event) { if (event.button() == WMouseEvent::RightButton) { // Select the item, it was not yet selected. if (!folderView_->isSelected(item)) folderView_->select(item); if (!popup_) { popup_ = new WPopupMenu(); popup_->addItem("icons/folder_new.gif", "Create a New Folder"); popup_->addItem("Rename this Folder")->setCheckable(true); popup_->addItem("Delete this Folder"); popup_->addSeparator(); popup_->addItem("Folder Details"); popup_->addSeparator(); popup_->addItem("Application Inventory"); popup_->addItem("Hardware Inventory"); popup_->addSeparator(); WPopupMenu *subMenu = new WPopupMenu(); subMenu->addItem("Sub Item 1"); subMenu->addItem("Sub Item 2"); popup_->addMenu("File Deployments", subMenu); /* * This is one method of executing a popup, which does not block a * thread for a reentrant event loop, and thus scales. * * Alternatively you could call WPopupMenu::exec(), which returns * the result, but while waiting for it, blocks the thread. */ popup_->aboutToHide().connect(this, &TreeViewDragDrop::popupAction); } if (popup_->isHidden()) popup_->popup(event); else popup_->hide(); } }
WWidget *FormWidgets::wPopupMenu() { WContainerWidget *result = new WContainerWidget(); topic("WPopupMenu", "WPopupMenuItem", result); addText(tr("formwidgets-WPopupMenu"), result); WPopupMenu *popup = new WPopupMenu(); popup->setAutoHide(true, 1000); popup->addItem("icons/house.png", "Build a house"); popup->addItem("Roof included")->setCheckable(true); popup->addItem("Add a door")->setDisabled(true); popup->addSeparator(); popup->addItem("Add a window"); WPopupMenu *subMenu = new WPopupMenu(); subMenu->addItem("Add a chair"); subMenu->addItem("Add a table"); popup->addMenu("Add furniture", subMenu); popup->aboutToHide().connect(boost::bind(&FormWidgets::popupAction, this, popup)); WLabel* clickMe = new WLabel("Clicking here will show a popup menu.", result); clickMe->setStyleClass("popupmenuLabel"); clickMe->clicked().connect(popup, &WPopupMenu::popup); return result; }
void WBootstrapTheme::apply(WWidget *widget, DomElement& element, int elementRole) const { bool creating = element.mode() == DomElement::Mode::Create; if (!widget->isThemeStyleEnabled()) return; { WPopupWidget *popup = dynamic_cast<WPopupWidget *>(widget); if (popup) { WDialog *dialog = dynamic_cast<WDialog *>(widget); if (!dialog) element.addPropertyWord(Property::Class, "dropdown-menu"); } } switch (element.type()) { case DomElementType::A: { if (creating && dynamic_cast<WPushButton *>(widget)) element.addPropertyWord(Property::Class, classBtn(widget)); WPushButton *btn = dynamic_cast<WPushButton *>(widget); if (creating && btn && btn->isDefault()) element.addPropertyWord(Property::Class, "btn-primary"); if (element.getProperty(Property::Class).find("dropdown-toggle") != std::string::npos) { WMenuItem *item = dynamic_cast<WMenuItem *>(widget->parent()); if (!dynamic_cast<WPopupMenu *>(item->parentMenu())) { DomElement *b = DomElement::createNew(DomElementType::B); b->setProperty(Property::Class, "caret"); element.addChild(b); } } break; } case DomElementType::BUTTON: { if (creating && !widget->hasStyleClass("list-group-item")) element.addPropertyWord(Property::Class, classBtn(widget)); WPushButton *button = dynamic_cast<WPushButton *>(widget); if (button) { if (creating && button->isDefault()) element.addPropertyWord(Property::Class, "btn-primary"); if (button->menu() && element.properties().find(Property::InnerHTML) != element.properties().end()) { element.addPropertyWord(Property::InnerHTML, "<span class=\"caret\"></span>"); } if (creating && !button->text().empty()) element.addPropertyWord(Property::Class, "with-label"); if (!button->link().isNull()) LOG_ERROR("Cannot use WPushButton::setLink() after the button has " "been rendered with WBootstrapTheme"); } break; } case DomElementType::DIV: { WDialog *dialog = dynamic_cast<WDialog *>(widget); if (dialog) { if (version_ == BootstrapVersion::v2) element.addPropertyWord(Property::Class, "modal"); else element.addPropertyWord(Property::Class, "modal-dialog Wt-dialog"); return; } WPanel *panel = dynamic_cast<WPanel *>(widget); if (panel) { element.addPropertyWord(Property::Class, classAccordionGroup()); return; } WProgressBar *bar = dynamic_cast<WProgressBar *>(widget); if (bar) { switch (elementRole) { case MainElement: element.addPropertyWord(Property::Class, "progress"); break; case ProgressBarBar: element.addPropertyWord(Property::Class, classBar()); break; case ProgressBarLabel: element.addPropertyWord(Property::Class, "bar-label"); } return; } WGoogleMap *map = dynamic_cast<WGoogleMap *>(widget); if (map) { element.addPropertyWord(Property::Class, "Wt-googlemap"); return; } WAbstractItemView *itemView = dynamic_cast<WAbstractItemView *>(widget); if (itemView) { element.addPropertyWord(Property::Class, "form-inline"); return; } WNavigationBar *navBar = dynamic_cast<WNavigationBar *>(widget); if (navBar) { element.addPropertyWord(Property::Class, classNavbar()); return; } } break; case DomElementType::LABEL: { if (elementRole == 1) { if (version_ == BootstrapVersion::v3) { WCheckBox *cb = dynamic_cast<WCheckBox *>(widget); WRadioButton *rb = nullptr; if (cb) { element.addPropertyWord(Property::Class, widget->isInline() ? "checkbox-inline" : "checkbox"); } else { rb = dynamic_cast<WRadioButton *>(widget); if (rb) element.addPropertyWord(Property::Class, widget->isInline() ? "radio-inline" : "radio"); } if ((cb || rb) && !widget->isInline()) element.setType(DomElementType::DIV); } else { WCheckBox *cb = dynamic_cast<WCheckBox *>(widget); WRadioButton *rb = nullptr; if (cb) { element.addPropertyWord(Property::Class, "checkbox"); } else { rb = dynamic_cast<WRadioButton *>(widget); if (rb) element.addPropertyWord(Property::Class, "radio"); } if ((cb || rb) && widget->isInline()) element.addPropertyWord(Property::Class, "inline"); } } } break; case DomElementType::LI: { WMenuItem *item = dynamic_cast<WMenuItem *>(widget); if (item) { if (item->isSeparator()) element.addPropertyWord(Property::Class, "divider"); if (item->isSectionHeader()) element.addPropertyWord(Property::Class, "nav-header"); if (item->menu()) { if (dynamic_cast<WPopupMenu *>(item->parentMenu())) element.addPropertyWord(Property::Class, "dropdown-submenu"); else element.addPropertyWord(Property::Class, "dropdown"); } } } break; case DomElementType::INPUT: { if (version_ == BootstrapVersion::v3 && formControlStyle_) { WAbstractToggleButton *tb = dynamic_cast<WAbstractToggleButton *>(widget); if (!tb) element.addPropertyWord(Property::Class, "form-control"); } WAbstractSpinBox *spinBox = dynamic_cast<WAbstractSpinBox *>(widget); if (spinBox) { element.addPropertyWord(Property::Class, "Wt-spinbox"); return; } WDateEdit *dateEdit = dynamic_cast<WDateEdit *>(widget); if (dateEdit) { element.addPropertyWord(Property::Class, "Wt-dateedit"); return; } WTimeEdit *timeEdit = dynamic_cast<WTimeEdit *>(widget); if (timeEdit) { element.addPropertyWord(Property::Class, "Wt-timeedit"); return; } } break; case DomElementType::TEXTAREA: case DomElementType::SELECT: if (version_ == BootstrapVersion::v3 && formControlStyle_) element.addPropertyWord(Property::Class, "form-control"); break; case DomElementType::UL: { WPopupMenu *popupMenu = dynamic_cast<WPopupMenu *>(widget); if (popupMenu) { element.addPropertyWord(Property::Class, "dropdown-menu"); if (popupMenu->parentItem() && dynamic_cast<WPopupMenu *>(popupMenu->parentItem()->parentMenu())) element.addPropertyWord(Property::Class, "submenu"); } else { WMenu *menu = dynamic_cast<WMenu *>(widget); if (menu) { element.addPropertyWord(Property::Class, "nav"); WTabWidget *tabs = dynamic_cast<WTabWidget *>(menu->parent()->parent()); if (tabs) element.addPropertyWord(Property::Class, "nav-tabs"); } else { WSuggestionPopup *suggestions = dynamic_cast<WSuggestionPopup *>(widget); if (suggestions) element.addPropertyWord(Property::Class, "typeahead"); } } } case DomElementType::SPAN: { WInPlaceEdit *inPlaceEdit = dynamic_cast<WInPlaceEdit *>(widget); if (inPlaceEdit) element.addPropertyWord(Property::Class, "Wt-in-place-edit"); else { WDatePicker *picker = dynamic_cast<WDatePicker *>(widget); if (picker) element.addPropertyWord(Property::Class, "Wt-datepicker"); } } break; default: break; } }
void MenuManager::setupMenus( Browse * client ) //--------------------------------------------- { int i; WPopupMenu * pop; WPopupMenu * subPop; WMenu * menu; _clientWin = client; menu = new WMenu; typedef WPopupMenu * popMenuStar; // to use new [] _topMenus = new popMenuStar[ MMNumMainMenus + CMNumCascadeMenus ]; _receivers = new WCValHashDict< MIMenuID, MenuHandler * >( &MenuHash ); for( i = 0; i < MMNumMainMenus; i += 1 ) { if( i == MMWindows ) { // Windows menu handled by WCLASS _topMenus[ i ] = NULL; } else { _topMenus[ i ] = new WPopupMenu( MainMenuInfo[ i ].menuName ); _topMenus[ i ]->onPopup( this, (cbp) &MenuManager::menuPopup ); } } for( i = 0; i < CMNumCascadeMenus; i += 1 ) { _topMenus[ i + MMNumMainMenus ] = new WPopupMenu( CascadeMenuInfo[ i ].menuName ); _topMenus[ i + MMNumMainMenus ]->onPopup( this, (cbp) &MenuManager::menuPopup ); } //------- File Menu ---------// pop = _topMenus[ MMFile ]; menu->insertPopup( pop ); for( i = 0; i < FMNumFileMenus; i += 1 ) { makeItem( pop, FileMenuInfo, i ); } //------- View Menu --------// pop = _topMenus[ MMView ]; menu->insertPopup( pop ); makeItem( pop, ViewMenuInfo, VMList ); subPop = _topMenus[ CMViewInherit ]; pop->insertPopup( subPop ); for( i = 0; i < VMNumViewInheritMenus; i += 1 ) { makeItem( subPop, ViewInheritMenuInfo, i ); } subPop = _topMenus[ CMViewCall ]; pop->insertPopup( subPop ); for( i = 0; i < VMNumViewCallMenus; i += 1 ) { makeItem( subPop, ViewCallMenuInfo, i ); } //------- Detail Menu ---------// pop = _topMenus[ MMDetail ]; menu->insertPopup( pop ); for( i = 0; i < DMNumDetailMenus; i += 1 ) { makeItem( pop, DetailMenuInfo, i ); } //------- Tree Menu ---------// pop = _topMenus[ MMTree ]; menu->insertPopup( pop ); for( i = 0; i < TMNumTreeMenus; i += 1 ) { makeItem( pop, TreeMenuInfo, i ); } //------- Locate Menu ---------// pop = _topMenus[ MMLocate ]; menu->insertPopup( pop ); for( i = 0; i < LMNumLocateMenus; i += 1 ) { makeItem( pop, LocateMenuInfo, i ); } //------- Options Menu ---------// pop = _topMenus[ MMOptions ]; menu->insertPopup( pop ); for( i = 0; i < OMNumOptionsMenus; i += 1 ) { makeItem( pop, OptionsMenuInfo, i ); } //-------- Windows Menu ----------// // WCLASS handles this one for us // pop = _clientWin->getMdiPopup(); menu->insertPopup( pop ); //------- Help Menu ---------// pop = _topMenus[ MMHelp ]; menu->insertPopup( pop ); for( i = 0; i < HMNumHelpMenus; i += 1 ) { makeItem( pop, HelpMenuInfo, i ); } _clientWin->setMenu( menu ); }
void WBootstrapTheme::apply(WWidget *widget, DomElement& element, int elementRole) const { bool creating = element.mode() == DomElement::ModeCreate; { WPopupWidget *popup = dynamic_cast<WPopupWidget *>(widget); if (popup) { WDialog *dialog = dynamic_cast<WDialog *>(widget); if (!dialog) element.addPropertyWord(PropertyClass, "dropdown-menu"); } } switch (element.type()) { case DomElement_A: if (creating && dynamic_cast<WPushButton *>(widget)) element.addPropertyWord(PropertyClass, "btn"); if (element.getProperty(PropertyClass).find("dropdown-toggle") != std::string::npos) { WMenuItem *item = dynamic_cast<WMenuItem *>(widget->parent()); if (!dynamic_cast<WPopupMenu *>(item->parentMenu())) { DomElement *b = DomElement::createNew(DomElement_B); b->setProperty(PropertyClass, "caret"); element.addChild(b); } } break; case DomElement_BUTTON: { if (creating) element.addPropertyWord(PropertyClass, "btn"); WPushButton *button = dynamic_cast<WPushButton *>(widget); if (button) { if (creating && button->isDefault()) element.addPropertyWord(PropertyClass, "btn-primary"); if (button->menu() && element.properties().find(PropertyInnerHTML) != element.properties().end()) { element.addPropertyWord(PropertyInnerHTML, "<span class=\"caret\"></span>"); } } break; } case DomElement_DIV: { WDialog *dialog = dynamic_cast<WDialog *>(widget); if (dialog) { element.addPropertyWord(PropertyClass, "modal"); return; } WPanel *panel = dynamic_cast<WPanel *>(widget); if (panel) { element.addPropertyWord(PropertyClass, "accordion-group"); return; } WProgressBar *bar = dynamic_cast<WProgressBar *>(widget); if (bar) { switch (elementRole) { case MainElementThemeRole: element.addPropertyWord(PropertyClass, "progress"); break; case ProgressBarBarRole: element.addPropertyWord(PropertyClass, "bar"); break; case ProgressBarLabelRole: element.addPropertyWord(PropertyClass, "bar-label"); } return; } WGoogleMap *map = dynamic_cast<WGoogleMap *>(widget); if (map) { element.addPropertyWord(PropertyClass, "Wt-googlemap"); return; } WAbstractItemView *itemView = dynamic_cast<WAbstractItemView *>(widget); if (itemView) { element.addPropertyWord(PropertyClass, "form-horizontal"); return; } } break; case DomElement_LABEL: { WCheckBox *cb = dynamic_cast<WCheckBox *>(widget); if (cb) { element.addPropertyWord(PropertyClass, "checkbox"); if (cb->isInline()) element.addPropertyWord(PropertyClass, "inline"); } else { WRadioButton *rb = dynamic_cast<WRadioButton *>(widget); if (rb) { element.addPropertyWord(PropertyClass, "radio"); if (rb->isInline()) element.addPropertyWord(PropertyClass, "inline"); } } } break; case DomElement_LI: { WMenuItem *item = dynamic_cast<WMenuItem *>(widget); if (item) { if (item->isSeparator()) element.addPropertyWord(PropertyClass, "divider"); if (item->isSectionHeader()) element.addPropertyWord(PropertyClass, "nav-header"); if (item->menu()) { if (dynamic_cast<WPopupMenu *>(item->parentMenu())) element.addPropertyWord(PropertyClass, "dropdown-submenu"); else element.addPropertyWord(PropertyClass, "dropdown"); } } } break; case DomElement_INPUT: { WAbstractSpinBox *spinBox = dynamic_cast<WAbstractSpinBox *>(widget); if (spinBox) { element.addPropertyWord(PropertyClass, "Wt-spinbox"); return; } WDateEdit *dateEdit = dynamic_cast<WDateEdit *>(widget); if (dateEdit) { element.addPropertyWord(PropertyClass, "Wt-dateedit"); return; } } break; case DomElement_UL: { WPopupMenu *popupMenu = dynamic_cast<WPopupMenu *>(widget); if (popupMenu) { element.addPropertyWord(PropertyClass, "dropdown-menu"); if (popupMenu->parentItem() && dynamic_cast<WPopupMenu *>(popupMenu->parentItem()->parentMenu())) element.addPropertyWord(PropertyClass, "submenu"); } else { WMenu *menu = dynamic_cast<WMenu *>(widget); if (menu) { element.addPropertyWord(PropertyClass, "nav"); WTabWidget *tabs = dynamic_cast<WTabWidget *>(menu->parent()->parent()); if (tabs) element.addPropertyWord(PropertyClass, "nav-tabs"); } else { WSuggestionPopup *suggestions = dynamic_cast<WSuggestionPopup *>(widget); if (suggestions) element.addPropertyWord(PropertyClass, "typeahead"); } } } case DomElement_SPAN: { WInPlaceEdit *inPlaceEdit = dynamic_cast<WInPlaceEdit *>(widget); if (inPlaceEdit) element.addPropertyWord(PropertyClass, "Wt-in-place-edit"); } break; default: break; } }