remi-simpletray 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +60 -0
- data/Rakefile +10 -0
- data/examples/first.rb +46 -0
- data/lib/simpletray.rb +176 -0
- data/simpletray.gemspec +17 -0
- metadata +65 -0
data/README.rdoc
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
= simpletray
|
2
|
+
|
3
|
+
simpletray is a gem for making it really easy to make wxruby-based system tray applications
|
4
|
+
|
5
|
+
== installation
|
6
|
+
|
7
|
+
simpletray uses wxWidgets, so you need to install wx: http://www.wxwidgets.org/
|
8
|
+
|
9
|
+
a binary should be available for Windows users. Mac/Linux should be able to use your packaging systems.
|
10
|
+
|
11
|
+
now, install the required rubygems ...
|
12
|
+
|
13
|
+
$ sudo gem install wxruby activesupport
|
14
|
+
|
15
|
+
and ... simpletray! (NOTE: at the time of writing, github still hasn't generated by gem, so you need to manually download from github)
|
16
|
+
|
17
|
+
$ sudo gem install remi-simpletray -s http://gems.github.com
|
18
|
+
|
19
|
+
== usage
|
20
|
+
|
21
|
+
#! /usr/bin/env ruby
|
22
|
+
require 'simpletray'
|
23
|
+
|
24
|
+
# icon my_cool_app.png will be used for the tray icon
|
25
|
+
SimpleTray.app 'My Cool App' do
|
26
|
+
|
27
|
+
# this makes a single item 'About' (about.png will be used if found)
|
28
|
+
# which pops up a message box when clicked
|
29
|
+
about { msgbox "Hello! This is my app!" }
|
30
|
+
|
31
|
+
# this makes a submenu 'Dogs' with rover/spot/rex subitems.
|
32
|
+
# dogs.png, rover.png, spot.png, rex.png will all be looked for
|
33
|
+
_dogs_ {
|
34
|
+
rover { puts "..." }
|
35
|
+
spot { puts "..." }
|
36
|
+
rex { msgbox "w00f, my name is rex!" }
|
37
|
+
}
|
38
|
+
|
39
|
+
# adds an item (the same as saying my_custom_item) with a custom icon
|
40
|
+
item 'My Custom Item', 'custom-icon.png' do
|
41
|
+
# ...
|
42
|
+
end
|
43
|
+
|
44
|
+
# adds an menu (the same as saying _my_custom_menu_) with a custom icon
|
45
|
+
menu 'My Custom Menu', 'custom-menu-icon.png' do
|
46
|
+
item1 { }
|
47
|
+
item2 { }
|
48
|
+
end
|
49
|
+
|
50
|
+
# this adds a seperator and then a special 'exit' item to quit the application
|
51
|
+
____
|
52
|
+
exit
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
Also, see examples/first.rb (the first file I used for testing), which shows how to add
|
57
|
+
your own helper methods
|
58
|
+
|
59
|
+
Note, currently I'm only supporting PNGs. I'll fix this to support ICO/PNG/BMP/JPG/etc.
|
60
|
+
My TODO list is long :P
|
data/Rakefile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'rake/rdoctask'
|
2
|
+
|
3
|
+
Rake::RDocTask.new do |rdoc|
|
4
|
+
files = ['README.rdoc','lib/**/*.rb', 'doc/**/*.rdoc', 'test/*.rb']
|
5
|
+
rdoc.rdoc_files.add(files)
|
6
|
+
rdoc.main = 'README.rdoc'
|
7
|
+
rdoc.title = 'SimpleTray'
|
8
|
+
rdoc.rdoc_dir = 'doc'
|
9
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
10
|
+
end
|
data/examples/first.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
$:.unshift File.join( File.dirname(__FILE__), '..', 'lib' )
|
3
|
+
require 'rubygems'
|
4
|
+
require 'simpletray'
|
5
|
+
|
6
|
+
module SimpleTray::Builder
|
7
|
+
def popup name, message
|
8
|
+
item( name ){ msgbox message }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
SimpleTray.app 'My Cool App' do
|
13
|
+
|
14
|
+
popup 'testing 1,2,3', 'this is my message'
|
15
|
+
|
16
|
+
about { puts "this is my tray app!" }
|
17
|
+
|
18
|
+
msgbox_hi { msgbox "hello!" }
|
19
|
+
_____
|
20
|
+
|
21
|
+
item 'My Name' do
|
22
|
+
end
|
23
|
+
|
24
|
+
item 'blah', lambda { puts 'hello from blah' }
|
25
|
+
|
26
|
+
_menu_ 'xxx' do
|
27
|
+
menu_item_1 { msgbox "you clicked menu item 1!" }
|
28
|
+
___
|
29
|
+
menu_item_2 { puts "clicked number 2 !!!!!" }
|
30
|
+
end
|
31
|
+
|
32
|
+
options { puts "on click" }
|
33
|
+
|
34
|
+
_options_ do
|
35
|
+
profile { puts "your profile" }
|
36
|
+
neato { puts "blah!" }
|
37
|
+
_nested_ do
|
38
|
+
_more_ do
|
39
|
+
clicky { msgbox "yay!" }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
exit
|
45
|
+
|
46
|
+
end
|
data/lib/simpletray.rb
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
%w( rubygems wx activesupport ).each {|lib| require lib }
|
3
|
+
|
4
|
+
class SimpleTray
|
5
|
+
cattr_accessor :icon_directory
|
6
|
+
|
7
|
+
# Use this to run your SimpleTray application
|
8
|
+
#
|
9
|
+
# SimpleTray.app 'My Cool App' do
|
10
|
+
# about { msgbox "My App!" }
|
11
|
+
# exit
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
def self.app title, &block
|
15
|
+
Wx::App.run { Icon.new title, &block }
|
16
|
+
end
|
17
|
+
|
18
|
+
# This is where the magic happens.
|
19
|
+
#
|
20
|
+
# Any methods you add to this module will be available in the DSL
|
21
|
+
#
|
22
|
+
# module SimpleTray::Builder
|
23
|
+
# def popup name, message
|
24
|
+
# item( name ){ msgbox message }
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# SimpleTray.app 'My Cool App' do
|
29
|
+
# popup 'Click Me', 'Hello! This is my message!'
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# Whatever you do, do NOT override the methods used
|
33
|
+
# in this module, *especially* not #method_missing.
|
34
|
+
#
|
35
|
+
# If you want to override the behavior of one of these
|
36
|
+
# methods, ***PLEASE*** use #alias_method_chain.
|
37
|
+
#
|
38
|
+
module Builder
|
39
|
+
|
40
|
+
def item name, icon = nil, &block
|
41
|
+
if block.nil? and icon.respond_to?:call
|
42
|
+
block = icon
|
43
|
+
icon = nil
|
44
|
+
end
|
45
|
+
item = Wx::MenuItem.new @menu, -1, name
|
46
|
+
|
47
|
+
icon ||= name.titleize.gsub(' ','').underscore + '.png' # 'My Cool App' => 'my_cool_app.png'
|
48
|
+
icon = File.join SimpleTray.icon_directory, icon unless File.file?icon
|
49
|
+
if File.file?icon
|
50
|
+
icon = Wx::Bitmap.new icon, Wx::BITMAP_TYPE_PNG
|
51
|
+
item.set_bitmap icon
|
52
|
+
end
|
53
|
+
|
54
|
+
@menu.append_item item
|
55
|
+
@menu.evt_menu(item){ block.call }
|
56
|
+
item
|
57
|
+
end
|
58
|
+
|
59
|
+
def menu name, icon = nil, &block
|
60
|
+
if block.nil? and icon.respond_to?:call
|
61
|
+
block = icon
|
62
|
+
icon = nil
|
63
|
+
end
|
64
|
+
item = SimpleTray::MenuItem.new @menu, name, icon, &block
|
65
|
+
@menu.append_item item
|
66
|
+
end
|
67
|
+
|
68
|
+
def seperator
|
69
|
+
@menu.append_separator
|
70
|
+
end
|
71
|
+
|
72
|
+
def exit name = 'Quit'
|
73
|
+
@menu.append Wx::ID_EXIT, name
|
74
|
+
@menu.evt_menu(Wx::ID_EXIT){ Kernel::exit }
|
75
|
+
end
|
76
|
+
|
77
|
+
alias quit exit
|
78
|
+
|
79
|
+
def msgbox msg
|
80
|
+
Wx::MessageDialog.new(@frame, msg, 'Ashacache', Wx::OK, Wx::DEFAULT_POSITION ).show_modal
|
81
|
+
end
|
82
|
+
|
83
|
+
def method_missing method, *args, &block
|
84
|
+
method = method.to_s
|
85
|
+
if method[/^_*$/]
|
86
|
+
seperator
|
87
|
+
elsif method[/^_.*_$/]
|
88
|
+
menu method.titleize.strip, *args, &block
|
89
|
+
else
|
90
|
+
item method.titleize, *args, &block
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Used *internally* by SimpleTray
|
96
|
+
#
|
97
|
+
# Represents a menu item that has a web menu.
|
98
|
+
#
|
99
|
+
# This dynamically creates the menu when your mouse
|
100
|
+
# highlights / hovers over the menu. See #on_highlight
|
101
|
+
#
|
102
|
+
class MenuItem < Wx::MenuItem
|
103
|
+
include Builder
|
104
|
+
|
105
|
+
def initialize menu, name, icon = nil, &block
|
106
|
+
super menu, -1, name
|
107
|
+
@menu = menu
|
108
|
+
@name = name
|
109
|
+
@icon = icon || @name.titleize.gsub(' ','').underscore + '.png' # 'My Cool App' => 'my_cool_app.png'
|
110
|
+
@icon = File.join SimpleTray.icon_directory, @icon unless File.file?@icon
|
111
|
+
init_icon
|
112
|
+
@item_block = block
|
113
|
+
self.get_menu.evt_menu_highlight(self){ |evt| on_highlight(evt) }
|
114
|
+
@menu = Wx::Menu.new
|
115
|
+
self.set_sub_menu @menu
|
116
|
+
end
|
117
|
+
|
118
|
+
def init_icon
|
119
|
+
if File.file?@icon
|
120
|
+
icon = Wx::Bitmap.new @icon, Wx::BITMAP_TYPE_PNG
|
121
|
+
set_bitmap icon
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def on_highlight(evt)
|
126
|
+
instance_eval &@item_block if @menu.get_menu_item_count == 0
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Used *internally* by SimpleTray
|
131
|
+
#
|
132
|
+
# Represents the top-level system tray icon
|
133
|
+
#
|
134
|
+
# Menu items are dynamically created each time you click on
|
135
|
+
# the system tray icon. See #create_popup_menu
|
136
|
+
#
|
137
|
+
class Icon < Wx::TaskBarIcon
|
138
|
+
include Builder
|
139
|
+
|
140
|
+
def initialize title, icon = nil, &block
|
141
|
+
super()
|
142
|
+
@title = title
|
143
|
+
@icon = icon || @title.titleize.gsub(' ','').underscore + '.png' # 'My Cool App' => 'my_cool_app.png'
|
144
|
+
@icon = File.join SimpleTray.icon_directory, @icon unless File.file?@icon
|
145
|
+
init_icon
|
146
|
+
@item_block = block
|
147
|
+
end
|
148
|
+
|
149
|
+
def icon= path
|
150
|
+
@icon = path
|
151
|
+
end
|
152
|
+
|
153
|
+
def init_icon
|
154
|
+
unless File.file?@icon
|
155
|
+
raise "SimpleTray icon not found! #{ @icon }. Try: SimpleTray.app 'title', 'path to icon'. " +
|
156
|
+
"Or set SimpleTray.icon_directory to the directory where your icons reside."
|
157
|
+
else
|
158
|
+
refresh_icon
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def refresh_icon
|
163
|
+
set_icon Wx::Icon.new( @icon, Wx::BITMAP_TYPE_PNG ), @title if File.file?@icon
|
164
|
+
end
|
165
|
+
|
166
|
+
def create_popup_menu
|
167
|
+
@menu = Wx::Menu.new
|
168
|
+
instance_eval &@item_block
|
169
|
+
@menu
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
# default the icon directory to what we *think* is the path of the script being run
|
176
|
+
SimpleTray.icon_directory = File.expand_path(File.dirname($0))
|
data/simpletray.gemspec
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
|
3
|
+
s.name = "simpletray"
|
4
|
+
s.version = "0.0.6"
|
5
|
+
s.date = "2008-09-26"
|
6
|
+
s.summary = "Ruby gem that provides a DSL for creating system tray icon applications *really* easily."
|
7
|
+
s.email = "remi@remitaylor.com"
|
8
|
+
s.homepage = "http://github.com/remi/simpletray"
|
9
|
+
s.description = "Ruby gem that provides a DSL for creating system tray icon applications *really* easily."
|
10
|
+
s.has_rdoc = true
|
11
|
+
s.rdoc_options = ["--quiet", "--title", "SimpleTray - creating system tray icons", "--opname", "index.html", "--line-numbers", "--main", "SimpleTray", "--inline-source"]
|
12
|
+
s.authors = ["remi Taylor"]
|
13
|
+
|
14
|
+
# generate using: $ ruby -e "puts Dir['**/**'].select{|x| File.file?x}.inspect"
|
15
|
+
s.files = ["examples/first.rb", "lib/simpletray.rb", "README.rdoc", "simpletray.gemspec", "Rakefile"]
|
16
|
+
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: remi-simpletray
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- remi Taylor
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-09-26 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Ruby gem that provides a DSL for creating system tray icon applications *really* easily.
|
17
|
+
email: remi@remitaylor.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- examples/first.rb
|
26
|
+
- lib/simpletray.rb
|
27
|
+
- README.rdoc
|
28
|
+
- simpletray.gemspec
|
29
|
+
- Rakefile
|
30
|
+
has_rdoc: true
|
31
|
+
homepage: http://github.com/remi/simpletray
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options:
|
34
|
+
- --quiet
|
35
|
+
- --title
|
36
|
+
- SimpleTray - creating system tray icons
|
37
|
+
- --opname
|
38
|
+
- index.html
|
39
|
+
- --line-numbers
|
40
|
+
- --main
|
41
|
+
- SimpleTray
|
42
|
+
- --inline-source
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: "0"
|
50
|
+
version:
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: "0"
|
56
|
+
version:
|
57
|
+
requirements: []
|
58
|
+
|
59
|
+
rubyforge_project:
|
60
|
+
rubygems_version: 1.2.0
|
61
|
+
signing_key:
|
62
|
+
specification_version: 2
|
63
|
+
summary: Ruby gem that provides a DSL for creating system tray icon applications *really* easily.
|
64
|
+
test_files: []
|
65
|
+
|