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 <LayoutBuilder.h>
#include <MenuBar.h> #include <MenuBar.h>
#include <MenuItem.h> #include <MenuItem.h>
#include <MessageRunner.h>
#include <Messenger.h> #include <Messenger.h>
#include <Roster.h> #include <Roster.h>
#include <Screen.h> #include <Screen.h>
@ -71,6 +72,7 @@ enum {
MSG_PROCESS_COORDINATOR_CHANGED = 'pccd', MSG_PROCESS_COORDINATOR_CHANGED = 'pccd',
MSG_WORK_STATUS_CHANGE = 'wsch', MSG_WORK_STATUS_CHANGE = 'wsch',
MSG_WORK_STATUS_CLEAR = 'wscl', MSG_WORK_STATUS_CLEAR = 'wscl',
MSG_INCREMENT_VIEW_COUNTER = 'icrv',
MSG_CHANGE_PACKAGE_LIST_VIEW_MODE = 'cplm', MSG_CHANGE_PACKAGE_LIST_VIEW_MODE = 'cplm',
MSG_SHOW_AVAILABLE_PACKAGES = 'savl', MSG_SHOW_AVAILABLE_PACKAGES = 'savl',
@ -81,6 +83,8 @@ enum {
#define KEY_ERROR_STATUS "errorStatus" #define KEY_ERROR_STATUS "errorStatus"
const bigtime_t kIncrementViewCounterDelayMicros = 3 * 1000 * 1000;
#define TAB_PROMINENT_PACKAGES 0 #define TAB_PROMINENT_PACKAGES 0
#define TAB_ALL_PACKAGES 1 #define TAB_ALL_PACKAGES 1
@ -167,7 +171,8 @@ MainWindow::MainWindow(const BMessage& settings)
fModelListener(new MainWindowModelListener(BMessenger(this)), true), fModelListener(new MainWindowModelListener(BMessenger(this)), true),
fCoordinator(NULL), fCoordinator(NULL),
fShouldCloseWhenNoProcessesToCoordinate(false), fShouldCloseWhenNoProcessesToCoordinate(false),
fSinglePackageMode(false) fSinglePackageMode(false),
fIncrementViewCounterDelayedRunner(NULL)
{ {
if ((fCoordinatorRunningSem = create_sem(1, "ProcessCoordinatorSem")) < B_OK) if ((fCoordinatorRunningSem = create_sem(1, "ProcessCoordinatorSem")) < B_OK)
debugger("unable to create the process coordinator semaphore"); 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), fModelListener(new MainWindowModelListener(BMessenger(this)), true),
fCoordinator(NULL), fCoordinator(NULL),
fShouldCloseWhenNoProcessesToCoordinate(false), fShouldCloseWhenNoProcessesToCoordinate(false),
fSinglePackageMode(true) fSinglePackageMode(true),
fIncrementViewCounterDelayedRunner(NULL)
{ {
if ((fCoordinatorRunningSem = create_sem(1, "ProcessCoordinatorSem")) < B_OK) if ((fCoordinatorRunningSem = create_sem(1, "ProcessCoordinatorSem")) < B_OK)
debugger("unable to create the process coordinator semaphore"); debugger("unable to create the process coordinator semaphore");
@ -499,8 +505,12 @@ MainWindow::MessageReceived(BMessage* message)
name.String()); name.String());
} }
} }
break; break;
} }
case MSG_INCREMENT_VIEW_COUNTER:
_HandleIncrementViewCounter(message);
break;
case MSG_PACKAGE_SELECTED: case MSG_PACKAGE_SELECTED:
{ {
@ -515,7 +525,7 @@ MainWindow::MessageReceived(BMessage* message)
debugger("unable to find the named package"); debugger("unable to find the named package");
else { else {
_AdoptPackage(package); _AdoptPackage(package);
_IncrementViewCounter(package); _SetupDelayedIncrementViewCounter(package);
} }
} else { } else {
_ClearPackage(); _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 void
MainWindow::_IncrementViewCounter(const PackageInfoRef package) MainWindow::_IncrementViewCounter(const PackageInfoRef package)
{ {

View File

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