Project

General

Profile

Bug #3807 » Main.cpp

memory leak when delegate is set for column > 0 - Стойчо Стефанов Stoycho Stefanov, 03/24/2015 05:41 PM

 
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

    
    (1-1/1)