Navigation - LegendOnline/InventoryAPI GitHub Wiki
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.
- At first a Class needs to be created extending from
McGui
. A No-Args-Constructor is required! - Use the
@Route
Annotation to set the URI for a GUI as a String - Now Overload the
draw()
method fromMcGui
to generate variable Layouts per player, or just initialize the Layout in the super constructor (for static content) - Register the GUI at the Router
- Create a method anywhere inside the class. Private methods are recommended.
- Annotate the method with
@Query(args="queryParameter")
and add aQueryParameter
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 likeprivate void demo(QueryParameter first, QueryParameter second, QueryParameter third){...}
- Execute a internal Query with a
query(queryString)
method call, or append?queryParamerter1=1&queryParameter2=Example..
duringNavigation.getInstance().push( "/any/gui/route?$(queryString)" );
call.
@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 ) );
}
}
}
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 );
}
}