From b1f9de4d377c37d1e97f5ef06cbb438cdc755f6f Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 12 Jun 2020 18:51:13 +0300 Subject: SL-13421 Removed camera control keybindings from mouselook --- indra/newview/llfloaterpreference.cpp | 116 +++- indra/newview/llfloaterpreference.h | 8 +- indra/newview/llkeyconflict.cpp | 51 +- indra/newview/llkeyconflict.h | 3 +- .../default/xui/en/control_table_contents.xml | 625 --------------------- .../xui/en/control_table_contents_camera.xml | 240 ++++++++ .../en/control_table_contents_columns_basic.xml | 19 + .../xui/en/control_table_contents_editing.xml | 80 +++ .../xui/en/control_table_contents_media.xml | 76 +++ .../xui/en/control_table_contents_movement.xml | 198 +++++++ 10 files changed, 758 insertions(+), 658 deletions(-) delete mode 100644 indra/newview/skins/default/xui/en/control_table_contents.xml create mode 100644 indra/newview/skins/default/xui/en/control_table_contents_camera.xml create mode 100644 indra/newview/skins/default/xui/en/control_table_contents_columns_basic.xml create mode 100644 indra/newview/skins/default/xui/en/control_table_contents_editing.xml create mode 100644 indra/newview/skins/default/xui/en/control_table_contents_media.xml create mode 100644 indra/newview/skins/default/xui/en/control_table_contents_movement.xml diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index f7e984c14f..66f793a82c 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -2649,39 +2649,21 @@ void LLPanelPreferenceControls::regenerateControls() populateControlTable(); } -void LLPanelPreferenceControls::populateControlTable() +bool LLPanelPreferenceControls::addControlTableColumns(const std::string &filename) { - pControlsTable->clearRows(); - pControlsTable->clearColumns(); - - std::string filename; - switch ((LLKeyConflictHandler::ESourceMode)mEditingMode) - { - case LLKeyConflictHandler::MODE_THIRD_PERSON: - case LLKeyConflictHandler::MODE_FIRST_PERSON: - case LLKeyConflictHandler::MODE_EDIT_AVATAR: - case LLKeyConflictHandler::MODE_SITTING: - filename = "control_table_contents.xml"; - break; - default: - // 'saved settings' mode doesn't have UI or actual settings yet - LL_INFOS() << "Unimplemented mode" << LL_ENDL; - return; - } - LLXMLNodePtr xmlNode; LLScrollListCtrl::Contents contents; if (!LLUICtrlFactory::getLayeredXMLNode(filename, xmlNode)) { - LL_WARNS() << "Failed to load " << filename << LL_ENDL; - return; + LL_WARNS() << "Failed to load " << filename << LL_ENDL; + return false; } LLXUIParser parser; parser.readXUI(xmlNode, contents, filename); if (!contents.validateBlock()) { - return; + return false; } for (LLInitParam::ParamIterator::const_iterator col_it = contents.columns.begin(); @@ -2691,6 +2673,26 @@ void LLPanelPreferenceControls::populateControlTable() pControlsTable->addColumn(*col_it); } + return true; +} + +bool LLPanelPreferenceControls::addControlTableRows(const std::string &filename) +{ + LLXMLNodePtr xmlNode; + LLScrollListCtrl::Contents contents; + if (!LLUICtrlFactory::getLayeredXMLNode(filename, xmlNode)) + { + LL_WARNS() << "Failed to load " << filename << LL_ENDL; + return false; + } + LLXUIParser parser; + parser.readXUI(xmlNode, contents, filename); + + if (!contents.validateBlock()) + { + return false; + } + LLScrollListCell::Params cell_params; // init basic cell params cell_params.font = LLFontGL::getFontSansSerif(); @@ -2706,7 +2708,7 @@ void LLPanelPreferenceControls::populateControlTable() std::string control = row_it->value.getValue().asString(); if (!control.empty() && control != "menu_separator") { - // At the moment 4 collumns are hardcoded + // At the moment viewer is hardcoded to assume that there are 4 collumns LLScrollListItem::Params item_params(*row_it); bool enabled = mConflictHandler[mEditingMode].canAssignControl(control); item_params.enabled.setValue(enabled); @@ -2723,17 +2725,77 @@ void LLPanelPreferenceControls::populateControlTable() } else { + // Separator example: + // + // + // pControlsTable->addRow(*row_it, EAddPosition::ADD_BOTTOM); } } + return true; +} + +void LLPanelPreferenceControls::addControlTableSeparator() +{ + pControlsTable->addSeparator(EAddPosition::ADD_BOTTOM); } -// Just a workaround to not care about first separator before headers (we can start from random header) -void LLPanelPreferenceControls::addSeparator() +void LLPanelPreferenceControls::populateControlTable() { - if (pControlsTable->getItemCount() > 0) + pControlsTable->clearRows(); + pControlsTable->clearColumns(); + + // add columns + std::string filename; + switch ((LLKeyConflictHandler::ESourceMode)mEditingMode) { - pControlsTable->addSeparator(EAddPosition::ADD_BOTTOM); + case LLKeyConflictHandler::MODE_THIRD_PERSON: + case LLKeyConflictHandler::MODE_FIRST_PERSON: + case LLKeyConflictHandler::MODE_EDIT_AVATAR: + case LLKeyConflictHandler::MODE_SITTING: + filename = "control_table_contents_columns_basic.xml"; + break; + default: + // Either unknown mode or MODE_SAVED_SETTINGS + // It doesn't have UI or actual settings yet + LL_INFOS() << "Unimplemented mode" << LL_ENDL; + return; + } + addControlTableColumns(filename); + + switch ((LLKeyConflictHandler::ESourceMode)mEditingMode) + { + case LLKeyConflictHandler::MODE_FIRST_PERSON: + addControlTableRows("control_table_contents_movement.xml"); + addControlTableSeparator(); + addControlTableRows("control_table_contents_media.xml"); + break; + case LLKeyConflictHandler::MODE_THIRD_PERSON: + case LLKeyConflictHandler::MODE_EDIT_AVATAR: + case LLKeyConflictHandler::MODE_SITTING: + addControlTableRows("control_table_contents_movement.xml"); + addControlTableSeparator(); + + // contains couple 'sitting' options, might be good idea to recheck + // those and move to own group with sitting/spinning icon + addControlTableRows("control_table_contents_camera.xml"); + addControlTableSeparator(); + + // Do we need this outside of MODE_EDIT_AVATAR? + addControlTableRows("control_table_contents_editing.xml"); + addControlTableSeparator(); + + addControlTableRows("control_table_contents_media.xml"); + break; + default: + // 'saved settings' mode doesn't have UI or actual settings yet + LL_INFOS() << "Unimplemented mode" << LL_ENDL; + return; } } diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 6c2e655270..ea6e1070cd 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -312,8 +312,14 @@ private: // reloads settings, discards current changes, updates table void regenerateControls(); + // These fuctions do not clean previous content + bool addControlTableColumns(const std::string &filename); + bool addControlTableRows(const std::string &filename); + void addControlTableSeparator(); + + // Cleans content and then adds content from xml files according to current mEditingMode void populateControlTable(); - void addSeparator(); + // Updates keybindings from storage to table void updateTable(); LLScrollListCtrl* pControlsTable; diff --git a/indra/newview/llkeyconflict.cpp b/indra/newview/llkeyconflict.cpp index a94836c59d..be774e7765 100644 --- a/indra/newview/llkeyconflict.cpp +++ b/indra/newview/llkeyconflict.cpp @@ -160,7 +160,7 @@ bool LLKeyConflictHandler::canAssignControl(const std::string &control_name) { return iter->second.mAssignable; } - // If we don't know this control means it wasn't assigned by user yet and thus is editable + // If we don't know this control, means it wasn't assigned by user yet and thus is editable return true; } @@ -195,7 +195,8 @@ bool LLKeyConflictHandler::registerControl(const std::string &control_name, U32 LLKeyConflict &type_data = mControlsMap[control_name]; if (!type_data.mAssignable) { - LL_ERRS() << "Error in code, user or system should not be able to change certain controls" << LL_ENDL; + // Example: user tried to assign camera spin to all modes, but first person mode doesn't support it + return false; } LLKeyData data(mouse, key, mask, ignore_mask); if (type_data.mKeyBind.getKeyData(index) == data) @@ -764,8 +765,43 @@ void LLKeyConflictHandler::generatePlaceholders(ESourceMode load_mode) { // These controls are meant to cause conflicts when user tries to assign same control somewhere else // also this can be used to pre-record controls that should not conflict or to assign conflict groups/masks - /*registerTemporaryControl(CONTROL_RESERVED_MENU, CLICK_RIGHT, KEY_NONE, MASK_NONE, 0); - registerTemporaryControl(CONTROL_DELETE, CLICK_NONE, KEY_DELETE, MASK_NONE, 0);*/ + + if (load_mode == MODE_FIRST_PERSON) + { + // First person view doesn't support camera controls + // Note: might be better idea to just load these from control_table_contents_camera.xml + // or to pass from floaterpreferences when it loads said file + registerTemporaryControl("look_up"); + registerTemporaryControl("look_down"); + registerTemporaryControl("move_forward"); + registerTemporaryControl("move_backward"); + registerTemporaryControl("move_forward_fast"); + registerTemporaryControl("move_backward_fast"); + registerTemporaryControl("move_forward_sitting"); + registerTemporaryControl("move_backward_sitting"); + registerTemporaryControl("spin_over"); + registerTemporaryControl("spin_under"); + registerTemporaryControl("spin_over_sitting"); + registerTemporaryControl("spin_under_sitting"); + registerTemporaryControl("pan_up"); + registerTemporaryControl("pan_down"); + registerTemporaryControl("pan_left"); + registerTemporaryControl("pan_right"); + registerTemporaryControl("pan_in"); + registerTemporaryControl("pan_out"); + registerTemporaryControl("spin_around_ccw"); + registerTemporaryControl("spin_around_cw"); + registerTemporaryControl("spin_around_ccw_sitting"); + registerTemporaryControl("spin_around_cw_sitting"); + + // control_table_contents_editing.xml + registerTemporaryControl("edit_avatar_spin_ccw"); + registerTemporaryControl("edit_avatar_spin_cw"); + registerTemporaryControl("edit_avatar_spin_over"); + registerTemporaryControl("edit_avatar_spin_under"); + registerTemporaryControl("edit_avatar_move_forward"); + registerTemporaryControl("edit_avatar_move_backward"); + } } bool LLKeyConflictHandler::removeConflicts(const LLKeyData &data, const U32 &conlict_mask) @@ -817,6 +853,13 @@ void LLKeyConflictHandler::registerTemporaryControl(const std::string &control_n type_data->mKeyBind.addKeyData(mouse, key, mask, false); } +void LLKeyConflictHandler::registerTemporaryControl(const std::string &control_name) +{ + LLKeyConflict *type_data = &mControlsMap[control_name]; + type_data->mAssignable = false; + type_data->mConflictMask = 0; +} + bool LLKeyConflictHandler::clearUnsavedChanges() { bool result = false; diff --git a/indra/newview/llkeyconflict.h b/indra/newview/llkeyconflict.h index 84730e4d4f..1bb29bc302 100644 --- a/indra/newview/llkeyconflict.h +++ b/indra/newview/llkeyconflict.h @@ -125,8 +125,9 @@ private: void resetToDefaultAndResolve(const std::string &control_name, bool ignore_conflicts); void resetToDefaults(ESourceMode mode); - // at the moment these kind of control is not savable, but takes part will take part in conflict resolution + // at the moment these kind of control is not savable, but takes part in conflict resolution void registerTemporaryControl(const std::string &control_name, EMouseClickType mouse_ind, KEY key, MASK mask, U32 conflict_mask); + void registerTemporaryControl(const std::string &control_name); typedef std::map control_map_t; void loadFromSettings(const LLViewerInput::KeyMode& keymode, control_map_t *destination); diff --git a/indra/newview/skins/default/xui/en/control_table_contents.xml b/indra/newview/skins/default/xui/en/control_table_contents.xml deleted file mode 100644 index f3a34c59eb..0000000000 --- a/indra/newview/skins/default/xui/en/control_table_contents.xml +++ /dev/null @@ -1,625 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/indra/newview/skins/default/xui/en/control_table_contents_camera.xml b/indra/newview/skins/default/xui/en/control_table_contents_camera.xml new file mode 100644 index 0000000000..35cbb02271 --- /dev/null +++ b/indra/newview/skins/default/xui/en/control_table_contents_camera.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/control_table_contents_columns_basic.xml b/indra/newview/skins/default/xui/en/control_table_contents_columns_basic.xml new file mode 100644 index 0000000000..e707aaf22c --- /dev/null +++ b/indra/newview/skins/default/xui/en/control_table_contents_columns_basic.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/indra/newview/skins/default/xui/en/control_table_contents_editing.xml b/indra/newview/skins/default/xui/en/control_table_contents_editing.xml new file mode 100644 index 0000000000..2a3314840a --- /dev/null +++ b/indra/newview/skins/default/xui/en/control_table_contents_editing.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/control_table_contents_media.xml b/indra/newview/skins/default/xui/en/control_table_contents_media.xml new file mode 100644 index 0000000000..ce5d3556b6 --- /dev/null +++ b/indra/newview/skins/default/xui/en/control_table_contents_media.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/control_table_contents_movement.xml b/indra/newview/skins/default/xui/en/control_table_contents_movement.xml new file mode 100644 index 0000000000..b410d2dc1c --- /dev/null +++ b/indra/newview/skins/default/xui/en/control_table_contents_movement.xml @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3