/*! \brief Displayed the currently selected file. */ void showFile() { if (gitView_->selectedIndexes().empty()) return; WModelIndex selected = *gitView_->selectedIndexes().begin(); sourceView_->setIndex(selected); }
/*! \brief Creates the folder WTreeView */ WTreeView *folderView() { WTreeView *treeView = new FolderView(); /* * To support right-click, we need to disable the built-in browser * context menu. * * Note that disabling the context menu and catching the * right-click does not work reliably on all browsers. */ treeView->setAttributeValue ("oncontextmenu", "event.cancelBubble = true; event.returnValue = false; return false;"); treeView->setModel(folderModel_); treeView->resize(200, WLength::Auto); treeView->setSelectionMode(SingleSelection); treeView->expandToDepth(1); treeView->selectionChanged() .connect(this, &TreeViewDragDrop::folderChanged); treeView->mouseWentUp().connect(this, &TreeViewDragDrop::showPopup); folderView_ = treeView; return treeView; }
/*! \brief Change the filter on the file view when the selected folder * changes. */ void folderChanged() { if (folderView_->selectedIndexes().empty()) return; WModelIndex selected = *folderView_->selectedIndexes().begin(); boost::any d = selected.data(UserRole); if (!d.empty()) { std::string folder = boost::any_cast<std::string>(d); // For simplicity, we assume here that the folder-id does not // contain special regexp characters, otherwise these need to be // escaped -- or use the \Q \E qutoing escape regular expression // syntax (and escape \E) fileFilterModel_->setFilterRegExp(folder); } }
/*! \brief Setup the user interface. */ void createUI() { WContainerWidget *w = root(); w->setStyleClass("maindiv"); /* * The main layout is a 3x2 grid layout. */ WGridLayout *layout = new WGridLayout(); layout->addWidget(createTitle("Folders"), 0, 0); layout->addWidget(createTitle("Files"), 0, 1); layout->addWidget(folderView(), 1, 0); layout->setColumnResizable(0); // select the first folder folderView_->select(folderModel_->index(0, 0, folderModel_->index(0, 0))); WVBoxLayout *vbox = new WVBoxLayout(); vbox->addWidget(fileView(), 1); vbox->addWidget(pieChart(), 1); vbox->setResizable(0); layout->addLayout(vbox, 1, 1); layout->addWidget(aboutDisplay(), 2, 0, 1, 2); /* * Let row 1 and column 1 take the excess space. */ layout->setRowStretch(1, 1); layout->setColumnStretch(1, 1); w->setLayout(layout); }
/*! \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(); } }