drawio_dsl 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.builders/.templates/command.rb +8 -0
  3. data/.builders/.templates/schema_shape.rb +9 -0
  4. data/.builders/blueprint/shapes.rb +19 -0
  5. data/.builders/boot.rb +1 -0
  6. data/.builders/generators/25-themes.rb +3 -0
  7. data/CHANGELOG.md +7 -0
  8. data/lib/drawio_dsl/configuration.rb +36 -27
  9. data/lib/drawio_dsl/dom_builder.rb +15 -0
  10. data/lib/drawio_dsl/drawio.rb +19 -1
  11. data/lib/drawio_dsl/layout_engine.rb +1 -1
  12. data/lib/drawio_dsl/schema/_.rb +23 -0
  13. data/lib/drawio_dsl/schema/common_style.rb +42 -0
  14. data/lib/drawio_dsl/schema/default_palette.rb +31 -0
  15. data/lib/drawio_dsl/schema/diagram.rb +57 -0
  16. data/lib/drawio_dsl/schema/layouts/flex_layout.rb +87 -0
  17. data/lib/drawio_dsl/schema/layouts/grid_layout.rb +102 -0
  18. data/lib/drawio_dsl/schema/layouts/layout.rb +41 -0
  19. data/lib/drawio_dsl/schema/node.rb +53 -0
  20. data/lib/drawio_dsl/schema/page.rb +135 -0
  21. data/lib/drawio_dsl/schema/shapes/callout.rb +9 -0
  22. data/lib/drawio_dsl/schema/shapes/circle.rb +9 -0
  23. data/lib/drawio_dsl/schema/shapes/cloud.rb +9 -0
  24. data/lib/drawio_dsl/schema/shapes/diamond.rb +9 -0
  25. data/lib/drawio_dsl/schema/shapes/ellipse.rb +9 -0
  26. data/lib/drawio_dsl/schema/shapes/hexagon.rb +9 -0
  27. data/lib/drawio_dsl/schema/shapes/note.rb +9 -0
  28. data/lib/drawio_dsl/schema/shapes/process.rb +9 -0
  29. data/lib/drawio_dsl/schema/shapes/rectangle.rb +9 -0
  30. data/lib/drawio_dsl/schema/shapes/shape.rb +125 -0
  31. data/lib/drawio_dsl/schema/shapes/square.rb +9 -0
  32. data/lib/drawio_dsl/version.rb +1 -1
  33. data/lib/drawio_dsl.rb +1 -1
  34. data/package-lock.json +2 -2
  35. data/package.json +1 -1
  36. metadata +25 -3
  37. data/lib/drawio_dsl/schema.rb +0 -617
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 874e60205978452d6b06bd53855edff255b5b168fb7a80693ac109279381c880
4
- data.tar.gz: f5073b3be534353987969a4c96c563a1ed5d9dedcb52c09355ef013db0c5a382
3
+ metadata.gz: 56780c6c8fa8c1ea29a29e07bf389cf257fd7a33faf52e955b3fe56133367063
4
+ data.tar.gz: f583d40a64cea1177d7d52ab627dcbfa954cb3091dada0903947f69f5792d3b5
5
5
  SHA512:
6
- metadata.gz: 50178f5c6728de3571a1effb263d62b4676f9685e05a59b4b31fb88a1f3b1d3fc4583f13a976c8d67202c3dc4981470073855f10b2c69196051984ae70d06c8a
7
- data.tar.gz: 5ad8beb7a169b7d3c0b44e887dfb71b6a966d63023986efe319007e0f4fcaf397edd688cfbd3c98f5dc8a6760d55af1eaea3d7b646ed8658fda765c2dd129d0d
6
+ metadata.gz: 92b5c4e8e2a8210c3e2213df96f1d35034689a3d2ff9132e17fc1fa30f68b89551cb395f725e0b1b5da3b506e62471e2e64def33683f8959f53a41a43e4f5805
7
+ data.tar.gz: 112eb4f963aa4c295559f8d1e8ed0eaf0121bb768282924ca54059c3de4924d16a33b5a3d33dd9044378315840aafda7db34d228aa2064606eccf5d29776da52
@@ -0,0 +1,8 @@
1
+ KManager.model :{{command.name}}, namespace: %i[blueprint command] do
2
+ # microapp = import(:handlebars_helpers, :microapp)
3
+
4
+ settings do
5
+ name :{{command.name}}
6
+ description "{{command.description}}"
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ class {{camle type}} < Shape
6
+ configure_shape(:{{snake type}})
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ KManager.model :shapes, namespace: %i[domain] do
2
+ # microapp = import(:handlebars_helpers, :microapp)
3
+
4
+ table :shapes do
5
+ fields :type, :x, :y, :w, :h, :style_modifiers
6
+
7
+ # row :shape , x: 0, y: 0, w: 20, h: 20, style_modifiers: ''
8
+ row :square , x: 0, y: 0, w: 160, h: 160, style_modifiers: ''
9
+ row :rectangle , x: 0, y: 0, w: 200, h: 120, style_modifiers: ''
10
+ row :circle , x: 0, y: 0, w: 160, h: 160, style_modifiers: 'double=1;ellipse'
11
+ row :process , x: 0, y: 0, w: 200, h: 120, style_modifiers: 'double=1;shape=process'
12
+ row :ellipse , x: 0, y: 0, w: 200, h: 120, style_modifiers: 'double=1;ellipse'
13
+ row :diamond , x: 0, y: 0, w: 160, h: 160, style_modifiers: 'double=1;rhombus'
14
+ row :hexagon , x: 0, y: 0, w: 200, h: 120, style_modifiers: 'double=1;shape=hexagon'
15
+ row :cloud , x: 0, y: 0, w: 160, h: 160, style_modifiers: 'double=1;shape=cloud'
16
+ row :note , x: 0, y: 0, w: 160, h: 160, style_modifiers: 'double=1;shape=note'
17
+ row :callout , x: 0, y: 0, w: 160, h: 160, style_modifiers: 'double=1;shape=callout'
18
+ end
19
+ end
data/.builders/boot.rb CHANGED
@@ -60,6 +60,7 @@ resource_manager
60
60
  .fileset
61
61
  .glob('*.rb', exclude: ['boot.rb'])
62
62
  .glob('generators/**/*.rb')
63
+ .glob('blueprint/**/*.rb')
63
64
  resource_manager.add_resources
64
65
 
65
66
  KManager.boot
@@ -8,6 +8,9 @@ KManager.action :bootstrap do
8
8
  .page('Style-Plain', margin_left: 0, margin_top: 0) do
9
9
  grid_layout(wrap_at: 5)
10
10
 
11
+ square(title: 'The quick brown fox jumps over the lazy dog')
12
+ circle(title: 'Mary had a little lamb')
13
+
11
14
  KConfig.configuration.drawio.themes.keys.each do |theme|
12
15
  random(title: theme.to_s, theme: theme)
13
16
  end
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [0.3.0](https://github.com/klueless-io/drawio_dsl/compare/v0.2.0...v0.3.0) (2022-03-04)
2
+
3
+
4
+ ### Features
5
+
6
+ * add samples for direction, alignment, themes, styles and page margin ([2e9f735](https://github.com/klueless-io/drawio_dsl/commit/2e9f735ba50c9391d7dea64c565ca9c0fb61978a))
7
+
1
8
  # [0.2.0](https://github.com/klueless-io/drawio_dsl/compare/v0.1.0...v0.2.0) (2022-03-04)
2
9
 
3
10
 
@@ -16,42 +16,33 @@ module DrawioDsl
16
16
  include KLog::Logging
17
17
 
18
18
  BaseStyle = Struct.new(:white_space, :html, :rounded, :shadow, :sketch, :glass, keyword_init: true)
19
-
20
- ShapeDefaults = Struct.new(:type, :x, :y, :w, :h, :style_modifiers)
19
+ ShapeDefaults = Struct.new(:type, :x, :y, :w, :h, :style_modifiers, keyword_init: true)
21
20
  ShapeThemeStyle = Struct.new(:fill_color, :stroke_color, :font_color, :gradient, keyword_init: true)
22
21
 
22
+ Shapes = Struct.new(
23
+ :shape,
24
+ :square,
25
+ :rectangle,
26
+ :circle,
27
+ :process,
28
+ :ellipse,
29
+ :diamond,
30
+ :hexagon,
31
+ :cloud,
32
+ :note,
33
+ :callout,
34
+ keyword_init: true
35
+ )
36
+
23
37
  attr_accessor :base_style
24
38
 
25
- # Theme colors
26
39
  attr_accessor :themes
27
-
28
- # Shape shapes
29
- attr_accessor :shape
30
- attr_accessor :square
31
- attr_accessor :rectangle
32
- attr_accessor :circle
33
- attr_accessor :process
34
- attr_accessor :ellipse
35
- attr_accessor :diamond
36
- attr_accessor :hexagon
37
-
38
- # <mxCell id="6" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="TqO-B">
39
- # <mxGeometry x="-496" y="115" width="80" height="80" as="geometry"/>
40
- # </mxCell>
40
+ attr_accessor :shapes
41
41
 
42
42
  def initialize
43
43
  @base_style = BaseStyle.new(white_space: :wrap, html: 1, rounded: nil, shadow: nil, sketch: nil, glass: nil)
44
44
 
45
- @shape = ShapeDefaults.new(:shape , 0, 0, 20, 20, '')
46
- @square = ShapeDefaults.new(:square , 0, 0, 160, 160, '')
47
- @rectangle = ShapeDefaults.new(:rectangle , 0, 0, 200, 120, '')
48
- @circle = ShapeDefaults.new(:circle , 0, 0, 160, 160, 'ellipse')
49
- @process = ShapeDefaults.new(:process , 0, 0, 200, 120, 'shape=process')
50
- @ellipse = ShapeDefaults.new(:ellipse , 0, 0, 200, 120, 'ellipse')
51
- @diamond = ShapeDefaults.new(:diamond , 0, 0, 160, 160, 'rhombus')
52
- @hexagon = ShapeDefaults.new(:hexagon , 0, 0, 200, 120, 'shape=hexagon')
53
-
54
- @themes = {}
45
+ add_shapes
55
46
  add_themes
56
47
  end
57
48
 
@@ -65,12 +56,30 @@ module DrawioDsl
65
56
 
66
57
  private
67
58
 
59
+ def add_shapes
60
+ @shapes = Shapes.new(
61
+ shape: ShapeDefaults.new(type: :shape , x: 0, y: 0, w: 20, h: 20, style_modifiers: ''),
62
+ square: ShapeDefaults.new(type: :square , x: 0, y: 0, w: 160, h: 160, style_modifiers: ''),
63
+ rectangle: ShapeDefaults.new(type: :rectangle , x: 0, y: 0, w: 200, h: 120, style_modifiers: ''),
64
+ circle: ShapeDefaults.new(type: :circle , x: 0, y: 0, w: 160, h: 160, style_modifiers: 'double=1;ellipse'),
65
+ process: ShapeDefaults.new(type: :process , x: 0, y: 0, w: 200, h: 120, style_modifiers: 'double=1;shape=process'),
66
+ ellipse: ShapeDefaults.new(type: :ellipse , x: 0, y: 0, w: 200, h: 120, style_modifiers: 'double=1;ellipse'),
67
+ diamond: ShapeDefaults.new(type: :diamond , x: 0, y: 0, w: 160, h: 160, style_modifiers: 'double=1;rhombus'),
68
+ hexagon: ShapeDefaults.new(type: :hexagon , x: 0, y: 0, w: 200, h: 120, style_modifiers: 'double=1;shape=hexagon'),
69
+ cloud: ShapeDefaults.new(type: :cloud , x: 0, y: 0, w: 160, h: 160, style_modifiers: 'double=1;shape=cloud'),
70
+ note: ShapeDefaults.new(type: :note , x: 0, y: 0, w: 160, h: 160, style_modifiers: 'double=1;shape=note'),
71
+ callout: ShapeDefaults.new(type: :callout , x: 0, y: 0, w: 160, h: 160, style_modifiers: 'double=1;shape=callout')
72
+ )
73
+ end
74
+
68
75
  def add_theme(name, **opts)
69
76
  @themes[name] = ShapeThemeStyle.new(**opts)
70
77
  end
71
78
 
72
79
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
73
80
  def add_themes
81
+ @themes = {}
82
+
74
83
  add_theme(:style_01 , fill_color: '#f5f5f5', stroke_color: '#666666', font_color: '#333333')
75
84
  add_theme(:style_02 , fill_color: '#dae8fc', stroke_color: '#6c8ebf', font_color: '#333333')
76
85
  add_theme(:style_03 , fill_color: '#d5e8d4', stroke_color: '#82b366', font_color: '#333333')
@@ -119,6 +119,21 @@ module DrawioDsl
119
119
  add_shape(add_hexagon)
120
120
  end
121
121
 
122
+ def add_cloud(**opts)
123
+ cloud = DrawioDsl::Schema::Cloud.new(current_page, **opts)
124
+ add_shape(cloud)
125
+ end
126
+
127
+ def add_note(**opts)
128
+ note = DrawioDsl::Schema::Note.new(current_page, **opts)
129
+ add_shape(note)
130
+ end
131
+
132
+ def add_callout(**opts)
133
+ callout = DrawioDsl::Schema::Callout.new(current_page, **opts)
134
+ add_shape(callout)
135
+ end
136
+
122
137
  def debug
123
138
  puts JSON.pretty_generate(actions)
124
139
  puts JSON.pretty_generate(diagram.to_h)
@@ -58,7 +58,7 @@ module DrawioDsl
58
58
 
59
59
  # rubocop:disable Metrics/CyclomaticComplexity
60
60
  def random(**opts)
61
- case rand(7)
61
+ case rand(10)
62
62
  when 0
63
63
  square(**opts)
64
64
  when 1
@@ -73,6 +73,12 @@ module DrawioDsl
73
73
  diamond(**opts)
74
74
  when 6
75
75
  hexagon(**opts)
76
+ when 7
77
+ cloud(**opts)
78
+ when 8
79
+ note(**opts)
80
+ when 9
81
+ callout(**opts)
76
82
  end
77
83
  end
78
84
  # rubocop:enable Metrics/CyclomaticComplexity
@@ -105,6 +111,18 @@ module DrawioDsl
105
111
  builder.add_hexagon(**opts)
106
112
  end
107
113
 
114
+ def cloud(**opts)
115
+ builder.add_cloud(**opts)
116
+ end
117
+
118
+ def note(**opts)
119
+ builder.add_note(**opts)
120
+ end
121
+
122
+ def callout(**opts)
123
+ builder.add_callout(**opts)
124
+ end
125
+
108
126
  private
109
127
 
110
128
  def current_shape
@@ -34,7 +34,7 @@ module DrawioDsl
34
34
  when :layout_rule
35
35
  @current_layout = node
36
36
  when :shape
37
- current_layout.position_shape(node)
37
+ current_layout&.position_shape(node)
38
38
  end
39
39
  # node.debug(format: :row)
40
40
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'common_style'
4
+ require_relative 'default_palette'
5
+ require_relative 'diagram'
6
+ require_relative 'node'
7
+ require_relative 'page'
8
+
9
+ require_relative 'layouts/layout'
10
+ require_relative 'layouts/flex_layout'
11
+ require_relative 'layouts/grid_layout'
12
+
13
+ require_relative 'shapes/shape'
14
+ require_relative 'shapes/callout'
15
+ require_relative 'shapes/circle'
16
+ require_relative 'shapes/cloud'
17
+ require_relative 'shapes/diamond'
18
+ require_relative 'shapes/ellipse'
19
+ require_relative 'shapes/hexagon'
20
+ require_relative 'shapes/note'
21
+ require_relative 'shapes/process'
22
+ require_relative 'shapes/rectangle'
23
+ require_relative 'shapes/square'
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ # Common Style is the reused on Diagram, Page and Shape
6
+ #
7
+ # When styles are not provided at each level, then they will inherit from
8
+ # the parent common style.
9
+ #
10
+ # Shapes will use the common style of their page
11
+ class CommonStyle
12
+ attr_accessor :white_space
13
+ attr_accessor :html
14
+ attr_accessor :rounded
15
+ attr_accessor :shadow
16
+ attr_accessor :glass
17
+ attr_accessor :sketch
18
+
19
+ def initialize(**args, &block)
20
+ @white_space = args[:white_space]
21
+ @html = args[:html]
22
+ @rounded = args[:rounded]
23
+ @shadow = args[:shadow]
24
+ @sketch = args[:sketch]
25
+ @glass = args[:glass]
26
+
27
+ instance_eval(&block) if block_given?
28
+ end
29
+
30
+ def to_h
31
+ {
32
+ white_space: white_space,
33
+ html: html,
34
+ rounded: rounded,
35
+ shadow: shadow,
36
+ sketch: sketch,
37
+ glass: glass
38
+ }
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ # Default Palette contains palette information that can be inherited at each level
6
+ class DefaultPalette
7
+ attr_accessor :fill_color
8
+ attr_accessor :stroke_color
9
+ attr_accessor :font_color
10
+ attr_accessor :gradient
11
+
12
+ def initialize(owner, **args, &block)
13
+ @fill_color = args[:fill_color]
14
+ @stroke_color = args[:stroke_color]
15
+ @font_color = args[:font_color]
16
+ @gradient = args[:gradient]
17
+
18
+ instance_exec(owner, &block) if block_given?
19
+ end
20
+
21
+ def to_h
22
+ {
23
+ fill_color: fill_color,
24
+ stroke_color: stroke_color,
25
+ font_color: font_color,
26
+ gradient: gradient
27
+ }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ # Diagram is the root of the schema, it contains pages
6
+ class Diagram
7
+ attr_accessor :host
8
+ attr_accessor :theme
9
+ attr_accessor :style
10
+ attr_accessor :palette
11
+ attr_accessor :pages
12
+
13
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
14
+ def initialize(**args)
15
+ @host = args[:host] || SecureRandom.alphanumeric(3)
16
+
17
+ # Apply a random theme to the diagram if none is specified.
18
+ @theme = args[:theme] || KConfig.configuration.drawio.random_theme
19
+
20
+ @style = DrawioDsl::Schema::CommonStyle.new(**args) do
21
+ default_style = KConfig.configuration.drawio.base_style
22
+
23
+ # Inherit from configured style when specific style not specified.
24
+ @white_space ||= default_style.white_space
25
+ @html ||= default_style.html
26
+ @rounded ||= default_style.rounded
27
+ @shadow ||= default_style.shadow
28
+ @sketch ||= default_style.sketch
29
+ @glass ||= default_style.glass
30
+ end
31
+
32
+ @palette = DrawioDsl::Schema::DefaultPalette.new(self, **args) do |diagram|
33
+ theme_palette = KConfig.configuration.drawio.palette(diagram.theme)
34
+
35
+ # Inherit from theme when specific palette options are not specified.
36
+ @fill_color ||= theme_palette.fill_color
37
+ @stroke_color ||= theme_palette.stroke_color
38
+ @font_color ||= theme_palette.font_color
39
+ @gradient ||= theme_palette.gradient
40
+ end
41
+
42
+ @pages = args[:pages] || []
43
+ end
44
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
45
+
46
+ def to_h
47
+ {
48
+ host: host,
49
+ theme: theme,
50
+ palette: palette.to_h,
51
+ style: style.to_h,
52
+ pages: pages.map(&:to_h)
53
+ }
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ # Provides flex style layouts
6
+ class FlexLayout < Layout
7
+ attr_accessor :direction
8
+ attr_accessor :wrap_at
9
+ attr_reader :gap
10
+ attr_reader :perpendicular_max
11
+
12
+ def initialize(page, **args)
13
+ @type = :flex_layout
14
+ @direction = args[:direction] || :horizontal
15
+ @wrap_at = args[:wrap_at] || (direction == :horizontal ? 1000 : 800)
16
+ @gap = args[:gap] || 20
17
+ @perpendicular_max = 0
18
+
19
+ super(page, **args)
20
+ end
21
+
22
+ def position_shape(shape)
23
+ fire_after_init
24
+
25
+ position_shape_horizontally(shape) if direction == :horizontal
26
+ position_shape_vertically(shape) if direction == :vertical
27
+ end
28
+
29
+ def to_h
30
+ fire_after_init
31
+
32
+ super.merge(
33
+ direction: direction,
34
+ wrap_at: wrap_at,
35
+ boundary: boundary,
36
+ perpendicular_max: perpendicular_max
37
+ )
38
+ end
39
+
40
+ private
41
+
42
+ # rubocop:disable Metrics/AbcSize
43
+ def position_shape_horizontally(shape)
44
+ boundary_violation = page.position_x + shape.w + gap > boundary
45
+
46
+ if boundary_violation
47
+ page.position_x = anchor_x
48
+ page.position_y += perpendicular_max
49
+ end
50
+
51
+ shape.x = page.position_x
52
+ shape.y = page.position_y
53
+
54
+ return if boundary_violation
55
+
56
+ page.position_x += shape.w + gap
57
+ @perpendicular_max = [perpendicular_max, shape.h].max
58
+ end
59
+ # rubocop:enable Metrics/AbcSize
60
+
61
+ # rubocop:disable Metrics/AbcSize
62
+ def position_shape_vertically(shape)
63
+ boundary_violation = page.position_y + shape.h + gap > boundary
64
+
65
+ if boundary_violation
66
+ page.position_y = anchor_y
67
+ page.position_x += perpendicular_max
68
+ end
69
+
70
+ shape.x = page.position_x
71
+ shape.y = page.position_y
72
+
73
+ return if boundary_violation
74
+
75
+ page.position_y += shape.h + gap
76
+ @perpendicular_max = [perpendicular_max, shape.w].max
77
+ end
78
+ # rubocop:enable Metrics/AbcSize
79
+
80
+ def boundary
81
+ return @boundary if defined? @boundary
82
+
83
+ @boundary = wrap_at + (direction == :horizontal ? anchor_x : anchor_y)
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ # Provides grid style layouts
6
+ class GridLayout < Layout
7
+ attr_accessor :direction
8
+ attr_accessor :wrap_at
9
+ attr_accessor :grid_size
10
+ attr_accessor :cell_no
11
+ attr_accessor :h_align
12
+ attr_accessor :v_align
13
+
14
+ def initialize(page, **args)
15
+ @type = :grid_layout
16
+ @direction = args[:direction] || :horizontal
17
+ @wrap_at = args[:wrap_at] || 5
18
+ @grid_size = args[:grid_size] || 220
19
+ @h_align = args[:h_align] || :center
20
+ @v_align = args[:v_align] || :center
21
+ @cell_no = 1
22
+
23
+ super(page, **args)
24
+ end
25
+
26
+ def position_shape(shape)
27
+ fire_after_init
28
+
29
+ shape.x = horizontal_shape_alignment(shape)
30
+ shape.y = vertical_shape_alignment(shape)
31
+
32
+ # puts '------------------'
33
+ # puts "cell: #{cell_no}"
34
+ # puts "wrap_at: #{wrap_at}"
35
+ # puts "shape-x: #{shape.x}"
36
+ # puts "shape-y: #{shape.y}"
37
+ # puts "page-x: #{page.position_x}"
38
+ # puts "page-y: #{page.position_y}"
39
+ # puts "anchor-x: #{anchor_x}"
40
+ # puts "anchor-y: #{anchor_y}"
41
+
42
+ move_cell_horizontally if direction == :horizontal
43
+ move_cell_vertically if direction == :vertical
44
+ end
45
+
46
+ def to_h
47
+ super.merge(
48
+ direction: direction,
49
+ wrap_at: wrap_at,
50
+ grid_size: grid_size,
51
+ cell_no: cell_no
52
+ )
53
+ end
54
+
55
+ private
56
+
57
+ # rubocop:disable Metrics/AbcSize
58
+ def horizontal_shape_alignment(shape)
59
+ return page.position_x + ((grid_size - shape.w) / 2) if h_align == :center
60
+ return page.position_x + (grid_size - shape.w) if h_align == :right
61
+
62
+ page.position_x
63
+ end
64
+ # rubocop:enable Metrics/AbcSize
65
+
66
+ # rubocop:disable Metrics/AbcSize
67
+ def vertical_shape_alignment(shape)
68
+ return page.position_y + ((grid_size - shape.h) / 2) if v_align == :center || v_align == :middle
69
+ return page.position_y + (grid_size - shape.h) if v_align == :bottom
70
+
71
+ page.position_y
72
+ end
73
+ # rubocop:enable Metrics/AbcSize
74
+
75
+ def move_cell_horizontally
76
+ if cell_no < wrap_at
77
+ page.position_x += grid_size
78
+ @cell_no += 1
79
+ return
80
+ end
81
+
82
+ # Flow down to the next row
83
+ page.position_x = anchor_x
84
+ page.position_y += grid_size
85
+ @cell_no = 1
86
+ end
87
+
88
+ def move_cell_vertically
89
+ if cell_no < wrap_at
90
+ page.position_y += grid_size
91
+ @cell_no += 1
92
+ return
93
+ end
94
+
95
+ # Flow right to the next column
96
+ page.position_y = anchor_y
97
+ page.position_x += grid_size
98
+ @cell_no = 1
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DrawioDsl
4
+ module Schema
5
+ # Provides base configuration for automatic layouts
6
+ class Layout < Node
7
+ attr_accessor :type
8
+
9
+ # represents the x coordinate of the top left corner layout area
10
+ # this coordinate is based on the current location of the page
11
+ attr_accessor :anchor_x
12
+ attr_accessor :anchor_y
13
+
14
+ def initialize(page, **args)
15
+ @after_init_fired = false
16
+
17
+ super(page, **args.merge(classification: :layout_rule))
18
+ end
19
+
20
+ def fire_after_init
21
+ return if @after_init_fired
22
+
23
+ @after_init_fired = true
24
+ after_init
25
+ end
26
+
27
+ def after_init
28
+ @anchor_x ||= page.position_x
29
+ @anchor_y ||= page.position_y
30
+ end
31
+
32
+ def to_h
33
+ super.merge(
34
+ type: type,
35
+ anchor_x: anchor_x,
36
+ anchor_y: anchor_y
37
+ )
38
+ end
39
+ end
40
+ end
41
+ end