From 0247cd6aebd85d578b14778f20866616ef3ab05f Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Thu, 3 Mar 2011 20:49:42 +0200 Subject: STORM-236 FIXED Allow the "Speak" button to be removed, like other buttons. Cumulative diff of changes made by Wolfpup, Richard and me. Description: * Ability to hide the Speak button with the bottom tray context menu. * Made the chat input resize handle visible, so that the feature is easily discoverable. * Applied Richard's fix to layout panel resizing logic. --- indra/newview/llbottomtray.cpp | 58 +++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 9 deletions(-) (limited to 'indra/newview/llbottomtray.cpp') diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 35e4548483..4bafe70705 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -67,10 +67,14 @@ BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask) { if (mCanDrag) { - S32 screenX, screenY; - localPointToScreen(x, y, &screenX, &screenY); - // pass hover to bottomtray - LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY); + // pass hover to bottomtray + S32 screenX, screenY; + localPointToScreen(x, y, &screenX, &screenY); + LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY); + + // Reset cursor in case you move your mouse from the drag handle to a button. + getWindow()->setCursor(UI_CURSOR_ARROW); + return TRUE; } else @@ -505,6 +509,22 @@ void LLBottomTray::showSnapshotButton(BOOL visible) setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible); } +void LLBottomTray::showSpeakButton(bool visible) +{ + setTrayButtonVisible(RS_BUTTON_SPEAK, visible); + + // Adjust other panels. + const S32 panel_width = mSpeakPanel->getRect().getWidth(); + if (visible) + { + processWidthDecreased(-panel_width); + } + else + { + processWidthIncreased(panel_width); + } +} + void LLBottomTray::toggleMovementControls() { if (mMovementButton) @@ -698,6 +718,7 @@ void LLBottomTray::updateButtonsOrdersAfterDnD() if (!landing_state_found) landing_state = RS_BUTTON_SPEAK; mButtonsOrder.insert(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), landing_state), dragged_state); } + // Synchronize button process order with their order resize_state_vec_t::const_iterator it1 = mButtonsOrder.begin(); const resize_state_vec_t::const_iterator it_end1 = mButtonsOrder.end(); @@ -774,11 +795,12 @@ void LLBottomTray::loadButtonsOrder() // placing panels in layout stack according to button order which we loaded in previous for for (resize_state_vec_t::const_reverse_iterator it = mButtonsOrder.rbegin(); it != it_end; ++it, ++i) { - LLPanel* panel_to_move = *it == RS_BUTTON_SPEAK ? mSpeakPanel : mStateProcessedObjectMap[*it]; + LLPanel* panel_to_move = getButtonPanel(*it); mToolbarStack->movePanel(panel_to_move, NULL, true); // prepend } // Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it // manually here + mToolbarStack->movePanel(getChild("chat_bar_resize_handle_panel"), NULL, true); mToolbarStack->movePanel(mChatBarContainer, NULL, true); } @@ -1273,7 +1295,6 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_ // then shrink Speak button if (required_width < 0) { - S32 panel_min_width = 0; std::string panel_name = mSpeakPanel->getName(); bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width); @@ -1521,13 +1542,13 @@ void LLBottomTray::initResizeStateContainers() // ... and add Speak button because it also can be shrunk. mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth(); - } // this method must be called before restoring of the chat entry field on startup // because it resets chatbar's width according to resize logic. void LLBottomTray::initButtonsVisibility() { + setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat")); setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton")); setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton")); setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton")); @@ -1540,6 +1561,7 @@ void LLBottomTray::initButtonsVisibility() void LLBottomTray::setButtonsControlsAndListeners() { + gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2)); gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2)); gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2)); gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2)); @@ -1568,8 +1590,7 @@ bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, cons void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible) { - llassert(mStateProcessedObjectMap[shown_object_type] != NULL); - LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; + LLPanel* panel = getButtonPanel(shown_object_type); if (NULL == panel) { lldebugs << "There is no object to show for state: " << shown_object_type << llendl; @@ -1592,6 +1613,14 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible) { + // The Speak button is treated specially: if voice is enabled, + // the button should be displayed no matter how much space we've got. + if (object_type == RS_BUTTON_SPEAK) + { + showSpeakButton(visible); + return true; + } + LLPanel* cur_panel = mStateProcessedObjectMap[object_type]; if (NULL == cur_panel) { @@ -1695,6 +1724,17 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible return is_set; } +LLPanel* LLBottomTray::getButtonPanel(EResizeState button_type) +{ + if (button_type == RS_BUTTON_SPEAK) + { + return mSpeakPanel; + } + + llassert(mStateProcessedObjectMap[button_type] != NULL); + return mStateProcessedObjectMap[button_type]; +} + void LLBottomTray::showWellButton(EResizeState object_type, bool visible) { llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type ); -- cgit v1.2.3 From 211465b77282ec5981f8b052c9ff8d4277a10d5f Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Fri, 4 Mar 2011 13:46:57 +0200 Subject: STORM-236 WIP Minor code improvements. - To decrease code duplication: * Added RS_BUTTON_SPEAK to the button->panel mapping (mStateProcessedObjectMap). * Replaces all lookups in mStateProcessedObjectMap with calls to getButtonPanel(). - Added some comments. --- indra/newview/llbottomtray.cpp | 81 +++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 25 deletions(-) (limited to 'indra/newview/llbottomtray.cpp') diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 4bafe70705..7139b0ea0e 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -511,9 +511,10 @@ void LLBottomTray::showSnapshotButton(BOOL visible) void LLBottomTray::showSpeakButton(bool visible) { + // Show/hide the button setTrayButtonVisible(RS_BUTTON_SPEAK, visible); - // Adjust other panels. + // and adjust other panels according to the occupied/freed space. const S32 panel_width = mSpeakPanel->getRect().getWidth(); if (visible) { @@ -687,10 +688,7 @@ void LLBottomTray::updateButtonsOrdersAfterDnD() // (and according to future possible changes in the way button order is saved between sessions). state_object_map_t::const_iterator it = mStateProcessedObjectMap.begin(); state_object_map_t::const_iterator it_end = mStateProcessedObjectMap.end(); - // Speak button is currently the only draggable button not in mStateProcessedObjectMap, - // so if dragged_state is not found in that map, it should be RS_BUTTON_SPEAK. Change this code if any other - // exclusions from mStateProcessedObjectMap will become draggable. - EResizeState dragged_state = RS_BUTTON_SPEAK; + EResizeState dragged_state = RS_NORESIZE; EResizeState landing_state = RS_NORESIZE; bool landing_state_found = false; // Find states for dragged item and landing tab @@ -706,7 +704,17 @@ void LLBottomTray::updateButtonsOrdersAfterDnD() landing_state_found = true; } } - + + if (dragged_state == RS_NORESIZE) + { + llwarns << "Cannot determine what button is being dragged" << llendl; + llassert(dragged_state != RS_NORESIZE); + return; + } + + lldebugs << "Will place " << resizeStateToString(dragged_state) + << " before " << resizeStateToString(landing_state) << llendl; + // Update order of buttons according to drag'n'drop mButtonsOrder.erase(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), dragged_state)); if (!landing_state_found && mLandingTab == getChild(PANEL_CHICLET_NAME)) @@ -715,7 +723,7 @@ void LLBottomTray::updateButtonsOrdersAfterDnD() } else { - if (!landing_state_found) landing_state = RS_BUTTON_SPEAK; + if (!landing_state_found) landing_state = RS_BUTTON_SPEAK; // just a random fallback mButtonsOrder.insert(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), landing_state), dragged_state); } @@ -799,7 +807,7 @@ void LLBottomTray::loadButtonsOrder() mToolbarStack->movePanel(panel_to_move, NULL, true); // prepend } // Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it - // manually here + // (along with its drag handle) manually here. mToolbarStack->movePanel(getChild("chat_bar_resize_handle_panel"), NULL, true); mToolbarStack->movePanel(mChatBarContainer, NULL, true); } @@ -1200,9 +1208,8 @@ void LLBottomTray::processShowButtons(S32& available_width) bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width) { lldebugs << "Trying to show object type: " << shown_object_type << llendl; - llassert(mStateProcessedObjectMap[shown_object_type] != NULL); - LLPanel* panel = mStateProcessedObjectMap[shown_object_type]; + LLPanel* panel = getButtonPanel(shown_object_type); if (NULL == panel) { lldebugs << "There is no object to process for state: " << shown_object_type << llendl; @@ -1248,9 +1255,7 @@ void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_wi void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width) { lldebugs << "Trying to hide object type: " << processed_object_type << llendl; - llassert(mStateProcessedObjectMap[processed_object_type] != NULL); - - LLPanel* panel = mStateProcessedObjectMap[processed_object_type]; + LLPanel* panel = getButtonPanel(processed_object_type); if (NULL == panel) { lldebugs << "There is no object to process for state: " << processed_object_type << llendl; @@ -1330,8 +1335,7 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& required_width) { - llassert(mStateProcessedObjectMap[processed_object_type] != NULL); - LLPanel* panel = mStateProcessedObjectMap[processed_object_type]; + LLPanel* panel = getButtonPanel(processed_object_type); if (NULL == panel) { lldebugs << "There is no object to process for type: " << processed_object_type << llendl; @@ -1432,8 +1436,7 @@ void LLBottomTray::processExtendButtons(S32& available_width) void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width) { - llassert(mStateProcessedObjectMap[processed_object_type] != NULL); - LLPanel* panel = mStateProcessedObjectMap[processed_object_type]; + LLPanel* panel = getButtonPanel(processed_object_type); if (NULL == panel) { lldebugs << "There is no object to process for type: " << processed_object_type << llendl; @@ -1501,6 +1504,7 @@ bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const void LLBottomTray::initResizeStateContainers() { // init map with objects should be processed for each type + mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild("speak_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild("gesture_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild("movement_panel"))); mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild("cam_panel"))); @@ -1533,11 +1537,11 @@ void LLBottomTray::initResizeStateContainers() { const EResizeState button_type = *it; // is there an appropriate object? - llassert(mStateProcessedObjectMap.count(button_type) > 0); - if (0 == mStateProcessedObjectMap.count(button_type)) continue; + LLPanel* button_panel = getButtonPanel(button_type); + if (!button_panel) continue; // set default width for it. - mObjectDefaultWidthMap[button_type] = mStateProcessedObjectMap[button_type]->getRect().getWidth(); + mObjectDefaultWidthMap[button_type] = button_panel->getRect().getWidth(); } // ... and add Speak button because it also can be shrunk. @@ -1621,7 +1625,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible return true; } - LLPanel* cur_panel = mStateProcessedObjectMap[object_type]; + LLPanel* cur_panel = getButtonPanel(object_type); if (NULL == cur_panel) { lldebugs << "There is no object to process for state: " << object_type << llendl; @@ -1666,7 +1670,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible for (; it != it_end; ++it) { - LLPanel * cur_panel = mStateProcessedObjectMap[*it]; + LLPanel* cur_panel = getButtonPanel(*it); sum_of_min_widths += get_panel_min_width(mToolbarStack, cur_panel); sum_of_curr_widths += get_curr_width(cur_panel); } @@ -1726,12 +1730,14 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible LLPanel* LLBottomTray::getButtonPanel(EResizeState button_type) { - if (button_type == RS_BUTTON_SPEAK) + // Don't use the operator[] because it inserts a NULL value if the key is not found. + if (mStateProcessedObjectMap.count(button_type) == 0) { - return mSpeakPanel; + llwarns << "Cannot find a panel for " << resizeStateToString(button_type) << llendl; + llassert(mStateProcessedObjectMap.count(button_type) == 1); + return NULL; } - llassert(mStateProcessedObjectMap[button_type] != NULL); return mStateProcessedObjectMap[button_type]; } @@ -1792,4 +1798,29 @@ void LLBottomTray::processChatbarCustomization(S32 new_width) } } +// static +std::string LLBottomTray::resizeStateToString(EResizeState state) +{ + switch (state) + { + case RS_NORESIZE: return "RS_NORESIZE"; + case RS_CHICLET_PANEL: return "RS_CHICLET_PANEL"; + case RS_CHATBAR_INPUT: return "RS_CHATBAR_INPUT"; + case RS_BUTTON_SNAPSHOT: return "RS_BUTTON_SNAPSHOT"; + case RS_BUTTON_CAMERA: return "RS_BUTTON_CAMERA"; + case RS_BUTTON_MOVEMENT: return "RS_BUTTON_MOVEMENT"; + case RS_BUTTON_GESTURES: return "RS_BUTTON_GESTURES"; + case RS_BUTTON_SPEAK: return "RS_BUTTON_SPEAK"; + case RS_IM_WELL: return "RS_IM_WELL"; + case RS_NOTIFICATION_WELL: return "RS_NOTIFICATION_WELL"; + case RS_BUTTON_BUILD: return "RS_BUTTON_BUILD"; + case RS_BUTTON_SEARCH: return "RS_BUTTON_SEARCH"; + case RS_BUTTON_WORLD_MAP: return "RS_BUTTON_WORLD_MAP"; + case RS_BUTTON_MINI_MAP: return "RS_BUTTON_MINI_MAP"; + case RS_BUTTONS_CAN_BE_HIDDEN: return "RS_BUTTONS_CAN_BE_HIDDEN"; + // No default to track additions. + } + return "UNKNOWN_BUTTON"; +} + //EOF -- cgit v1.2.3 From 176b025a26e11fa9133a4a4c9fbc2cfa4f7cf616 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Fri, 4 Mar 2011 19:10:54 +0200 Subject: STORM-236 WIP Additional fixes. Fixed: * Wrong ability to place a button between the chat input and the drag handle (thanks Wolfpup!). * Broken drag-n-drop cursors. --- indra/newview/llbottomtray.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'indra/newview/llbottomtray.cpp') diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 7139b0ea0e..d8ec4b605c 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -72,9 +72,6 @@ BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask) localPointToScreen(x, y, &screenX, &screenY); LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY); - // Reset cursor in case you move your mouse from the drag handle to a button. - getWindow()->setCursor(UI_CURSOR_ARROW); - return TRUE; } else @@ -204,6 +201,7 @@ LLBottomTray::LLBottomTray(const LLSD&) mSpeakBtn(NULL), mNearbyChatBar(NULL), mChatBarContainer(NULL), + mNearbyCharResizeHandlePanel(NULL), mToolbarStack(NULL), mMovementButton(NULL), mResizeState(RS_NORESIZE), @@ -554,6 +552,7 @@ BOOL LLBottomTray::postBuild() LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle()); mChatBarContainer = getChild("chat_bar_layout_panel"); + mNearbyCharResizeHandlePanel = getChild("chat_bar_resize_handle_panel"); mToolbarStack = getChild("toolbar_stack"); mMovementButton = getChild("movement_btn"); @@ -672,12 +671,20 @@ void LLBottomTray::onDraggableButtonHover(S32 x, S32 y) gViewerWindow->getWindow()->setCursor(UI_CURSOR_NO); } } + else + { + // Reset cursor in case you move your mouse from the drag handle to a button. + getWindow()->setCursor(UI_CURSOR_ARROW); + + } } bool LLBottomTray::isCursorOverDraggableArea(S32 x, S32 y) { + // Draggable area lasts from the nearby chat input resize handle + // to the chiclet area (exlusively). bool result = getRect().pointInRect(x, y); - result = result && mNearbyChatBar->calcScreenRect().mRight < x; + result = result && mNearbyCharResizeHandlePanel->calcScreenRect().mRight < x; result = result && mChicletPanel->calcScreenRect().mRight > x; return result; } -- cgit v1.2.3