teacup 2.1.13 → 2.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. data/lib/teacup-ios/handler.rb +1 -1
  2. data/lib/teacup-osx/handler.rb +1 -1
  3. data/lib/teacup/calculations.rb +2 -2
  4. data/lib/teacup/core_extensions/view_getters.rb +2 -2
  5. data/lib/teacup/layout.rb +1 -1
  6. data/lib/teacup/stylesheet_extensions/constraints.rb +14 -2
  7. data/lib/teacup/teacup_controller.rb +1 -1
  8. data/lib/teacup/teacup_view.rb +3 -3
  9. data/lib/teacup/version.rb +1 -1
  10. data/spec/ios/calculations_spec.rb +5 -1
  11. data/spec/ios/layout_module_spec.rb +2 -2
  12. metadata +24 -79
  13. data/.gitignore +0 -8
  14. data/.travis.yml +0 -3
  15. data/CHANGES.md +0 -26
  16. data/Gemfile +0 -9
  17. data/Gemfile.lock +0 -18
  18. data/LICENSE +0 -26
  19. data/README.md +0 -1527
  20. data/Rakefile +0 -18
  21. data/resources/Default-568h@2x.png +0 -0
  22. data/samples/README.md +0 -15
  23. data/samples/ios/AutoLayout/Gemfile +0 -1
  24. data/samples/ios/AutoLayout/Gemfile.lock +0 -13
  25. data/samples/ios/AutoLayout/Rakefile +0 -13
  26. data/samples/ios/AutoLayout/app/app_delegate.rb +0 -12
  27. data/samples/ios/AutoLayout/app/root_controller.rb +0 -16
  28. data/samples/ios/AutoLayout/app/styles/root.rb +0 -29
  29. data/samples/ios/AutoLayout/lib/dummy.rb +0 -2
  30. data/samples/ios/AutoLayout/lib/handlers.rb +0 -3
  31. data/samples/ios/AutoLayout/lib/styles/base.rb +0 -33
  32. data/samples/ios/Hai/.gitignore +0 -5
  33. data/samples/ios/Hai/Gemfile +0 -1
  34. data/samples/ios/Hai/Gemfile.lock +0 -13
  35. data/samples/ios/Hai/Rakefile +0 -12
  36. data/samples/ios/Hai/app/app_delegate.rb +0 -9
  37. data/samples/ios/Hai/app/hai_controller.rb +0 -13
  38. data/samples/ios/Hai/app/styles/iphone.rb +0 -47
  39. data/samples/ios/Hai/resources/Default-568h@2x.png +0 -0
  40. data/samples/ios/sweettea-example/Gemfile +0 -5
  41. data/samples/ios/sweettea-example/Gemfile.lock +0 -23
  42. data/samples/ios/sweettea-example/Rakefile +0 -11
  43. data/samples/ios/sweettea-example/app/app_delegate.rb +0 -43
  44. data/samples/ios/sweettea-example/resources/Default-568h@2x.png +0 -0
  45. data/samples/osx/Tweets/Gemfile +0 -1
  46. data/samples/osx/Tweets/Gemfile.lock +0 -13
  47. data/samples/osx/Tweets/README +0 -7
  48. data/samples/osx/Tweets/Rakefile +0 -10
  49. data/samples/osx/Tweets/app/app_delegate.rb +0 -18
  50. data/samples/osx/Tweets/app/data_parser.rb +0 -10
  51. data/samples/osx/Tweets/app/json_parser.rb +0 -12
  52. data/samples/osx/Tweets/app/main_window.rb +0 -99
  53. data/samples/osx/Tweets/app/menu.rb +0 -108
  54. data/samples/osx/Tweets/app/stylesheet.rb +0 -21
  55. data/samples/osx/Tweets/app/tweet.rb +0 -11
  56. data/samples/osx/Tweets/resources/Credits.rtf +0 -29
  57. data/samples/osx/simple/.gitignore +0 -1
  58. data/samples/osx/simple/Gemfile +0 -1
  59. data/samples/osx/simple/Gemfile.lock +0 -16
  60. data/samples/osx/simple/Rakefile +0 -9
  61. data/samples/osx/simple/app/app_delegate.rb +0 -21
  62. data/samples/osx/simple/app/controller.rb +0 -11
  63. data/samples/osx/simple/app/menu.rb +0 -108
  64. data/samples/osx/simple/app/window.rb +0 -12
  65. data/samples/osx/simple/resources/Credits.rtf +0 -29
  66. data/samples/osx/simple/resources/teacup.png +0 -0
  67. data/teacup.gemspec +0 -25
@@ -1,10 +0,0 @@
1
- class DataParser
2
- def self.parse(url)
3
- error_ptr = Pointer.new(:object)
4
- data = NSData.alloc.initWithContentsOfURL(NSURL.URLWithString(url), options:NSDataReadingUncached, error:error_ptr)
5
- unless data
6
- raise error_ptr[0]
7
- end
8
- data
9
- end
10
- end
@@ -1,12 +0,0 @@
1
- class JSONParser
2
- def self.parse_from_url(url)
3
- data = DataParser.parse(url)
4
-
5
- error_ptr = Pointer.new(:object)
6
- json = NSJSONSerialization.JSONObjectWithData(data, options:0, error:error_ptr)
7
- unless json
8
- raise error_ptr[0]
9
- end
10
- json
11
- end
12
- end
@@ -1,99 +0,0 @@
1
- class MainController < TeacupWindowController
2
- stylesheet :main_window
3
-
4
- layout do
5
- @text_search = subview(NSTextField, :text_search,
6
- stringValue: 'xcode crash'
7
- )
8
-
9
- subview(NSButton, :search_button,
10
- action: 'search:',
11
- target: self,
12
- )
13
-
14
- scroll_view = subview(NSScrollView, :scroll_view)
15
-
16
- @table_view = subview(NSTableView, :table_view,
17
- delegate: self,
18
- dataSource: self,
19
- )
20
-
21
- column_avatar = NSTableColumn.alloc.initWithIdentifier("avatar")
22
- column_avatar.editable = false
23
- column_avatar.headerCell.setTitle("Avator")
24
- column_avatar.setWidth(40)
25
- column_avatar.setDataCell(NSImageCell.alloc.init)
26
- @table_view.addTableColumn(column_avatar)
27
-
28
- column_name = NSTableColumn.alloc.initWithIdentifier("name")
29
- column_name.editable = false
30
- column_name.headerCell.setTitle("Name")
31
- column_name.setWidth(150)
32
- @table_view.addTableColumn(column_name)
33
-
34
- column_tweet = NSTableColumn.alloc.initWithIdentifier("tweet")
35
- column_tweet.editable = false
36
- column_tweet.headerCell.setTitle("Tweet")
37
- column_tweet.setWidth(290)
38
- @table_view.addTableColumn(column_tweet)
39
-
40
- scroll_view.setDocumentView(@table_view)
41
- end
42
-
43
-
44
- def search(sender)
45
- text = @text_search.stringValue
46
- if text.length > 0
47
- query = text.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
48
- url = "http://search.twitter.com/search.json?q=#{query}"
49
-
50
- Dispatch::Queue.concurrent.async do
51
- json = nil
52
- begin
53
- json = JSONParser.parse_from_url(url)
54
- rescue RuntimeError => e
55
- presentError e.message
56
- end
57
-
58
- @search_result = []
59
- json['results'].each do |dict|
60
- tweet = Tweet.new(dict)
61
- @search_result << tweet
62
-
63
- Dispatch::Queue.concurrent.async do
64
- profile_image_data = NSData.alloc.initWithContentsOfURL(NSURL.URLWithString(tweet.profile_image_url))
65
- if profile_image_data
66
- tweet.profile_image = NSImage.alloc.initWithData(profile_image_data)
67
- Dispatch::Queue.main.sync do
68
- @table_view.reloadData
69
- end
70
- end
71
- end
72
- end
73
-
74
- Dispatch::Queue.main.sync { @table_view.reloadData }
75
- end
76
-
77
- end
78
- end
79
-
80
- def numberOfRowsInTableView(aTableView)
81
- return 0 if @search_result.nil?
82
- return @search_result.size
83
- end
84
-
85
- def tableView(aTableView,
86
- objectValueForTableColumn: aTableColumn,
87
- row: rowIndex)
88
- case aTableColumn.identifier
89
- when "avatar"
90
- return @search_result[rowIndex].profile_image
91
- when "name"
92
- return @search_result[rowIndex].author
93
- when "tweet"
94
- return @search_result[rowIndex].message
95
- end
96
- end
97
-
98
-
99
- end
@@ -1,108 +0,0 @@
1
- class AppDelegate
2
- def buildMenu
3
- @mainMenu = NSMenu.new
4
-
5
- appName = NSBundle.mainBundle.infoDictionary['CFBundleName']
6
- addMenu(appName) do
7
- addItemWithTitle("About #{appName}", action: 'orderFrontStandardAboutPanel:', keyEquivalent: '')
8
- addItem(NSMenuItem.separatorItem)
9
- addItemWithTitle('Preferences', action: 'openPreferences:', keyEquivalent: ',')
10
- addItem(NSMenuItem.separatorItem)
11
- servicesItem = addItemWithTitle('Services', action: nil, keyEquivalent: '')
12
- NSApp.servicesMenu = servicesItem.submenu = NSMenu.new
13
- addItem(NSMenuItem.separatorItem)
14
- addItemWithTitle("Hide #{appName}", action: 'hide:', keyEquivalent: 'h')
15
- item = addItemWithTitle('Hide Others', action: 'hideOtherApplications:', keyEquivalent: 'H')
16
- item.keyEquivalentModifierMask = NSCommandKeyMask|NSAlternateKeyMask
17
- addItemWithTitle('Show All', action: 'unhideAllApplications:', keyEquivalent: '')
18
- addItem(NSMenuItem.separatorItem)
19
- addItemWithTitle("Quit #{appName}", action: 'terminate:', keyEquivalent: 'q')
20
- end
21
-
22
- addMenu('File') do
23
- addItemWithTitle('New', action: 'newDocument:', keyEquivalent: 'n')
24
- addItemWithTitle('Open…', action: 'openDocument:', keyEquivalent: 'o')
25
- addItem(NSMenuItem.separatorItem)
26
- addItemWithTitle('Close', action: 'performClose:', keyEquivalent: 'w')
27
- addItemWithTitle('Save…', action: 'saveDocument:', keyEquivalent: 's')
28
- addItemWithTitle('Revert to Saved', action: 'revertDocumentToSaved:', keyEquivalent: '')
29
- addItem(NSMenuItem.separatorItem)
30
- addItemWithTitle('Page Setup…', action: 'runPageLayout:', keyEquivalent: 'P')
31
- addItemWithTitle('Print…', action: 'printDocument:', keyEquivalent: 'p')
32
- end
33
-
34
- addMenu('Edit') do
35
- addItemWithTitle('Undo', action: 'undo:', keyEquivalent: 'z')
36
- addItemWithTitle('Redo', action: 'redo:', keyEquivalent: 'Z')
37
- addItem(NSMenuItem.separatorItem)
38
- addItemWithTitle('Cut', action: 'cut:', keyEquivalent: 'x')
39
- addItemWithTitle('Copy', action: 'copy:', keyEquivalent: 'c')
40
- addItemWithTitle('Paste', action: 'paste:', keyEquivalent: 'v')
41
- item = addItemWithTitle('Paste and Match Style', action: 'pasteAsPlainText:', keyEquivalent: 'V')
42
- item.keyEquivalentModifierMask = NSCommandKeyMask|NSAlternateKeyMask
43
- addItemWithTitle('Delete', action: 'delete:', keyEquivalent: '')
44
- addItemWithTitle('Select All', action: 'selectAll:', keyEquivalent: 'a')
45
- end
46
-
47
- fontMenu = createMenu('Font') do
48
- addItemWithTitle('Show Fonts', action: 'orderFrontFontPanel:', keyEquivalent: 't')
49
- addItemWithTitle('Bold', action: 'addFontTrait:', keyEquivalent: 'b')
50
- addItemWithTitle('Italic', action: 'addFontTrait:', keyEquivalent: 'b')
51
- addItemWithTitle('Underline', action: 'underline:', keyEquivalent: 'u')
52
- addItem(NSMenuItem.separatorItem)
53
- addItemWithTitle('Bigger', action: 'modifyFont:', keyEquivalent: '+')
54
- addItemWithTitle('Smaller', action: 'modifyFont:', keyEquivalent: '-')
55
- end
56
-
57
- textMenu = createMenu('Text') do
58
- addItemWithTitle('Align Left', action: 'alignLeft:', keyEquivalent: '{')
59
- addItemWithTitle('Center', action: 'alignCenter:', keyEquivalent: '|')
60
- addItemWithTitle('Justify', action: 'alignJustified:', keyEquivalent: '')
61
- addItemWithTitle('Align Right', action: 'alignRight:', keyEquivalent: '}')
62
- addItem(NSMenuItem.separatorItem)
63
- addItemWithTitle('Show Ruler', action: 'toggleRuler:', keyEquivalent: '')
64
- addItemWithTitle('Copy Ruler', action: 'copyRuler:', keyEquivalent: 'c')
65
- addItemWithTitle('Paste Ruler', action: 'pasteRuler:', keyEquivalent: 'v')
66
- end
67
-
68
- addMenu('Format') do
69
- addItem fontMenu
70
- addItem textMenu
71
- end
72
-
73
- addMenu('View') do
74
- item = addItemWithTitle('Show Toolbar', action: 'toggleToolbarShown:', keyEquivalent: 't')
75
- item.keyEquivalentModifierMask = NSCommandKeyMask|NSAlternateKeyMask
76
- addItemWithTitle('Customize Toolbar…', action: 'runToolbarCustomizationPalette:', keyEquivalent: '')
77
- end
78
-
79
- NSApp.windowsMenu = addMenu('Window') do
80
- addItemWithTitle('Minimize', action: 'performMiniaturize:', keyEquivalent: 'm')
81
- addItemWithTitle('Zoom', action: 'performZoom:', keyEquivalent: '')
82
- addItem(NSMenuItem.separatorItem)
83
- addItemWithTitle('Bring All To Front', action: 'arrangeInFront:', keyEquivalent: '')
84
- end.menu
85
-
86
- NSApp.helpMenu = addMenu('Help') do
87
- addItemWithTitle("#{appName} Help", action: 'showHelp:', keyEquivalent: '?')
88
- end.menu
89
-
90
- NSApp.mainMenu = @mainMenu
91
- end
92
-
93
- private
94
-
95
- def addMenu(title, &b)
96
- item = createMenu(title, &b)
97
- @mainMenu.addItem item
98
- item
99
- end
100
-
101
- def createMenu(title, &b)
102
- menu = NSMenu.alloc.initWithTitle(title)
103
- menu.instance_eval(&b) if b
104
- item = NSMenuItem.alloc.initWithTitle(title, action: nil, keyEquivalent: '')
105
- item.submenu = menu
106
- item
107
- end
108
- end
@@ -1,21 +0,0 @@
1
- Teacup::Stylesheet.new :main_window do
2
-
3
- style :text_search,
4
- frame: NSMakeRect(20, 318, 341, 22),
5
- autoresizingMask: autoresize.fill_top
6
-
7
- style :search_button,
8
- frame: NSMakeRect(384, 310, 82, 32),
9
- title: "Search",
10
- bezelStyle: NSRoundedBezelStyle,
11
- autoresizingMask: autoresize.fixed_top_right
12
-
13
- style :scroll_view,
14
- frame: NSMakeRect(0, 0, 480, 300),
15
- autoresizingMask: autoresize.fill,
16
- hasVerticalScroller: true
17
-
18
- style :table_view,
19
- autoresizingMask: autoresize.fill
20
-
21
- end
@@ -1,11 +0,0 @@
1
- class Tweet
2
- attr_reader :author, :message, :profile_image_url
3
- attr_accessor :profile_image
4
-
5
- def initialize(dict)
6
- @author = dict['from_user_name']
7
- @message = dict['text']
8
- @profile_image_url = dict['profile_image_url']
9
- @profile_image = nil
10
- end
11
- end
@@ -1,29 +0,0 @@
1
- {\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
2
- {\colortbl;\red255\green255\blue255;}
3
- \paperw9840\paperh8400
4
- \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
5
-
6
- \f0\b\fs24 \cf0 Engineering:
7
- \b0 \
8
- Some people\
9
- \
10
-
11
- \b Human Interface Design:
12
- \b0 \
13
- Some other people\
14
- \
15
-
16
- \b Testing:
17
- \b0 \
18
- Hopefully not nobody\
19
- \
20
-
21
- \b Documentation:
22
- \b0 \
23
- Whoever\
24
- \
25
-
26
- \b With special thanks to:
27
- \b0 \
28
- Mom\
29
- }
@@ -1 +0,0 @@
1
- .dat*
@@ -1 +0,0 @@
1
- gem 'teacup', :path => '../../..'
@@ -1,16 +0,0 @@
1
- PATH
2
- remote: ../..
3
- specs:
4
- teacup (2.0.2)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- rake (10.0.3)
10
-
11
- PLATFORMS
12
- ruby
13
-
14
- DEPENDENCIES
15
- rake
16
- teacup!
@@ -1,9 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- $:.unshift("/Library/RubyMotion/lib")
3
- require 'motion/project/template/osx'
4
- require 'teacup'
5
-
6
- Motion::Project::App.setup do |app|
7
- # Use `rake config' to see complete project settings.
8
- app.name = 'teacup-osx'
9
- end
@@ -1,21 +0,0 @@
1
-
2
- class AppDelegate
3
- def applicationDidFinishLaunching(notification)
4
- buildMenu
5
- buildWindow
6
- end
7
-
8
- def buildWindow
9
- @controller = MainWindowController.new
10
- @mainWindow = @controller.window
11
- @table_view_controller = MainTableController.new
12
-
13
- # @mainWindow = NSWindow.alloc.initWithContentRect([[240, 180], [480, 360]],
14
- # styleMask: NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask,
15
- # backing: NSBackingStoreBuffered,
16
- # defer: false)
17
- @mainWindow.title = NSBundle.mainBundle.infoDictionary['CFBundleName']
18
- @mainWindow.orderFrontRegardless
19
- end
20
-
21
- end
@@ -1,11 +0,0 @@
1
- class MainTableController < NSViewController
2
-
3
- layout do |root|
4
- subview(NSImageView,
5
- frame: root.bounds,
6
- image: NSImage.imageNamed('teacup'),
7
- autoresizingMask: NSViewWidthSizable | NSViewHeightSizable,
8
- )
9
- end
10
-
11
- end
@@ -1,108 +0,0 @@
1
- class AppDelegate
2
- def buildMenu
3
- @mainMenu = NSMenu.new
4
-
5
- appName = NSBundle.mainBundle.infoDictionary['CFBundleName']
6
- addMenu(appName) do
7
- addItemWithTitle("About #{appName}", action: 'orderFrontStandardAboutPanel:', keyEquivalent: '')
8
- addItem(NSMenuItem.separatorItem)
9
- addItemWithTitle('Preferences', action: 'openPreferences:', keyEquivalent: ',')
10
- addItem(NSMenuItem.separatorItem)
11
- servicesItem = addItemWithTitle('Services', action: nil, keyEquivalent: '')
12
- NSApp.servicesMenu = servicesItem.submenu = NSMenu.new
13
- addItem(NSMenuItem.separatorItem)
14
- addItemWithTitle("Hide #{appName}", action: 'hide:', keyEquivalent: 'h')
15
- item = addItemWithTitle('Hide Others', action: 'hideOtherApplications:', keyEquivalent: 'H')
16
- item.keyEquivalentModifierMask = NSCommandKeyMask|NSAlternateKeyMask
17
- addItemWithTitle('Show All', action: 'unhideAllApplications:', keyEquivalent: '')
18
- addItem(NSMenuItem.separatorItem)
19
- addItemWithTitle("Quit #{appName}", action: 'terminate:', keyEquivalent: 'q')
20
- end
21
-
22
- addMenu('File') do
23
- addItemWithTitle('New', action: 'newDocument:', keyEquivalent: 'n')
24
- addItemWithTitle('Open…', action: 'openDocument:', keyEquivalent: 'o')
25
- addItem(NSMenuItem.separatorItem)
26
- addItemWithTitle('Close', action: 'performClose:', keyEquivalent: 'w')
27
- addItemWithTitle('Save…', action: 'saveDocument:', keyEquivalent: 's')
28
- addItemWithTitle('Revert to Saved', action: 'revertDocumentToSaved:', keyEquivalent: '')
29
- addItem(NSMenuItem.separatorItem)
30
- addItemWithTitle('Page Setup…', action: 'runPageLayout:', keyEquivalent: 'P')
31
- addItemWithTitle('Print…', action: 'printDocument:', keyEquivalent: 'p')
32
- end
33
-
34
- addMenu('Edit') do
35
- addItemWithTitle('Undo', action: 'undo:', keyEquivalent: 'z')
36
- addItemWithTitle('Redo', action: 'redo:', keyEquivalent: 'Z')
37
- addItem(NSMenuItem.separatorItem)
38
- addItemWithTitle('Cut', action: 'cut:', keyEquivalent: 'x')
39
- addItemWithTitle('Copy', action: 'copy:', keyEquivalent: 'c')
40
- addItemWithTitle('Paste', action: 'paste:', keyEquivalent: 'v')
41
- item = addItemWithTitle('Paste and Match Style', action: 'pasteAsPlainText:', keyEquivalent: 'V')
42
- item.keyEquivalentModifierMask = NSCommandKeyMask|NSAlternateKeyMask
43
- addItemWithTitle('Delete', action: 'delete:', keyEquivalent: '')
44
- addItemWithTitle('Select All', action: 'selectAll:', keyEquivalent: 'a')
45
- end
46
-
47
- fontMenu = createMenu('Font') do
48
- addItemWithTitle('Show Fonts', action: 'orderFrontFontPanel:', keyEquivalent: 't')
49
- addItemWithTitle('Bold', action: 'addFontTrait:', keyEquivalent: 'b')
50
- addItemWithTitle('Italic', action: 'addFontTrait:', keyEquivalent: 'b')
51
- addItemWithTitle('Underline', action: 'underline:', keyEquivalent: 'u')
52
- addItem(NSMenuItem.separatorItem)
53
- addItemWithTitle('Bigger', action: 'modifyFont:', keyEquivalent: '+')
54
- addItemWithTitle('Smaller', action: 'modifyFont:', keyEquivalent: '-')
55
- end
56
-
57
- textMenu = createMenu('Text') do
58
- addItemWithTitle('Align Left', action: 'alignLeft:', keyEquivalent: '{')
59
- addItemWithTitle('Center', action: 'alignCenter:', keyEquivalent: '|')
60
- addItemWithTitle('Justify', action: 'alignJustified:', keyEquivalent: '')
61
- addItemWithTitle('Align Right', action: 'alignRight:', keyEquivalent: '}')
62
- addItem(NSMenuItem.separatorItem)
63
- addItemWithTitle('Show Ruler', action: 'toggleRuler:', keyEquivalent: '')
64
- addItemWithTitle('Copy Ruler', action: 'copyRuler:', keyEquivalent: 'c')
65
- addItemWithTitle('Paste Ruler', action: 'pasteRuler:', keyEquivalent: 'v')
66
- end
67
-
68
- addMenu('Format') do
69
- addItem fontMenu
70
- addItem textMenu
71
- end
72
-
73
- addMenu('View') do
74
- item = addItemWithTitle('Show Toolbar', action: 'toggleToolbarShown:', keyEquivalent: 't')
75
- item.keyEquivalentModifierMask = NSCommandKeyMask|NSAlternateKeyMask
76
- addItemWithTitle('Customize Toolbar…', action: 'runToolbarCustomizationPalette:', keyEquivalent: '')
77
- end
78
-
79
- NSApp.windowsMenu = addMenu('Window') do
80
- addItemWithTitle('Minimize', action: 'performMiniaturize:', keyEquivalent: 'm')
81
- addItemWithTitle('Zoom', action: 'performZoom:', keyEquivalent: '')
82
- addItem(NSMenuItem.separatorItem)
83
- addItemWithTitle('Bring All To Front', action: 'arrangeInFront:', keyEquivalent: '')
84
- end.menu
85
-
86
- NSApp.helpMenu = addMenu('Help') do
87
- addItemWithTitle("#{appName} Help", action: 'showHelp:', keyEquivalent: '?')
88
- end.menu
89
-
90
- NSApp.mainMenu = @mainMenu
91
- end
92
-
93
- private
94
-
95
- def addMenu(title, &b)
96
- item = createMenu(title, &b)
97
- @mainMenu.addItem item
98
- item
99
- end
100
-
101
- def createMenu(title, &b)
102
- menu = NSMenu.alloc.initWithTitle(title)
103
- menu.instance_eval(&b) if b
104
- item = NSMenuItem.alloc.initWithTitle(title, action: nil, keyEquivalent: '')
105
- item.submenu = menu
106
- item
107
- end
108
- end