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:
parent
85344c112c
commit
8467457050
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user