Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add BestRight{Up/Down}DropDirection #897

Closed
howudodat opened this issue Dec 5, 2023 · 1 comment
Closed

add BestRight{Up/Down}DropDirection #897

howudodat opened this issue Dec 5, 2023 · 1 comment
Assignees
Labels
enhancement New feature or request version 2.x.x Version 2.x.x issues
Milestone

Comments

@howudodat
Copy link

howudodat commented Dec 5, 2023

Please add BestRight{Up/Down}DropDirections

  /** Constant <code>BEST_RIGHT_UP_DOWN</code> */
  DropDirection BEST_RIGHT_UP_DOWN = new BestRightUpDownDropDirection();
  /** Constant <code>BEST_RIGHT_DOWN_UP</code> */
  DropDirection BEST_RIGHT_DOWN_UP = new BestRightDownUpDropDirection();

BestRightDownUpDropDirection.java.txt
BestRightUpDownDropDirection.java.txt

DownUp:

/*
 * Copyright © 2019 Dominokit
 *
 * 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 org.dominokit.domino.ui.menu.direction;

import static elemental2.dom.DomGlobal.window;
import static org.dominokit.domino.ui.style.SpacingCss.dui_flex_col_reverse;
import static org.dominokit.domino.ui.utils.Domino.*;

import elemental2.dom.DOMRect;
import elemental2.dom.Element;

/** BestMiddleDownUpDropDirection class. */
public class BestRightDownUpDropDirection implements DropDirection {

  /** {@inheritDoc} */
  @Override
  public void position(Element source, Element target) {
    dui_flex_col_reverse.remove(source);
    cleanup(source);
    DOMRect targetRect = target.getBoundingClientRect();
    DOMRect sourceRect = source.getBoundingClientRect();
    int innerHeight = window.innerHeight;

    double sourceHeight = sourceRect.height;
    double downSpace = innerHeight - targetRect.bottom;

    DropDirection currentPosition;

    if (hasSpaceBelow(sourceHeight, downSpace)) {
      currentPosition = DropDirection.BOTTOM_RIGHT;
    } else {
      currentPosition = DropDirection.TOP_RIGHT;
    }

    currentPosition.position(source, target);
  }

  /** {@inheritDoc} */
  @Override
  public void cleanup(Element source) {
    DropDirection.BOTTOM_RIGHT.cleanup(source);
    DropDirection.TOP_RIGHT.cleanup(source);
  }

  private boolean hasSpaceBelow(double sourceHeight, double downSpace) {
    return downSpace > sourceHeight;
  }

  private boolean hasSpaceOnRightSide(double sourceWidth, double rightSpace) {
    return rightSpace > sourceWidth;
  }
}

UpDown:

/*
 * Copyright © 2019 Dominokit
 *
 * 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 org.dominokit.domino.ui.menu.direction;

import static elemental2.dom.DomGlobal.window;
import static org.dominokit.domino.ui.style.SpacingCss.dui_flex_col_reverse;
import static org.dominokit.domino.ui.utils.Domino.*;

import elemental2.dom.DOMRect;
import elemental2.dom.Element;

/** BestMiddleUpDownDropDirection class. */
public class BestRightUpDownDropDirection implements DropDirection {

  /** {@inheritDoc} */
  @Override
  public void position(Element source, Element target) {
    dui_flex_col_reverse.remove(source);
    cleanup(source);
    DOMRect targetRect = target.getBoundingClientRect();
    DOMRect sourceRect = source.getBoundingClientRect();
    int innerHeight = window.innerHeight;

    double sourceHeight = sourceRect.height;
    double downSpace = innerHeight - targetRect.bottom;
    double spaceUp = downSpace - targetRect.height;

    DropDirection currentPosition;

    if (hasSpaceUp(sourceHeight, spaceUp)) {
      currentPosition = DropDirection.TOP_RIGHT;
    } else {
      currentPosition = DropDirection.BOTTOM_RIGHT;
    }

    currentPosition.position(source, target);
  }

  /** {@inheritDoc} */
  @Override
  public void cleanup(Element source) {
    DropDirection.BOTTOM_RIGHT.cleanup(source);
    DropDirection.TOP_RIGHT.cleanup(source);
  }

  private boolean hasSpaceUp(double sourceHeight, double spaceUp) {
    return spaceUp > sourceHeight;
  }

  private boolean hasSpaceOnRightSide(double sourceWidth, double rightSpace) {
    return rightSpace > sourceWidth;
  }
}

@vegegoku vegegoku self-assigned this Dec 6, 2023
@vegegoku vegegoku added the enhancement New feature or request label Dec 6, 2023
@vegegoku vegegoku added this to the 2.0.0-RC5 milestone Dec 6, 2023
@vegegoku vegegoku added the version 2.x.x Version 2.x.x issues label Dec 7, 2023
@vegegoku
Copy link
Member

vegegoku commented Dec 7, 2023

I believe what we need here is not a new position but fixes to existing ones, I have applied some hope this will solve the issues.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request version 2.x.x Version 2.x.x issues
Projects
Status: Done
Development

No branches or pull requests

2 participants