ruby_do 0.0.0 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -0
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/bin/ruby_do.rb +4 -0
- data/gfx/search.png +0 -0
- data/glade/win_main.glade +64 -36
- data/glade/win_properties.glade +231 -0
- data/gui/win_main.rb +109 -1
- data/gui/win_properties.rb +130 -0
- data/include/database.rb +28 -0
- data/include/gui.rb +8 -0
- data/include/models.rb +3 -0
- data/include/plugin.rb +160 -0
- data/include/unix_socket.rb +2 -2
- data/lib/ruby_do.rb +86 -11
- data/models/plugin.rb +3 -0
- data/ruby_do.gemspec +14 -3
- metadata +33 -14
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/Rakefile
CHANGED
@@ -17,8 +17,8 @@ Jeweler::Tasks.new do |gem|
|
|
17
17
|
gem.name = "ruby_do"
|
18
18
|
gem.homepage = "http://github.com/kaspernj/ruby_do"
|
19
19
|
gem.license = "MIT"
|
20
|
-
gem.summary = %Q{A clone of Gnome-Do and Kupfer written in Ruby.
|
21
|
-
gem.description = %Q{A clone of Gnome-Do and Kupfer written in Ruby.
|
20
|
+
gem.summary = %Q{A clone of Gnome-Do and Kupfer written in Ruby.}
|
21
|
+
gem.description = %Q{A clone of Gnome-Do and Kupfer written in Ruby.}
|
22
22
|
gem.email = "k@spernj.org"
|
23
23
|
gem.authors = ["Kasper Johansen"]
|
24
24
|
# dependencies defined in Gemfile
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/bin/ruby_do.rb
CHANGED
data/gfx/search.png
ADDED
Binary file
|
data/glade/win_main.glade
CHANGED
@@ -4,10 +4,12 @@
|
|
4
4
|
<!-- interface-naming-policy project-wide -->
|
5
5
|
<object class="GtkWindow" id="window">
|
6
6
|
<property name="can_focus">False</property>
|
7
|
+
<property name="border_width">10</property>
|
7
8
|
<property name="title" translatable="yes">Ruby Do</property>
|
8
9
|
<property name="window_position">center</property>
|
9
|
-
<property name="default_width">
|
10
|
-
<property name="default_height">
|
10
|
+
<property name="default_width">800</property>
|
11
|
+
<property name="default_height">300</property>
|
12
|
+
<signal name="focus-out-event" handler="on_window_focus_out_event" swapped="no"/>
|
11
13
|
<child>
|
12
14
|
<object class="GtkVBox" id="vbox1">
|
13
15
|
<property name="visible">True</property>
|
@@ -31,6 +33,7 @@
|
|
31
33
|
<packing>
|
32
34
|
<property name="expand">False</property>
|
33
35
|
<property name="fill">False</property>
|
36
|
+
<property name="padding">4</property>
|
34
37
|
<property name="position">0</property>
|
35
38
|
</packing>
|
36
39
|
</child>
|
@@ -70,6 +73,8 @@
|
|
70
73
|
<property name="primary_icon_sensitive">True</property>
|
71
74
|
<property name="secondary_icon_sensitive">True</property>
|
72
75
|
<signal name="changed" handler="on_txtSearch_changed" swapped="no"/>
|
76
|
+
<signal name="activate" handler="on_txtSearch_activate" swapped="no"/>
|
77
|
+
<signal name="key-press-event" handler="on_txtSearch_key_press_event" swapped="no"/>
|
73
78
|
</object>
|
74
79
|
<packing>
|
75
80
|
<property name="left_attach">1</property>
|
@@ -84,60 +89,83 @@
|
|
84
89
|
</packing>
|
85
90
|
</child>
|
86
91
|
<child>
|
87
|
-
<object class="
|
92
|
+
<object class="GtkVBox" id="vbox2">
|
88
93
|
<property name="visible">True</property>
|
89
94
|
<property name="can_focus">False</property>
|
90
95
|
<child>
|
91
|
-
<object class="
|
92
|
-
<property name="width_request">170</property>
|
93
|
-
<property name="height_request">150</property>
|
96
|
+
<object class="GtkHBox" id="hbox1">
|
94
97
|
<property name="visible">True</property>
|
95
98
|
<property name="can_focus">False</property>
|
96
99
|
<child>
|
97
|
-
<object class="
|
100
|
+
<object class="GtkViewport" id="viewport1">
|
101
|
+
<property name="width_request">150</property>
|
102
|
+
<property name="height_request">150</property>
|
98
103
|
<property name="visible">True</property>
|
99
104
|
<property name="can_focus">False</property>
|
100
|
-
<property name="
|
105
|
+
<property name="shadow_type">none</property>
|
106
|
+
<child>
|
107
|
+
<object class="GtkImage" id="imgActionIcon">
|
108
|
+
<property name="visible">True</property>
|
109
|
+
<property name="can_focus">False</property>
|
110
|
+
<property name="stock">gtk-missing-image</property>
|
111
|
+
</object>
|
112
|
+
</child>
|
101
113
|
</object>
|
114
|
+
<packing>
|
115
|
+
<property name="expand">False</property>
|
116
|
+
<property name="fill">False</property>
|
117
|
+
<property name="padding">5</property>
|
118
|
+
<property name="position">0</property>
|
119
|
+
</packing>
|
102
120
|
</child>
|
103
|
-
</object>
|
104
|
-
<packing>
|
105
|
-
<property name="expand">False</property>
|
106
|
-
<property name="fill">True</property>
|
107
|
-
<property name="padding">30</property>
|
108
|
-
<property name="position">0</property>
|
109
|
-
</packing>
|
110
|
-
</child>
|
111
|
-
<child>
|
112
|
-
<object class="GtkFrame" id="frame1">
|
113
|
-
<property name="visible">True</property>
|
114
|
-
<property name="can_focus">False</property>
|
115
|
-
<property name="label_xalign">0</property>
|
116
|
-
<property name="shadow_type">none</property>
|
117
121
|
<child>
|
118
|
-
<object class="
|
122
|
+
<object class="GtkFrame" id="frame1">
|
119
123
|
<property name="visible">True</property>
|
120
124
|
<property name="can_focus">False</property>
|
121
|
-
<property name="
|
125
|
+
<property name="label_xalign">0</property>
|
126
|
+
<property name="shadow_type">none</property>
|
122
127
|
<child>
|
123
|
-
<object class="
|
128
|
+
<object class="GtkAlignment" id="alignment1">
|
124
129
|
<property name="visible">True</property>
|
125
130
|
<property name="can_focus">False</property>
|
126
|
-
<property name="
|
127
|
-
<
|
128
|
-
|
131
|
+
<property name="left_padding">12</property>
|
132
|
+
<child>
|
133
|
+
<object class="GtkLabel" id="labActionDescr">
|
134
|
+
<property name="visible">True</property>
|
135
|
+
<property name="can_focus">False</property>
|
136
|
+
<property name="xalign">0</property>
|
137
|
+
<property name="yalign">0</property>
|
138
|
+
<property name="label" translatable="yes">Description</property>
|
139
|
+
</object>
|
140
|
+
</child>
|
141
|
+
</object>
|
142
|
+
</child>
|
143
|
+
<child type="label">
|
144
|
+
<object class="GtkLabel" id="labActionTitle">
|
145
|
+
<property name="visible">True</property>
|
146
|
+
<property name="can_focus">False</property>
|
147
|
+
<property name="label" translatable="yes"><b>Action</b></property>
|
148
|
+
<property name="use_markup">True</property>
|
129
149
|
</object>
|
130
150
|
</child>
|
131
151
|
</object>
|
152
|
+
<packing>
|
153
|
+
<property name="expand">True</property>
|
154
|
+
<property name="fill">True</property>
|
155
|
+
<property name="position">1</property>
|
156
|
+
</packing>
|
132
157
|
</child>
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
158
|
+
</object>
|
159
|
+
<packing>
|
160
|
+
<property name="expand">False</property>
|
161
|
+
<property name="fill">True</property>
|
162
|
+
<property name="position">0</property>
|
163
|
+
</packing>
|
164
|
+
</child>
|
165
|
+
<child>
|
166
|
+
<object class="GtkLabel" id="label2">
|
167
|
+
<property name="visible">True</property>
|
168
|
+
<property name="can_focus">False</property>
|
141
169
|
</object>
|
142
170
|
<packing>
|
143
171
|
<property name="expand">True</property>
|
@@ -0,0 +1,231 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<interface>
|
3
|
+
<requires lib="gtk+" version="2.24"/>
|
4
|
+
<!-- interface-naming-policy project-wide -->
|
5
|
+
<object class="GtkWindow" id="window">
|
6
|
+
<property name="can_focus">False</property>
|
7
|
+
<property name="title" translatable="yes">Properties</property>
|
8
|
+
<property name="window_position">center</property>
|
9
|
+
<property name="default_width">640</property>
|
10
|
+
<property name="default_height">480</property>
|
11
|
+
<child>
|
12
|
+
<object class="GtkNotebook" id="notebook1">
|
13
|
+
<property name="visible">True</property>
|
14
|
+
<property name="can_focus">True</property>
|
15
|
+
<child>
|
16
|
+
<object class="GtkVBox" id="vbox3">
|
17
|
+
<property name="visible">True</property>
|
18
|
+
<property name="can_focus">False</property>
|
19
|
+
<child>
|
20
|
+
<object class="GtkTable" id="table2">
|
21
|
+
<property name="visible">True</property>
|
22
|
+
<property name="can_focus">False</property>
|
23
|
+
<property name="n_columns">2</property>
|
24
|
+
<child>
|
25
|
+
<object class="GtkCheckButton" id="cbShowWindowOnStartup">
|
26
|
+
<property name="label" translatable="yes">Show window on startup</property>
|
27
|
+
<property name="visible">True</property>
|
28
|
+
<property name="can_focus">True</property>
|
29
|
+
<property name="receives_default">False</property>
|
30
|
+
<property name="use_action_appearance">False</property>
|
31
|
+
<property name="draw_indicator">True</property>
|
32
|
+
<signal name="toggled" handler="on_cbShowWindowOnStartup_toggled" after="yes" swapped="no"/>
|
33
|
+
</object>
|
34
|
+
<packing>
|
35
|
+
<property name="right_attach">2</property>
|
36
|
+
<property name="x_options">GTK_FILL</property>
|
37
|
+
<property name="y_options">GTK_FILL</property>
|
38
|
+
</packing>
|
39
|
+
</child>
|
40
|
+
</object>
|
41
|
+
<packing>
|
42
|
+
<property name="expand">False</property>
|
43
|
+
<property name="fill">True</property>
|
44
|
+
<property name="position">0</property>
|
45
|
+
</packing>
|
46
|
+
</child>
|
47
|
+
<child>
|
48
|
+
<object class="GtkLabel" id="label4">
|
49
|
+
<property name="visible">True</property>
|
50
|
+
<property name="can_focus">False</property>
|
51
|
+
</object>
|
52
|
+
<packing>
|
53
|
+
<property name="expand">True</property>
|
54
|
+
<property name="fill">True</property>
|
55
|
+
<property name="position">1</property>
|
56
|
+
</packing>
|
57
|
+
</child>
|
58
|
+
</object>
|
59
|
+
</child>
|
60
|
+
<child type="tab">
|
61
|
+
<object class="GtkLabel" id="label1">
|
62
|
+
<property name="visible">True</property>
|
63
|
+
<property name="can_focus">False</property>
|
64
|
+
<property name="label" translatable="yes">Properties</property>
|
65
|
+
</object>
|
66
|
+
<packing>
|
67
|
+
<property name="tab_fill">False</property>
|
68
|
+
</packing>
|
69
|
+
</child>
|
70
|
+
<child>
|
71
|
+
<object class="GtkHPaned" id="hpaned1">
|
72
|
+
<property name="visible">True</property>
|
73
|
+
<property name="can_focus">True</property>
|
74
|
+
<property name="position">150</property>
|
75
|
+
<property name="position_set">True</property>
|
76
|
+
<child>
|
77
|
+
<object class="GtkFrame" id="frame1">
|
78
|
+
<property name="visible">True</property>
|
79
|
+
<property name="can_focus">False</property>
|
80
|
+
<property name="label_xalign">0</property>
|
81
|
+
<property name="shadow_type">none</property>
|
82
|
+
<child>
|
83
|
+
<object class="GtkAlignment" id="alignment1">
|
84
|
+
<property name="visible">True</property>
|
85
|
+
<property name="can_focus">False</property>
|
86
|
+
<property name="left_padding">12</property>
|
87
|
+
<child>
|
88
|
+
<object class="GtkViewport" id="viewport1">
|
89
|
+
<property name="visible">True</property>
|
90
|
+
<property name="can_focus">False</property>
|
91
|
+
<child>
|
92
|
+
<object class="GtkScrolledWindow" id="scrolledwindow1">
|
93
|
+
<property name="visible">True</property>
|
94
|
+
<property name="can_focus">True</property>
|
95
|
+
<property name="hscrollbar_policy">automatic</property>
|
96
|
+
<property name="vscrollbar_policy">automatic</property>
|
97
|
+
<child>
|
98
|
+
<object class="GtkTreeView" id="tvPlugins">
|
99
|
+
<property name="visible">True</property>
|
100
|
+
<property name="can_focus">True</property>
|
101
|
+
</object>
|
102
|
+
</child>
|
103
|
+
</object>
|
104
|
+
</child>
|
105
|
+
</object>
|
106
|
+
</child>
|
107
|
+
</object>
|
108
|
+
</child>
|
109
|
+
<child type="label">
|
110
|
+
<object class="GtkLabel" id="label6">
|
111
|
+
<property name="visible">True</property>
|
112
|
+
<property name="can_focus">False</property>
|
113
|
+
<property name="label" translatable="yes"><b>Plugins</b></property>
|
114
|
+
<property name="use_markup">True</property>
|
115
|
+
</object>
|
116
|
+
</child>
|
117
|
+
</object>
|
118
|
+
<packing>
|
119
|
+
<property name="resize">False</property>
|
120
|
+
<property name="shrink">True</property>
|
121
|
+
</packing>
|
122
|
+
</child>
|
123
|
+
<child>
|
124
|
+
<object class="GtkVBox" id="vbox1">
|
125
|
+
<property name="visible">True</property>
|
126
|
+
<property name="can_focus">False</property>
|
127
|
+
<child>
|
128
|
+
<object class="GtkFrame" id="frame2">
|
129
|
+
<property name="visible">True</property>
|
130
|
+
<property name="can_focus">False</property>
|
131
|
+
<property name="label_xalign">0</property>
|
132
|
+
<property name="shadow_type">none</property>
|
133
|
+
<child>
|
134
|
+
<object class="GtkAlignment" id="alignment2">
|
135
|
+
<property name="visible">True</property>
|
136
|
+
<property name="can_focus">False</property>
|
137
|
+
<property name="left_padding">12</property>
|
138
|
+
<child>
|
139
|
+
<object class="GtkVBox" id="vbox2">
|
140
|
+
<property name="visible">True</property>
|
141
|
+
<property name="can_focus">False</property>
|
142
|
+
<property name="spacing">4</property>
|
143
|
+
<child>
|
144
|
+
<object class="GtkTable" id="table1">
|
145
|
+
<property name="visible">True</property>
|
146
|
+
<property name="can_focus">False</property>
|
147
|
+
<property name="n_columns">2</property>
|
148
|
+
<property name="column_spacing">4</property>
|
149
|
+
<property name="row_spacing">4</property>
|
150
|
+
<child>
|
151
|
+
<object class="GtkCheckButton" id="cbPluginActivate">
|
152
|
+
<property name="label" translatable="yes">Activated</property>
|
153
|
+
<property name="visible">True</property>
|
154
|
+
<property name="can_focus">True</property>
|
155
|
+
<property name="receives_default">False</property>
|
156
|
+
<property name="use_action_appearance">False</property>
|
157
|
+
<property name="draw_indicator">True</property>
|
158
|
+
<signal name="toggled" handler="on_cbPluginActivate_toggled" after="yes" swapped="no"/>
|
159
|
+
</object>
|
160
|
+
<packing>
|
161
|
+
<property name="right_attach">2</property>
|
162
|
+
<property name="x_options">GTK_FILL</property>
|
163
|
+
<property name="y_options">GTK_FILL</property>
|
164
|
+
</packing>
|
165
|
+
</child>
|
166
|
+
</object>
|
167
|
+
<packing>
|
168
|
+
<property name="expand">False</property>
|
169
|
+
<property name="fill">True</property>
|
170
|
+
<property name="position">0</property>
|
171
|
+
</packing>
|
172
|
+
</child>
|
173
|
+
<child>
|
174
|
+
<object class="GtkVBox" id="boxPluginOptions">
|
175
|
+
<property name="visible">True</property>
|
176
|
+
<property name="can_focus">False</property>
|
177
|
+
<child>
|
178
|
+
<placeholder/>
|
179
|
+
</child>
|
180
|
+
</object>
|
181
|
+
<packing>
|
182
|
+
<property name="expand">True</property>
|
183
|
+
<property name="fill">True</property>
|
184
|
+
<property name="position">1</property>
|
185
|
+
</packing>
|
186
|
+
</child>
|
187
|
+
</object>
|
188
|
+
</child>
|
189
|
+
</object>
|
190
|
+
</child>
|
191
|
+
<child type="label">
|
192
|
+
<object class="GtkLabel" id="label8">
|
193
|
+
<property name="visible">True</property>
|
194
|
+
<property name="can_focus">False</property>
|
195
|
+
<property name="label" translatable="yes"><b>Plugin options</b></property>
|
196
|
+
<property name="use_markup">True</property>
|
197
|
+
</object>
|
198
|
+
</child>
|
199
|
+
</object>
|
200
|
+
<packing>
|
201
|
+
<property name="expand">True</property>
|
202
|
+
<property name="fill">True</property>
|
203
|
+
<property name="position">0</property>
|
204
|
+
</packing>
|
205
|
+
</child>
|
206
|
+
</object>
|
207
|
+
<packing>
|
208
|
+
<property name="resize">True</property>
|
209
|
+
<property name="shrink">True</property>
|
210
|
+
</packing>
|
211
|
+
</child>
|
212
|
+
</object>
|
213
|
+
<packing>
|
214
|
+
<property name="position">1</property>
|
215
|
+
</packing>
|
216
|
+
</child>
|
217
|
+
<child type="tab">
|
218
|
+
<object class="GtkLabel" id="label3">
|
219
|
+
<property name="visible">True</property>
|
220
|
+
<property name="can_focus">False</property>
|
221
|
+
<property name="label" translatable="yes">Plugins</property>
|
222
|
+
</object>
|
223
|
+
<packing>
|
224
|
+
<property name="position">1</property>
|
225
|
+
<property name="tab_fill">False</property>
|
226
|
+
</packing>
|
227
|
+
</child>
|
228
|
+
</object>
|
229
|
+
</child>
|
230
|
+
</object>
|
231
|
+
</interface>
|
data/gui/win_main.rb
CHANGED
@@ -1,13 +1,121 @@
|
|
1
|
+
#This class controls the main window.
|
1
2
|
class Ruby_do::Gui::Win_main
|
3
|
+
#Initializes various variables for the object.
|
2
4
|
def initialize(args)
|
3
5
|
@args = args
|
4
|
-
|
6
|
+
end
|
7
|
+
|
8
|
+
#Spawn the GUI-object.
|
9
|
+
def spawn_gui
|
5
10
|
@gui = Gtk::Builder.new.add("#{File.dirname(__FILE__)}/../glade/win_main.glade")
|
11
|
+
@gui.connect_signals{|h| method(h)}
|
6
12
|
Knj::Gtk2.translate(@gui)
|
7
13
|
end
|
8
14
|
|
15
|
+
def reset
|
16
|
+
@gui["txtSearch"].text = ""
|
17
|
+
self.update_res
|
18
|
+
self.on_txtSearch_changed_wait
|
19
|
+
end
|
20
|
+
|
21
|
+
#Spawns the GUI (if not already spawned) and focusses the window.
|
9
22
|
def show
|
23
|
+
self.spawn_gui if !@gui or @gui["window"].destroyed?
|
24
|
+
self.reset
|
25
|
+
|
10
26
|
@gui["window"].show_all
|
27
|
+
@gui["window"].present
|
11
28
|
@gui["txtSearch"].grab_focus
|
29
|
+
|
30
|
+
#Update icon and text.
|
31
|
+
self.update_res
|
32
|
+
end
|
33
|
+
|
34
|
+
def hide
|
35
|
+
@gui["window"].hide
|
36
|
+
end
|
37
|
+
|
38
|
+
#Updates the icon, title and description to match the current result (if any).
|
39
|
+
def update_res
|
40
|
+
if @cur_res
|
41
|
+
@gui["labActionTitle"].markup = @cur_res.title_html!
|
42
|
+
@gui["labActionDescr"].label = @cur_res.descr_html!
|
43
|
+
@gui["imgActionIcon"].pixbuf = @cur_res.icon_pixbuf!
|
44
|
+
else
|
45
|
+
@gui["labActionTitle"].markup = "<b>#{Knj::Web.html(_("Nothing found"))}</b>"
|
46
|
+
@gui["labActionDescr"].label = _("Please enter something in the search text-field to do something.")
|
47
|
+
@gui["imgActionIcon"].pixbuf = Ruby_do::Plugin::Result.search_icon
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
#Starts the timeout of half a second in order to not mass-call plugins and start lagging.
|
52
|
+
def on_txtSearch_changed
|
53
|
+
Gtk.timeout_remove(@timeout) if @timeout
|
54
|
+
@timeout = Gtk.timeout_add(500) do
|
55
|
+
self.on_txtSearch_changed_wait
|
56
|
+
false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
#This happens when the timeout is over and the plugins should be called.
|
61
|
+
def on_txtSearch_changed_wait
|
62
|
+
return nil if @gui["window"].destroyed?
|
63
|
+
|
64
|
+
text = @gui["txtSearch"].text
|
65
|
+
words = text.split(/\s+/).map{|ele| ele.downcase}
|
66
|
+
|
67
|
+
if words.empty?
|
68
|
+
@cur_res = nil
|
69
|
+
else
|
70
|
+
@enum = @args[:rdo].plugin.send(:text => text, :words => words)
|
71
|
+
|
72
|
+
begin
|
73
|
+
@cur_res = @enum.next
|
74
|
+
rescue StopIteration
|
75
|
+
@cur_res = nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
self.update_res
|
80
|
+
end
|
81
|
+
|
82
|
+
#This happens when <ENTER> is pressed while the search-textfield has focus.
|
83
|
+
def on_txtSearch_activate
|
84
|
+
#If enter was pressed before search was executed, then be sure to execute a search first and disable the timeout, so search wont be done two times.
|
85
|
+
if @timeout
|
86
|
+
Gtk.timeout_remove(@timeout)
|
87
|
+
self.on_txtSearch_changed_wait
|
88
|
+
end
|
89
|
+
|
90
|
+
if !@cur_res
|
91
|
+
Knj::Gtk2.msgbox(_("Please search for something in order to activate."))
|
92
|
+
return nil
|
93
|
+
end
|
94
|
+
|
95
|
+
begin
|
96
|
+
res = @cur_res.args[:plugin].execute_result(:res => @cur_res)
|
97
|
+
|
98
|
+
if res == :close_win_main
|
99
|
+
@gui["window"].destroy
|
100
|
+
end
|
101
|
+
rescue => e
|
102
|
+
Knj::Gtk2.msgbox(_("An error occurred.") + "\n\n#{e.inspect}\n\n#{e.backtrace.join("\n")}")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
#In order the register <ESCAPE>-presses.
|
107
|
+
def on_txtSearch_key_press_event(entry, eventkey)
|
108
|
+
if Gdk::Keyval.to_name(eventkey.keyval) == "Escape"
|
109
|
+
@gui["window"].destroy
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def on_btnProperties_clicked
|
114
|
+
@args[:rdo].show_win_properties
|
115
|
+
@gui["window"].destroy
|
116
|
+
end
|
117
|
+
|
118
|
+
def on_window_focus_out_event
|
119
|
+
@gui["window"].destroy
|
12
120
|
end
|
13
121
|
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
#This class controls the properties window.
|
2
|
+
class Ruby_do::Gui::Win_properties
|
3
|
+
attr_reader :gui
|
4
|
+
|
5
|
+
def initialize(args)
|
6
|
+
@args = args
|
7
|
+
|
8
|
+
@gui = Gtk::Builder.new.add("#{File.dirname(__FILE__)}/../glade/win_properties.glade")
|
9
|
+
@gui.connect_signals{|h| method(h)}
|
10
|
+
Knj::Gtk2.translate(@gui)
|
11
|
+
|
12
|
+
|
13
|
+
#Initialize plugins-treeview.
|
14
|
+
Knj::Gtk2::Tv.init(@gui["tvPlugins"], [
|
15
|
+
_("Name"),
|
16
|
+
_("Title")
|
17
|
+
])
|
18
|
+
@gui["tvPlugins"].columns[0].visible = false
|
19
|
+
@gui["tvPlugins"].selection.signal_connect_after("changed", &self.method(:on_tvPlugins_changed))
|
20
|
+
self.reload_plugins
|
21
|
+
@gui["tvPlugins"].selection.select_iter(@gui["tvPlugins"].model.iter_first)
|
22
|
+
|
23
|
+
|
24
|
+
#Show the properties window.
|
25
|
+
@gui["window"].show
|
26
|
+
|
27
|
+
|
28
|
+
#Hides checkbutton until a plugin is chosen.
|
29
|
+
self.load_widget
|
30
|
+
|
31
|
+
|
32
|
+
#Set the value of main-window-show checkbutton.
|
33
|
+
if Knj::Opts.get("skip_main_on_startup").to_i == 1
|
34
|
+
@gui["cbShowWindowOnStartup"].active = false
|
35
|
+
else
|
36
|
+
@gui["cbShowWindowOnStartup"].active = true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def reload_plugins
|
41
|
+
@gui["tvPlugins"].model.clear
|
42
|
+
|
43
|
+
@args[:rdo].plugin.plugins.each do |name, plugin_obj|
|
44
|
+
Knj::Gtk2::Tv.append(@gui["tvPlugins"], [
|
45
|
+
plugin_obj.classname,
|
46
|
+
plugin_obj.title
|
47
|
+
])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def on_tvPlugins_changed(*args)
|
52
|
+
sel = Knj::Gtk2::Tv.sel(@gui["tvPlugins"])
|
53
|
+
model = @args[:rdo].ob.get_by(:Plugin, {"classname" => sel[0]}) if sel
|
54
|
+
|
55
|
+
if model and model[:active].to_i == 1
|
56
|
+
@gui["cbPluginActivate"].active = true
|
57
|
+
else
|
58
|
+
@gui["cbPluginActivate"].active = false
|
59
|
+
end
|
60
|
+
|
61
|
+
self.load_widget
|
62
|
+
|
63
|
+
@gui["boxPluginOptions"].show_all
|
64
|
+
end
|
65
|
+
|
66
|
+
def load_widget
|
67
|
+
#Remove plugin-widgets.
|
68
|
+
@gui["boxPluginOptions"].children.each do |child|
|
69
|
+
@gui["boxPluginOptions"].remove(child)
|
70
|
+
child.destroy
|
71
|
+
end
|
72
|
+
|
73
|
+
sel = Knj::Gtk2::Tv.sel(@gui["tvPlugins"])
|
74
|
+
model = @args[:rdo].ob.get_by(:Plugin, {"classname" => sel[0]}) if sel
|
75
|
+
|
76
|
+
#If a plugin is selected and that plugin has a option-widget, then show that widget. Else show a label describing what is going on.
|
77
|
+
if sel and model and plugin = @args[:rdo].plugin.plugins[sel[0]]
|
78
|
+
if model[:active].to_i == 1
|
79
|
+
@gui["cbPluginActivate"].active = true
|
80
|
+
|
81
|
+
opt_res = plugin.on_options and opt_res[:widget]
|
82
|
+
if opt_res and opt_res[:widget]
|
83
|
+
@gui["boxPluginOptions"].pack_start(opt_res[:widget])
|
84
|
+
opt_res[:widget].show
|
85
|
+
else
|
86
|
+
label = Gtk::Label.new(_("This plugin doesnt have any options."))
|
87
|
+
@gui["boxPluginOptions"].pack_start(label)
|
88
|
+
label.show
|
89
|
+
end
|
90
|
+
else
|
91
|
+
@gui["cbPluginActivate"].active = false
|
92
|
+
label = Gtk::Label.new(_("Activate the plugin to see available options."))
|
93
|
+
@gui["boxPluginOptions"].pack_start(label)
|
94
|
+
label.show
|
95
|
+
end
|
96
|
+
|
97
|
+
@gui["cbPluginActivate"].show
|
98
|
+
else
|
99
|
+
label = Gtk::Label.new(_("Please choose a plugin."))
|
100
|
+
@gui["boxPluginOptions"].pack_start(label)
|
101
|
+
label.show
|
102
|
+
@gui["cbPluginActivate"].hide
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def on_cbPluginActivate_toggled
|
107
|
+
sel = Knj::Gtk2::Tv.sel(@gui["tvPlugins"])
|
108
|
+
model = @args[:rdo].ob.get_by(:Plugin, {"classname" => sel[0]}) if sel
|
109
|
+
|
110
|
+
if model
|
111
|
+
if @gui["cbPluginActivate"].active?
|
112
|
+
model[:active] = 1
|
113
|
+
else
|
114
|
+
model[:active] = 0
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
self.load_widget
|
119
|
+
end
|
120
|
+
|
121
|
+
def on_cbShowWindowOnStartup_toggled
|
122
|
+
val = @gui["cbShowWindowOnStartup"].active?
|
123
|
+
|
124
|
+
if val
|
125
|
+
Knj::Opts.set("skip_main_on_startup", 0)
|
126
|
+
else
|
127
|
+
Knj::Opts.set("skip_main_on_startup", 1)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
data/include/database.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
class Ruby_do::Database
|
2
|
+
SCHEMA = {
|
3
|
+
"tables" => {
|
4
|
+
"Option" => {
|
5
|
+
"columns" => [
|
6
|
+
{"name" => "id", "type" => "int", "autoincr" => true, "primarykey" => true},
|
7
|
+
{"name" => "title", "type" => "varchar"},
|
8
|
+
{"name" => "value", "type" => "text"}
|
9
|
+
],
|
10
|
+
"indexes" => [
|
11
|
+
"title"
|
12
|
+
]
|
13
|
+
},
|
14
|
+
"Plugin" => {
|
15
|
+
"columns" => [
|
16
|
+
{"name" => "id", "type" => "int", "autoincr" => true, "primarykey" => true},
|
17
|
+
{"name" => "name", "type" => "varchar"},
|
18
|
+
{"name" => "classname", "type" => "varchar"},
|
19
|
+
{"name" => "active", "type" => "enum", "maxlength" => "'0','1'", "default" => 0}
|
20
|
+
],
|
21
|
+
"indexes" => [
|
22
|
+
"name",
|
23
|
+
"classname"
|
24
|
+
]
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
end
|
data/include/gui.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
#This class contains all the GUI-subclasses (windows, tray-icon and such).
|
2
|
+
class Ruby_do::Gui
|
3
|
+
#Autoloader for Gui-subclasses.
|
4
|
+
def self.const_missing(name)
|
5
|
+
require "#{File.dirname(__FILE__)}/../gui/#{name.to_s.downcase}.rb"
|
6
|
+
return self.const_get(name)
|
7
|
+
end
|
8
|
+
end
|
data/include/models.rb
ADDED
data/include/plugin.rb
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
class Ruby_do::Plugin
|
2
|
+
def self.const_missing(name)
|
3
|
+
|
4
|
+
end
|
5
|
+
|
6
|
+
attr_reader :plugins
|
7
|
+
|
8
|
+
def register_plugins
|
9
|
+
paths = [
|
10
|
+
File.realpath("#{File.dirname(__FILE__)}/../../") #To enable developing of plugins in parent directory without having to do Gem-installs all the time.
|
11
|
+
]
|
12
|
+
|
13
|
+
Gem.path.each do |gem_path|
|
14
|
+
paths << "#{gem_path}/gems"
|
15
|
+
end
|
16
|
+
|
17
|
+
paths.each do |path|
|
18
|
+
Dir.foreach(path) do |gem_dir|
|
19
|
+
next if gem_dir == "." or gem_dir == ".." or gem_dir[0, 15] != "ruby_do_plugin_"
|
20
|
+
|
21
|
+
match = gem_dir.match(/^([A-z_\d]+)(|-([\d\.]*))$/)
|
22
|
+
next if !match
|
23
|
+
next if @plugins.key?(match[1])
|
24
|
+
classname = "#{match[1][0].upcase}#{match[1][1, match[1].length]}"
|
25
|
+
|
26
|
+
begin
|
27
|
+
require "#{path}/#{gem_dir}/lib/#{match[1]}"
|
28
|
+
plugin = Kernel.const_get(classname).new(:rdo => @args[:rdo], :classname => match[1])
|
29
|
+
@plugins[match[1]] = plugin
|
30
|
+
|
31
|
+
model = @args[:rdo].ob.get_by(:Plugin, {
|
32
|
+
"classname" => plugin.classname
|
33
|
+
})
|
34
|
+
|
35
|
+
if !model
|
36
|
+
model = @args[:rdo].ob.add(:Plugin, {
|
37
|
+
:classname => plugin.classname,
|
38
|
+
:name => plugin.name
|
39
|
+
})
|
40
|
+
end
|
41
|
+
|
42
|
+
plugin.model = model
|
43
|
+
model.plugin = plugin
|
44
|
+
rescue NameError => e
|
45
|
+
$stderr.puts "Cant loading plugin '#{match[1]}' because of the following."
|
46
|
+
$stderr.puts e.inspect
|
47
|
+
$stderr.puts e.backtrace
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize(args)
|
54
|
+
@args = args
|
55
|
+
@plugins = {}
|
56
|
+
end
|
57
|
+
|
58
|
+
def send(args)
|
59
|
+
return Enumerator.new do |yielder|
|
60
|
+
@plugins.each do |name, plugin_instance|
|
61
|
+
plugin_model = @args[:rdo].ob.get_by(:Plugin, "classname" => plugin_instance.classname)
|
62
|
+
next if !plugin_model or plugin_model[:active].to_i != 1
|
63
|
+
|
64
|
+
begin
|
65
|
+
enum = plugin_instance.on_search(args)
|
66
|
+
enum.each do |res|
|
67
|
+
yielder << res
|
68
|
+
end
|
69
|
+
rescue => e
|
70
|
+
$stderr.puts e.inspect
|
71
|
+
$stderr.puts e.backtrace
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class Base
|
78
|
+
attr_accessor :model
|
79
|
+
|
80
|
+
attr_reader :rdo_plugin_args
|
81
|
+
|
82
|
+
def initialize(args)
|
83
|
+
@rdo_plugin_args = args
|
84
|
+
end
|
85
|
+
|
86
|
+
def classname
|
87
|
+
return @rdo_plugin_args[:classname]
|
88
|
+
end
|
89
|
+
|
90
|
+
def name
|
91
|
+
return @rdo_plugin_args[:name]
|
92
|
+
end
|
93
|
+
|
94
|
+
#Returns a default name based on the plugin-name. This method can be over-written on the plugin itself.
|
95
|
+
def title
|
96
|
+
name = Knj::Php.ucwords(self.class.name.to_s[15, 999].gsub("_", " "))
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
class Result
|
101
|
+
attr_reader :args
|
102
|
+
|
103
|
+
@@search_icon = Gdk::Pixbuf.new("#{File.dirname(__FILE__)}/../gfx/search.png")
|
104
|
+
def self.search_icon
|
105
|
+
return @@search_icon
|
106
|
+
end
|
107
|
+
|
108
|
+
def initialize(args)
|
109
|
+
@args = args
|
110
|
+
end
|
111
|
+
|
112
|
+
def icon_pixbuf!
|
113
|
+
if @args[:icon]
|
114
|
+
if File.exists?(@args[:icon])
|
115
|
+
return Gdk::Pixbuf.new(@args[:icon])
|
116
|
+
else
|
117
|
+
$stderr.puts "Icon does not exist: '#{@args[:icon]}'."
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
return @@search_icon
|
122
|
+
end
|
123
|
+
|
124
|
+
def title!
|
125
|
+
if !@args[:title].to_s.empty?
|
126
|
+
return @args[:title]
|
127
|
+
else
|
128
|
+
return "[#{_("no title")}]"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def title_html!
|
133
|
+
if !@args[:title_html].to_s.empty?
|
134
|
+
return @args[:title_html]
|
135
|
+
elsif !@args[:title].to_s.empty?
|
136
|
+
return "<b>#{Knj::Web.html(@args[:title])}</b>"
|
137
|
+
else
|
138
|
+
return "<b>[#{_("no title")}]</b>"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def descr!
|
143
|
+
if !@args[:descr].to_s.empty?
|
144
|
+
return @args[:descr]
|
145
|
+
else
|
146
|
+
return "[#{_("no description")}]"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def descr_html!
|
151
|
+
if !@args[:descr_html].to_s.empty?
|
152
|
+
return @args[:descr_html]
|
153
|
+
elsif !@args[:descr].to_s.empty?
|
154
|
+
return Knj::Web.html(@args[:descr])
|
155
|
+
else
|
156
|
+
return "[#{_("no description")}]"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
data/include/unix_socket.rb
CHANGED
@@ -21,8 +21,8 @@ class Ruby_do::Unix_socket
|
|
21
21
|
client.each_line do |line|
|
22
22
|
line = line.strip
|
23
23
|
|
24
|
-
if line.strip == "
|
25
|
-
@args[:
|
24
|
+
if line.strip == "show_win_main"
|
25
|
+
@args[:rdo].show_win_main
|
26
26
|
else
|
27
27
|
$stderr.puts "Unknown line: #{line}"
|
28
28
|
end
|
data/lib/ruby_do.rb
CHANGED
@@ -1,35 +1,102 @@
|
|
1
1
|
class Ruby_do
|
2
|
-
|
3
|
-
def self.const_missing(name)
|
4
|
-
require "#{File.dirname(__FILE__)}/../gui/#{name.to_s.downcase}.rb"
|
5
|
-
return self.const_get(name)
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
2
|
+
#Autoloader for subclasses.
|
9
3
|
def self.const_missing(name)
|
10
4
|
require "#{File.dirname(__FILE__)}/../include/#{name.to_s.downcase}.rb"
|
11
5
|
return self.const_get(name)
|
12
6
|
end
|
13
7
|
|
14
|
-
attr_reader :args
|
8
|
+
attr_reader :args, :db, :ob, :plugin
|
15
9
|
|
16
10
|
def initialize(args = {})
|
11
|
+
#Require various used libs.
|
17
12
|
require "rubygems"
|
18
|
-
require "gtk2"
|
19
13
|
require "knjrbfw"
|
20
|
-
require "gettext"
|
21
14
|
|
15
|
+
|
16
|
+
#Set arguments (config).
|
22
17
|
homedir = Knj::Os.homedir
|
23
18
|
path = "#{homedir}/.ruby_do"
|
24
19
|
Dir.mkdir(path) if !File.exists?(path)
|
25
20
|
|
26
21
|
@args = {
|
27
|
-
:sock_path => "#{path}/sock"
|
22
|
+
:sock_path => "#{path}/sock",
|
23
|
+
:db_path => "#{path}/database.sqlite3",
|
24
|
+
:run_path => "#{path}/run"
|
28
25
|
}.merge(args)
|
29
26
|
|
27
|
+
|
28
|
+
#Checks if the run-file exists and creates it if not.
|
29
|
+
if File.exists?(@args[:run_path])
|
30
|
+
pid = File.read(@args[:run_path]).to_i
|
31
|
+
procs = Knj::Unix_proc.list("pids" => [pid])
|
32
|
+
if !procs.empty?
|
33
|
+
puts "Ruby-Do is already running. Trying to show main window..."
|
34
|
+
require "socket"
|
35
|
+
UNIXSocket.open(@args[:sock_path]) do |sock|
|
36
|
+
sock.puts "show_win_main"
|
37
|
+
end
|
38
|
+
|
39
|
+
exit
|
40
|
+
#raise sprintf(_("Ruby-Do is already running with PID '%s'."), pid)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
File.open(@args[:run_path], "w") do |fp|
|
45
|
+
fp.write(Process.pid)
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
#Require the rest of the heavy libs.
|
50
|
+
require "gtk2"
|
51
|
+
require "gettext"
|
52
|
+
require "sqlite3"
|
53
|
+
|
54
|
+
|
55
|
+
#Load database.
|
56
|
+
@db = Knj::Db.new(
|
57
|
+
:type => "sqlite3",
|
58
|
+
:path => @args[:db_path],
|
59
|
+
:return_keys => "symbols",
|
60
|
+
:index_append_table_name => true
|
61
|
+
)
|
62
|
+
|
63
|
+
|
64
|
+
#Update database structure.
|
65
|
+
Knj::Db::Revision.new.init_db("db" => @db, "schema" => Ruby_do::Database::SCHEMA)
|
66
|
+
|
67
|
+
|
68
|
+
#Object framework.
|
69
|
+
@ob = Knj::Objects.new(
|
70
|
+
:datarow => true,
|
71
|
+
:class_path => "#{File.dirname(__FILE__)}/../models",
|
72
|
+
:class_pre => "",
|
73
|
+
:db => @db,
|
74
|
+
:module => Ruby_do::Models
|
75
|
+
)
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
#Start options-module.
|
80
|
+
Knj::Opts.init("knjdb" => @db, "table" => "Option")
|
81
|
+
|
82
|
+
|
83
|
+
#Start unix-socket to enable custom shortcuts.
|
30
84
|
@unix_socket = Ruby_do::Unix_socket.new(:rdo => self)
|
85
|
+
|
86
|
+
|
87
|
+
#Start plugins-engine.
|
88
|
+
@plugin = Ruby_do::Plugin.new(:rdo => self)
|
89
|
+
@plugin.register_plugins
|
90
|
+
|
91
|
+
|
92
|
+
#Show main window if it is not set to be skipped.
|
93
|
+
val = Knj::Opts.get("skip_main_on_startup").to_i
|
94
|
+
if val != 1
|
95
|
+
self.show_win_main
|
96
|
+
end
|
31
97
|
end
|
32
98
|
|
99
|
+
#Shows the main window. If already shown then tries to give it focus.
|
33
100
|
def show_win_main
|
34
101
|
if !@win_main
|
35
102
|
@win_main = Ruby_do::Gui::Win_main.new(:rdo => self)
|
@@ -38,6 +105,14 @@ class Ruby_do
|
|
38
105
|
@win_main.show
|
39
106
|
end
|
40
107
|
|
108
|
+
#Opens the properties-window or focuses it if it is already open.
|
109
|
+
def show_win_properties
|
110
|
+
Knj::Gtk2::Window.unique!("preferences") do
|
111
|
+
Ruby_do::Gui::Win_properties.new(:rdo => self)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
#Joins the Gtk-main-loop.
|
41
116
|
def join
|
42
117
|
Gtk.main
|
43
118
|
end
|
data/models/plugin.rb
ADDED
data/ruby_do.gemspec
CHANGED
@@ -5,13 +5,13 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ruby_do}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date = %q{2012-07-
|
12
|
+
s.date = %q{2012-07-09}
|
13
13
|
s.default_executable = %q{ruby_do.rb}
|
14
|
-
s.description = %q{A clone of Gnome-Do and Kupfer written in Ruby.
|
14
|
+
s.description = %q{A clone of Gnome-Do and Kupfer written in Ruby.}
|
15
15
|
s.email = %q{k@spernj.org}
|
16
16
|
s.executables = ["ruby_do.rb"]
|
17
17
|
s.extra_rdoc_files = [
|
@@ -28,10 +28,18 @@ Gem::Specification.new do |s|
|
|
28
28
|
"Rakefile",
|
29
29
|
"VERSION",
|
30
30
|
"bin/ruby_do.rb",
|
31
|
+
"gfx/search.png",
|
31
32
|
"glade/win_main.glade",
|
33
|
+
"glade/win_properties.glade",
|
32
34
|
"gui/win_main.rb",
|
35
|
+
"gui/win_properties.rb",
|
36
|
+
"include/database.rb",
|
37
|
+
"include/gui.rb",
|
38
|
+
"include/models.rb",
|
39
|
+
"include/plugin.rb",
|
33
40
|
"include/unix_socket.rb",
|
34
41
|
"lib/ruby_do.rb",
|
42
|
+
"models/plugin.rb",
|
35
43
|
"ruby_do.gemspec",
|
36
44
|
"spec/ruby_do_spec.rb",
|
37
45
|
"spec/spec_helper.rb"
|
@@ -49,6 +57,7 @@ Gem::Specification.new do |s|
|
|
49
57
|
s.add_runtime_dependency(%q<gtk2>, [">= 0"])
|
50
58
|
s.add_runtime_dependency(%q<knjrbfw>, [">= 0"])
|
51
59
|
s.add_runtime_dependency(%q<gettext>, [">= 0"])
|
60
|
+
s.add_runtime_dependency(%q<sqlite3>, [">= 0"])
|
52
61
|
s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
|
53
62
|
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
54
63
|
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
@@ -58,6 +67,7 @@ Gem::Specification.new do |s|
|
|
58
67
|
s.add_dependency(%q<gtk2>, [">= 0"])
|
59
68
|
s.add_dependency(%q<knjrbfw>, [">= 0"])
|
60
69
|
s.add_dependency(%q<gettext>, [">= 0"])
|
70
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
61
71
|
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
62
72
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
63
73
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
@@ -68,6 +78,7 @@ Gem::Specification.new do |s|
|
|
68
78
|
s.add_dependency(%q<gtk2>, [">= 0"])
|
69
79
|
s.add_dependency(%q<knjrbfw>, [">= 0"])
|
70
80
|
s.add_dependency(%q<gettext>, [">= 0"])
|
81
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
71
82
|
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
72
83
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
73
84
|
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: ruby_do
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kasper Johansen
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-09 00:00:00 +02:00
|
14
14
|
default_executable: ruby_do.rb
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -47,8 +47,19 @@ dependencies:
|
|
47
47
|
prerelease: false
|
48
48
|
version_requirements: *id003
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
|
-
name:
|
50
|
+
name: sqlite3
|
51
51
|
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0"
|
57
|
+
type: :runtime
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *id004
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: rspec
|
62
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
52
63
|
none: false
|
53
64
|
requirements:
|
54
65
|
- - ~>
|
@@ -56,10 +67,10 @@ dependencies:
|
|
56
67
|
version: 2.8.0
|
57
68
|
type: :development
|
58
69
|
prerelease: false
|
59
|
-
version_requirements: *
|
70
|
+
version_requirements: *id005
|
60
71
|
- !ruby/object:Gem::Dependency
|
61
72
|
name: rdoc
|
62
|
-
requirement: &
|
73
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
63
74
|
none: false
|
64
75
|
requirements:
|
65
76
|
- - ~>
|
@@ -67,10 +78,10 @@ dependencies:
|
|
67
78
|
version: "3.12"
|
68
79
|
type: :development
|
69
80
|
prerelease: false
|
70
|
-
version_requirements: *
|
81
|
+
version_requirements: *id006
|
71
82
|
- !ruby/object:Gem::Dependency
|
72
83
|
name: bundler
|
73
|
-
requirement: &
|
84
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
74
85
|
none: false
|
75
86
|
requirements:
|
76
87
|
- - ">="
|
@@ -78,10 +89,10 @@ dependencies:
|
|
78
89
|
version: 1.0.0
|
79
90
|
type: :development
|
80
91
|
prerelease: false
|
81
|
-
version_requirements: *
|
92
|
+
version_requirements: *id007
|
82
93
|
- !ruby/object:Gem::Dependency
|
83
94
|
name: jeweler
|
84
|
-
requirement: &
|
95
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
85
96
|
none: false
|
86
97
|
requirements:
|
87
98
|
- - ~>
|
@@ -89,10 +100,10 @@ dependencies:
|
|
89
100
|
version: 1.8.4
|
90
101
|
type: :development
|
91
102
|
prerelease: false
|
92
|
-
version_requirements: *
|
103
|
+
version_requirements: *id008
|
93
104
|
- !ruby/object:Gem::Dependency
|
94
105
|
name: rcov
|
95
|
-
requirement: &
|
106
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
96
107
|
none: false
|
97
108
|
requirements:
|
98
109
|
- - ">="
|
@@ -100,8 +111,8 @@ dependencies:
|
|
100
111
|
version: "0"
|
101
112
|
type: :development
|
102
113
|
prerelease: false
|
103
|
-
version_requirements: *
|
104
|
-
description:
|
114
|
+
version_requirements: *id009
|
115
|
+
description: A clone of Gnome-Do and Kupfer written in Ruby.
|
105
116
|
email: k@spernj.org
|
106
117
|
executables:
|
107
118
|
- ruby_do.rb
|
@@ -120,10 +131,18 @@ files:
|
|
120
131
|
- Rakefile
|
121
132
|
- VERSION
|
122
133
|
- bin/ruby_do.rb
|
134
|
+
- gfx/search.png
|
123
135
|
- glade/win_main.glade
|
136
|
+
- glade/win_properties.glade
|
124
137
|
- gui/win_main.rb
|
138
|
+
- gui/win_properties.rb
|
139
|
+
- include/database.rb
|
140
|
+
- include/gui.rb
|
141
|
+
- include/models.rb
|
142
|
+
- include/plugin.rb
|
125
143
|
- include/unix_socket.rb
|
126
144
|
- lib/ruby_do.rb
|
145
|
+
- models/plugin.rb
|
127
146
|
- ruby_do.gemspec
|
128
147
|
- spec/ruby_do_spec.rb
|
129
148
|
- spec/spec_helper.rb
|
@@ -141,7 +160,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
141
160
|
requirements:
|
142
161
|
- - ">="
|
143
162
|
- !ruby/object:Gem::Version
|
144
|
-
hash: -
|
163
|
+
hash: -2248539457086474609
|
145
164
|
segments:
|
146
165
|
- 0
|
147
166
|
version: "0"
|