8 #include <Wt/WApplication.h> 9 #include <Wt/WComboBox.h> 10 #include <Wt/WContainerWidget.h> 11 #include <Wt/WDatePicker.h> 12 #include <Wt/WDateValidator.h> 13 #include <Wt/WDialog.h> 14 #include <Wt/WEnvironment.h> 15 #include <Wt/WIntValidator.h> 16 #include <Wt/WItemDelegate.h> 17 #include <Wt/WLabel.h> 18 #include <Wt/WLineEdit.h> 19 #include <Wt/WMessageBox.h> 20 #include <Wt/WPushButton.h> 21 #include <Wt/WRegExpValidator.h> 22 #include <Wt/WGridLayout.h> 23 #include <Wt/WPopupMenu.h> 24 #include <Wt/WSortFilterProxyModel.h> 25 #include <Wt/WStandardItem.h> 26 #include <Wt/WStandardItemModel.h> 27 #include <Wt/WTableView.h> 28 #include <Wt/WTreeView.h> 30 #include <Wt/WVBoxLayout.h> 32 #include <Wt/Chart/WPieChart.h> 86 int modelRow = item_.row();
95 auto nameEdit = cpp14::make_unique<WLineEdit>(
asString(model_->data(modelRow, 1)));
96 nameEdit_ = nameEdit.get();
99 auto typeEdit = cpp14::make_unique<WComboBox>();
100 typeEdit_ = typeEdit.get();
101 typeEdit_->addItem(
"Document");
102 typeEdit_->addItem(
"Spreadsheet");
103 typeEdit_->addItem(
"Presentation");
104 typeEdit_->setCurrentIndex
105 (typeEdit_->findText(
asString(model_->data(modelRow, 2))));
108 auto sizeEdit = cpp14::make_unique<WLineEdit>(
asString(model_->data(modelRow, 3)));
109 sizeEdit_ = sizeEdit.get();
110 sizeEdit_->setValidator
111 (std::make_shared<WIntValidator>(0, std::numeric_limits<int>::max()));
115 auto createdPicker = cpp14::make_unique<WDatePicker>();
116 createdPicker_ = createdPicker.get();
117 createdPicker_->lineEdit()->validator()->setMandatory(
true);
119 createdPicker_->setDate(cpp17::any_cast<WDate>(model_->data(modelRow, 4)));
122 auto modifiedPicker = cpp14::make_unique<WDatePicker>();
123 modifiedPicker_ = modifiedPicker.get();
124 modifiedPicker_->lineEdit()->validator()->setMandatory(
true);
126 modifiedPicker_->setDate(cpp17::any_cast<WDate>(model_->data(modelRow, 5)));
131 auto layout = cpp14::make_unique<WGridLayout>();
133 std::unique_ptr<WLabel> label;
136 label = cpp14::make_unique<WLabel>(
"Name:");
137 label->setBuddy(nameEdit_);
138 layout->addWidget(std::move(label), row, 0);
139 layout->addWidget(std::move(nameEdit), row, 1);
142 label = cpp14::make_unique<WLabel>(
"Type:");
143 label->setBuddy(typeEdit_);
144 layout->addWidget(std::move(label), row, 0);
145 layout->addWidget(std::move(typeEdit), row, 1);
148 label = cpp14::make_unique<WLabel>(
"Size");
149 label->setBuddy(sizeEdit_);
150 layout->addWidget(std::move(label), row, 0);
151 layout->addWidget(std::move(sizeEdit), row, 1);
154 label = cpp14::make_unique<WLabel>(
"Created:");
155 label->setBuddy(createdPicker_->lineEdit());
156 layout->addWidget(std::move(label), row, 0);
157 layout->addWidget(std::move(createdPicker), row, 2);
160 label = cpp14::make_unique<WLabel>(
"Modified:");
161 label->setBuddy(modifiedPicker_->lineEdit());
162 layout->addWidget(std::move(label), row, 0);
163 layout->addWidget(std::move(modifiedPicker), row, 2);
166 std::unique_ptr<WPushButton>button;
167 auto buttons = cpp14::make_unique<WContainerWidget>();
169 button = cpp14::make_unique<WPushButton>(
"Save");
171 buttons->addWidget(std::move(button));
173 button = cpp14::make_unique<WPushButton>(
"Cancel");
176 buttons->addWidget(std::move(button));
183 typeEdit_->setFocus();
break;
185 sizeEdit_->setFocus();
break;
187 createdPicker_->lineEdit()->setFocus();
190 modifiedPicker_->lineEdit()->setFocus();
193 nameEdit_->setFocus();
break;
197 layout->setColumnStretch(1, 1);
199 contents()->setLayout(std::move(layout));
207 std::shared_ptr<WAbstractItemModel>
model_;
227 std::shared_ptr<WAbstractItemModel> m = model_;
228 int modelRow = item_.
row();
230 std::shared_ptr<WAbstractProxyModel> proxyModel =
234 modelRow = proxyModel->mapToSource(item_).row();
237 m->setData(modelRow, 1, cpp17::any(nameEdit_->
text()));
238 m->setData(modelRow, 2, cpp17::any(typeEdit_->
currentText()));
239 m->setData(modelRow, 3, cpp17::any(
asNumber 241 m->setData(modelRow, 4, cpp17::any(createdPicker_->
date()));
242 m->setData(modelRow, 5, cpp17::any(modifiedPicker_->
date()));
261 popupActionBox_(nullptr)
263 setCssTheme(
"polished");
269 std::make_shared<WStandardItemModel>(0, 1);
274 std::make_shared<FileModel>();
286 fileFilterModel_ = std::make_shared<WSortFilterProxyModel>();
287 fileFilterModel_->setSourceModel(fileModel_);
288 fileFilterModel_->setDynamicSortFilter(
true);
289 fileFilterModel_->setFilterKeyColumn(0);
340 std::unique_ptr<WGridLayout> layout =
341 cpp14::make_unique<WGridLayout>();
342 layout->addWidget(createTitle(
"Folders"), 0, 0);
343 layout->addWidget(createTitle(
"Files"), 0, 1);
344 layout->addWidget(folderView(), 1, 0);
345 layout->setColumnResizable(0);
348 folderView_->
select(folderModel_->index(0, 0, folderModel_->index(0, 0)));
350 std::unique_ptr<WVBoxLayout> vbox =
351 cpp14::make_unique<WVBoxLayout>();
352 vbox->addWidget(fileView(), 1);
353 vbox->addWidget(pieChart(), 1);
354 vbox->setResizable(0);
356 layout->addLayout(std::move(vbox), 1, 1);
358 layout->addWidget(aboutDisplay(), 2, 0, 1, 2);
363 layout->setRowStretch(1, 1);
364 layout->setColumnStretch(1, 1);
372 auto result = cpp14::make_unique<WText>(title);
373 result->setInline(
false);
374 result->setStyleClass(
"title");
382 auto treeView = cpp14::make_unique<FolderView>();
391 treeView->setAttributeValue
393 "event.cancelBubble = true; event.returnValue = false; return false;");
394 treeView->setModel(folderModel_);
397 treeView->expandToDepth(1);
398 treeView->selectionChanged()
403 folderView_ = treeView.get();
405 return std::move(treeView);
412 = cpp14::make_unique<WTableView>();
414 tableView->setAlternatingRowColors(
true);
416 tableView->setModel(fileFilterModel_);
418 tableView->setDragEnabled(
true);
420 tableView->setColumnWidth(0, 100);
421 tableView->setColumnWidth(1, 150);
422 tableView->setColumnWidth(2, 100);
423 tableView->setColumnWidth(3, 60);
424 tableView->setColumnWidth(4, 100);
425 tableView->setColumnWidth(5, 100);
427 auto delegate = std::make_shared<WItemDelegate>();
429 tableView->setItemDelegateForColumn(4, delegate);
430 tableView->setItemDelegateForColumn(5, delegate);
439 this, std::placeholders::_1));
441 fileView_ = tableView.get();
449 dialog_ = cpp14::make_unique<FileEditDialog>(fileView_->
model(), item);
455 using namespace Chart;
457 auto chart = cpp14::make_unique<WPieChart>();
459 chart->setModel(fileFilterModel_);
460 chart->setTitle(
"File sizes");
462 chart->setLabelsColumn(1);
463 chart->setDataColumn(3);
465 chart->setPerspectiveEnabled(
true, 0.2);
469 chart->resize(500, 200);
472 auto w = cpp14::make_unique<WContainerWidget>();
473 w->addWidget(std::move(chart));
474 w->setStyleClass(
"about");
477 chart->setStyleClass(
"about");
478 return std::move(chart);
485 std::unique_ptr<WText> result
486 = cpp14::make_unique<WText>(
WString::tr(
"about-text"));
487 result->setStyleClass(
"about");
488 return std::move(result);
501 std::string folder = cpp17::any_cast<std::string>(d);
507 fileFilterModel_->setFilterRegExp(std::unique_ptr<std::regex>(
new std::regex(folder)));
517 folderView_->
select(item);
520 popup_ = cpp14::make_unique<WPopupMenu>();
521 popup_->addItem(
"icons/folder_new.gif",
"Create a New Folder");
522 popup_->addItem(
"Rename this Folder")->setCheckable(
true);
523 popup_->addItem(
"Delete this Folder");
524 popup_->addSeparator();
525 popup_->addItem(
"Folder Details");
526 popup_->addSeparator();
527 popup_->addItem(
"Application Inventory");
528 popup_->addItem(
"Hardware Inventory");
529 popup_->addSeparator();
531 std::unique_ptr<WPopupMenu> subMenu = cpp14::make_unique<WPopupMenu>();
532 subMenu->addItem(
"Sub Item 1");
533 subMenu->addItem(
"Sub Item 2");
534 popup_->addMenu(
"File Deployments", std::move(subMenu));
546 if (popup_->isHidden())
547 popup_->popup(event);
556 if (popup_->result()) {
561 WString text = popup_->result()->text();
564 popupActionBox_ = cpp14::make_unique<WMessageBox>(
"Sorry.",
"Action '" 565 + text +
"' is not implemented.",
568 popupActionBox_->buttonClicked()
570 popupActionBox_->show();
579 popupActionBox_.reset();
590 fileModel_->invisibleRootItem()->setRowCount(0);
592 std::ifstream f((appRoot() +
"data/files.csv").c_str());
595 throw std::runtime_error(
"Could not read: data/files.csv");
599 for (
int i = 0; i < fileModel_->rowCount(); ++i) {
602 item->
setIcon(
"icons/file.gif");
607 item->
setText(folderNameMap_[folderId]);
609 convertToNumber(fileModel_->item(i, 3));
610 convertToDate(fileModel_->item(i, 4));
611 convertToDate(fileModel_->item(i, 5));
632 std::unique_ptr<WStandardItem> level1;
634 level1 = createFolderItem(
"San Fransisco");
635 level1->appendRow(createFolderItem(
"Investors",
"sf-investors"));
636 level1->appendRow(createFolderItem(
"Fellows",
"sf-fellows"));
637 folderModel_->appendRow(std::move(level1));
639 level1 = createFolderItem(
"Sophia Antipolis");
640 level1->appendRow(createFolderItem(
"R&D",
"sa-r_d"));
641 level1->appendRow(createFolderItem(
"Services",
"sa-services"));
642 level1->appendRow(createFolderItem(
"Support",
"sa-support"));
643 level1->appendRow(createFolderItem(
"Billing",
"sa-billing"));
644 folderModel_->appendRow(std::move(level1));
646 level1 = createFolderItem(
"New York");
647 level1->appendRow(createFolderItem(
"Marketing",
"ny-marketing"));
648 level1->appendRow(createFolderItem(
"Sales",
"ny-sales"));
649 level1->appendRow(createFolderItem(
"Advisors",
"ny-advisors"));
650 folderModel_->appendRow(std::move(level1));
652 level1 = createFolderItem(
WString(u8
"Frankf\u00DCrt"));
653 level1->appendRow(createFolderItem(
"Sales",
"frank-sales"));
654 folderModel_->appendRow(std::move(level1));
657 cpp17::any(std::string(
"SandBox")));
665 const std::string& folderId = std::string())
668 = cpp14::make_unique<WStandardItem>(location);
670 if (!folderId.empty()) {
671 result->setData(cpp17::any(folderId));
673 folderNameMap_[folderId] = location;
677 result->setIcon(
"icons/folder.gif");
685 auto app = cpp14::make_unique<TreeViewDragDrop>(env);
686 app->setTwoPhaseRenderingThreshold(0);
687 app->setTitle(
"WTreeView Drag & Drop");
688 app->useStyleSheet(
"styles.css");
692 return std::move(app);
695 int main(
int argc,
char **argv)
static constexpr int Edit
TreeViewDragDrop(const WEnvironment &env)
Constructor.
static WString dateDisplayFormat
Date display format.
static WString dateEditFormat
Date edit format.
std::shared_ptr< WStandardItemModel > folderModel_
The folder model (used by folderView_)
void handleFinish(DialogCode result)
std::unique_ptr< WTreeView > folderView()
Creates the folder WTreeView.
void convertToNumber(WStandardItem *item)
Convert a string to a number.
void convertToDate(WStandardItem *item)
Convert a string to a date.
void populateFiles()
Populate the files model.
static constexpr int User
WModelIndexSet selectedIndexes() const
static WDate fromString(const WString &s)
MouseButton button() const
const WString & text() const
static const char * FileSelectionMimeType
Constant that indicates the mime type for a selection of files.
std::unique_ptr< WTableView > fileView()
Creates the file table view (a WTableView)
WTreeView * folderView_
The folder view.
static constexpr int Display
A specialized standard item model which report a specific drag and drop mime type.
std::shared_ptr< WAbstractItemModel > model_
std::shared_ptr< WSortFilterProxyModel > fileFilterModel_
The sort filter proxy model that adapts fileModel_.
virtual void setData(const cpp17::any &data, ItemDataRole role=ItemDataRole::User)
void dialogDone()
Process the result of the message box.
FileEditDialog(std::shared_ptr< WAbstractItemModel > model, const WModelIndex &item)
std::string toUTF8() const
WDatePicker * modifiedPicker_
std::shared_ptr< WAbstractItemModel > sourceModel() const
std::shared_ptr< WAbstractItemModel > model() const
std::map< std::string, WString > folderNameMap_
Maps folder id's to folder descriptions.
static WString tr(const char *key)
void editFile(const WModelIndex &item)
Edit a particular row.
void createUI()
Setup the user interface.
void setIcon(const std::string &uri)
void setText(const WString &text)
void readFromCsv(std::istream &f, std::shared_ptr< WAbstractItemModel > model, int numRows, bool firstLineIsHeaders)
WString asString(const cpp17::any &v, const WString &formatString=WString())
A dialog for editing a 'file'.
virtual std::string mimeType() const
Return the mime type.
std::unique_ptr< WPopupMenu > popup_
Popup menu on the folder view.
static WApplication * instance()
void showPopup(const WModelIndex &item, const WMouseEvent &event)
Show a popup for a folder item.
std::unique_ptr< FileEditDialog > dialog_
std::unique_ptr< WStandardItem > createFolderItem(const WString &location, const std::string &folderId=std::string())
Create a folder item.
void select(const WModelIndex &index, SelectionFlag option=SelectionFlag::Select)
void populateFolders()
Populate the folders model.
std::unique_ptr< WApplication > createApplication(const WEnvironment &env)
static std::string appRoot()
std::shared_ptr< WStandardItemModel > fileModel_
The file model (used by fileView_)
std::unique_ptr< WText > createTitle(const WString &title)
Creates a title widget.
std::unique_ptr< WMessageBox > popupActionBox_
Message box to confirm the poup menu action.
std::unique_ptr< WWidget > pieChart()
Creates the chart.
void popupAction()
Process the result of the popup menu.
const WString currentText() const
double asNumber(const cpp17::any &v)
WTableView * fileView_
The file view.
bool isSelected(const WModelIndex &index) const
void setFlags(WFlags< ItemFlag > flags)
int main(int argc, char **argv)
void folderChanged()
Change the filter on the file view when the selected folder changes.
cpp17::any data(ItemDataRole role=ItemDataRole::Display) const
std::unique_ptr< WWidget > aboutDisplay()
Creates the hints text.
virtual ~TreeViewDragDrop()
WFlags< ItemFlag > flags() const