rabbit 3.0.5 → 4.0.1

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 (241) hide show
  1. checksums.yaml +4 -4
  2. data/data/locale/ja/LC_MESSAGES/rabbit.mo +0 -0
  3. data/doc/_config.yml +2 -2
  4. data/doc/en/news.rd +63 -0
  5. data/doc/ja/news.rd +63 -0
  6. data/lib/rabbit/actions.rb +446 -0
  7. data/lib/rabbit/author-configuration.rb +7 -10
  8. data/lib/rabbit/canvas.rb +74 -42
  9. data/lib/rabbit/command/rabbit-slide.rb +11 -13
  10. data/lib/rabbit/command/rabbit-theme.rb +10 -12
  11. data/lib/rabbit/command/rabbit.rb +31 -43
  12. data/lib/rabbit/console.rb +20 -22
  13. data/lib/rabbit/dependency-canvas.rb +2 -2
  14. data/lib/rabbit/element/base.rb +93 -6
  15. data/lib/rabbit/element/block-element.rb +17 -1
  16. data/lib/rabbit/element/block.rb +17 -1
  17. data/lib/rabbit/element/container-element.rb +59 -3
  18. data/lib/rabbit/element/description-list.rb +18 -2
  19. data/lib/rabbit/element/enum-list.rb +18 -2
  20. data/lib/rabbit/element/footnote.rb +18 -2
  21. data/lib/rabbit/element/image-title-slide.rb +17 -1
  22. data/lib/rabbit/element/image.rb +32 -2
  23. data/lib/rabbit/element/index-slide.rb +29 -13
  24. data/lib/rabbit/element/item-list.rb +18 -2
  25. data/lib/rabbit/element/method-list.rb +18 -2
  26. data/lib/rabbit/element/poppler-page.rb +17 -1
  27. data/lib/rabbit/element/poppler-slide.rb +18 -2
  28. data/lib/rabbit/element/poppler-title-slide.rb +18 -2
  29. data/lib/rabbit/element/preformatted.rb +18 -2
  30. data/lib/rabbit/element/slide-element.rb +29 -2
  31. data/lib/rabbit/element/slide.rb +18 -2
  32. data/lib/rabbit/element/syntax-highlighting.rb +17 -1
  33. data/lib/rabbit/element/table.rb +19 -3
  34. data/lib/rabbit/element/tag.rb +18 -2
  35. data/lib/rabbit/element/text-block-element.rb +18 -2
  36. data/lib/rabbit/element/text-container-element.rb +41 -2
  37. data/lib/rabbit/element/text-element.rb +17 -1
  38. data/lib/rabbit/element/text-renderer.rb +17 -1
  39. data/lib/rabbit/element/text.rb +4 -4
  40. data/lib/rabbit/element/title-slide.rb +19 -3
  41. data/lib/rabbit/element/video.rb +157 -56
  42. data/lib/rabbit/element.rb +20 -20
  43. data/lib/rabbit/formatter.rb +18 -1
  44. data/lib/rabbit/frame.rb +101 -93
  45. data/lib/rabbit/front.rb +11 -4
  46. data/lib/rabbit/gem-finder.rb +4 -8
  47. data/lib/rabbit/gem-pusher.rb +4 -4
  48. data/lib/rabbit/gesture/handler.rb +26 -21
  49. data/lib/rabbit/graffiti/config-dialog.rb +18 -2
  50. data/lib/rabbit/graffiti/processor.rb +20 -4
  51. data/lib/rabbit/gtk.rb +48 -14
  52. data/lib/rabbit/html/generator.rb +18 -18
  53. data/{test/helper/fixture.rb → lib/rabbit/icon.rb} +16 -6
  54. data/lib/rabbit/image/base.rb +7 -6
  55. data/lib/rabbit/image/default.rb +17 -1
  56. data/lib/rabbit/image/dia.rb +2 -2
  57. data/lib/rabbit/image/eps.rb +16 -2
  58. data/lib/rabbit/image/gimp.rb +28 -11
  59. data/lib/rabbit/image/mermaid.rb +3 -3
  60. data/lib/rabbit/image/pdf.rb +3 -3
  61. data/lib/rabbit/image/svg.rb +2 -2
  62. data/lib/rabbit/image.rb +8 -8
  63. data/lib/rabbit/info-window.rb +55 -18
  64. data/lib/rabbit/key-handler.rb +381 -0
  65. data/lib/rabbit/keys.rb +31 -2
  66. data/lib/rabbit/logger/base.rb +17 -1
  67. data/lib/rabbit/logger/gui.rb +20 -4
  68. data/lib/rabbit/logger/stderr.rb +16 -2
  69. data/lib/rabbit/logger.rb +4 -4
  70. data/lib/rabbit/menu.rb +200 -220
  71. data/lib/rabbit/parser/base.rb +17 -1
  72. data/lib/rabbit/parser/ext/aafigure.rb +17 -1
  73. data/lib/rabbit/parser/ext/blockdiag.rb +17 -1
  74. data/lib/rabbit/parser/ext/charty.rb +2 -2
  75. data/lib/rabbit/parser/ext/coderay.rb +20 -4
  76. data/lib/rabbit/parser/ext/enscript.rb +31 -15
  77. data/lib/rabbit/parser/ext/entity.rb +17 -1
  78. data/lib/rabbit/parser/ext/image.rb +6 -6
  79. data/lib/rabbit/parser/ext/inline.rb +17 -1
  80. data/lib/rabbit/parser/ext/rouge.rb +7 -4
  81. data/lib/rabbit/parser/ext/tex.rb +18 -2
  82. data/lib/rabbit/parser/ext/video.rb +4 -4
  83. data/lib/rabbit/parser/image.rb +20 -4
  84. data/lib/rabbit/parser/markdown/converter.rb +12 -13
  85. data/lib/rabbit/parser/markdown.rb +18 -2
  86. data/lib/rabbit/parser/pause-support.rb +1 -0
  87. data/lib/rabbit/parser/pdf.rb +3 -3
  88. data/lib/rabbit/parser/rd/ext/base.rb +20 -4
  89. data/lib/rabbit/parser/rd/ext/block-verbatim.rb +24 -28
  90. data/lib/rabbit/parser/rd/ext/character-reference.rb +18 -2
  91. data/lib/rabbit/parser/rd/ext/image.rb +3 -3
  92. data/lib/rabbit/parser/rd/ext/inline-verbatim.rb +6 -6
  93. data/lib/rabbit/parser/rd/ext/refer.rb +18 -2
  94. data/lib/rabbit/parser/rd/ext/video.rb +19 -2
  95. data/lib/rabbit/parser/rd/rd2rabbit-lib.rb +24 -8
  96. data/lib/rabbit/parser/rd/rt/rt2rabbit-lib.rb +18 -2
  97. data/lib/rabbit/parser/rd/visitor.rb +18 -2
  98. data/lib/rabbit/parser/rd.rb +18 -2
  99. data/lib/rabbit/parser/wiki/output.rb +25 -28
  100. data/lib/rabbit/parser/wiki.rb +18 -2
  101. data/lib/rabbit/parser.rb +6 -6
  102. data/lib/rabbit/path-manipulatable.rb +4 -4
  103. data/lib/rabbit/progress.rb +17 -1
  104. data/lib/rabbit/properties.rb +3 -3
  105. data/lib/rabbit/rabbit.rb +15 -7
  106. data/lib/rabbit/readme-parser.rb +4 -6
  107. data/lib/rabbit/renderer/base.rb +44 -36
  108. data/lib/rabbit/renderer/color.rb +18 -2
  109. data/lib/rabbit/renderer/display/base.rb +10 -12
  110. data/lib/rabbit/renderer/display/button-handler.rb +141 -60
  111. data/lib/rabbit/renderer/display/cursor.rb +4 -5
  112. data/lib/rabbit/renderer/display/drawing-area-base.rb +32 -48
  113. data/lib/rabbit/renderer/display/drawing-area-primitive.rb +10 -61
  114. data/lib/rabbit/renderer/display/drawing-area-view-only.rb +19 -8
  115. data/lib/rabbit/renderer/display/drawing-area.rb +19 -15
  116. data/lib/rabbit/renderer/display/gesture.rb +9 -9
  117. data/lib/rabbit/renderer/display/graffiti.rb +22 -13
  118. data/lib/rabbit/renderer/display/info.rb +22 -2
  119. data/lib/rabbit/renderer/display/magnifier.rb +30 -17
  120. data/lib/rabbit/renderer/display/mask.rb +17 -1
  121. data/lib/rabbit/renderer/display/menu.rb +27 -3
  122. data/lib/rabbit/renderer/display/motion-handler.rb +45 -0
  123. data/lib/rabbit/renderer/display/progress.rb +17 -2
  124. data/lib/rabbit/renderer/display/scroll-handler.rb +60 -13
  125. data/lib/rabbit/renderer/display/search.rb +19 -2
  126. data/lib/rabbit/renderer/display/spotlight.rb +39 -25
  127. data/lib/rabbit/renderer/display.rb +16 -36
  128. data/lib/rabbit/renderer/engine/cairo.rb +4 -11
  129. data/lib/rabbit/renderer/engine.rb +17 -1
  130. data/lib/rabbit/renderer/kernel.rb +2 -20
  131. data/lib/rabbit/renderer/offscreen.rb +8 -14
  132. data/lib/rabbit/renderer/print-layout.rb +2 -2
  133. data/lib/rabbit/renderer/printer.rb +9 -16
  134. data/lib/rabbit/renderer/scene-background-widget.rb +95 -0
  135. data/lib/rabbit/renderer/scene-node-widget.rb +63 -0
  136. data/lib/rabbit/renderer/scene.rb +508 -0
  137. data/lib/rabbit/renderer.rb +6 -6
  138. data/lib/rabbit/search-window.rb +18 -2
  139. data/lib/rabbit/searcher.rb +15 -1
  140. data/lib/rabbit/size.rb +9 -1
  141. data/lib/rabbit/slide-configuration.rb +11 -14
  142. data/lib/rabbit/soap/driver.rb +20 -4
  143. data/lib/rabbit/soap/server.rb +17 -1
  144. data/lib/rabbit/source/argf.rb +5 -5
  145. data/lib/rabbit/source/base.rb +5 -6
  146. data/lib/rabbit/source/file.rb +5 -5
  147. data/lib/rabbit/source/memory.rb +20 -4
  148. data/lib/rabbit/source/uri.rb +9 -11
  149. data/lib/rabbit/source-generator/hiki.rb +2 -7
  150. data/lib/rabbit/source-generator/markdown.rb +2 -7
  151. data/lib/rabbit/source-generator/rd.rb +2 -7
  152. data/lib/rabbit/source-generator.rb +4 -4
  153. data/lib/rabbit/source.rb +5 -5
  154. data/lib/rabbit/task/slide.rb +13 -11
  155. data/lib/rabbit/task/theme.rb +8 -11
  156. data/lib/rabbit/task.rb +3 -3
  157. data/lib/rabbit/theme/applier.rb +27 -11
  158. data/lib/rabbit/theme/clear-blue/clear-blue.rb +1 -1
  159. data/lib/rabbit/theme/color-circle/color-circle.rb +18 -1
  160. data/lib/rabbit/theme/cozmixng/cozmixng.rb +1 -1
  161. data/lib/rabbit/theme/default/default.rb +1 -0
  162. data/lib/rabbit/theme/default-icon/default-icon.rb +1 -1
  163. data/lib/rabbit/theme/default-item-mark-setup/default-item-mark-setup.rb +17 -1
  164. data/lib/rabbit/theme/default-preformatted/default-preformatted.rb +9 -1
  165. data/lib/rabbit/theme/enishi-green/enishi-green.rb +1 -1
  166. data/lib/rabbit/theme/entry.rb +10 -12
  167. data/lib/rabbit/theme/icon/icon.rb +3 -8
  168. data/lib/rabbit/theme/image-slide-number/image-slide-number.rb +5 -5
  169. data/lib/rabbit/theme/image-timer/image-timer.rb +3 -3
  170. data/lib/rabbit/theme/lightning-simple/lightning-simple.rb +1 -0
  171. data/lib/rabbit/theme/lightning-talk/lightning-talk.rb +1 -0
  172. data/lib/rabbit/theme/manager.rb +19 -9
  173. data/lib/rabbit/theme/rabbit-icon/rabbit-icon.rb +1 -1
  174. data/lib/rabbit/theme/ranguba/ranguba.rb +1 -1
  175. data/lib/rabbit/theme/red-frame/red-frame.rb +6 -2
  176. data/lib/rabbit/theme/ruby-gnome2/ruby-gnome2.rb +1 -0
  177. data/lib/rabbit/theme/ruby-gnome2-icon/ruby-gnome2-icon.rb +1 -1
  178. data/lib/rabbit/theme/searcher.rb +23 -7
  179. data/lib/rabbit/theme/slide-number/slide-number.rb +1 -1
  180. data/lib/rabbit/theme/slide-show/slide-show.rb +1 -1
  181. data/lib/rabbit/theme/table/table.rb +2 -2
  182. data/lib/rabbit/theme/video/property.rb +3 -0
  183. data/lib/rabbit/theme/video/video.rb +5 -0
  184. data/lib/rabbit/theme-configuration.rb +9 -11
  185. data/lib/rabbit/utils.rb +12 -94
  186. data/lib/rabbit/version.rb +1 -1
  187. data/lib/rabbit/xmlrpc/client.rb +17 -1
  188. data/lib/rabbit/xmlrpc/server.rb +17 -1
  189. data/po/en/rabbit.edit.po +324 -316
  190. data/po/en/rabbit.po +61 -55
  191. data/po/fr/rabbit.edit.po +324 -316
  192. data/po/fr/rabbit.po +61 -55
  193. data/po/ja/rabbit.edit.po +345 -370
  194. data/po/ja/rabbit.po +83 -80
  195. data/rabbit.gemspec +4 -2
  196. data/sample/block-quote.rab +13 -0
  197. data/sample/description-list.rab +17 -0
  198. data/sample/mermaid.rab +16 -0
  199. data/sample/rabbit-en.hiki +0 -1
  200. data/sample/rabbit-en.md +0 -1
  201. data/sample/rabbit-en.rd +0 -1
  202. data/sample/rabbit.hiki +0 -1
  203. data/sample/rabbit.md +0 -1
  204. data/sample/rabbit.rd +0 -1
  205. data/sample/video.rab +17 -0
  206. metadata +33 -65
  207. data/lib/rabbit/action/basic.rb +0 -304
  208. data/lib/rabbit/action/radio.rb +0 -78
  209. data/lib/rabbit/action/toggle.rb +0 -82
  210. data/lib/rabbit/action.rb +0 -140
  211. data/lib/rabbit/renderer/display/gl.rb +0 -98
  212. data/lib/rabbit/renderer/display/key-handler.rb +0 -321
  213. data/lib/rabbit/renderer/gl.rb +0 -95
  214. data/lib/rabbit/renderer/screen.rb +0 -286
  215. data/lib/rabbit/renderer/widget/drawing-area.rb +0 -93
  216. data/lib/rabbit/stock.rb +0 -31
  217. data/lib/rabbit/trackball.rb +0 -228
  218. data/lib/rabbit/video-window.rb +0 -123
  219. data/test/command/test-rabbit.rb +0 -101
  220. data/test/helper/parser.rb +0 -48
  221. data/test/helper.rb +0 -24
  222. data/test/image/test-dia.rb +0 -54
  223. data/test/image/test-eps.rb +0 -41
  224. data/test/parser/test-markdown.rb +0 -360
  225. data/test/parser/test-rd.rb +0 -43
  226. data/test/parser/test-wiki.rb +0 -71
  227. data/test/run-test.rb +0 -27
  228. data/test/source-generator/test-hiki.rb +0 -68
  229. data/test/source-generator/test-markdown.rb +0 -67
  230. data/test/source-generator/test-rd.rb +0 -69
  231. data/test/test-applier.rb +0 -73
  232. data/test/test-author-configuration.rb +0 -37
  233. data/test/test-canvas.rb +0 -70
  234. data/test/test-color.rb +0 -51
  235. data/test/test-element.rb +0 -103
  236. data/test/test-readme-parser.rb +0 -160
  237. data/test/test-size.rb +0 -155
  238. data/test/test-slide-configuration.rb +0 -74
  239. data/test/test-source.rb +0 -122
  240. data/test/test-theme-configuration.rb +0 -47
  241. data/test/test-utils.rb +0 -64
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f3fbfefe40c2abbea3572d6d22aec3ac5d5e3de069f61120cff0d82db031527
4
- data.tar.gz: 6435432f528d3af5caeae8a8cd112be3f979c03fa2d431249344c08b7afd9810
3
+ metadata.gz: 7e495243f47a0508afd16dd6eb39f745b2b34209d76b29363ebfc34beb076376
4
+ data.tar.gz: 84f8d010080101110936e5512d4ff35f0d5feced13fe8df3b6323cfb13b5c8e3
5
5
  SHA512:
6
- metadata.gz: 59f6d1c1f91e68727a981b1170d6d344c55118b140557282c8166cae84c5118364d73da505e9555dc6a44fed9600451c64dda5b3230811722dd6f8de93ddc464
7
- data.tar.gz: f4f59780a8370a527da3aa6615fdb96003b3a1e1b5925f36269a3af6f174cde58058640900ff11153a49411894f796fc6c2b9ef09d827f574ead743ad56998cf
6
+ metadata.gz: 7d7b63c311c49c3dfc204307de6b531d9b1e940200a3bf789d57b91b5e972995af76016d2d719d6fee3ea05670cf15fabc7117d508a42c3d77ff787b3b4d1983
7
+ data.tar.gz: 176bb8e6a32eb342b29b4ba42412716eaf9dc59aadb707acfc8f6cae8787c5806fce0ea6b85d2353037829ee7c9daffc6a03630e1f393507eeac02890f8b5499
Binary file
data/doc/_config.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  markdown: kramdown
2
- version: 3.0.5
3
- release_date: 2025-03-30
2
+ version: 4.0.1
3
+ release_date: 2025-08-18
4
4
  rabbiter_version: 2.0.3
5
5
  rabbiter_release_date: 2016-08-21
6
6
  rabbirack_version: 2.0.0
data/doc/en/news.rd CHANGED
@@ -4,6 +4,69 @@ title: News
4
4
  ---
5
5
  {% raw %}
6
6
 
7
+ == 4.0.1: 2025-08-18
8
+
9
+ === Fixes
10
+
11
+ ==== rabbit
12
+
13
+ * Fixed a bug that window size change is failed without VTE
14
+ installed.
15
+
16
+ == 4.0.0: 2025-08-18
17
+
18
+ GTK 4 support release!
19
+
20
+ GTK 4 support is still experimental. It still misses some
21
+ features. You can use it by (({RABBIT_GTK=4})) environment variable.
22
+
23
+ === Improvements
24
+
25
+ ==== rabbit
26
+
27
+ * GIMP: Add support for GIMP 3.0
28
+
29
+ * Rouge: Add support for attaching user properties.
30
+
31
+ * Preformatted: Add support for enabling/disabling auto size
32
+ computation per element.
33
+
34
+ Here is a RD example:
35
+
36
+ Disable:
37
+
38
+ # rouge ruby
39
+ # keep-in-size = false
40
+
41
+ variable = expression
42
+
43
+ Enable:
44
+
45
+ # rouge ruby
46
+ # keep-in-size = true
47
+
48
+ variable = expression
49
+
50
+ * Added support for GTK 4.
51
+
52
+ It's still experimental. It still misses some features. You can
53
+ use it by (({RABBIT_GTK=4})) environment variable.
54
+
55
+ You can embed video with GTK 4 support.
56
+
57
+ * Dropped support for window icon. It's not portable.
58
+
59
+ * Removed GtkGLExt based GL support.
60
+
61
+ ==== rabbit-slide
62
+
63
+ * Use 1920x1080 by default.
64
+
65
+ * Use presentation date as the (({date})) gem metadata.
66
+
67
+ * Set markup language as the (({markup_language})) gem metadata to render
68
+ slide description in Rabbit Slide Show.
69
+
7
70
  == 3.0.5: 2025-03-30
8
71
 
9
72
  === Improvements
data/doc/ja/news.rd CHANGED
@@ -5,6 +5,69 @@ apply_data: false
5
5
  ---
6
6
  {% raw %}
7
7
 
8
+ == 4.0.1: 2025-08-18
9
+
10
+ === Fixes
11
+
12
+ ==== rabbit
13
+
14
+ * VTEをインストールしていない状態ではウインドウサイズの変更が失敗す
15
+ る問題を修正。
16
+
17
+ == 4.0.0: 2025-08-18
18
+
19
+ GTK 4をサポートしたリリース。
20
+
21
+ GTK 4サポートはまだ実験的な機能です。いくつかの機能はまだ実装されてい
22
+ ません。(({RABBIT_GTK=4}))環境変数を設定することで有効にできます。
23
+
24
+ === 改良
25
+
26
+ ==== rabbit
27
+
28
+ * GIMP: GIMP 3.0をサポート。
29
+
30
+ * Rouge: ユーザー指定のプロパティをサポート。
31
+
32
+ * フォーマット済みテキスト: 要素ごとに自動でサイズを計算するかどうか
33
+ の有効・無効を切り替えられるようになった。
34
+
35
+ RDでの例:
36
+
37
+ 無効:
38
+
39
+ # rouge ruby
40
+ # keep-in-size = false
41
+
42
+ variable = expression
43
+
44
+ 有効:
45
+
46
+ # rouge ruby
47
+ # keep-in-size = true
48
+
49
+ variable = expression
50
+
51
+ * GTK 4をサポート。
52
+
53
+ まだ実験的な機能です。いくつかの機能はまだ実装されてい
54
+ ません。(({RABBIT_GTK=4}))環境変数を設定することで有効にできます。
55
+
56
+ GTK 4サポートを有効にすると動画を埋め込むことができます。
57
+
58
+ * ウィンドウアイコンのサポートを削除。ポータブルではないため。
59
+
60
+ * GtkGLExtベースのGLサポートを削除。
61
+
62
+ ==== rabbit-slide
63
+
64
+ * デフォルトで1920x1080を使うように変更。
65
+
66
+ * プレゼンテーションの日を(({date}))というgemのメタデータに設定。
67
+
68
+ * マークアップの言語を(({markup_language}))というgemのメタデータに設
69
+ 定。これはRabbit Slide Showでスライドの説明を整形するため。
70
+
8
71
  == 3.0.5: 2025-03-30
9
72
 
10
73
  === 改良
@@ -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