Commit 507043f
Changed files (4)
lib
presentation
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