diff options
Diffstat (limited to 'indra')
24 files changed, 220 insertions, 45 deletions
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index ef0d4c1c03..58aeb61728 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -78,6 +78,7 @@ LLComboBox::ItemParams::ItemParams() LLComboBox::Params::Params() : allow_text_entry("allow_text_entry", false), + allow_new_values("allow_new_values", false), show_text_as_tentative("show_text_as_tentative", true), max_chars("max_chars", 20), list_position("list_position", BELOW), @@ -97,6 +98,7 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p) mTextEntryTentative(p.show_text_as_tentative), mHasAutocompletedText(false), mAllowTextEntry(p.allow_text_entry), + mAllowNewValues(p.allow_new_values), mMaxChars(p.max_chars), mPrearrangeCallback(p.prearrange_callback()), mTextEntryCallback(p.text_entry_callback()), @@ -621,7 +623,15 @@ void LLComboBox::hideList() if (mList->getVisible()) { // assert selection in list - mList->selectNthItem(mLastSelectedIndex); + if(mAllowNewValues) + { + // mLastSelectedIndex = -1 means that we entered a new value, don't select + // any of existing items in this case. + if(mLastSelectedIndex >= 0) + mList->selectNthItem(mLastSelectedIndex); + } + else + mList->selectNthItem(mLastSelectedIndex); mButton->setToggleState(FALSE); mList->setVisible(FALSE); diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index 018d472d62..68cbfeeeeb 100644 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -78,7 +78,8 @@ public: : public LLInitParam::Block<Params, LLUICtrl::Params> { Optional<bool> allow_text_entry, - show_text_as_tentative; + show_text_as_tentative, + allow_new_values; Optional<S32> max_chars; Optional<commit_callback_t> prearrange_callback, text_entry_callback, @@ -224,6 +225,7 @@ protected: private: BOOL mAllowTextEntry; + BOOL mAllowNewValues; S32 mMaxChars; BOOL mTextEntryTentative; commit_callback_t mPrearrangeCallback; diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp index 5243f67a76..29f78f6290 100644 --- a/indra/llui/lldockablefloater.cpp +++ b/indra/llui/lldockablefloater.cpp @@ -34,10 +34,14 @@ #include "lldockablefloater.h" +//static +LLDockableFloater* LLDockableFloater::instance = NULL; + LLDockableFloater::LLDockableFloater(LLDockControl* dockControl, const LLSD& key, const Params& params) : LLFloater(key, params), mDockControl(dockControl) { + resetInstance(); } LLDockableFloater::~LLDockableFloater() @@ -51,12 +55,42 @@ BOOL LLDockableFloater::postBuild() return LLView::postBuild(); } +void LLDockableFloater::resetInstance() +{ + if (instance != this) + { + if (instance != NULL && instance->isDocked()) + { + //closeFloater() is not virtual + if (instance->canClose()) + { + instance->closeFloater(); + } + else + { + instance->setVisible(FALSE); + } + } + instance = this; + } +} + +void LLDockableFloater::setVisible(BOOL visible) +{ + if(visible && isDocked()) + { + resetInstance(); + } + LLFloater::setVisible(visible); +} + void LLDockableFloater::setDocked(bool docked, bool pop_on_undock) { if (mDockControl.get() != NULL) { if (docked) { + resetInstance(); mDockControl.get()->on(); } else diff --git a/indra/llui/lldockablefloater.h b/indra/llui/lldockablefloater.h index da86889c33..b977888803 100644 --- a/indra/llui/lldockablefloater.h +++ b/indra/llui/lldockablefloater.h @@ -52,6 +52,14 @@ public: /* virtula */BOOL postBuild(); /* virtual */void setDocked(bool docked, bool pop_on_undock = true); /* virtual */void draw(); + /*virtual*/ void setVisible(BOOL visible); + +private: + /** + * Provides unique of dockable floater. + * If dockable floater already exists it should be closed. + */ + void resetInstance(); protected: void setDockControl(LLDockControl* dockControl); @@ -61,6 +69,7 @@ protected: private: std::auto_ptr<LLDockControl> mDockControl; LLUIImagePtr mDockTongue; + static LLDockableFloater* instance; }; #endif /* LL_DOCKABLEFLOATER_H */ diff --git a/indra/llui/llfiltereditor.cpp b/indra/llui/llfiltereditor.cpp index 7d6a4007a2..26b5f2e182 100644 --- a/indra/llui/llfiltereditor.cpp +++ b/indra/llui/llfiltereditor.cpp @@ -44,6 +44,7 @@ LLFilterEditor::LLFilterEditor(const LLFilterEditor::Params& p) line_editor_p.rect(getLocalRect()); line_editor_p.follows.flags(FOLLOWS_ALL); line_editor_p.text_pad_right(getRect().getHeight()); + line_editor_p.revert_on_esc(false); line_editor_p.keystroke_callback(boost::bind(&LLUICtrl::onCommit, this)); mFilterEditor = LLUICtrlFactory::create<LLLineEditor>(line_editor_p); diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 5435b9ffbf..ede67ad17d 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -97,6 +97,7 @@ LLLineEditor::Params::Params() background_image_focused("background_image_focused"), select_on_focus("select_on_focus", false), handle_edit_keys_directly("handle_edit_keys_directly", false), + revert_on_esc("revert_on_esc", true), commit_on_focus_lost("commit_on_focus_lost", true), ignore_tab("ignore_tab", true), cursor_color("cursor_color"), @@ -130,7 +131,7 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p) mMinHPixels(0), // computed in updateTextPadding() below mMaxHPixels(0), // computed in updateTextPadding() below mCommitOnFocusLost( p.commit_on_focus_lost ), - mRevertOnEsc( TRUE ), + mRevertOnEsc( p.revert_on_esc ), mKeystrokeCallback( p.keystroke_callback() ), mIsSelecting( FALSE ), mSelectionStart( 0 ), diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 0986ce5a87..a024f48cc6 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -90,6 +90,7 @@ public: Optional<bool> select_on_focus, handle_edit_keys_directly, + revert_on_esc, commit_on_focus_lost, ignore_tab; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 2bc4f009cc..e0bb6bd5d3 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -3371,6 +3371,34 @@ BOOL LLMenuHolderGL::handleRightMouseUp( S32 x, S32 y, MASK mask ) return handled; } +BOOL LLMenuHolderGL::handleKey(KEY key, MASK mask, BOOL called_from_parent) +{ + BOOL handled = false; + LLMenuGL* const pMenu = dynamic_cast<LLMenuGL*>(getVisibleMenu()); + + if (pMenu) + { + //handle ESCAPE and RETURN key + handled = LLPanel::handleKey(key, mask, called_from_parent); + if (!handled) + { + if (pMenu->getHighlightedItem()) + { + handled = pMenu->handleKey(key, mask, TRUE); + } + else + { + //highlight first enabled one + pMenu->highlightNextItem(NULL); + handled = true; + } + } + } + + return handled; + +} + void LLMenuHolderGL::reshape(S32 width, S32 height, BOOL called_from_parent) { if (width != getRect().getWidth() || height != getRect().getHeight()) @@ -3380,17 +3408,17 @@ void LLMenuHolderGL::reshape(S32 width, S32 height, BOOL called_from_parent) LLView::reshape(width, height, called_from_parent); } -BOOL LLMenuHolderGL::hasVisibleMenu() const +LLView* const LLMenuHolderGL::getVisibleMenu() const { for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it) { LLView* viewp = *child_it; if (viewp->getVisible() && dynamic_cast<LLMenuBarGL*>(viewp) == NULL) { - return TRUE; + return viewp; } } - return FALSE; + return NULL; } diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 0bf6301f93..8309fedf7f 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -772,8 +772,10 @@ public: // Close context menus on right mouse up not handled by menus. /*virtual*/ BOOL handleRightMouseUp( S32 x, S32 y, MASK mask ); + virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); virtual const LLRect getMenuRect() const { return getLocalRect(); } - virtual BOOL hasVisibleMenu() const; + LLView*const getVisibleMenu() const; + virtual BOOL hasVisibleMenu() const {return getVisibleMenu() != NULL;} static void setActivatedItem(LLMenuItemGL* item); diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index bbf8e86660..49a49499ef 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -350,7 +350,7 @@ public: void sortOnce(S32 column, BOOL ascending); // manually call this whenever editing list items in place to flag need for resorting - void setNeedsSort() { mSorted = false; } + void setNeedsSort(bool val = true) { mSorted = !val; } void dirtyColumns(); // some operation has potentially affected column layout or ordering protected: diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index b47787bd5f..d166715038 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -37,12 +37,12 @@ #include "llchiclet.h" #include "llfloaterreg.h" #include "llflyoutbutton.h" +#include "llimpanel.h" // for LLIMFloater #include "lllayoutstack.h" #include "llnearbychatbar.h" #include "llsplitbutton.h" #include "llsyswellwindow.h" #include "llfloatercamera.h" -#include "llimpanel.h" LLBottomTray::LLBottomTray(const LLSD&) : mChicletPanel(NULL), @@ -119,6 +119,7 @@ void LLBottomTray::onChicletClick(LLUICtrl* ctrl) } } +// *TODO Vadim: why void* ? void* LLBottomTray::createNearbyChatBar(void* userdata) { return new LLNearbyChatBar(); @@ -126,30 +127,19 @@ void* LLBottomTray::createNearbyChatBar(void* userdata) LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id) { - if(session_id.isNull()) - { - return NULL; - } - - LLFloaterIMPanel* im = LLIMMgr::getInstance()->findFloaterBySession(session_id); - if (!im) - { - return NULL; //should never happen - } + LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(session_id); - switch(im->getDialogType()) + switch (im_chiclet_type) { - case IM_NOTHING_SPECIAL: + case LLIMChiclet::TYPE_IM: return getChicletPanel()->createChiclet<LLIMP2PChiclet>(session_id); - break; - case IM_SESSION_GROUP_START: - case IM_SESSION_INVITE: + case LLIMChiclet::TYPE_GROUP: return getChicletPanel()->createChiclet<LLIMGroupChiclet>(session_id); - break; - default: - return NULL; + case LLIMChiclet::TYPE_UNKNOWN: break; } + + return NULL; } //virtual @@ -273,4 +263,10 @@ void LLBottomTray::showCameraAndMoveControls(BOOL visible) { mCamPanel->setVisible(visible); mMovementPanel->setVisible(visible); + + if (!visible) + { + LLFloaterReg::hideFloaterInstance("moveview"); + LLFloaterReg::hideFloaterInstance("camera"); + } } diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index e54b068d47..9ce194c712 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -214,6 +214,37 @@ void LLIMChiclet::draw() gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, LLColor4(0.0f,0.0f,0.0f,1.f), FALSE); } +// static +LLIMChiclet::EType LLIMChiclet::getIMSessionType(const LLUUID& session_id) +{ + EType type = TYPE_UNKNOWN; + LLFloaterIMPanel* im = NULL; + + if(session_id.isNull()) + return type; + + if (!(im = LLIMMgr::getInstance()->findFloaterBySession(session_id))) + { + llassert_always(0 && "IM session not found"); // should never happen + return type; + } + + switch(im->getDialogType()) + { + case IM_NOTHING_SPECIAL: + type = TYPE_IM; + break; + case IM_SESSION_GROUP_START: + case IM_SESSION_INVITE: + type = TYPE_GROUP; + break; + default: + break; + } + + return type; +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -224,6 +255,7 @@ LLIMP2PChiclet::Params::Params() , speaker("speaker") , show_speaker("show_speaker") { + // *TODO Vadim: Get rid of hardcoded values. rect(LLRect(0, 25, 45, 0)); avatar_icon.name("avatar_icon"); @@ -1028,11 +1060,14 @@ BOOL LLChicletPanel::handleScrollWheel(S32 x, S32 y, S32 clicks) ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// +// *TODO Vadim: Move this out of llchiclet.cpp. + LLTalkButton::Params::Params() : speak_button("speak_button") , show_button("show_button") , monitor("monitor") { + // *TODO Vadim: move hardcoded labels (!) and other params to XUI. speak_button.name("left"); speak_button.label("Speak"); speak_button.label_selected("Speak"); diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index f96dfb69ec..91f55915ed 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -272,6 +272,11 @@ private: class LLIMChiclet : public LLChiclet { public: + enum EType { + TYPE_UNKNOWN, + TYPE_IM, + TYPE_GROUP + }; /*virtual*/ ~LLIMChiclet() {}; @@ -307,6 +312,19 @@ public: /*virtual*/ void draw(); /** + * Determine whether given ID refers to a group or an IM chat session. + * + * This is used when we need to chose what IM chiclet (P2P/group) + * class to instantiate. + * + * @param session_id session ID. + * @return TYPE_GROUP in case of group chat session, + * TYPE_IM in case of P2P session, + * TYPE_UNKNOWN otherwise. + */ + static EType getIMSessionType(const LLUUID& session_id); + + /** * The action taken on mouse down event. * * Made public so that it can be triggered from outside @@ -368,7 +386,7 @@ public: Params(); }; - void setOtherParticipantId(const LLUUID& other_participant_id); + /* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id); /*virtual*/ void setShowSpeaker(bool show); diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index 73d3a60701..cddc67cb0a 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -77,14 +77,20 @@ BOOL LLGroupList::update(const std::string& name_filter) const LLGroupData& group_data = gAgent.mGroups.get(i); if (name_filter != LLStringUtil::null && !findInsensitive(group_data.mName, name_filter)) continue; - addItem(id, group_data.mName, highlight_id == id, ADD_BOTTOM); + addItem(id, group_data.mName, highlight_id == id, ADD_BOTTOM); // ADD_SORTED can only sort by first column anyway } + // Force sorting the list. + updateSort(); + // add "none" to list at top { std::string loc_none = LLTrans::getString("GroupsNone"); if (name_filter == LLStringUtil::null || findInsensitive(loc_none, name_filter)) addItem(LLUUID::null, loc_none, highlight_id.isNull(), ADD_TOP); + + // Prevent the "none" item from being sorted. + setNeedsSort(false); } group_list->selectByValue(highlight_id); diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index d8c89690e8..1d9220cf3d 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -324,7 +324,7 @@ BOOL LLLocationInputCtrl::handleKeyHere(KEY key, MASK mask) { BOOL result = LLComboBox::handleKeyHere(key, mask); - if (key == KEY_DOWN && hasFocus() && mList->getItemCount() != 0) + if (key == KEY_DOWN && hasFocus() && mList->getItemCount() != 0 && !mList->getVisible()) { showList(); } diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index c283b3a05f..0da572dd24 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -300,8 +300,8 @@ void LLNavigationBar::onSearchCommit() if(!search_query.empty()) { LLSearchHistory::getInstance()->addEntry(search_query); - invokeSearch(mSearchComboBox->getValue().asString()); } + invokeSearch(search_query); } void LLNavigationBar::onTeleportHistoryMenuItemClicked(const LLSD& userdata) diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp index c903f40f3f..29d31e8b56 100644 --- a/indra/newview/llsearchcombobox.cpp +++ b/indra/newview/llsearchcombobox.cpp @@ -152,19 +152,16 @@ void LLSearchComboBox::onSelectionCommit() { std::string search_query = getSimple(); LLStringUtil::trim(search_query); - if(search_query.empty()) - { - mTextEntry->setText(search_query); - setControlValue(search_query); - - return; - } - remove(search_query); - add(search_query, ADD_TOP); mTextEntry->setText(search_query); setControlValue(search_query); + if(!search_query.empty()) + { + remove(search_query); + add(search_query, ADD_TOP); + } + LLUICtrl::onCommit(); } diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 2ff0c6833c..98428bf0f7 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -181,7 +181,7 @@ void LLSysWellWindow::setVisible(BOOL visible) if(mChannel) mChannel->setShowToasts(!visible); - LLFloater::setVisible(visible); + LLDockableFloater::setVisible(visible); } //--------------------------------------------------------------------------------- @@ -331,11 +331,28 @@ void LLSysWellWindow::sessionRemoved(const LLUUID& sessionId) //--------------------------------------------------------------------------------- LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId) : - LLScrollingPanel(LLPanel::Params()), mParent(parent) + LLScrollingPanel(LLPanel::Params()), mChiclet(NULL), mParent(parent) { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_activeim_row.xml", NULL); - mChiclet = getChild<LLIMChiclet>("chiclet"); + // Choose which of the pre-created chiclets (IM/group) to use. + // The other one gets hidden. + + LLIMChiclet::EType im_chiclet_type = LLIMChiclet::getIMSessionType(sessionId); + switch (im_chiclet_type) + { + case LLIMChiclet::TYPE_GROUP: + mChiclet = getChild<LLIMChiclet>("group_chiclet"); + childSetVisible("p2p_chiclet", false); + break; + case LLIMChiclet::TYPE_UNKNOWN: // assign mChiclet a non-null value anyway + case LLIMChiclet::TYPE_IM: + mChiclet = getChild<LLIMChiclet>("p2p_chiclet"); + childSetVisible("group_chiclet", false); + break; + } + + // Initialize chiclet. mChiclet->setCounter(chicletCounter); mChiclet->setSessionId(sessionId); mChiclet->setIMSessionName(name); diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index ef0974b428..d76147b489 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -69,6 +69,7 @@ public: virtual void setVisible(BOOL visible); void adjustWindowPosition(); void toggleWindow(); + /*virtua*/BOOL canClose() { return FALSE; } // Handlers void onItemClick(LLSysWellItem* item); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index a088006c53..e5d0e3ebb2 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2073,6 +2073,11 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) { return TRUE; } + //some of context menus use this container, let context menu handle navigation keys + if(gMenuHolder && gMenuHolder->handleKey(key, mask, TRUE)) + { + return TRUE; + } // Traverses up the hierarchy LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus(); diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml index f5af8e7b30..4dc4a9ff46 100644 --- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml +++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml @@ -11,7 +11,7 @@ bevel_style="in" bg_alpha_color="0 0 0 0"> <chiclet_im_p2p - name="chiclet" + name="p2p_chiclet" layout="topleft" follows="left" top="5" @@ -19,6 +19,15 @@ height="25" width="45"> </chiclet_im_p2p> + <chiclet_im_group + name="group_chiclet" + layout="topleft" + follows="left" + top="5" + left="5" + height="25" + width="45"> + </chiclet_im_group> <text type="string" name="contact_name" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 79ca839f28..df91920721 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -33,12 +33,13 @@ top="0" width="5"/> <layout_panel + auto_resize="false" follows="left|right" height="28" layout="topleft" left="5" min_height="28" - width="500" + width="600" top="0" min_width="305" name="chat_bar" diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 297a3762f6..a37ed76c51 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -17,6 +17,7 @@ show_text_as_tentative="false" max_chars="20" follows="left|top" + allow_new_values="true" > <info_button name="Place Information" label="" diff --git a/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml index a03d90876a..6e73e997e0 100644 --- a/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml @@ -5,6 +5,7 @@ show_text_as_tentative="false" dropdown_button_visible="false" max_chars="256" + allow_new_values="true" background_image="TextField_Search_Off" background_image_disabled="TextField_Search_Disabled" background_image_focused="TextField_Search_Active"> |