Allow disabling a setting via guiproc
This commit is contained in:
@@ -1342,6 +1342,7 @@ struct SettingEntry : BaseSettingEntry {
|
|||||||
bool UpdateFilterState(SettingFilter &filter, bool force_visible) override;
|
bool UpdateFilterState(SettingFilter &filter, bool force_visible) override;
|
||||||
|
|
||||||
void SetButtons(byte new_val);
|
void SetButtons(byte new_val);
|
||||||
|
bool IsGUIEditable() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
SettingEntry(const IntSettingDesc *setting);
|
SettingEntry(const IntSettingDesc *setting);
|
||||||
@@ -1592,6 +1593,20 @@ uint SettingEntry::GetMaxHelpHeight(int maxw)
|
|||||||
return GetStringHeight(this->setting->GetHelp(), maxw);
|
return GetStringHeight(this->setting->GetHelp(), maxw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SettingEntry::IsGUIEditable() const
|
||||||
|
{
|
||||||
|
bool editable = this->setting->IsEditable();
|
||||||
|
if (editable && this->setting->guiproc != nullptr) {
|
||||||
|
SettingOnGuiCtrlData data;
|
||||||
|
data.type = SOGCT_GUI_DISABLE;
|
||||||
|
data.val = 0;
|
||||||
|
if (this->setting->guiproc(data)) {
|
||||||
|
editable = (data.val == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return editable;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether an entry shall be made visible based on the restriction mode.
|
* Checks whether an entry shall be made visible based on the restriction mode.
|
||||||
* @param mode The current status of the restriction drop down box.
|
* @param mode The current status of the restriction drop down box.
|
||||||
@@ -1708,7 +1723,7 @@ void SettingEntry::DrawSetting(GameSettings *settings_ptr, int left, int right,
|
|||||||
uint button_y = y + (SETTING_HEIGHT - SETTING_BUTTON_HEIGHT) / 2;
|
uint button_y = y + (SETTING_HEIGHT - SETTING_BUTTON_HEIGHT) / 2;
|
||||||
|
|
||||||
/* We do not allow changes of some items when we are a client in a networkgame */
|
/* We do not allow changes of some items when we are a client in a networkgame */
|
||||||
bool editable = sd->IsEditable();
|
bool editable = this->IsGUIEditable();
|
||||||
|
|
||||||
SetDParam(0, STR_CONFIG_SETTING_VALUE);
|
SetDParam(0, STR_CONFIG_SETTING_VALUE);
|
||||||
int32_t value = sd->Read(ResolveObject(settings_ptr, sd));
|
int32_t value = sd->Read(ResolveObject(settings_ptr, sd));
|
||||||
@@ -3074,7 +3089,7 @@ struct GameSettingsWindow : Window {
|
|||||||
const IntSettingDesc *sd = pe->setting;
|
const IntSettingDesc *sd = pe->setting;
|
||||||
|
|
||||||
/* return if action is only active in network, or only settable by server */
|
/* return if action is only active in network, or only settable by server */
|
||||||
if (!sd->IsEditable()) {
|
if (!pe->IsGUIEditable()) {
|
||||||
this->SetDisplayedHelpText(pe);
|
this->SetDisplayedHelpText(pe);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -88,6 +88,7 @@ enum SettingOnGuiCtrlType {
|
|||||||
SOGCT_CFG_FALLBACK_NAME, ///< Config file name within group fallback
|
SOGCT_CFG_FALLBACK_NAME, ///< Config file name within group fallback
|
||||||
SOGCT_GUI_SPRITE, ///< Show sprite after setting value (i.e. warning)
|
SOGCT_GUI_SPRITE, ///< Show sprite after setting value (i.e. warning)
|
||||||
SOGCT_GUI_WARNING_TEXT, ///< Show warning text
|
SOGCT_GUI_WARNING_TEXT, ///< Show warning text
|
||||||
|
SOGCT_GUI_DISABLE, ///< Disable setting in GUI
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SettingOnGuiCtrlData {
|
struct SettingOnGuiCtrlData {
|
||||||
|
Reference in New Issue
Block a user