mirror of https://github.com/OpenTTD/OpenTTD
Add: Allow to configure modifier keys
parent
f0a594abcf
commit
553fbe8f85
|
@ -351,4 +351,11 @@ enum StringAlignment {
|
||||||
};
|
};
|
||||||
DECLARE_ENUM_AS_BIT_SET(StringAlignment)
|
DECLARE_ENUM_AS_BIT_SET(StringAlignment)
|
||||||
|
|
||||||
|
enum ModifierKey : byte {
|
||||||
|
None = 0, ///< No key configured
|
||||||
|
Shift = 1, ///< Shift key
|
||||||
|
Ctrl = 2, ///< Ctrl key
|
||||||
|
Alt = 3, ///< Alt key
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* GFX_TYPE_H */
|
#endif /* GFX_TYPE_H */
|
||||||
|
|
|
@ -1766,6 +1766,18 @@ STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% normal g
|
||||||
###setting-zero-is-special
|
###setting-zero-is-special
|
||||||
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :No limit (as fast as your computer allows)
|
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :No limit (as fast as your computer allows)
|
||||||
|
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_FN :Function modifier key: {STRING2}
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_FN_HELPTEXT :Modifier key for accessing additional functions.
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_REMOVE :Remove modifier key: {STRING2}
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_REMOVE_HELPTEXT :Modifier key for removal mode on building tools.
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_ESTIMATE :Estimate modifier key: {STRING2}
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_ESTIMATE_HELPTEXT :Modifier key for estimating action cost.
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_NONE :None
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_SHIFT :Shift
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_CTRL :Ctrl
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_ALT :Alt
|
||||||
|
STR_CONFIG_SETTING_MODIFIER_ALREADY_IN_USE :{WHITE}This modifier key is already in use.
|
||||||
|
|
||||||
STR_CONFIG_SETTING_SOUND_TICKER :News ticker: {STRING2}
|
STR_CONFIG_SETTING_SOUND_TICKER :News ticker: {STRING2}
|
||||||
STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Play sound for summarised news messages
|
STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Play sound for summarised news messages
|
||||||
|
|
||||||
|
|
|
@ -2041,6 +2041,9 @@ static SettingsContainer &GetSettingsTree()
|
||||||
interface->Add(new SettingEntry("gui.timetable_arrival_departure"));
|
interface->Add(new SettingEntry("gui.timetable_arrival_departure"));
|
||||||
interface->Add(new SettingEntry("gui.show_newgrf_name"));
|
interface->Add(new SettingEntry("gui.show_newgrf_name"));
|
||||||
interface->Add(new SettingEntry("gui.show_cargo_in_vehicle_lists"));
|
interface->Add(new SettingEntry("gui.show_cargo_in_vehicle_lists"));
|
||||||
|
viewports->Add(new SettingEntry("gui.fn_modifier"));
|
||||||
|
viewports->Add(new SettingEntry("gui.remove_modifier"));
|
||||||
|
viewports->Add(new SettingEntry("gui.estimate_modifier"));
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsPage *advisors = main->Add(new SettingsPage(STR_CONFIG_SETTING_ADVISORS));
|
SettingsPage *advisors = main->Add(new SettingsPage(STR_CONFIG_SETTING_ADVISORS));
|
||||||
|
|
|
@ -483,6 +483,33 @@ static bool CheckMaxHeightLevel(int32_t &new_value)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool CheckModifier(int32_t new_value, ModifierKey other1, ModifierKey other2)
|
||||||
|
{
|
||||||
|
ModifierKey key = (ModifierKey)new_value;
|
||||||
|
if (key == ModifierKey::None) return true;
|
||||||
|
if (other1 == key || other2 == key) {
|
||||||
|
ShowErrorMessage(STR_CONFIG_SETTING_MODIFIER_ALREADY_IN_USE, INVALID_STRING_ID, WL_ERROR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool CheckFnModifier(int32_t &new_value)
|
||||||
|
{
|
||||||
|
return CheckModifier(new_value, _settings_client.gui.remove_modifier, _settings_client.gui.estimate_modifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool CheckRemoveModifier(int32_t &new_value)
|
||||||
|
{
|
||||||
|
return CheckModifier(new_value, _settings_client.gui.fn_modifier, _settings_client.gui.estimate_modifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool CheckEstimateModifier(int32_t &new_value)
|
||||||
|
{
|
||||||
|
return CheckModifier(new_value, _settings_client.gui.fn_modifier, _settings_client.gui.remove_modifier);
|
||||||
|
}
|
||||||
|
|
||||||
static void StationCatchmentChanged(int32_t)
|
static void StationCatchmentChanged(int32_t)
|
||||||
{
|
{
|
||||||
Station::RecomputeCatchmentForAll();
|
Station::RecomputeCatchmentForAll();
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "rail_gui.h"
|
#include "rail_gui.h"
|
||||||
#include "signal_type.h"
|
#include "signal_type.h"
|
||||||
#include "timetable.h"
|
#include "timetable.h"
|
||||||
|
#include "gfx_type.h"
|
||||||
|
|
||||||
/* Used to validate sizes of "max" value in settings. */
|
/* Used to validate sizes of "max" value in settings. */
|
||||||
const size_t MAX_SLE_UINT8 = UINT8_MAX;
|
const size_t MAX_SLE_UINT8 = UINT8_MAX;
|
||||||
|
@ -220,6 +221,9 @@ struct GUISettings {
|
||||||
uint8_t newgrf_default_palette; ///< default palette to use for NewGRFs without action 14 palette information
|
uint8_t newgrf_default_palette; ///< default palette to use for NewGRFs without action 14 palette information
|
||||||
|
|
||||||
bool scale_bevels; ///< bevels are scaled with GUI scale.
|
bool scale_bevels; ///< bevels are scaled with GUI scale.
|
||||||
|
ModifierKey fn_modifier; ///< function modifier key
|
||||||
|
ModifierKey remove_modifier; ///< remove modifier key
|
||||||
|
ModifierKey estimate_modifier; ///< estimate modifier key
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true when the user has sufficient privileges to edit newgrfs on a running game
|
* Returns true when the user has sufficient privileges to edit newgrfs on a running game
|
||||||
|
|
|
@ -16,10 +16,14 @@ static void InvalidateCompanyLiveryWindow(int32_t new_value);
|
||||||
static void InvalidateNewGRFChangeWindows(int32_t new_value);
|
static void InvalidateNewGRFChangeWindows(int32_t new_value);
|
||||||
static void ZoomMinMaxChanged(int32_t new_value);
|
static void ZoomMinMaxChanged(int32_t new_value);
|
||||||
static void SpriteZoomMinChanged(int32_t new_value);
|
static void SpriteZoomMinChanged(int32_t new_value);
|
||||||
|
static bool CheckFnModifier(int32_t &new_value);
|
||||||
|
static bool CheckRemoveModifier(int32_t &new_value);
|
||||||
|
static bool CheckEstimateModifier(int32_t &new_value);
|
||||||
|
|
||||||
static constexpr std::initializer_list<const char*> _osk_activation{"disabled", "double", "single", "immediately"};
|
static constexpr std::initializer_list<const char*> _osk_activation{"disabled", "double", "single", "immediately"};
|
||||||
static constexpr std::initializer_list<const char*> _savegame_date{"long", "short", "iso"};
|
static constexpr std::initializer_list<const char*> _savegame_date{"long", "short", "iso"};
|
||||||
static constexpr std::initializer_list<const char*> _right_click_close{"no", "yes", "except sticky"};
|
static constexpr std::initializer_list<const char*> _right_click_close{"no", "yes", "except sticky"};
|
||||||
|
static constexpr std::initializer_list<const char*> _mod_keys{"none", "shift", "ctrl", "alt"};
|
||||||
|
|
||||||
static const SettingVariant _gui_settings_table[] = {
|
static const SettingVariant _gui_settings_table[] = {
|
||||||
[post-amble]
|
[post-amble]
|
||||||
|
@ -903,3 +907,44 @@ post_cb = [](auto) { SetupWidgetDimensions(); ReInitAllWindows(true); }
|
||||||
cat = SC_BASIC
|
cat = SC_BASIC
|
||||||
startup = true
|
startup = true
|
||||||
|
|
||||||
|
[SDTC_OMANY]
|
||||||
|
var = gui.fn_modifier
|
||||||
|
type = SLE_UINT8
|
||||||
|
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
|
||||||
|
full = _mod_keys
|
||||||
|
def = 2
|
||||||
|
min = 0
|
||||||
|
max = 3
|
||||||
|
str = STR_CONFIG_SETTING_MODIFIER_FN
|
||||||
|
strhelp = STR_CONFIG_SETTING_MODIFIER_FN_HELPTEXT
|
||||||
|
strval = STR_CONFIG_SETTING_MODIFIER_NONE
|
||||||
|
pre_cb = CheckFnModifier
|
||||||
|
cat = SC_ADVANCED
|
||||||
|
|
||||||
|
[SDTC_OMANY]
|
||||||
|
var = gui.remove_modifier
|
||||||
|
type = SLE_UINT8
|
||||||
|
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
|
||||||
|
full = _mod_keys
|
||||||
|
def = 3
|
||||||
|
min = 0
|
||||||
|
max = 3
|
||||||
|
str = STR_CONFIG_SETTING_MODIFIER_REMOVE
|
||||||
|
strhelp = STR_CONFIG_SETTING_MODIFIER_REMOVE_HELPTEXT
|
||||||
|
strval = STR_CONFIG_SETTING_MODIFIER_NONE
|
||||||
|
pre_cb = CheckRemoveModifier
|
||||||
|
cat = SC_ADVANCED
|
||||||
|
|
||||||
|
[SDTC_OMANY]
|
||||||
|
var = gui.estimate_modifier
|
||||||
|
type = SLE_UINT8
|
||||||
|
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
|
||||||
|
full = _mod_keys
|
||||||
|
def = 1
|
||||||
|
min = 0
|
||||||
|
max = 3
|
||||||
|
str = STR_CONFIG_SETTING_MODIFIER_ESTIMATE
|
||||||
|
strhelp = STR_CONFIG_SETTING_MODIFIER_ESTIMATE_HELPTEXT
|
||||||
|
strval = STR_CONFIG_SETTING_MODIFIER_NONE
|
||||||
|
pre_cb = CheckEstimateModifier
|
||||||
|
cat = SC_ADVANCED
|
||||||
|
|
|
@ -2613,6 +2613,25 @@ void HandleKeypress(uint keycode, char32_t key)
|
||||||
HandleGlobalHotkeys(key, keycode);
|
HandleGlobalHotkeys(key, keycode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Select the right state for the requested modifier key.
|
||||||
|
*/
|
||||||
|
static bool SelectModifierKey(ModifierKey key, bool shift_pressed, bool ctrl_pressed, bool alt_pressed)
|
||||||
|
{
|
||||||
|
switch (key) {
|
||||||
|
case ModifierKey::None:
|
||||||
|
return false;
|
||||||
|
case ModifierKey::Shift:
|
||||||
|
return shift_pressed;
|
||||||
|
case ModifierKey::Ctrl:
|
||||||
|
return ctrl_pressed;
|
||||||
|
case ModifierKey::Alt:
|
||||||
|
return alt_pressed;
|
||||||
|
default:
|
||||||
|
NOT_REACHED();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle the modifier key state changes.
|
* Handle the modifier key state changes.
|
||||||
*/
|
*/
|
||||||
|
@ -2623,10 +2642,9 @@ void HandleModifierKeys(bool shift_pressed, bool ctrl_pressed, bool alt_pressed)
|
||||||
|
|
||||||
_shift_pressed = shift_pressed;
|
_shift_pressed = shift_pressed;
|
||||||
|
|
||||||
/* Hardwire modifier keys. */
|
_fn_pressed = SelectModifierKey(_settings_client.gui.fn_modifier, shift_pressed, ctrl_pressed, alt_pressed);
|
||||||
_fn_pressed = ctrl_pressed;
|
_remove_pressed = SelectModifierKey(_settings_client.gui.remove_modifier, shift_pressed, ctrl_pressed, alt_pressed);
|
||||||
_remove_pressed = alt_pressed;
|
_estimate_pressed = SelectModifierKey(_settings_client.gui.estimate_modifier, shift_pressed, ctrl_pressed, alt_pressed);
|
||||||
_estimate_pressed = shift_pressed;
|
|
||||||
|
|
||||||
if (old_fn_pressed != _fn_pressed) {
|
if (old_fn_pressed != _fn_pressed) {
|
||||||
/* Call the event, start with the uppermost window. */
|
/* Call the event, start with the uppermost window. */
|
||||||
|
|
Loading…
Reference in New Issue