Navigation - LegendOnline/InventoryAPI GitHub Wiki

GUI Page Navigation

Since Version 1.3 a Router has been implemented. Classes deriving from McGui can be accessed through a URL. With the help of query requests, even methods can be executed. This makes it very easy to Navigate between different GUIs.

A routed GUI

  1. At first a Class needs to be created extending from McGui. A No-Args-Constructor is required!
  2. Use the @Route Annotation to set the URI for a GUI as a String
  3. Now Overload the draw() method from McGui to generate variable Layouts per player, or just initialize the Layout in the super constructor (for static content)
  4. Register the GUI at the Router

A Query

  1. Create a method anywhere inside the class. Private methods are recommended.
  2. Annotate the method with @Query(args="queryParameter") and add a QueryParameter typed parameter at the same position. It's also recommended to use the same name. An example for more query parameters: @Query(args={"first","second","third"}) requires a method like private void demo(QueryParameter first, QueryParameter second, QueryParameter third){...}
  3. Execute a internal Query with a query(queryString) method call, or append ?queryParamerter1=1&queryParameter2=Example.. during Navigation.getInstance().push( "/any/gui/route?$(queryString)" ); call.

Example of a routed GUI with Querymethod

@Route(value = "/languages")
public class LanguageList extends McGui {

    public LanguageList() {
        super( TranslatorPlugin.getInstance(), "Languages", 
               new ListLayout( TranslatorPlugin.getInstance(), getElements(), 
                               round( Dictionary.getInstance().getLanguages().size() ) / 9 ) );
    }

    private void demo()
    {
       //An internal query call that calls the query method of this instance!
       query("?lang=de"); 
    }

   /**
    * This method is used to generate the items for the layout
    */
    private static List<GUIElement> getElements() {
        ArrayList<GUIElement> result = new ArrayList<>();
        for ( Language language : Dictionary.getInstance().getLanguages() ) {
            //Create a GUIPageButton being able to call a query when clicked
            //A GUIPageButton will use the Navigation (no internal query), so a new instance will be created
            GUIPageButton lbl = new GUIPageButton( language.getName(), Material.BOOK, "/languages?lang=" + language.getKey() );
            lbl.addDescription( "\"" + language.getKey() + "\"" );
            //Add GUIPageButton
            result.add( lbl );
        }
        return result;
    }

   /**
    * This method is called when a GUIPageButton is clicked.
    * For path "/languages?lang=de":
    * QueryParameter lang = {"de"}
    */
    @Query(args = "lang")
    private void changeLanguage( QueryParameter lang ) {
        //Get the query value for lang
        String key = lang.get( 0 );
        
        //Do some stuff to change the current global language
        Language language = Dictionary.getInstance().getLanguage( key );
        Player player = getPlayer(); //Players are always available when called from query

        if ( player != null && language != null ) {
            if ( !player.hasPermission( "translator.changeLang" ) ) return;
            Dictionary.getInstance().setGlobalLanguage( language );
            Messages.send( player, Translator.tr( lang( player ), "§aChanged global language to ##", language ) );
        }

    }

}

Register a GUI

public class TranslatorPlugin extends JavaPlugin {

    @Getter
    private static TranslatorPlugin instance;

    @Override
    public void onEnable() {
        instance = this;
        //Just register GUI once
        Router.getInstance().registerGUI( LanguageList.class );
    }

}
⚠️ **GitHub.com Fallback** ⚠️