diff options
Diffstat (limited to 'linden')
-rw-r--r-- | linden/indra/newview/app_settings/settings.xml | 13 | ||||
-rw-r--r-- | linden/indra/newview/llfloateravatarpicker.cpp | 386 | ||||
-rw-r--r-- | linden/indra/newview/llfloateravatarpicker.h | 44 | ||||
-rw-r--r-- | linden/indra/newview/llfloatergodtools.cpp | 8 | ||||
-rw-r--r-- | linden/indra/newview/llglsandbox.cpp | 2 | ||||
-rw-r--r-- | linden/indra/newview/llnetmap.cpp | 8 | ||||
-rw-r--r-- | linden/indra/newview/llviewerobjectlist.cpp | 2 | ||||
-rw-r--r-- | linden/indra/newview/llworld.cpp | 66 | ||||
-rw-r--r-- | linden/indra/newview/llworld.h | 19 | ||||
-rw-r--r-- | linden/indra/newview/pipeline.cpp | 20 | ||||
-rw-r--r-- | linden/indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml | 128 |
11 files changed, 457 insertions, 239 deletions
diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml index 9a6749b..cce09e2 100644 --- a/linden/indra/newview/app_settings/settings.xml +++ b/linden/indra/newview/app_settings/settings.xml | |||
@@ -4982,7 +4982,18 @@ | |||
4982 | <string>Boolean</string> | 4982 | <string>Boolean</string> |
4983 | <key>Value</key> | 4983 | <key>Value</key> |
4984 | <integer>1</integer> | 4984 | <integer>1</integer> |
4985 | </map> | 4985 | </map> |
4986 | <key>NearMeRange</key> | ||
4987 | <map> | ||
4988 | <key>Comment</key> | ||
4989 | <string>Search radius for nearby avatars</string> | ||
4990 | <key>Persist</key> | ||
4991 | <integer>1</integer> | ||
4992 | <key>Type</key> | ||
4993 | <string>F32</string> | ||
4994 | <key>Value</key> | ||
4995 | <integer>20</integer> | ||
4996 | </map> | ||
4986 | <key>NewCacheLocation</key> | 4997 | <key>NewCacheLocation</key> |
4987 | <map> | 4998 | <map> |
4988 | <key>Comment</key> | 4999 | <key>Comment</key> |
diff --git a/linden/indra/newview/llfloateravatarpicker.cpp b/linden/indra/newview/llfloateravatarpicker.cpp index 97d2de9..0bdabdd 100644 --- a/linden/indra/newview/llfloateravatarpicker.cpp +++ b/linden/indra/newview/llfloateravatarpicker.cpp | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #include "message.h" | 35 | #include "message.h" |
36 | 36 | ||
37 | #include "llagent.h" | ||
37 | #include "llbutton.h" | 38 | #include "llbutton.h" |
38 | #include "llfocusmgr.h" | 39 | #include "llfocusmgr.h" |
39 | #include "llinventoryview.h" | 40 | #include "llinventoryview.h" |
@@ -42,7 +43,8 @@ | |||
42 | #include "llscrolllistctrl.h" | 43 | #include "llscrolllistctrl.h" |
43 | #include "lltextbox.h" | 44 | #include "lltextbox.h" |
44 | #include "lluictrlfactory.h" | 45 | #include "lluictrlfactory.h" |
45 | #include "llagent.h" | 46 | #include "llviewercontrol.h" |
47 | #include "llworld.h" | ||
46 | 48 | ||
47 | const S32 MIN_WIDTH = 200; | 49 | const S32 MIN_WIDTH = 200; |
48 | const S32 MIN_HEIGHT = 340; | 50 | const S32 MIN_HEIGHT = 340; |
@@ -58,6 +60,8 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback, | |||
58 | BOOL allow_multiple, | 60 | BOOL allow_multiple, |
59 | BOOL closeOnSelect) | 61 | BOOL closeOnSelect) |
60 | { | 62 | { |
63 | // TODO: This class should not be a singleton as it's used in multiple places | ||
64 | // and therefore can't be used simultaneously. -MG | ||
61 | if (!sInstance) | 65 | if (!sInstance) |
62 | { | 66 | { |
63 | sInstance = new LLFloaterAvatarPicker(); | 67 | sInstance = new LLFloaterAvatarPicker(); |
@@ -77,6 +81,7 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback, | |||
77 | sInstance->setAllowMultiple(allow_multiple); | 81 | sInstance->setAllowMultiple(allow_multiple); |
78 | } | 82 | } |
79 | 83 | ||
84 | sInstance->mNearMeListComplete = FALSE; | ||
80 | sInstance->mCloseOnSelect = closeOnSelect; | 85 | sInstance->mCloseOnSelect = closeOnSelect; |
81 | return sInstance; | 86 | return sInstance; |
82 | } | 87 | } |
@@ -97,39 +102,58 @@ BOOL LLFloaterAvatarPicker::postBuild() | |||
97 | 102 | ||
98 | childSetAction("Find", onBtnFind, this); | 103 | childSetAction("Find", onBtnFind, this); |
99 | childDisable("Find"); | 104 | childDisable("Find"); |
105 | childSetAction("Refresh", onBtnRefresh, this); | ||
106 | childSetCommitCallback("near_me_range", onRangeAdjust, this); | ||
100 | 107 | ||
101 | mListNames = getChild<LLScrollListCtrl>("Names"); | 108 | childSetDoubleClickCallback("SearchResults", onBtnSelect); |
102 | childSetDoubleClickCallback("Names",onBtnAdd); | 109 | childSetDoubleClickCallback("NearMe", onBtnSelect); |
103 | childSetCommitCallback("Names", onList, this); | 110 | childSetCommitCallback("SearchResults", onList, this); |
104 | childDisable("Names"); | 111 | childSetCommitCallback("NearMe", onList, this); |
112 | childDisable("SearchResults"); | ||
105 | 113 | ||
106 | childSetAction("Select", onBtnAdd, this); | 114 | childSetAction("Select", onBtnSelect, this); |
107 | childDisable("Select"); | 115 | childDisable("Select"); |
108 | 116 | ||
109 | childSetAction("Close", onBtnClose, this); | 117 | childSetAction("Cancel", onBtnClose, this); |
110 | 118 | ||
111 | childSetFocus("Edit"); | 119 | childSetFocus("Edit"); |
112 | 120 | ||
113 | if (mListNames) | 121 | LLPanel* search_panel = getChild<LLPanel>("SearchPanel"); |
122 | if (search_panel) | ||
114 | { | 123 | { |
115 | mListNames->addCommentText(std::string("No results")); // *TODO: Translate | 124 | // Start searching when Return is pressed in the line editor. |
125 | search_panel->setDefaultBtn("Find"); | ||
116 | } | 126 | } |
117 | 127 | ||
118 | mInventoryPanel = getChild<LLInventoryPanel>("Inventory Panel"); | 128 | getChild<LLScrollListCtrl>("SearchResults")->addCommentText(getString("no_results")); |
119 | if(mInventoryPanel) | 129 | |
120 | { | 130 | LLInventoryPanel* inventory_panel = getChild<LLInventoryPanel>("InventoryPanel"); |
121 | mInventoryPanel->setFilterTypes(LLInventoryType::NIT_CALLCARD); | 131 | inventory_panel->setFilterTypes(0x1 << LLInventoryType::IT_CALLINGCARD); |
122 | mInventoryPanel->setFollowsAll(); | 132 | inventory_panel->setFollowsAll(); |
123 | mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); | 133 | inventory_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); |
124 | mInventoryPanel->openDefaultFolderForType(LLAssetType::AT_CALLINGCARD); | 134 | inventory_panel->openDefaultFolderForType(LLAssetType::AT_CALLINGCARD); |
125 | mInventoryPanel->setSelectCallback(LLFloaterAvatarPicker::onSelectionChange, this); | 135 | inventory_panel->setSelectCallback(LLFloaterAvatarPicker::onCallingCardSelectionChange, this); |
126 | } | 136 | |
127 | 137 | childSetTabChangeCallback("ResidentChooserTabs", "SearchPanel", onTabChanged, this); | |
138 | childSetTabChangeCallback("ResidentChooserTabs", "CallingCardsPanel", onTabChanged, this); | ||
139 | childSetTabChangeCallback("ResidentChooserTabs", "NearMePanel", onTabChanged, this); | ||
140 | |||
128 | setAllowMultiple(FALSE); | 141 | setAllowMultiple(FALSE); |
129 | 142 | ||
130 | return TRUE; | 143 | return TRUE; |
131 | } | 144 | } |
132 | 145 | ||
146 | void LLFloaterAvatarPicker::onTabChanged(void* userdata, bool from_click) | ||
147 | { | ||
148 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; | ||
149 | if (!self) | ||
150 | { | ||
151 | return; | ||
152 | } | ||
153 | |||
154 | self->childSetEnabled("Select", self->visibleItemsSelected()); | ||
155 | } | ||
156 | |||
133 | // Destroys the object | 157 | // Destroys the object |
134 | LLFloaterAvatarPicker::~LLFloaterAvatarPicker() | 158 | LLFloaterAvatarPicker::~LLFloaterAvatarPicker() |
135 | { | 159 | { |
@@ -144,22 +168,50 @@ void LLFloaterAvatarPicker::onBtnFind(void* userdata) | |||
144 | if(self) self->find(); | 168 | if(self) self->find(); |
145 | } | 169 | } |
146 | 170 | ||
147 | void LLFloaterAvatarPicker::onBtnAdd(void* userdata) | 171 | static void getSelectedAvatarData(const LLScrollListCtrl* from, std::vector<std::string>& avatar_names, std::vector<LLUUID>& avatar_ids) |
172 | { | ||
173 | std::vector<LLScrollListItem*> items = from->getAllSelected(); | ||
174 | for (std::vector<LLScrollListItem*>::iterator iter = items.begin(); iter != items.end(); ++iter) | ||
175 | { | ||
176 | LLScrollListItem* item = *iter; | ||
177 | if (item->getUUID().notNull()) | ||
178 | { | ||
179 | avatar_names.push_back(item->getColumn(0)->getValue().asString()); | ||
180 | avatar_ids.push_back(item->getUUID()); | ||
181 | } | ||
182 | } | ||
183 | } | ||
184 | |||
185 | void LLFloaterAvatarPicker::onBtnSelect(void* userdata) | ||
148 | { | 186 | { |
149 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; | 187 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; |
150 | 188 | ||
151 | if(self->mCallback) | 189 | if(self->mCallback) |
152 | { | 190 | { |
153 | self->mCallback(self->mAvatarNames, self->mAvatarIDs, self->mCallbackUserdata); | 191 | LLPanel* active_panel = self->childGetVisibleTab("ResidentChooserTabs"); |
154 | } | 192 | |
155 | if (self->mInventoryPanel) | 193 | if(active_panel == self->getChild<LLPanel>("CallingCardsPanel")) |
156 | { | 194 | { |
157 | self->mInventoryPanel->setSelection(LLUUID::null, FALSE); | 195 | self->mCallback(self->mSelectedInventoryAvatarNames, self->mSelectedInventoryAvatarIDs, self->mCallbackUserdata); |
158 | } | 196 | } |
159 | if (self->mListNames) | 197 | else if(active_panel == self->getChild<LLPanel>("SearchPanel")) |
160 | { | 198 | { |
161 | self->mListNames->deselectAllItems(TRUE); | 199 | std::vector<std::string> avatar_names; |
200 | std::vector<LLUUID> avatar_ids; | ||
201 | getSelectedAvatarData(self->getChild<LLScrollListCtrl>("SearchResults"), avatar_names, avatar_ids); | ||
202 | self->mCallback(avatar_names, avatar_ids, self->mCallbackUserdata); | ||
203 | } | ||
204 | else if(active_panel == self->getChild<LLPanel>("NearMePanel")) | ||
205 | { | ||
206 | std::vector<std::string> avatar_names; | ||
207 | std::vector<LLUUID> avatar_ids; | ||
208 | getSelectedAvatarData(self->getChild<LLScrollListCtrl>("NearMe"), avatar_names, avatar_ids); | ||
209 | self->mCallback(avatar_names, avatar_ids, self->mCallbackUserdata); | ||
210 | } | ||
162 | } | 211 | } |
212 | self->getChild<LLInventoryPanel>("InventoryPanel")->setSelection(LLUUID::null, FALSE); | ||
213 | self->getChild<LLScrollListCtrl>("SearchResults")->deselectAllItems(TRUE); | ||
214 | self->getChild<LLScrollListCtrl>("NearMe")->deselectAllItems(TRUE); | ||
163 | if(self->mCloseOnSelect) | 215 | if(self->mCloseOnSelect) |
164 | { | 216 | { |
165 | self->mCloseOnSelect = FALSE; | 217 | self->mCloseOnSelect = FALSE; |
@@ -167,68 +219,61 @@ void LLFloaterAvatarPicker::onBtnAdd(void* userdata) | |||
167 | } | 219 | } |
168 | } | 220 | } |
169 | 221 | ||
222 | void LLFloaterAvatarPicker::onBtnRefresh(void* userdata) | ||
223 | { | ||
224 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; | ||
225 | if (!self) | ||
226 | { | ||
227 | return; | ||
228 | } | ||
229 | |||
230 | self->getChild<LLScrollListCtrl>("NearMe")->deleteAllItems(); | ||
231 | self->getChild<LLScrollListCtrl>("NearMe")->addCommentText(self->getString("searching")); | ||
232 | self->mNearMeListComplete = FALSE; | ||
233 | } | ||
234 | |||
170 | void LLFloaterAvatarPicker::onBtnClose(void* userdata) | 235 | void LLFloaterAvatarPicker::onBtnClose(void* userdata) |
171 | { | 236 | { |
172 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; | 237 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; |
173 | if(self) self->close(); | 238 | if(self) self->close(); |
174 | } | 239 | } |
175 | 240 | ||
241 | void LLFloaterAvatarPicker::onRangeAdjust(LLUICtrl* source, void* data) | ||
242 | { | ||
243 | LLFloaterAvatarPicker::onBtnRefresh(data); | ||
244 | } | ||
245 | |||
176 | void LLFloaterAvatarPicker::onList(LLUICtrl* ctrl, void* userdata) | 246 | void LLFloaterAvatarPicker::onList(LLUICtrl* ctrl, void* userdata) |
177 | { | 247 | { |
178 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; | 248 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata; |
179 | if (!self) | 249 | if (self) |
180 | { | ||
181 | return; | ||
182 | } | ||
183 | |||
184 | self->mAvatarIDs.clear(); | ||
185 | self->mAvatarNames.clear(); | ||
186 | |||
187 | if (!self->mListNames) | ||
188 | { | ||
189 | return; | ||
190 | } | ||
191 | |||
192 | std::vector<LLScrollListItem*> items = | ||
193 | self->mListNames->getAllSelected(); | ||
194 | for ( | ||
195 | std::vector<LLScrollListItem*>::iterator iter = items.begin(); | ||
196 | iter != items.end(); | ||
197 | ++iter) | ||
198 | { | 250 | { |
199 | LLScrollListItem* item = *iter; | 251 | self->childSetEnabled("Select", self->visibleItemsSelected()); |
200 | self->mAvatarNames.push_back(item->getColumn(0)->getValue().asString()); | ||
201 | self->mAvatarIDs.push_back(item->getUUID()); | ||
202 | self->childSetEnabled("Select", TRUE); | ||
203 | } | 252 | } |
204 | } | 253 | } |
205 | 254 | ||
206 | // static callback for inventory picker (select from calling cards) | 255 | // static callback for inventory picker (select from calling cards) |
207 | void LLFloaterAvatarPicker::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action, void* data) | 256 | void LLFloaterAvatarPicker::onCallingCardSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action, void* data) |
208 | { | 257 | { |
209 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)data; | 258 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)data; |
210 | if (self) | 259 | if (self) |
211 | { | 260 | { |
212 | self->doSelectionChange( items, user_action, data ); | 261 | self->doCallingCardSelectionChange( items, user_action, data ); |
213 | } | 262 | } |
214 | } | 263 | } |
215 | 264 | ||
216 | // Callback for inventory picker (select from calling cards) | 265 | // Callback for inventory picker (select from calling cards) |
217 | void LLFloaterAvatarPicker::doSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action, void* data) | 266 | void LLFloaterAvatarPicker::doCallingCardSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action, void* data) |
218 | { | 267 | { |
219 | if (!mListNames) | 268 | bool panel_active = (childGetVisibleTab("ResidentChooserTabs") == getChild<LLPanel>("CallingCardsPanel")); |
269 | |||
270 | mSelectedInventoryAvatarIDs.clear(); | ||
271 | mSelectedInventoryAvatarNames.clear(); | ||
272 | |||
273 | if (panel_active) | ||
220 | { | 274 | { |
221 | return; | ||
222 | } | ||
223 | |||
224 | std::vector<LLScrollListItem*> search_items = mListNames->getAllSelected(); | ||
225 | if ( search_items.size() == 0 ) | ||
226 | { // Nothing selected in the search results | ||
227 | mAvatarIDs.clear(); | ||
228 | mAvatarNames.clear(); | ||
229 | childSetEnabled("Select", FALSE); | 275 | childSetEnabled("Select", FALSE); |
230 | } | 276 | } |
231 | BOOL first_calling_card = TRUE; | ||
232 | 277 | ||
233 | std::deque<LLFolderViewItem*>::const_iterator item_it; | 278 | std::deque<LLFolderViewItem*>::const_iterator item_it; |
234 | for (item_it = items.begin(); item_it != items.end(); ++item_it) | 279 | for (item_it = items.begin(); item_it != items.end(); ++item_it) |
@@ -237,26 +282,97 @@ void LLFloaterAvatarPicker::doSelectionChange(const std::deque<LLFolderViewItem* | |||
237 | if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD) | 282 | if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD) |
238 | { | 283 | { |
239 | LLInventoryItem* item = gInventory.getItem(listenerp->getUUID()); | 284 | LLInventoryItem* item = gInventory.getItem(listenerp->getUUID()); |
240 | |||
241 | if (item) | 285 | if (item) |
242 | { | 286 | { |
243 | if ( first_calling_card ) | 287 | mSelectedInventoryAvatarIDs.push_back(item->getCreatorUUID()); |
244 | { // Have a calling card selected, so clear anything from the search panel | 288 | mSelectedInventoryAvatarNames.push_back(listenerp->getName()); |
245 | first_calling_card = FALSE; | ||
246 | mAvatarIDs.clear(); | ||
247 | mAvatarNames.clear(); | ||
248 | mListNames->deselectAllItems(); | ||
249 | } | ||
250 | |||
251 | // Add calling card info to the selected avatars | ||
252 | mAvatarIDs.push_back(item->getCreatorUUID()); | ||
253 | mAvatarNames.push_back(listenerp->getName()); | ||
254 | childSetEnabled("Select", TRUE); | ||
255 | } | 289 | } |
256 | } | 290 | } |
257 | } | 291 | } |
292 | |||
293 | if (panel_active) | ||
294 | { | ||
295 | childSetEnabled("Select", visibleItemsSelected()); | ||
296 | } | ||
258 | } | 297 | } |
259 | 298 | ||
299 | void LLFloaterAvatarPicker::populateNearMe() | ||
300 | { | ||
301 | BOOL all_loaded = TRUE; | ||
302 | BOOL empty = TRUE; | ||
303 | LLScrollListCtrl* near_me_scroller = getChild<LLScrollListCtrl>("NearMe"); | ||
304 | near_me_scroller->deleteAllItems(); | ||
305 | |||
306 | std::vector<LLUUID> avatar_ids; | ||
307 | LLWorld::getInstance()->getAvatars(&avatar_ids, NULL, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange")); | ||
308 | for(U32 i=0; i<avatar_ids.size(); i++) | ||
309 | { | ||
310 | LLUUID& av = avatar_ids[i]; | ||
311 | if(av == gAgent.getID()) continue; | ||
312 | LLSD element; | ||
313 | element["id"] = av; // value | ||
314 | std::string fullname; | ||
315 | if(!gCacheName->getFullName(av, fullname)) | ||
316 | { | ||
317 | element["columns"][0]["value"] = LLCacheName::getDefaultName(); | ||
318 | all_loaded = FALSE; | ||
319 | } | ||
320 | else | ||
321 | { | ||
322 | element["columns"][0]["value"] = fullname; | ||
323 | } | ||
324 | near_me_scroller->addElement(element); | ||
325 | empty = FALSE; | ||
326 | } | ||
327 | |||
328 | if (empty) | ||
329 | { | ||
330 | childDisable("NearMe"); | ||
331 | childDisable("Select"); | ||
332 | near_me_scroller->addCommentText(getString("no_one_near")); | ||
333 | } | ||
334 | else | ||
335 | { | ||
336 | childEnable("NearMe"); | ||
337 | childEnable("Select"); | ||
338 | near_me_scroller->selectFirstItem(); | ||
339 | onList(near_me_scroller, this); | ||
340 | near_me_scroller->setFocus(TRUE); | ||
341 | } | ||
342 | |||
343 | if (all_loaded) | ||
344 | { | ||
345 | mNearMeListComplete = TRUE; | ||
346 | } | ||
347 | } | ||
348 | |||
349 | void LLFloaterAvatarPicker::draw() | ||
350 | { | ||
351 | LLFloater::draw(); | ||
352 | if (!mNearMeListComplete && childGetVisibleTab("ResidentChooserTabs") == getChild<LLPanel>("NearMePanel")) | ||
353 | { | ||
354 | populateNearMe(); | ||
355 | } | ||
356 | } | ||
357 | |||
358 | BOOL LLFloaterAvatarPicker::visibleItemsSelected() const | ||
359 | { | ||
360 | LLPanel* active_panel = childGetVisibleTab("ResidentChooserTabs"); | ||
361 | |||
362 | if(active_panel == getChild<LLPanel>("SearchPanel")) | ||
363 | { | ||
364 | return getChild<LLScrollListCtrl>("SearchResults")->getFirstSelectedIndex() >= 0; | ||
365 | } | ||
366 | else if(active_panel == getChild<LLPanel>("CallingCardsPanel")) | ||
367 | { | ||
368 | return mSelectedInventoryAvatarIDs.size() > 0; | ||
369 | } | ||
370 | else if(active_panel == getChild<LLPanel>("NearMePanel")) | ||
371 | { | ||
372 | return getChild<LLScrollListCtrl>("NearMe")->getFirstSelectedIndex() >= 0; | ||
373 | } | ||
374 | return FALSE; | ||
375 | } | ||
260 | 376 | ||
261 | void LLFloaterAvatarPicker::find() | 377 | void LLFloaterAvatarPicker::find() |
262 | { | 378 | { |
@@ -276,11 +392,8 @@ void LLFloaterAvatarPicker::find() | |||
276 | 392 | ||
277 | gAgent.sendReliableMessage(); | 393 | gAgent.sendReliableMessage(); |
278 | 394 | ||
279 | if (mListNames) | 395 | getChild<LLScrollListCtrl>("SearchResults")->deleteAllItems(); |
280 | { | 396 | getChild<LLScrollListCtrl>("SearchResults")->addCommentText(getString("searching")); |
281 | mListNames->deleteAllItems(); | ||
282 | mListNames->addCommentText(std::string("Searching...")); // *TODO: Translate | ||
283 | } | ||
284 | 397 | ||
285 | childSetEnabled("Select", FALSE); | 398 | childSetEnabled("Select", FALSE); |
286 | mResultsReturned = FALSE; | 399 | mResultsReturned = FALSE; |
@@ -288,15 +401,9 @@ void LLFloaterAvatarPicker::find() | |||
288 | 401 | ||
289 | void LLFloaterAvatarPicker::setAllowMultiple(BOOL allow_multiple) | 402 | void LLFloaterAvatarPicker::setAllowMultiple(BOOL allow_multiple) |
290 | { | 403 | { |
291 | mAllowMultiple = allow_multiple; | 404 | getChild<LLScrollListCtrl>("SearchResults")->setAllowMultipleSelection(allow_multiple); |
292 | if (mInventoryPanel) | 405 | getChild<LLInventoryPanel>("InventoryPanel")->setAllowMultiSelect(allow_multiple); |
293 | { | 406 | getChild<LLScrollListCtrl>("NearMe")->setAllowMultipleSelection(allow_multiple); |
294 | mInventoryPanel->setAllowMultiSelect(mAllowMultiple); | ||
295 | } | ||
296 | if (mListNames) | ||
297 | { | ||
298 | mListNames->setAllowMultipleSelection(mAllowMultiple); | ||
299 | } | ||
300 | } | 407 | } |
301 | 408 | ||
302 | // static | 409 | // static |
@@ -324,52 +431,48 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* | |||
324 | return; | 431 | return; |
325 | } | 432 | } |
326 | 433 | ||
327 | if (!self->mResultsReturned) | 434 | LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("SearchResults"); |
328 | { | 435 | |
329 | // clear "Searching" label on first results | 436 | // clear "Searching" label on first results |
330 | if (self->mListNames) | 437 | search_results->deleteAllItems(); |
331 | { | 438 | |
332 | self->mListNames->deleteAllItems(); | ||
333 | } | ||
334 | } | ||
335 | self->mResultsReturned = TRUE; | 439 | self->mResultsReturned = TRUE; |
336 | 440 | ||
337 | if (self->mListNames) | 441 | BOOL found_one = FALSE; |
338 | { | 442 | S32 num_new_rows = msg->getNumberOfBlocks("Data"); |
339 | BOOL found_one = FALSE; | 443 | for (S32 i = 0; i < num_new_rows; i++) |
340 | S32 num_new_rows = msg->getNumberOfBlocks("Data"); | 444 | { |
341 | for (S32 i = 0; i < num_new_rows; i++) | 445 | msg->getUUIDFast( _PREHASH_Data,_PREHASH_AvatarID, avatar_id, i); |
342 | { | 446 | msg->getStringFast(_PREHASH_Data,_PREHASH_FirstName, first_name, i); |
343 | msg->getUUIDFast( _PREHASH_Data,_PREHASH_AvatarID, avatar_id, i); | 447 | msg->getStringFast(_PREHASH_Data,_PREHASH_LastName, last_name, i); |
344 | msg->getStringFast(_PREHASH_Data,_PREHASH_FirstName, first_name, i); | ||
345 | msg->getStringFast(_PREHASH_Data,_PREHASH_LastName, last_name, i); | ||
346 | |||
347 | std::string avatar_name; | ||
348 | if (avatar_id.isNull()) | ||
349 | { | ||
350 | LLStringUtil::format_map_t map; | ||
351 | map["[TEXT]"] = self->childGetText("Edit"); | ||
352 | avatar_name = self->getString("NotFound", map); | ||
353 | self->mListNames->setEnabled(FALSE); | ||
354 | } | ||
355 | else | ||
356 | { | ||
357 | avatar_name = first_name + " " + last_name; | ||
358 | self->mListNames->setEnabled(TRUE); | ||
359 | found_one = TRUE; | ||
360 | } | ||
361 | LLSD element; | ||
362 | element["id"] = avatar_id; // value | ||
363 | element["columns"][0]["value"] = avatar_name; | ||
364 | self->mListNames->addElement(element); | ||
365 | } | ||
366 | 448 | ||
367 | if (found_one) | 449 | std::string avatar_name; |
450 | if (avatar_id.isNull()) | ||
368 | { | 451 | { |
369 | self->mListNames->selectFirstItem(); | 452 | LLStringUtil::format_map_t map; |
370 | self->onList(self->mListNames, self); | 453 | map["[TEXT]"] = self->childGetText("Edit"); |
371 | self->mListNames->setFocus(TRUE); | 454 | avatar_name = self->getString("not_found", map); |
455 | search_results->setEnabled(FALSE); | ||
456 | self->childDisable("Select"); | ||
372 | } | 457 | } |
458 | else | ||
459 | { | ||
460 | avatar_name = first_name + " " + last_name; | ||
461 | search_results->setEnabled(TRUE); | ||
462 | found_one = TRUE; | ||
463 | } | ||
464 | LLSD element; | ||
465 | element["id"] = avatar_id; // value | ||
466 | element["columns"][0]["value"] = avatar_name; | ||
467 | search_results->addElement(element); | ||
468 | } | ||
469 | |||
470 | if (found_one) | ||
471 | { | ||
472 | self->childEnable("Select"); | ||
473 | search_results->selectFirstItem(); | ||
474 | self->onList(search_results, self); | ||
475 | search_results->setFocus(TRUE); | ||
373 | } | 476 | } |
374 | } | 477 | } |
375 | 478 | ||
@@ -377,32 +480,23 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* | |||
377 | void LLFloaterAvatarPicker::editKeystroke(LLLineEditor* caller, void* user_data) | 480 | void LLFloaterAvatarPicker::editKeystroke(LLLineEditor* caller, void* user_data) |
378 | { | 481 | { |
379 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)user_data; | 482 | LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)user_data; |
380 | if (caller->getText().size() >= 3) | 483 | self->childSetEnabled("Find", caller->getText().size() >= 3); |
381 | { | ||
382 | self->childSetEnabled("Find",TRUE); | ||
383 | } | ||
384 | else | ||
385 | { | ||
386 | self->childSetEnabled("Find",FALSE); | ||
387 | } | ||
388 | } | 484 | } |
389 | 485 | ||
390 | // virtual | 486 | // virtual |
391 | BOOL LLFloaterAvatarPicker::handleKeyHere(KEY key, MASK mask) | 487 | BOOL LLFloaterAvatarPicker::handleKeyHere(KEY key, MASK mask) |
392 | { | 488 | { |
393 | if (key == KEY_RETURN | 489 | if (key == KEY_RETURN && mask == MASK_NONE) |
394 | && mask == MASK_NONE) | ||
395 | { | 490 | { |
396 | if (childHasFocus("Edit")) | 491 | if (childHasFocus("Edit")) |
397 | { | 492 | { |
398 | onBtnFind(this); | 493 | onBtnFind(this); |
399 | return TRUE; | ||
400 | } | 494 | } |
401 | else | 495 | else |
402 | { | 496 | { |
403 | onBtnAdd(this); | 497 | onBtnSelect(this); |
404 | return TRUE; | ||
405 | } | 498 | } |
499 | return TRUE; | ||
406 | } | 500 | } |
407 | else if (key == KEY_ESCAPE && mask == MASK_NONE) | 501 | else if (key == KEY_ESCAPE && mask == MASK_NONE) |
408 | { | 502 | { |
diff --git a/linden/indra/newview/llfloateravatarpicker.h b/linden/indra/newview/llfloateravatarpicker.h index 005eff0..1ab0f7c 100644 --- a/linden/indra/newview/llfloateravatarpicker.h +++ b/linden/indra/newview/llfloateravatarpicker.h | |||
@@ -36,14 +36,6 @@ | |||
36 | 36 | ||
37 | #include <vector> | 37 | #include <vector> |
38 | 38 | ||
39 | class LLUICtrl; | ||
40 | class LLTextBox; | ||
41 | class LLLineEditor; | ||
42 | class LLButton; | ||
43 | class LLScrollListCtrl; | ||
44 | class LLMessageSystem; | ||
45 | class LLInventoryPanel; | ||
46 | class LLFolderViewItem; | ||
47 | 39 | ||
48 | class LLFloaterAvatarPicker : public LLFloater | 40 | class LLFloaterAvatarPicker : public LLFloater |
49 | { | 41 | { |
@@ -57,47 +49,47 @@ public: | |||
57 | BOOL closeOnSelect = FALSE); | 49 | BOOL closeOnSelect = FALSE); |
58 | virtual BOOL postBuild(); | 50 | virtual BOOL postBuild(); |
59 | 51 | ||
60 | static void processAvatarPickerReply(LLMessageSystem* msg, void**); | 52 | static void processAvatarPickerReply(class LLMessageSystem* msg, void**); |
61 | static void editKeystroke(LLLineEditor* caller, void* user_data); | ||
62 | 53 | ||
63 | protected: | 54 | private: |
64 | static void* createInventoryPanel(void* userdata); | 55 | |
56 | static void editKeystroke(class LLLineEditor* caller, void* user_data); | ||
65 | 57 | ||
66 | static void onBtnFind(void* userdata); | 58 | static void onBtnFind(void* userdata); |
67 | static void onBtnAdd(void* userdata); | 59 | static void onBtnSelect(void* userdata); |
60 | static void onBtnRefresh(void* userdata); | ||
61 | static void onRangeAdjust(LLUICtrl* source, void* data); | ||
68 | static void onBtnClose(void* userdata); | 62 | static void onBtnClose(void* userdata); |
69 | static void onList(LLUICtrl* ctrl, void* userdata); | 63 | static void onList(class LLUICtrl* ctrl, void* userdata); |
64 | static void onTabChanged(void* userdata, bool from_click); | ||
70 | 65 | ||
71 | void doSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action, void* data); | 66 | void doCallingCardSelectionChange(const std::deque<class LLFolderViewItem*> &items, BOOL user_action, void* data); |
72 | static void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action, void* data); | 67 | static void onCallingCardSelectionChange(const std::deque<class LLFolderViewItem*> &items, BOOL user_action, void* data); |
68 | |||
69 | void populateNearMe(); | ||
70 | BOOL visibleItemsSelected() const; // Returns true if any items in the current tab are selected. | ||
73 | 71 | ||
74 | void find(); | 72 | void find(); |
75 | void setAllowMultiple(BOOL allow_multiple); | 73 | void setAllowMultiple(BOOL allow_multiple); |
76 | 74 | ||
75 | virtual void draw(); | ||
77 | virtual BOOL handleKeyHere(KEY key, MASK mask); | 76 | virtual BOOL handleKeyHere(KEY key, MASK mask); |
78 | 77 | ||
79 | protected: | 78 | std::vector<LLUUID> mSelectedInventoryAvatarIDs; |
80 | LLScrollListCtrl* mListNames; | 79 | std::vector<std::string> mSelectedInventoryAvatarNames; |
81 | LLInventoryPanel* mInventoryPanel; | ||
82 | |||
83 | std::vector<LLUUID> mAvatarIDs; | ||
84 | std::vector<std::string> mAvatarNames; | ||
85 | BOOL mAllowMultiple; | ||
86 | LLUUID mQueryID; | 80 | LLUUID mQueryID; |
87 | BOOL mResultsReturned; | 81 | BOOL mResultsReturned; |
82 | BOOL mNearMeListComplete; | ||
88 | BOOL mCloseOnSelect; | 83 | BOOL mCloseOnSelect; |
89 | 84 | ||
90 | void (*mCallback)(const std::vector<std::string>& name, const std::vector<LLUUID>& id, void* userdata); | 85 | void (*mCallback)(const std::vector<std::string>& name, const std::vector<LLUUID>& id, void* userdata); |
91 | void* mCallbackUserdata; | 86 | void* mCallbackUserdata; |
92 | 87 | ||
93 | protected: | ||
94 | static LLFloaterAvatarPicker* sInstance; | 88 | static LLFloaterAvatarPicker* sInstance; |
95 | 89 | ||
96 | protected: | ||
97 | // do not call these directly | 90 | // do not call these directly |
98 | LLFloaterAvatarPicker(); | 91 | LLFloaterAvatarPicker(); |
99 | virtual ~LLFloaterAvatarPicker(); | 92 | virtual ~LLFloaterAvatarPicker(); |
100 | }; | 93 | }; |
101 | 94 | ||
102 | |||
103 | #endif | 95 | #endif |
diff --git a/linden/indra/newview/llfloatergodtools.cpp b/linden/indra/newview/llfloatergodtools.cpp index 7d54ecf..4b44793 100644 --- a/linden/indra/newview/llfloatergodtools.cpp +++ b/linden/indra/newview/llfloatergodtools.cpp | |||
@@ -1344,8 +1344,8 @@ void LLPanelRequestTools::refresh() | |||
1344 | list->operateOnAll(LLCtrlListInterface::OP_DELETE); | 1344 | list->operateOnAll(LLCtrlListInterface::OP_DELETE); |
1345 | list->addSimpleElement(SELECTION); | 1345 | list->addSimpleElement(SELECTION); |
1346 | list->addSimpleElement(AGENT_REGION); | 1346 | list->addSimpleElement(AGENT_REGION); |
1347 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); | 1347 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
1348 | iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) | 1348 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
1349 | { | 1349 | { |
1350 | LLViewerRegion* regionp = *iter; | 1350 | LLViewerRegion* regionp = *iter; |
1351 | std::string name = regionp->getName(); | 1351 | std::string name = regionp->getName(); |
@@ -1405,8 +1405,8 @@ void LLPanelRequestTools::onClickRequest(void* data) | |||
1405 | else | 1405 | else |
1406 | { | 1406 | { |
1407 | // find region by name | 1407 | // find region by name |
1408 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); | 1408 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
1409 | iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) | 1409 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
1410 | { | 1410 | { |
1411 | LLViewerRegion* regionp = *iter; | 1411 | LLViewerRegion* regionp = *iter; |
1412 | if(dest == regionp->getName()) | 1412 | if(dest == regionp->getName()) |
diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp index 7506004..2b51948 100644 --- a/linden/indra/newview/llglsandbox.cpp +++ b/linden/indra/newview/llglsandbox.cpp | |||
@@ -271,7 +271,7 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask) | |||
271 | { | 271 | { |
272 | std::vector<LLDrawable*> potentials; | 272 | std::vector<LLDrawable*> potentials; |
273 | 273 | ||
274 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 274 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
275 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 275 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
276 | { | 276 | { |
277 | LLViewerRegion* region = *iter; | 277 | LLViewerRegion* region = *iter; |
diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp index 9d92576..cedabf7 100644 --- a/linden/indra/newview/llnetmap.cpp +++ b/linden/indra/newview/llnetmap.cpp | |||
@@ -257,8 +257,8 @@ void LLNetMap::draw() | |||
257 | // figure out where agent is | 257 | // figure out where agent is |
258 | S32 region_width = llround(LLWorld::getInstance()->getRegionWidthInMeters()); | 258 | S32 region_width = llround(LLWorld::getInstance()->getRegionWidthInMeters()); |
259 | 259 | ||
260 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); | 260 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
261 | iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) | 261 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
262 | { | 262 | { |
263 | LLViewerRegion* regionp = *iter; | 263 | LLViewerRegion* regionp = *iter; |
264 | // Find x and y position relative to camera's center. | 264 | // Find x and y position relative to camera's center. |
@@ -374,8 +374,8 @@ void LLNetMap::draw() | |||
374 | LLVector3 pos_map; | 374 | LLVector3 pos_map; |
375 | 375 | ||
376 | // Draw avatars | 376 | // Draw avatars |
377 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); | 377 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
378 | iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) | 378 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
379 | { | 379 | { |
380 | LLViewerRegion* regionp = *iter; | 380 | LLViewerRegion* regionp = *iter; |
381 | const LLVector3d& origin_global = regionp->getOriginGlobal(); | 381 | const LLVector3d& origin_global = regionp->getOriginGlobal(); |
diff --git a/linden/indra/newview/llviewerobjectlist.cpp b/linden/indra/newview/llviewerobjectlist.cpp index 9b85fec..78398bb 100644 --- a/linden/indra/newview/llviewerobjectlist.cpp +++ b/linden/indra/newview/llviewerobjectlist.cpp | |||
@@ -1115,7 +1115,7 @@ void LLViewerObjectList::generatePickList(LLCamera &camera) | |||
1115 | 1115 | ||
1116 | std::vector<LLDrawable*> pick_drawables; | 1116 | std::vector<LLDrawable*> pick_drawables; |
1117 | 1117 | ||
1118 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 1118 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
1119 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 1119 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
1120 | { | 1120 | { |
1121 | LLViewerRegion* region = *iter; | 1121 | LLViewerRegion* region = *iter; |
diff --git a/linden/indra/newview/llworld.cpp b/linden/indra/newview/llworld.cpp index 04f9e25..9ee789a 100644 --- a/linden/indra/newview/llworld.cpp +++ b/linden/indra/newview/llworld.cpp | |||
@@ -951,7 +951,7 @@ void LLWorld::updateWaterObjects() | |||
951 | 951 | ||
952 | void LLWorld::shiftRegions(const LLVector3& offset) | 952 | void LLWorld::shiftRegions(const LLVector3& offset) |
953 | { | 953 | { |
954 | for (region_list_t::iterator i = getRegionList().begin(); i != getRegionList().end(); ++i) | 954 | for (region_list_t::const_iterator i = getRegionList().begin(); i != getRegionList().end(); ++i) |
955 | { | 955 | { |
956 | LLViewerRegion* region = *i; | 956 | LLViewerRegion* region = *i; |
957 | region->updateRenderMatrix(); | 957 | region->updateRenderMatrix(); |
@@ -1137,8 +1137,8 @@ void send_agent_pause() | |||
1137 | gAgentPauseSerialNum++; | 1137 | gAgentPauseSerialNum++; |
1138 | gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum); | 1138 | gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum); |
1139 | 1139 | ||
1140 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); | 1140 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
1141 | iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) | 1141 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
1142 | { | 1142 | { |
1143 | LLViewerRegion* regionp = *iter; | 1143 | LLViewerRegion* regionp = *iter; |
1144 | gMessageSystem->sendReliable(regionp->getHost()); | 1144 | gMessageSystem->sendReliable(regionp->getHost()); |
@@ -1167,8 +1167,8 @@ void send_agent_resume() | |||
1167 | gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum); | 1167 | gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum); |
1168 | 1168 | ||
1169 | 1169 | ||
1170 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->mActiveRegionList.begin(); | 1170 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
1171 | iter != LLWorld::getInstance()->mActiveRegionList.end(); ++iter) | 1171 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
1172 | { | 1172 | { |
1173 | LLViewerRegion* regionp = *iter; | 1173 | LLViewerRegion* regionp = *iter; |
1174 | gMessageSystem->sendReliable(regionp->getHost()); | 1174 | gMessageSystem->sendReliable(regionp->getHost()); |
@@ -1180,6 +1180,62 @@ void send_agent_resume() | |||
1180 | LLAppViewer::instance()->resumeMainloopTimeout(); | 1180 | LLAppViewer::instance()->resumeMainloopTimeout(); |
1181 | } | 1181 | } |
1182 | 1182 | ||
1183 | static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& region_origin) | ||
1184 | { | ||
1185 | LLVector3d pos_global; | ||
1186 | LLVector3 pos_local; | ||
1187 | U8 bits; | ||
1188 | |||
1189 | bits = compact_local & 0xFF; | ||
1190 | pos_local.mV[VZ] = F32(bits) * 4.f; | ||
1191 | compact_local >>= 8; | ||
1192 | |||
1193 | bits = compact_local & 0xFF; | ||
1194 | pos_local.mV[VY] = (F32)bits; | ||
1195 | compact_local >>= 8; | ||
1196 | |||
1197 | bits = compact_local & 0xFF; | ||
1198 | pos_local.mV[VX] = (F32)bits; | ||
1199 | |||
1200 | pos_global.setVec( pos_local ); | ||
1201 | pos_global += region_origin; | ||
1202 | return pos_global; | ||
1203 | } | ||
1204 | |||
1205 | void LLWorld::getAvatars(std::vector<LLUUID>* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const | ||
1206 | { | ||
1207 | if(avatar_ids != NULL) | ||
1208 | { | ||
1209 | avatar_ids->clear(); | ||
1210 | } | ||
1211 | if(positions != NULL) | ||
1212 | { | ||
1213 | positions->clear(); | ||
1214 | } | ||
1215 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); | ||
1216 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | ||
1217 | { | ||
1218 | LLViewerRegion* regionp = *iter; | ||
1219 | const LLVector3d& origin_global = regionp->getOriginGlobal(); | ||
1220 | S32 count = regionp->mMapAvatars.count(); | ||
1221 | for (S32 i = 0; i < count; i++) | ||
1222 | { | ||
1223 | LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global); | ||
1224 | if(dist_vec(pos_global, relative_to) <= radius) | ||
1225 | { | ||
1226 | if(positions != NULL) | ||
1227 | { | ||
1228 | positions->push_back(pos_global); | ||
1229 | } | ||
1230 | if(avatar_ids != NULL) | ||
1231 | { | ||
1232 | avatar_ids->push_back(regionp->mMapAvatarIDs.get(i)); | ||
1233 | } | ||
1234 | } | ||
1235 | } | ||
1236 | } | ||
1237 | } | ||
1238 | |||
1183 | 1239 | ||
1184 | LLHTTPRegistration<LLEstablishAgentCommunication> | 1240 | LLHTTPRegistration<LLEstablishAgentCommunication> |
1185 | gHTTPRegistrationEstablishAgentCommunication( | 1241 | gHTTPRegistrationEstablishAgentCommunication( |
diff --git a/linden/indra/newview/llworld.h b/linden/indra/newview/llworld.h index 7e50bc4..460809a 100644 --- a/linden/indra/newview/llworld.h +++ b/linden/indra/newview/llworld.h | |||
@@ -1,6 +1,11 @@ | |||
1 | /** | 1 | /** |
2 | * @file llworld.h | 2 | * @file llworld.h |
3 | * @brief Initial test structure to organize viewer regions | 3 | * @brief Collection of viewer regions in the vacinity of the user. |
4 | * | ||
5 | * Represents the whole world, so far as 3D functionality is conserned. | ||
6 | * Always contains the region that the user's avatar is in along with | ||
7 | * neighboring regions. As the user crosses region boundaries, new | ||
8 | * regions are added to the world and distant ones are rolled up. | ||
4 | * | 9 | * |
5 | * $LicenseInfo:firstyear=2001&license=viewergpl$ | 10 | * $LicenseInfo:firstyear=2001&license=viewergpl$ |
6 | * | 11 | * |
@@ -146,12 +151,18 @@ public: | |||
146 | 151 | ||
147 | public: | 152 | public: |
148 | typedef std::list<LLViewerRegion*> region_list_t; | 153 | typedef std::list<LLViewerRegion*> region_list_t; |
149 | 154 | const region_list_t& getRegionList() const { return mActiveRegionList; } | |
150 | region_list_t mActiveRegionList; | ||
151 | 155 | ||
152 | region_list_t& getRegionList() { return mActiveRegionList; } | 156 | // Returns lists of avatar IDs and their world-space positions within a given distance of a point. |
157 | // All arguments are optional. Given containers will be emptied and then filled. | ||
158 | // Not supplying origin or radius input returns data on all avatars in the known regions. | ||
159 | void getAvatars( | ||
160 | std::vector<LLUUID>* avatar_ids = NULL, | ||
161 | std::vector<LLVector3d>* positions = NULL, | ||
162 | const LLVector3d& relative_to = LLVector3d(), F32 radius = FLT_MAX) const; | ||
153 | 163 | ||
154 | private: | 164 | private: |
165 | region_list_t mActiveRegionList; | ||
155 | region_list_t mRegionList; | 166 | region_list_t mRegionList; |
156 | region_list_t mVisibleRegionList; | 167 | region_list_t mVisibleRegionList; |
157 | region_list_t mCulledRegionList; | 168 | region_list_t mCulledRegionList; |
diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp index 0406520..87b810c 100644 --- a/linden/indra/newview/pipeline.cpp +++ b/linden/indra/newview/pipeline.cpp | |||
@@ -608,7 +608,7 @@ void LLPipeline::restoreGL() | |||
608 | LLViewerShaderMgr::instance()->setShaders(); | 608 | LLViewerShaderMgr::instance()->setShaders(); |
609 | } | 609 | } |
610 | 610 | ||
611 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 611 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
612 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 612 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
613 | { | 613 | { |
614 | LLViewerRegion* region = *iter; | 614 | LLViewerRegion* region = *iter; |
@@ -758,7 +758,7 @@ void LLPipeline::dirtyPoolObjectTextures(const std::set<LLViewerImage*>& texture | |||
758 | } | 758 | } |
759 | 759 | ||
760 | LLOctreeDirtyTexture dirty(textures); | 760 | LLOctreeDirtyTexture dirty(textures); |
761 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 761 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
762 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 762 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
763 | { | 763 | { |
764 | LLViewerRegion* region = *iter; | 764 | LLViewerRegion* region = *iter; |
@@ -1149,7 +1149,7 @@ void LLPipeline::updateMove() | |||
1149 | { | 1149 | { |
1150 | LLFastTimer ot(LLFastTimer::FTM_OCTREE_BALANCE); | 1150 | LLFastTimer ot(LLFastTimer::FTM_OCTREE_BALANCE); |
1151 | 1151 | ||
1152 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 1152 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
1153 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 1153 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
1154 | { | 1154 | { |
1155 | LLViewerRegion* region = *iter; | 1155 | LLViewerRegion* region = *iter; |
@@ -1226,7 +1226,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl | |||
1226 | gGL.setColorMask(false, false); | 1226 | gGL.setColorMask(false, false); |
1227 | LLGLDepthTest depth(GL_TRUE, GL_FALSE); | 1227 | LLGLDepthTest depth(GL_TRUE, GL_FALSE); |
1228 | 1228 | ||
1229 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 1229 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
1230 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 1230 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
1231 | { | 1231 | { |
1232 | LLViewerRegion* region = *iter; | 1232 | LLViewerRegion* region = *iter; |
@@ -1609,7 +1609,7 @@ void LLPipeline::shiftObjects(const LLVector3 &offset) | |||
1609 | } | 1609 | } |
1610 | mShiftList.resize(0); | 1610 | mShiftList.resize(0); |
1611 | 1611 | ||
1612 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 1612 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
1613 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 1613 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
1614 | { | 1614 | { |
1615 | LLViewerRegion* region = *iter; | 1615 | LLViewerRegion* region = *iter; |
@@ -2591,7 +2591,7 @@ void LLPipeline::renderDebug() | |||
2591 | gGL.setColorMask(true, false); | 2591 | gGL.setColorMask(true, false); |
2592 | 2592 | ||
2593 | // Debug stuff. | 2593 | // Debug stuff. |
2594 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 2594 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
2595 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 2595 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
2596 | { | 2596 | { |
2597 | LLViewerRegion* region = *iter; | 2597 | LLViewerRegion* region = *iter; |
@@ -4037,7 +4037,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start, | |||
4037 | 4037 | ||
4038 | sPickAvatar = FALSE; //LLToolMgr::getInstance()->inBuildMode() ? FALSE : TRUE; | 4038 | sPickAvatar = FALSE; //LLToolMgr::getInstance()->inBuildMode() ? FALSE : TRUE; |
4039 | 4039 | ||
4040 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 4040 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
4041 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 4041 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
4042 | { | 4042 | { |
4043 | LLViewerRegion* region = *iter; | 4043 | LLViewerRegion* region = *iter; |
@@ -4094,7 +4094,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start, | |||
4094 | 4094 | ||
4095 | //check against avatars | 4095 | //check against avatars |
4096 | sPickAvatar = TRUE; | 4096 | sPickAvatar = TRUE; |
4097 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 4097 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
4098 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 4098 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
4099 | { | 4099 | { |
4100 | LLViewerRegion* region = *iter; | 4100 | LLViewerRegion* region = *iter; |
@@ -4171,7 +4171,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector3& start, co | |||
4171 | { | 4171 | { |
4172 | LLDrawable* drawable = NULL; | 4172 | LLDrawable* drawable = NULL; |
4173 | 4173 | ||
4174 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 4174 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
4175 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 4175 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
4176 | { | 4176 | { |
4177 | LLViewerRegion* region = *iter; | 4177 | LLViewerRegion* region = *iter; |
@@ -4234,7 +4234,7 @@ void LLPipeline::resetVertexBuffers() | |||
4234 | { | 4234 | { |
4235 | sRenderBump = gSavedSettings.getBOOL("RenderObjectBump"); | 4235 | sRenderBump = gSavedSettings.getBOOL("RenderObjectBump"); |
4236 | 4236 | ||
4237 | for (LLWorld::region_list_t::iterator iter = LLWorld::getInstance()->getRegionList().begin(); | 4237 | for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); |
4238 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) | 4238 | iter != LLWorld::getInstance()->getRegionList().end(); ++iter) |
4239 | { | 4239 | { |
4240 | LLViewerRegion* region = *iter; | 4240 | LLViewerRegion* region = *iter; |
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml b/linden/indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml index 8e3f822..49b7cb5 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_avatar_picker.xml | |||
@@ -1,42 +1,96 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <floater bottom="-380" can_close="true" can_drag_on_left="false" can_minimize="true" | 2 | <floater bottom="-380" can_close="true" can_drag_on_left="false" can_minimize="true" |
3 | can_resize="true" height="380" left="400" min_height="340" min_width="200" | 3 | can_resize="true" height="350" left="400" min_height="200" min_width="250" |
4 | mouse_opaque="true" name="avatarpicker" title="Choose Resident" width="240"> | 4 | mouse_opaque="true" name="avatarpicker" title="Choose Resident" width="250"> |
5 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | 5 | |
6 | bottom="-40" drop_shadow_visible="true" follows="left|top" | 6 | <tab_container bottom="30" follows="left|right|top|bottom" height="300" left="4" |
7 | font="SansSerifSmall" h_pad="0" halign="left" height="16" left="12" | 7 | name="ResidentChooserTabs" tab_position="top" tab_width="65" width="240"> |
8 | mouse_opaque="true" name="instruct_search_resident_name" v_pad="0" | 8 | <panel name="SearchPanel" label="Search" |
9 | width="220"> | 9 | border="true" bottom="0" height="150" left="6" width="120" |
10 | Type part of the resident's name: | 10 | mouse_opaque="true"> |
11 | </text> | 11 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" |
12 | <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-16" | 12 | bottom="-24" drop_shadow_visible="true" follows="left|top" |
13 | follows="left|top|right" font="SansSerifSmall" height="16" left="12" | 13 | font="SansSerifSmall" h_pad="0" halign="left" height="16" left="10" |
14 | max_length="254" mouse_opaque="true" name="Edit" select_on_focus="false" | 14 | mouse_opaque="true" name="InstructSearchResidentName" v_pad="0" |
15 | width="132" /> | 15 | width="220"> |
16 | <button bottom_delta="-3" follows="top|right" font="SansSerif" halign="center" | 16 | Type part of the resident's name: |
17 | height="20" label="Find" label_selected="Find" left_delta="140" | 17 | </text> |
18 | mouse_opaque="true" name="Find" scale_image="TRUE" width="80" /> | 18 | <line_editor bevel_style="in" border_style="line" |
19 | <scroll_list background_visible="true" bottom_delta="-164" column_padding="5" | 19 | border_thickness="1" bottom_delta="-20" enabled="true" follows="left|top|right" |
20 | draw_border="true" draw_heading="false" draw_stripes="true" | 20 | font="SansSerifSmall" height="16" left="10" right="-120" |
21 | follows="left|top|right" height="156" left="12" mouse_opaque="true" | 21 | max_length="254" mouse_opaque="true" name="Edit" |
22 | multi_select="false" name="Names" width="220" /> | 22 | width="132" /> |
23 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | 23 | <button bottom_delta="-3" follows="top|right" font="SansSerif" halign="center" |
24 | bottom_delta="-24" drop_shadow_visible="true" follows="left|top" | 24 | height="20" label="Find" label_selected="Find" left_delta="20" right="-10" |
25 | font="SansSerifSmall" h_pad="0" halign="left" height="16" left="12" | 25 | mouse_opaque="true" name="Find" scale_image="TRUE" width="80" /> |
26 | mouse_opaque="true" name="Or select their calling card:" v_pad="0" | 26 | <scroll_list background_visible="true" bottom_delta="-95" column_padding="5" |
27 | width="220"> | 27 | draw_border="true" draw_heading="false" draw_stripes="true" |
28 | Or select a calling card: | 28 | follows="left|top|right|bottom" height="90" left="10" mouse_opaque="true" |
29 | </text> | 29 | multi_select="false" name="SearchResults" width="100" /> |
30 | <inventory_panel allow_multi_select="false" border="true" bottom_delta="-100" | 30 | </panel> |
31 | follows="left|top|right|bottom" height="100" left="12" mouse_opaque="true" | 31 | |
32 | name="Inventory Panel" sort_order="AvatarPickerSortOrder" width="220" /> | 32 | <panel name="CallingCardsPanel" label="Calling Cards" |
33 | <button bottom_delta="-28" follows="left|bottom" font="SansSerif" halign="center" | 33 | border="true" bottom="0" height="150" left="0" width="120" |
34 | height="20" label="Close" label_selected="Close" mouse_opaque="true" | 34 | mouse_opaque="true"> |
35 | name="Close" right="230" scale_image="TRUE" width="105" /> | 35 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" |
36 | <button bottom_delta="0" follows="left|bottom" font="SansSerif" halign="center" | 36 | bottom="-24" drop_shadow_visible="true" follows="left|top" |
37 | height="20" label="Select" label_selected="Select" mouse_opaque="true" | 37 | font="SansSerifSmall" h_pad="0" halign="left" height="16" left="10" |
38 | name="Select" right="119" scale_image="TRUE" width="105" /> | 38 | mouse_opaque="true" name="InstructSelectCallingCard" v_pad="0" |
39 | <string name="NotFound"> | 39 | width="220"> |
40 | Select a calling card: | ||
41 | </text> | ||
42 | <inventory_panel allow_multi_select="false" border="true" bottom_delta="-117" | ||
43 | follows="left|top|right|bottom" height="110" left="10" mouse_opaque="true" | ||
44 | name="InventoryPanel" sort_order="AvatarPickerSortOrder" width="100" /> | ||
45 | </panel> | ||
46 | |||
47 | <panel name="NearMePanel" label="Near Me" | ||
48 | border="true" bottom="0" height="240" left="6" width="120" mouse_opaque="true"> | ||
49 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | ||
50 | bottom="-24" drop_shadow_visible="true" follows="left|top" | ||
51 | font="SansSerifSmall" h_pad="0" halign="left" height="16" left="10" | ||
52 | mouse_opaque="true" name="InstructSelectResident" v_pad="0" | ||
53 | width="220"> | ||
54 | Select nearby resident: | ||
55 | </text> | ||
56 | <button bottom_delta="-3" left_delta="10" width="90" height="20" follows="top|right" | ||
57 | label="Refresh List" label_selected="Refresh List" halign="center" | ||
58 | font="SansSerif" mouse_opaque="true" name="Refresh" scale_image="TRUE" /> | ||
59 | <slider bottom_delta="-20" left="10" follows="left|top" width="175" height="15" | ||
60 | name="near_me_range" label="Range" control_name="NearMeRange" | ||
61 | min_val="5" max_val="40" increment="1" initial_val="20" decimal_digits="0" /> | ||
62 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | ||
63 | bottom_delta="0" left="185" drop_shadow_visible="true" follows="left|top" | ||
64 | font="SansSerifSmall" h_pad="0" halign="left" height="15" | ||
65 | mouse_opaque="true" name="meters" v_pad="0" | ||
66 | width="40"> | ||
67 | Meters | ||
68 | </text> | ||
69 | <scroll_list bottom_delta="-185" width="100" height="175" left="10" | ||
70 | follows="left|top|right|bottom" draw_border="true" draw_heading="false" | ||
71 | draw_stripes="true" column_padding="5" sort_column="0" mouse_opaque="true" | ||
72 | background_visible="true" multi_select="false" name="NearMe" /> | ||
73 | </panel> | ||
74 | |||
75 | </tab_container> | ||
76 | |||
77 | <button bottom="6" left="10" follows="left|bottom" font="SansSerif" halign="center" | ||
78 | width="75" height="20" label="Select" label_selected="Select" mouse_opaque="true" | ||
79 | name="Select" scale_image="TRUE" /> | ||
80 | <button bottom_delta="0" right="230" follows="left|bottom" font="SansSerif" halign="center" | ||
81 | width="75" height="20" label="Cancel" label_selected="Cancel" mouse_opaque="true" | ||
82 | name="Cancel" scale_image="TRUE" /> | ||
83 | |||
84 | <string name="not_found"> | ||
40 | '[TEXT]' not found | 85 | '[TEXT]' not found |
41 | </string> | 86 | </string> |
87 | <string name="no_one_near"> | ||
88 | No-one near | ||
89 | </string> | ||
90 | <string name="no_results"> | ||
91 | No results | ||
92 | </string> | ||
93 | <string name="searching"> | ||
94 | Searching... | ||
95 | </string> | ||
42 | </floater> | 96 | </floater> |