Skip to content

Commit 866889f

Browse files
author
Koen Deforche
committed
Batch of several fixes:
- fix #2328 and #2350: regressions in WPopupMenu / WMenuItem - fix for JWt suggestionpopup backwards compatibility - fixed #2282: memory leak in WTableView/WTreeView - propagate the WMouseEvent to WAbstractItemView headerClicked events
1 parent dad3581 commit 866889f

File tree

11 files changed

+86
-49
lines changed

11 files changed

+86
-49
lines changed

src/Wt/WAbstractItemView

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -769,15 +769,15 @@ public:
769769
*
770770
* \sa clicked(), headerDblClicked()
771771
*/
772-
Signal<int> &headerClicked() { return headerClicked_; }
772+
Signal<int, WMouseEvent> &headerClicked() { return headerClicked_; }
773773

774774
/*! \brief %Signal emitted when a header item is double clicked.
775775
*
776776
* The argument that is passed is the column number.
777777
*
778778
* \sa doubleClicked(), headerClicked()
779779
*/
780-
Signal<int> &headerDoubleClicked() { return headerDblClicked_; }
780+
Signal<int, WMouseEvent> &headerDoubleClicked() { return headerDblClicked_; }
781781

782782
/*! \brief Configures the number of columns that are used as row
783783
* headers.
@@ -1037,17 +1037,17 @@ private:
10371037

10381038
WSignalMapper<int> *clickedForExpandMapper_, *clickedForCollapseMapper_;
10391039

1040-
WSignalMapper<int> *headerDblClickedMapper_,
1041-
*headerClickedMapper_;
1040+
// WSignalMapper<int, WMouseEvent> *headerDblClickedMapper_,
1041+
// *headerClickedMapper_;
10421042
bool alternatingRowColors_;
10431043

10441044
JSlot resizeHandleMDownJS_;
10451045

10461046
typedef std::map<WModelIndex, Editor> EditorMap;
10471047
EditorMap editedItems_;
10481048

1049-
Signal<int> headerDblClicked_;
1050-
Signal<int> headerClicked_;
1049+
Signal<int, WMouseEvent> headerDblClicked_;
1050+
Signal<int, WMouseEvent> headerClicked_;
10511051

10521052
Signal<WModelIndex, WMouseEvent> clicked_;
10531053
Signal<WModelIndex, WMouseEvent> doubleClicked_;
@@ -1076,8 +1076,8 @@ private:
10761076
void checkDragSelection();
10771077
void configureModelDragDrop();
10781078

1079-
void handleHeaderClicked(int columnid);
1080-
void handleHeaderDblClicked(int columnid);
1079+
void handleHeaderClicked(int columnid, WMouseEvent event);
1080+
void handleHeaderDblClicked(int columnid, WMouseEvent event);
10811081
void toggleSortColumn(int columnid);
10821082
void updateColumnWidth(int columnId, int width);
10831083

src/Wt/WAbstractItemView.C

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -252,13 +252,6 @@ WAbstractItemView::WAbstractItemView(WContainerWidget *parent)
252252

253253
typedef WAbstractItemView Self;
254254

255-
headerClickedMapper_ = new WSignalMapper<int>(this);
256-
headerClickedMapper_->mapped().connect(this, &Self::handleHeaderClicked);
257-
258-
headerDblClickedMapper_ = new WSignalMapper<int>(this);
259-
headerDblClickedMapper_->mapped().connect(this,
260-
&Self::handleHeaderDblClicked);
261-
262255
clickedForCollapseMapper_ = new WSignalMapper<int>(this);
263256
clickedForCollapseMapper_->mapped().connect(this, &Self::collapseColumn);
264257

@@ -293,11 +286,13 @@ WAbstractItemView::~WAbstractItemView()
293286

294287
void WAbstractItemView::setModel(WAbstractItemModel *model)
295288
{
289+
bool isReset = false;
296290
if (model_) {
297291
/* disconnect slots from previous model */
298292
for (unsigned i = 0; i < modelConnections_.size(); ++i)
299293
modelConnections_[i].disconnect();
300294
modelConnections_.clear();
295+
isReset = true;
301296
}
302297

303298
model_ = model;
@@ -312,6 +307,9 @@ void WAbstractItemView::setModel(WAbstractItemModel *model)
312307

313308
editedItems_.clear();
314309

310+
if (!isReset)
311+
initDragDrop();
312+
315313
configureModelDragDrop();
316314

317315
setRootIndex(WModelIndex());
@@ -607,8 +605,6 @@ void WAbstractItemView::dropEvent(const WDropEvent& e, const WModelIndex& index)
607605

608606
void WAbstractItemView::configureModelDragDrop()
609607
{
610-
initDragDrop();
611-
612608
if (!model_)
613609
return;
614610

@@ -675,20 +671,20 @@ WWidget *WAbstractItemView::extraHeaderWidget(int column)
675671
return columnInfo(column).extraHeaderWidget;
676672
}
677673

678-
void WAbstractItemView::handleHeaderClicked(int columnid)
674+
void WAbstractItemView::handleHeaderClicked(int columnid, WMouseEvent event)
679675
{
680676
int column = columnById(columnid);
681677
ColumnInfo& info = columnInfo(column);
682678

683679
if (sortEnabled_ && info.sorting)
684680
toggleSortColumn(columnid);
685681

686-
headerClicked_.emit(column);
682+
headerClicked_.emit(column, event);
687683
}
688684

689-
void WAbstractItemView::handleHeaderDblClicked(int columnid)
685+
void WAbstractItemView::handleHeaderDblClicked(int columnid, WMouseEvent event)
690686
{
691-
headerDblClicked_.emit(columnById(columnid));
687+
headerDblClicked_.emit(columnById(columnid), event);
692688
}
693689

694690
void WAbstractItemView::toggleSortColumn(int columnid)
@@ -1011,8 +1007,9 @@ WWidget *WAbstractItemView::createHeaderWidget(int column)
10111007
sortIcon->setObjectName("sort");
10121008
sortIcon->setInline(false);
10131009
sortIcon->setStyleClass("Wt-tv-sh Wt-tv-sh-none");
1014-
headerClickedMapper_->mapConnect(sortIcon->clicked(), info.id);
1015-
1010+
sortIcon->clicked().connect(
1011+
boost::bind(&WAbstractItemView::handleHeaderClicked,
1012+
this, info.id, _1));
10161013
if (currentSortColumn_ == column)
10171014
sortIcon->setStyleClass(info.sortOrder == AscendingOrder
10181015
? "Wt-tv-sh Wt-tv-sh-up"
@@ -1043,8 +1040,12 @@ WWidget *WAbstractItemView::createHeaderWidget(int column)
10431040
// FIXME: we probably want this as an API option ?
10441041
WInteractWidget *ww = dynamic_cast<WInteractWidget *>(i);
10451042
if (ww){
1046-
headerClickedMapper_->mapConnect(ww->clicked(), info.id);
1047-
headerDblClickedMapper_->mapConnect(ww->doubleClicked(), info.id);
1043+
ww->clicked().connect(
1044+
boost::bind(&WAbstractItemView::handleHeaderClicked, this,
1045+
info.id, _1));
1046+
ww->doubleClicked().connect(
1047+
boost::bind(&WAbstractItemView::handleHeaderDblClicked,
1048+
this, info.id, _1));
10481049
}
10491050

10501051
int headerLevel = model_ ? this->headerLevel(column) : 0;

src/Wt/WInteractWidget

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ public:
330330
*/
331331
int mouseOverDelay() const;
332332

333+
virtual void setPopup(bool popup);
333334
virtual void load();
334335
virtual bool isEnabled() const;
335336

src/Wt/WInteractWidget.C

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,17 @@ WInteractWidget::~WInteractWidget()
5555
delete dragSlot_;
5656
}
5757

58+
void WInteractWidget::setPopup(bool popup)
59+
{
60+
if (popup) {
61+
clicked().preventPropagation();
62+
mouseWentDown().preventPropagation();
63+
mouseWentUp().preventPropagation();
64+
}
65+
66+
WWebWidget::setPopup(popup);
67+
}
68+
5869
EventSignal<WKeyEvent>& WInteractWidget::keyWentDown()
5970
{
6071
return *keyEventSignal(KEYDOWN_SIGNAL, true);

src/Wt/WMenuItem.C

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ void WMenuItem::create(const std::string& iconPath, const WString& text,
8585

8686
if (!separator_) {
8787
WAnchor *anchor = new WAnchor(this);
88-
anchor->clicked().preventPropagation();
8988
updateInternalPath();
9089
}
9190

@@ -421,6 +420,7 @@ void WMenuItem::connectSignals()
421420
void WMenuItem::setParentMenu(WMenu *menu)
422421
{
423422
menu_ = menu;
423+
424424
updateInternalPath();
425425
}
426426

src/Wt/WSuggestionPopup

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,10 @@ public:
187187
* \sa WSuggestionPopup
188188
*/
189189
struct Options {
190+
/*! \brief Constructor
191+
*/
192+
Options();
193+
190194
/*! \brief Open tag to highlight a match in a suggestion.
191195
*
192196
* Must be an opening markup tag, such as &lt;b&gt;.

src/Wt/WSuggestionPopup.C

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ namespace Wt {
5151

5252
LOGGER("WSuggestionPopup");
5353

54+
WSuggestionPopup::Options::Options()
55+
: listSeparator(0)
56+
{ }
57+
5458
WSuggestionPopup::WSuggestionPopup(const Options& options, WObject *parent)
5559
: WPopupWidget(new WContainerWidget(), parent),
5660
model_(0),

src/Wt/WTableView.C

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,6 +1242,8 @@ void WTableView::modelColumnsAboutToBeRemoved(const WModelIndex& parent,
12421242
if (!columnInfo(i).hidden)
12431243
width += (int)columnInfo(i).width.toPixels() + 7;
12441244

1245+
for (int i=start; i<start+count; i++)
1246+
delete columns_[i].styleRule;
12451247
columns_.erase(columns_.begin() + start, columns_.begin() + start + count);
12461248

12471249
if (ajaxMode())

src/Wt/WTreeView.C

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1833,6 +1833,8 @@ void WTreeView::modelColumnsAboutToBeRemoved(const WModelIndex& parent,
18331833
doJavaScript("$('#" + id() + "').data('obj').adjustColumns();");
18341834
}
18351835

1836+
for (int i=start; i<start+count; i++)
1837+
delete columns_[i].styleRule;
18361838
columns_.erase(columns_.begin() + start, columns_.begin() + start + count);
18371839

18381840
if (renderState_ < NeedRerenderHeader) {

src/Wt/WWebWidget

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,15 +318,16 @@ private:
318318
static const int BIT_DISABLED = 24;
319319
static const int BIT_DISABLED_CHANGED = 25;
320320
static const int BIT_CONTAINS_LAYOUT = 26;
321+
static const int BIT_ZINDEX_CHANGED = 27;
321322

322323
#ifndef WT_TARGET_JAVA
323-
static const std::bitset<27> AllChangeFlags;
324+
static const std::bitset<28> AllChangeFlags;
324325
#endif // WT_TARGET_JAVA
325326

326327
/*
327328
* Frequently used attributes.
328329
*/
329-
std::bitset<27> flags_;
330+
std::bitset<28> flags_;
330331
WLength *width_;
331332
WLength *height_;
332333

0 commit comments

Comments
 (0)