HaikuDepot: Delayed Increment View Counter

Performs the increment of the view counter
after a delay of three seconds; otherwise
a number of "false views" can be stored as
people use keyboard navigation.

Relates to #16879

Change-Id: I6f3440e1e3132c832cd807e48105022d22df9abf
Reviewed-on: https://review.haiku-os.org/c/haiku/+/5356
Reviewed-by: Adrien Destugues <pulkomandy@gmail.com>
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
This commit is contained in:
Andrew Lindesay 2022-06-06 16:36:33 +12:00
parent 85344c112c
commit 8467457050
2 changed files with 61 additions and 5 deletions

View File

@ -24,6 +24,7 @@
#include <LayoutBuilder.h>
#include <MenuBar.h>
#include <MenuItem.h>
#include <MessageRunner.h>
#include <Messenger.h>
#include <Roster.h>
#include <Screen.h>
@ -71,6 +72,7 @@ enum {
MSG_PROCESS_COORDINATOR_CHANGED = 'pccd',
MSG_WORK_STATUS_CHANGE = 'wsch',
MSG_WORK_STATUS_CLEAR = 'wscl',
MSG_INCREMENT_VIEW_COUNTER = 'icrv',
MSG_CHANGE_PACKAGE_LIST_VIEW_MODE = 'cplm',
MSG_SHOW_AVAILABLE_PACKAGES = 'savl',
@ -81,6 +83,8 @@ enum {
#define KEY_ERROR_STATUS "errorStatus"
const bigtime_t kIncrementViewCounterDelayMicros = 3 * 1000 * 1000;
#define TAB_PROMINENT_PACKAGES 0
#define TAB_ALL_PACKAGES 1
@ -167,7 +171,8 @@ MainWindow::MainWindow(const BMessage& settings)
fModelListener(new MainWindowModelListener(BMessenger(this)), true),
fCoordinator(NULL),
fShouldCloseWhenNoProcessesToCoordinate(false),
fSinglePackageMode(false)
fSinglePackageMode(false),
fIncrementViewCounterDelayedRunner(NULL)
{
if ((fCoordinatorRunningSem = create_sem(1, "ProcessCoordinatorSem")) < B_OK)
debugger("unable to create the process coordinator semaphore");
@ -265,7 +270,8 @@ MainWindow::MainWindow(const BMessage& settings, PackageInfoRef& package)
fModelListener(new MainWindowModelListener(BMessenger(this)), true),
fCoordinator(NULL),
fShouldCloseWhenNoProcessesToCoordinate(false),
fSinglePackageMode(true)
fSinglePackageMode(true),
fIncrementViewCounterDelayedRunner(NULL)
{
if ((fCoordinatorRunningSem = create_sem(1, "ProcessCoordinatorSem")) < B_OK)
debugger("unable to create the process coordinator semaphore");
@ -499,8 +505,12 @@ MainWindow::MessageReceived(BMessage* message)
name.String());
}
}
break;
}
break;
}
case MSG_INCREMENT_VIEW_COUNTER:
_HandleIncrementViewCounter(message);
break;
case MSG_PACKAGE_SELECTED:
{
@ -515,7 +525,7 @@ MainWindow::MessageReceived(BMessage* message)
debugger("unable to find the named package");
else {
_AdoptPackage(package);
_IncrementViewCounter(package);
_SetupDelayedIncrementViewCounter(package);
}
} else {
_ClearPackage();
@ -964,6 +974,46 @@ MainWindow::_AddRemovePackageFromLists(const PackageInfoRef& package)
}
void
MainWindow::_SetupDelayedIncrementViewCounter(const PackageInfoRef package) {
if (fIncrementViewCounterDelayedRunner != NULL) {
fIncrementViewCounterDelayedRunner->SetCount(0);
delete fIncrementViewCounterDelayedRunner;
}
BMessage message(MSG_INCREMENT_VIEW_COUNTER);
message.SetString("name", package->Name());
fIncrementViewCounterDelayedRunner =
new BMessageRunner(BMessenger(this), &message,
kIncrementViewCounterDelayMicros, 1);
if (fIncrementViewCounterDelayedRunner->InitCheck()
!= B_OK) {
HDERROR("unable to init the increment view counter");
}
}
void
MainWindow::_HandleIncrementViewCounter(const BMessage* message)
{
BString name;
if (message->FindString("name", &name) == B_OK) {
const PackageInfoRef& viewedPackage =
fPackageInfoView->Package();
if (viewedPackage.IsSet()) {
if (viewedPackage->Name() == name)
_IncrementViewCounter(viewedPackage);
else
HDINFO("incr. view counter; name mismatch");
} else
HDINFO("incr. view counter; no viewed pkg");
} else
HDERROR("incr. view counter; no name");
fIncrementViewCounterDelayedRunner->SetCount(0);
delete fIncrementViewCounterDelayedRunner;
fIncrementViewCounterDelayedRunner = NULL;
}
void
MainWindow::_IncrementViewCounter(const PackageInfoRef package)
{

View File

@ -98,6 +98,10 @@ private:
void _AdoptPackage(const PackageInfoRef& package);
void _ClearPackage();
void _SetupDelayedIncrementViewCounter(
const PackageInfoRef package);
void _HandleIncrementViewCounter(
const BMessage* message);
void _IncrementViewCounter(
const PackageInfoRef package);
@ -185,6 +189,8 @@ private:
PackageInfoListenerRef
fPackageInfoListener;
BMessageRunner* fIncrementViewCounterDelayedRunner;
};