Commit 507043f

mo khan <mo@mokhan.ca>
2014-03-18 02:57:02
connect view to builder and bind signals to presenter in application controller.
1 parent 7cf2b1a
lib/boot/container_configuration.rb
@@ -4,7 +4,7 @@ class ContainerConfiguration
   def self.run(container)
     container.register(:event_aggregator) { EventAggregator.new }.as_singleton
     container.register(:shell) { |x| x.build(ApplicationShell) }.as_singleton
-    container.register(:shell_presenter) { |x| x.build(ApplicationShellPresenter) }
+    container.register(:shell_presenter) { |x| x.build(ApplicationShellPresenter) }.as_singleton
     container.register(:application_controller) { |x| x.build(ApplicationController) }.as_singleton
     Spank::IOC.bind_to(container)
   end
lib/presentation/presenters/application_shell_presenter.rb
@@ -1,4 +1,6 @@
 class ApplicationShellPresenter
+  attr_reader :view
+
   def initialize(shell, event_aggregator)
     @view = shell
     @event_aggregator = event_aggregator
@@ -6,7 +8,6 @@ class ApplicationShellPresenter
 
   def present
     @view.set_title("Hello World")
-    @view.bind_to(self)
     @view.show_all
   end
 
lib/presentation/windows/application_shell.rb
@@ -1,13 +1,8 @@
 class ApplicationShell
   attr_reader :window, :menu_bar
+  attr_accessor :builder
 
   def initialize(event_aggregator)
-    builder = Gtk::Builder.new
-    file = File.join(File.dirname(__FILE__), 'shell.xml')
-    builder.add_from_file(file)
-    builder.connect_signals { |signal| Proc.new { publish(signal) } }
-    @window = builder.get_object('window')
-    @menu_bar = builder.get_object('menubar')
     @event_aggregator = event_aggregator
   end
 
@@ -21,10 +16,8 @@ class ApplicationShell
 
   def bind_to(presenter)
     @presenter = presenter
+    @window = builder.get_object('window')
+    @menu_bar = builder.get_object('menubar')
     Build.menu_bar.with(File.menu(@event_aggregator)).add_to(self)
   end
-
-  def publish(signal)
-    @presenter.public_send(signal)
-  end
 end
lib/presentation/application_controller.rb
@@ -3,7 +3,21 @@ class ApplicationController
     @container = container
   end
 
-  def run(presenter)
-    @container.resolve(presenter).present
+  def run(presenter_key)
+    presenter = @container.resolve(presenter_key)
+    view = presenter.view
+    view.builder = create_builder_for(presenter_key.to_s)
+    view.bind_to(presenter)
+    view.builder.connect_signals { |signal| Proc.new { presenter.public_send(signal) } }
+    presenter.present
+  end
+
+  private
+
+  def create_builder_for(presenter_key)
+    builder = Gtk::Builder.new
+    file = File.join(File.dirname(__FILE__), 'windows', "#{presenter_key.gsub(/\_presenter/, '')}.xml")
+    builder.add_from_file(file)
+    builder
   end
 end