Context Menus - Can there be too many?

I now have quite a few different assembly types associated with my wall plugin, and unfortunately I am thinking about adding another one. For each assembly type I am creating context menus in my initial plugin load routine/method. The current list of context menus created is given below:

#################################################################
	#
	# Add Context Menus for Editing Wall, Door and Window Assemblies
	#
	#################################################################

	unless file_loaded?(File.basename(__FILE__))
		UI.add_context_menu_handler do |context_menu_medeek1|
  
			if Sketchup.active_model.selection[0].respond_to? :name
  			if Sketchup.active_model.selection[0].name.include?('RECT_WALL_ASSEMBLY_')
   
				# context_menu_medeek1.add_separator
    				context_menu_medeek1.add_item("Edit Wall Assembly") {

					Sketchup.load(File.join(THIS_DIR,"MEDEEK_RECTANGULAR_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.rect_wall_edit_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek1.add_item("Regen Wall Assembly") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_RECTANGULAR_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.rect_wall_regen_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek1.add_item("2D") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_RECTANGULAR_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.rect_wall_3D_2D_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek1.add_item("3D (No Framing)") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_RECTANGULAR_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.rect_wall_2D_3D_menu pluginversion, pluginserial, pluginlang, "NO"
    				}

				if pluginserial != "LT"
					context_menu_medeek1.add_item("3D (Full Framing)") {
   
						Sketchup.load(File.join(THIS_DIR,"MEDEEK_RECTANGULAR_WALL"))
						Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.rect_wall_2D_3D_menu pluginversion, pluginserial, pluginlang, "YES"
    					}
				end

				context_menu_medeek1.add_item("CMU") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_RECTANGULAR_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.rect_wall_2D_3D_menu pluginversion, pluginserial, pluginlang, "CMU"
    				}
  			end
			end
		end

		UI.add_context_menu_handler do |context_menu_medeek2|
  
			if Sketchup.active_model.selection[0].respond_to? :name
  			if Sketchup.active_model.selection[0].name.include?('GABLE_WALL_ASSEMBLY_')
   
				# context_menu_medeek2.add_separator
    				context_menu_medeek2.add_item("Edit Gable Wall Assembly") {
      					
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_GABLE_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.gable_wall_edit_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek2.add_item("Regen Wall Assembly") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_GABLE_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.gable_wall_regen_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek2.add_item("2D") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_GABLE_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.gable_wall_3D_2D_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek2.add_item("3D (No Framing)") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_GABLE_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.gable_wall_2D_3D_menu pluginversion, pluginserial, pluginlang, "NO"
    				}

				if pluginserial != "LT"
					context_menu_medeek2.add_item("3D (Full Framing)") {
   
						Sketchup.load(File.join(THIS_DIR,"MEDEEK_GABLE_WALL"))
						Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.gable_wall_2D_3D_menu pluginversion, pluginserial, pluginlang, "YES"
    					}
				end

				context_menu_medeek2.add_item("CMU") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_GABLE_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.gable_wall_2D_3D_menu pluginversion, pluginserial, pluginlang, "CMU"
    				}
  			end
			end
		end

		UI.add_context_menu_handler do |context_menu_medeek5|
  
			if Sketchup.active_model.selection[0].respond_to? :name
  			if Sketchup.active_model.selection[0].name.include?('SHED_WALL_ASSEMBLY_')
   
				# context_menu_medeek5.add_separator
    				context_menu_medeek5.add_item("Edit Shed Wall Assembly") {
      					
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_SHED_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.shed_wall_edit_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek5.add_item("Regen Wall Assembly") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_SHED_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.shed_wall_regen_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek5.add_item("2D") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_SHED_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.shed_wall_3D_2D_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek5.add_item("3D (No Framing)") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_SHED_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.shed_wall_2D_3D_menu pluginversion, pluginserial, pluginlang, "NO"
    				}

				if pluginserial != "LT"
					context_menu_medeek5.add_item("3D (Full Framing)") {
   
						Sketchup.load(File.join(THIS_DIR,"MEDEEK_SHED_WALL"))
						Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.shed_wall_2D_3D_menu pluginversion, pluginserial, pluginlang, "YES"
    					}
				end

				context_menu_medeek5.add_item("CMU") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_SHED_WALL"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.shed_wall_2D_3D_menu pluginversion, pluginserial, pluginlang, "CMU"
    				}
  			end
			end
		end

		#################################################################
		#
		# Add Context Menus for Editing Beam Assemblies
		#
		#################################################################
		
		UI.add_context_menu_handler do |context_menu_medeek3|
  
			if Sketchup.active_model.selection[0].respond_to? :name
  			if Sketchup.active_model.selection[0].name.include?('BEAM_ASSEMBLY_')
   
				# context_menu_medeek3.add_separator
    				context_menu_medeek3.add_item("Edit Beam Assembly") {

					Sketchup.load(File.join(THIS_DIR,"MEDEEK_BEAM_TOOLS"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.beam_edit_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek3.add_item("Regen Beam Assembly") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_BEAM_TOOLS"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.beam_regen_menu pluginversion, pluginserial, pluginlang
    				}
  			end
			end
		end

		#################################################################
		#
		# Add Context Menus for Editing Post Assemblies
		#
		#################################################################
		
		UI.add_context_menu_handler do |context_menu_medeek3|
  
			if Sketchup.active_model.selection[0].respond_to? :name
  			if Sketchup.active_model.selection[0].name.include?('POST_ASSEMBLY_')
   
				# context_menu_medeek3.add_separator
    				context_menu_medeek3.add_item("Edit Post Assembly") {

					Sketchup.load(File.join(THIS_DIR,"MEDEEK_POST_TOOLS"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.post_edit_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek3.add_item("Regen Post Assembly") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_POST_TOOLS"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.post_regen_menu pluginversion, pluginserial, pluginlang
    				}
  			end
			end
		end

		#################################################################
		#
		# Add Context Menus for Editing Stair Assemblies
		#
		#################################################################
		
		UI.add_context_menu_handler do |context_menu_medeek4|
  
			if Sketchup.active_model.selection[0].respond_to? :name
  			if Sketchup.active_model.selection[0].name.include?('STAIR_ASSEMBLY_')
   
				# context_menu_medeek4.add_separator
    				context_menu_medeek4.add_item("Edit Stair Assembly") {

					Sketchup.load(File.join(THIS_DIR,"MEDEEK_STAIR_TOOLS"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.stair_edit_menu pluginversion, pluginserial, pluginlang
    				}

				context_menu_medeek4.add_item("Regen Stair Assembly") {
   
					Sketchup.load(File.join(THIS_DIR,"MEDEEK_STAIR_TOOLS"))
					Medeek_Engineering_Inc_Extensions::MedeekWallPlugin::Wall::MedeekMethods.stair_regen_menu pluginversion, pluginserial, pluginlang
    				}
  			end
			end
		end

My concern is that adding all of these context menu handlers will slow down the performance of SketchUp or the model. However, I haven’t noticed any significant problems to date even with what I have so far. Just looking for some guidance or what would be considered best practice in this regard.

I would think that context menu handler blocks are only executed when the user clicks the right-mouse button, or opens the Edit menu’s context submenu.

Consider creating a submenu if your extension’s menu item count is very large.

1 Like

Fair enough, that should not slow down SketchUp then (until you right click on something).

What exactly is the Edit Menu’s context submenu?

Open SketchUp, insert a component.
Right click it and view the context menu.
Then compare to the context submenu at the bottom of the Edit menu.

Select a primitive (edge or face,) repeat compare.

1 Like

Okay wow, I didn’t even know the Edit menu did that.

It does this I think so that users can create shortcuts to context commands through the Preferences dialog.

1 Like