src/Tools/Graphview/metrics.scala
author wenzelm
Mon, 04 Nov 2024 21:05:11 +0100
changeset 81343 b5b0c398cdec
parent 81340 30f7eb65d679
permissions -rw-r--r--
unused;

/*  Title:      Tools/Graphview/metrics.scala
    Author:     Makarius

Physical metrics for layout and painting.
*/

package isabelle.graphview


import isabelle._

import java.awt.Font


object Metrics {
  def apply(font: Font): Metrics = new Metrics(font)
  val default: Metrics = apply(Font_Metric.default.font)
}

class Metrics private(font: Font) extends Font_Metric(font = font) {
  val ascent: Double = font.getLineMetrics("", context).getAscent

  def gap: Double = (average_width * 3).ceil

  def dummy_size2: Double = (average_width / 2).ceil

  def node_width2(lines: List[String]): Double =
    ((lines.foldLeft(0.0)({ case (w, s) => w max string_width(s) }) + 2 * average_width) / 2).ceil

  def node_height2(num_lines: Int): Double =
    ((height.ceil * (num_lines max 1) + average_width) / 2).ceil

  def level_height2(num_lines: Int, num_edges: Int): Double =
    (node_height2(num_lines) + gap) max (node_height2(1) * (num_edges max 5))
}