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;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/Graphview/metrics.scala
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     3
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     4
Physical metrics for layout and painting.
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     5
*/
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     6
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     7
package isabelle.graphview
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     8
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
     9
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    10
import isabelle._
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    11
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    12
import java.awt.Font
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    13
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    14
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 73909
diff changeset
    15
object Metrics {
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    16
  def apply(font: Font): Metrics = new Metrics(font)
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    17
  val default: Metrics = apply(Font_Metric.default.font)
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    18
}
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    19
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    20
class Metrics private(font: Font) extends Font_Metric(font = font) {
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    21
  val ascent: Double = font.getLineMetrics("", context).getAscent
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    22
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    23
  def gap: Double = (average_width * 3).ceil
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    24
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    25
  def dummy_size2: Double = (average_width / 2).ceil
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    26
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    27
  def node_width2(lines: List[String]): Double =
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    28
    ((lines.foldLeft(0.0)({ case (w, s) => w max string_width(s) }) + 2 * average_width) / 2).ceil
59302
4d985afc0565 explict layout graph structure, with dummies and coordinates;
wenzelm
parents: 59293
diff changeset
    29
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    30
  def node_height2(num_lines: Int): Double =
81340
30f7eb65d679 clarified signature;
wenzelm
parents: 75393
diff changeset
    31
    ((height.ceil * (num_lines max 1) + average_width) / 2).ceil
59384
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    32
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    33
  def level_height2(num_lines: Int, num_edges: Int): Double =
c75327a34960 more explicit Layout.Info: size and content;
wenzelm
parents: 59302
diff changeset
    34
    (node_height2(num_lines) + gap) max (node_height2(1) * (num_edges max 5))
59290
569a8109eeb2 separate module Metrics;
wenzelm
parents:
diff changeset
    35
}