diff options
Diffstat (limited to 'linden/indra/newview/llfloaterchatterbox.cpp')
-rw-r--r-- | linden/indra/newview/llfloaterchatterbox.cpp | 107 |
1 files changed, 80 insertions, 27 deletions
diff --git a/linden/indra/newview/llfloaterchatterbox.cpp b/linden/indra/newview/llfloaterchatterbox.cpp index 41acc02..2d6eeb3 100644 --- a/linden/indra/newview/llfloaterchatterbox.cpp +++ b/linden/indra/newview/llfloaterchatterbox.cpp | |||
@@ -14,12 +14,12 @@ | |||
14 | * ("GPL"), unless you have obtained a separate licensing agreement | 14 | * ("GPL"), unless you have obtained a separate licensing agreement |
15 | * ("Other License"), formally executed by you and Linden Lab. Terms of | 15 | * ("Other License"), formally executed by you and Linden Lab. Terms of |
16 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | 16 | * the GPL can be found in doc/GPL-license.txt in this distribution, or |
17 | * online at http://secondlife.com/developers/opensource/gplv2 | 17 | * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 |
18 | * | 18 | * |
19 | * There are special exceptions to the terms and conditions of the GPL as | 19 | * There are special exceptions to the terms and conditions of the GPL as |
20 | * it is applied to this Source Code. View the full text of the exception | 20 | * it is applied to this Source Code. View the full text of the exception |
21 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 21 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
22 | * online at http://secondlife.com/developers/opensource/flossexception | 22 | * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception |
23 | * | 23 | * |
24 | * By copying, modifying or distributing this software, you acknowledge | 24 | * By copying, modifying or distributing this software, you acknowledge |
25 | * that you have read and understood your obligations described above, | 25 | * that you have read and understood your obligations described above, |
@@ -86,9 +86,15 @@ LLFloaterMyFriends* LLFloaterMyFriends::showInstance(const LLSD& id) | |||
86 | //static | 86 | //static |
87 | void LLFloaterMyFriends::hideInstance(const LLSD& id) | 87 | void LLFloaterMyFriends::hideInstance(const LLSD& id) |
88 | { | 88 | { |
89 | if(instanceVisible(id)) | 89 | LLFloaterMyFriends* floaterp = LLFloaterMyFriends::getInstance(); |
90 | |||
91 | if(floaterp->getHost()) | ||
90 | { | 92 | { |
91 | LLFloaterChatterBox::hideInstance(LLSD()); | 93 | LLFloaterChatterBox::hideInstance(); |
94 | } | ||
95 | else | ||
96 | { | ||
97 | LLUISingleton<LLFloaterMyFriends>::hideInstance(id); | ||
92 | } | 98 | } |
93 | } | 99 | } |
94 | 100 | ||
@@ -124,10 +130,23 @@ LLFloaterChatterBox::LLFloaterChatterBox(const LLSD& seed) : | |||
124 | mAutoResize = FALSE; | 130 | mAutoResize = FALSE; |
125 | 131 | ||
126 | gUICtrlFactory->buildFloater(this, "floater_chatterbox.xml", NULL, FALSE); | 132 | gUICtrlFactory->buildFloater(this, "floater_chatterbox.xml", NULL, FALSE); |
127 | addFloater(LLFloaterMyFriends::getInstance(0), TRUE); | 133 | if (gSavedSettings.getBOOL("ContactsTornOff")) |
134 | { | ||
135 | LLFloaterMyFriends* floater_contacts = LLFloaterMyFriends::getInstance(0); | ||
136 | // add then remove to set up relationship for re-attach | ||
137 | addFloater(floater_contacts, FALSE); | ||
138 | removeFloater(floater_contacts); | ||
139 | // reparent to floater view | ||
140 | gFloaterView->addChild(floater_contacts); | ||
141 | } | ||
142 | else | ||
143 | { | ||
144 | addFloater(LLFloaterMyFriends::getInstance(0), TRUE); | ||
145 | } | ||
146 | |||
128 | if (gSavedSettings.getBOOL("ChatHistoryTornOff")) | 147 | if (gSavedSettings.getBOOL("ChatHistoryTornOff")) |
129 | { | 148 | { |
130 | LLFloaterChat* floater_chat = LLFloaterChat::getInstance(LLSD()); | 149 | LLFloaterChat* floater_chat = LLFloaterChat::getInstance(); |
131 | // add then remove to set up relationship for re-attach | 150 | // add then remove to set up relationship for re-attach |
132 | addFloater(floater_chat, FALSE); | 151 | addFloater(floater_chat, FALSE); |
133 | removeFloater(floater_chat); | 152 | removeFloater(floater_chat); |
@@ -217,7 +236,7 @@ void LLFloaterChatterBox::draw() | |||
217 | 236 | ||
218 | mActiveVoiceFloater = current_active_floater; | 237 | mActiveVoiceFloater = current_active_floater; |
219 | 238 | ||
220 | LLFloater::draw(); | 239 | LLMultiFloater::draw(); |
221 | } | 240 | } |
222 | 241 | ||
223 | void LLFloaterChatterBox::onOpen() | 242 | void LLFloaterChatterBox::onOpen() |
@@ -236,10 +255,17 @@ void LLFloaterChatterBox::removeFloater(LLFloater* floaterp) | |||
236 | if (floaterp->getName() == "chat floater") | 255 | if (floaterp->getName() == "chat floater") |
237 | { | 256 | { |
238 | // only my friends floater now locked | 257 | // only my friends floater now locked |
239 | mTabContainer->lockTabs(1); | 258 | mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1); |
240 | gSavedSettings.setBOOL("ChatHistoryTornOff", TRUE); | 259 | gSavedSettings.setBOOL("ChatHistoryTornOff", TRUE); |
241 | floaterp->setCanClose(TRUE); | 260 | floaterp->setCanClose(TRUE); |
242 | } | 261 | } |
262 | else if (floaterp->getName() == "floater_my_friends") | ||
263 | { | ||
264 | // only chat floater now locked | ||
265 | mTabContainer->lockTabs(mTabContainer->getNumLockedTabs() - 1); | ||
266 | gSavedSettings.setBOOL("ContactsTornOff", TRUE); | ||
267 | floaterp->setCanClose(TRUE); | ||
268 | } | ||
243 | LLMultiFloater::removeFloater(floaterp); | 269 | LLMultiFloater::removeFloater(floaterp); |
244 | } | 270 | } |
245 | 271 | ||
@@ -247,19 +273,43 @@ void LLFloaterChatterBox::addFloater(LLFloater* floaterp, | |||
247 | BOOL select_added_floater, | 273 | BOOL select_added_floater, |
248 | LLTabContainerCommon::eInsertionPoint insertion_point) | 274 | LLTabContainerCommon::eInsertionPoint insertion_point) |
249 | { | 275 | { |
276 | S32 num_locked_tabs = mTabContainer->getNumLockedTabs(); | ||
277 | |||
278 | // already here | ||
279 | if (floaterp->getHost() == this) return; | ||
280 | |||
250 | // make sure my friends and chat history both locked when re-attaching chat history | 281 | // make sure my friends and chat history both locked when re-attaching chat history |
251 | if (floaterp->getName() == "chat floater") | 282 | if (floaterp->getName() == "chat floater") |
252 | { | 283 | { |
253 | // select my friends tab | 284 | mTabContainer->unlockTabs(); |
254 | mTabContainer->selectFirstTab(); | 285 | // add chat history as second tab if contact window is present, first tab otherwise |
255 | // add chat history to the right of the my friends tab | 286 | if (getChildByName("floater_my_friends", TRUE)) |
256 | //*TODO: respect select_added_floater so that we don't leave first tab selected | 287 | { |
257 | LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::RIGHT_OF_CURRENT); | 288 | // assuming contacts window is first tab, select it |
289 | mTabContainer->selectFirstTab(); | ||
290 | // and add ourselves after | ||
291 | LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::RIGHT_OF_CURRENT); | ||
292 | } | ||
293 | else | ||
294 | { | ||
295 | LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START); | ||
296 | } | ||
297 | |||
258 | // make sure first two tabs are now locked | 298 | // make sure first two tabs are now locked |
259 | mTabContainer->lockTabs(2); | 299 | mTabContainer->lockTabs(num_locked_tabs + 1); |
260 | gSavedSettings.setBOOL("ChatHistoryTornOff", FALSE); | 300 | gSavedSettings.setBOOL("ChatHistoryTornOff", FALSE); |
261 | floaterp->setCanClose(FALSE); | 301 | floaterp->setCanClose(FALSE); |
262 | } | 302 | } |
303 | else if (floaterp->getName() == "floater_my_friends") | ||
304 | { | ||
305 | mTabContainer->unlockTabs(); | ||
306 | // add contacts window as first tab | ||
307 | LLMultiFloater::addFloater(floaterp, select_added_floater, LLTabContainer::START); | ||
308 | // make sure first two tabs are now locked | ||
309 | mTabContainer->lockTabs(num_locked_tabs + 1); | ||
310 | gSavedSettings.setBOOL("ContactsTornOff", FALSE); | ||
311 | floaterp->setCanClose(FALSE); | ||
312 | } | ||
263 | else | 313 | else |
264 | { | 314 | { |
265 | LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point); | 315 | LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point); |
@@ -276,24 +326,27 @@ void LLFloaterChatterBox::addFloater(LLFloater* floaterp, | |||
276 | //static | 326 | //static |
277 | LLFloaterChatterBox* LLFloaterChatterBox::showInstance(const LLSD& seed) | 327 | LLFloaterChatterBox* LLFloaterChatterBox::showInstance(const LLSD& seed) |
278 | { | 328 | { |
279 | LLFloaterChatterBox* floater = LLUISingleton<LLFloaterChatterBox>::showInstance(seed); | 329 | LLFloaterChatterBox* chatterbox_floater = LLUISingleton<LLFloaterChatterBox>::showInstance(seed); |
280 | 330 | ||
281 | // if TRUE, show tab for active voice channel, otherwise, just show last tab | 331 | // if TRUE, show tab for active voice channel, otherwise, just show last tab |
282 | if (seed.asBoolean()) | 332 | LLFloater* floater_to_show = NULL; |
333 | LLUUID session_id = seed.asUUID(); | ||
334 | if (session_id.notNull()) | ||
283 | { | 335 | { |
284 | LLFloater* floater_to_show = getCurrentVoiceFloater(); | 336 | floater_to_show = gIMMgr->findFloaterBySession(session_id); |
285 | if (floater_to_show) | 337 | } |
286 | { | 338 | |
287 | floater_to_show->open(); | 339 | if (floater_to_show) |
288 | } | 340 | { |
289 | else | 341 | floater_to_show->open(); |
290 | { | 342 | } |
291 | // just open chatterbox if there is no active voice window | 343 | else |
292 | LLUISingleton<LLFloaterChatterBox>::getInstance(seed)->open(); | 344 | { |
293 | } | 345 | // just open chatterbox to the last selected tab |
346 | chatterbox_floater->open(); | ||
294 | } | 347 | } |
295 | 348 | ||
296 | return floater; | 349 | return chatterbox_floater; |
297 | } | 350 | } |
298 | 351 | ||
299 | //static | 352 | //static |