lib/ProMotion/screen/nav_bar_module.rb
module ProMotion
module NavBarModule
def nav_bar?
!!self.navigationController
end
def navigation_controller
self.navigationController
end
def navigation_controller=(nav)
self.navigationController = nav
end
def navigationController=(nav)
@navigationController = nav
end
def set_nav_bar_button(side, args={})
button = (args.is_a?(UIBarButtonItem)) ? args : create_toolbar_button(args)
button.setTintColor args[:tint_color] if args.is_a?(Hash) && args[:tint_color]
self.navigationItem.leftBarButtonItem = button if side == :left
self.navigationItem.rightBarButtonItem = button if side == :right
self.navigationItem.backBarButtonItem = button if side == :back
button
end
def set_nav_bar_buttons(side, buttons=[])
buttons = buttons.map{ |b| b.is_a?(UIBarButtonItem) ? b : create_toolbar_button(b) }.reverse
self.navigationItem.setLeftBarButtonItems(buttons) if side == :left
self.navigationItem.setRightBarButtonItems(buttons) if side == :right
end
def set_toolbar_items(buttons = [], animated = true)
if buttons
self.toolbarItems = Array(buttons).map{|b| b.is_a?(UIBarButtonItem) ? b : create_toolbar_button(b) }
navigationController.setToolbarHidden(false, animated:animated)
else
navigationController.setToolbarHidden(true, animated:animated)
end
end
alias_method :set_toolbar_buttons, :set_toolbar_items
alias_method :set_toolbar_button, :set_toolbar_items
def add_nav_bar(args = {})
args = self.class.get_nav_bar.merge(args)
return unless args[:nav_bar] || args[:nav_controller]
self.navigationController ||= begin
self.first_screen = true if self.respond_to?(:first_screen=)
nav_controller_class = args[:nav_controller] || NavigationController
if nav_controller_class.is_a? Class
nav = nav_controller_class.alloc.initWithRootViewController(self)
else
nav = nav_controller_class
nav.setViewControllers([self], animated: false)
end
nav.setModalTransitionStyle(args[:transition_style]) if args[:transition_style]
nav.setModalPresentationStyle(args[:presentation_style]) if args[:presentation_style]
nav
end
self.navigationController.toolbarHidden = !args[:toolbar] unless args[:toolbar].nil?
end
def update_nav_bar_visibility(animated)
return unless navigationController
hidden = @screen_options[:hide_nav_bar]
unless hidden.nil?
navigationController.setNavigationBarHidden(hidden, animated: animated)
end
end
private
def create_toolbar_button(args = {})
button_type = args[:image] || args[:button] || args[:custom_view] || args[:title] || "Button"
bar_button_item button_type, args
end
def bar_button_item(button_type, args)
return mp("`system_icon:` no longer supported. Use `system_item:` instead.", force_color: :yellow) if args[:system_icon]
return button_type if button_type.is_a?(UIBarButtonItem)
if args[:system_item]
mp("Nav bar button specified both `system_item:` and `title:`. Title will be ignored.", force_color: :yellow) if args[:title]
return bar_button_item_system_item(args)
end
return bar_button_item_image(button_type, args) if button_type.is_a?(UIImage)
return bar_button_item_string(button_type, args) if button_type.is_a?(String)
return bar_button_item_custom(button_type) if button_type.is_a?(UIView)
mp("Please supply a title string, a UIImage or :system.", force_color: :red) && nil
end
def bar_button_item_image(img, args)
button = UIBarButtonItem.alloc.initWithImage(img, style: map_bar_button_item_style(args[:style]), target: args[:target] || self, action: args[:action])
button.setTintColor args[:tint_color] if args[:tint_color]
button
end
def bar_button_item_string(str, args)
button = UIBarButtonItem.alloc.initWithTitle(str, style: map_bar_button_item_style(args[:style]), target: args[:target] || self, action: args[:action])
button.setTintColor args[:tint_color] if args[:tint_color]
button
end
def bar_button_item_system_item(args)
button = UIBarButtonItem.alloc.initWithBarButtonSystemItem(map_bar_button_system_item(args[:system_item]), target: args[:target] || self, action: args[:action])
button.setTintColor args[:tint_color] if args[:tint_color]
button
end
def bar_button_item_custom(custom_view)
UIBarButtonItem.alloc.initWithCustomView(custom_view)
end
def map_bar_button_system_item(symbol)
mp("Nav bar button stytem item `:page_curl` has been deprecated.", force_color: :yellow) if symbol == :page_curl
{
done: UIBarButtonSystemItemDone,
cancel: UIBarButtonSystemItemCancel,
edit: UIBarButtonSystemItemEdit,
save: UIBarButtonSystemItemSave,
add: UIBarButtonSystemItemAdd,
flexible_space: UIBarButtonSystemItemFlexibleSpace,
fixed_space: UIBarButtonSystemItemFixedSpace,
compose: UIBarButtonSystemItemCompose,
reply: UIBarButtonSystemItemReply,
action: UIBarButtonSystemItemAction,
organize: UIBarButtonSystemItemOrganize,
bookmarks: UIBarButtonSystemItemBookmarks,
search: UIBarButtonSystemItemSearch,
refresh: UIBarButtonSystemItemRefresh,
stop: UIBarButtonSystemItemStop,
camera: UIBarButtonSystemItemCamera,
trash: UIBarButtonSystemItemTrash,
play: UIBarButtonSystemItemPlay,
pause: UIBarButtonSystemItemPause,
rewind: UIBarButtonSystemItemRewind,
fast_forward: UIBarButtonSystemItemFastForward,
undo: UIBarButtonSystemItemUndo,
redo: UIBarButtonSystemItemRedo,
page_curl: UIBarButtonSystemItemPageCurl # DEPRECATED
}[symbol] || UIBarButtonSystemItemDone
end
def map_bar_button_item_style(symbol)
mp("Nav bar button style `:bordered` has been deprecated.", force_color: :yellow) if symbol == :bordered
{
plain: UIBarButtonItemStylePlain,
bordered: UIBarButtonItemStyleBordered, # DEPRECATED
done: UIBarButtonItemStyleDone
}[symbol] || UIBarButtonItemStyleDone
end
end
end