1
|
#include <Wt/WApplication>
|
2
|
#include <Wt/WEnvironment>
|
3
|
|
4
|
#include <Wt/WTreeView>
|
5
|
#include <Wt/WStandardItem>
|
6
|
#include <Wt/WStandardItemModel>
|
7
|
#include <Wt/WItemDelegate>
|
8
|
|
9
|
#include <Wt/WText>
|
10
|
#include <Wt/WContainerWidget>
|
11
|
#include <Wt/WLineEdit>
|
12
|
|
13
|
#include <string>
|
14
|
#include <iostream>
|
15
|
#include <limits>
|
16
|
#include <boost/bind.hpp>
|
17
|
#include <boost/any.hpp>
|
18
|
|
19
|
using namespace std;
|
20
|
using namespace Wt;
|
21
|
|
22
|
|
23
|
class MyDelegate: public Wt::WItemDelegate
|
24
|
{
|
25
|
public:
|
26
|
MyDelegate(Wt::WObject *parent = 0) : WItemDelegate(parent) {};
|
27
|
virtual ~MyDelegate(){};
|
28
|
private:
|
29
|
Wt::WWidget* createEditor(const Wt::WModelIndex& index, Wt::WFlags<Wt::ViewItemRenderFlag> flags) const;
|
30
|
void Close(Wt::WWidget *editor, bool save) const;
|
31
|
boost::any editState(Wt::WWidget *editor) const;
|
32
|
};
|
33
|
|
34
|
|
35
|
|
36
|
|
37
|
class cntWidget: public Wt::WText {
|
38
|
public:
|
39
|
cntWidget(Wt::WContainerWidget *parent = 0): Wt::WText(parent) {++cnt_; std::cout << "CNT widget = "<< cnt_<<std::endl;};
|
40
|
~cntWidget(){--cnt_; std::cout << " CNT widget = "<< cnt_<< std::endl;};
|
41
|
static int cnt_;
|
42
|
};
|
43
|
int cntWidget::cnt_=0;
|
44
|
|
45
|
|
46
|
Wt::WWidget* MyDelegate::createEditor(const Wt::WModelIndex& index, Wt::WFlags<Wt::ViewItemRenderFlag> flags) const{
|
47
|
// reimplement the default editor to add a validator
|
48
|
Wt::WContainerWidget *editor = new Wt::WContainerWidget();
|
49
|
Wt::WLineEdit *line = new Wt::WLineEdit();
|
50
|
line->escapePressed().connect(boost::bind(&MyDelegate::Close, this, editor, false));
|
51
|
line->blurred().connect(boost::bind(&MyDelegate::Close, this, editor, true));
|
52
|
if (flags & RenderFocused) line->setFocus();
|
53
|
editor ->addWidget(line);
|
54
|
editor ->addWidget(new cntWidget());
|
55
|
return editor ;
|
56
|
}
|
57
|
|
58
|
void MyDelegate::Close(Wt::WWidget *editor, bool save) const {
|
59
|
closeEditor().emit(editor, save);
|
60
|
cout << "closeEditor emitted" << endl;
|
61
|
}
|
62
|
|
63
|
boost::any MyDelegate::editState(Wt::WWidget *editor) const {
|
64
|
Wt::WContainerWidget *w = dynamic_cast<Wt::WContainerWidget *>(editor);
|
65
|
Wt::WLineEdit *lineEdit = dynamic_cast<Wt::WLineEdit *>(w->widget(0));
|
66
|
return boost::any(lineEdit->text().narrow());
|
67
|
}
|
68
|
|
69
|
Wt::WApplication* createApp(const Wt::WEnvironment& env) {
|
70
|
WApplication* app = new WApplication(env);
|
71
|
app->setCssTheme("polished");
|
72
|
|
73
|
Wt::WTreeView* tree = new WTreeView(app->root());
|
74
|
WStandardItemModel* model = new WStandardItemModel(app->root());
|
75
|
|
76
|
WStandardItem *item = new WStandardItem("na");
|
77
|
item->setFlags(ItemIsEditable);
|
78
|
model->setItem(0,1,item);
|
79
|
item = new WStandardItem("name");
|
80
|
item->setFlags(ItemIsEditable);
|
81
|
model->setItem(0,0,item);
|
82
|
item = new WStandardItem("num");
|
83
|
item->setFlags(ItemIsEditable);
|
84
|
model->setItem(1,0,item);
|
85
|
item = new WStandardItem("3");
|
86
|
item->setFlags(ItemIsEditable);
|
87
|
model->setItem(1,1,item);
|
88
|
|
89
|
tree->setModel(model);
|
90
|
tree->setItemDelegateForColumn(0, new MyDelegate(app->root()));
|
91
|
|
92
|
tree->setItemDelegateForColumn(1, new MyDelegate(app->root()));
|
93
|
tree->setAlternatingRowColors(true);
|
94
|
tree->setSelectionMode(SingleSelection);
|
95
|
tree->setEditTriggers(WAbstractItemView::SingleClicked);
|
96
|
tree->setHeight(200);
|
97
|
return app;
|
98
|
}
|
99
|
|
100
|
|
101
|
int main(int argc, char** argv) {
|
102
|
cout << WT_CLASS << endl;
|
103
|
return WRun(argc,argv,&createApp);
|
104
|
}
|
105
|
|