vimamsa 0.1.6 → 0.1.9

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.
data/lib/vimamsa/gui.rb CHANGED
@@ -10,7 +10,7 @@ def gui_open_file_dialog(dirpath)
10
10
  dialog.signal_connect("response") do |dialog, response_id|
11
11
  if response_id == Gtk::ResponseType::ACCEPT
12
12
  open_new_file(dialog.filename)
13
- # puts "uri = #{dialog.uri}"
13
+ # debug "uri = #{dialog.uri}"
14
14
  end
15
15
  dialog.destroy
16
16
  end
@@ -34,7 +34,7 @@ def gui_file_saveas(dirpath)
34
34
  end
35
35
 
36
36
  def idle_func
37
- # puts "IDLEFUNC"
37
+ # debug "IDLEFUNC"
38
38
  if $idle_scroll_to_mark
39
39
  # Ripl.start :binding => binding
40
40
  # $view.get_visible_rect
@@ -45,7 +45,7 @@ def idle_func
45
45
  b = $view.buffer
46
46
  iter = b.get_iter_at(:offset => b.cursor_position)
47
47
  iterxy = $view.get_iter_location(iter)
48
- # puts "ITERXY" + iterxy.inspect
48
+ # debug "ITERXY" + iterxy.inspect
49
49
  # Ripl.start :binding => binding
50
50
 
51
51
  intr = iterxy.intersect(vr)
@@ -103,7 +103,7 @@ def paste_system_clipboard()
103
103
 
104
104
  # clipboard.request_contents(target_string) do |_clipboard, selection_data|
105
105
  # received_text = selection_data.text
106
- # puts "received_text=#{received_text}"
106
+ # debug "received_text=#{received_text}"
107
107
  # end
108
108
  if clipboard.wait_is_text_available?
109
109
  received_text = clipboard.wait_for_text
@@ -116,7 +116,7 @@ def paste_system_clipboard()
116
116
  $paste_lines = false
117
117
  end
118
118
  $clipboard << received_text
119
- # puts $clipboard[-1]
119
+ # debug $clipboard[-1]
120
120
  $clipboard = $clipboard[-([$clipboard.size, max_clipboard_items].min)..-1]
121
121
  end
122
122
  return received_text
@@ -131,29 +131,27 @@ def set_system_clipboard(arg)
131
131
  clipboard.text = arg
132
132
  end
133
133
 
134
- def gui_create_buffer(id)
135
- puts "gui_create_buffer(#{id})"
134
+ def gui_create_buffer(id, bufo)
135
+ debug "gui_create_buffer(#{id})"
136
136
  buf1 = GtkSource::Buffer.new()
137
- view = VSourceView.new()
138
-
139
- view.set_highlight_current_line(true)
140
- view.set_show_line_numbers(true)
141
- view.set_buffer(buf1)
137
+ view = VSourceView.new(nil, bufo)
142
138
 
143
139
  ssm = GtkSource::StyleSchemeManager.new
144
140
  ssm.set_search_path(ssm.search_path << ppath("styles/"))
145
- # sty = ssm.get_scheme("dark")
146
141
  sty = ssm.get_scheme("molokai_edit")
147
- # puts ssm.scheme_ids
148
142
 
149
- view.buffer.highlight_matching_brackets = true
150
- view.buffer.style_scheme = sty
143
+ buf1.highlight_matching_brackets = true
144
+ buf1.style_scheme = sty
145
+
146
+ view.set_highlight_current_line(true)
147
+ view.set_show_line_numbers(true)
148
+ view.set_buffer(buf1)
151
149
 
152
150
  provider = Gtk::CssProvider.new
153
151
  provider.load(data: "textview { font-family: Monospace; font-size: 11pt; }")
154
- # provider.load(data: "textview { font-family: Arial; font-size: 12pt; }")
155
152
  view.style_context.add_provider(provider)
156
153
  view.wrap_mode = :char
154
+ view.set_tab_width(conf(:tab_width))
157
155
 
158
156
  $vmag.buffers[id] = view
159
157
  end
@@ -176,25 +174,18 @@ end
176
174
  def gui_select_window_close(arg = nil)
177
175
  end
178
176
 
179
- # def set_window_title(str)
180
- # unimplemented
181
- # end
182
-
183
177
  def gui_set_buffer_contents(id, txt)
184
- # $vbuf.set_text(txt)
185
- puts "gui_set_buffer_contents(#{id}, txt)"
186
-
187
- $vmag.buffers[id].buffer.set_text(txt)
178
+ debug "gui_set_buffer_contents(#{id}, txt)"
179
+ vma.gui.buffers[id].buffer.set_text(txt)
188
180
  end
189
181
 
190
182
  def gui_set_cursor_pos(id, pos)
191
- $view.set_cursor_pos(pos)
192
- # Ripl.start :binding => binding
183
+ vma.buf.view.set_cursor_pos(pos)
193
184
  end
194
185
 
195
186
  def gui_set_current_buffer(id)
196
187
  view = $vmag.buffers[id]
197
- puts "gui_set_current_buffer(#{id}), view=#{view}"
188
+ debug "gui_set_current_buffer(#{id}), view=#{view}"
198
189
  buf1 = view.buffer
199
190
  $vmag.view = view
200
191
  $vmag.buf1 = buf1
@@ -205,17 +196,9 @@ def gui_set_current_buffer(id)
205
196
  $vmag.sw.add(view)
206
197
 
207
198
  view.grab_focus
208
- #view.set_focus(10)
209
199
  view.set_cursor_visible(true)
210
- #view.move_cursor(1, 1, false)
211
200
  view.place_cursor_onscreen
212
201
 
213
- #TODO:
214
- # itr = view.buffer.get_iter_at(:offset => 0)
215
- # view.buffer.place_cursor(itr)
216
-
217
- # wtitle = ""
218
- # wtitle = buf.fname if !buf.fname.nil?
219
202
  $vmag.sw.show_all
220
203
  end
221
204
 
@@ -225,7 +208,7 @@ def gui_set_window_title(wtitle, subtitle = "")
225
208
  end
226
209
 
227
210
  class VMAgui
228
- attr_accessor :buffers, :sw, :view, :buf1, :window
211
+ attr_accessor :buffers, :sw, :view, :buf1, :window, :delex, :statnfo
229
212
 
230
213
  VERSION = "1.0"
231
214
 
@@ -241,6 +224,22 @@ class VMAgui
241
224
  @buffers = {}
242
225
  @view = nil
243
226
  @buf1 = nil
227
+ @img_resizer_active = false
228
+ imgproc = proc {
229
+ GLib::Idle.add(proc {
230
+ if !buf.images.empty?
231
+ vma.gui.scale_all_images
232
+
233
+ w = Gtk::Window.new(:toplevel)
234
+ w.set_default_size(1, 1)
235
+ w.show_all
236
+ Thread.new { sleep 0.1; w.destroy }
237
+ end
238
+
239
+ false
240
+ })
241
+ }
242
+ @delex = DelayExecutioner.new(1, imgproc)
244
243
  end
245
244
 
246
245
  def run
@@ -249,6 +248,38 @@ class VMAgui
249
248
  Gtk.main
250
249
  end
251
250
 
251
+ def delay_scale()
252
+ if Time.now - @dtime > 2.0
253
+ end
254
+ end
255
+
256
+ def scale_all_images
257
+ # puts "scale all"
258
+ for img in buf.images
259
+ if !img[:obj].destroyed?
260
+ img[:obj].scale_image
261
+ end
262
+ end
263
+ end
264
+
265
+ def handle_image_resize
266
+ return if @img_resizer_active == true
267
+ @dtime = Time.now
268
+
269
+ $gcrw = 0
270
+ vma.gui.window.signal_connect "configure-event" do |widget, cr|
271
+ # Ripl.start :binding => binding
272
+
273
+ if $gcrw != cr.width
274
+ @delex.run
275
+ end
276
+ $gcrw = cr.width
277
+ false
278
+ end
279
+
280
+ @img_resizer_active = true
281
+ end
282
+
252
283
  def start_overlay_draw()
253
284
  @da = Gtk::Fixed.new
254
285
  @overlay.add_overlay(@da)
@@ -262,10 +293,10 @@ class VMAgui
262
293
  end
263
294
 
264
295
  def overlay_draw_text(text, textpos)
265
- # puts "overlay_draw_text #{[x,y]}"
296
+ # debug "overlay_draw_text #{[x,y]}"
266
297
  (x, y) = @view.pos_to_coord(textpos)
267
- # puts "overlay_draw_text #{[x,y]}"
268
- label = Gtk::Label.new("<span background='#00000088' foreground='#ff0000' weight='ultrabold'>#{text}</span>")
298
+ # debug "overlay_draw_text #{[x,y]}"
299
+ label = Gtk::Label.new("<span background='#000000ff' foreground='#ff0000' weight='ultrabold'>#{text}</span>")
269
300
  label.use_markup = true
270
301
  @da.put(label, x, y)
271
302
  end
@@ -300,7 +331,7 @@ class VMAgui
300
331
  # istart = @view.get_iter_at_y(vr.y)
301
332
  # startpos = @view.get_iter_at_position_raw(vr.x,vr.y)[1].offset
302
333
  # endpos = @view.get_iter_at_position_raw(vr.x+vr.width,vr.y+vr.height)[1].offset
303
- # puts "startpos,endpos:#{[startpos, endpos]}"
334
+ # debug "startpos,endpos:#{[startpos, endpos]}"
304
335
 
305
336
  da = @da
306
337
  if false
@@ -334,7 +365,7 @@ class VMAgui
334
365
  da.put(label, x, y)
335
366
  end
336
367
 
337
- # puts @view.pos_to_coord(300).inspect
368
+ # debug @view.pos_to_coord(300).inspect
338
369
 
339
370
  @da.show_all
340
371
  end
@@ -369,7 +400,7 @@ class VMAgui
369
400
  overlay = Gtk::Overlay.new
370
401
  overlay.add(sw)
371
402
  # @vpaned.pack2(overlay, :resize => false)
372
- @vbox.attach(overlay, 0, 2, 1, 1)
403
+ @vbox.attach(overlay, 0, 2, 2, 1)
373
404
  # overlay.set_size_request(-1, 50)
374
405
  # $ovrl = overlay
375
406
  # $ovrl.set_size_request(-1, 30)
@@ -383,7 +414,7 @@ class VMAgui
383
414
  ssm = GtkSource::StyleSchemeManager.new
384
415
  ssm.set_search_path(ssm.search_path << ppath("styles/"))
385
416
  sty = ssm.get_scheme("molokai_edit")
386
- view.buffer.highlight_matching_brackets = false
417
+ view.buffer.highlight_matching_brackets = false #TODO
387
418
  view.buffer.style_scheme = sty
388
419
  provider = Gtk::CssProvider.new
389
420
  # provider.load(data: "textview { font-family: Monospace; font-size: 11pt; }")
@@ -404,7 +435,6 @@ class VMAgui
404
435
  header.title = ""
405
436
  header.has_subtitle = true
406
437
  header.subtitle = ""
407
- # Ripl.start :binding => binding
408
438
 
409
439
  # icon = Gio::ThemedIcon.new("mail-send-receive-symbolic")
410
440
  # icon = Gio::ThemedIcon.new("document-open-symbolic")
@@ -480,32 +510,7 @@ class VMAgui
480
510
 
481
511
  header.pack_start(box)
482
512
  @window.titlebar = header
483
- @window.add(Gtk::TextView.new)
484
- end
485
-
486
- def create_menu_item(label, depth)
487
- menuitem = Gtk::MenuItem.new(:label => label)
488
- menuitem.submenu = create_menu(depth)
489
- @menubar.append(menuitem)
490
- end
491
-
492
- def create_menu(depth)
493
- return nil if depth < 1
494
-
495
- menu = Gtk::Menu.new
496
- last_item = nil
497
- (0..5).each do |i|
498
- j = i + 1
499
- label = "item #{depth} - #{j}"
500
- menu_item = Gtk::RadioMenuItem.new(nil, label)
501
- menu_item.join_group(last_item) if last_item
502
- last_item = menu_item
503
- menu.append(menu_item)
504
- menu_item.sensitive = false if i == 3
505
- menu_item.submenu = create_menu(depth - 1)
506
- end
507
-
508
- menu
513
+ # @window.add(Gtk::TextView.new)
509
514
  end
510
515
 
511
516
  def init_window
@@ -513,36 +518,34 @@ class VMAgui
513
518
  @window.set_default_size(650, 850)
514
519
  @window.title = "Multiple Views"
515
520
  @window.show_all
516
- # vpaned = Gtk::Paned.new(:horizontal)
517
521
  @vpaned = Gtk::Paned.new(:vertical)
518
- #@vpaned = Gtk::Box.new(:vertical, 0)
519
- # @vbox = Gtk::Box.new(:vertical, 0)
522
+
520
523
  @vbox = Gtk::Grid.new()
521
524
  @window.add(@vbox)
522
525
 
523
526
  @menubar = Gtk::MenuBar.new
524
527
  @menubar.expand = false
525
-
526
528
 
527
529
  @sw = Gtk::ScrolledWindow.new
528
530
  @sw.set_policy(:automatic, :automatic)
529
531
  @overlay = Gtk::Overlay.new
530
532
  @overlay.add(@sw)
531
533
 
532
- # @vpaned.pack1(@overlay, :resize => true)
533
- # @vpaned.pack2(@menubar, :resize => false)
534
- # @vbox.add(@menubar, :resize => false)
535
-
536
534
  init_header_bar
537
535
 
538
- # @window.show_all
536
+ @statnfo = Gtk::Label.new
537
+ provider = Gtk::CssProvider.new
538
+ provider.load(data: "textview { background-color:#353535; font-family: Monospace; font-size: 10pt; margin-top:4px;}")
539
+ @statnfo.style_context.add_provider(provider)
540
+
541
+ # Deprecated, but found no other way to do it. css doesn't work.
542
+ # TODO: should select color automatically from theme
543
+ @statnfo.override_background_color(Gtk::StateFlags::NORMAL, "#353535")
539
544
 
540
- # @vbox.pack_start(@menubar, :expand => false, :fill => false, :padding => 0 )
541
- # @vbox.pack_start(@menubar)
542
- # @vbox.pack_start(@overlay, :expand => true, :fill => true, :padding => 0 )
543
- # @vbox.pack_start(@overlay, :expand => true, :fill => true, :padding => 0 )
545
+ # column, row, width height
544
546
  @vbox.attach(@menubar, 0, 0, 1, 1)
545
- @vbox.attach(@overlay, 0, 1, 1, 1)
547
+ @vbox.attach(@statnfo, 1, 0, 1, 1)
548
+ @vbox.attach(@overlay, 0, 1, 2, 1)
546
549
  @overlay.vexpand = true
547
550
  @overlay.hexpand = true
548
551
 
@@ -551,11 +554,10 @@ class VMAgui
551
554
 
552
555
  init_minibuffer
553
556
 
554
-
555
557
  @window.show_all
556
558
  vma.start
557
559
  Vimamsa::Menu.new(@menubar)
560
+
558
561
  @window.show_all
559
-
560
562
  end
561
563
  end
@@ -0,0 +1,43 @@
1
+
2
+ # Following this example:
3
+ # https://gabmus.org/posts/create_an_auto-resizing_image_widget_with_gtk3_and_python/
4
+ class ResizableImage < Gtk::DrawingArea
5
+ attr_accessor :fpath, :pixbuf, :oldimg, :draw_image, :view
6
+
7
+ def initialize(fpath, view)
8
+ @fpath = fpath
9
+ @pixbuf = GdkPixbuf::Pixbuf.new(:file => fpath)
10
+ @oldimg = @pixbuf
11
+ @draw_image = @pixbuf
12
+ @view = view
13
+
14
+ super()
15
+ end
16
+
17
+ # Scale to fit window width
18
+ def scale_image()
19
+ pb = @pixbuf
20
+ view = @view
21
+ imglimit = view.visible_rect.width - 10
22
+
23
+ if @oldimg.width > imglimit or @oldimg.width < imglimit - 10
24
+ nwidth = imglimit
25
+ nwidth = pb.width if pb.width < imglimit
26
+ nheight = (pb.height * (nwidth.to_f / pb.width)).to_i
27
+ pb = pb.scale_simple(nwidth, nheight, GdkPixbuf::InterpType::HYPER)
28
+ else
29
+ pb = @oldimg
30
+ end
31
+ @draw_image = pb
32
+ @oldimg = pb
33
+ self.set_size_request(pb.width, pb.height)
34
+
35
+ end
36
+
37
+ def do_draw(da, cr)
38
+ # puts @fpath
39
+ cr.set_source_pixbuf(@draw_image, 0, 0)
40
+ cr.paint
41
+ end
42
+ end
43
+
@@ -4,7 +4,7 @@ module Vimamsa
4
4
  mpath = _mpath.split(".")
5
5
  curnfo = @nfo
6
6
  for y in mpath
7
- puts curnfo.inspect
7
+ debug(curnfo.inspect)
8
8
  if y.equal?(mpath.last)
9
9
  curnfo[y] = x
10
10
  elsif curnfo[y].nil?
@@ -16,12 +16,15 @@ module Vimamsa
16
16
  end
17
17
 
18
18
  def add_menu_items()
19
+
20
+ add_to_menu "File.Example", { :label => "<span foreground='#888888'>Action, [mode] key binding</span>", :action => nil }
19
21
  add_to_menu "File.Save", { :label => "Save", :action => :buf_save }
20
22
  add_to_menu "File.Save as", { :label => "Save As...", :action => :buf_save_as }
21
23
  add_to_menu "File.Open", { :label => "Open", :action => :open_file_dialog }
22
24
 
23
25
  add_to_menu "File.New", { :label => "New file", :action => :buf_new }
24
26
  add_to_menu "File.Revert", { :label => "Reload file from disk", :action => :buf_revert }
27
+ add_to_menu "File.List", { :label => "List open files", :action => :start_buf_manager }
25
28
 
26
29
  add_to_menu "File.Quit", { :label => "Quit", :action => :quit }
27
30
 
@@ -37,8 +40,14 @@ module Vimamsa
37
40
  add_to_menu "Actions.FileHistoryFinder", { :label => "Search files in history", :action => :gui_file_history_finder }
38
41
 
39
42
  add_to_menu "Actions.experimental.Diff", { :label => "Show Diff of\nunsaved changes", :action => :diff_buffer }
40
-
43
+
44
+ add_to_menu "Actions.experimental.EnableDebug", { :label => "Enable debug", :action => :enable_debug }
45
+ add_to_menu "Actions.experimental.DisableDebug", { :label => "Disable debug", :action => :disable_debug }
46
+ add_to_menu "Actions.experimental.ShowImages", { :label => "Show images ⟦img:path⟧", :action => :show_images }
47
+
41
48
  add_to_menu "Actions.EncryptFile", { :label => "Encrypt file", :action => :encrypt_file }
49
+ add_to_menu "Help.KeyBindings", { :label => "Show key bindings", :action => :show_key_bindings }
50
+
42
51
 
43
52
  #TODO: :auto_indent_buffer
44
53
 
@@ -1,6 +1,9 @@
1
1
  def gui_select_update_window(item_list, jump_keys, select_callback, update_callback, opt={})
2
2
  $selup = SelectUpdateWindow.new(nil, item_list, jump_keys, select_callback, update_callback, opt)
3
3
  $selup.run
4
+ # opt fields:
5
+ # :title
6
+ # :desc
4
7
  end
5
8
 
6
9
  class SelectUpdateWindow
@@ -8,7 +11,7 @@ class SelectUpdateWindow
8
11
  COLUMN_DESCRIPTION = 1
9
12
 
10
13
  def update_item_list(item_list)
11
- # puts item_list.inspect
14
+ # debug item_list.inspect
12
15
  @model.clear
13
16
  for item in item_list
14
17
  iter = @model.append
@@ -17,7 +20,7 @@ class SelectUpdateWindow
17
20
  else
18
21
  v = ["", item[0]]
19
22
  end
20
- puts v.inspect
23
+ debug v.inspect
21
24
  iter.set_values(v)
22
25
  end
23
26
 
@@ -46,10 +49,10 @@ class SelectUpdateWindow
46
49
  @selected_row = 0
47
50
  @opt = opt
48
51
 
49
- puts item_list.inspect
52
+ debug item_list.inspect
50
53
  @update_callback = method(update_callback)
51
54
  @select_callback = method(select_callback)
52
- # puts @update_callback_m.call("").inspect
55
+ # debug @update_callback_m.call("").inspect
53
56
 
54
57
  vbox = Gtk::Box.new(:vertical, 8)
55
58
  vbox.margin = 8
@@ -72,21 +75,21 @@ class SelectUpdateWindow
72
75
  update_item_list(item_list)
73
76
 
74
77
  @window.signal_connect("key-press-event") do |_widget, event|
75
- # puts "KEYPRESS 1"
78
+ # debug "KEYPRESS 1"
76
79
  @entry.handle_event(event)
77
80
  end
78
81
 
79
82
  @entry.signal_connect("key_press_event") do |widget, event|
80
- # puts "KEYPRESS 2"
83
+ # debug "KEYPRESS 2"
81
84
  if event.keyval == Gdk::Keyval::KEY_Down
82
- puts "DOWN"
85
+ debug "DOWN"
83
86
  set_selected_row(@selected_row + 1)
84
87
  # fixed = iter[COLUMN_FIXED]
85
88
 
86
89
  true
87
90
  elsif event.keyval == Gdk::Keyval::KEY_Up
88
91
  set_selected_row(@selected_row - 1)
89
- puts "UP"
92
+ debug "UP"
90
93
  true
91
94
  elsif event.keyval == Gdk::Keyval::KEY_Return
92
95
  path = Gtk::TreePath.new(@selected_row.to_s)
@@ -94,7 +97,7 @@ class SelectUpdateWindow
94
97
  ret = iter[1]
95
98
  @select_callback.call(ret, @selected_row)
96
99
  @window.destroy
97
- # puts iter[1].inspect
100
+ # debug iter[1].inspect
98
101
  true
99
102
  elsif event.keyval == Gdk::Keyval::KEY_Escape
100
103
  @window.destroy
@@ -105,14 +108,14 @@ class SelectUpdateWindow
105
108
  end
106
109
 
107
110
  @entry.signal_connect("search-changed") do |widget|
108
- puts "search changed: #{widget.text || ""}"
111
+ debug "search changed: #{widget.text || ""}"
109
112
  item_list = @update_callback.call(widget.text)
110
113
 
111
114
  update_item_list(item_list)
112
115
  # label.text = widget.text || ""
113
116
  end
114
- @entry.signal_connect("changed") { puts "[changed] " }
115
- @entry.signal_connect("next-match") { puts "[next-match] " }
117
+ @entry.signal_connect("changed") { debug "[changed] " }
118
+ @entry.signal_connect("next-match") { debug "[next-match] " }
116
119
 
117
120
  if !opt[:desc].nil?
118
121
  descl = Gtk::Label.new(opt[:desc])
@@ -160,7 +163,7 @@ class SelectUpdateWindow
160
163
  end
161
164
 
162
165
  @window.set_default_size(280, 500)
163
- puts "SelectUpdateWindow"
166
+ debug "SelectUpdateWindow"
164
167
  end
165
168
 
166
169
  def run