summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandreykproductengine <andreykproductengine@lindenlab.com>2019-10-01 22:23:49 +0300
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2020-06-23 14:49:40 +0300
commit04081c0bc882cecb7647648eb035f0f2334bf983 (patch)
tree454b752a597efcfe6079c00b8a8fd91c065e670a
parentaf7cefe031b0680253c7b0c082216af841a10939 (diff)
SL-6109 Better hover and docking of keybinder
-rw-r--r--indra/newview/llfloaterpreference.cpp131
-rw-r--r--indra/newview/llfloaterpreference.h3
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_controls.xml10
3 files changed, 51 insertions, 93 deletions
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index f94a52a232..47cc93175e 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -43,6 +43,7 @@
#include "llcombobox.h"
#include "llcommandhandler.h"
#include "lldirpicker.h"
+#include "lldrawfrustum.h"
#include "lleventtimer.h"
#include "llfeaturemanager.h"
#include "llfocusmgr.h"
@@ -169,14 +170,15 @@ static const U32 ALLOW_MASKS = 16;
static const U32 CAN_IGNORE_MASKS = 32; // For example W (aka Forward) should work regardless of SHIFT being pressed
static const U32 DEFAULT_KEY_FILTER = ALLOW_MOUSE | ALLOW_MASK_MOUSE | ALLOW_KEYS | ALLOW_MASK_KEYS | CAN_IGNORE_MASKS;
-class LLSetKeyBindDialog : public LLModalDialog
+class LLSetKeyBindDialog : public LLModalDialog, public LLDrawFrustum
{
public:
LLSetKeyBindDialog(const LLSD& key);
~LLSetKeyBindDialog();
/*virtual*/ BOOL postBuild();
- /*virtual*/ void onClose(bool app_quiting);
+ /*virtual*/ void onClose(bool app_quiting);
+ /*virtual*/ void draw();
void setParent(LLPanelPreferenceControls* parent, U32 key_mask = DEFAULT_KEY_FILTER);
@@ -271,9 +273,18 @@ void LLSetKeyBindDialog::onClose(bool app_quiting)
LLModalDialog::onClose(app_quiting);
}
+//virtual
+void LLSetKeyBindDialog::draw()
+{
+ LLRect local_rect;
+ drawFrustum(local_rect, this, (LLView*)getDragHandle(), hasFocus());
+ LLModalDialog::draw();
+}
+
void LLSetKeyBindDialog::setParent(LLPanelPreferenceControls* parent, U32 key_mask)
{
pParent = parent;
+ setFrustumOrigin(parent);
mKeyFilterMask = key_mask;
LLTextBase *text_ctrl = getChild<LLTextBase>("descritption");
@@ -3053,9 +3064,7 @@ static const controls_to_icon_t commands_and_headers =
LLPanelPreferenceControls::LLPanelPreferenceControls()
:LLPanelPreference(),
mEditingColumn(-1),
- mEditingMode(0),
- mShowKeyDialog(false),
- mHighlightedCell(NULL)
+ mEditingMode(0)
{
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
{
@@ -3084,41 +3093,6 @@ BOOL LLPanelPreferenceControls::postBuild()
return TRUE;
}
-// Something of a workaround: cells don't handle clicks, so we catch a click, then process it on hover.
-BOOL LLPanelPreferenceControls::handleHover(S32 x, S32 y, MASK mask)
-{
- if (mShowKeyDialog)
- {
- mShowKeyDialog = false;
- if (!mEditingControl.empty()
- && mConflictHandler[mEditingMode].canAssignControl(mEditingControl))
- {
- LLScrollListItem* item = pControlsTable->getFirstSelected(); // don't use pControlsTable->hitItem(x, y) dur to drift;
- if (item)
- {
- mEditingColumn = pControlsTable->getColumnIndexFromOffset(x);
- if (mEditingColumn > 0)
- {
- LLScrollListCell* cell = item->getColumn(mEditingColumn);
- if (cell)
- {
- LLSetKeyBindDialog* dialog = LLFloaterReg::showTypedInstance<LLSetKeyBindDialog>("keybind_dialog", LLSD(), TRUE);
- if (dialog)
- {
- dialog->setParent(this, DEFAULT_KEY_FILTER);
- cell->setHighlighted(true);
- mHighlightedCell = cell;
- pControlsTable->deselectAllItems();
- return TRUE;
- }
- }
- }
- }
- }
- }
- return LLPanelPreference::handleHover(x, y, mask);
-}
-
void LLPanelPreferenceControls::addGroupRow(const std::string &control_name, const std::string &icon)
{
LLScrollListItem::Params item_params;
@@ -3170,13 +3144,7 @@ void LLPanelPreferenceControls::regenerateControls()
void LLPanelPreferenceControls::populateControlTable()
{
pControlsTable->clearRows();
-
- if (mHighlightedCell)
- {
- mHighlightedCell->setHighlighted(false);
- mHighlightedCell = NULL;
- }
-
+
// todo: subsections need sorting?
std::string label, control_name;
LLScrollListCell::Params cell_params;
@@ -3243,6 +3211,7 @@ void LLPanelPreferenceControls::addSeparator()
void LLPanelPreferenceControls::updateTable()
{
+ pControlsTable->deselectAllItems();
mEditingControl.clear();
std::vector<LLScrollListItem*> list = pControlsTable->getAllData();
for (S32 i = 0; i < list.size(); ++i)
@@ -3258,12 +3227,6 @@ void LLPanelPreferenceControls::updateTable()
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, 2));
}
}
-
- if (mHighlightedCell)
- {
- mHighlightedCell->setHighlighted(false);
- mHighlightedCell = NULL;
- }
}
void LLPanelPreferenceControls::apply()
@@ -3275,11 +3238,6 @@ void LLPanelPreferenceControls::apply()
mConflictHandler[i].saveToSettings();
}
}
- if (mHighlightedCell)
- {
- mHighlightedCell->setHighlighted(false);
- mHighlightedCell = NULL;
- }
}
void LLPanelPreferenceControls::cancel()
@@ -3292,11 +3250,6 @@ void LLPanelPreferenceControls::cancel()
}
}
pControlsTable->clear();
- if (mHighlightedCell)
- {
- mHighlightedCell->setHighlighted(false);
- mHighlightedCell = NULL;
- }
}
void LLPanelPreferenceControls::saveSettings()
@@ -3315,11 +3268,6 @@ void LLPanelPreferenceControls::saveSettings()
{
regenerateControls();
}
- else if (mHighlightedCell)
- {
- mHighlightedCell->setHighlighted(false);
- mHighlightedCell = NULL;
- }
}
void LLPanelPreferenceControls::resetDirtyChilds()
@@ -3329,7 +3277,6 @@ void LLPanelPreferenceControls::resetDirtyChilds()
void LLPanelPreferenceControls::onListCommit()
{
- mShowKeyDialog = false;
LLScrollListItem* item = pControlsTable->getFirstSelected();
if (item == NULL)
{
@@ -3340,11 +3287,20 @@ void LLPanelPreferenceControls::onListCommit()
if (control.empty())
{
+ pControlsTable->deselectAllItems();
return;
}
if (!mConflictHandler[mEditingMode].canAssignControl(control))
{
+ pControlsTable->deselectAllItems();
+ return;
+ }
+
+ S32 cell_ind = item->getSelectedCell();
+ if (cell_ind <= 0)
+ {
+ pControlsTable->deselectAllItems();
return;
}
@@ -3352,13 +3308,27 @@ void LLPanelPreferenceControls::onListCommit()
// fresh mouse coordinates are not yet accessible during onCommit() and there are other issues,
// so we cheat: remember item user clicked at, trigger 'key dialog' on hover that comes next,
// use coordinates from hover to calculate cell
- mEditingControl = control;
- mShowKeyDialog = true;
- if (mHighlightedCell)
+ LLScrollListCell* cell = item->getColumn(cell_ind);
+ if (cell)
+ {
+ LLSetKeyBindDialog* dialog = LLFloaterReg::getTypedInstance<LLSetKeyBindDialog>("keybind_dialog", LLSD());
+ if (dialog)
+ {
+ mEditingControl = control;
+ mEditingColumn = cell_ind;
+ dialog->setParent(this, DEFAULT_KEY_FILTER);
+
+ LLFloater* root_floater = gFloaterView->getParentFloater(this);
+ if (root_floater)
+ root_floater->addDependentFloater(dialog);
+ dialog->openFloater();
+ dialog->setFocus(TRUE);
+ }
+ }
+ else
{
- mHighlightedCell->setHighlighted(false);
- mHighlightedCell = NULL;
+ pControlsTable->deselectAllItems();
}
}
@@ -3375,8 +3345,6 @@ void LLPanelPreferenceControls::onSetKeyBind(EMouseClickType click, KEY key, MAS
return;
}
- pControlsTable->deselectAllItems();
- pControlsTable->selectByValue(mEditingControl);
if ( mEditingColumn > 0)
{
mConflictHandler[mEditingMode].registerControl(mEditingControl, mEditingColumn - 1, click, key, mask, ignore_mask);
@@ -3399,10 +3367,7 @@ void LLPanelPreferenceControls::onDefaultKeyBind()
{
return;
}
-
- pControlsTable->deselectAllItems();
- pControlsTable->selectByValue(mEditingControl);
-
+
if (mEditingColumn > 0)
{
mConflictHandler[mEditingMode].resetToDefault(mEditingControl, mEditingColumn - 1);
@@ -3412,11 +3377,7 @@ void LLPanelPreferenceControls::onDefaultKeyBind()
void LLPanelPreferenceControls::onCancelKeyBind()
{
- if (mHighlightedCell)
- {
- mHighlightedCell->setHighlighted(false);
- mHighlightedCell = NULL;
- }
+ pControlsTable->deselectAllItems();
}
LLFloaterPreferenceGraphicsAdvanced::LLFloaterPreferenceGraphicsAdvanced(const LLSD& key)
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index e07ead7e18..570f1c6caf 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -303,7 +303,6 @@ public:
~LLPanelPreferenceControls();
BOOL postBuild();
- BOOL handleHover(S32 x, S32 y, MASK mask);
void apply();
void cancel();
@@ -326,12 +325,10 @@ private:
LLScrollListCtrl* pControlsTable;
LLComboBox *pKeyModeBox;
- LLScrollListCell *mHighlightedCell;
LLKeyConflictHandler mConflictHandler[LLKeyConflictHandler::MODE_COUNT];
std::string mEditingControl;
S32 mEditingColumn;
S32 mEditingMode;
- bool mShowKeyDialog;
};
class LLFloaterPreferenceGraphicsAdvanced : public LLFloater
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_controls.xml b/indra/newview/skins/default/xui/en/panel_preferences_controls.xml
index 385d4796a0..b7b5280825 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_controls.xml
@@ -256,14 +256,14 @@
width="110"
name="key_mode">
<combo_box.item
- label="First Person "
- name="first_person"
- value="0"/>
- <combo_box.item
label="Third Person "
name="third_person"
value="1"/>
<combo_box.item
+ label="First Person "
+ name="first_person"
+ value="0"/>
+ <combo_box.item
label="Edit"
name="edit"
value="2"/>
@@ -292,13 +292,13 @@
follows="all"
layout="topleft"
column_padding="0"
+ selection_type="header"
top="31"
left="3"
bottom="-3"
right="-3"
can_sort="false"
multi_select="false"
- bg_selected_color="Transparent"
name="controls_list">
<scroll_list.columns
relative_width="0.34"