com.agateau.ui.menu.MenuScrollPane.java Source code

Java tutorial

Introduction

Here is the source code for com.agateau.ui.menu.MenuScrollPane.java

Source

/*
 * Copyright 2017 Aurlien Gteau <mail@agateau.com>
 *
 * This file is part of Pixel Wheels.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License.
 *
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */
package com.agateau.ui.menu;

import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;

/**
 * A ScrollPane which can track the current item of a menu
 */
public class MenuScrollPane extends ScrollPane {
    private Menu mMenu;
    private final Vector2 mTmp = new Vector2();

    private ChangeListener mListener = new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            layout();
            ensureItemVisible();
        }
    };

    public MenuScrollPane(Menu menu) {
        super(null);
        // Do not steal touch events from items like sliders
        setCancelTouchFocus(false);
        setMenu(menu);
    }

    public Menu getMenu() {
        return mMenu;
    }

    public void setMenu(Menu menu) {
        setWidget(menu);
        mMenu = menu;
        mMenu.addListener(mListener);
    }

    public float getPrefWidth() {
        return mMenu.getWidth();
    }

    private void ensureItemVisible() {
        Menu.MenuStyle style = mMenu.getMenuStyle();

        MenuItem item = mMenu.getCurrentItem();
        Rectangle rect = item.getFocusRectangle();
        mTmp.set(rect.x, rect.y);
        item.getActor().localToAscendantCoordinates(mMenu, mTmp);
        scrollTo(mTmp.x - style.focusPadding, mTmp.y - style.focusPadding, rect.width + 2 * style.focusPadding,
                rect.height + 2 * style.focusPadding);
    }
}