diff options
-rw-r--r-- | ChangeLog.txt | 232 | ||||
-rw-r--r-- | linden/indra/llinventory/llinventory.cpp | 138 | ||||
-rw-r--r-- | linden/indra/llinventory/llinventory.h | 12 | ||||
-rw-r--r-- | linden/indra/llinventory/llinventorytype.h | 86 | ||||
-rw-r--r-- | linden/indra/llinventory/llwearabletype.h | 54 | ||||
-rw-r--r-- | linden/indra/llui/llcombobox.cpp | 5 | ||||
-rw-r--r-- | linden/indra/newview/llfolderview.cpp | 45 | ||||
-rw-r--r-- | linden/indra/newview/llfolderview.h | 4 | ||||
-rw-r--r-- | linden/indra/newview/llinventorybridge.cpp | 1 | ||||
-rw-r--r-- | linden/indra/newview/llinventorybridge.h | 11 | ||||
-rw-r--r-- | linden/indra/newview/llinventoryview.cpp | 520 | ||||
-rw-r--r-- | linden/indra/newview/llinventoryview.h | 7 | ||||
-rw-r--r-- | linden/indra/newview/llpanelinventory.cpp | 1 | ||||
-rw-r--r-- | linden/indra/newview/llselectmgr.cpp | 4 | ||||
-rw-r--r-- | linden/indra/newview/llwearable.h | 20 | ||||
-rw-r--r-- | linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml | 56 | ||||
-rw-r--r-- | linden/indra/newview/skins/default/xui/en-us/floater_inventory_view_finder.xml | 227 | ||||
-rw-r--r-- | linden/install.xml | 7 |
18 files changed, 1151 insertions, 279 deletions
diff --git a/ChangeLog.txt b/ChangeLog.txt index 6879450..7f91f38 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt | |||
@@ -1,3 +1,13 @@ | |||
1 | =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | ||
2 | =- 1.1.0 -= | ||
3 | =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | ||
4 | |||
5 | 2009-01-13 McCabe Maxsted <hakushakukun@gmail.com> | ||
6 | |||
7 | * linden/install.xml | ||
8 | Removed bad Windows Glib package. | ||
9 | |||
10 | |||
1 | 2009-01-12 McCabe Maxsted <hakushakukun@gmail.com> | 11 | 2009-01-12 McCabe Maxsted <hakushakukun@gmail.com> |
2 | 12 | ||
3 | * linden/indra/llcommon/llversionviewer.h | 13 | * linden/indra/llcommon/llversionviewer.h |
@@ -37,21 +47,7 @@ | |||
37 | Tweaked the layout a bit. | 47 | Tweaked the layout a bit. |
38 | 48 | ||
39 | 49 | ||
40 | 2009-01-11 Jacek Antonelli <jacek.antonelli@gmail.com> | 50 | 2009-01-11 McCabe Maxsted <hakushakukun@gmail.com> |
41 | |||
42 | * linden/indra/cmake/GStreamer.cmake: | ||
43 | Added more gstreamer include paths. | ||
44 | * linden/install.xml: | ||
45 | Added glib package to install.xml. | ||
46 | * linden/indra/newview/CMakeLists.txt: | ||
47 | Use BOOST_SIGNALS_LIB in newview/CMakeLists. | ||
48 | * cmake/DBusGlib.cmake: | ||
49 | Removed references to unused dbusglib. | ||
50 | * newview/CMakeLists.txt: | ||
51 | Ditto. | ||
52 | |||
53 | |||
54 | McCabe Maxsted <hakushakukun@gmail.com> | ||
55 | 51 | ||
56 | * linden/indra/newview/llvieweraudio.cpp: | 52 | * linden/indra/newview/llvieweraudio.cpp: |
57 | Wind disabled by default, ambient wind muting fixed, added debug setting 'MuteAudio'. | 53 | Wind disabled by default, ambient wind muting fixed, added debug setting 'MuteAudio'. |
@@ -85,6 +81,20 @@ | |||
85 | * linden/indra/newview/llpanelobject.cpp: | 81 | * linden/indra/newview/llpanelobject.cpp: |
86 | Ditto. | 82 | Ditto. |
87 | * linden/indra/newview/skins/default/xui/en-us/floater_tools.xml: | 83 | * linden/indra/newview/skins/default/xui/en-us/floater_tools.xml: |
84 | Ditto. | ||
85 | |||
86 | |||
87 | Jacek Antonelli <jacek.antonelli@gmail.com> | ||
88 | |||
89 | * linden/indra/cmake/GStreamer.cmake: | ||
90 | Added more gstreamer include paths. | ||
91 | * linden/install.xml: | ||
92 | Added glib package to install.xml. | ||
93 | * linden/indra/newview/CMakeLists.txt: | ||
94 | Use BOOST_SIGNALS_LIB in newview/CMakeLists. | ||
95 | * cmake/DBusGlib.cmake: | ||
96 | Removed references to unused dbusglib. | ||
97 | * newview/CMakeLists.txt: | ||
88 | 98 | ||
89 | 99 | ||
90 | 2009-01-10 Armin <email@unknown.com> | 100 | 2009-01-10 Armin <email@unknown.com> |
@@ -273,6 +283,13 @@ | |||
273 | Moved "Disable Camera Constraints" to Preferences > Input/Camera. | 283 | Moved "Disable Camera Constraints" to Preferences > Input/Camera. |
274 | 284 | ||
275 | 285 | ||
286 | Jacek Antonelli <jacek.antonelli@gmail.com> | ||
287 | |||
288 | * linden/indra/newview/llselectmgr.cpp: | ||
289 | VWR-1582: Local ruler mode wrong for linked objects. | ||
290 | Also VWR-11103 (regression of above). | ||
291 | |||
292 | |||
276 | 2008-12-15 Jacek Antonelli <jacek.antonelli@gmail.com> | 293 | 2008-12-15 Jacek Antonelli <jacek.antonelli@gmail.com> |
277 | 294 | ||
278 | * linden/install.xml: | 295 | * linden/install.xml: |
@@ -312,6 +329,100 @@ | |||
312 | Backported from LL's 1.22 RC3. | 329 | Backported from LL's 1.22 RC3. |
313 | 330 | ||
314 | 331 | ||
332 | 2008-12-10 Jacek Antonelli <jacek.antonelli@gmail.com> | ||
333 | |||
334 | * linden/indra/newview/llinventoryview.cpp: | ||
335 | Use NType to find inventory icon name. | ||
336 | * linden/indra/newview/llinventoryview.h: | ||
337 | Ditto. | ||
338 | |||
339 | * linden/indra/newview/llinventoryview.cpp: | ||
340 | Clearing search shouldn't clear filter type. | ||
341 | |||
342 | |||
343 | 2008-12-09 Jacek Antonelli <jacek.antonelli@gmail.com> | ||
344 | |||
345 | * linden/indra/newview/llinventoryview.cpp: | ||
346 | Start fetching inventory when quick filter changes. | ||
347 | |||
348 | * linden/indra/newview/llinventoryview.cpp: | ||
349 | Refresh filter text when quick filter changes. | ||
350 | |||
351 | * linden/indra/newview/llfolderview.cpp: | ||
352 | Refactored; added LLInventoryFilter::rebuildFilterText(). | ||
353 | * linden/indra/newview/llfolderview.h: | ||
354 | Ditto. | ||
355 | |||
356 | * linden/indra/newview/llfolderview.cpp: | ||
357 | Updated Inventory window filter text generation. | ||
358 | It was putting the wrong types in the title when | ||
359 | filtering. [#25] | ||
360 | |||
361 | |||
362 | 2008-12-08 Jacek Antonelli <jacek.antonelli@gmail.com> | ||
363 | |||
364 | * linden/indra/newview/llinventoryview.cpp: | ||
365 | Hooked up Body Parts quickfilter and checkbox. | ||
366 | |||
367 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml: | ||
368 | Added Quick Filter item for Body Parts. | ||
369 | |||
370 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory_view_finder.xml: | ||
371 | Added Show Filters checkbox for Body Parts. | ||
372 | |||
373 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory_view_finder.xml: | ||
374 | Converted Show Filters window to relative positioning. | ||
375 | |||
376 | * linden/indra/newview/llfolderview.cpp: | ||
377 | Inventory filtering is now done by NType. | ||
378 | |||
379 | * linden/indra/newview/llinventorybridge.cpp: | ||
380 | LLInvFVBridge and derived classes have NTypes. | ||
381 | * linden/indra/newview/llinventorybridge.h: | ||
382 | Ditto. | ||
383 | * linden/indra/newview/llpanelinventory.cpp: | ||
384 | Ditto. | ||
385 | |||
386 | * linden/indra/newview/llfolderview.h: | ||
387 | Added LLFolderViewEventListener::getNInventoryType() | ||
388 | Pure virtual method, overridden in derived classes. | ||
389 | |||
390 | * linden/indra/newview/llinventoryview.cpp: | ||
391 | LLInventoryView uses new inventory type. | ||
392 | |||
393 | * linden/indra/llinventory/llinventory.cpp: | ||
394 | Recalculate ntype when changing type or flags. | ||
395 | |||
396 | * linden/indra/llinventory/llinventory.cpp: | ||
397 | Added LLInventoryItem::recalcNInventoryType(). | ||
398 | * linden/indra/llinventory/llinventory.h: | ||
399 | Ditto. | ||
400 | |||
401 | * linden/indra/llinventory/llinventory.cpp: | ||
402 | Added calc_ntype() function. | ||
403 | * linden/indra/llinventory/llinventory.h: | ||
404 | Ditto. | ||
405 | |||
406 | * linden/indra/llinventory/llwearabletype.h: | ||
407 | Moved enum EWearableType to its own file. | ||
408 | Was in newview/llwearable.h, now in llinventory/llwearabletype.h. | ||
409 | This allows it to be used in llinventory code. | ||
410 | * linden/indra/newview/llwearable.h: | ||
411 | Ditto. | ||
412 | |||
413 | |||
414 | 2008-12-07 Jacek Antonelli <jacek.antonelli@gmail.com> | ||
415 | |||
416 | * linden/indra/llinventory/llinventory.cpp: | ||
417 | Added LLInventoryItem::mNInventoryType (new type) field. | ||
418 | Will always by NIT_NONE so far. | ||
419 | * linden/indra/llinventory/llinventory.h: | ||
420 | Ditto. | ||
421 | |||
422 | * linden/indra/llinventory/llinventorytype.h: | ||
423 | New bitfield enumerator for inventory types. | ||
424 | |||
425 | |||
315 | 2008-12-05 McCabe Maxsted <hakushakukun@gmail.com> | 426 | 2008-12-05 McCabe Maxsted <hakushakukun@gmail.com> |
316 | 427 | ||
317 | * linden/indra/newview/llappviewer.cpp: | 428 | * linden/indra/newview/llappviewer.cpp: |
@@ -343,7 +454,6 @@ | |||
343 | * linden/indra/newview/skins/default/xui/en-us/notify.xml: | 454 | * linden/indra/newview/skins/default/xui/en-us/notify.xml: |
344 | VWR-4826 (ability to ignore friendship offers). | 455 | VWR-4826 (ability to ignore friendship offers). |
345 | 456 | ||
346 | |||
347 | * linden/indra/newview/app_settings/settings.xml: | 457 | * linden/indra/newview/app_settings/settings.xml: |
348 | Beacons no longer persist between sessions. | 458 | Beacons no longer persist between sessions. |
349 | That distressed users who accidentally enabled them, | 459 | That distressed users who accidentally enabled them, |
@@ -355,15 +465,70 @@ | |||
355 | * linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml: | 465 | * linden/indra/newview/skins/default/xui/en-us/menu_viewer.xml: |
356 | Ditto. | 466 | Ditto. |
357 | 467 | ||
358 | |||
359 | * linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml: | 468 | * linden/indra/newview/skins/default/xui/en-us/floater_instant_message.xml: |
360 | Moved 'Offer Teleport' in IM to be on the left side. | 469 | Moved 'Offer Teleport' in IM to be on the left side. |
361 | 470 | ||
362 | |||
363 | * linden/indra/newview/skins/default/xui/en-us/panel_groups.xml: | 471 | * linden/indra/newview/skins/default/xui/en-us/panel_groups.xml: |
364 | Switched Invite and Leave buttons in group panel. | 472 | Switched Invite and Leave buttons in group panel. |
365 | 473 | ||
366 | 474 | ||
475 | Jacek Antonelli <jacek.antonelli@gmail.com> | ||
476 | |||
477 | * linden/indra/newview/llinventoryview.cpp: | ||
478 | Read filter labels from LLTrans, no hard-coding. | ||
479 | |||
480 | * linden/indra/newview/skins/default/xui/en-us/strings.xml: | ||
481 | Defined strings for filter types (to allow translation). | ||
482 | |||
483 | |||
484 | 2008-11-22 Jacek Antonelli <jacek.antonelli@gmail.com> | ||
485 | |||
486 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory_view_finder.xml: | ||
487 | Cleaned up Show Filters floater XML. | ||
488 | |||
489 | |||
490 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml: | ||
491 | Added separators to Quick Filter. | ||
492 | |||
493 | |||
494 | * linden/indra/llui/llcombobox.cpp: | ||
495 | Combobox widget now supports separators in XUI. | ||
496 | |||
497 | |||
498 | * linden/indra/newview/llinventoryview.cpp: | ||
499 | Renamed "Clothing" filter to "Clothing / Body Parts". | ||
500 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml: | ||
501 | Ditto. | ||
502 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory_view_finder.xml: | ||
503 | Ditto. | ||
504 | |||
505 | |||
506 | * linden/indra/newview/llinventoryview.cpp: | ||
507 | Renamed "Show All Items" filter to "All Types". | ||
508 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml: | ||
509 | Ditto. | ||
510 | |||
511 | |||
512 | * linden/indra/newview/llinventoryview.cpp: | ||
513 | Renamed "Show All Items" to "All Types". | ||
514 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml: | ||
515 | Ditto. | ||
516 | |||
517 | |||
518 | * linden/indra/newview/llinventoryview.cpp: | ||
519 | Bogus quick filter strings should be ignored. | ||
520 | |||
521 | |||
522 | * linden/indra/newview/llinventoryview.cpp: | ||
523 | Disabled testing output when changing quick filter. | ||
524 | |||
525 | |||
526 | * linden/indra/newview/llinventoryview.cpp: | ||
527 | Quick Filter combo box refreshes properly. | ||
528 | * linden/indra/newview/llinventoryview.h: | ||
529 | Ditto. | ||
530 | |||
531 | |||
367 | 2008-11-22 McCabe Maxsted <hakushakukun@gmail.com> | 532 | 2008-11-22 McCabe Maxsted <hakushakukun@gmail.com> |
368 | 533 | ||
369 | * linden\indra\newview\skins\default\colors_base.xml: | 534 | * linden\indra\newview\skins\default\colors_base.xml: |
@@ -398,6 +563,37 @@ | |||
398 | Friends show yellow in minimap (VWR-3336). | 563 | Friends show yellow in minimap (VWR-3336). |
399 | 564 | ||
400 | 565 | ||
566 | 2008-11-11 Jacek Antonelli <jacek.antonelli@gmail.com> | ||
567 | |||
568 | * linden/indra/newview/llinventoryview.cpp: | ||
569 | Show Filters window refreshes properly. | ||
570 | |||
571 | |||
572 | 2008-11-08 Jacek Antonelli <jacek.antonelli@gmail.com> | ||
573 | |||
574 | * linden/indra/newview/llinventoryview.cpp: | ||
575 | Added 'Custom' filter option (opens filters window). | ||
576 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml: | ||
577 | Ditto. | ||
578 | |||
579 | |||
580 | * linden/indra/newview/llinventoryview.cpp: | ||
581 | Quick Filter works, but is a bit rough. | ||
582 | It doesn't refresh its display when you change tabs, | ||
583 | and the Show Filters window doesn't refresh either. | ||
584 | |||
585 | |||
586 | * linden/indra/newview/llinventoryview.cpp: | ||
587 | Added commit callback for Quick Filter. | ||
588 | * linden/indra/newview/llinventoryview.h: | ||
589 | Ditto. | ||
590 | |||
591 | |||
592 | * linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml: | ||
593 | Added XUI for the Quick Filter combo box. | ||
594 | |||
595 | |||
596 | |||
401 | 2008-10-18 McCabe Maxsted <hakushakukun@gmail.com> | 597 | 2008-10-18 McCabe Maxsted <hakushakukun@gmail.com> |
402 | 598 | ||
403 | * linden\indra\newview\skins\default\xui\en-us\menu_viewer.xml: | 599 | * linden\indra\newview\skins\default\xui\en-us\menu_viewer.xml: |
diff --git a/linden/indra/llinventory/llinventory.cpp b/linden/indra/llinventory/llinventory.cpp index 0c7e0ed..e492889 100644 --- a/linden/indra/llinventory/llinventory.cpp +++ b/linden/indra/llinventory/llinventory.cpp | |||
@@ -73,6 +73,116 @@ const U8 TASK_INVENTORY_ASSET_KEY = 1; | |||
73 | const LLUUID MAGIC_ID("3c115e51-04f4-523c-9fa6-98aff1034730"); | 73 | const LLUUID MAGIC_ID("3c115e51-04f4-523c-9fa6-98aff1034730"); |
74 | 74 | ||
75 | 75 | ||
76 | /** | ||
77 | * @brief Return the equivalent new inventory type. | ||
78 | * | ||
79 | * Takes an inventory type, asset type, and inventory flags, | ||
80 | * and returns the equivalent LLInventory::NType. | ||
81 | * | ||
82 | * For example, an inventory type of IT_WEARABLE, asset type | ||
83 | * of AT_BODYPART, and flags indicated WT_SHAPE, would be | ||
84 | * converted to NIT_SHAPE. | ||
85 | * | ||
86 | * Returns the most specific type that can be determined, | ||
87 | * or NIT_NONE if no type could be determined. | ||
88 | * | ||
89 | */ | ||
90 | LLInventoryType::NType calc_ntype( | ||
91 | LLInventoryType::EType inv_type, | ||
92 | LLAssetType::EType asset_type, | ||
93 | U32 flags ) | ||
94 | { | ||
95 | switch( inv_type ) | ||
96 | { | ||
97 | |||
98 | // WEARABLES | ||
99 | case LLInventoryType::IT_WEARABLE: | ||
100 | { | ||
101 | switch( asset_type ) | ||
102 | { | ||
103 | // BODY PARTS | ||
104 | case LLAssetType::AT_BODYPART: | ||
105 | { | ||
106 | switch( flags & LLInventoryItem::II_FLAGS_WEARABLES_MASK ) | ||
107 | { | ||
108 | case WT_SHAPE: return LLInventoryType::NIT_SHAPE; | ||
109 | case WT_SKIN: return LLInventoryType::NIT_SKIN; | ||
110 | case WT_HAIR: return LLInventoryType::NIT_HAIR; | ||
111 | case WT_EYES: return LLInventoryType::NIT_EYES; | ||
112 | default: return LLInventoryType::NIT_BODYPART; | ||
113 | } | ||
114 | } | ||
115 | |||
116 | // CLOTHING | ||
117 | case LLAssetType::AT_CLOTHING: | ||
118 | { | ||
119 | switch( flags & LLInventoryItem::II_FLAGS_WEARABLES_MASK ) | ||
120 | { | ||
121 | case WT_SHIRT: return LLInventoryType::NIT_SHIRT; | ||
122 | case WT_PANTS: return LLInventoryType::NIT_PANTS; | ||
123 | case WT_SHOES: return LLInventoryType::NIT_SHOES; | ||
124 | case WT_SOCKS: return LLInventoryType::NIT_SOCKS; | ||
125 | case WT_JACKET: return LLInventoryType::NIT_JACKET; | ||
126 | case WT_GLOVES: return LLInventoryType::NIT_GLOVES; | ||
127 | case WT_UNDERSHIRT: return LLInventoryType::NIT_UNDERSHIRT; | ||
128 | case WT_UNDERPANTS: return LLInventoryType::NIT_UNDERPANTS; | ||
129 | case WT_SKIRT: return LLInventoryType::NIT_SKIRT; | ||
130 | default: return LLInventoryType::NIT_CLOTHING; | ||
131 | } | ||
132 | } | ||
133 | default: | ||
134 | return LLInventoryType::NIT_WEARABLE; | ||
135 | } | ||
136 | } | ||
137 | |||
138 | // TEXTURES | ||
139 | case LLInventoryType::IT_TEXTURE: | ||
140 | return LLInventoryType::NIT_TEXTURE; | ||
141 | |||
142 | // SNAPSHOTS | ||
143 | case LLInventoryType::IT_SNAPSHOT: | ||
144 | return LLInventoryType::NIT_SNAPSHOT; | ||
145 | |||
146 | // CALLING CARDS | ||
147 | case LLInventoryType::IT_CALLINGCARD: | ||
148 | return LLInventoryType::NIT_CALLCARD; | ||
149 | |||
150 | // LANDMARKS | ||
151 | case LLInventoryType::IT_LANDMARK: | ||
152 | return LLInventoryType::NIT_LANDMARK; | ||
153 | |||
154 | // SOUNDS | ||
155 | case LLInventoryType::IT_SOUND: | ||
156 | return LLInventoryType::NIT_SOUND; | ||
157 | |||
158 | // ANIMATIONS | ||
159 | case LLInventoryType::IT_ANIMATION: | ||
160 | return LLInventoryType::NIT_ANIMATION; | ||
161 | |||
162 | // GESTURES | ||
163 | case LLInventoryType::IT_GESTURE: | ||
164 | return LLInventoryType::NIT_GESTURE; | ||
165 | |||
166 | // NOTECARDS | ||
167 | case LLInventoryType::IT_NOTECARD: | ||
168 | return LLInventoryType::NIT_NOTECARD; | ||
169 | |||
170 | // SCRIPTS | ||
171 | case LLInventoryType::IT_LSL: | ||
172 | return LLInventoryType::NIT_SCRIPT_LSL2; | ||
173 | |||
174 | // OBJECTS | ||
175 | case LLInventoryType::IT_OBJECT: | ||
176 | case LLInventoryType::IT_ATTACHMENT: | ||
177 | return LLInventoryType::NIT_OBJECT; | ||
178 | |||
179 | // UNKNOWN TYPE! | ||
180 | default: | ||
181 | return LLInventoryType::NIT_NONE; | ||
182 | } | ||
183 | } | ||
184 | |||
185 | |||
76 | ///---------------------------------------------------------------------------- | 186 | ///---------------------------------------------------------------------------- |
77 | /// Class LLInventoryObject | 187 | /// Class LLInventoryObject |
78 | ///---------------------------------------------------------------------------- | 188 | ///---------------------------------------------------------------------------- |
@@ -290,11 +400,13 @@ LLInventoryItem::LLInventoryItem( | |||
290 | mDescription(desc), | 400 | mDescription(desc), |
291 | mSaleInfo(sale_info), | 401 | mSaleInfo(sale_info), |
292 | mInventoryType(inv_type), | 402 | mInventoryType(inv_type), |
403 | mNInventoryType(LLInventoryType::NIT_NONE), | ||
293 | mFlags(flags), | 404 | mFlags(flags), |
294 | mCreationDate(creation_date_utc) | 405 | mCreationDate(creation_date_utc) |
295 | { | 406 | { |
296 | LLStringUtil::replaceNonstandardASCII(mDescription, ' '); | 407 | LLStringUtil::replaceNonstandardASCII(mDescription, ' '); |
297 | LLStringUtil::replaceChar(mDescription, '|', ' '); | 408 | LLStringUtil::replaceChar(mDescription, '|', ' '); |
409 | recalcNInventoryType(); | ||
298 | } | 410 | } |
299 | 411 | ||
300 | LLInventoryItem::LLInventoryItem() : | 412 | LLInventoryItem::LLInventoryItem() : |
@@ -304,6 +416,7 @@ LLInventoryItem::LLInventoryItem() : | |||
304 | mDescription(), | 416 | mDescription(), |
305 | mSaleInfo(), | 417 | mSaleInfo(), |
306 | mInventoryType(LLInventoryType::IT_NONE), | 418 | mInventoryType(LLInventoryType::IT_NONE), |
419 | mNInventoryType(LLInventoryType::NIT_NONE), | ||
307 | mFlags(0), | 420 | mFlags(0), |
308 | mCreationDate(0) | 421 | mCreationDate(0) |
309 | { | 422 | { |
@@ -328,6 +441,7 @@ void LLInventoryItem::copyItem(const LLInventoryItem* other) | |||
328 | mDescription = other->mDescription; | 441 | mDescription = other->mDescription; |
329 | mSaleInfo = other->mSaleInfo; | 442 | mSaleInfo = other->mSaleInfo; |
330 | mInventoryType = other->mInventoryType; | 443 | mInventoryType = other->mInventoryType; |
444 | mNInventoryType = other->mNInventoryType; | ||
331 | mFlags = other->mFlags; | 445 | mFlags = other->mFlags; |
332 | mCreationDate = other->mCreationDate; | 446 | mCreationDate = other->mCreationDate; |
333 | } | 447 | } |
@@ -399,6 +513,12 @@ U32 LLInventoryItem::getCRC32() const | |||
399 | } | 513 | } |
400 | 514 | ||
401 | 515 | ||
516 | void LLInventoryItem::recalcNInventoryType() | ||
517 | { | ||
518 | setNInventoryType( calc_ntype(mInventoryType, mType, mFlags) ); | ||
519 | } | ||
520 | |||
521 | |||
402 | void LLInventoryItem::setDescription(const std::string& d) | 522 | void LLInventoryItem::setDescription(const std::string& d) |
403 | { | 523 | { |
404 | std::string new_desc(d); | 524 | std::string new_desc(d); |
@@ -415,14 +535,27 @@ void LLInventoryItem::setPermissions(const LLPermissions& perm) | |||
415 | mPermissions = perm; | 535 | mPermissions = perm; |
416 | } | 536 | } |
417 | 537 | ||
538 | void LLInventoryItem::setType(LLAssetType::EType type) | ||
539 | { | ||
540 | mType = type; | ||
541 | recalcNInventoryType(); | ||
542 | } | ||
543 | |||
418 | void LLInventoryItem::setInventoryType(LLInventoryType::EType inv_type) | 544 | void LLInventoryItem::setInventoryType(LLInventoryType::EType inv_type) |
419 | { | 545 | { |
420 | mInventoryType = inv_type; | 546 | mInventoryType = inv_type; |
547 | recalcNInventoryType(); | ||
548 | } | ||
549 | |||
550 | void LLInventoryItem::setNInventoryType(LLInventoryType::NType inv_type) | ||
551 | { | ||
552 | mNInventoryType = inv_type; | ||
421 | } | 553 | } |
422 | 554 | ||
423 | void LLInventoryItem::setFlags(U32 flags) | 555 | void LLInventoryItem::setFlags(U32 flags) |
424 | { | 556 | { |
425 | mFlags = flags; | 557 | mFlags = flags; |
558 | recalcNInventoryType(); | ||
426 | } | 559 | } |
427 | 560 | ||
428 | void LLInventoryItem::setCreationDate(time_t creation_date_utc) | 561 | void LLInventoryItem::setCreationDate(time_t creation_date_utc) |
@@ -446,6 +579,11 @@ LLInventoryType::EType LLInventoryItem::getInventoryType() const | |||
446 | return mInventoryType; | 579 | return mInventoryType; |
447 | } | 580 | } |
448 | 581 | ||
582 | LLInventoryType::NType LLInventoryItem::getNInventoryType() const | ||
583 | { | ||
584 | return mNInventoryType; | ||
585 | } | ||
586 | |||
449 | U32 LLInventoryItem::getFlags() const | 587 | U32 LLInventoryItem::getFlags() const |
450 | { | 588 | { |
451 | return mFlags; | 589 | return mFlags; |
diff --git a/linden/indra/llinventory/llinventory.h b/linden/indra/llinventory/llinventory.h index d3cce6b..c573f74 100644 --- a/linden/indra/llinventory/llinventory.h +++ b/linden/indra/llinventory/llinventory.h | |||
@@ -42,6 +42,7 @@ | |||
42 | #include "llsaleinfo.h" | 42 | #include "llsaleinfo.h" |
43 | #include "llsd.h" | 43 | #include "llsd.h" |
44 | #include "lluuid.h" | 44 | #include "lluuid.h" |
45 | #include "llwearabletype.h" | ||
45 | #include "llxmlnode.h" | 46 | #include "llxmlnode.h" |
46 | 47 | ||
47 | // consts for Key field in the task inventory update message | 48 | // consts for Key field in the task inventory update message |
@@ -56,6 +57,10 @@ enum | |||
56 | }; | 57 | }; |
57 | 58 | ||
58 | 59 | ||
60 | LLInventoryType::NType calc_ntype( LLInventoryType::EType inv_type, | ||
61 | LLAssetType::EType asset_type, | ||
62 | U32 flags ); | ||
63 | |||
59 | 64 | ||
60 | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 65 | //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
61 | // Class LLInventoryObject | 66 | // Class LLInventoryObject |
@@ -131,6 +136,7 @@ protected: | |||
131 | std::string mDescription; | 136 | std::string mDescription; |
132 | LLSaleInfo mSaleInfo; | 137 | LLSaleInfo mSaleInfo; |
133 | LLInventoryType::EType mInventoryType; | 138 | LLInventoryType::EType mInventoryType; |
139 | LLInventoryType::NType mNInventoryType; | ||
134 | U32 mFlags; | 140 | U32 mFlags; |
135 | time_t mCreationDate; // seconds from 1/1/1970, UTC | 141 | time_t mCreationDate; // seconds from 1/1/1970, UTC |
136 | 142 | ||
@@ -236,6 +242,7 @@ public: | |||
236 | const std::string& getDescription() const; | 242 | const std::string& getDescription() const; |
237 | const LLSaleInfo& getSaleInfo() const; | 243 | const LLSaleInfo& getSaleInfo() const; |
238 | LLInventoryType::EType getInventoryType() const; | 244 | LLInventoryType::EType getInventoryType() const; |
245 | LLInventoryType::NType getNInventoryType() const; | ||
239 | U32 getFlags() const; | 246 | U32 getFlags() const; |
240 | time_t getCreationDate() const; | 247 | time_t getCreationDate() const; |
241 | U32 getCRC32() const; // really more of a checksum. | 248 | U32 getCRC32() const; // really more of a checksum. |
@@ -246,7 +253,9 @@ public: | |||
246 | void setDescription(const std::string& new_desc); | 253 | void setDescription(const std::string& new_desc); |
247 | void setSaleInfo(const LLSaleInfo& sale_info); | 254 | void setSaleInfo(const LLSaleInfo& sale_info); |
248 | void setPermissions(const LLPermissions& perm); | 255 | void setPermissions(const LLPermissions& perm); |
256 | void setType(LLAssetType::EType type); | ||
249 | void setInventoryType(LLInventoryType::EType inv_type); | 257 | void setInventoryType(LLInventoryType::EType inv_type); |
258 | void setNInventoryType(LLInventoryType::NType inv_type); | ||
250 | void setFlags(U32 flags); | 259 | void setFlags(U32 flags); |
251 | void setCreationDate(time_t creation_date_utc); | 260 | void setCreationDate(time_t creation_date_utc); |
252 | 261 | ||
@@ -277,6 +286,9 @@ public: | |||
277 | LLSD asLLSD() const; | 286 | LLSD asLLSD() const; |
278 | bool fromLLSD(LLSD& sd); | 287 | bool fromLLSD(LLSD& sd); |
279 | 288 | ||
289 | private: | ||
290 | void recalcNInventoryType(); | ||
291 | |||
280 | }; | 292 | }; |
281 | 293 | ||
282 | BOOL item_dictionary_sort(LLInventoryItem* a,LLInventoryItem* b); | 294 | BOOL item_dictionary_sort(LLInventoryItem* a,LLInventoryItem* b); |
diff --git a/linden/indra/llinventory/llinventorytype.h b/linden/indra/llinventory/llinventorytype.h index 00a4d28..f228cd0 100644 --- a/linden/indra/llinventory/llinventorytype.h +++ b/linden/indra/llinventory/llinventorytype.h | |||
@@ -71,6 +71,92 @@ public: | |||
71 | IT_NONE = -1 | 71 | IT_NONE = -1 |
72 | }; | 72 | }; |
73 | 73 | ||
74 | |||
75 | /** | ||
76 | * @brief New enumerator for inventory types | ||
77 | * | ||
78 | * This is intended as a replacement to the above EType. | ||
79 | * EType will be phased out in favor of this enum. | ||
80 | * | ||
81 | * This enum acts as a bitfield, which This has several | ||
82 | * useful properties for filtering: | ||
83 | * | ||
84 | * 1. The inventory item's type can be compared by either | ||
85 | * equality or bitwise AND. Bitwise AND allows a quick | ||
86 | * check to see whether the type is one of multiple | ||
87 | * possible types. | ||
88 | * | ||
89 | * 2. It allows for a fast hierarchical organization, by | ||
90 | * defining a broad type (e.g. NIT_BODYPART) whose | ||
91 | * value is the bitwise OR-ing of several more specific | ||
92 | * sub-types (e.g. NIT_SKIN|NIT_HAIR|...). | ||
93 | * | ||
94 | */ | ||
95 | enum NType | ||
96 | { | ||
97 | /* No Type */ | ||
98 | NIT_NONE = 0x0000000, | ||
99 | |||
100 | /* Body Parts */ | ||
101 | NIT_SHAPE = 1 << 0, | ||
102 | NIT_SKIN = 1 << 1, | ||
103 | NIT_HAIR = 1 << 2, | ||
104 | NIT_EYES = 1 << 3, | ||
105 | NIT_BODYPART = 0x000000f, | ||
106 | |||
107 | /* Clothing */ | ||
108 | NIT_SHIRT = 1 << 4, | ||
109 | NIT_PANTS = 1 << 5, | ||
110 | NIT_SHOES = 1 << 6, | ||
111 | NIT_SOCKS = 1 << 7, | ||
112 | NIT_JACKET = 1 << 8, | ||
113 | NIT_GLOVES = 1 << 9, | ||
114 | NIT_UNDERSHIRT = 1 << 10, | ||
115 | NIT_UNDERPANTS = 1 << 11, | ||
116 | NIT_SKIRT = 1 << 12, | ||
117 | NIT_CLOTHING = 0x0001ff0, | ||
118 | |||
119 | /* Body Parts | Clothing */ | ||
120 | NIT_WEARABLE = 0x0001fff, | ||
121 | |||
122 | /* Images */ | ||
123 | NIT_TEXTURE = 1 << 13, | ||
124 | NIT_SNAPSHOT = 1 << 14, | ||
125 | NIT_IMAGE = 0x0006000, | ||
126 | |||
127 | /* Calling Cards */ | ||
128 | NIT_CALLCARD_OFF = 1 << 15, | ||
129 | NIT_CALLCARD_ON = 1 << 16, | ||
130 | NIT_CALLCARD = 0x0018000, | ||
131 | |||
132 | /* Landmarks */ | ||
133 | NIT_LANDMARK_UNUSED = 1 << 17, | ||
134 | NIT_LANDMARK_USED = 1 << 18, | ||
135 | NIT_LANDMARK = 0x0060000, | ||
136 | |||
137 | /* Sounds */ | ||
138 | NIT_SOUND = 1 << 19, | ||
139 | |||
140 | /* Animations */ | ||
141 | NIT_ANIMATION = 1 << 20, | ||
142 | |||
143 | /* Gestures */ | ||
144 | NIT_GESTURE = 1 << 21, | ||
145 | |||
146 | /* Notecards */ | ||
147 | NIT_NOTECARD = 1 << 22, | ||
148 | |||
149 | /* Scripts */ | ||
150 | NIT_SCRIPT_LSL2 = 1 << 23, | ||
151 | |||
152 | /* Objects */ | ||
153 | NIT_OBJECT = 1 << 24, | ||
154 | |||
155 | /* Bitwise OR-ing of all the above */ | ||
156 | NIT_ALL = 0x1ffffff, | ||
157 | }; | ||
158 | |||
159 | |||
74 | // machine transation between type and strings | 160 | // machine transation between type and strings |
75 | static EType lookup(const std::string& name); | 161 | static EType lookup(const std::string& name); |
76 | static const char* lookup(EType type); | 162 | static const char* lookup(EType type); |
diff --git a/linden/indra/llinventory/llwearabletype.h b/linden/indra/llinventory/llwearabletype.h new file mode 100644 index 0000000..b0a40b2 --- /dev/null +++ b/linden/indra/llinventory/llwearabletype.h | |||
@@ -0,0 +1,54 @@ | |||
1 | /** | ||
2 | * @file llwearable.h | ||
3 | * @brief EWearableType enum definition | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2002&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2002-2008, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #ifndef LL_LLWEARABLETYPE_H | ||
33 | #define LL_LLWEARABLETYPE_H | ||
34 | |||
35 | enum EWearableType // If you change this, update LLWearable::getTypeName(), getTypeLabel(), and LLVOAvatar::getTEWearableType() | ||
36 | { | ||
37 | WT_SHAPE = 0, | ||
38 | WT_SKIN = 1, | ||
39 | WT_HAIR = 2, | ||
40 | WT_EYES = 3, | ||
41 | WT_SHIRT = 4, | ||
42 | WT_PANTS = 5, | ||
43 | WT_SHOES = 6, | ||
44 | WT_SOCKS = 7, | ||
45 | WT_JACKET = 8, | ||
46 | WT_GLOVES = 9, | ||
47 | WT_UNDERSHIRT = 10, | ||
48 | WT_UNDERPANTS = 11, | ||
49 | WT_SKIRT = 12, | ||
50 | WT_COUNT = 13, | ||
51 | WT_INVALID = 255 | ||
52 | }; | ||
53 | |||
54 | #endif // LL_LLWEARABLETYPE_H | ||
diff --git a/linden/indra/llui/llcombobox.cpp b/linden/indra/llui/llcombobox.cpp index 9a2e13b..cb9dd4e 100644 --- a/linden/indra/llui/llcombobox.cpp +++ b/linden/indra/llui/llcombobox.cpp | |||
@@ -194,6 +194,11 @@ LLView* LLComboBox::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory * | |||
194 | 194 | ||
195 | combo_box->add(label, LLSD(value) ); | 195 | combo_box->add(label, LLSD(value) ); |
196 | } | 196 | } |
197 | |||
198 | else if (child->hasName("separator")) | ||
199 | { | ||
200 | combo_box->addSeparator(); | ||
201 | } | ||
197 | } | 202 | } |
198 | } | 203 | } |
199 | 204 | ||
diff --git a/linden/indra/newview/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp index 8cefd5b..58d0c42 100644 --- a/linden/indra/newview/llfolderview.cpp +++ b/linden/indra/newview/llfolderview.cpp | |||
@@ -4522,7 +4522,7 @@ BOOL LLInventoryFilter::check(LLFolderViewItem* item) | |||
4522 | } | 4522 | } |
4523 | LLFolderViewEventListener* listener = item->getListener(); | 4523 | LLFolderViewEventListener* listener = item->getListener(); |
4524 | mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos; | 4524 | mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos; |
4525 | BOOL passed = (0x1 << listener->getInventoryType() & mFilterOps.mFilterTypes || listener->getInventoryType() == LLInventoryType::IT_NONE) | 4525 | BOOL passed = (listener->getNInventoryType() & mFilterOps.mFilterTypes || listener->getNInventoryType() == LLInventoryType::NIT_NONE) |
4526 | && (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos) | 4526 | && (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos) |
4527 | && ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions) | 4527 | && ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions) |
4528 | && (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate); | 4528 | && (listener->getCreationDate() >= earliest && listener->getCreationDate() <= mFilterOps.mMaxDate); |
@@ -4800,9 +4800,9 @@ void LLInventoryFilter::setModified(EFilterBehavior behavior) | |||
4800 | } | 4800 | } |
4801 | } | 4801 | } |
4802 | 4802 | ||
4803 | BOOL LLInventoryFilter::isFilterWith(LLInventoryType::EType t) | 4803 | BOOL LLInventoryFilter::isFilterWith(LLInventoryType::NType t) |
4804 | { | 4804 | { |
4805 | return mFilterOps.mFilterTypes & (0x01 << t); | 4805 | return mFilterOps.mFilterTypes & t; |
4806 | } | 4806 | } |
4807 | 4807 | ||
4808 | std::string LLInventoryFilter::getFilterText() | 4808 | std::string LLInventoryFilter::getFilterText() |
@@ -4812,6 +4812,11 @@ std::string LLInventoryFilter::getFilterText() | |||
4812 | return mFilterText; | 4812 | return mFilterText; |
4813 | } | 4813 | } |
4814 | 4814 | ||
4815 | return rebuildFilterText(); | ||
4816 | } | ||
4817 | |||
4818 | std::string LLInventoryFilter::rebuildFilterText() | ||
4819 | { | ||
4815 | mNeedTextRebuild = FALSE; | 4820 | mNeedTextRebuild = FALSE; |
4816 | std::string filtered_types; | 4821 | std::string filtered_types; |
4817 | std::string not_filtered_types; | 4822 | std::string not_filtered_types; |
@@ -4820,7 +4825,7 @@ std::string LLInventoryFilter::getFilterText() | |||
4820 | S32 num_filter_types = 0; | 4825 | S32 num_filter_types = 0; |
4821 | mFilterText.clear(); | 4826 | mFilterText.clear(); |
4822 | 4827 | ||
4823 | if (isFilterWith(LLInventoryType::IT_ANIMATION)) | 4828 | if (isFilterWith(LLInventoryType::NIT_ANIMATION)) |
4824 | { | 4829 | { |
4825 | filtered_types += " Animations,"; | 4830 | filtered_types += " Animations,"; |
4826 | filtered_by_type = TRUE; | 4831 | filtered_by_type = TRUE; |
@@ -4832,7 +4837,19 @@ std::string LLInventoryFilter::getFilterText() | |||
4832 | filtered_by_all_types = FALSE; | 4837 | filtered_by_all_types = FALSE; |
4833 | } | 4838 | } |
4834 | 4839 | ||
4835 | if (isFilterWith(LLInventoryType::IT_CALLINGCARD)) | 4840 | if (isFilterWith(LLInventoryType::NIT_BODYPART)) |
4841 | { | ||
4842 | filtered_types += " Body Parts,"; | ||
4843 | filtered_by_type = TRUE; | ||
4844 | num_filter_types++; | ||
4845 | } | ||
4846 | else | ||
4847 | { | ||
4848 | not_filtered_types += " Body Parts,"; | ||
4849 | filtered_by_all_types = FALSE; | ||
4850 | } | ||
4851 | |||
4852 | if (isFilterWith(LLInventoryType::NIT_CALLCARD)) | ||
4836 | { | 4853 | { |
4837 | filtered_types += " Calling Cards,"; | 4854 | filtered_types += " Calling Cards,"; |
4838 | filtered_by_type = TRUE; | 4855 | filtered_by_type = TRUE; |
@@ -4844,7 +4861,7 @@ std::string LLInventoryFilter::getFilterText() | |||
4844 | filtered_by_all_types = FALSE; | 4861 | filtered_by_all_types = FALSE; |
4845 | } | 4862 | } |
4846 | 4863 | ||
4847 | if (isFilterWith(LLInventoryType::IT_WEARABLE)) | 4864 | if (isFilterWith(LLInventoryType::NIT_CLOTHING)) |
4848 | { | 4865 | { |
4849 | filtered_types += " Clothing,"; | 4866 | filtered_types += " Clothing,"; |
4850 | filtered_by_type = TRUE; | 4867 | filtered_by_type = TRUE; |
@@ -4856,7 +4873,7 @@ std::string LLInventoryFilter::getFilterText() | |||
4856 | filtered_by_all_types = FALSE; | 4873 | filtered_by_all_types = FALSE; |
4857 | } | 4874 | } |
4858 | 4875 | ||
4859 | if (isFilterWith(LLInventoryType::IT_GESTURE)) | 4876 | if (isFilterWith(LLInventoryType::NIT_GESTURE)) |
4860 | { | 4877 | { |
4861 | filtered_types += " Gestures,"; | 4878 | filtered_types += " Gestures,"; |
4862 | filtered_by_type = TRUE; | 4879 | filtered_by_type = TRUE; |
@@ -4868,7 +4885,7 @@ std::string LLInventoryFilter::getFilterText() | |||
4868 | filtered_by_all_types = FALSE; | 4885 | filtered_by_all_types = FALSE; |
4869 | } | 4886 | } |
4870 | 4887 | ||
4871 | if (isFilterWith(LLInventoryType::IT_LANDMARK)) | 4888 | if (isFilterWith(LLInventoryType::NIT_LANDMARK)) |
4872 | { | 4889 | { |
4873 | filtered_types += " Landmarks,"; | 4890 | filtered_types += " Landmarks,"; |
4874 | filtered_by_type = TRUE; | 4891 | filtered_by_type = TRUE; |
@@ -4880,7 +4897,7 @@ std::string LLInventoryFilter::getFilterText() | |||
4880 | filtered_by_all_types = FALSE; | 4897 | filtered_by_all_types = FALSE; |
4881 | } | 4898 | } |
4882 | 4899 | ||
4883 | if (isFilterWith(LLInventoryType::IT_NOTECARD)) | 4900 | if (isFilterWith(LLInventoryType::NIT_NOTECARD)) |
4884 | { | 4901 | { |
4885 | filtered_types += " Notecards,"; | 4902 | filtered_types += " Notecards,"; |
4886 | filtered_by_type = TRUE; | 4903 | filtered_by_type = TRUE; |
@@ -4892,7 +4909,7 @@ std::string LLInventoryFilter::getFilterText() | |||
4892 | filtered_by_all_types = FALSE; | 4909 | filtered_by_all_types = FALSE; |
4893 | } | 4910 | } |
4894 | 4911 | ||
4895 | if (isFilterWith(LLInventoryType::IT_OBJECT) && isFilterWith(LLInventoryType::IT_ATTACHMENT)) | 4912 | if (isFilterWith(LLInventoryType::NIT_OBJECT)) |
4896 | { | 4913 | { |
4897 | filtered_types += " Objects,"; | 4914 | filtered_types += " Objects,"; |
4898 | filtered_by_type = TRUE; | 4915 | filtered_by_type = TRUE; |
@@ -4904,7 +4921,7 @@ std::string LLInventoryFilter::getFilterText() | |||
4904 | filtered_by_all_types = FALSE; | 4921 | filtered_by_all_types = FALSE; |
4905 | } | 4922 | } |
4906 | 4923 | ||
4907 | if (isFilterWith(LLInventoryType::IT_LSL)) | 4924 | if (isFilterWith(LLInventoryType::NIT_SCRIPT_LSL2)) |
4908 | { | 4925 | { |
4909 | filtered_types += " Scripts,"; | 4926 | filtered_types += " Scripts,"; |
4910 | filtered_by_type = TRUE; | 4927 | filtered_by_type = TRUE; |
@@ -4916,7 +4933,7 @@ std::string LLInventoryFilter::getFilterText() | |||
4916 | filtered_by_all_types = FALSE; | 4933 | filtered_by_all_types = FALSE; |
4917 | } | 4934 | } |
4918 | 4935 | ||
4919 | if (isFilterWith(LLInventoryType::IT_SOUND)) | 4936 | if (isFilterWith(LLInventoryType::NIT_SOUND)) |
4920 | { | 4937 | { |
4921 | filtered_types += " Sounds,"; | 4938 | filtered_types += " Sounds,"; |
4922 | filtered_by_type = TRUE; | 4939 | filtered_by_type = TRUE; |
@@ -4928,7 +4945,7 @@ std::string LLInventoryFilter::getFilterText() | |||
4928 | filtered_by_all_types = FALSE; | 4945 | filtered_by_all_types = FALSE; |
4929 | } | 4946 | } |
4930 | 4947 | ||
4931 | if (isFilterWith(LLInventoryType::IT_TEXTURE)) | 4948 | if (isFilterWith(LLInventoryType::NIT_TEXTURE)) |
4932 | { | 4949 | { |
4933 | filtered_types += " Textures,"; | 4950 | filtered_types += " Textures,"; |
4934 | filtered_by_type = TRUE; | 4951 | filtered_by_type = TRUE; |
@@ -4940,7 +4957,7 @@ std::string LLInventoryFilter::getFilterText() | |||
4940 | filtered_by_all_types = FALSE; | 4957 | filtered_by_all_types = FALSE; |
4941 | } | 4958 | } |
4942 | 4959 | ||
4943 | if (isFilterWith(LLInventoryType::IT_SNAPSHOT)) | 4960 | if (isFilterWith(LLInventoryType::NIT_SNAPSHOT)) |
4944 | { | 4961 | { |
4945 | filtered_types += " Snapshots,"; | 4962 | filtered_types += " Snapshots,"; |
4946 | filtered_by_type = TRUE; | 4963 | filtered_by_type = TRUE; |
diff --git a/linden/indra/newview/llfolderview.h b/linden/indra/newview/llfolderview.h index 7978386..af3248d 100644 --- a/linden/indra/newview/llfolderview.h +++ b/linden/indra/newview/llfolderview.h | |||
@@ -103,6 +103,7 @@ public: | |||
103 | virtual BOOL isUpToDate() const = 0; | 103 | virtual BOOL isUpToDate() const = 0; |
104 | virtual BOOL hasChildren() const = 0; | 104 | virtual BOOL hasChildren() const = 0; |
105 | virtual LLInventoryType::EType getInventoryType() const = 0; | 105 | virtual LLInventoryType::EType getInventoryType() const = 0; |
106 | virtual LLInventoryType::NType getNInventoryType() const = 0; | ||
106 | virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) {} | 107 | virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) {} |
107 | 108 | ||
108 | // This method should be called when a drag begins. returns TRUE | 109 | // This method should be called when a drag begins. returns TRUE |
@@ -221,6 +222,7 @@ public: | |||
221 | void clearModified() { mModified = FALSE; mFilterBehavior = FILTER_NONE; } | 222 | void clearModified() { mModified = FALSE; mFilterBehavior = FILTER_NONE; } |
222 | const std::string getName() const { return mName; } | 223 | const std::string getName() const { return mName; } |
223 | std::string getFilterText(); | 224 | std::string getFilterText(); |
225 | std::string rebuildFilterText(); | ||
224 | 226 | ||
225 | void setFilterCount(S32 count) { mFilterCount = count; } | 227 | void setFilterCount(S32 count) { mFilterCount = count; } |
226 | S32 getFilterCount() { return mFilterCount; } | 228 | S32 getFilterCount() { return mFilterCount; } |
@@ -229,7 +231,7 @@ public: | |||
229 | void markDefault(); | 231 | void markDefault(); |
230 | void resetDefault(); | 232 | void resetDefault(); |
231 | 233 | ||
232 | BOOL isFilterWith(LLInventoryType::EType t); | 234 | BOOL isFilterWith(LLInventoryType::NType t); |
233 | 235 | ||
234 | S32 getCurrentGeneration() const { return mFilterGeneration; } | 236 | S32 getCurrentGeneration() const { return mFilterGeneration; } |
235 | S32 getMinRequiredGeneration() const { return mMinRequiredGeneration; } | 237 | S32 getMinRequiredGeneration() const { return mMinRequiredGeneration; } |
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp index 12670e2..bde36cc 100644 --- a/linden/indra/newview/llinventorybridge.cpp +++ b/linden/indra/newview/llinventorybridge.cpp | |||
@@ -722,6 +722,7 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, | |||
722 | if (new_listener) | 722 | if (new_listener) |
723 | { | 723 | { |
724 | new_listener->mInvType = inv_type; | 724 | new_listener->mInvType = inv_type; |
725 | new_listener->mNInvType = calc_ntype(inv_type, asset_type, flags); | ||
725 | } | 726 | } |
726 | 727 | ||
727 | return new_listener; | 728 | return new_listener; |
diff --git a/linden/indra/newview/llinventorybridge.h b/linden/indra/newview/llinventorybridge.h index fc04b28..329e57f 100644 --- a/linden/indra/newview/llinventorybridge.h +++ b/linden/indra/newview/llinventorybridge.h | |||
@@ -192,7 +192,15 @@ public: | |||
192 | virtual BOOL dragOrDrop(MASK mask, BOOL drop, | 192 | virtual BOOL dragOrDrop(MASK mask, BOOL drop, |
193 | EDragAndDropType cargo_type, | 193 | EDragAndDropType cargo_type, |
194 | void* cargo_data) { return FALSE; } | 194 | void* cargo_data) { return FALSE; } |
195 | virtual LLInventoryType::EType getInventoryType() const { return mInvType; } | 195 | |
196 | virtual LLInventoryType::EType getInventoryType() const | ||
197 | { | ||
198 | return mInvType; | ||
199 | } | ||
200 | virtual LLInventoryType::NType getNInventoryType() const | ||
201 | { | ||
202 | return mNInvType; | ||
203 | } | ||
196 | 204 | ||
197 | // LLInvFVBridge functionality | 205 | // LLInvFVBridge functionality |
198 | virtual void clearDisplayName() {} | 206 | virtual void clearDisplayName() {} |
@@ -221,6 +229,7 @@ protected: | |||
221 | LLInventoryPanel* mInventoryPanel; | 229 | LLInventoryPanel* mInventoryPanel; |
222 | LLUUID mUUID; // item id | 230 | LLUUID mUUID; // item id |
223 | LLInventoryType::EType mInvType; | 231 | LLInventoryType::EType mInvType; |
232 | LLInventoryType::NType mNInvType; | ||
224 | }; | 233 | }; |
225 | 234 | ||
226 | 235 | ||
diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp index f9dd70d..52c3b7e 100644 --- a/linden/indra/newview/llinventoryview.cpp +++ b/linden/indra/newview/llinventoryview.cpp | |||
@@ -44,6 +44,7 @@ | |||
44 | #include "llradiogroup.h" | 44 | #include "llradiogroup.h" |
45 | #include "llspinctrl.h" | 45 | #include "llspinctrl.h" |
46 | #include "lltextbox.h" | 46 | #include "lltextbox.h" |
47 | #include "llcombobox.h" | ||
47 | #include "llui.h" | 48 | #include "llui.h" |
48 | 49 | ||
49 | #include "llfirstuse.h" | 50 | #include "llfirstuse.h" |
@@ -181,18 +182,19 @@ void LLInventoryViewFinder::updateElementsFromFilter() | |||
181 | 182 | ||
182 | // update the ui elements | 183 | // update the ui elements |
183 | LLFloater::setTitle(mFilter->getName()); | 184 | LLFloater::setTitle(mFilter->getName()); |
184 | childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION)); | 185 | |
185 | 186 | childSetValue("check_animation", (S32) (filter_types & LLInventoryType::NIT_ANIMATION)); | |
186 | childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD)); | 187 | childSetValue("check_bodypart", (S32) (filter_types & LLInventoryType::NIT_BODYPART)); |
187 | childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); | 188 | childSetValue("check_calling_card", (S32) (filter_types & LLInventoryType::NIT_CALLCARD)); |
188 | childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); | 189 | childSetValue("check_clothing", (S32) (filter_types & LLInventoryType::NIT_CLOTHING)); |
189 | childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); | 190 | childSetValue("check_gesture", (S32) (filter_types & LLInventoryType::NIT_GESTURE)); |
190 | childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); | 191 | childSetValue("check_landmark", (S32) (filter_types & LLInventoryType::NIT_LANDMARK)); |
191 | childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); | 192 | childSetValue("check_notecard", (S32) (filter_types & LLInventoryType::NIT_NOTECARD)); |
192 | childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); | 193 | childSetValue("check_object", (S32) (filter_types & LLInventoryType::NIT_OBJECT)); |
193 | childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND)); | 194 | childSetValue("check_script", (S32) (filter_types & LLInventoryType::NIT_SCRIPT_LSL2)); |
194 | childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE)); | 195 | childSetValue("check_sound", (S32) (filter_types & LLInventoryType::NIT_SOUND)); |
195 | childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT)); | 196 | childSetValue("check_texture", (S32) (filter_types & LLInventoryType::NIT_TEXTURE)); |
197 | childSetValue("check_snapshot", (S32) (filter_types & LLInventoryType::NIT_SNAPSHOT)); | ||
196 | childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); | 198 | childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS); |
197 | childSetValue("check_since_logoff", mFilter->isSinceLogoff()); | 199 | childSetValue("check_since_logoff", mFilter->isSinceLogoff()); |
198 | mSpinSinceHours->set((F32)(hours % 24)); | 200 | mSpinSinceHours->set((F32)(hours % 24)); |
@@ -206,26 +208,31 @@ void LLInventoryViewFinder::draw() | |||
206 | 208 | ||
207 | if (!childGetValue("check_animation")) | 209 | if (!childGetValue("check_animation")) |
208 | { | 210 | { |
209 | filter &= ~(0x1 << LLInventoryType::IT_ANIMATION); | 211 | filter &= ~(LLInventoryType::NIT_ANIMATION); |
210 | filtered_by_all_types = FALSE; | 212 | filtered_by_all_types = FALSE; |
211 | } | 213 | } |
212 | 214 | ||
215 | if (!childGetValue("check_bodypart")) | ||
216 | { | ||
217 | filter &= ~(LLInventoryType::NIT_BODYPART); | ||
218 | filtered_by_all_types = FALSE; | ||
219 | } | ||
213 | 220 | ||
214 | if (!childGetValue("check_calling_card")) | 221 | if (!childGetValue("check_calling_card")) |
215 | { | 222 | { |
216 | filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD); | 223 | filter &= ~(LLInventoryType::NIT_CALLCARD); |
217 | filtered_by_all_types = FALSE; | 224 | filtered_by_all_types = FALSE; |
218 | } | 225 | } |
219 | 226 | ||
220 | if (!childGetValue("check_clothing")) | 227 | if (!childGetValue("check_clothing")) |
221 | { | 228 | { |
222 | filter &= ~(0x1 << LLInventoryType::IT_WEARABLE); | 229 | filter &= ~(LLInventoryType::NIT_CLOTHING); |
223 | filtered_by_all_types = FALSE; | 230 | filtered_by_all_types = FALSE; |
224 | } | 231 | } |
225 | 232 | ||
226 | if (!childGetValue("check_gesture")) | 233 | if (!childGetValue("check_gesture")) |
227 | { | 234 | { |
228 | filter &= ~(0x1 << LLInventoryType::IT_GESTURE); | 235 | filter &= ~(LLInventoryType::NIT_GESTURE); |
229 | filtered_by_all_types = FALSE; | 236 | filtered_by_all_types = FALSE; |
230 | } | 237 | } |
231 | 238 | ||
@@ -233,52 +240,53 @@ void LLInventoryViewFinder::draw() | |||
233 | 240 | ||
234 | 241 | ||
235 | { | 242 | { |
236 | filter &= ~(0x1 << LLInventoryType::IT_LANDMARK); | 243 | filter &= ~(LLInventoryType::NIT_LANDMARK); |
237 | filtered_by_all_types = FALSE; | 244 | filtered_by_all_types = FALSE; |
238 | } | 245 | } |
239 | 246 | ||
240 | if (!childGetValue("check_notecard")) | 247 | if (!childGetValue("check_notecard")) |
241 | { | 248 | { |
242 | filter &= ~(0x1 << LLInventoryType::IT_NOTECARD); | 249 | filter &= ~(LLInventoryType::NIT_NOTECARD); |
243 | filtered_by_all_types = FALSE; | 250 | filtered_by_all_types = FALSE; |
244 | } | 251 | } |
245 | 252 | ||
246 | if (!childGetValue("check_object")) | 253 | if (!childGetValue("check_object")) |
247 | { | 254 | { |
248 | filter &= ~(0x1 << LLInventoryType::IT_OBJECT); | 255 | filter &= ~(LLInventoryType::NIT_OBJECT); |
249 | filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT); | ||
250 | filtered_by_all_types = FALSE; | 256 | filtered_by_all_types = FALSE; |
251 | } | 257 | } |
252 | 258 | ||
253 | if (!childGetValue("check_script")) | 259 | if (!childGetValue("check_script")) |
254 | { | 260 | { |
255 | filter &= ~(0x1 << LLInventoryType::IT_LSL); | 261 | filter &= ~(LLInventoryType::NIT_SCRIPT_LSL2); |
256 | filtered_by_all_types = FALSE; | 262 | filtered_by_all_types = FALSE; |
257 | } | 263 | } |
258 | 264 | ||
259 | if (!childGetValue("check_sound")) | 265 | if (!childGetValue("check_sound")) |
260 | { | 266 | { |
261 | filter &= ~(0x1 << LLInventoryType::IT_SOUND); | 267 | filter &= ~(LLInventoryType::NIT_SOUND); |
262 | filtered_by_all_types = FALSE; | 268 | filtered_by_all_types = FALSE; |
263 | } | 269 | } |
264 | 270 | ||
265 | if (!childGetValue("check_texture")) | 271 | if (!childGetValue("check_texture")) |
266 | { | 272 | { |
267 | filter &= ~(0x1 << LLInventoryType::IT_TEXTURE); | 273 | filter &= ~(LLInventoryType::NIT_TEXTURE); |
268 | filtered_by_all_types = FALSE; | 274 | filtered_by_all_types = FALSE; |
269 | } | 275 | } |
270 | 276 | ||
271 | if (!childGetValue("check_snapshot")) | 277 | if (!childGetValue("check_snapshot")) |
272 | { | 278 | { |
273 | filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT); | 279 | filter &= ~(LLInventoryType::NIT_SNAPSHOT); |
274 | filtered_by_all_types = FALSE; | 280 | filtered_by_all_types = FALSE; |
275 | } | 281 | } |
276 | 282 | ||
283 | /* | ||
277 | if (!filtered_by_all_types) | 284 | if (!filtered_by_all_types) |
278 | { | 285 | { |
279 | // don't include folders in filter, unless I've selected everything | 286 | // don't include folders in filter, unless I've selected everything |
280 | filter &= ~(0x1 << LLInventoryType::IT_CATEGORY); | 287 | filter &= ~(LLInventoryType::NIT_CATEGORY); |
281 | } | 288 | } |
289 | */ | ||
282 | 290 | ||
283 | // update the panel, panel will update the filter | 291 | // update the panel, panel will update the filter |
284 | mInventoryView->mActivePanel->setShowFolderState(getCheckShowEmpty() ? | 292 | mInventoryView->mActivePanel->setShowFolderState(getCheckShowEmpty() ? |
@@ -344,6 +352,7 @@ void LLInventoryViewFinder::selectAllTypes(void* user_data) | |||
344 | if(!self) return; | 352 | if(!self) return; |
345 | 353 | ||
346 | self->childSetValue("check_animation", TRUE); | 354 | self->childSetValue("check_animation", TRUE); |
355 | self->childSetValue("check_bodypart", TRUE); | ||
347 | self->childSetValue("check_calling_card", TRUE); | 356 | self->childSetValue("check_calling_card", TRUE); |
348 | self->childSetValue("check_clothing", TRUE); | 357 | self->childSetValue("check_clothing", TRUE); |
349 | self->childSetValue("check_gesture", TRUE); | 358 | self->childSetValue("check_gesture", TRUE); |
@@ -389,6 +398,7 @@ void LLInventoryViewFinder::selectNoTypes(void* user_data) | |||
389 | 398 | ||
390 | 399 | ||
391 | self->childSetValue("check_animation", FALSE); | 400 | self->childSetValue("check_animation", FALSE); |
401 | self->childSetValue("check_bodypart", FALSE); | ||
392 | self->childSetValue("check_calling_card", FALSE); | 402 | self->childSetValue("check_calling_card", FALSE); |
393 | self->childSetValue("check_clothing", FALSE); | 403 | self->childSetValue("check_clothing", FALSE); |
394 | self->childSetValue("check_gesture", FALSE); | 404 | self->childSetValue("check_gesture", FALSE); |
@@ -549,6 +559,12 @@ void LLInventoryView::init(LLInventoryModel* inventory) | |||
549 | mSearchEditor->setSearchCallback(onSearchEdit, this); | 559 | mSearchEditor->setSearchCallback(onSearchEdit, this); |
550 | } | 560 | } |
551 | 561 | ||
562 | mQuickFilterCombo = getChild<LLComboBox>("Quick Filter"); | ||
563 | if (mQuickFilterCombo) | ||
564 | { | ||
565 | mQuickFilterCombo->setCommitCallback(onQuickFilterCommit); | ||
566 | } | ||
567 | |||
552 | sActiveViews.put(this); | 568 | sActiveViews.put(this); |
553 | 569 | ||
554 | gInventory.addObserver(this); | 570 | gInventory.addObserver(this); |
@@ -617,6 +633,11 @@ void LLInventoryView::draw() | |||
617 | { | 633 | { |
618 | mSearchEditor->setText(mActivePanel->getFilterSubString()); | 634 | mSearchEditor->setText(mActivePanel->getFilterSubString()); |
619 | } | 635 | } |
636 | if (mActivePanel && mQuickFilterCombo) | ||
637 | { | ||
638 | refreshQuickFilter( mQuickFilterCombo ); | ||
639 | } | ||
640 | |||
620 | LLFloater::draw(); | 641 | LLFloater::draw(); |
621 | } | 642 | } |
622 | 643 | ||
@@ -922,16 +943,9 @@ void LLInventoryView::onClearSearch(void* user_data) | |||
922 | LLInventoryView* self = (LLInventoryView*)user_data; | 943 | LLInventoryView* self = (LLInventoryView*)user_data; |
923 | if(!self) return; | 944 | if(!self) return; |
924 | 945 | ||
925 | LLFloater *finder = self->getFinder(); | ||
926 | if (self->mActivePanel) | 946 | if (self->mActivePanel) |
927 | { | 947 | { |
928 | self->mActivePanel->setFilterSubString(LLStringUtil::null); | 948 | self->mActivePanel->setFilterSubString(LLStringUtil::null); |
929 | self->mActivePanel->setFilterTypes(0xffffffff); | ||
930 | } | ||
931 | |||
932 | if (finder) | ||
933 | { | ||
934 | LLInventoryViewFinder::selectAllTypes(finder); | ||
935 | } | 949 | } |
936 | 950 | ||
937 | // re-open folders that were initially open | 951 | // re-open folders that were initially open |
@@ -981,6 +995,241 @@ void LLInventoryView::onSearchEdit(const std::string& search_string, void* user_ | |||
981 | } | 995 | } |
982 | 996 | ||
983 | 997 | ||
998 | //static | ||
999 | void LLInventoryView::onQuickFilterCommit(LLUICtrl* ctrl, void* user_data) | ||
1000 | { | ||
1001 | |||
1002 | LLComboBox* quickfilter = (LLComboBox*)ctrl; | ||
1003 | |||
1004 | |||
1005 | LLInventoryView* view = (LLInventoryView*)(quickfilter->getParent()); | ||
1006 | if (!view->mActivePanel) | ||
1007 | { | ||
1008 | return; | ||
1009 | } | ||
1010 | |||
1011 | |||
1012 | std::string item_type = quickfilter->getSimple(); | ||
1013 | U32 filter_type; | ||
1014 | |||
1015 | if (view->getString("filter_type_animation") == item_type) | ||
1016 | { | ||
1017 | filter_type = LLInventoryType::NIT_ANIMATION; | ||
1018 | } | ||
1019 | |||
1020 | else if (view->getString("filter_type_bodypart") == item_type) | ||
1021 | { | ||
1022 | filter_type = LLInventoryType::NIT_BODYPART; | ||
1023 | } | ||
1024 | |||
1025 | else if (view->getString("filter_type_callingcard") == item_type) | ||
1026 | { | ||
1027 | filter_type = LLInventoryType::NIT_CALLCARD; | ||
1028 | } | ||
1029 | |||
1030 | else if (view->getString("filter_type_clothing") == item_type) | ||
1031 | { | ||
1032 | filter_type = LLInventoryType::NIT_CLOTHING; | ||
1033 | } | ||
1034 | |||
1035 | else if (view->getString("filter_type_gesture") == item_type) | ||
1036 | { | ||
1037 | filter_type = LLInventoryType::NIT_GESTURE; | ||
1038 | } | ||
1039 | |||
1040 | else if (view->getString("filter_type_landmark") == item_type) | ||
1041 | { | ||
1042 | filter_type = LLInventoryType::NIT_LANDMARK; | ||
1043 | } | ||
1044 | |||
1045 | else if (view->getString("filter_type_notecard") == item_type) | ||
1046 | { | ||
1047 | filter_type = LLInventoryType::NIT_NOTECARD; | ||
1048 | } | ||
1049 | |||
1050 | else if (view->getString("filter_type_object") == item_type) | ||
1051 | { | ||
1052 | filter_type = LLInventoryType::NIT_OBJECT; | ||
1053 | } | ||
1054 | |||
1055 | else if (view->getString("filter_type_script") == item_type) | ||
1056 | { | ||
1057 | filter_type = LLInventoryType::NIT_SCRIPT_LSL2; | ||
1058 | } | ||
1059 | |||
1060 | else if (view->getString("filter_type_sound") == item_type) | ||
1061 | { | ||
1062 | filter_type = LLInventoryType::NIT_SOUND; | ||
1063 | } | ||
1064 | |||
1065 | else if (view->getString("filter_type_texture") == item_type) | ||
1066 | { | ||
1067 | filter_type = LLInventoryType::NIT_TEXTURE; | ||
1068 | } | ||
1069 | |||
1070 | else if (view->getString("filter_type_snapshot") == item_type) | ||
1071 | { | ||
1072 | filter_type = LLInventoryType::NIT_SNAPSHOT; | ||
1073 | } | ||
1074 | |||
1075 | else if (view->getString("filter_type_custom") == item_type) | ||
1076 | { | ||
1077 | // When they select custom, show the floater then return | ||
1078 | if( !(view->filtersVisible(view)) ) | ||
1079 | { | ||
1080 | view->toggleFindOptions(); | ||
1081 | } | ||
1082 | return; | ||
1083 | } | ||
1084 | |||
1085 | else if (view->getString("filter_type_all") == item_type) | ||
1086 | { | ||
1087 | // Show all types | ||
1088 | filter_type = 0xffffffff; | ||
1089 | } | ||
1090 | |||
1091 | else | ||
1092 | { | ||
1093 | llwarns << "Ignoring unknown filter: " << item_type << llendl; | ||
1094 | return; | ||
1095 | } | ||
1096 | |||
1097 | view->mActivePanel->setFilterTypes( filter_type ); | ||
1098 | |||
1099 | // Start fetching inventory in the background, so we have | ||
1100 | // some items to show the user. | ||
1101 | gInventory.startBackgroundFetch(); | ||
1102 | |||
1103 | // Update the Inventory window text | ||
1104 | view->setFilterTextFromFilter(); | ||
1105 | |||
1106 | // Force the filters window to update itself, if it's open. | ||
1107 | LLInventoryViewFinder* finder = view->getFinder(); | ||
1108 | if( finder ) | ||
1109 | { | ||
1110 | finder->updateElementsFromFilter(); | ||
1111 | } | ||
1112 | |||
1113 | // llinfos << "Quick Filter: " << item_type << llendl; | ||
1114 | |||
1115 | } | ||
1116 | |||
1117 | |||
1118 | |||
1119 | //static | ||
1120 | void LLInventoryView::refreshQuickFilter(LLUICtrl* ctrl) | ||
1121 | { | ||
1122 | |||
1123 | LLInventoryView* view = (LLInventoryView*)(ctrl->getParent()); | ||
1124 | if (!view->mActivePanel) | ||
1125 | { | ||
1126 | return; | ||
1127 | } | ||
1128 | |||
1129 | LLComboBox* quickfilter = view->getChild<LLComboBox>("Quick Filter"); | ||
1130 | if (!quickfilter) | ||
1131 | { | ||
1132 | return; | ||
1133 | } | ||
1134 | |||
1135 | |||
1136 | U32 filter_type = view->mActivePanel->getFilterTypes(); | ||
1137 | filter_type &= LLInventoryType::NIT_ALL; | ||
1138 | |||
1139 | |||
1140 | //llinfos << "filter_type: " << filter_type << llendl; | ||
1141 | |||
1142 | std::string selection; | ||
1143 | |||
1144 | |||
1145 | if (filter_type == LLInventoryType::NIT_ALL) | ||
1146 | { | ||
1147 | selection = view->getString("filter_type_all"); | ||
1148 | } | ||
1149 | |||
1150 | else if (filter_type == LLInventoryType::NIT_NONE) | ||
1151 | { | ||
1152 | selection = view->getString("filter_type_custom"); | ||
1153 | } | ||
1154 | |||
1155 | else if (filter_type == (filter_type & LLInventoryType::NIT_ANIMATION)) | ||
1156 | { | ||
1157 | selection = view->getString("filter_type_animation"); | ||
1158 | } | ||
1159 | |||
1160 | else if (filter_type == (filter_type & LLInventoryType::NIT_BODYPART)) | ||
1161 | { | ||
1162 | selection = view->getString("filter_type_bodypart"); | ||
1163 | } | ||
1164 | |||
1165 | else if (filter_type == (filter_type & LLInventoryType::NIT_CALLCARD)) | ||
1166 | { | ||
1167 | selection = view->getString("filter_type_callingcard"); | ||
1168 | } | ||
1169 | |||
1170 | else if (filter_type == (filter_type & LLInventoryType::NIT_CLOTHING)) | ||
1171 | { | ||
1172 | selection = view->getString("filter_type_clothing"); | ||
1173 | } | ||
1174 | |||
1175 | else if (filter_type == (filter_type & LLInventoryType::NIT_GESTURE)) | ||
1176 | { | ||
1177 | selection = view->getString("filter_type_gesture"); | ||
1178 | } | ||
1179 | |||
1180 | else if (filter_type == (filter_type & LLInventoryType::NIT_LANDMARK)) | ||
1181 | { | ||
1182 | selection = view->getString("filter_type_landmark"); | ||
1183 | } | ||
1184 | |||
1185 | else if (filter_type == (filter_type & LLInventoryType::NIT_NOTECARD)) | ||
1186 | { | ||
1187 | selection = view->getString("filter_type_notecard"); | ||
1188 | } | ||
1189 | |||
1190 | else if (filter_type == (filter_type & LLInventoryType::NIT_OBJECT)) | ||
1191 | { | ||
1192 | selection = view->getString("filter_type_object"); | ||
1193 | } | ||
1194 | |||
1195 | else if (filter_type == (filter_type & LLInventoryType::NIT_SCRIPT_LSL2)) | ||
1196 | { | ||
1197 | selection = view->getString("filter_type_script"); | ||
1198 | } | ||
1199 | |||
1200 | else if (filter_type == (filter_type & LLInventoryType::NIT_SOUND)) | ||
1201 | { | ||
1202 | selection = view->getString("filter_type_sound"); | ||
1203 | } | ||
1204 | |||
1205 | else if (filter_type == (filter_type & LLInventoryType::NIT_TEXTURE)) | ||
1206 | { | ||
1207 | selection = view->getString("filter_type_texture"); | ||
1208 | } | ||
1209 | |||
1210 | else if (filter_type == (filter_type & LLInventoryType::NIT_SNAPSHOT)) | ||
1211 | { | ||
1212 | selection = view->getString("filter_type_snapshot"); | ||
1213 | } | ||
1214 | |||
1215 | else | ||
1216 | { | ||
1217 | selection = view->getString("filter_type_custom"); | ||
1218 | } | ||
1219 | |||
1220 | |||
1221 | // Select the chosen item by label text | ||
1222 | BOOL result = quickfilter->setSimple( (selection) ); | ||
1223 | |||
1224 | if( !result ) | ||
1225 | { | ||
1226 | llinfos << "The item didn't exist: " << selection << llendl; | ||
1227 | } | ||
1228 | |||
1229 | } | ||
1230 | |||
1231 | |||
1232 | |||
984 | // static | 1233 | // static |
985 | // BOOL LLInventoryView::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward) | 1234 | // BOOL LLInventoryView::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward) |
986 | // { | 1235 | // { |
@@ -1079,124 +1328,163 @@ BOOL LLInventoryView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, | |||
1079 | 1328 | ||
1080 | return handled; | 1329 | return handled; |
1081 | } | 1330 | } |
1331 | |||
1082 | std::string get_item_icon_name(LLAssetType::EType asset_type, | 1332 | std::string get_item_icon_name(LLAssetType::EType asset_type, |
1083 | LLInventoryType::EType inventory_type, | 1333 | LLInventoryType::EType inv_type, |
1084 | U32 attachment_point, | 1334 | U32 flags, |
1085 | BOOL item_is_multi ) | 1335 | BOOL item_is_multi ) |
1336 | { | ||
1337 | return get_item_icon_name( calc_ntype(inv_type, asset_type, flags), | ||
1338 | item_is_multi ); | ||
1339 | } | ||
1340 | |||
1341 | std::string get_item_icon_name(LLInventoryType::NType inv_ntype, | ||
1342 | BOOL item_is_multi ) | ||
1086 | { | 1343 | { |
1087 | EInventoryIcon idx = OBJECT_ICON_NAME; | 1344 | EInventoryIcon idx = OBJECT_ICON_NAME; |
1088 | if ( item_is_multi ) | 1345 | |
1089 | { | 1346 | switch( inv_ntype ) |
1090 | idx = OBJECT_MULTI_ICON_NAME; | ||
1091 | } | ||
1092 | |||
1093 | switch(asset_type) | ||
1094 | { | 1347 | { |
1095 | case LLAssetType::AT_TEXTURE: | 1348 | // BODY PARTS |
1096 | if(LLInventoryType::IT_SNAPSHOT == inventory_type) | ||
1097 | { | ||
1098 | idx = SNAPSHOT_ICON_NAME; | ||
1099 | } | ||
1100 | else | ||
1101 | { | ||
1102 | idx = TEXTURE_ICON_NAME; | ||
1103 | } | ||
1104 | break; | ||
1105 | 1349 | ||
1106 | case LLAssetType::AT_SOUND: | 1350 | case LLInventoryType::NIT_SHAPE: |
1107 | idx = SOUND_ICON_NAME; | ||
1108 | break; | ||
1109 | case LLAssetType::AT_CALLINGCARD: | ||
1110 | if(attachment_point!= 0) | ||
1111 | { | ||
1112 | idx = CALLINGCARD_ONLINE_ICON_NAME; | ||
1113 | } | ||
1114 | else | ||
1115 | { | ||
1116 | idx = CALLINGCARD_OFFLINE_ICON_NAME; | ||
1117 | } | ||
1118 | break; | ||
1119 | case LLAssetType::AT_LANDMARK: | ||
1120 | if(attachment_point!= 0) | ||
1121 | { | ||
1122 | idx = LANDMARK_VISITED_ICON_NAME; | ||
1123 | } | ||
1124 | else | ||
1125 | { | ||
1126 | idx = LANDMARK_ICON_NAME; | ||
1127 | } | ||
1128 | break; | ||
1129 | case LLAssetType::AT_SCRIPT: | ||
1130 | case LLAssetType::AT_LSL_TEXT: | ||
1131 | case LLAssetType::AT_LSL_BYTECODE: | ||
1132 | idx = SCRIPT_ICON_NAME; | ||
1133 | break; | ||
1134 | case LLAssetType::AT_CLOTHING: | ||
1135 | idx = CLOTHING_ICON_NAME; | ||
1136 | case LLAssetType::AT_BODYPART : | ||
1137 | if(LLAssetType::AT_BODYPART == asset_type) | ||
1138 | { | ||
1139 | idx = BODYPART_ICON_NAME; | ||
1140 | } | ||
1141 | switch(attachment_point) | ||
1142 | { | ||
1143 | case WT_SHAPE: | ||
1144 | idx = BODYPART_SHAPE_ICON_NAME; | 1351 | idx = BODYPART_SHAPE_ICON_NAME; |
1145 | break; | 1352 | break; |
1146 | case WT_SKIN: | 1353 | case LLInventoryType::NIT_SKIN: |
1147 | idx = BODYPART_SKIN_ICON_NAME; | 1354 | idx = BODYPART_SKIN_ICON_NAME; |
1148 | break; | 1355 | break; |
1149 | case WT_HAIR: | 1356 | case LLInventoryType::NIT_HAIR: |
1150 | idx = BODYPART_HAIR_ICON_NAME; | 1357 | idx = BODYPART_HAIR_ICON_NAME; |
1151 | break; | 1358 | break; |
1152 | case WT_EYES: | 1359 | case LLInventoryType::NIT_EYES: |
1153 | idx = BODYPART_EYES_ICON_NAME; | 1360 | idx = BODYPART_EYES_ICON_NAME; |
1154 | break; | 1361 | break; |
1155 | case WT_SHIRT: | 1362 | |
1363 | case LLInventoryType::NIT_BODYPART: | ||
1364 | idx = BODYPART_ICON_NAME; | ||
1365 | break; | ||
1366 | |||
1367 | |||
1368 | // CLOTHING | ||
1369 | |||
1370 | case LLInventoryType::NIT_SHIRT: | ||
1156 | idx = CLOTHING_SHIRT_ICON_NAME; | 1371 | idx = CLOTHING_SHIRT_ICON_NAME; |
1157 | break; | 1372 | break; |
1158 | case WT_PANTS: | 1373 | case LLInventoryType::NIT_PANTS: |
1159 | idx = CLOTHING_PANTS_ICON_NAME; | 1374 | idx = CLOTHING_PANTS_ICON_NAME; |
1160 | break; | 1375 | break; |
1161 | case WT_SHOES: | 1376 | case LLInventoryType::NIT_SHOES: |
1162 | idx = CLOTHING_SHOES_ICON_NAME; | 1377 | idx = CLOTHING_SHOES_ICON_NAME; |
1163 | break; | 1378 | break; |
1164 | case WT_SOCKS: | 1379 | case LLInventoryType::NIT_SOCKS: |
1165 | idx = CLOTHING_SOCKS_ICON_NAME; | 1380 | idx = CLOTHING_SOCKS_ICON_NAME; |
1166 | break; | 1381 | break; |
1167 | case WT_JACKET: | 1382 | case LLInventoryType::NIT_JACKET: |
1168 | idx = CLOTHING_JACKET_ICON_NAME; | 1383 | idx = CLOTHING_JACKET_ICON_NAME; |
1169 | break; | 1384 | break; |
1170 | case WT_GLOVES: | 1385 | case LLInventoryType::NIT_GLOVES: |
1171 | idx = CLOTHING_GLOVES_ICON_NAME; | 1386 | idx = CLOTHING_GLOVES_ICON_NAME; |
1172 | break; | 1387 | break; |
1173 | case WT_UNDERSHIRT: | 1388 | case LLInventoryType::NIT_UNDERSHIRT: |
1174 | idx = CLOTHING_UNDERSHIRT_ICON_NAME; | 1389 | idx = CLOTHING_UNDERSHIRT_ICON_NAME; |
1175 | break; | 1390 | break; |
1176 | case WT_UNDERPANTS: | 1391 | case LLInventoryType::NIT_UNDERPANTS: |
1177 | idx = CLOTHING_UNDERPANTS_ICON_NAME; | 1392 | idx = CLOTHING_UNDERPANTS_ICON_NAME; |
1178 | break; | 1393 | break; |
1179 | case WT_SKIRT: | 1394 | case LLInventoryType::NIT_SKIRT: |
1180 | idx = CLOTHING_SKIRT_ICON_NAME; | 1395 | idx = CLOTHING_SKIRT_ICON_NAME; |
1181 | break; | 1396 | break; |
1397 | |||
1398 | case LLInventoryType::NIT_CLOTHING: | ||
1399 | idx = CLOTHING_ICON_NAME; | ||
1400 | break; | ||
1401 | |||
1402 | |||
1403 | // TEXTURES / SNAPSHOTS | ||
1404 | |||
1405 | case LLInventoryType::NIT_SNAPSHOT: | ||
1406 | idx = SNAPSHOT_ICON_NAME; | ||
1407 | break; | ||
1408 | case LLInventoryType::NIT_TEXTURE: | ||
1409 | case LLInventoryType::NIT_IMAGE: | ||
1410 | idx = TEXTURE_ICON_NAME; | ||
1411 | break; | ||
1412 | |||
1413 | |||
1414 | // CALLING CARDS | ||
1415 | |||
1416 | case LLInventoryType::NIT_CALLCARD_ON: | ||
1417 | idx = CALLINGCARD_ONLINE_ICON_NAME; | ||
1418 | break; | ||
1419 | case LLInventoryType::NIT_CALLCARD_OFF: | ||
1420 | case LLInventoryType::NIT_CALLCARD: | ||
1421 | idx = CALLINGCARD_OFFLINE_ICON_NAME; | ||
1422 | break; | ||
1423 | |||
1424 | |||
1425 | // LANDMARKS | ||
1426 | |||
1427 | case LLInventoryType::NIT_LANDMARK_USED: | ||
1428 | idx = LANDMARK_VISITED_ICON_NAME; | ||
1429 | break; | ||
1430 | case LLInventoryType::NIT_LANDMARK_UNUSED: | ||
1431 | case LLInventoryType::NIT_LANDMARK: | ||
1432 | idx = LANDMARK_ICON_NAME; | ||
1433 | break; | ||
1434 | |||
1435 | |||
1436 | // SOUNDS | ||
1437 | |||
1438 | case LLInventoryType::NIT_SOUND: | ||
1439 | idx = SOUND_ICON_NAME; | ||
1440 | break; | ||
1441 | |||
1442 | |||
1443 | // ANIMATIONS | ||
1444 | |||
1445 | case LLInventoryType::NIT_ANIMATION: | ||
1446 | idx = ANIMATION_ICON_NAME; | ||
1447 | break; | ||
1448 | |||
1449 | |||
1450 | // GESTURES | ||
1451 | |||
1452 | case LLInventoryType::NIT_GESTURE: | ||
1453 | idx = GESTURE_ICON_NAME; | ||
1454 | break; | ||
1455 | |||
1456 | |||
1457 | // NOTECARD | ||
1458 | |||
1459 | case LLInventoryType::NIT_NOTECARD: | ||
1460 | idx = NOTECARD_ICON_NAME; | ||
1461 | break; | ||
1462 | |||
1463 | |||
1464 | // SCRIPTS | ||
1465 | |||
1466 | case LLInventoryType::NIT_SCRIPT_LSL2: | ||
1467 | idx = SCRIPT_ICON_NAME; | ||
1468 | break; | ||
1469 | |||
1470 | |||
1471 | // OBJECTS | ||
1472 | |||
1473 | case LLInventoryType::NIT_OBJECT: | ||
1474 | if( item_is_multi ) | ||
1475 | { | ||
1476 | idx = OBJECT_MULTI_ICON_NAME; | ||
1477 | } | ||
1478 | else | ||
1479 | { | ||
1480 | idx = OBJECT_ICON_NAME; | ||
1481 | } | ||
1482 | break; | ||
1483 | |||
1182 | default: | 1484 | default: |
1183 | // no-op, go with choice above | ||
1184 | break; | 1485 | break; |
1185 | } | ||
1186 | break; | ||
1187 | case LLAssetType::AT_NOTECARD: | ||
1188 | idx = NOTECARD_ICON_NAME; | ||
1189 | break; | ||
1190 | case LLAssetType::AT_ANIMATION: | ||
1191 | idx = ANIMATION_ICON_NAME; | ||
1192 | break; | ||
1193 | case LLAssetType::AT_GESTURE: | ||
1194 | idx = GESTURE_ICON_NAME; | ||
1195 | break; | ||
1196 | default: | ||
1197 | break; | ||
1198 | } | 1486 | } |
1199 | 1487 | ||
1200 | return ICON_NAME[idx]; | 1488 | return ICON_NAME[idx]; |
1201 | } | 1489 | } |
1202 | 1490 | ||
diff --git a/linden/indra/newview/llinventoryview.h b/linden/indra/newview/llinventoryview.h index a37d370..80e5768 100644 --- a/linden/indra/newview/llinventoryview.h +++ b/linden/indra/newview/llinventoryview.h | |||
@@ -58,6 +58,7 @@ class LLCheckBoxCtrl; | |||
58 | class LLSpinCtrl; | 58 | class LLSpinCtrl; |
59 | class LLScrollableContainerView; | 59 | class LLScrollableContainerView; |
60 | class LLTextBox; | 60 | class LLTextBox; |
61 | class LLComboBox; | ||
61 | class LLIconCtrl; | 62 | class LLIconCtrl; |
62 | class LLSaveFolderState; | 63 | class LLSaveFolderState; |
63 | class LLSearchEditor; | 64 | class LLSearchEditor; |
@@ -239,6 +240,8 @@ public: | |||
239 | static void onFoldersByName(void *user_data); | 240 | static void onFoldersByName(void *user_data); |
240 | static BOOL checkFoldersByName(void *user_data); | 241 | static BOOL checkFoldersByName(void *user_data); |
241 | static void onSearchEdit(const std::string& search_string, void* user_data ); | 242 | static void onSearchEdit(const std::string& search_string, void* user_data ); |
243 | static void onQuickFilterCommit(LLUICtrl* ctrl, void* user_data); | ||
244 | static void refreshQuickFilter(LLUICtrl* ctrl); | ||
242 | static void onFilterSelected(void* userdata, bool from_click); | 245 | static void onFilterSelected(void* userdata, bool from_click); |
243 | static void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action, void* data); | 246 | static void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action, void* data); |
244 | 247 | ||
@@ -259,6 +262,7 @@ protected: | |||
259 | 262 | ||
260 | protected: | 263 | protected: |
261 | LLSearchEditor* mSearchEditor; | 264 | LLSearchEditor* mSearchEditor; |
265 | LLComboBox* mQuickFilterCombo; | ||
262 | LLTabContainer* mFilterTabs; | 266 | LLTabContainer* mFilterTabs; |
263 | LLHandle<LLFloater> mFinderHandle; | 267 | LLHandle<LLFloater> mFinderHandle; |
264 | LLInventoryPanel* mActivePanel; | 268 | LLInventoryPanel* mActivePanel; |
@@ -344,6 +348,9 @@ std::string get_item_icon_name(LLAssetType::EType asset_type, | |||
344 | U32 attachment_point, | 348 | U32 attachment_point, |
345 | BOOL item_is_multi ); | 349 | BOOL item_is_multi ); |
346 | 350 | ||
351 | std::string get_item_icon_name(LLInventoryType::NType inv_ntype, | ||
352 | BOOL item_is_multi ); | ||
353 | |||
347 | LLUIImagePtr get_item_icon(LLAssetType::EType asset_type, | 354 | LLUIImagePtr get_item_icon(LLAssetType::EType asset_type, |
348 | LLInventoryType::EType inventory_type, | 355 | LLInventoryType::EType inventory_type, |
349 | U32 attachment_point, | 356 | U32 attachment_point, |
diff --git a/linden/indra/newview/llpanelinventory.cpp b/linden/indra/newview/llpanelinventory.cpp index 3c0e6d7..e41ecdc 100644 --- a/linden/indra/newview/llpanelinventory.cpp +++ b/linden/indra/newview/llpanelinventory.cpp | |||
@@ -146,6 +146,7 @@ public: | |||
146 | virtual BOOL isUpToDate() const { return TRUE; } | 146 | virtual BOOL isUpToDate() const { return TRUE; } |
147 | virtual BOOL hasChildren() const { return FALSE; } | 147 | virtual BOOL hasChildren() const { return FALSE; } |
148 | virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; } | 148 | virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; } |
149 | virtual LLInventoryType::NType getNInventoryType() const { return LLInventoryType::NIT_NONE; } | ||
149 | // LLDragAndDropBridge functionality | 150 | // LLDragAndDropBridge functionality |
150 | virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; | 151 | virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const; |
151 | virtual BOOL dragOrDrop(MASK mask, BOOL drop, | 152 | virtual BOOL dragOrDrop(MASK mask, BOOL drop, |
diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp index 90b1bd3..7547dd2 100644 --- a/linden/indra/newview/llselectmgr.cpp +++ b/linden/indra/newview/llselectmgr.cpp | |||
@@ -5499,6 +5499,10 @@ void LLSelectMgr::updateSelectionCenter() | |||
5499 | 5499 | ||
5500 | std::vector < LLViewerObject *> jointed_objects; | 5500 | std::vector < LLViewerObject *> jointed_objects; |
5501 | 5501 | ||
5502 | // Initialize the bounding box to the root prim, so the BBox orientation | ||
5503 | // matches the root prim's (affecting the orientation of the manipulators). | ||
5504 | bbox.addBBoxAgent( (mSelectedObjects->getFirstRootObject(TRUE))->getBoundingBoxAgent() ); | ||
5505 | |||
5502 | for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); | 5506 | for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); |
5503 | iter != mSelectedObjects->end(); iter++) | 5507 | iter != mSelectedObjects->end(); iter++) |
5504 | { | 5508 | { |
diff --git a/linden/indra/newview/llwearable.h b/linden/indra/newview/llwearable.h index c5f9d06..00a53d3 100644 --- a/linden/indra/newview/llwearable.h +++ b/linden/indra/newview/llwearable.h | |||
@@ -37,28 +37,10 @@ | |||
37 | #include "llpermissions.h" | 37 | #include "llpermissions.h" |
38 | #include "llsaleinfo.h" | 38 | #include "llsaleinfo.h" |
39 | #include "llassetstorage.h" | 39 | #include "llassetstorage.h" |
40 | #include "llwearabletype.h" | ||
40 | 41 | ||
41 | class LLViewerInventoryItem; | 42 | class LLViewerInventoryItem; |
42 | 43 | ||
43 | enum EWearableType // If you change this, update LLWearable::getTypeName(), getTypeLabel(), and LLVOAvatar::getTEWearableType() | ||
44 | { | ||
45 | WT_SHAPE = 0, | ||
46 | WT_SKIN = 1, | ||
47 | WT_HAIR = 2, | ||
48 | WT_EYES = 3, | ||
49 | WT_SHIRT = 4, | ||
50 | WT_PANTS = 5, | ||
51 | WT_SHOES = 6, | ||
52 | WT_SOCKS = 7, | ||
53 | WT_JACKET = 8, | ||
54 | WT_GLOVES = 9, | ||
55 | WT_UNDERSHIRT = 10, | ||
56 | WT_UNDERPANTS = 11, | ||
57 | WT_SKIRT = 12, | ||
58 | WT_COUNT = 13, | ||
59 | WT_INVALID = 255 | ||
60 | }; | ||
61 | |||
62 | class LLWearable | 44 | class LLWearable |
63 | { | 45 | { |
64 | friend class LLWearableList; | 46 | friend class LLWearableList; |
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml b/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml index 1cb1da0..590555f 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_inventory.xml | |||
@@ -5,18 +5,64 @@ | |||
5 | title="Inventory" width="467"> | 5 | title="Inventory" width="467"> |
6 | <search_editor bottom="-50" follows="left|top|right" height="16" label="Type here to search" | 6 | <search_editor bottom="-50" follows="left|top|right" height="16" label="Type here to search" |
7 | left="6" mouse_opaque="true" name="inventory search editor" width="455" /> | 7 | left="6" mouse_opaque="true" name="inventory search editor" width="455" /> |
8 | <tab_container bottom_delta="-512" follows="left|top|right|bottom" height="508" left="2" | 8 | |
9 | mouse_opaque="false" name="inventory filter tabs" tab_position="top" | 9 | <text name="group_titles_textbox" font="SansSerifSmall" follows="left|top" |
10 | width="463"> | 10 | height="16" left="10" bottom_delta="-24" width="120"> |
11 | Quick Filter: | ||
12 | </text> | ||
13 | |||
14 | <!-- Inventory Type Filter Labels --> | ||
15 | <string name="filter_type_all">All Types</string> | ||
16 | <string name="filter_type_animation">Animations</string> | ||
17 | <string name="filter_type_bodypart">Body Parts</string> | ||
18 | <string name="filter_type_callingcard">Calling Cards</string> | ||
19 | <string name="filter_type_clothing">Clothing</string> | ||
20 | <string name="filter_type_gesture">Gestures</string> | ||
21 | <string name="filter_type_landmark">Landmarks</string> | ||
22 | <string name="filter_type_notecard">Notecards</string> | ||
23 | <string name="filter_type_object">Objects</string> | ||
24 | <string name="filter_type_script">Scripts</string> | ||
25 | <string name="filter_type_sound">Sounds</string> | ||
26 | <string name="filter_type_texture">Textures</string> | ||
27 | <string name="filter_type_snapshot">Snapshots</string> | ||
28 | <string name="filter_type_custom">Custom...</string> | ||
29 | |||
30 | <combo_box name="Quick Filter" label="Quick Filter" follows="left|top" | ||
31 | height="20" left="80" width="150" bottom_delta="0"> | ||
32 | |||
33 | <combo_item name="filter_type_all">All Types</combo_item> | ||
34 | <separator /> | ||
35 | <combo_item name="filter_type_animation">Animations</combo_item> | ||
36 | <combo_item name="filter_type_bodypart">Body Parts</combo_item> | ||
37 | <combo_item name="filter_type_callingcard">Calling Cards</combo_item> | ||
38 | <combo_item name="filter_type_clothing">Clothing</combo_item> | ||
39 | <combo_item name="filter_type_gesture">Gestures</combo_item> | ||
40 | <combo_item name="filter_type_landmark">Landmarks</combo_item> | ||
41 | <combo_item name="filter_type_notecard">Notecards</combo_item> | ||
42 | <combo_item name="filter_type_object">Objects</combo_item> | ||
43 | <combo_item name="filter_type_script">Scripts</combo_item> | ||
44 | <combo_item name="filter_type_sound">Sounds</combo_item> | ||
45 | <combo_item name="filter_type_texture">Textures</combo_item> | ||
46 | <combo_item name="filter_type_snapshot">Snapshots</combo_item> | ||
47 | <separator /> | ||
48 | <combo_item name="filter_type_custom">Custom...</combo_item> | ||
49 | |||
50 | </combo_box> | ||
51 | |||
52 | <tab_container name="inventory filter tabs" follows="left|top|right|bottom" | ||
53 | bottom_delta="-487" height="480" left="2" width="463" | ||
54 | mouse_opaque="false" tab_position="top"> | ||
55 | |||
11 | <inventory_panel allow_multi_select="true" border="true" bottom="-507" | 56 | <inventory_panel allow_multi_select="true" border="true" bottom="-507" |
12 | follows="left|top|right|bottom" height="491" label="All Items" left="1" | 57 | follows="left|top|right|bottom" height="431" label="All Items" left="1" |
13 | mouse_opaque="true" name="All Items" sort_order="InventorySortOrder" | 58 | mouse_opaque="true" name="All Items" sort_order="InventorySortOrder" |
14 | width="461" /> | 59 | width="461" /> |
15 | <inventory_panel allow_multi_select="true" border="true" bottom_delta="0" | 60 | <inventory_panel allow_multi_select="true" border="true" bottom_delta="0" |
16 | follows="left|top|right|bottom" height="491" label="Recent Items" | 61 | follows="left|top|right|bottom" height="431" label="Recent Items" |
17 | left_delta="0" mouse_opaque="true" name="Recent Items" | 62 | left_delta="0" mouse_opaque="true" name="Recent Items" |
18 | sort_order="RecentItemsSortOrder" width="461" /> | 63 | sort_order="RecentItemsSortOrder" width="461" /> |
19 | </tab_container> | 64 | </tab_container> |
65 | |||
20 | <menu_bar bottom="-34" drop_shadow="false" follows="left|top|right" height="18" left="2" | 66 | <menu_bar bottom="-34" drop_shadow="false" follows="left|top|right" height="18" left="2" |
21 | mouse_opaque="false" name="Inventory Menu" opaque="false" width="461"> | 67 | mouse_opaque="false" name="Inventory Menu" opaque="false" width="461"> |
22 | <menu bottom_delta="16" drop_shadow="true" height="101" | 68 | <menu bottom_delta="16" drop_shadow="true" height="101" |
diff --git a/linden/indra/newview/skins/default/xui/en-us/floater_inventory_view_finder.xml b/linden/indra/newview/skins/default/xui/en-us/floater_inventory_view_finder.xml index 9a9b8db..9a5756b 100644 --- a/linden/indra/newview/skins/default/xui/en-us/floater_inventory_view_finder.xml +++ b/linden/indra/newview/skins/default/xui/en-us/floater_inventory_view_finder.xml | |||
@@ -1,102 +1,133 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <floater bottom="-495" can_close="true" can_drag_on_left="false" can_minimize="false" | 2 | |
3 | can_resize="false" can_tear_off="true" enabled="true" height="408" | 3 | <floater name="Inventory Finder" title="inventory_recent_items" |
4 | left="457" min_height="408" min_width="160" mouse_opaque="true" | 4 | bottom="-495" left="457" height="428" width="170" |
5 | name="Inventory Finder" title="inventory_recent_items" width="160"> | 5 | can_close="true" can_drag_on_left="false" can_minimize="false" |
6 | <icon bottom="-36" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 6 | can_resize="false" can_tear_off="true"> |
7 | image_name="inv_item_animation.tga" left="8" mouse_opaque="true" | 7 | |
8 | name="icon_animation" width="16" /> | 8 | |
9 | <check_box bottom="-36" enabled="true" follows="left|top" font="SansSerifSmall" | 9 | <icon name="icon_animation" image_name="inv_item_animation.tga" |
10 | height="16" initial_value="false" label="Animation" left="26" | 10 | bottom="-36" left="8" height="16" width="16" follows="left|top" /> |
11 | mouse_opaque="true" name="check_animation" radio_style="false" width="126" /> | 11 | <check_box label="Animation" name="check_animation" |
12 | <icon bottom="-56" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 12 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
13 | image_name="inv_item_callingcard_online.tga" left="8" mouse_opaque="true" | 13 | font="SansSerifSmall" initial_value="false" /> |
14 | name="icon_calling_card" width="16" /> | 14 | |
15 | <check_box bottom="-56" enabled="true" follows="left|top" font="SansSerifSmall" | 15 | |
16 | height="16" initial_value="false" label="Calling Cards" left="26" | 16 | <icon name="icon_bodypart" image_name="inv_item_skin.tga" |
17 | mouse_opaque="true" name="check_calling_card" radio_style="false" | 17 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
18 | width="126" /> | 18 | <check_box label="Body Parts" name="check_bodypart" |
19 | <icon bottom="-76" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 19 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
20 | image_name="inv_item_shirt.tga" left="8" mouse_opaque="true" | 20 | font="SansSerifSmall" initial_value="false" /> |
21 | name="icon_clothing" width="16" /> | 21 | |
22 | <check_box bottom="-76" enabled="true" follows="left|top" font="SansSerifSmall" | 22 | |
23 | height="16" initial_value="false" label="Clothing" left="26" | 23 | <icon name="icon_calling_card" image_name="inv_item_callingcard_online.tga" |
24 | mouse_opaque="true" name="check_clothing" radio_style="false" width="126" /> | 24 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
25 | <icon bottom="-96" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 25 | <check_box label="Calling Cards" name="check_calling_card" |
26 | image_name="inv_item_gesture.tga" left="8" mouse_opaque="true" | 26 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
27 | name="icon_gesture" width="16" /> | 27 | font="SansSerifSmall" initial_value="false" /> |
28 | <check_box bottom="-96" enabled="true" follows="left|top" font="SansSerifSmall" | 28 | |
29 | height="16" initial_value="false" label="Gestures" left="26" | 29 | |
30 | mouse_opaque="true" name="check_gesture" radio_style="false" width="126" /> | 30 | <icon name="icon_clothing" image_name="inv_item_shirt.tga" |
31 | <icon bottom="-116" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 31 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
32 | image_name="inv_item_landmark_visited.tga" left="8" mouse_opaque="true" | 32 | <check_box label="Clothing" name="check_clothing" |
33 | name="icon_landmark" width="16" /> | 33 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
34 | <check_box bottom="-116" enabled="true" follows="left|top" font="SansSerifSmall" | 34 | font="SansSerifSmall" initial_value="false" /> |
35 | height="16" initial_value="false" label="Landmarks" left="26" | 35 | |
36 | mouse_opaque="true" name="check_landmark" radio_style="false" width="126" /> | 36 | |
37 | <icon bottom="-136" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 37 | <icon name="icon_gesture" image_name="inv_item_gesture.tga" |
38 | image_name="inv_item_notecard.tga" left="8" mouse_opaque="true" | 38 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
39 | name="icon_notecard" width="16" /> | 39 | <check_box label="Gestures" name="check_gesture" |
40 | <check_box bottom="-136" enabled="true" follows="left|top" font="SansSerifSmall" | 40 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
41 | height="16" initial_value="false" label="Notecards" left="26" | 41 | font="SansSerifSmall" initial_value="false" /> |
42 | mouse_opaque="true" name="check_notecard" radio_style="false" width="126" /> | 42 | |
43 | <icon bottom="-156" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 43 | |
44 | image_name="inv_item_object.tga" left="8" mouse_opaque="true" | 44 | <icon name="icon_landmark" image_name="inv_item_landmark_visited.tga" |
45 | name="icon_object" width="16" /> | 45 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
46 | <check_box bottom="-156" enabled="true" follows="left|top" font="SansSerifSmall" | 46 | <check_box label="Landmarks" name="check_landmark" |
47 | height="16" initial_value="false" label="Objects" left="26" | 47 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
48 | mouse_opaque="true" name="check_object" radio_style="false" width="126" /> | 48 | font="SansSerifSmall" initial_value="false" /> |
49 | <icon bottom="-176" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 49 | |
50 | image_name="inv_item_script.tga" left="8" mouse_opaque="true" | 50 | |
51 | name="icon_script" width="16" /> | 51 | <icon name="icon_notecard" image_name="inv_item_notecard.tga" |
52 | <check_box bottom="-176" enabled="true" follows="left|top" font="SansSerifSmall" | 52 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
53 | height="16" initial_value="false" label="Scripts" left="26" | 53 | <check_box label="Notecards" name="check_notecard" |
54 | mouse_opaque="true" name="check_script" radio_style="false" width="126" /> | 54 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
55 | <icon bottom="-196" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 55 | font="SansSerifSmall" initial_value="false" /> |
56 | image_name="inv_item_sound.tga" left="8" mouse_opaque="true" | 56 | |
57 | name="icon_sound" width="16" /> | 57 | |
58 | <check_box bottom="-196" enabled="true" follows="left|top" font="SansSerifSmall" | 58 | <icon name="icon_object" image_name="inv_item_object.tga" |
59 | height="16" initial_value="false" label="Sounds" left="26" | 59 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
60 | mouse_opaque="true" name="check_sound" radio_style="false" width="126" /> | 60 | <check_box label="Objects" name="check_object" |
61 | <icon bottom="-216" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 61 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
62 | image_name="inv_item_texture.tga" left="8" mouse_opaque="true" | 62 | font="SansSerifSmall" initial_value="false" /> |
63 | name="icon_texture" width="16" /> | 63 | |
64 | <check_box bottom="-216" enabled="true" follows="left|top" font="SansSerifSmall" | 64 | |
65 | height="16" initial_value="false" label="Textures" left="26" | 65 | <icon name="icon_script" image_name="inv_item_script.tga" |
66 | mouse_opaque="true" name="check_texture" radio_style="false" width="126" /> | 66 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
67 | <icon bottom="-236" color="1 1 1 1" enabled="true" follows="left|top" height="16" | 67 | <check_box label="Scripts" name="check_script" |
68 | image_name="inv_item_snapshot.tga" left="8" mouse_opaque="true" | 68 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
69 | name="icon_snapshot" width="16" /> | 69 | font="SansSerifSmall" initial_value="false" /> |
70 | <check_box bottom="-236" enabled="true" follows="left|top" font="SansSerifSmall" | 70 | |
71 | height="16" initial_value="false" label="Snapshots" left="26" | 71 | |
72 | mouse_opaque="true" name="check_snapshot" radio_style="false" width="126" /> | 72 | <icon name="icon_sound" image_name="inv_item_sound.tga" |
73 | <button bottom="-260" enabled="true" follows="left|top" font="SansSerif" | 73 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
74 | halign="center" height="20" label="All" label_selected="All" left="8" | 74 | <check_box label="Sounds" name="check_sound" |
75 | mouse_opaque="true" name="All" scale_image="true" width="100" /> | 75 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
76 | <button bottom="-284" enabled="true" follows="left|top" font="SansSerif" | 76 | font="SansSerifSmall" initial_value="false" /> |
77 | halign="center" height="20" label="None" label_selected="None" left="8" | 77 | |
78 | mouse_opaque="true" name="None" scale_image="true" width="100" /> | 78 | |
79 | <check_box bottom="-304" enabled="true" follows="left|top" font="SansSerifSmall" | 79 | <icon name="icon_texture" image_name="inv_item_texture.tga" |
80 | height="16" initial_value="false" label="Always show folders" left="8" | 80 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
81 | mouse_opaque="true" name="check_show_empty" radio_style="false" width="144" /> | 81 | <check_box label="Textures" name="check_texture" |
82 | <check_box bottom="-324" enabled="true" follows="left|top" font="SansSerifSmall" | 82 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
83 | height="16" initial_value="false" label="Since Logoff" left="8" | 83 | font="SansSerifSmall" initial_value="false" /> |
84 | mouse_opaque="true" name="check_since_logoff" radio_style="false" | 84 | |
85 | width="144" /> | 85 | |
86 | <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | 86 | <icon name="icon_snapshot" image_name="inv_item_snapshot.tga" |
87 | bottom="-336" drop_shadow_visible="true" enabled="true" follows="left|top" | 87 | bottom_delta="-20" left="8" height="16" width="16" follows="left|top" /> |
88 | font="SansSerifSmall" h_pad="0" halign="center" height="12" left="8" | 88 | <check_box label="Snapshots" name="check_snapshot" |
89 | mouse_opaque="true" name="- OR -" v_pad="0" width="144"> | 89 | bottom_delta="0" left="26" height="16" width="126" follows="left|top" |
90 | font="SansSerifSmall" initial_value="false" /> | ||
91 | |||
92 | |||
93 | <button label="All" label_selected="All" name="All" | ||
94 | bottom_delta="-24" left="8" height="20" width="100" follows="left|top" | ||
95 | font="SansSerif" halign="center" scale_image="true" /> | ||
96 | |||
97 | <button label="None" label_selected="None" name="None" | ||
98 | bottom_delta="-24" left="8" height="20" width="100" follows="left|top" | ||
99 | font="SansSerif" halign="center" scale_image="true" /> | ||
100 | |||
101 | |||
102 | <check_box label="Always show folders" name="check_show_empty" | ||
103 | bottom_delta="-20" left="8" height="16" width="144" follows="left|top" | ||
104 | font="SansSerifSmall" initial_value="false" /> | ||
105 | |||
106 | |||
107 | <check_box label="Since Logoff" name="check_since_logoff" | ||
108 | bottom_delta="-20" left="8" height="16" width="144" follows="left|top" | ||
109 | font="SansSerifSmall" initial_value="false" /> | ||
110 | |||
111 | |||
112 | <text name="- OR -" type="string" length="1" | ||
113 | bottom_delta="-12" left="8" height="12" width="144" follows="left|top" | ||
114 | halign="center" h_pad="0" v_pad="0" | ||
115 | bg_visible="false" border_drop_shadow_visible="false" | ||
116 | border_visible="false" drop_shadow_visible="true" | ||
117 | font="SansSerifSmall"> | ||
90 | - OR - | 118 | - OR - |
91 | </text> | 119 | </text> |
92 | <spinner bottom="-356" enabled="true" follows="left|top" height="16" increment="1" | 120 | |
93 | initial_val="0" label="Hours Ago" label_width="64" left="8" | 121 | |
94 | max_val="240000" min_val="0" mouse_opaque="true" name="spin_hours_ago" | 122 | <spinner label="Hours Ago" label_width="64" name="spin_hours_ago" |
95 | width="144" /> | 123 | bottom_delta="-20" left="8" height="16" width="144" follows="left|top" |
96 | <spinner bottom="-376" enabled="true" follows="left|top" height="16" increment="1" | 124 | increment="1" initial_val="0" max_val="240000" min_val="0" /> |
97 | initial_val="0" label="Days Ago" label_width="64" left="8" max_val="10000" | 125 | <spinner label="Days Ago" label_width="64" name="spin_days_ago" |
98 | min_val="0" mouse_opaque="true" name="spin_days_ago" width="144" /> | 126 | bottom_delta="-20" left="8" width="144" height="16" follows="left|top" |
99 | <button bottom="-400" enabled="true" follows="top|right" font="SansSerif" | 127 | increment="1" initial_val="0" max_val="10000" min_val="0" /> |
100 | halign="center" height="20" label="Close" label_selected="Close" | 128 | |
101 | mouse_opaque="true" name="Close" right="-6" scale_image="true" width="76" /> | 129 | |
130 | <button label="Close" label_selected="Close" name="Close" | ||
131 | bottom="-420" right="-6" height="20" width="76" follows="top|right" | ||
132 | font="SansSerif" halign="center" scale_image="true" /> | ||
102 | </floater> | 133 | </floater> |
diff --git a/linden/install.xml b/linden/install.xml index 4d2b5d0..fd8f6ff 100644 --- a/linden/install.xml +++ b/linden/install.xml | |||
@@ -390,13 +390,6 @@ | |||
390 | <key>url</key> | 390 | <key>url</key> |
391 | <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-linux-20080817.tar.bz2</uri> | 391 | <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-linux-20080817.tar.bz2</uri> |
392 | </map> | 392 | </map> |
393 | <key>windows</key> | ||
394 | <map> | ||
395 | <key>md5sum</key> | ||
396 | <string>3d5e29d444dde4815b36082eedfc775a</string> | ||
397 | <key>url</key> | ||
398 | <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glib-2.0-windows-20080817.tar.bz2</uri> | ||
399 | </map> | ||
400 | </map> | 393 | </map> |
401 | </map> | 394 | </map> |
402 | <key>google</key> | 395 | <key>google</key> |