8 #include <Wt/WApplication> 9 #include <Wt/WComboBox> 10 #include <Wt/WContainerWidget> 11 #include <Wt/WDatePicker> 12 #include <Wt/WDateValidator> 14 #include <Wt/WEnvironment> 15 #include <Wt/WIntValidator> 16 #include <Wt/WItemDelegate> 18 #include <Wt/WLineEdit> 19 #include <Wt/WMessageBox> 20 #include <Wt/WPushButton> 21 #include <Wt/WRegExpValidator> 22 #include <Wt/WGridLayout> 23 #include <Wt/WPopupMenu> 24 #include <Wt/WSortFilterProxyModel> 25 #include <Wt/WStandardItem> 26 #include <Wt/WStandardItemModel> 27 #include <Wt/WTableView> 28 #include <Wt/WTreeView> 30 #include <Wt/WVBoxLayout> 32 #include <Wt/Chart/WPieChart> 86 int modelRow = item_.row();
99 typeEdit_->addItem(
"Document");
100 typeEdit_->addItem(
"Spreadsheet");
101 typeEdit_->addItem(
"Presentation");
102 typeEdit_->setCurrentIndex
103 (typeEdit_->findText(
asString(model_->data(modelRow, 2))));
107 sizeEdit_->setValidator
108 (
new WIntValidator(0, std::numeric_limits<int>::max(),
this));
112 createdPicker_->lineEdit()->validator()->setMandatory(
true);
114 createdPicker_->setDate(boost::any_cast<WDate>(model_->data(modelRow, 4)));
118 modifiedPicker_->lineEdit()->validator()->setMandatory(
true);
120 modifiedPicker_->setDate(boost::any_cast<WDate>(model_->data(modelRow, 5)));
146 layout->
addWidget(createdPicker_->lineEdit(), row, 1);
147 layout->
addWidget(createdPicker_, row, 2);
148 l->
setBuddy(createdPicker_->lineEdit());
152 layout->
addWidget(modifiedPicker_->lineEdit(), row, 1);
153 layout->
addWidget(modifiedPicker_, row, 2);
154 l->
setBuddy(modifiedPicker_->lineEdit());
170 typeEdit_->setFocus();
break;
172 sizeEdit_->setFocus();
break;
174 createdPicker_->lineEdit()->setFocus();
break;
176 modifiedPicker_->lineEdit()->setFocus();
break;
178 nameEdit_->setFocus();
break;
181 layout->
addWidget(buttons, row, 0, 0, 3, AlignCenter);
184 contents()->setLayout(layout);
201 if (result == WDialog::Accepted) {
213 int modelRow = item_.
row();
221 m->
setData(modelRow, 1, boost::any(nameEdit_->
text()));
223 m->
setData(modelRow, 3, boost::any(boost::lexical_cast<int>
225 m->
setData(modelRow, 4, boost::any(createdPicker_->
date()));
226 m->
setData(modelRow, 5, boost::any(modifiedPicker_->
date()));
247 setCssTheme(
"polished");
268 fileFilterModel_->setSourceModel(fileModel_);
269 fileFilterModel_->setDynamicSortFilter(
true);
270 fileFilterModel_->setFilterKeyColumn(0);
271 fileFilterModel_->setFilterRole(UserRole);
281 delete popupActionBox_;
319 layout->
addWidget(createTitle(
"Folders"), 0, 0);
320 layout->
addWidget(createTitle(
"Files"), 0, 1);
334 layout->
addWidget(aboutDisplay(), 2, 0, 1, 2);
369 "event.cancelBubble = true; event.returnValue = false; return false;");
379 folderView_ = treeView;
391 tableView->
setModel(fileFilterModel_);
415 fileView_ = tableView;
429 using namespace Chart;
431 WPieChart *chart =
new WPieChart();
433 chart->setModel(fileFilterModel_);
434 chart->setTitle(
"File sizes");
436 chart->setLabelsColumn(1);
437 chart->setDataColumn(3);
439 chart->setPerspectiveEnabled(
true, 0.2);
440 chart->setDisplayLabels(Outside | TextLabel);
443 chart->resize(500, 200);
471 boost::any d = selected.
data(UserRole);
473 std::string folder = boost::any_cast<std::string>(d);
486 if (event.
button() == WMouseEvent::RightButton) {
489 folderView_->
select(item);
493 popup_->
addItem(
"icons/folder_new.gif",
"Create a New Folder");
495 popup_->
addItem(
"Delete this Folder");
497 popup_->
addItem(
"Folder Details");
499 popup_->
addItem(
"Application Inventory");
500 popup_->
addItem(
"Hardware Inventory");
504 subMenu->
addItem(
"Sub Item 1");
505 subMenu->
addItem(
"Sub Item 2");
506 popup_->
addMenu(
"File Deployments", subMenu);
519 popup_->
popup(event);
536 popupActionBox_ =
new WMessageBox(
"Sorry.",
"Action '" + text
537 +
"' is not implemented.", NoIcon,
Ok);
540 popupActionBox_->
show();
549 delete popupActionBox_;
563 std::ifstream f((appRoot() +
"data/files.csv").c_str());
566 throw std::runtime_error(
"Could not read: data/files.csv");
570 for (
int i = 0; i < fileModel_->
rowCount(); ++i) {
573 item->
setIcon(
"icons/file.gif");
577 item->
setData(boost::any(folderId), UserRole);
578 item->
setText(folderNameMap_[folderId]);
580 convertToNumber(fileModel_->
item(i, 3));
581 convertToDate(fileModel_->
item(i, 4));
582 convertToDate(fileModel_->
item(i, 5));
590 item->
setData(boost::any(d), DisplayRole);
596 int i = boost::lexical_cast<
int>(item->
text());
597 item->
setData(boost::any(i), EditRole);
605 folderModel_->
appendRow(level1 = createFolderItem(
"San Fransisco"));
606 level1->
appendRow(level2 = createFolderItem(
"Investors",
"sf-investors"));
607 level1->
appendRow(level2 = createFolderItem(
"Fellows",
"sf-fellows"));
609 folderModel_->
appendRow(level1 = createFolderItem(
"Sophia Antipolis"));
610 level1->
appendRow(level2 = createFolderItem(
"R&D",
"sa-r_d"));
611 level1->
appendRow(level2 = createFolderItem(
"Services",
"sa-services"));
612 level1->
appendRow(level2 = createFolderItem(
"Support",
"sa-support"));
613 level1->
appendRow(level2 = createFolderItem(
"Billing",
"sa-billing"));
615 folderModel_->
appendRow(level1 = createFolderItem(
"New York"));
616 level1->
appendRow(level2 = createFolderItem(
"Marketing",
"ny-marketing"));
617 level1->
appendRow(level2 = createFolderItem(
"Sales",
"ny-sales"));
618 level1->
appendRow(level2 = createFolderItem(
"Advisors",
"ny-advisors"));
620 folderModel_->
appendRow(level1 = createFolderItem
622 level1->
appendRow(level2 = createFolderItem(
"Sales",
"frank-sales"));
625 boost::any(std::string(
"SandBox")));
633 const std::string& folderId = std::string())
637 if (!folderId.empty()) {
638 result->
setData(boost::any(folderId));
640 folderNameMap_[folderId] = location;
644 result->
setIcon(
"icons/folder.gif");
655 app->
setTitle(
"WTreeView Drag & Drop");
663 int main(
int argc,
char **argv)
TreeViewDragDrop(const WEnvironment &env)
Constructor.
void setTextFormat(const WString &format)
WStandardItem * item(int row, int column=0) const
static WString dateDisplayFormat
Date display format.
WStandardItemModel * folderModel_
The folder model (used by folderView_)
WFlags< ItemFlag > flags() const
static WString dateEditFormat
Date edit format.
WMessageBox * popupActionBox_
Message box to confirm the poup menu action.
void handleFinish(DialogCode result)
const WString & text() const
WTableView * fileView()
Creates the file table view (a WTableView)
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.
WApplication * createApplication(const WEnvironment &env)
void setRowCount(int rows)
void setColumnStretch(int column, int stretch)
cpp17::any data(ItemDataRole role=ItemDataRole::Display) const
void addWidget(std::unique_ptr< WWidget > widget, int row, int column, WFlags< AlignmentFlag > alignment)
static WString fromUTF8(const std::string &value, bool checkValid=false)
static WDate fromString(const WString &s)
void setItemDelegateForColumn(int column, const std::shared_ptr< WAbstractItemDelegate > &delegate)
WMessageResourceBundle & messageResourceBundle()
void addWidget(std::unique_ptr< WWidget > widget, int stretch, WFlags< AlignmentFlag > alignment)
void setTitle(const WString &title)
virtual std::string mimeType() const
Return the mime type.
WWidget * pieChart()
Creates the chart.
const WString currentText() const
static const char * FileSelectionMimeType
Constant that indicates the mime type for a selection of files.
virtual void setModel(const std::shared_ptr< WAbstractItemModel > &model) override
void setTwoPhaseRenderingThreshold(int size)
virtual void resize(const WLength &width, const WLength &height) override
WTreeView * folderView_
The folder view.
void setSelectionMode(SelectionMode mode)
A specialized standard item model which report a specific drag and drop mime type.
WWidget * aboutDisplay()
Creates the hints text.
virtual bool setData(const WModelIndex &index, const cpp17::any &value, ItemDataRole role=ItemDataRole::Edit)
virtual int rowCount(const WModelIndex &parent=WModelIndex()) const=0
virtual void setData(const cpp17::any &data, ItemDataRole role=ItemDataRole::User)
void dialogDone()
Process the result of the message box.
A specialized treeview that supports a custom drop event.
void setBuddy(WFormWidget *buddy)
void setFilterRegExp(std::unique_ptr< std::regex > pattern)
static StandardButton show(const WString &caption, const WString &text, WFlags< StandardButton > buttons, const WAnimation &animation=WAnimation())
std::shared_ptr< WAbstractItemModel > sourceModel() const
std::string toUTF8() const
WDatePicker * modifiedPicker_
std::shared_ptr< WAbstractItemModel > model() const
WSortFilterProxyModel * fileFilterModel_
The sort filter proxy model that adapts fileModel_.
std::map< std::string, WString > folderNameMap_
Maps folder id's to folder descriptions.
Signal & selectionChanged()
virtual void setModel(const std::shared_ptr< WAbstractItemModel > &model) override
static WString tr(const char *key)
void setDragEnabled(bool enable)
void editFile(const WModelIndex &item)
Edit a particular row.
void use(const std::string &path, bool loadInMemory=true)
Signal< WModelIndex, WMouseEvent > & doubleClicked()
void createUI()
Setup the user interface.
void setIcon(const std::string &uri)
void setText(const WString &text)
WFlags< ItemFlag > & clear(ItemFlag value)
MouseButton button() const
void addLayout(std::unique_ptr< WLayout > layout, int row, int column, WFlags< AlignmentFlag > alignment=None)
WString asString(const cpp17::any &v, const WString &formatString=WString())
A dialog for editing a 'file'.
WModelIndexSet selectedIndexes() const
static WApplication * instance()
void appendRow(std::vector< std::unique_ptr< WStandardItem > > items)
void setColumnResizable(int column, bool enabled=true, const WLength &initialSize=WLength::Auto)
WStandardItem * createFolderItem(const WString &location, const std::string &folderId=std::string())
Create a folder item.
void showPopup(const WModelIndex &item, const WMouseEvent &event)
Show a popup for a folder item.
WPopupMenu * popup_
Popup menu on the folder view.
void setResizable(int index, bool enabled=true, const WLength &initialSize=WLength::Auto)
void expandToDepth(int depth)
WAbstractItemModel * model_
virtual WModelIndex index(int row, int column, const WModelIndex &parent=WModelIndex()) const=0
void select(const WModelIndex &index, SelectionFlag option=SelectionFlag::Select)
virtual void setAlternatingRowColors(bool enable) override
void populateFolders()
Populate the folders model.
void sortByColumn(int column, SortOrder order)
virtual void setColumnWidth(int column, const WLength &width) override
static std::string appRoot()
WTreeView * folderView()
Creates the folder WTreeView.
void setRowStretch(int row, int stretch)
void useStyleSheet(const WLink &link, const std::string &media="all")
FileModel(WObject *parent)
Constructor.
void popupAction()
Process the result of the popup menu.
virtual bool setHeaderData(int section, Orientation orientation, const cpp17::any &value, ItemDataRole role=ItemDataRole::Edit)
WTableView * fileView_
The file view.
void setFlags(WFlags< ItemFlag > flags)
int main(int argc, char **argv)
Signal< WModelIndex, WMouseEvent > & mouseWentUp()
void appendRow(std::vector< std::unique_ptr< WStandardItem > > items)
void folderChanged()
Change the filter on the file view when the selected folder changes.
void readFromCsv(std::istream &f, Wt::WAbstractItemModel *model, int numRows, bool firstLineIsHeaders)
Utility function that reads a model from a CSV file.
virtual Wt::Signals::connection connect(WObject *target, WObject::Method method) override
bool isSelected(const WModelIndex &index) const
virtual WModelIndex mapToSource(const WModelIndex &proxyIndex) const=0
FileEditDialog(WAbstractItemModel *model, const WModelIndex &item)
Signal< StandardButton > & buttonClicked()
WStandardItem * invisibleRootItem() const
WStandardItemModel * fileModel_
The file model (used by fileView_)
virtual ~TreeViewDragDrop()
WText * createTitle(const WString &title)
Creates a title widget.
virtual void setColumnAlignment(int column, AlignmentFlag alignment)