1
0
Fork 0
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:
asimon-1 2021-08-11 07:45:57 -07:00 committed by GitHub
parent 3d563b9450
commit 18cca3023c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 108 additions and 31 deletions

View file

@ -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,

View file

@ -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);

View file

@ -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;

View file

@ -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: &#xE0A2;</p>
<p class="header-desc">Reset All Menus: &#xE0A4;</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;