HaikuDepot: Fix scrolling the list triggering "looping."
If two PACKAGE_SELECTED messages were queued at once, then we would wind up in a loop between the two, triggering the "looping" behavior. Instead, do not send a PACKAGE_SELECTED message when programatically changing what package is selected, which is more efficient anyway. Fixes #11732.
This commit is contained in:
@@ -857,7 +857,8 @@ PackageListView::PackageListView(Model* model)
|
|||||||
fModel(model),
|
fModel(model),
|
||||||
fPackageListener(new(std::nothrow) PackageListener(this)),
|
fPackageListener(new(std::nothrow) PackageListener(this)),
|
||||||
fRowByNameTable(new RowByNameTable()),
|
fRowByNameTable(new RowByNameTable()),
|
||||||
fWorkStatusView(NULL)
|
fWorkStatusView(NULL),
|
||||||
|
fIgnoreSelectionChanged(false)
|
||||||
{
|
{
|
||||||
float scale = be_plain_font->Size() / 12.f;
|
float scale = be_plain_font->Size() / 12.f;
|
||||||
float spacing = be_control_look->DefaultItemSpacing() * 2;
|
float spacing = be_control_look->DefaultItemSpacing() * 2;
|
||||||
@@ -981,6 +982,9 @@ PackageListView::SelectionChanged()
|
|||||||
{
|
{
|
||||||
BColumnListView::SelectionChanged();
|
BColumnListView::SelectionChanged();
|
||||||
|
|
||||||
|
if (fIgnoreSelectionChanged)
|
||||||
|
return;
|
||||||
|
|
||||||
BMessage message(MSG_PACKAGE_SELECTED);
|
BMessage message(MSG_PACKAGE_SELECTED);
|
||||||
|
|
||||||
PackageRow* selected = dynamic_cast<PackageRow*>(CurrentSelection());
|
PackageRow* selected = dynamic_cast<PackageRow*>(CurrentSelection());
|
||||||
@@ -1046,6 +1050,8 @@ PackageListView::RemovePackage(const PackageInfoRef& package)
|
|||||||
void
|
void
|
||||||
PackageListView::SelectPackage(const PackageInfoRef& package)
|
PackageListView::SelectPackage(const PackageInfoRef& package)
|
||||||
{
|
{
|
||||||
|
fIgnoreSelectionChanged = true;
|
||||||
|
|
||||||
PackageRow* row = _FindRow(package);
|
PackageRow* row = _FindRow(package);
|
||||||
BRow* selected = CurrentSelection();
|
BRow* selected = CurrentSelection();
|
||||||
if (row != selected)
|
if (row != selected)
|
||||||
@@ -1055,6 +1061,8 @@ PackageListView::SelectPackage(const PackageInfoRef& package)
|
|||||||
SetFocusRow(row, false);
|
SetFocusRow(row, false);
|
||||||
ScrollTo(row);
|
ScrollTo(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fIgnoreSelectionChanged = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ private:
|
|||||||
RowByNameTable* fRowByNameTable;
|
RowByNameTable* fRowByNameTable;
|
||||||
|
|
||||||
WorkStatusView* fWorkStatusView;
|
WorkStatusView* fWorkStatusView;
|
||||||
|
|
||||||
|
bool fIgnoreSelectionChanged;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PACKAGE_LIST_VIEW_H
|
#endif // PACKAGE_LIST_VIEW_H
|
||||||
|
|||||||
Reference in New Issue
Block a user