|
Wt examples
3.3.0
|
Main application class. More...

Public Member Functions | |
| TreeViewDragDrop (const WEnvironment &env) | |
| Constructor. | |
| virtual | ~TreeViewDragDrop () |
Private Member Functions | |
| void | createUI () |
| Setup the user interface. | |
| WText * | createTitle (const WString &title) |
| Creates a title widget. | |
| WTreeView * | folderView () |
| Creates the folder WTreeView. | |
| WTableView * | fileView () |
| Creates the file table view (a WTableView) | |
| void | editFile (const WModelIndex &item) |
| Edit a particular row. | |
| WWidget * | pieChart () |
| Creates the chart. | |
| WWidget * | aboutDisplay () |
| Creates the hints text. | |
| void | folderChanged () |
| Change the filter on the file view when the selected folder changes. | |
| void | showPopup (const WModelIndex &item, const WMouseEvent &event) |
| Show a popup for a folder item. | |
| void | popupAction () |
| Process the result of the popup menu. | |
| void | dialogDone () |
| Process the result of the message box. | |
| void | populateFiles () |
| Populate the files model. | |
| void | convertToDate (WStandardItem *item) |
| Convert a string to a date. | |
| void | populateFolders () |
| Populate the folders model. | |
| WStandardItem * | createFolderItem (const WString &location, const std::string &folderId=std::string()) |
| Create a folder item. | |
Private Attributes | |
| WStandardItemModel * | folderModel_ |
| The folder model (used by folderView_) | |
| WStandardItemModel * | fileModel_ |
| The file model (used by fileView_) | |
| WSortFilterProxyModel * | fileFilterModel_ |
| The sort filter proxy model that adapts fileModel_. | |
| std::map< std::string, WString > | folderNameMap_ |
| Maps folder id's to folder descriptions. | |
| WTreeView * | folderView_ |
| The folder view. | |
| WTableView * | fileView_ |
| The file view. | |
| WPopupMenu * | popup_ |
| Popup menu on the folder view. | |
| WMessageBox * | popupActionBox_ |
| Message box to confirm the poup menu action. | |
Main application class.
Definition at line 237 of file TreeViewDragDrop.C.
| TreeViewDragDrop::TreeViewDragDrop | ( | const WEnvironment & | env | ) | [inline] |
Constructor.
Definition at line 242 of file TreeViewDragDrop.C.
: WApplication(env), popup_(0), popupActionBox_(0) { setCssTheme("polished"); /* * Create the data models. */ folderModel_ = new WStandardItemModel(0, 1, this); populateFolders(); fileModel_ = new FileModel(this); populateFiles(); /* The header items are also endered using an ItemDelegate, and thus support other data, e.g.: fileModel_->setHeaderFlags(0, Horizontal, HeaderIsUserCheckable); fileModel_->setHeaderData(0, Horizontal, std::string("icons/file.gif"), Wt::DecorationRole); */ fileFilterModel_ = new WSortFilterProxyModel(this); fileFilterModel_->setSourceModel(fileModel_); fileFilterModel_->setDynamicSortFilter(true); fileFilterModel_->setFilterKeyColumn(0); fileFilterModel_->setFilterRole(UserRole); /* * Setup the user interface. */ createUI(); }
| virtual TreeViewDragDrop::~TreeViewDragDrop | ( | ) | [inline, virtual] |
Definition at line 279 of file TreeViewDragDrop.C.
{
delete popup_;
delete popupActionBox_;
}
| WWidget* TreeViewDragDrop::aboutDisplay | ( | ) | [inline, private] |
Creates the hints text.
Definition at line 457 of file TreeViewDragDrop.C.
{
WText *result = new WText(WString::tr("about-text"));
result->setStyleClass("about");
return result;
}
| void TreeViewDragDrop::convertToDate | ( | WStandardItem * | item | ) | [inline, private] |
Convert a string to a date.
Definition at line 587 of file TreeViewDragDrop.C.
{
WDate d = WDate::fromString(item->text(), FileModel::dateEditFormat);
item->setData(boost::any(d), DisplayRole);
}
| WStandardItem* TreeViewDragDrop::createFolderItem | ( | const WString & | location, |
| const std::string & | folderId = std::string() |
||
| ) | [inline, private] |
Create a folder item.
Configures flags for drag and drop support.
Definition at line 624 of file TreeViewDragDrop.C.
{
WStandardItem *result = new WStandardItem(location);
if (!folderId.empty()) {
result->setData(boost::any(folderId));
result->setFlags(result->flags() | ItemIsDropEnabled);
folderNameMap_[folderId] = location;
} else
result->setFlags(result->flags().clear(ItemIsSelectable));
result->setIcon("icons/folder.gif");
return result;
}
Creates a title widget.
Definition at line 347 of file TreeViewDragDrop.C.
{
WText *result = new WText(title);
result->setInline(false);
result->setStyleClass("title");
return result;
}
| void TreeViewDragDrop::createUI | ( | ) | [inline, private] |
Setup the user interface.
Definition at line 311 of file TreeViewDragDrop.C.
{
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);
}
| void TreeViewDragDrop::dialogDone | ( | ) | [inline, private] |
Process the result of the message box.
Definition at line 548 of file TreeViewDragDrop.C.
{
delete popupActionBox_;
popupActionBox_ = 0;
}
| void TreeViewDragDrop::editFile | ( | const WModelIndex & | item | ) | [inline, private] |
Edit a particular row.
Definition at line 422 of file TreeViewDragDrop.C.
{
new FileEditDialog(fileView_->model(), item);
}
| WTableView* TreeViewDragDrop::fileView | ( | ) | [inline, private] |
Creates the file table view (a WTableView)
Definition at line 386 of file TreeViewDragDrop.C.
{
WTableView *tableView = new WTableView();
tableView->setAlternatingRowColors(true);
tableView->setModel(fileFilterModel_);
tableView->setSelectionMode(ExtendedSelection);
tableView->setDragEnabled(true);
tableView->setColumnWidth(0, 100);
tableView->setColumnWidth(1, 150);
tableView->setColumnWidth(2, 100);
tableView->setColumnWidth(3, 60);
tableView->setColumnWidth(4, 100);
tableView->setColumnWidth(5, 100);
WItemDelegate *delegate = new WItemDelegate(this);
delegate->setTextFormat(FileModel::dateDisplayFormat);
tableView->setItemDelegateForColumn(4, delegate);
tableView->setItemDelegateForColumn(5, delegate);
tableView->setColumnAlignment(3, AlignRight);
tableView->setColumnAlignment(4, AlignRight);
tableView->setColumnAlignment(5, AlignRight);
tableView->sortByColumn(1, AscendingOrder);
tableView->doubleClicked().connect(this, &TreeViewDragDrop::editFile);
fileView_ = tableView;
return tableView;
}
| void TreeViewDragDrop::folderChanged | ( | ) | [inline, private] |
Change the filter on the file view when the selected folder changes.
Definition at line 466 of file TreeViewDragDrop.C.
{
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);
}
}
| WTreeView* TreeViewDragDrop::folderView | ( | ) | [inline, private] |
Creates the folder WTreeView.
Definition at line 357 of file TreeViewDragDrop.C.
{
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;
}
| WWidget* TreeViewDragDrop::pieChart | ( | ) | [inline, private] |
Creates the chart.
Definition at line 428 of file TreeViewDragDrop.C.
{
using namespace Chart;
WPieChart *chart = new WPieChart();
// chart->setPreferredMethod(WPaintedWidget::PngImage);
chart->setModel(fileFilterModel_);
chart->setTitle("File sizes");
chart->setLabelsColumn(1); // Name
chart->setDataColumn(3); // Size
chart->setPerspectiveEnabled(true, 0.2);
chart->setDisplayLabels(Outside | TextLabel);
if (!WApplication::instance()->environment().ajax()) {
chart->resize(500, 200);
chart->setMargin(WLength::Auto, Left | Right);
WContainerWidget *w = new WContainerWidget();
w->addWidget(chart);
w->setStyleClass("about");
return w;
} else {
chart->setStyleClass("about");
return chart;
}
}
| void TreeViewDragDrop::populateFiles | ( | ) | [inline, private] |
Populate the files model.
Data (and headers) is read from the CSV file data/files.csv. We add icons to the first column, resolve the folder id to the actual folder name, and configure item flags, and parse date values.
Definition at line 560 of file TreeViewDragDrop.C.
{
fileModel_->invisibleRootItem()->setRowCount(0);
std::ifstream f((appRoot() + "data/files.csv").c_str());
if (!f)
throw std::runtime_error("Could not read: data/files.csv");
readFromCsv(f, fileModel_);
for (int i = 0; i < fileModel_->rowCount(); ++i) {
WStandardItem *item = fileModel_->item(i, 0);
item->setFlags(item->flags() | ItemIsDragEnabled);
item->setIcon("icons/file.gif");
std::string folderId = item->text().toUTF8();
item->setData(boost::any(folderId), UserRole);
item->setText(folderNameMap_[folderId]);
convertToDate(fileModel_->item(i, 4));
convertToDate(fileModel_->item(i, 5));
}
}
| void TreeViewDragDrop::populateFolders | ( | ) | [inline, private] |
Populate the folders model.
Definition at line 594 of file TreeViewDragDrop.C.
{
WStandardItem *level1, *level2;
folderModel_->appendRow(level1 = createFolderItem("San Fransisco"));
level1->appendRow(level2 = createFolderItem("Investors", "sf-investors"));
level1->appendRow(level2 = createFolderItem("Fellows", "sf-fellows"));
folderModel_->appendRow(level1 = createFolderItem("Sophia Antipolis"));
level1->appendRow(level2 = createFolderItem("R&D", "sa-r_d"));
level1->appendRow(level2 = createFolderItem("Services", "sa-services"));
level1->appendRow(level2 = createFolderItem("Support", "sa-support"));
level1->appendRow(level2 = createFolderItem("Billing", "sa-billing"));
folderModel_->appendRow(level1 = createFolderItem("New York"));
level1->appendRow(level2 = createFolderItem("Marketing", "ny-marketing"));
level1->appendRow(level2 = createFolderItem("Sales", "ny-sales"));
level1->appendRow(level2 = createFolderItem("Advisors", "ny-advisors"));
folderModel_->appendRow(level1 = createFolderItem
(WString::fromUTF8("Frankfürt")));
level1->appendRow(level2 = createFolderItem("Sales", "frank-sales"));
folderModel_->setHeaderData(0, Horizontal,
boost::any(std::string("SandBox")));
}
| void TreeViewDragDrop::popupAction | ( | ) | [inline, private] |
Process the result of the popup menu.
Definition at line 527 of file TreeViewDragDrop.C.
{
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 TreeViewDragDrop::showPopup | ( | const WModelIndex & | item, |
| const WMouseEvent & | event | ||
| ) | [inline, private] |
Show a popup for a folder item.
Definition at line 485 of file TreeViewDragDrop.C.
{
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();
}
}
The sort filter proxy model that adapts fileModel_.
Definition at line 292 of file TreeViewDragDrop.C.
WStandardItemModel* TreeViewDragDrop::fileModel_ [private] |
The file model (used by fileView_)
Definition at line 289 of file TreeViewDragDrop.C.
WTableView* TreeViewDragDrop::fileView_ [private] |
The file view.
Definition at line 301 of file TreeViewDragDrop.C.
WStandardItemModel* TreeViewDragDrop::folderModel_ [private] |
The folder model (used by folderView_)
Definition at line 286 of file TreeViewDragDrop.C.
std::map<std::string, WString> TreeViewDragDrop::folderNameMap_ [private] |
Maps folder id's to folder descriptions.
Definition at line 295 of file TreeViewDragDrop.C.
WTreeView* TreeViewDragDrop::folderView_ [private] |
The folder view.
Definition at line 298 of file TreeViewDragDrop.C.
WPopupMenu* TreeViewDragDrop::popup_ [private] |
Popup menu on the folder view.
Definition at line 304 of file TreeViewDragDrop.C.
WMessageBox* TreeViewDragDrop::popupActionBox_ [private] |
Message box to confirm the poup menu action.
Definition at line 307 of file TreeViewDragDrop.C.
1.7.5.1