SL-6109 Teleport and autopilot should not work in some cases

Hides teleport_to and walk_to also optimizes couple things.
meow-7.2.2
Andrey Kleshchev 2020-06-23 20:29:00 +03:00
parent f08c8ef208
commit 7717097f7c
6 changed files with 161 additions and 96 deletions

View File

@ -1021,6 +1021,7 @@ bool LLAppViewer::init()
LL_INFOS("InitInfo") << "Converting legacy mouse bindings to new format" << LL_ENDL;
// Load settings from file
LLKeyConflictHandler third_person_view(LLKeyConflictHandler::MODE_THIRD_PERSON);
LLKeyConflictHandler sitting_view(LLKeyConflictHandler::MODE_SITTING);
// Since we are only modifying keybindings if personal file doesn't exist yet,
// it should be safe to just overwrite the value
@ -1050,6 +1051,14 @@ bool LLAppViewer::init()
MASK_NONE,
value);
// sitting also supports teleport
sitting_view.registerControl("teleport_to",
0,
value ? EMouseClickType::CLICK_DOUBLELEFT : EMouseClickType::CLICK_NONE,
KEY_NONE,
MASK_NONE,
value);
std::string key_string = gSavedSettings.getString("PushToTalkButton");
EMouseClickType mouse = EMouseClickType::CLICK_NONE;
KEY key = KEY_NONE;
@ -1073,6 +1082,7 @@ bool LLAppViewer::init()
value = gSavedSettings.getBOOL("PushToTalkToggle");
std::string control_name = value ? "toggle_voice" : "voice_follow_key";
third_person_view.registerControl(control_name, 0, mouse, key, MASK_NONE, true);
sitting_view.registerControl(control_name, 0, mouse, key, MASK_NONE, true);
if (third_person_view.hasUnsavedChanges())
{
@ -1080,12 +1090,18 @@ bool LLAppViewer::init()
third_person_view.saveToSettings();
}
// in case of voice we need to repeat this in other modes (teleports and
// autopilot are not entirely practical when sitting or editing)
if (sitting_view.hasUnsavedChanges())
{
// calls loadBindingsXML()
sitting_view.saveToSettings();
}
// in case of voice we need to repeat this in other modes
for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
{
if (i != LLKeyConflictHandler::MODE_THIRD_PERSON)
// edit and first person modes; MODE_SAVED_SETTINGS not in use at the moment
if (i != LLKeyConflictHandler::MODE_THIRD_PERSON && i != LLKeyConflictHandler::MODE_SITTING)
{
LLKeyConflictHandler handler((LLKeyConflictHandler::ESourceMode)i);

View File

@ -2801,20 +2801,34 @@ bool LLPanelPreferenceControls::addControlTableRows(const std::string &filename)
std::string control = row_it->value.getValue().asString();
if (!control.empty() && control != "menu_separator")
{
// At the moment viewer is hardcoded to assume that there are 4 collumns
LLScrollListItem::Params item_params(*row_it);
bool show = true;
bool enabled = mConflictHandler[mEditingMode].canAssignControl(control);
item_params.enabled.setValue(enabled);
cell_params.column = "lst_ctrl1";
cell_params.value = mConflictHandler[mEditingMode].getControlString(control, 0);
item_params.columns.add(cell_params);
cell_params.column = "lst_ctrl2";
cell_params.value = mConflictHandler[mEditingMode].getControlString(control, 1);
item_params.columns.add(cell_params);
cell_params.column = "lst_ctrl3";
cell_params.value = mConflictHandler[mEditingMode].getControlString(control, 2);
item_params.columns.add(cell_params);
pControlsTable->addRow(item_params, EAddPosition::ADD_BOTTOM);
if (!enabled)
{
// If empty: this is a placeholder to make sure user won't assign
// value by accident, don't show it
// If not empty: predefined control combination user should see
// to know that combination is reserved
show = !mConflictHandler[mEditingMode].isControlEmpty(control);
// example: teleport_to and walk_to in first person view, and
// sitting related functions, see generatePlaceholders()
}
if (show)
{
// At the moment viewer is hardcoded to assume that columns are named as lst_ctrl%d
LLScrollListItem::Params item_params(*row_it);
item_params.enabled.setValue(enabled);
S32 num_columns = pControlsTable->getNumColumns();
for (S32 col = 1; col < num_columns; col++)
{
cell_params.column = llformat("lst_ctrl%d", col);
cell_params.value = mConflictHandler[mEditingMode].getControlString(control, col - 1);
item_params.columns.add(cell_params);
}
pControlsTable->addRow(item_params, EAddPosition::ADD_BOTTOM);
}
}
else
{
@ -2825,7 +2839,8 @@ bool LLPanelPreferenceControls::addControlTableRows(const std::string &filename)
// type = "icon"
// color = "0 0 0 0.7"
// halign = "center"
// value = "menu_separator" />
// value = "menu_separator"
// column = "lst_action" / >
//</rows>
pControlsTable->addRow(*row_it, EAddPosition::ADD_BOTTOM);
}
@ -2835,7 +2850,16 @@ bool LLPanelPreferenceControls::addControlTableRows(const std::string &filename)
void LLPanelPreferenceControls::addControlTableSeparator()
{
pControlsTable->addSeparator(EAddPosition::ADD_BOTTOM);
LLScrollListItem::Params separator_params;
separator_params.enabled(false);
LLScrollListCell::Params column_params;
column_params.type = "icon";
column_params.value = "menu_separator";
column_params.column = "lst_action";
column_params.color = LLColor4(0.f, 0.f, 0.f, 0.7f);
column_params.font_halign = LLFontGL::HCENTER;
separator_params.columns.add(column_params);
pControlsTable->addRow(separator_params, EAddPosition::ADD_BOTTOM);
}
void LLPanelPreferenceControls::populateControlTable()
@ -2843,7 +2867,7 @@ void LLPanelPreferenceControls::populateControlTable()
pControlsTable->clearRows();
pControlsTable->clearColumns();
// add columns
// Add columns
std::string filename;
switch ((LLKeyConflictHandler::ESourceMode)mEditingMode)
{
@ -2861,9 +2885,11 @@ void LLPanelPreferenceControls::populateControlTable()
}
addControlTableColumns(filename);
// Add rows.
// Each file represents individual visual group (movement/camera/media...)
if (mEditingMode == LLKeyConflictHandler::MODE_FIRST_PERSON)
{
// Don't display whole camera and editing groups
addControlTableRows("control_table_contents_movement.xml");
addControlTableSeparator();
addControlTableRows("control_table_contents_media.xml");
@ -2872,14 +2898,11 @@ void LLPanelPreferenceControls::populateControlTable()
else if (mEditingMode < LLKeyConflictHandler::MODE_SAVED_SETTINGS)
{
// In case of 'sitting' mode, movements still apply due to vehicles
// but walk_to is not supported and will be hidden by addControlTableRows
addControlTableRows("control_table_contents_movement.xml");
addControlTableSeparator();
addControlTableRows("control_table_contents_camera.xml");
if (mEditingMode == LLKeyConflictHandler::MODE_SITTING)
{
addControlTableRows("control_table_contents_camera_sitting.xml");
}
addControlTableSeparator();
addControlTableRows("control_table_contents_editing.xml");
@ -2903,12 +2926,14 @@ void LLPanelPreferenceControls::updateTable()
std::string control = list[i]->getValue();
if (!control.empty())
{
LLScrollListCell* cell = list[i]->getColumn(1);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, 0));
cell = list[i]->getColumn(2);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, 1));
cell = list[i]->getColumn(3);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, 2));
LLScrollListCell* cell = NULL;
S32 num_columns = pControlsTable->getNumColumns();
for (S32 col = 1; col < num_columns; col++)
{
cell = list[i]->getColumn(col);
cell->setValue(mConflictHandler[mEditingMode].getControlString(control, col - 1));
}
}
}
pControlsTable->deselectAllItems();

View File

@ -243,6 +243,15 @@ LLKeyData LLKeyConflictHandler::getControl(const std::string &control_name, U32
return mControlsMap[control_name].getKeyData(index);
}
bool LLKeyConflictHandler::isControlEmpty(const std::string &control_name)
{
if (control_name.empty())
{
return true;
}
return mControlsMap[control_name].mKeyBind.isEmpty();
}
// static
std::string LLKeyConflictHandler::getStringFromKeyData(const LLKeyData& keydata)
{
@ -885,10 +894,27 @@ void LLKeyConflictHandler::generatePlaceholders(ESourceMode load_mode)
registerTemporaryControl("edit_avatar_spin_under");
registerTemporaryControl("edit_avatar_move_forward");
registerTemporaryControl("edit_avatar_move_backward");
// no autopilot or teleport
registerTemporaryControl("walk_to");
registerTemporaryControl("teleport_to");
}
if (load_mode != MODE_SITTING)
if (load_mode == MODE_EDIT_AVATAR)
{
// no autopilot or teleport
registerTemporaryControl("walk_to");
registerTemporaryControl("teleport_to");
}
if (load_mode == MODE_SITTING)
{
// no autopilot
registerTemporaryControl("walk_to");
}
else
{
// sitting related functions should only be avaliable in sitting mode
registerTemporaryControl("move_forward_sitting");
registerTemporaryControl("move_backward_sitting");
registerTemporaryControl("spin_over_sitting");

View File

@ -98,6 +98,7 @@ public:
bool clearControl(const std::string &control_name, U32 data_index);
LLKeyData getControl(const std::string &control_name, U32 data_index);
bool isControlEmpty(const std::string &control_name);
// localized string
static std::string getStringFromKeyData(const LLKeyData& keydata);

View File

@ -175,4 +175,66 @@
tool_tip="Camera spin around clockwise"
value="Clockwise" />
</rows>
<rows
name="move_forward_sitting"
value="move_forward_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
value="Camera Forward Sitting" />
</rows>
<rows
name="move_backward_sitting"
value="move_backward_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
value="Camera Backward Sitting" />
</rows>
<rows
name="spin_over_sitting"
value="spin_over_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
value="Camera Spin Over Sitting" />
</rows>
<rows
name="spin_under_sitting"
value="spin_under_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
value="Camera Spin Under Sitting" />
</rows>
<rows
name="spin_around_ccw_sitting"
value="spin_around_ccw_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
tool_tip="Camera spin around counterclockwise sitting"
value="Counterclockwise Sitting" />
</rows>
<rows
name="spin_around_cw_sitting"
value="spin_around_cw_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
tool_tip="Camera spin around clockwise sitting"
value="Clockwise Sitting" />
</rows>
</contents>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<contents>
<rows
name="move_forward_sitting"
value="move_forward_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
value="Camera Forward Sitting" />
</rows>
<rows
name="move_backward_sitting"
value="move_backward_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
value="Camera Backward Sitting" />
</rows>
<rows
name="spin_over_sitting"
value="spin_over_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
value="Camera Spin Over Sitting" />
</rows>
<rows
name="spin_under_sitting"
value="spin_under_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
value="Camera Spin Under Sitting" />
</rows>
<rows
name="spin_around_ccw_sitting"
value="spin_around_ccw_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
tool_tip="Camera spin around counterclockwise sitting"
value="Counterclockwise Sitting" />
</rows>
<rows
name="spin_around_cw_sitting"
value="spin_around_cw_sitting">
<columns
column="lst_action"
font="SansSerif"
halign="left"
name="lst_action"
tool_tip="Camera spin around clockwise sitting"
value="Clockwise Sitting" />
</rows>
</contents>