Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Feb 2018 03:40:16 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r329619 - head/stand/lua
Message-ID:  <201802200340.w1K3eGlc038755@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Tue Feb 20 03:40:16 2018
New Revision: 329619
URL: https://svnweb.freebsd.org/changeset/base/329619

Log:
  stand/lua: Extract menu handlers out into menu.handlers table
  
  This is a bit cleaner than our former method of an if ... else chain of
  handlers. Store handlers in the menu.handlers table so that they may be
  added to or removed dynamically.
  
  All handlers take the current menu and selected entry as parameters, and
  their return value indicates whether the menu processor should continue or
  not. An omitted return value or 'true' will indicate that we should
  continue, while returning 'false' will indicate that we should exit the
  current menu.
  
  The omitted return value behavior is due to continuing the loop being the
  more common situation.

Modified:
  head/stand/lua/menu.lua

Modified: head/stand/lua/menu.lua
==============================================================================
--- head/stand/lua/menu.lua	Tue Feb 20 02:32:22 2018	(r329618)
+++ head/stand/lua/menu.lua	Tue Feb 20 03:40:16 2018	(r329619)
@@ -42,6 +42,40 @@ local run;
 local autoboot;
 local carousel_choices = {};
 
+menu.handlers = {
+	-- Menu handlers take the current menu and selected entry as parameters,
+	-- and should return a boolean indicating whether execution should
+	-- continue or not. The return value may be omitted if this entry should
+	-- have no bearing on whether we continue or not, indicating that we
+	-- should just continue after execution.
+	[core.MENU_ENTRY] = function(current_menu, entry)
+		-- run function
+		entry.func();
+	end,
+	[core.MENU_CAROUSEL_ENTRY] = function(current_menu, entry)
+		-- carousel (rotating) functionality
+		local carid = entry.carousel_id;
+		local caridx = menu.getCarouselIndex(carid);
+		local choices = entry.items();
+
+		if (#choices > 0) then
+			caridx = (caridx % #choices) + 1;
+			menu.setCarouselIndex(carid, caridx);
+			entry.func(caridx, choices[caridx], choices);
+		end
+	end,
+	[core.MENU_SUBMENU] = function(current_menu, entry)
+		-- recurse
+		return menu.run(entry.submenu());
+	end,
+	[core.MENU_RETURN] = function(current_menu, entry)
+		-- allow entry to have a function/side effect
+		if (entry.func ~= nil) then
+			entry.func();
+		end
+		return false;
+	end,
+};
 -- loader menu tree is rooted at menu.welcome
 
 menu.boot_options = {
@@ -338,31 +372,16 @@ function menu.run(m)
 
 		-- if we have an alias do the assigned action:
 		if (sel_entry ~= nil) then
-			if (sel_entry.entry_type == core.MENU_ENTRY) then
-				-- run function
-				sel_entry.func();
-			elseif (sel_entry.entry_type == core.MENU_CAROUSEL_ENTRY) then
-				-- carousel (rotating) functionality
-				local carid = sel_entry.carousel_id;
-				local caridx = menu.getCarouselIndex(carid);
-				local choices = sel_entry.items();
-
-				if (#choices > 0) then
-					caridx = (caridx % #choices) + 1;
-					menu.setCarouselIndex(carid, caridx);
-					sel_entry.func(caridx, choices[caridx],
-					    choices);
+			-- Get menu handler
+			local handler = menu.handlers[sel_entry.entry_type];
+			if (handler ~= nil) then
+				-- The handler's return value indicates whether
+				-- we need to exit this menu. An omitted return
+				-- value means "continue" by default.
+				cont = handler(m, sel_entry);
+				if (cont == nil) then
+					cont = true;
 				end
-			elseif (sel_entry.entry_type == core.MENU_SUBMENU) then
-				-- recurse
-				cont = menu.run(sel_entry.submenu());
-			elseif (sel_entry.entry_type == core.MENU_RETURN) then
-				-- allow entry to have a function/side effect
-				if (sel_entry.func ~= nil) then
-					sel_entry.func();
-				end
-				-- break recurse
-				cont = false;
 			end
 			-- if we got an alias key the screen is out of date:
 			screen.clear();



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802200340.w1K3eGlc038755>