Tracker and Open Target Folder: Select result

Implement the todo in Open Target Folder to select the result by sending
Tracker a message with the refs to select.

Add a new kSelect message constant to tracker_private.h to hook into.

Tracker reads in the message and finds the window that the refs are located in,
activates it, then selects the corresponding poses scrolling the pose view
if necessary.

Bump version of Open Target Folder to 1.0.2
This commit is contained in:
John Scipione
2015-03-03 18:47:06 -05:00
parent 039f59262a
commit 9cdba41add
5 changed files with 78 additions and 3 deletions
@@ -68,6 +68,9 @@ const uint32 kFSClipboardChanges = 'TCch';
const uint32 kMoveToTrash = 'Ttrs';
// Used by ShowImage to delete images
const uint32 kSelect = 'Tsel';
// Used by Open Target Folder tracker add-on to select files
} // namespace BPrivate
@@ -24,10 +24,19 @@
#include <tracker_private.h>
using namespace BPrivate;
extern "C" void
process_refs(entry_ref directoryRef, BMessage* message, void*)
{
entry_ref ref;
uint32 selectCount = 0;
// create Tracker messenger...
BMessenger messenger(kTrackerSignature);
// create select message...
BMessage selectMessage(kSelect);
for (int32 i = 0; message->FindRef("refs", i, &ref) == B_OK; i++) {
BSymLink link(&ref);
@@ -76,11 +85,22 @@ process_refs(entry_ref directoryRef, BMessage* message, void*)
trackerMessage.AddRef("refs", &parent);
// ...and send it
BMessenger messenger(kTrackerSignature);
messenger.SendMessage(&trackerMessage);
// TODO: select entry via scripting?
entry_ref target;
if (targetEntry.GetRef(&target) != B_OK) {
// don't alert, selection is not critical
break;
}
// add ref to selection message
selectMessage.AddRef("refs", &target);
selectCount++;
}
// ...and send it
if (selectCount > 0)
messenger.SendMessage(&selectMessage);
}
@@ -5,7 +5,7 @@ resource app_flags B_SINGLE_LAUNCH;
resource app_version {
major = 1,
middle = 0,
minor = 1,
minor = 2,
variety = B_APPV_FINAL,
internal = 1,
+51
View File
@@ -82,6 +82,7 @@ All rights reserved.
#include "Thread.h"
#include "TrackerSettings.h"
#include "TrackerSettingsWindow.h"
#include "TrackerString.h"
#include "TrashWatcher.h"
#include "VirtualDirectoryWindow.h"
@@ -485,6 +486,10 @@ TTracker::MessageReceived(BMessage* message)
MoveRefsToTrash(message);
break;
case kSelect:
SelectRefs(message);
break;
case kCloseWindowAndChildren:
{
const node_ref* itemNode;
@@ -699,6 +704,52 @@ TTracker::MoveRefsToTrash(const BMessage* message)
}
void
TTracker::SelectRefs(const BMessage* message)
{
uint32 type = 0;
int32 count = 0;
message->GetInfo("refs", &type, &count);
for (int32 index = 0; index < count; index++) {
entry_ref ref;
message->FindRef("refs", index, &ref);
BEntry entry(&ref, true);
if (entry.InitCheck() != B_OK || !entry.Exists())
continue;
AutoLock<WindowList> lock(&fWindowList);
BContainerWindow* window = FindParentContainerWindow(&ref);
if (window == NULL)
continue;
char name[B_FILE_NAME_LENGTH];
if (entry.GetName(name) != B_OK)
continue;
BString expression;
expression << "^";
expression << name;
expression << "$";
BMessage* selectMessage = new BMessage(kSelectMatchingEntries);
selectMessage->AddInt32("ExpressionType", kRegexpMatch);
selectMessage->AddString("Expression", expression);
selectMessage->AddBool("InvertSelection", false);
selectMessage->AddBool("IgnoreCase", false);
window->Activate();
// must be activated to populate the pose list
snooze(100000);
// wait a bit for the pose list to be populated
// ToDo: figure out why this is necessary
window->PostMessage(selectMessage);
}
}
template <class T, class FT>
class EntryAndNodeDoSoonWithMessageFunctor : public
FunctionObjectWithResult<bool> {
+1
View File
@@ -201,6 +201,7 @@ private:
void CloseAllInWorkspace();
void OpenInfoWindows(BMessage*);
void MoveRefsToTrash(const BMessage*);
void SelectRefs(const BMessage*);
void OpenContainerWindow(Model*, BMessage* refsList = NULL,
OpenSelector openSelector = kOpen, uint32 openFlags = 0,
bool checkAlreadyOpen = true,