Module: ProMotion::ScreenNavigation

Includes:
Support
Included in:
ScreenModule
Defined in:
lib/ProMotion/screen/screen_navigation.rb

Instance Method Summary collapse

Methods included from Support

#app, #app_delegate, #app_window, #try

Instance Method Details

#close_screen(args = {}) ⇒ Object Also known as: close



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/ProMotion/screen/screen_navigation.rb', line 37

def close_screen(args = {})
  args ||= {}
  args = { sender: args } unless args.is_a?(Hash)
  args[:animated] = true unless args.has_key?(:animated)

  if self.modal?
    close_nav_screen args if self.navigationController
    close_modal_screen args

  elsif self.navigationController
    close_nav_screen args
    send_on_return(args)

  else
    mp "Tried to close #{self.to_s}; however, this screen isn't modal or in a nav bar.", force_color: :yellow
  end
end

#open_in_split_screen(screen, args) ⇒ Object



23
24
25
26
27
# File 'lib/ProMotion/screen/screen_navigation.rb', line 23

def open_in_split_screen(screen, args)
  self.split_screen.detail_screen = screen if args[:in_detail]
  self.split_screen.master_screen = screen if args[:in_master]
  args[:in_detail] || args[:in_master]
end

#open_modal(screen, args = {}) ⇒ Object



33
34
35
# File 'lib/ProMotion/screen/screen_navigation.rb', line 33

def open_modal(screen, args = {})
  open screen, args.merge({ modal: true })
end

#open_root_screen(screen, args = {}) ⇒ Object



29
30
31
# File 'lib/ProMotion/screen/screen_navigation.rb', line 29

def open_root_screen(screen, args = {})
  app_delegate.open_root_screen(screen, args)
end

#open_screen(screen, args = {}) ⇒ Object Also known as: open



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/ProMotion/screen/screen_navigation.rb', line 5

def open_screen(screen, args = {})
  args = { animated: true }.merge(args)

  # Apply properties to instance
  screen = set_up_screen_for_open(screen, args)
  ensure_wrapper_controller_in_place(screen, args)

  opened ||= open_in_split_screen(screen, args) if self.split_screen
  opened ||= open_root_screen(screen, args) if args[:close_all]
  opened ||= replace_nav_stack([screen], args) if args[:replace_nav_stack]
  opened ||= present_modal_view_controller(screen, args) if args[:modal]
  opened ||= open_in_tab(screen, args[:in_tab]) if args[:in_tab]
  opened ||= push_view_controller(screen, self.navigationController, !!args[:animated]) if self.navigationController
  opened ||= open_root_screen(screen.navigationController || screen, args)
  screen
end

#push_view_controller(vc, nav_controller = nil, animated = true) ⇒ Object



69
70
71
72
73
74
75
76
77
# File 'lib/ProMotion/screen/screen_navigation.rb', line 69

def push_view_controller(vc, nav_controller=nil, animated=true)
  unless self.navigationController
    mp "You need a nav_bar if you are going to push #{vc.to_s} onto it.", force_color: :red
  end
  nav_controller ||= self.navigationController
  return if nav_controller.topViewController == vc
  vc.first_screen = false if vc.respond_to?(:first_screen=)
  nav_controller.pushViewController(vc, animated: animated)
end

#replace_nav_stack(screens, args = {}) ⇒ Object



79
80
81
82
# File 'lib/ProMotion/screen/screen_navigation.rb', line 79

def replace_nav_stack(screens, args = {})
  args[:animated] ||= true
  navigationController.setViewControllers(screens, animated: !!args[:animated])
end

#send_on_return(args = {}) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/ProMotion/screen/screen_navigation.rb', line 56

def send_on_return(args = {})
  return unless self.parent_screen
  if self.parent_screen.respond_to?(:on_return)
    if args && self.parent_screen.method(:on_return).arity != 0
      self.parent_screen.send(:on_return, args)
    else
      self.parent_screen.send(:on_return)
    end
  elsif self.parent_screen.private_methods.include?(:on_return)
    mp "#{self.parent_screen.inspect} has an `on_return` method, but it is private and not callable from the closing screen.", force_color: :yellow
  end
end