All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.lessvoid.nifty.controls.scrollbar.UpdateScrollpanelPositionToDisplayElement Maven / Gradle / Ivy

There is a newer version: 1.4.3
Show newest version
package de.lessvoid.nifty.controls.scrollbar;


import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.controls.Scrollbar;
import de.lessvoid.nifty.effects.EffectImpl;
import de.lessvoid.nifty.effects.EffectProperties;
import de.lessvoid.nifty.effects.Falloff;
import de.lessvoid.nifty.elements.Element;
import de.lessvoid.nifty.render.NiftyRenderEngine;
import de.lessvoid.nifty.screen.Screen;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.logging.Logger;

public class UpdateScrollpanelPositionToDisplayElement implements EffectImpl {
  @Nonnull
  private final Logger log = Logger.getLogger(UpdateScrollpanelPositionToDisplayElement.class.getName());
  @Nullable
  private Element targetElement;

  @Override
  public void activate(
      @Nonnull final Nifty nifty,
      @Nonnull final Element elementParameter,
      @Nonnull final EffectProperties parameter) {
    String target = parameter.getProperty("target");
    if (target != null) {
      Screen screen = nifty.getCurrentScreen();
      if (screen == null) {
        log.severe("Can't activate the effect while there is no screen selected as current.");
      } else {
        targetElement = screen.findElementById(target);
      }
    }
  }

  @Override
  public void execute(
      @Nonnull final Element element,
      final float normalizedTime,
      @Nullable final Falloff falloff,
      @Nonnull final NiftyRenderEngine r) {
    if (targetElement != null) {
      Scrollbar verticalScrollbar = targetElement.findNiftyControl("#nifty-internal-vertical-scrollbar",
          Scrollbar.class);
      if (verticalScrollbar == null) {
        log.warning("Failed to locate required internal scrollbar.");
        return;
      }

      int minY = (int) verticalScrollbar.getValue();
      int maxY = (int) verticalScrollbar.getValue() + (int) verticalScrollbar.getWorldPageSize();

      int currentMinY = element.getY() - targetElement.getY() + (int) verticalScrollbar.getValue();
      int currentMaxY = element.getY() - targetElement.getY() + element.getHeight() + (int) verticalScrollbar
          .getValue();

      // below?
      int delta = -1;
      if (currentMinY >= maxY || (currentMinY <= maxY && currentMaxY >= maxY)) {
        // scroll down
        delta = currentMaxY - maxY;
        verticalScrollbar.setValue(minY + delta);
      } else if (currentMaxY <= minY || (currentMinY <= minY && currentMaxY >= minY)) {
        // scroll up
        delta = minY - currentMinY;
        verticalScrollbar.setValue(minY - delta);
      }
      log.fine(minY + ":" + maxY + " - " + currentMinY + ":" + currentMaxY + " - " + delta);
    }
  }

  @Override
  public void deactivate() {
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy