|
73 /* * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
74
|
|
75 class DateDelegate
|
|
76 : public Wt::WItemDelegate
|
|
77 {
|
|
78 public:
|
|
79
|
|
80 ~DateDelegate()
|
|
81 {
|
|
82 std::cout << __FILE__ << ":" << __LINE__ << " " << std::endl;
|
|
83 }
|
|
84
|
|
85 std::unique_ptr< Wt::WWidget > createEditor
|
|
86 (
|
|
87 const Wt::WModelIndex & _index,
|
|
88 Wt::WFlags< Wt::ViewItemRenderFlag > _flags
|
|
89 ) const;
|
|
90
|
|
91 virtual Wt::cpp17::any editState( Wt::WWidget *editor, const Wt::WModelIndex &index ) const override;
|
|
92 void setEditState( Wt::WWidget * _editor, const Wt::WModelIndex & _index, const Wt::cpp17::any & _value ) const;
|
|
93 void setModelData ( const Wt::cpp17::any & _editState, Wt::WAbstractItemModel * _model, const Wt::WModelIndex & _index ) const;
|
|
94
|
|
95 void doCloseEditor( Wt::WDateEdit * _dateEdit, bool save ) const;
|
|
96 void doTabAction( Wt::WKeyEvent _keyEvent ) const;
|
|
97
|
|
98 mutable Wt::WDateEdit * m_dateEdit = nullptr;
|
|
99
|
|
100 }; // endclass DateDelegate
|
|
101
|
|
102 std::unique_ptr< Wt::WWidget >
|
|
103 DateDelegate::
|
|
104 createEditor
|
|
105 (
|
|
106 const Wt::WModelIndex & _index,
|
|
107 Wt::WFlags< Wt::ViewItemRenderFlag > _flags
|
|
108 ) const
|
|
109 {
|
|
110 #ifndef NEVER
|
|
111 std::cout << __FILE__ << ":" << __LINE__
|
|
112 << " DateDelegate::createEditor()"
|
|
113 << " r:" << _index.row()
|
|
114 << " c:" << _index.column()
|
|
115 << std::endl;
|
|
116 #endif
|
|
117
|
|
118 /*
|
|
119 ** The editor is placed in to a container for layout
|
|
120 ** management
|
|
121 **
|
|
122 */
|
|
123 auto retVal = std::make_unique< Wt::WContainerWidget >();
|
|
124 #ifndef NEVER
|
|
125 retVal-> setSelectable( true );
|
|
126
|
|
127 /*
|
|
128 ** Get the date from the string value
|
|
129 **
|
|
130 */
|
|
131 auto date =
|
|
132 Wt::WDate::fromString
|
|
133 (
|
|
134 Wt::asString( _index.data( Wt::ItemDataRole::Edit ) ),
|
|
135 GCW::CFG::date_format()
|
|
136 );
|
|
137
|
|
138 /*
|
|
139 ** Build an editor
|
|
140 **
|
|
141 ** Hitting the 'enter' key or the 'esc' key closes the editor
|
|
142 **
|
|
143 */
|
|
144 auto dateEdit = std::make_unique< Wt::WDateEdit >();
|
|
145 m_dateEdit = dateEdit.get();
|
|
146 dateEdit-> setFormat( GCW::CFG::date_format() );
|
|
147 dateEdit-> setDate( date );
|
|
148 dateEdit-> enterPressed ().connect( [&](){ doCloseEditor( dateEdit.get(), true ); });
|
|
149 dateEdit-> escapePressed ().connect( [&](){ doCloseEditor( dateEdit.get(), false ); });
|
|
150 dateEdit-> keyWentDown ().connect( [&]( Wt::WKeyEvent _keyEvent ){ doTabAction( _keyEvent ); });
|
|
151
|
|
152 /*
|
|
153 ** Stuff it in to the layout
|
|
154 **
|
|
155 */
|
|
156 retVal-> setLayout( std::make_unique< Wt::WHBoxLayout >() );
|
|
157 retVal-> layout()-> setContentsMargins( 1,1,1,1 );
|
|
158 retVal-> layout()-> addWidget( std::move( dateEdit ) );
|
|
159 #endif
|
|
160
|
|
161 std::cout << __FILE__ << ":" << __LINE__ << " " << std::endl;
|
|
162
|
|
163 return retVal;
|
|
164
|
|
165 } // endstd::unique_ptr< Wt::WWidget > DateDelegate::createEditor
|
|
166
|
|
167 void
|
|
168 DateDelegate::
|
|
169 doCloseEditor( Wt::WDateEdit * _dateEdit, bool save ) const
|
|
170 {
|
|
171 #ifndef NEVER
|
|
172 std::cout << __FILE__ << ":" << __LINE__ << " DateDelegate::doCloseEditor()" << std::endl;
|
|
173 #endif
|
|
174
|
|
175 closeEditor().emit( _dateEdit, save );
|
|
176
|
|
177 } // endvoid DateDelegate::doCloseEditor( Wt::WDateEdit * _dateEdit, bool save ) const
|
|
178
|
|
179 void
|
|
180 DateDelegate::
|
|
181 doTabAction( Wt::WKeyEvent _keyEvent ) const
|
|
182 {
|
|
183 #ifndef NEVER
|
|
184 std::cout << __FILE__ << ":" << __LINE__ << " DateDelegate::doTabAction()" << std::endl;
|
|
185 #endif
|
|
186
|
|
187 }
|
|
188
|
|
189 Wt::cpp17::any
|
|
190 DateDelegate::
|
|
191 editState( Wt::WWidget * _editor, const Wt::WModelIndex & _index ) const
|
|
192 {
|
|
193 auto cw = dynamic_cast< Wt::WContainerWidget* >( _editor );
|
|
194
|
|
195 auto de = dynamic_cast< Wt::WDateEdit* >( cw-> children().at(0) );
|
|
196
|
|
197 #ifndef NEVER
|
|
198 std::cout << __FILE__ << ":" << __LINE__
|
|
199 << " Wt::cpp17::any DateDelegate::editState()"
|
|
200 << " r:" << _index.row()
|
|
201 << " c:" << _index.column()
|
|
202 << " i:" << cw-> id()
|
|
203 << " n:" << cw-> objectName()
|
|
204 << " s:" << cw-> children().size()
|
|
205 << " t:" << typeid( cw-> children().at(0) ).name()
|
|
206 << " d:" << de
|
|
207 << " m:" << m_dateEdit
|
|
208 << " t:" << m_dateEdit-> text()
|
|
209 << std::endl
|
|
210 ;
|
|
211 #endif
|
|
212
|
|
213 // return "";
|
|
214 return m_dateEdit-> text();
|
|
215
|
|
216 } // endWt::cpp17::any DateDelegate::editState( Wt::WWidget * _editor, const Wt::WModelIndex & _index ) const
|
|
217
|
|
218 void
|
|
219 DateDelegate::
|
|
220 setEditState( Wt::WWidget * _editor, const Wt::WModelIndex & _index, const Wt::cpp17::any & _value ) const
|
|
221 {
|
|
222 // the '_editor' and 'm_dateEdit' are not the same widget
|
|
223 #ifdef NEVER
|
|
224 std::cout << __FILE__ << ":" << __LINE__ << " " << _editor << " " << typeid( _editor ).name() << std::endl;
|
|
225 std::cout << __FILE__ << ":" << __LINE__ << " " << m_dateEdit << " " << typeid( m_dateEdit ).name() << std::endl;
|
|
226 #endif
|
|
227
|
|
228 Wt::WItemDelegate::setEditState( _editor, _index, _value );
|
|
229
|
|
230 } // endvoid DateDelegate::setEditState( Wt::WWidget * _editor, const Wt::WModelIndex & _index, const Wt::cpp17::any & _value ) const
|
|
231
|
|
232 void
|
|
233 DateDelegate::
|
|
234 setModelData( const Wt::cpp17::any & _editState, Wt::WAbstractItemModel * _model, const Wt::WModelIndex & _index ) const
|
|
235 {
|
|
236 #ifdef NEVER
|
|
237 std::cout << __FILE__ << ":" << __LINE__
|
|
238 << " setModelData()"
|
|
239 << " " << _index.row()
|
|
240 << " " << _index.column()
|
|
241 << " " << Wt::asString( _editState )
|
|
242 << " " << _model
|
|
243 << std::endl;
|
|
244 #endif
|
|
245
|
|
246 Wt::WItemDelegate::setModelData( _editState, _model, _index );
|
|
247
|
|
248 } // endvoid DateDelegate::setModelData( const Wt::cpp17::any & _editState, Wt::WAbstractItemModel * _model, const Wt::WModelIndex & _index ) const
|
|
249
|
|
|