vimamsa 0.1.6 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
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