Skip to content

Commit

Permalink
Improving the property changed support with some refactorings.
Browse files Browse the repository at this point in the history
  • Loading branch information
felipemesquita committed Apr 29, 2009
1 parent ac7edd0 commit ef0fe7c
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 19 deletions.
4 changes: 1 addition & 3 deletions lib/rugui.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,9 @@ def root
require 'rugui/plugin/loader'
require 'rugui/framework_adapters/framework_adapter_support'
require 'rugui/base_object'
require 'rugui/property_changed_support'
require 'rugui/observable_property_support'
require 'rugui/property_observer'

require 'rugui/property_changed_support'

require 'rugui/initialize_hooks'
require 'rugui/signal_support'
require 'rugui/base_controller'
Expand Down
1 change: 0 additions & 1 deletion lib/rugui/base_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ class BaseController < BaseObject
include RuGUI::PropertyObserver
include RuGUI::LogSupport
include RuGUI::SignalSupport
include RuGUI::PropertyChangedSupport

attr_accessor :models
attr_accessor :views
Expand Down
1 change: 0 additions & 1 deletion lib/rugui/base_model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ module RuGUI
class BaseModel < BaseObject
include RuGUI::ObservablePropertySupport
include RuGUI::LogSupport
include RuGUI::PropertyChangedSupport

def initialize(observable_properties_values = {})
initialize_observable_property_support(observable_properties_values)
Expand Down
1 change: 0 additions & 1 deletion lib/rugui/base_view.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ class BaseView < BaseObject
include RuGUI::LogSupport
include RuGUI::PropertyObserver
include RuGUI::SignalSupport
include RuGUI::PropertyChangedSupport

attr_accessor :controllers
attr_reader :widgets
Expand Down
31 changes: 19 additions & 12 deletions lib/rugui/property_changed_support.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ module ClassMethods
# </tt>
#
# Or you can inform the observable:
#
# <tt>
# when_property_changed :name, :observable => :rabbit do |observable, new_value, old_value|
# puts "Hey! The property 'name' of the 'rabbit' was changed from #{old_value} to #{new_value}."
# end
# </tt>
#
def when_property_changed(property, options = {}, &block)
property_changed_block = RuGUI::PropertyChangedSupport::PropertyChangedBlock.new
Expand All @@ -36,17 +37,27 @@ class PropertyChangedBlock
attr_accessor :options
attr_accessor :block

# Call the block configurated for the property changed if a block exists for the one.
def call_property_changed_block_if_exists(observable, property, new_value, old_value)
if self.options.has_key?(:observable)
if same_observable_and_property?(observable, property)
self.block.call(new_value, old_value)
end
elsif same_property?(property)
invoke_block(observable, new_value, old_value)
end
call_property_changed_block(observable, new_value, old_value) if block_exists?(observable, property, new_value, old_value)
end

protected
# Check if a block exists for the property changed
def block_exists?(observable, property, new_value, old_value)
if self.options.has_key?(:observable)
return same_observable_and_property?(observable, property)
else
return same_property?(property)
end
end

# Call the block configurated for the property changed.
def call_property_changed_block(observable, new_value, old_value)
self.block.call(observable, new_value, old_value)
end

private
def same_property?(property)
prepared(self.property) == prepared(property)
end
Expand All @@ -59,10 +70,6 @@ def same_observable_and_property?(observable, property)
same_observable?(observable) and same_property?(property)
end

def invoke_block(observable, new_value, old_value)
self.block.call(observable, new_value, old_value)
end

def prepared(param)
param.to_s.downcase.underscore
end
Expand Down
5 changes: 4 additions & 1 deletion lib/rugui/property_observer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ module RuGUI
module PropertyObserver
include RuGUI::FrameworkAdapters::FrameworkAdapterSupport

def self.included(base)
base.send(:include, RuGUI::PropertyChangedSupport)
end

def property_updated(observable, property, new_value, old_value)
queue_method_call_if_exists("property_#{property}_changed", observable, new_value, old_value)
queue_method_call_if_exists("property_#{observable.class.name.underscore}_#{property}_changed", observable, new_value, old_value)
Expand All @@ -48,7 +52,6 @@ def named_observable_property_updated(observable_name, observable, property, new
private
def queue_method_call_if_exists(method_name, *args)
if respond_to?(method_name)
logger.warn "This way of listening changed properties is deprecated. Please, take a look at when_property_changed method."
self.framework_adapter.queue do
send(method_name, *args)
end
Expand Down

0 comments on commit ef0fe7c

Please sign in to comment.