xref: /haiku/src/add-ons/tracker/iconvader/IconVader.cpp (revision 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef)
1 /*
2  * Copyright 2009, François Revol, <revol@free.fr>.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 #include <Alert.h>
7 #include <Messenger.h>
8 #include <Roster.h>
9 #include <View.h>
10 
11 #include "PoseView.h"
12 
13 
14 static void Error(BView *view, status_t status, bool unlock=false)
15 {
16 	BAlert *alert;
17 	if (view && unlock)
18 		view->UnlockLooper();
19 	BString s(strerror(status));
20 	alert = new BAlert("Error", s.String(), "OK");
21 	alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
22 	alert->Go();
23 }
24 
25 extern "C" void
26 process_refs(entry_ref dir, BMessage* refs, void* /*reserved*/)
27 {
28 	status_t status;
29 	BAlert *alert;
30 	BMessenger msgr;
31 	BPoseView *view = NULL;
32 	BMessage poseViewBackup;
33 	BMessage poseViewColumnBackup;
34 	uint32 poseViewModeBackup;
35 	BString windowTitleBackup;
36 
37 	refs->PrintToStream();
38 
39 	status = refs->FindMessenger("TrackerViewToken", &msgr);
40 	if (status < B_OK) {
41 		Error(view, status);
42 		return;
43 	}
44 
45 	status = B_ERROR;
46 	if (!msgr.LockTarget()) {
47 		Error(view, status);
48 		return;
49 	}
50 
51 	status = B_BAD_HANDLER;
52 	view = dynamic_cast<BPoseView *>(msgr.Target(NULL));
53 	if (!view) {
54 		Error(view, status);
55 		return;
56 	}
57 	if (dynamic_cast<BWindow *>(view->Looper()) == NULL) {
58 		Error(view, status, true);
59 		return;
60 	}
61 
62 	windowTitleBackup = view->Window()->Title();
63 
64 	view->SaveColumnState(poseViewColumnBackup);
65 	view->SaveState(poseViewBackup);
66 	view->SetDragEnabled(false);
67 	view->SetSelectionRectEnabled(false);
68 	view->SetPoseEditing(false);
69 	poseViewModeBackup = view->ViewMode();
70 
71 	view->SetViewMode(kIconMode);
72 	view->ShowBarberPole();
73 
74 	view->UnlockLooper();
75 
76 	alert = new BAlert("Error", "IconVader:\nClick on the icons to get points."
77 		"\nAvoid symlinks!", "OK");
78 	alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
79 	alert->Go();
80 
81 	int32 score = 0;
82 	int32 count = 300;
83 	while (count--) {
84 		status = B_ERROR;
85 		if (!msgr.LockTarget()) {
86 			Error(view, status);
87 			return;
88 		}
89 
90 		BPose *pose;
91 		for (int32 i = 0; (pose = view->PoseAtIndex(i)); i++) {
92 			if (pose->IsSelected()) {
93 				if (pose->TargetModel()->IsFile())
94 					score++;
95 				if (pose->TargetModel()->IsDirectory())
96 					score+=2;
97 				if (pose->TargetModel()->IsSymLink())
98 					score-=10;
99 				pose->Select(false);
100 			}
101 			BPoint location = pose->Location(view);
102 			location.x += ((rand() % 20) - 10);
103 			location.y += ((rand() % 20) - 10);
104 			pose->SetLocation(location, view);
105 		}
106 
107 		view->CheckPoseVisibility();
108 
109 		view->Invalidate();
110 
111 		BString str("Score: ");
112 		str << score;
113 		view->Window()->SetTitle(str.String());
114 
115 		view->UnlockLooper();
116 		snooze(100000);
117 	}
118 
119 	BString scoreStr("You scored ");
120 	scoreStr << score << " points!";
121 	alert = new BAlert("Error", scoreStr.String(), "Cool!");
122 	alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
123 	alert->Go();
124 
125 	status = B_ERROR;
126 	if (!msgr.LockTarget()) {
127 		Error(view, status);
128 		return;
129 	}
130 
131 	/*
132 	status = B_BAD_HANDLER;
133 	view = dynamic_cast<BPoseView *>(msgr.Target(NULL));
134 	if (!view)
135 		goto err1;
136 	*/
137 
138 	view->HideBarberPole();
139 	view->SetViewMode(poseViewModeBackup);
140 	view->RestoreState(poseViewBackup);
141 	view->RestoreColumnState(poseViewColumnBackup);
142 
143 	view->Window()->SetTitle(windowTitleBackup.String());
144 
145 /*
146 	BMessage('_RRC') {
147         TrackerViewToken = BMessenger(port=32004, team=591, target=direct:0x131)
148 } */
149 
150 
151 	view->UnlockLooper();
152 	return;
153 
154 }
155