Add control-panel builders
I've used these in a few projects now, so might as well put them in a common library where they can get properly enhanced.
This commit is contained in:
parent
08961b6178
commit
b962c62209
@ -0,0 +1,83 @@
|
||||
package org.gerweck.scalafx.util.control
|
||||
|
||||
import language.implicitConversions
|
||||
|
||||
import scalafx.geometry.Orientation.Horizontal
|
||||
import scalafx.geometry.Pos
|
||||
import scalafx.scene.Node
|
||||
import scalafx.scene.control.{ Label, Separator }
|
||||
import scalafx.scene.layout._
|
||||
import scalafx.scene.text._
|
||||
|
||||
import org.gerweck.scalafx.util._
|
||||
|
||||
import ControlPanel._
|
||||
|
||||
object HorizontalControlPanel {
|
||||
def apply(controls: ControlPanelEntry*): Pane =
|
||||
new HBox {
|
||||
alignment = Pos.Center
|
||||
hgrow = Priority.Always
|
||||
spacing = 15
|
||||
children = controls map {
|
||||
case RegularControl(name, control) =>
|
||||
new HBox {
|
||||
spacing = 4
|
||||
hgrow = Priority.Always
|
||||
children = ControlPanel.controlRow(name, control)
|
||||
alignment = Pos.CenterRight
|
||||
}
|
||||
case SeparatorEntry =>
|
||||
Separators.vertical
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object VerticalControlPanel {
|
||||
def apply(controls: ControlPanelEntry*): Pane = new GridPane { gp =>
|
||||
hgap = 4
|
||||
vgap = 6
|
||||
for ((entry, i) <- controls.zipWithIndex) {
|
||||
entry match {
|
||||
case RegularControl(name, control) =>
|
||||
gp.addToRow(i, ControlPanel.controlRow(name, control): _*)
|
||||
|
||||
case SeparatorEntry =>
|
||||
val sep = new Separator {
|
||||
orientation = Horizontal
|
||||
}
|
||||
gp.add(sep, 0, i, 2, 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object ControlPanel {
|
||||
def apply(controls: ControlPanelEntry*): Pane = VerticalControlPanel(controls: _*)
|
||||
|
||||
private[this] lazy val defaultFont = new Font(Font.default)
|
||||
private[this] lazy val boldFont = {
|
||||
Font(defaultFont.family, FontWeight.Bold, defaultFont.size)
|
||||
}
|
||||
|
||||
private[this] lazy val labelsFont = defaultFont
|
||||
|
||||
private[control] def controlRow(name: String, control: Node) = {
|
||||
val label = new Label(name + ':') {
|
||||
alignmentInParent = Pos.CenterRight
|
||||
font = labelsFont
|
||||
}
|
||||
Seq(label, control)
|
||||
}
|
||||
|
||||
/* It's expected that you won't create these directly, but that you'll
|
||||
* mostly use the implicit magnets */
|
||||
sealed trait ControlPanelEntry
|
||||
case class RegularControl(label: String, control: Node) extends ControlPanelEntry
|
||||
case object SeparatorEntry extends ControlPanelEntry
|
||||
|
||||
object ControlPanelEntry {
|
||||
implicit def pair2Regular(p: (String, Node)): RegularControl = RegularControl.tupled(p)
|
||||
implicit def sep2Sep(p: Separator): SeparatorEntry.type = SeparatorEntry
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user