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

doodle.algebra.Layout.scala Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2015 Creative Scala
 *
 * 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 doodle
package algebra

import cats.Semigroup
import doodle.core.Angle
import doodle.core.Landmark
import doodle.core.Point
import doodle.core.Vec

trait Layout extends Algebra {

  /** Place the origin of top on the origin of bottom */
  def on[A](top: Drawing[A], bottom: Drawing[A])(implicit
      s: Semigroup[A]
  ): Drawing[A]
  def beside[A](left: Drawing[A], right: Drawing[A])(implicit
      s: Semigroup[A]
  ): Drawing[A]
  def above[A](top: Drawing[A], bottom: Drawing[A])(implicit
      s: Semigroup[A]
  ): Drawing[A]

  /** Displace img by the given landmark relative to the origin, expanding the
    * bounding box if necessary to include the relocated image.
    */
  def at[A](img: Drawing[A], landmark: Landmark): Drawing[A]

  /** Place the origin of img at the given landmark, expanding the bounding box
    * if necessary to include the relocated origin.
    */
  def originAt[A](img: Drawing[A], landmark: Landmark): Drawing[A]

  /** Expand the bounding box of img by the given amounts. */
  def margin[A](
      img: Drawing[A],
      top: Double,
      right: Double,
      bottom: Double,
      left: Double
  ): Drawing[A]

  /** Set the width and height of the given `Drawing's` bounding box to the
    * given values. The new bounding box has the same origin as the original
    * bounding box, and extends symmetrically above and below, and left and
    * right of the origin.
    */
  def size[A](img: Drawing[A], width: Double, height: Double): Drawing[A]

  // Derived methods

  def under[A](bottom: Drawing[A], top: Drawing[A])(implicit
      s: Semigroup[A]
  ): Drawing[A] =
    on(top, bottom)
  def below[A](bottom: Drawing[A], top: Drawing[A])(implicit
      s: Semigroup[A]
  ): Drawing[A] =
    above(top, bottom)

  def at[A](img: Drawing[A], x: Double, y: Double): Drawing[A] =
    at(img, Landmark.point(x, y))
  def at[A](img: Drawing[A], r: Double, a: Angle): Drawing[A] = {
    val offset = Point(r, a)
    at(img, offset.x, offset.y)
  }
  def at[A](img: Drawing[A], offset: Vec): Drawing[A] =
    at(img, offset.x, offset.y)
  def at[A](img: Drawing[A], offset: Point): Drawing[A] =
    at(img, offset.x, offset.y)

  def originAt[A](img: Drawing[A], x: Double, y: Double): Drawing[A] =
    originAt(img, Landmark.point(x, y))
  def originAt[A](img: Drawing[A], r: Double, a: Angle): Drawing[A] = {
    val offset = Point(r, a)
    originAt(img, offset.x, offset.y)
  }
  def originAt[A](img: Drawing[A], offset: Vec): Drawing[A] =
    originAt(img, offset.x, offset.y)
  def originAt[A](img: Drawing[A], offset: Point): Drawing[A] =
    originAt(img, offset.x, offset.y)

  def margin[A](img: Drawing[A], width: Double, height: Double): Drawing[A] =
    margin(img, height, width, height, width)
  def margin[A](img: Drawing[A], width: Double): Drawing[A] =
    margin(img, width, width, width, width)

  /** Utility to set the width and height to the same value. */
  def size[A](img: Drawing[A], extent: Double): Drawing[A] =
    size(img, extent, extent)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy