mirror of
https://github.com/jugeeya/UltimateTrainingModpack.git
synced 2025-03-14 02:16:10 +00:00
Add ability to reset menus to the default (#221)
* Make a separate default menu * Add "default" to menu structs in menu.rs * Add resetSubmenu and resetAllSubmenus functionality * Add Frame Advantage default * Add reset buttons to menu header * Right-justify the reset button descriptions * Update comments Co-authored-by: asimon-1 <asimon1@protonmail.com>
This commit is contained in:
parent
3d563b9450
commit
18cca3023c
4 changed files with 108 additions and 31 deletions
|
@ -685,10 +685,12 @@ impl to_url_param for i32 {
|
|||
// Macro to build the url parameter string
|
||||
macro_rules! url_params {
|
||||
(
|
||||
#[derive($($trait_name:ident, )*)]
|
||||
pub struct $e:ident {
|
||||
$(pub $field_name:ident: $field_type:ty,)*
|
||||
}
|
||||
) => {
|
||||
#[derive($($trait_name, )*)]
|
||||
pub struct $e {
|
||||
$(pub $field_name: $field_type,)*
|
||||
}
|
||||
|
@ -710,6 +712,7 @@ macro_rules! url_params {
|
|||
|
||||
#[repr(C)]
|
||||
url_params! {
|
||||
#[derive(Clone, Copy, )]
|
||||
pub struct TrainingModpackMenu {
|
||||
pub hitbox_vis: OnOff,
|
||||
pub stage_hazards: OnOff,
|
||||
|
|
|
@ -22,15 +22,17 @@ struct Toggle<'a> {
|
|||
checked: &'a str,
|
||||
index: usize,
|
||||
value: usize,
|
||||
default: &'a str,
|
||||
}
|
||||
|
||||
impl<'a> Toggle<'a> {
|
||||
pub fn new(title: &'a str, checked: bool, value: usize) -> Toggle<'a> {
|
||||
Toggle{
|
||||
title: title,
|
||||
checked: if checked { "is-appear "} else { "is-hidden" },
|
||||
checked: if checked { "is-appear"} else { "is-hidden" },
|
||||
index: 0,
|
||||
value
|
||||
value,
|
||||
default: if checked { "is-appear"} else { "is-hidden" },
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -38,14 +40,16 @@ impl<'a> Toggle<'a> {
|
|||
#[derive(Content)]
|
||||
struct OnOffSelector<'a> {
|
||||
title: &'a str,
|
||||
checked: &'a str
|
||||
checked: &'a str,
|
||||
default: &'a str,
|
||||
}
|
||||
|
||||
impl <'a>OnOffSelector<'a> {
|
||||
pub fn new(title: &'a str, checked: bool) -> OnOffSelector<'a> {
|
||||
OnOffSelector {
|
||||
title: title,
|
||||
checked: if checked { "is-appear "} else { "is-hidden" }
|
||||
checked: if checked { "is-appear"} else { "is-hidden" },
|
||||
default: if checked { "is-appear"} else { "is-hidden" },
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -70,12 +74,13 @@ impl<'a> SubMenu<'a> {
|
|||
.unwrap_or(self.index)
|
||||
}
|
||||
|
||||
pub fn add_toggle(&mut self, title: &'a str, checked: bool, value: usize) {
|
||||
pub fn add_toggle(&mut self, title: &'a str, checked: bool, value: usize, default: bool) {
|
||||
self.toggles.push(Toggle{
|
||||
title: title,
|
||||
checked: if checked { "is-appear "} else { "is-hidden" },
|
||||
checked: if checked { "is-appear"} else { "is-hidden" },
|
||||
index: self.max_idx() + 1,
|
||||
value
|
||||
value,
|
||||
default: if default { "is-appear"} else { "is-hidden" },
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -88,12 +93,13 @@ impl<'a> SubMenu<'a> {
|
|||
});
|
||||
}
|
||||
|
||||
pub fn add_onoffselector(&mut self, title: &'a str, checked: bool) {
|
||||
pub fn add_onoffselector(&mut self, title: &'a str, checked: bool, default: bool) {
|
||||
// TODO: Is there a more elegant way to do this?
|
||||
// The HTML only supports a single onoffselector but the SubMenu stores it as a Vec
|
||||
self.onoffselector.push(OnOffSelector{
|
||||
title: title,
|
||||
checked: if checked { "is-appear "} else { "is-hidden" }
|
||||
checked: if checked { "is-appear"} else { "is-hidden" },
|
||||
default: if default { "is-appear"} else { "is-hidden" },
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -112,7 +118,7 @@ impl<'a> Menu<'a> {
|
|||
.unwrap_or(0)
|
||||
}
|
||||
|
||||
pub fn add_sub_menu(&mut self, title: &'a str, id: &'a str, check_against: usize, toggles: Vec<(&'a str, usize)>, sliders: Vec<(usize,usize,usize)>) {
|
||||
pub fn add_sub_menu(&mut self, title: &'a str, id: &'a str, check_against: usize, toggles: Vec<(&'a str, usize)>, sliders: Vec<(usize,usize,usize)>, defaults: usize) {
|
||||
let mut sub_menu = SubMenu {
|
||||
title: title,
|
||||
id: id,
|
||||
|
@ -124,7 +130,7 @@ impl<'a> Menu<'a> {
|
|||
};
|
||||
|
||||
for toggle in toggles {
|
||||
sub_menu.add_toggle(toggle.0, (check_against & toggle.1) != 0, toggle.1)
|
||||
sub_menu.add_toggle(toggle.0, (check_against & toggle.1) != 0, toggle.1, (defaults & toggle.1) != 0)
|
||||
}
|
||||
|
||||
for slider in sliders {
|
||||
|
@ -134,7 +140,7 @@ impl<'a> Menu<'a> {
|
|||
self.sub_menus.push(sub_menu);
|
||||
}
|
||||
|
||||
pub fn add_sub_menu_sep(&mut self, title: &'a str, id: &'a str, check_against: usize, strs: Vec<&'a str>, vals: Vec<usize>) {
|
||||
pub fn add_sub_menu_sep(&mut self, title: &'a str, id: &'a str, check_against: usize, strs: Vec<&'a str>, vals: Vec<usize>, defaults: usize) {
|
||||
let mut sub_menu = SubMenu {
|
||||
title: title,
|
||||
id: id,
|
||||
|
@ -146,7 +152,7 @@ impl<'a> Menu<'a> {
|
|||
};
|
||||
|
||||
for i in 0..strs.len() {
|
||||
sub_menu.add_toggle(strs[i], (check_against & vals[i]) != 0, vals[i])
|
||||
sub_menu.add_toggle(strs[i], (check_against & vals[i]) != 0, vals[i], (defaults & vals[i]) != 0)
|
||||
}
|
||||
|
||||
// TODO: add sliders?
|
||||
|
@ -154,7 +160,7 @@ impl<'a> Menu<'a> {
|
|||
self.sub_menus.push(sub_menu);
|
||||
}
|
||||
|
||||
pub fn add_sub_menu_onoff(&mut self, title: &'a str, id: &'a str, check_against: usize, checked: bool) {
|
||||
pub fn add_sub_menu_onoff(&mut self, title: &'a str, id: &'a str, check_against: usize, checked: bool, default: usize) {
|
||||
let mut sub_menu = SubMenu {
|
||||
title: title,
|
||||
id: id,
|
||||
|
@ -165,7 +171,7 @@ impl<'a> Menu<'a> {
|
|||
check_against: check_against
|
||||
};
|
||||
|
||||
sub_menu.add_onoffselector(title, checked);
|
||||
sub_menu.add_onoffselector(title, checked, (default & OnOff::On as usize) != 0);
|
||||
self.sub_menus.push(sub_menu);
|
||||
}
|
||||
}
|
||||
|
@ -181,7 +187,8 @@ macro_rules! add_bitflag_submenu {
|
|||
stringify!($id),
|
||||
MENU.$id.bits() as usize,
|
||||
[<$id _strs>].iter().map(|i| i.as_str()).collect(),
|
||||
[<$id _vals>]
|
||||
[<$id _vals>],
|
||||
DEFAULT_MENU.$id.bits() as usize,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -261,7 +268,8 @@ pub unsafe fn write_menu() {
|
|||
("Medium", SdiStrength::Medium as usize),
|
||||
("High", SdiStrength::High as usize),
|
||||
].to_vec(),
|
||||
[].to_vec()
|
||||
[].to_vec(),
|
||||
DEFAULT_MENU.sdi_strength as usize,
|
||||
);
|
||||
|
||||
overall_menu.add_sub_menu(
|
||||
|
@ -273,7 +281,8 @@ pub unsafe fn write_menu() {
|
|||
("Hold", Shield::Hold as usize),
|
||||
("Infinite", Shield::Infinite as usize),
|
||||
].to_vec(),
|
||||
[].to_vec()
|
||||
[].to_vec(),
|
||||
DEFAULT_MENU.shield_state as usize,
|
||||
);
|
||||
|
||||
overall_menu.add_sub_menu(
|
||||
|
@ -285,7 +294,8 @@ pub unsafe fn write_menu() {
|
|||
("Alternate", SaveStateMirroring::Alternate as usize),
|
||||
("Random", SaveStateMirroring::Random as usize),
|
||||
].to_vec(),
|
||||
[].to_vec()
|
||||
[].to_vec(),
|
||||
DEFAULT_MENU.save_state_mirroring as usize,
|
||||
);
|
||||
|
||||
// Slider menus
|
||||
|
@ -297,7 +307,8 @@ pub unsafe fn write_menu() {
|
|||
[].to_vec(),
|
||||
[
|
||||
(0, 10, MENU.input_delay as usize)
|
||||
].to_vec()
|
||||
].to_vec(),
|
||||
DEFAULT_MENU.input_delay as usize,
|
||||
);
|
||||
|
||||
|
||||
|
@ -306,32 +317,37 @@ pub unsafe fn write_menu() {
|
|||
"Save Damage",
|
||||
"save_damage",
|
||||
MENU.save_damage as usize,
|
||||
(MENU.save_damage as usize & OnOff::On as usize) != 0
|
||||
(MENU.save_damage as usize & OnOff::On as usize) != 0,
|
||||
DEFAULT_MENU.save_damage as usize,
|
||||
);
|
||||
overall_menu.add_sub_menu_onoff(
|
||||
"Hitbox Visualization",
|
||||
"hitbox_vis",
|
||||
MENU.hitbox_vis as usize,
|
||||
(MENU.hitbox_vis as usize & OnOff::On as usize) != 0
|
||||
(MENU.hitbox_vis as usize & OnOff::On as usize) != 0,
|
||||
DEFAULT_MENU.hitbox_vis as usize,
|
||||
);
|
||||
|
||||
overall_menu.add_sub_menu_onoff(
|
||||
"Stage Hazards",
|
||||
"stage_hazards",
|
||||
MENU.stage_hazards as usize,
|
||||
(MENU.stage_hazards as usize & OnOff::On as usize) != 0
|
||||
(MENU.stage_hazards as usize & OnOff::On as usize) != 0,
|
||||
DEFAULT_MENU.stage_hazards as usize,
|
||||
);
|
||||
overall_menu.add_sub_menu_onoff(
|
||||
"Frame Advantage",
|
||||
"frame_advantage",
|
||||
MENU.frame_advantage as usize,
|
||||
(MENU.frame_advantage as usize & OnOff::On as usize) != 0
|
||||
(MENU.frame_advantage as usize & OnOff::On as usize) != 0,
|
||||
DEFAULT_MENU.frame_advantage as usize,
|
||||
);
|
||||
overall_menu.add_sub_menu_onoff(
|
||||
"Mash In Neutral",
|
||||
"mash_in_neutral",
|
||||
MENU.mash_in_neutral as usize,
|
||||
(MENU.mash_in_neutral as usize & OnOff::On as usize) != 0
|
||||
(MENU.mash_in_neutral as usize & OnOff::On as usize) != 0,
|
||||
DEFAULT_MENU.mash_in_neutral as usize,
|
||||
);
|
||||
|
||||
let data = tpl.render(&overall_menu);
|
||||
|
|
|
@ -8,8 +8,7 @@ use smash::app::{self, lua_bind::*};
|
|||
use smash::hash40;
|
||||
use smash::lib::lua_const::*;
|
||||
|
||||
|
||||
pub static mut MENU: consts::TrainingModpackMenu = consts::TrainingModpackMenu {
|
||||
pub static DEFAULT_MENU: consts::TrainingModpackMenu = consts::TrainingModpackMenu {
|
||||
hitbox_vis: OnOff::On,
|
||||
stage_hazards: OnOff::Off,
|
||||
di_state: Direction::empty(),
|
||||
|
@ -40,6 +39,8 @@ pub static mut MENU: consts::TrainingModpackMenu = consts::TrainingModpackMenu {
|
|||
frame_advantage: OnOff::Off
|
||||
};
|
||||
|
||||
|
||||
pub static mut MENU: TrainingModpackMenu = DEFAULT_MENU;
|
||||
pub static mut FIGHTER_MANAGER_ADDR: usize = 0;
|
||||
pub static mut STAGE_MANAGER_ADDR: usize = 0;
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
||||
<title>Document</title>
|
||||
<link rel="stylesheet" href="./help/css/common.css" />
|
||||
<link rel="stylesheet" href="./help/css/qa.css" />
|
||||
|
@ -69,6 +69,15 @@
|
|||
width: auto;
|
||||
}
|
||||
|
||||
/* Handle alignment of items in the header */
|
||||
.l-header {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
/* Set menu description color */
|
||||
.header-desc {
|
||||
color: white;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
|
@ -86,7 +95,7 @@
|
|||
Training
|
||||
Modpack Menu</span></div>
|
||||
</div>
|
||||
<div class="header">
|
||||
<div class="header" style="flex-grow: 1;">
|
||||
<a id="ret-button" tabindex="-1" class="header-decoration" href="javascript:goBackHook();" nx-se-disabled="">
|
||||
<div class="ret-icon-wrapper">
|
||||
<img class="ret-icon-shadow is-appear" ref="./help/img/icon/m_retnormal.svg" src="./help/img/icon/m_retnormal.svg">
|
||||
|
@ -94,6 +103,10 @@
|
|||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="header f-u-bold" style="flex-direction: column; justify-content: center; align-items: end;">
|
||||
<p class="header-desc">Reset Current Menu: </p>
|
||||
<p class="header-desc">Reset All Menus: </p>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
|
@ -137,7 +150,7 @@
|
|||
<div class="keyword-button-outer">
|
||||
<a tabindex="{{index}}" class="flex-button keyword-button scuffle-thema" href="javascript:void(0)" onclick="clickToggle(this);" nx-se-disabled="">
|
||||
<div class="button-icon-wrapper">
|
||||
<img class="button-icon toggle {{checked}}" ref="./check.svg" src="./check.svg">
|
||||
<img class="button-icon toggle {{checked}}" ref="./check.svg" src="./check.svg" default="{{default}}">
|
||||
</div>
|
||||
<div class="button-msg-wrapper">
|
||||
<div class="keyword-message f-u-bold">
|
||||
|
@ -195,7 +208,7 @@
|
|||
<div id="question-{{id}}" class="question scuffle-thema">
|
||||
<div id="{{id}}" class="onoff">
|
||||
<img class="question-icon" style="z-index: 1;" ref="./{{id}}.svg" src="./{{id}}.svg" />
|
||||
<div><img class="question-icon toggle {{checked}}" style="z-index: 2;" ref="./check.svg" src="./check.svg" /></div>
|
||||
<div><img class="question-icon toggle {{checked}}" style="z-index: 2;" ref="./check.svg" src="./check.svg" default="{{default}}"/></div>
|
||||
<p class="keyword-message f-u-bold">
|
||||
{{title}}
|
||||
</p>
|
||||
|
@ -228,6 +241,12 @@
|
|||
window.nx.footer.setAssign('B', '', goBackHook, {
|
||||
se: ''
|
||||
})
|
||||
window.nx.footer.setAssign('X', '', resetSubmenu, {
|
||||
se: ''
|
||||
})
|
||||
window.nx.footer.setAssign('L', '', resetAllSubmenus, {
|
||||
se: ''
|
||||
})
|
||||
}
|
||||
function goBackHook() {
|
||||
// If any submenus are open, close them
|
||||
|
@ -347,6 +366,44 @@
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
function resetSubmenu() {
|
||||
// Resets any open or focused submenus to the default values
|
||||
$("[default*='is-appear']").each(function () {
|
||||
if (isSubmenuFocused(this)) {
|
||||
this.classList.add("is-appear");
|
||||
this.classList.remove("is-hidden");
|
||||
}
|
||||
});
|
||||
$("[default*='is-hidden']").each(function() {
|
||||
if (isSubmenuFocused(this)) {
|
||||
this.classList.remove("is-appear");
|
||||
this.classList.add("is-hidden");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function isSubmenuFocused(elem) {
|
||||
// Return true if the element is in a submenu which is either focused or opened
|
||||
return (
|
||||
$(elem).closest(".l-qa").children(".is-opened, .is-focused").length
|
||||
|| $(elem).closest(".is-focused").length
|
||||
)
|
||||
}
|
||||
|
||||
function resetAllSubmenus() {
|
||||
// Resets all submenus to the default values
|
||||
if (confirm("Are you sure that you want to reset all menu settings to the default?")) {
|
||||
$("[default*='is-appear']").each(function () {
|
||||
this.classList.add("is-appear");
|
||||
this.classList.remove("is-hidden");
|
||||
});
|
||||
$("[default*='is-hidden']").each(function() {
|
||||
this.classList.remove("is-appear");
|
||||
this.classList.add("is-hidden");
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
window.onload = setSettings;
|
||||
|
|
Loading…
Add table
Reference in a new issue