sirens 0.0.1 → 0.1.1

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/lib/components/{component_behaviour.rb → abstract_component.rb} +32 -47
  3. data/lib/components/component.rb +24 -9
  4. data/lib/components/containers/splitter.rb +12 -64
  5. data/lib/components/containers/stack.rb +1 -1
  6. data/lib/components/containers/tabs.rb +3 -3
  7. data/lib/components/containers/window.rb +4 -0
  8. data/lib/components/primitive_component.rb +4 -57
  9. data/lib/components/widgets/checkbox.rb +2 -2
  10. data/lib/components/widgets/input_text.rb +1 -1
  11. data/lib/components/widgets/tree_choice.rb +2 -9
  12. data/lib/{components/widgets → components_builder}/column_props.rb +14 -2
  13. data/lib/{layouts → components_builder}/columns_builder.rb +0 -0
  14. data/lib/components_builder/layout_builder.rb +215 -0
  15. data/lib/{layouts → components_builder}/radio_button_group_builder.rb +0 -0
  16. data/lib/sirens.rb +18 -11
  17. data/lib/sirens/browsers/module_browser.rb +4 -4
  18. data/lib/sirens/browsers/object_browser.rb +4 -1
  19. data/lib/sirens/components/ancestors_list.rb +4 -1
  20. data/lib/sirens/components/class_browser.rb +5 -4
  21. data/lib/sirens/components/constants_list.rb +1 -1
  22. data/lib/sirens/components/method_source_code.rb +1 -1
  23. data/lib/sirens/components/methods_list.rb +5 -2
  24. data/lib/sirens/components/modules_list.rb +4 -1
  25. data/lib/sirens/components/namespaces_list.rb +4 -1
  26. data/lib/sirens/models/constant_model.rb +2 -1
  27. data/lib/sirens/models/icons.rb +28 -0
  28. data/lib/sirens/models/method.rb +94 -0
  29. data/lib/sirens/models/method_model.rb +8 -83
  30. data/lib/sirens/models/module_browser_model.rb +85 -25
  31. data/lib/sirens/models/object_browser_model.rb +4 -0
  32. data/lib/views/{view.rb → abstract_view.rb} +16 -50
  33. data/lib/views/button_view.rb +1 -1
  34. data/lib/views/{check_button_view.rb → checkbox_view.rb} +1 -1
  35. data/lib/views/component_view.rb +12 -0
  36. data/lib/views/{entry_view.rb → input_text_view.rb} +1 -1
  37. data/lib/views/list_view.rb +33 -8
  38. data/lib/views/menu_view.rb +1 -1
  39. data/lib/views/radio_button_view.rb +1 -1
  40. data/lib/views/splitter_view.rb +101 -0
  41. data/lib/views/stack_view.rb +1 -1
  42. data/lib/views/{notebook_view.rb → tabs_view.rb} +1 -1
  43. data/lib/views/text_view.rb +1 -1
  44. data/lib/views/tree_view.rb +42 -20
  45. data/lib/views/widget_view.rb +96 -0
  46. data/lib/views/window_view.rb +1 -1
  47. data/resources/icons/array.png +0 -0
  48. data/resources/icons/class.png +0 -0
  49. data/resources/icons/false.png +0 -0
  50. data/resources/icons/hash.png +0 -0
  51. data/resources/icons/method.png +0 -0
  52. data/resources/icons/module.png +0 -0
  53. data/resources/icons/number.png +0 -0
  54. data/resources/icons/object.png +0 -0
  55. data/resources/icons/private-method.png +0 -0
  56. data/resources/icons/protected-method.png +0 -0
  57. data/resources/icons/public-method.png +0 -0
  58. data/resources/icons/string.png +0 -0
  59. data/resources/icons/true.png +0 -0
  60. metadata +46 -15
  61. data/lib/layouts/layout_builder.rb +0 -203
  62. data/lib/views/paned_view.rb +0 -26
@@ -1,10 +1,10 @@
1
1
  module Sirens
2
2
  class Checkbox < PrimitiveComponent
3
3
  ##
4
- # Returns a CheckButtonView.
4
+ # Returns a CheckboxView.
5
5
  #
6
6
  def create_view()
7
- CheckButtonView.new(on_toggled: proc{ |state:| on_toggled(state: state) })
7
+ CheckboxView.new(on_toggled: proc{ |state:| on_toggled(state: state) })
8
8
  end
9
9
 
10
10
  ##
@@ -4,7 +4,7 @@ module Sirens
4
4
  # Returns a TextView.
5
5
  #
6
6
  def create_view()
7
- EntryView.new
7
+ InputTextView.new
8
8
  end
9
9
 
10
10
  ##
@@ -43,10 +43,7 @@ module Sirens
43
43
  # Syncs the ui from the model.
44
44
  #
45
45
  def sync_ui_from_model()
46
- return if view.nil?
47
-
48
- view.clear_items
49
- view.add_items(parent_iter: nil, items: model.tree.roots, index: 0)
46
+ view.set_roots(model.tree.roots)
50
47
  end
51
48
 
52
49
  # Events
@@ -68,14 +65,10 @@ module Sirens
68
65
 
69
66
  indices_path = model.path_of(selection_hierarchy)
70
67
 
71
- while_updating_view do
72
- view.set_selection_indices(indices_path)
73
- end
68
+ view.set_selection_indices(indices_path)
74
69
  end
75
70
 
76
71
  def on_selection_changed(selection_items:, selection_paths:)
77
- return if is_updating_view?
78
-
79
72
  model.set_selection_from_path(path: selection_paths.first) unless model.nil?
80
73
  end
81
74
  end
@@ -4,7 +4,15 @@ module Sirens
4
4
  @props = props
5
5
  end
6
6
 
7
- attr_reader :props
7
+ attr_reader :props
8
+
9
+ def has_image_block?()
10
+ @props.key?(:get_image_block)
11
+ end
12
+
13
+ def has_text_block?()
14
+ @props.key?(:get_text_block)
15
+ end
8
16
 
9
17
  def fetch(key, absent_value)
10
18
  @props.fetch(key, absent_value)
@@ -15,9 +23,13 @@ module Sirens
15
23
  end
16
24
 
17
25
  def display_text_of(item)
18
- return item.to_s if ! @props.key?(:get_text_block)
26
+ return item.to_s if ! has_text_block?
19
27
 
20
28
  @props[:get_text_block].call(item)
21
29
  end
30
+
31
+ def display_image_of(item)
32
+ @props[:get_image_block].call(item)
33
+ end
22
34
  end
23
35
  end
@@ -0,0 +1,215 @@
1
+ module Sirens
2
+ class LayoutBuilder
3
+
4
+ # Initializing
5
+
6
+ def initialize(root_component: nil)
7
+ super()
8
+
9
+ @root_component = root_component
10
+ @built_props = Hash[]
11
+ @built_components = []
12
+ end
13
+
14
+ # Accessing
15
+
16
+ attr_reader :built_props
17
+ attr_reader :built_components
18
+
19
+ # Building
20
+
21
+ def render(props: Hash[], &build_block)
22
+ eval(props: props, &build_block)
23
+
24
+ @root_component.add_all_components(built_components)
25
+
26
+ self
27
+ end
28
+
29
+ def eval(props: Hash[], &build_block)
30
+ merge_props(props)
31
+
32
+ instance_exec(@root_component, &build_block) unless build_block.nil?
33
+
34
+ self
35
+ end
36
+
37
+ def styles(props)
38
+ merge_props(props)
39
+ end
40
+
41
+ def model(model)
42
+ merge_props(model: model)
43
+ end
44
+
45
+ def merge_props(props)
46
+ @built_props.merge!(props)
47
+ end
48
+
49
+ # Containers
50
+
51
+ def component(component)
52
+ @built_components << component
53
+ end
54
+
55
+ def window(props = Hash[], &build_block)
56
+ LayoutBuilder.new.tap do |builder|
57
+ builder.eval(props: props, &build_block)
58
+
59
+ Window.new(builder.built_props).tap do |window|
60
+ window.add_all_components(builder.built_components)
61
+
62
+ @built_components << window
63
+ end
64
+ end
65
+ end
66
+
67
+ def horizontal_stack(props = Hash[], &build_block)
68
+ LayoutBuilder.new.tap do |builder|
69
+ builder.eval(props: props, &build_block)
70
+
71
+ Stack.horizontal(builder.built_props).tap do |stack|
72
+ stack.add_all_components(builder.built_components)
73
+
74
+ @built_components << stack
75
+ end
76
+ end
77
+ end
78
+
79
+ def vertical_stack(props = Hash[], &build_block)
80
+ LayoutBuilder.new.tap do |builder|
81
+ builder.eval(props: props, &build_block)
82
+
83
+ Stack.vertical(builder.built_props).tap do |stack|
84
+ stack.add_all_components(builder.built_components)
85
+
86
+ @built_components << stack
87
+ end
88
+ end
89
+ end
90
+
91
+ def horizontal_splitter(props = Hash[], &build_block)
92
+ LayoutBuilder.new.tap do |builder|
93
+ builder.eval(props: props, &build_block)
94
+
95
+ Splitter.horizontal(builder.built_props).tap do |splitter|
96
+ splitter.add_all_components(builder.built_components)
97
+
98
+ @built_components << splitter
99
+ end
100
+ end
101
+ end
102
+
103
+ def vertical_splitter(props = Hash[], &build_block)
104
+ LayoutBuilder.new.tap do |builder|
105
+ builder.eval(props: props, &build_block)
106
+
107
+ Splitter.vertical(builder.built_props).tap do |splitter|
108
+ splitter.add_all_components(builder.built_components)
109
+
110
+ @built_components << splitter
111
+ end
112
+ end
113
+ end
114
+
115
+ def tabs(props = Hash[], &build_block)
116
+ LayoutBuilder.new.tap do |builder|
117
+ builder.eval(props: props, &build_block)
118
+
119
+ Tabs.new(builder.built_props).tap do |tabs|
120
+ tabs.add_all_components(builder.built_components)
121
+
122
+ @built_components << tabs
123
+ end
124
+ end
125
+ end
126
+
127
+ # Widgets
128
+
129
+ def button(props = Hash[], &build_block)
130
+ LayoutBuilder.new.tap do |builder|
131
+ builder.eval(props: props, &build_block)
132
+
133
+ @built_components << Button.new(builder.built_props)
134
+ end
135
+ end
136
+
137
+ def checkbox(props = Hash[], &build_block)
138
+ LayoutBuilder.new.tap do |builder|
139
+ builder.eval(props: props, &build_block)
140
+
141
+ @built_components << Checkbox.new(builder.built_props)
142
+ end
143
+ end
144
+
145
+ def radio_button(props = Hash[], &build_block)
146
+ LayoutBuilder.new.tap do |builder|
147
+ builder.eval(props: props, &build_block)
148
+
149
+ @built_components << RadioButton.new(builder.built_props)
150
+ end
151
+ end
152
+
153
+ def radio_buttons_group(props = Hash[], &build_block)
154
+ buttons = RadioButtonGroupBuilder.new.render(&build_block)
155
+
156
+ @built_components.concat(buttons)
157
+ end
158
+
159
+ def list(props = Hash[], &build_block)
160
+ columns_builder = ColumnsBuilder.new.render(props, &build_block)
161
+
162
+ props[:popup_menu] = columns_builder.popup_menu unless columns_builder.popup_menu.nil?
163
+
164
+ List.new(props).tap { |list|
165
+ list.define_columns(columns_builder.columns)
166
+
167
+ @built_components << list
168
+ }
169
+ end
170
+
171
+ def choices_list(props = Hash[], &build_block)
172
+ columns_builder = ColumnsBuilder.new.render(props, &build_block)
173
+
174
+ props[:popup_menu] = columns_builder.popup_menu unless columns_builder.popup_menu.nil?
175
+
176
+ ListChoice.new(props).tap { |list|
177
+ list.define_columns(columns_builder.columns)
178
+
179
+ @built_components << list
180
+ }
181
+ end
182
+
183
+ def input_text(props = Hash[], &build_block)
184
+ LayoutBuilder.new.tap do |builder|
185
+ builder.eval(props: props, &build_block)
186
+
187
+ @built_components << InputText.new(builder.built_props)
188
+ end
189
+ end
190
+
191
+ def text(props = Hash[], &build_block)
192
+ LayoutBuilder.new.tap do |builder|
193
+ builder.eval(props: props, &build_block)
194
+
195
+ @built_components << Text.new(builder.built_props)
196
+ end
197
+ end
198
+
199
+ def choices_tree(props = Hash[], &build_block)
200
+ columns_builder = ColumnsBuilder.new.render(props, &build_block)
201
+
202
+ props[:popup_menu] = columns_builder.get_popup_menu unless columns_builder.get_popup_menu.nil?
203
+
204
+ TreeChoice.new(props).tap { |tree|
205
+ tree.define_columns(columns_builder.columns)
206
+
207
+ @built_components << tree
208
+ }
209
+ end
210
+
211
+ def popup_menu(&block)
212
+ merge_props(popup_menu: block)
213
+ end
214
+ end
215
+ end
data/lib/sirens.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'gtk3'
2
+ require 'method_source'
2
3
 
3
4
  module Sirens
4
5
  class << self
@@ -35,7 +36,7 @@ module Sirens
35
36
  autoload(:TreeChoiceModel, 'models/tree_choice_model.rb')
36
37
 
37
38
  # Components
38
- autoload(:ComponentBehaviour, 'components/component_behaviour.rb')
39
+ autoload(:AbstractComponent, 'components/abstract_component.rb')
39
40
  autoload(:Component, 'components/component.rb')
40
41
  autoload(:PrimitiveComponent, 'components/primitive_component.rb')
41
42
  autoload(:Window, 'components/containers/window.rb')
@@ -45,7 +46,6 @@ module Sirens
45
46
  autoload(:Button, 'components/widgets/button.rb')
46
47
  autoload(:Checkbox, 'components/widgets/checkbox.rb')
47
48
  autoload(:RadioButton, 'components/widgets/radio_button.rb')
48
- autoload(:ColumnProps, 'components/widgets/column_props.rb')
49
49
  autoload(:List, 'components/widgets/list.rb')
50
50
  autoload(:ListChoice, 'components/widgets/list_choice.rb')
51
51
  autoload(:InputText, 'components/widgets/input_text.rb')
@@ -53,27 +53,34 @@ module Sirens
53
53
  autoload(:TreeChoice, 'components/widgets/tree_choice.rb')
54
54
 
55
55
  # Layouts
56
- autoload(:LayoutBuilder, 'layouts/layout_builder.rb')
57
- autoload(:ColumnsBuilder, 'layouts/columns_builder.rb')
58
- autoload(:RadioButtonGroupBuilder, 'layouts/radio_button_group_builder.rb')
56
+ autoload(:ColumnProps, 'components_builder/column_props.rb')
57
+ autoload(:LayoutBuilder, 'components_builder/layout_builder.rb')
58
+ autoload(:ColumnsBuilder, 'components_builder/columns_builder.rb')
59
+ autoload(:RadioButtonGroupBuilder, 'components_builder/radio_button_group_builder.rb')
59
60
 
60
61
  # Views
61
- autoload(:View, 'views/view.rb')
62
+ autoload(:AbstractView, 'views/abstract_view.rb')
63
+ autoload(:ComponentView, 'views/component_view.rb')
64
+ autoload(:WidgetView, 'views/widget_view.rb')
62
65
  autoload(:MenuView, 'views/menu_view.rb')
63
66
  autoload(:WindowView, 'views/window_view.rb')
64
67
  autoload(:StackView, 'views/stack_view.rb')
65
- autoload(:PanedView, 'views/paned_view.rb')
66
- autoload(:NotebookView, 'views/notebook_view.rb')
68
+ autoload(:SplitterView, 'views/splitter_view.rb')
69
+ autoload(:TabsView, 'views/tabs_view.rb')
67
70
  autoload(:ButtonView, 'views/button_view.rb')
68
- autoload(:CheckButtonView, 'views/check_button_view.rb')
71
+ autoload(:CheckboxView, 'views/checkbox_view.rb')
69
72
  autoload(:RadioButtonView, 'views/radio_button_view.rb')
70
73
  autoload(:ListView, 'views/list_view.rb')
71
- autoload(:EntryView, 'views/entry_view.rb')
74
+ autoload(:InputTextView, 'views/input_text_view.rb')
72
75
  autoload(:TextView, 'views/text_view.rb')
73
76
  autoload(:TreeView, 'views/tree_view.rb')
74
77
 
75
- autoload(:ModuleBrowserModel, 'sirens/models/module_browser_model.rb')
78
+ # Sirens
79
+
80
+ autoload(:Method, 'sirens/models/method.rb')
81
+ autoload(:Icons, 'sirens/models/icons.rb')
76
82
  autoload(:MethodModel, 'sirens/models/method_model.rb')
83
+ autoload(:ModuleBrowserModel, 'sirens/models/module_browser_model.rb')
77
84
  autoload(:ConstantModel, 'sirens/models/constant_model.rb')
78
85
  autoload(:ObjectBrowserModel, 'sirens/models/object_browser_model.rb')
79
86
 
@@ -20,7 +20,7 @@ module Sirens
20
20
 
21
21
  # Building
22
22
 
23
- def renderWith(layout)
23
+ def render_with(layout)
24
24
  browser_model = model
25
25
 
26
26
  layout.render do |component|
@@ -39,17 +39,17 @@ module Sirens
39
39
 
40
40
  component NamespacesList.new(
41
41
  model: browser_model.namespaces,
42
- splitter_proportion: 1.0/4.0
42
+ splitter_proportion: 1.0/5.0
43
43
  )
44
44
 
45
45
  component ModulesList.new(
46
46
  model: browser_model.modules,
47
- splitter_proportion: 1.0/4.0,
47
+ splitter_proportion: 1.0/5.0,
48
48
  )
49
49
 
50
50
  component ClassBrowser.new(
51
51
  model: browser_model,
52
- splitter_proportion: 2.0/4.0
52
+ splitter_proportion: 1.0/5.0
53
53
  )
54
54
  end
55
55
 
@@ -16,7 +16,7 @@ module Sirens
16
16
 
17
17
  # Building
18
18
 
19
- def renderWith(layout)
19
+ def render_with(layout)
20
20
  browser_model = model
21
21
 
22
22
  layout.render do |component|
@@ -38,6 +38,9 @@ module Sirens
38
38
  component.browse(object: item.value)
39
39
  }
40
40
 
41
+ column label: '',
42
+ get_image_block: proc{ |inst_var| inst_var.icon }
43
+
41
44
  column label: 'Instance variables',
42
45
  get_text_block: proc { |inst_var| inst_var.display_string }
43
46
 
@@ -3,7 +3,7 @@ module Sirens
3
3
 
4
4
  # Building
5
5
 
6
- def renderWith(layout)
6
+ def render_with(layout)
7
7
 
8
8
  layout.render do |component|
9
9
  choices_list do
@@ -13,6 +13,9 @@ module Sirens
13
13
  show_headers: true
14
14
  )
15
15
 
16
+ column label: '',
17
+ get_image_block: proc{ |a_module| Icons.icon_for(a_module) }
18
+
16
19
  column label: 'Module ancestors',
17
20
  get_text_block: proc{ |a_module| a_module.name }
18
21
  end
@@ -3,18 +3,18 @@ module Sirens
3
3
 
4
4
  # Building
5
5
 
6
- def renderWith(layout)
6
+ def render_with(layout)
7
7
  browser_model = model
8
8
 
9
9
  layout.render do |component|
10
10
  horizontal_splitter do
11
11
  component AncestorsList.new(
12
12
  model: browser_model.module_ancestors,
13
- splitter_proportion: 1.0/3.0
13
+ splitter_proportion: 1.0/2.0
14
14
  )
15
15
 
16
16
  tabs do
17
- styles splitter_proportion: 2.0/3.0
17
+ styles splitter_proportion: 1.0/2.0
18
18
 
19
19
  component MethodsList.new(
20
20
  model: browser_model.methods,
@@ -23,7 +23,8 @@ module Sirens
23
23
  show_public_methods: browser_model.show_public_methods,
24
24
  show_protected_methods: browser_model.show_protected_methods,
25
25
  show_private_methods: browser_model.show_private_methods,
26
- tab_label: 'Methods'
26
+ tab_label: 'Methods',
27
+ get_method_image_block: proc{ |method| method.icon }
27
28
  )
28
29
 
29
30
  component ConstantsList.new(