rabbit 3.0.4 → 4.0.0

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 (243) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/Rakefile +53 -7
  4. data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
  5. data/doc/_config.yml +2 -2
  6. data/doc/en/news.rd +69 -1
  7. data/doc/ja/news.rd +68 -0
  8. data/lib/rabbit/actions.rb +446 -0
  9. data/lib/rabbit/author-configuration.rb +7 -10
  10. data/lib/rabbit/canvas.rb +74 -42
  11. data/lib/rabbit/command/rabbit-slide.rb +11 -13
  12. data/lib/rabbit/command/rabbit-theme.rb +10 -12
  13. data/lib/rabbit/command/rabbit.rb +31 -43
  14. data/lib/rabbit/console.rb +20 -22
  15. data/lib/rabbit/dependency-canvas.rb +2 -2
  16. data/lib/rabbit/element/base.rb +93 -6
  17. data/lib/rabbit/element/block-element.rb +17 -1
  18. data/lib/rabbit/element/block.rb +17 -1
  19. data/lib/rabbit/element/container-element.rb +59 -3
  20. data/lib/rabbit/element/description-list.rb +18 -2
  21. data/lib/rabbit/element/enum-list.rb +18 -2
  22. data/lib/rabbit/element/footnote.rb +18 -2
  23. data/lib/rabbit/element/image-title-slide.rb +17 -1
  24. data/lib/rabbit/element/image.rb +32 -2
  25. data/lib/rabbit/element/index-slide.rb +29 -13
  26. data/lib/rabbit/element/item-list.rb +18 -2
  27. data/lib/rabbit/element/method-list.rb +18 -2
  28. data/lib/rabbit/element/poppler-page.rb +17 -1
  29. data/lib/rabbit/element/poppler-slide.rb +18 -2
  30. data/lib/rabbit/element/poppler-title-slide.rb +18 -2
  31. data/lib/rabbit/element/preformatted.rb +18 -2
  32. data/lib/rabbit/element/slide-element.rb +29 -2
  33. data/lib/rabbit/element/slide.rb +18 -2
  34. data/lib/rabbit/element/syntax-highlighting.rb +17 -1
  35. data/lib/rabbit/element/table.rb +19 -3
  36. data/lib/rabbit/element/tag.rb +18 -2
  37. data/lib/rabbit/element/text-block-element.rb +18 -2
  38. data/lib/rabbit/element/text-container-element.rb +41 -2
  39. data/lib/rabbit/element/text-element.rb +17 -1
  40. data/lib/rabbit/element/text-renderer.rb +17 -1
  41. data/lib/rabbit/element/text.rb +4 -4
  42. data/lib/rabbit/element/title-slide.rb +19 -3
  43. data/lib/rabbit/element/video.rb +157 -56
  44. data/lib/rabbit/element.rb +20 -20
  45. data/lib/rabbit/formatter.rb +18 -1
  46. data/lib/rabbit/frame.rb +102 -90
  47. data/lib/rabbit/front.rb +11 -4
  48. data/lib/rabbit/gem-finder.rb +4 -8
  49. data/lib/rabbit/gem-pusher.rb +4 -4
  50. data/lib/rabbit/gesture/handler.rb +26 -21
  51. data/lib/rabbit/graffiti/config-dialog.rb +18 -2
  52. data/lib/rabbit/graffiti/processor.rb +20 -4
  53. data/lib/rabbit/gtk.rb +48 -14
  54. data/lib/rabbit/html/generator.rb +18 -18
  55. data/{test/helper/fixture.rb → lib/rabbit/icon.rb} +16 -6
  56. data/lib/rabbit/image/base.rb +7 -6
  57. data/lib/rabbit/image/default.rb +17 -1
  58. data/lib/rabbit/image/dia.rb +2 -2
  59. data/lib/rabbit/image/eps.rb +16 -2
  60. data/lib/rabbit/image/gimp.rb +28 -11
  61. data/lib/rabbit/image/mermaid.rb +3 -3
  62. data/lib/rabbit/image/pdf.rb +3 -3
  63. data/lib/rabbit/image/svg.rb +2 -2
  64. data/lib/rabbit/image.rb +8 -8
  65. data/lib/rabbit/info-window.rb +55 -18
  66. data/lib/rabbit/key-handler.rb +381 -0
  67. data/lib/rabbit/keys.rb +31 -2
  68. data/lib/rabbit/logger/base.rb +17 -1
  69. data/lib/rabbit/logger/gui.rb +20 -4
  70. data/lib/rabbit/logger/stderr.rb +16 -2
  71. data/lib/rabbit/logger.rb +4 -4
  72. data/lib/rabbit/menu.rb +200 -220
  73. data/lib/rabbit/parser/base.rb +17 -1
  74. data/lib/rabbit/parser/ext/aafigure.rb +17 -1
  75. data/lib/rabbit/parser/ext/blockdiag.rb +17 -1
  76. data/lib/rabbit/parser/ext/charty.rb +2 -2
  77. data/lib/rabbit/parser/ext/coderay.rb +20 -4
  78. data/lib/rabbit/parser/ext/enscript.rb +31 -15
  79. data/lib/rabbit/parser/ext/entity.rb +17 -1
  80. data/lib/rabbit/parser/ext/image.rb +6 -6
  81. data/lib/rabbit/parser/ext/inline.rb +17 -1
  82. data/lib/rabbit/parser/ext/rouge.rb +7 -4
  83. data/lib/rabbit/parser/ext/tex.rb +18 -2
  84. data/lib/rabbit/parser/ext/video.rb +4 -4
  85. data/lib/rabbit/parser/image.rb +20 -4
  86. data/lib/rabbit/parser/markdown/converter.rb +12 -13
  87. data/lib/rabbit/parser/markdown.rb +18 -2
  88. data/lib/rabbit/parser/pause-support.rb +1 -0
  89. data/lib/rabbit/parser/pdf.rb +3 -3
  90. data/lib/rabbit/parser/rd/ext/base.rb +20 -4
  91. data/lib/rabbit/parser/rd/ext/block-verbatim.rb +24 -28
  92. data/lib/rabbit/parser/rd/ext/character-reference.rb +18 -2
  93. data/lib/rabbit/parser/rd/ext/image.rb +3 -3
  94. data/lib/rabbit/parser/rd/ext/inline-verbatim.rb +6 -6
  95. data/lib/rabbit/parser/rd/ext/refer.rb +18 -2
  96. data/lib/rabbit/parser/rd/ext/video.rb +19 -2
  97. data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +24 -8
  98. data/lib/rabbit/parser/rd/rt/rt2rabbit-lib.rb +18 -2
  99. data/lib/rabbit/parser/rd/visitor.rb +18 -2
  100. data/lib/rabbit/parser/rd.rb +18 -2
  101. data/lib/rabbit/parser/wiki/output.rb +25 -28
  102. data/lib/rabbit/parser/wiki.rb +18 -2
  103. data/lib/rabbit/parser.rb +8 -6
  104. data/lib/rabbit/path-manipulatable.rb +4 -4
  105. data/lib/rabbit/progress.rb +17 -1
  106. data/lib/rabbit/properties.rb +3 -3
  107. data/lib/rabbit/rabbit.rb +15 -7
  108. data/lib/rabbit/readme-parser.rb +4 -6
  109. data/lib/rabbit/renderer/base.rb +44 -36
  110. data/lib/rabbit/renderer/color.rb +18 -2
  111. data/lib/rabbit/renderer/display/base.rb +10 -12
  112. data/lib/rabbit/renderer/display/button-handler.rb +141 -60
  113. data/lib/rabbit/renderer/display/cursor.rb +4 -5
  114. data/lib/rabbit/renderer/display/drawing-area-base.rb +32 -48
  115. data/lib/rabbit/renderer/display/drawing-area-primitive.rb +10 -61
  116. data/lib/rabbit/renderer/display/drawing-area-view-only.rb +19 -8
  117. data/lib/rabbit/renderer/display/drawing-area.rb +19 -15
  118. data/lib/rabbit/renderer/display/gesture.rb +9 -9
  119. data/lib/rabbit/renderer/display/graffiti.rb +22 -13
  120. data/lib/rabbit/renderer/display/info.rb +22 -2
  121. data/lib/rabbit/renderer/display/magnifier.rb +30 -17
  122. data/lib/rabbit/renderer/display/mask.rb +17 -1
  123. data/lib/rabbit/renderer/display/menu.rb +27 -3
  124. data/lib/rabbit/renderer/display/motion-handler.rb +45 -0
  125. data/lib/rabbit/renderer/display/progress.rb +17 -2
  126. data/lib/rabbit/renderer/display/scroll-handler.rb +60 -13
  127. data/lib/rabbit/renderer/display/search.rb +19 -2
  128. data/lib/rabbit/renderer/display/spotlight.rb +39 -25
  129. data/lib/rabbit/renderer/display.rb +16 -36
  130. data/lib/rabbit/renderer/engine/cairo.rb +4 -11
  131. data/lib/rabbit/renderer/engine.rb +17 -1
  132. data/lib/rabbit/renderer/kernel.rb +2 -20
  133. data/lib/rabbit/renderer/offscreen.rb +8 -14
  134. data/lib/rabbit/renderer/print-layout.rb +2 -2
  135. data/lib/rabbit/renderer/printer.rb +9 -16
  136. data/lib/rabbit/renderer/scene-background-widget.rb +95 -0
  137. data/lib/rabbit/renderer/scene-node-widget.rb +63 -0
  138. data/lib/rabbit/renderer/scene.rb +508 -0
  139. data/lib/rabbit/renderer.rb +6 -6
  140. data/lib/rabbit/search-window.rb +18 -2
  141. data/lib/rabbit/searcher.rb +15 -1
  142. data/lib/rabbit/size.rb +9 -1
  143. data/lib/rabbit/slide-configuration.rb +11 -14
  144. data/lib/rabbit/soap/driver.rb +20 -4
  145. data/lib/rabbit/soap/server.rb +17 -1
  146. data/lib/rabbit/source/argf.rb +5 -5
  147. data/lib/rabbit/source/base.rb +5 -6
  148. data/lib/rabbit/source/file.rb +5 -5
  149. data/lib/rabbit/source/memory.rb +20 -4
  150. data/lib/rabbit/source/uri.rb +9 -11
  151. data/lib/rabbit/source-generator/hiki.rb +2 -7
  152. data/lib/rabbit/source-generator/markdown.rb +2 -7
  153. data/lib/rabbit/source-generator/rd.rb +2 -7
  154. data/lib/rabbit/source-generator.rb +4 -4
  155. data/lib/rabbit/source.rb +5 -5
  156. data/lib/rabbit/task/slide.rb +13 -11
  157. data/lib/rabbit/task/theme.rb +8 -11
  158. data/lib/rabbit/task.rb +3 -3
  159. data/lib/rabbit/theme/applier.rb +27 -11
  160. data/lib/rabbit/theme/clear-blue/clear-blue.rb +1 -1
  161. data/lib/rabbit/theme/color-circle/color-circle.rb +18 -1
  162. data/lib/rabbit/theme/cozmixng/cozmixng.rb +1 -1
  163. data/lib/rabbit/theme/default/default.rb +1 -0
  164. data/lib/rabbit/theme/default-icon/default-icon.rb +1 -1
  165. data/lib/rabbit/theme/default-item-mark-setup/default-item-mark-setup.rb +17 -1
  166. data/lib/rabbit/theme/default-preformatted/default-preformatted.rb +9 -1
  167. data/lib/rabbit/theme/enishi-green/enishi-green.rb +1 -1
  168. data/lib/rabbit/theme/entry.rb +10 -12
  169. data/lib/rabbit/theme/icon/icon.rb +3 -8
  170. data/lib/rabbit/theme/image-slide-number/image-slide-number.rb +5 -5
  171. data/lib/rabbit/theme/image-timer/image-timer.rb +3 -3
  172. data/lib/rabbit/theme/lightning-simple/lightning-simple.rb +1 -0
  173. data/lib/rabbit/theme/lightning-talk/lightning-talk.rb +1 -0
  174. data/lib/rabbit/theme/manager.rb +19 -9
  175. data/lib/rabbit/theme/rabbit-icon/rabbit-icon.rb +1 -1
  176. data/lib/rabbit/theme/ranguba/ranguba.rb +1 -1
  177. data/lib/rabbit/theme/red-frame/red-frame.rb +6 -2
  178. data/lib/rabbit/theme/ruby-gnome2/ruby-gnome2.rb +1 -0
  179. data/lib/rabbit/theme/ruby-gnome2-icon/ruby-gnome2-icon.rb +1 -1
  180. data/lib/rabbit/theme/searcher.rb +23 -7
  181. data/lib/rabbit/theme/slide-number/slide-number.rb +1 -1
  182. data/lib/rabbit/theme/slide-show/slide-show.rb +1 -1
  183. data/lib/rabbit/theme/table/table.rb +2 -2
  184. data/lib/rabbit/theme/video/property.rb +3 -0
  185. data/lib/rabbit/theme/video/video.rb +5 -0
  186. data/lib/rabbit/theme-configuration.rb +9 -11
  187. data/lib/rabbit/utils.rb +12 -94
  188. data/lib/rabbit/version.rb +2 -2
  189. data/lib/rabbit/xmlrpc/client.rb +17 -1
  190. data/lib/rabbit/xmlrpc/server.rb +17 -1
  191. data/po/en/rabbit.edit.po +325 -317
  192. data/po/en/rabbit.po +61 -55
  193. data/po/fr/rabbit.edit.po +325 -317
  194. data/po/fr/rabbit.po +61 -55
  195. data/po/ja/rabbit.edit.po +346 -371
  196. data/po/ja/rabbit.po +83 -80
  197. data/rabbit.gemspec +4 -2
  198. data/sample/block-quote.rab +13 -0
  199. data/sample/description-list.rab +17 -0
  200. data/sample/mermaid.rab +16 -0
  201. data/sample/rabbit-en.hiki +0 -1
  202. data/sample/rabbit-en.md +0 -1
  203. data/sample/rabbit-en.rd +0 -1
  204. data/sample/rabbit.hiki +0 -1
  205. data/sample/rabbit.md +0 -1
  206. data/sample/rabbit.rd +0 -1
  207. data/sample/video.rab +17 -0
  208. metadata +33 -65
  209. data/lib/rabbit/action/basic.rb +0 -304
  210. data/lib/rabbit/action/radio.rb +0 -78
  211. data/lib/rabbit/action/toggle.rb +0 -82
  212. data/lib/rabbit/action.rb +0 -140
  213. data/lib/rabbit/renderer/display/gl.rb +0 -98
  214. data/lib/rabbit/renderer/display/key-handler.rb +0 -321
  215. data/lib/rabbit/renderer/gl.rb +0 -95
  216. data/lib/rabbit/renderer/screen.rb +0 -286
  217. data/lib/rabbit/renderer/widget/drawing-area.rb +0 -93
  218. data/lib/rabbit/stock.rb +0 -31
  219. data/lib/rabbit/trackball.rb +0 -228
  220. data/lib/rabbit/video-window.rb +0 -123
  221. data/test/command/test-rabbit.rb +0 -101
  222. data/test/helper/parser.rb +0 -48
  223. data/test/helper.rb +0 -24
  224. data/test/image/test-dia.rb +0 -54
  225. data/test/image/test-eps.rb +0 -41
  226. data/test/parser/test-markdown.rb +0 -360
  227. data/test/parser/test-rd.rb +0 -43
  228. data/test/parser/test-wiki.rb +0 -71
  229. data/test/run-test.rb +0 -27
  230. data/test/source-generator/test-hiki.rb +0 -68
  231. data/test/source-generator/test-markdown.rb +0 -67
  232. data/test/source-generator/test-rd.rb +0 -69
  233. data/test/test-applier.rb +0 -73
  234. data/test/test-author-configuration.rb +0 -37
  235. data/test/test-canvas.rb +0 -70
  236. data/test/test-color.rb +0 -51
  237. data/test/test-element.rb +0 -103
  238. data/test/test-readme-parser.rb +0 -160
  239. data/test/test-size.rb +0 -155
  240. data/test/test-slide-configuration.rb +0 -74
  241. data/test/test-source.rb +0 -122
  242. data/test/test-theme-configuration.rb +0 -47
  243. data/test/test-utils.rb +0 -64
@@ -0,0 +1,446 @@
1
+ # Copyright (C) 2005-2025 Sutou Kouhei <kou@cozmixng.org>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+
17
+ require_relative "icon"
18
+
19
+ module Rabbit
20
+ Action = Struct.new(:name,
21
+ :parameter_type,
22
+ :initial_state,
23
+ :update_state,
24
+ :update_enabled,
25
+ :label,
26
+ :icon,
27
+ :icon_name,
28
+ :activate) do
29
+ def update
30
+ gaction.state = ensure_variant(update_state.call) if update_state
31
+ gaction.enabled = update_enabled.call if update_enabled
32
+ end
33
+
34
+ def gaction
35
+ @gaction ||= build_gaction
36
+ end
37
+
38
+ def icon
39
+ self[:icon] || build_icon
40
+ end
41
+
42
+ private
43
+ def build_gaction
44
+ state = nil
45
+ if initial_state.nil?
46
+ state = update_state.call if update_state
47
+ else
48
+ state = initial_state
49
+ end
50
+ if state.nil?
51
+ gaction = Gio::SimpleAction.new(name, parameter_type)
52
+ else
53
+ state = ensure_variant(state)
54
+ gaction = Gio::SimpleAction.new(name, parameter_type, state)
55
+ end
56
+ gaction.signal_connect("activate") do |_, parameter|
57
+ activate.call(self, parameter)
58
+ end
59
+ gaction
60
+ end
61
+
62
+ def ensure_variant(value)
63
+ return nil if value.nil?
64
+ return value if value.is_a?(GLib::Variant)
65
+ GLib::Variant.new(value, parameter_type)
66
+ end
67
+
68
+ def build_icon
69
+ return nil if icon_name.nil?
70
+ Gio::ThemedIcon.new(icon_name)
71
+ end
72
+ end
73
+
74
+ class Actions
75
+ include GetText
76
+
77
+ attr_reader :group
78
+ def initialize(canvas)
79
+ @canvas = canvas
80
+ @actions = {}
81
+ @group = Gio::SimpleActionGroup.new
82
+
83
+ build_move_actions
84
+ build_output_actions
85
+ build_window_actions
86
+ build_theme_actions
87
+ build_view_actions
88
+ build_graffiti_actions
89
+ build_content_actions
90
+ build_hole_actions
91
+ build_search_actions
92
+ build_log_level_actions
93
+ build_quit_actions
94
+ end
95
+
96
+ def update_status
97
+ @actions.each_value(&:update)
98
+ end
99
+
100
+ def find_action(name)
101
+ @actions[name]
102
+ end
103
+
104
+ def [](name)
105
+ @group.lookup_action(name)
106
+ end
107
+
108
+ private
109
+ def guard
110
+ begin
111
+ yield
112
+ rescue Exception
113
+ Rabbit.logger.warn($!)
114
+ end
115
+ end
116
+
117
+ def build_action(name,
118
+ parameter_type: nil,
119
+ initial_state: nil,
120
+ update_state: nil,
121
+ update_enabled: nil,
122
+ label: nil,
123
+ icon: nil,
124
+ icon_name: nil)
125
+ parameter_type = GLib::VariantType.new(parameter_type) if parameter_type
126
+ activate = lambda do |action, parameter|
127
+ guard do
128
+ yield(action, parameter)
129
+ end
130
+ end
131
+ action = Action.new(name,
132
+ parameter_type,
133
+ initial_state,
134
+ update_state,
135
+ update_enabled,
136
+ label,
137
+ icon,
138
+ icon_name,
139
+ activate)
140
+ @actions[name] = action
141
+ @group.add_action(action.gaction)
142
+ end
143
+
144
+ def build_move_actions
145
+ build_action("Next",
146
+ update_enabled: lambda {@canvas.have_next?},
147
+ label: _("Next"),
148
+ icon_name: "go-next") do
149
+ @canvas.move_to_next_if_can
150
+ end
151
+ build_action("Previous",
152
+ update_enabled: lambda {@canvas.have_previous?},
153
+ label: _("Previous"),
154
+ icon_name: "go-previous") do
155
+ @canvas.move_to_previous_if_can
156
+ end
157
+ build_action("NextSlide",
158
+ update_enabled: lambda {@canvas.have_next_slide?},
159
+ label: _("Next slide"),
160
+ icon_name: "go-next") do
161
+ @canvas.move_to_next_if_can
162
+ end
163
+ build_action("PreviousSlide",
164
+ update_enabled: lambda {@canvas.have_previous_slide?},
165
+ label: _("Previous slide"),
166
+ icon_name: "go-previous") do
167
+ @canvas.move_to_previous_if_can
168
+ end
169
+ build_action("FirstSlide",
170
+ update_enabled: lambda {not @canvas.first_slide?},
171
+ label: _("First slide"),
172
+ icon_name: "go-first") do
173
+ @canvas.move_to_first
174
+ end
175
+ build_action("LastSlide",
176
+ update_enabled: lambda {not @canvas.last_slide?},
177
+ label: _("Last slide"),
178
+ icon_name: "go-last") do
179
+ @canvas.move_to_last
180
+ end
181
+ build_action("JumpToSlide",
182
+ parameter_type: "i",
183
+ label: _("Jump to slide"),
184
+ icon_name: "go-jump") do |action, index|
185
+ @canvas.move_to_if_can(index)
186
+ end
187
+ build_action("JumpToRelativeSlide",
188
+ parameter_type: "i",
189
+ label: _("Jump to relative slide"),
190
+ icon_name: "go-jump") do |action, index|
191
+ @canvas.move_to_if_can(@canvas.current_index + index)
192
+ end
193
+ end
194
+
195
+ def build_output_actions
196
+ build_action("SaveAsImage",
197
+ update_enabled: lambda {not @canvas.processing?},
198
+ label: _("Save as image"),
199
+ icon_name: "document-save") do
200
+ @canvas.save_as_image
201
+ end
202
+ build_action("Print",
203
+ update_enabled: lambda {not @canvas.processing?},
204
+ label: _("Print"),
205
+ icon_name: "document-print") do
206
+ @canvas.print
207
+ end
208
+ end
209
+
210
+ def build_window_actions
211
+ build_action("Iconify",
212
+ update_state: lambda {false},
213
+ label: _("Iconify"),
214
+ icon: Icon.rabbit) do
215
+ @canvas.iconify
216
+ end
217
+ build_action("ToggleFullscreen",
218
+ update_enabled: lambda {not @canvas.applying?},
219
+ update_state: lambda {@canvas.fullscreen?},
220
+ label: _("Fullscreen"),
221
+ icon_name: "view-fullscreen") do
222
+ @canvas.toggle_fullscreen
223
+ end
224
+ end
225
+
226
+ def build_theme_actions
227
+ build_action("ChangeTheme",
228
+ parameter_type: "s",
229
+ update_enabled: lambda {not @canvas.applying?},
230
+ label: _("Change theme")) do |name|
231
+ @canvas.apply_theme(name)
232
+ end
233
+ build_action("MergeTheme",
234
+ parameter_type: "s",
235
+ update_enabled: lambda {not @canvas.applying?},
236
+ label: _("Merge theme")) do |name|
237
+ @canvas.merge_theme(name)
238
+ end
239
+ build_action("ReloadTheme",
240
+ update_enabled: lambda {not @canvas.applying?},
241
+ label: _("Reload theme"),
242
+ icon_name: "view-refresh") do
243
+ @canvas.reload_theme
244
+ end
245
+ end
246
+
247
+ def build_view_actions
248
+ build_action("Redraw",
249
+ label: _("Redraw"),
250
+ icon_name: "view-refresh") do
251
+ @canvas.redraw
252
+ end
253
+ build_action("CacheAllSlides",
254
+ update_enabled: lambda {not @canvas.processing?},
255
+ label: _("Cache all slides")) do
256
+ @canvas.cache_all_slides
257
+ end
258
+ build_action("ResetAdjustment",
259
+ label: _("Reset adjustment"),
260
+ icon_name: "edit-clear") do
261
+ @canvas.rest_adjustment
262
+ end
263
+ build_action("ResetTimer",
264
+ label: _("Reset timer"),
265
+ icon_name: "edit-clear") do
266
+ @canvas.reset_timer
267
+ end
268
+ build_action("ToggleSpotlight",
269
+ update_state: lambda {@canvas.spotlighting?},
270
+ label: _("Spotlight")) do |action|
271
+ @canvas.toggle_spotlight
272
+ action.update
273
+ end
274
+ build_action("ToggleMagnifier",
275
+ update_state: lambda {@canvas.magnifying?},
276
+ label: _("Magnifier")) do |action|
277
+ @canvas.toggle_magnifier
278
+ action.update
279
+ end
280
+ end
281
+
282
+ def graffiti_available?
283
+ @canvas.graffiti_mode? or @canvas.have_graffiti?
284
+ end
285
+
286
+ def build_graffiti_actions
287
+ build_action("ToggleGraffitiMode",
288
+ initial_state: false,
289
+ update_state: lambda {@canvas.graffiti_mode?},
290
+ label: _("Graffiti mode")) do |action|
291
+ @canvas.toggle_graffiti_mode
292
+ action.update
293
+ end
294
+ build_action("ClearGraffiti",
295
+ update_enabled: lambda {graffiti_available?},
296
+ label: _("Clear graffiti"),
297
+ icon_name: "edit-clear") do
298
+ @canvas.clear_graffiti
299
+ end
300
+ build_action("UndoGraffiti",
301
+ update_enabled: lambda {graffiti_available?},
302
+ label: _("Undo graffiti"),
303
+ icon_name: "edit-undo") do
304
+ @canvas.undo_graffiti
305
+ end
306
+ build_action("ChangeGraffitiColor",
307
+ update_enabled: lambda {graffiti_available?},
308
+ label: _("Change graffiti color")) do
309
+ @canvas.change_graffiti_color
310
+ end
311
+ end
312
+
313
+ def build_content_actions
314
+ build_action("ClearSlide",
315
+ label: _("Clear slide"),
316
+ icon_name: "edit-clear") do
317
+ @canvas.clear_slide
318
+ end
319
+ build_action("ToggleIndexMode",
320
+ update_enabled: lambda {not @canvas.processing?},
321
+ update_state: lambda {@canvas.index_mode?},
322
+ label: _("Index mode")) do |action|
323
+ @canvas.toggle_index_mode
324
+ action.update
325
+ end
326
+ build_action("ToggleInfoWindow",
327
+ update_state: lambda {@canvas.info_window_showing?},
328
+ label: _("Information window")) do |action|
329
+ @canvas.toggle_info_window
330
+ action.update
331
+ end
332
+ build_action("ToggleTerminal",
333
+ update_state: lambda {@canvas.in_terminal?},
334
+ label: _("Terminal")) do
335
+ @canvas.toggle_terminal
336
+ end
337
+ build_action("ChangeBlankMode",
338
+ parameter_type: "s",
339
+ initial_state: "show",
340
+ label: _("Change blank mode")) do |action, parameter|
341
+ case parameter
342
+ when "show"
343
+ if @canvas.whiteouting?
344
+ @canvas.toggle_whiteout
345
+ elsif @canvas.blackouting?
346
+ @canvas.toggle_blackout
347
+ end
348
+ when "whiteout"
349
+ @canvas.toggle_whiteout
350
+ when "blackout"
351
+ @canvas.toggle_blackout
352
+ end
353
+ action.gaction.change_state(GLib::Variant.new(parameter))
354
+ end
355
+ build_action("ToggleWhiteout",
356
+ update_state: lambda {@canvas.whiteouting?},
357
+ label: _("Whiteout")) do
358
+ if @canvas.whiteouting?
359
+ self["ChangeBlankMode"].activate("show")
360
+ else
361
+ self["ChangeBlankMode"].activate("whiteout")
362
+ end
363
+ end
364
+ build_action("ToggleBlackout",
365
+ update_state: lambda {@canvas.blackouting?},
366
+ label: _("Blackout")) do
367
+ if @canvas.blackouting?
368
+ self["ChangeBlankMode"].activate("show")
369
+ else
370
+ self["ChangeBlankMode"].activate("blackout")
371
+ end
372
+ end
373
+ end
374
+
375
+ def build_hole_actions
376
+ build_action("ExpandHole",
377
+ label: _("Expand hole")) do
378
+ @canvas.expand_hole
379
+ end
380
+ build_action("NarrowHole",
381
+ label: _("Narrow hole")) do
382
+ @canvas.narrow_hole
383
+ end
384
+ end
385
+
386
+ def build_search_actions
387
+ build_action("SearchSlideForward",
388
+ update_enabled: lambda {not @canvas.searching?},
389
+ label: _("Search slide forward"),
390
+ icon_name: "system-search") do
391
+ @canvas.search_slide(true)
392
+ update_status
393
+ end
394
+ build_action("SearchSlideBackward",
395
+ update_enabled: lambda {not @canvas.searching?},
396
+ label: _("Search slide backward"),
397
+ icon_name: "system-search") do
398
+ @canvas.search_slide(false)
399
+ update_status
400
+ end
401
+ build_action("SearchSlideForwardNext",
402
+ update_enabled: lambda {@canvas.searching?},
403
+ label: _("Search slide forward next"),
404
+ icon_name: "system-search") do
405
+ @canvas.search_slide(true)
406
+ update_status
407
+ end
408
+ build_action("SearchSlideBackwardNext",
409
+ update_enabled: lambda {@canvas.searching?},
410
+ label: _("Search slide backward next"),
411
+ icon_name: "system-search") do
412
+ @canvas.search_slide(false)
413
+ update_status
414
+ end
415
+ build_action("StopSlideSearch",
416
+ update_enabled: lambda {@canvas.searching?},
417
+ label: _("Stop search slide"),
418
+ icon_name: "system-search") do
419
+ @canvas.stop_search_slide
420
+ update_status
421
+ end
422
+ end
423
+
424
+ def build_log_level_actions
425
+ initial_state = Logger::Severity.name(Rabbit.logger.level)
426
+ build_action("ChangeLogLevel",
427
+ parameter_type: "s",
428
+ initial_state: initial_state,
429
+ label: _("Change log level")) do |action, parameter|
430
+ Rabbit.logger.level = Logger::Severity.level(parameter)
431
+ action.gaction.change_state(GLib::Variant.new(parameter))
432
+ end
433
+ end
434
+
435
+ def build_quit_actions
436
+ build_action("Quit",
437
+ label: _("Quit"),
438
+ icon_name: "application-exit") do
439
+ if !@canvas.processing? or
440
+ @canvas.confirm(_("Now processing... Do you really quit?"))
441
+ @canvas.quit
442
+ end
443
+ end
444
+ end
445
+ end
446
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012-2021 Sutou Kouhei <kou@cozmixng.org>
1
+ # Copyright (C) 2012-2025 Sutou Kouhei <kou@cozmixng.org>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -14,21 +14,18 @@
14
14
  # with this program; if not, write to the Free Software Foundation, Inc.,
15
15
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
16
 
17
- require "rabbit/gettext"
18
- require "rabbit/logger"
19
- require "rabbit/path-manipulatable"
20
- require "rabbit/yaml-loader"
17
+ require_relative "path-manipulatable"
18
+ require_relative "rabbit"
19
+ require_relative "yaml-loader"
21
20
 
22
21
  module Rabbit
23
22
  class AuthorConfiguration
24
23
  include GetText
25
24
  include PathManipulatable
26
25
 
27
- attr_accessor :logger
28
26
  attr_accessor :name, :email, :markup_language
29
27
  attr_accessor :rubygems_user, :slideshare_user, :speaker_deck_user
30
- def initialize(logger=nil)
31
- @logger = logger || Logger.default
28
+ def initialize
32
29
  clear
33
30
  end
34
31
 
@@ -39,7 +36,7 @@ module Rabbit
39
36
  merge!(conf)
40
37
  rescue
41
38
  format = _("Failed to read author configuration: %s: %s")
42
- @logger.error(format % [path, $!.message])
39
+ Rabbit.logger.error(format % [path, $!.message])
43
40
  end
44
41
 
45
42
  def save
@@ -49,7 +46,7 @@ module Rabbit
49
46
  end
50
47
  rescue
51
48
  format = _("Failed to write author configuration: %s: %s")
52
- @logger.error(format % [path, $!.message])
49
+ Rabbit.logger.error(format % [path, $!.message])
53
50
  end
54
51
 
55
52
  def clear