Skip to content

Commit

Permalink
wmlunits: Partial re-design of the navigation menu implementation
Browse files Browse the repository at this point in the history
Needed in order to be able to style things better, especially for the
column layout popups.
  • Loading branch information
irydacea committed Aug 27, 2017
1 parent f1eb040 commit f28dafa
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 29 deletions.
37 changes: 18 additions & 19 deletions data/tools/unit_tree/html_output.py
Expand Up @@ -489,7 +489,7 @@ def abbrev(name):
abbrev += name[i]
return abbrev

def add_menu(menuid, name, classes='', is_table_container=False):
def add_menu(menuid, name, classes='', url='', is_table_container=False):
"""
Writes the initial portion of a sidebar item, including the item's
label, the start tag for the popup menu container, and the label
Expand All @@ -498,20 +498,29 @@ def add_menu(menuid, name, classes='', is_table_container=False):
If is_table_container=True, the popup menu prolog is suitable for
a table (currently used for the Language menu). This will be
removed one day, hopefully. (TODO)
The url parameter allows setting a destination URL for the menu
header, which will be a link if it is set to a non-empty string.
"""
html_name = cleantext(name)
html_classes = " ".join((cleantext(classes), "popuptrigger"))
write('<li class="popupcontainer" role="menuitem" aria-haspopup="true">')
write('<a class="' + html_classes + '" href="#">' + html_name + '</a>')
write('<div id="%s" class="popupmenu" role="menu" aria-label="%s">' %
(menuid, html_name))
write('<div class="popupheader">' + html_name + '</div>')
if menuid:
write('<div id="%s" class="popupmenu" role="menu" aria-label="%s">' %
(menuid, html_name))
else:
write('<div class="popupmenu" role="menu" aria-label="%s">' % html_name)
if url:
write('<a class="popupheader" href="' + url + '">' + html_name + '</a>')
else:
write('<div class="popupheader">' + html_name + '</div>')
if not is_table_container:
write('<ul>')

def add_menuitem_placeholder():
"""Writes a horizontal bar serving as a menu placeholder."""
write('<li>' + HTML_ENTITY_HORIZONTAL_BAR + '</li>')
write('<li class="menuplaceholder">' + HTML_ENTITY_HORIZONTAL_BAR + '</li>')

def add_menuitem(url, label, standalone=False, title=''):
"""
Expand Down Expand Up @@ -624,23 +633,14 @@ def end_menu(is_table_container=False):
races[racename] = runits

racelist = sorted(races.keys())
got_menu = False
menuid = 0
for r in racelist:
# Some add-ons use race names consisting of only whitespace for
# hiding races in the UI. We need to skip those since otherwise
# they result in unusual markup (e.g. invisible <a> elements).
if not r.strip():
continue
if got_menu:
end_menu()
add_menu("units_menu" + str(menuid), r, "unitmenu")
menuid += 1
got_menu = True
c = self.campaign
if c == "units":
c = "mainline"
add_menuitem('%s#%s' % (cleanurl(target), cleanurl(r)), r)
race_url = "%s#%s" % (cleanurl(target), cleanurl(r))
add_menu("", r, "unitmenu", url=race_url)
for uid in races[r]:
un = self.wesnoth.unit_lookup[uid]
if un.hidden:
Expand All @@ -656,7 +656,6 @@ def end_menu(is_table_container=False):
error_message("Warning: Unit uid=" + uid + " has no name.\n")
name = uid
add_menuitem(link, name)
if got_menu:
end_menu()

# Languages
Expand Down Expand Up @@ -1433,7 +1432,7 @@ def html_postprocess_file(filename, isocode, batchlist):
chtml += '<li><a title="%s" href="%s" role="menuitem">%s</a></li>\n' % (
cleantext(campname), url, cleantext(campname, quote=False))
if i == 0 and cids[1]:
chtml += '<li>%s</li>\n' % HTML_ENTITY_HORIZONTAL_BAR
chtml += '</ul><ul>'

eids = [[], []]
for addon in batchlist:
Expand All @@ -1457,7 +1456,7 @@ def html_postprocess_file(filename, isocode, batchlist):
ehtml += '<li><a title="%s" href="%s" role="menuitem">%s</a></li>\n' % (
cleantext(eraname), url, cleantext(eraname, quote=False))
if i == 0 and eids[1]:
ehtml += '<li>%s</li>\n' % HTML_ENTITY_HORIZONTAL_BAR
ehtml += '</ul><ul>'

f = open(filename, "r+b")
html = f.read().decode("utf8")
Expand Down
60 changes: 50 additions & 10 deletions data/tools/unit_tree/menu.js
Expand Up @@ -5,17 +5,57 @@ var wmlunits_menu_setup = (function() {
var menus = [];
var visibleMenu = false;

function toggleMenu(event, menu)
//
// Legacy browser support functions (IE 9 only, really)
//

function removeClass(e, classId)
{
hideMenus(menu);
var prevClasses = e.className.split(/\s+/),
newClasses = [];

for (var i = 0; i < prevClasses.length; ++i) {
if (prevClasses[i] != classId) {
newClasses.push(prevClasses[i]);
}
}

e.className = newClasses.join(" ");
}

function toggleClass(e, classId)
{
var prevClasses = e.className.split(/\s+/),
newClasses = [],
foundClass = false;

for (var i = 0; i < prevClasses.length; ++i) {
if (prevClasses[i] == classId) {
foundClass = true;
} else {
newClasses.push(prevClasses[i]);
}
}

if (!menu.style.display || menu.style.display === "none") {
menu.style.display = "block";
visibleMenu = true;
} else {
menu.style.display = "none";
visibleMenu = false;
if (!foundClass) {
newClasses.push(classId);
}

e.className = newClasses.join(" ");

return !foundClass;
}

//
// The main stuff
//

function toggleMenu(event, menu)
{
var menu = event.target.nextElementSibling;

hideMenus(menu);
visibleMenu = toggleClass(event.target, "menu-visible");
}

function hideMenus(skipMenu)
Expand All @@ -26,7 +66,7 @@ var wmlunits_menu_setup = (function() {

for (var i = 0; i < menus.length; ++i) {
if (menus[i] !== skipMenu) {
menus[i].style.display = "none";
removeClass(menus[i].previousElementSibling, "menu-visible");
}
}
}
Expand Down Expand Up @@ -56,7 +96,7 @@ var wmlunits_menu_setup = (function() {
a.addEventListener("click", function(event) {
event.preventDefault();
event.stopPropagation();
toggleMenu(event, event.target.nextElementSibling);
toggleMenu(event);
}, false);
}

Expand Down

0 comments on commit f28dafa

Please sign in to comment.