From aaf9d425d6ba841fd7ab56cad45c2683d987bece Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 28 Jun 2020 04:14:00 +0000 Subject: [PATCH 01/17] add Experimental.UI.Popup() --- autoload/vital/__vital__/Experimental/UI/Popup.vim | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 autoload/vital/__vital__/Experimental/UI/Popup.vim diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim new file mode 100644 index 000000000..5254e9f9b --- /dev/null +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -0,0 +1,10 @@ +let s:save_cpo = &cpo +set cpo&vim + +function! s:create(opt) abort + echom 'create popup' +endfunction + +let &cpo = s:save_cpo +unlet s:save_cpo +"vim: sts=2 sw=2 smarttab et ai textwidth=0 fdm=marker From 063757f65625e2012daffa93617ddf194de51599 Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 28 Jun 2020 06:04:25 +0000 Subject: [PATCH 02/17] set contents, width and height --- .../vital/__vital__/Experimental/UI/Popup.vim | 99 ++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index 5254e9f9b..050d6d7e6 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -1,8 +1,105 @@ let s:save_cpo = &cpo set cpo&vim +let s:_has_nvim = has('nvim') +let s:_popups = {} + +function! s:is_supported() abort + return has('nvim') && exists('*nvim_open_win') || !has('nvim') && exists('*popup_create') +endfunction + +" opt = { +" 'contents': ['This', 'is', 'a', 'line'], +" 'width': 5, +" 'height': 5, +" 'line': 1, +" 'col': 1, +" } function! s:create(opt) abort - echom 'create popup' + let data = {} + call s:_set_width(data, get(a:opt, 'width', 5)) + call s:_set_height(data, get(a:opt, 'height', 5)) + call s:_set_contents(data, get(a:opt, 'contents', [])) + call s:_set_line(data, get(a:opt, 'line', 1)) + call s:_set_col(data, get(a:opt, 'col', 1)) + if s:_has_nvim + let buf = nvim_create_buf(0, 1) + call nvim_buf_set_lines(buf, 0, -1, 1, s:_get_contents(data)) + let opt = { + \ 'relative': 'editor', + \ 'style': 'minimal', + \ 'width': data['width'], + \ 'height': data['height'], + \ 'row': data['line'], + \ 'col': data['col'], + \ 'focusable': 0, + \ } + let id = nvim_open_win(buf, 1, opt) + else + let id = popup_create(s:_get_contents(data), { + \ 'width': data['width'], + \ 'height': data['height'], + \ 'minwidth': data['width'], + \ 'minheight': data['height'], + \ 'maxwidth': data['width'], + \ 'maxheight': data['height'], + \ 'line': data['line'], + \ 'col': data['col'], + \ }) + endif + let s:_popups[id] = data + return id +endfunction + +function! s:_set_contents(data, contents) abort + let a:data['contents'] = a:contents +endfunction + +function! s:_get_contents(data) + return get(a:data, 'contents', []) +endfunction + +function! s:_set_width(data, width) abort + let a:data['width'] = a:width +endfunction + +function! s:_get_width(data) abort + return a:data['width'] +endfunction + +function! s:_get_height(data) abort + return a:data['height'] +endfunction + +function! s:_set_height(data, height) abort + let a:data['height'] = a:height +endfunction + +function! s:_set_line(data, line) abort + if s:_has_nvim + let a:data['line'] = a:line - 1 + else + let a:data['line'] = a:line + endif +endfunction + +function! s:_set_col(data, col) abort + if s:_has_nvim + let a:data['col'] = a:col - 1 + else + let a:data['col'] = a:col + endif +endfunction + +function! s:close(id) + if has_key(s:_popups, a:id) + if s:_has_nvim + silent! call nvim_win_close(a:id, 1) + else + silent! call popup_close(a:id) + endif + call remove(s:_popups, a:id) + endif endfunction let &cpo = s:save_cpo From 65cf52b0d08e5e1884393b61c4676ad87dd716af Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 28 Jun 2020 06:45:00 +0000 Subject: [PATCH 03/17] add missing abort --- autoload/vital/__vital__/Experimental/UI/Popup.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index 050d6d7e6..37695e0e4 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -55,7 +55,7 @@ function! s:_set_contents(data, contents) abort let a:data['contents'] = a:contents endfunction -function! s:_get_contents(data) +function! s:_get_contents(data) abort return get(a:data, 'contents', []) endfunction @@ -91,7 +91,7 @@ function! s:_set_col(data, col) abort endif endfunction -function! s:close(id) +function! s:close(id) abort if has_key(s:_popups, a:id) if s:_has_nvim silent! call nvim_win_close(a:id, 1) From 64981637716ea0dd0dc37aa15446c22695c6e223 Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Tue, 30 Jun 2020 18:47:06 +0000 Subject: [PATCH 04/17] check of patch 8.2.0286 --- autoload/vital/__vital__/Experimental/UI/Popup.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index 37695e0e4..bb59a2d35 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -5,7 +5,7 @@ let s:_has_nvim = has('nvim') let s:_popups = {} function! s:is_supported() abort - return has('nvim') && exists('*nvim_open_win') || !has('nvim') && exists('*popup_create') + return has('nvim') && exists('*nvim_open_win') || (!has('nvim') && exists('*popup_create') && has('patch-8.2.0286')) endfunction " opt = { From e63218340962d99da5b57b529078110fef698354 Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Tue, 30 Jun 2020 19:35:59 +0000 Subject: [PATCH 05/17] use x,y and w,h instead --- .../vital/__vital__/Experimental/UI/Popup.vim | 71 +++++++++---------- 1 file changed, 33 insertions(+), 38 deletions(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index bb59a2d35..ab7002e9d 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -10,41 +10,44 @@ endfunction " opt = { " 'contents': ['This', 'is', 'a', 'line'], -" 'width': 5, -" 'height': 5, -" 'line': 1, -" 'col': 1, +" 'w': 5, +" 'h': 5, +" 'x': 1, +" 'y': 1, " } function! s:create(opt) abort let data = {} - call s:_set_width(data, get(a:opt, 'width', 5)) - call s:_set_height(data, get(a:opt, 'height', 5)) + call s:_set_w(data, get(a:opt, 'w', 5)) + call s:_set_h(data, get(a:opt, 'h', 5)) call s:_set_contents(data, get(a:opt, 'contents', [])) - call s:_set_line(data, get(a:opt, 'line', 1)) - call s:_set_col(data, get(a:opt, 'col', 1)) + call s:_set_x(data, get(a:opt, 'x', 1)) + call s:_set_y(data, get(a:opt, 'y', 1)) + if s:_has_nvim let buf = nvim_create_buf(0, 1) call nvim_buf_set_lines(buf, 0, -1, 1, s:_get_contents(data)) let opt = { \ 'relative': 'editor', \ 'style': 'minimal', - \ 'width': data['width'], - \ 'height': data['height'], - \ 'row': data['line'], - \ 'col': data['col'], + \ 'width': data['w'], + \ 'height': data['h'], + \ 'col': data['x'], + \ 'row': data['y'], \ 'focusable': 0, \ } let id = nvim_open_win(buf, 1, opt) else + " neovim doesn't support scrollbar so don't enable it let id = popup_create(s:_get_contents(data), { - \ 'width': data['width'], - \ 'height': data['height'], - \ 'minwidth': data['width'], - \ 'minheight': data['height'], - \ 'maxwidth': data['width'], - \ 'maxheight': data['height'], - \ 'line': data['line'], - \ 'col': data['col'], + \ 'width': data['w'], + \ 'height': data['h'], + \ 'minwidth': data['w'], + \ 'minheight': data['h'], + \ 'maxwidth': data['w'], + \ 'maxheight': data['h'], + \ 'col': data['x'], + \ 'line': data['y'], + \ 'scrollbar': 0, \ }) endif let s:_popups[id] = data @@ -59,35 +62,27 @@ function! s:_get_contents(data) abort return get(a:data, 'contents', []) endfunction -function! s:_set_width(data, width) abort - let a:data['width'] = a:width -endfunction - -function! s:_get_width(data) abort - return a:data['width'] -endfunction - -function! s:_get_height(data) abort - return a:data['height'] +function! s:_set_w(data, w) abort + let a:data['w'] = a:w endfunction -function! s:_set_height(data, height) abort - let a:data['height'] = a:height +function! s:_set_h(data, h) abort + let a:data['h'] = a:h endfunction -function! s:_set_line(data, line) abort +function! s:_set_y(data, y) abort if s:_has_nvim - let a:data['line'] = a:line - 1 + let a:data['y'] = a:y - 1 else - let a:data['line'] = a:line + let a:data['y'] = a:y endif endfunction -function! s:_set_col(data, col) abort +function! s:_set_x(data, x) abort if s:_has_nvim - let a:data['col'] = a:col - 1 + let a:data['x'] = a:x - 1 else - let a:data['col'] = a:col + let a:data['x'] = a:x endif endfunction From eee78726fdb1487d44c5870e70f7460aea82cc89 Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Tue, 30 Jun 2020 20:34:07 +0000 Subject: [PATCH 06/17] add pos support --- .../vital/__vital__/Experimental/UI/Popup.vim | 37 ++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index ab7002e9d..d54a595ad 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -19,9 +19,32 @@ function! s:create(opt) abort let data = {} call s:_set_w(data, get(a:opt, 'w', 5)) call s:_set_h(data, get(a:opt, 'h', 5)) - call s:_set_contents(data, get(a:opt, 'contents', [])) call s:_set_x(data, get(a:opt, 'x', 1)) call s:_set_y(data, get(a:opt, 'y', 1)) + call s:_set_pos(data, get(a:opt, 'pos', 'topleft')) + call s:_set_contents(data, get(a:opt, 'contents', [])) + + if data['pos'] ==# 'topleft' + let data['sx'] = data['x'] + let data['sy'] = data['y'] + elseif data['pos'] ==# 'topright' + let data['sx'] = data['x'] + data['w'] + 1 + let data['sy'] = data['y'] + elseif data['pos'] ==# 'bottomleft' + let data['sx'] = data['x'] + let data['sy'] = data['y'] - data['h'] + 1 + elseif data['pos'] ==# 'bottomright' + let data['sx'] = data['x'] + data['w'] + 1 + let data['sy'] = data['y'] - data['h'] + 1 + elseif data['pos'] ==# 'topcenter' + let data['sx'] = data['x'] + float2nr(data['x'] / 2) + 1 + let data['sy'] = data['y'] - data['h'] + elseif data['pos'] ==# 'bottomcenter' + let data['sx'] = data['x'] + float2nr(data['x'] / 2) + 1 + let data['sy'] = data['y'] + 1 + else + throw 'invalid popup pos' + endif if s:_has_nvim let buf = nvim_create_buf(0, 1) @@ -31,8 +54,8 @@ function! s:create(opt) abort \ 'style': 'minimal', \ 'width': data['w'], \ 'height': data['h'], - \ 'col': data['x'], - \ 'row': data['y'], + \ 'col': data['sx'], + \ 'row': data['sy'], \ 'focusable': 0, \ } let id = nvim_open_win(buf, 1, opt) @@ -45,8 +68,8 @@ function! s:create(opt) abort \ 'minheight': data['h'], \ 'maxwidth': data['w'], \ 'maxheight': data['h'], - \ 'col': data['x'], - \ 'line': data['y'], + \ 'col': data['sx'], + \ 'line': data['sy'], \ 'scrollbar': 0, \ }) endif @@ -86,6 +109,10 @@ function! s:_set_x(data, x) abort endif endfunction +function! s:_set_pos(data, pos) abort + let a:data['pos'] = a:pos +endfunction + function! s:close(id) abort if has_key(s:_popups, a:id) if s:_has_nvim From 831252faf5e314af346b43d3ab7ba7bb5fe6692f Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Tue, 30 Jun 2020 20:40:04 +0000 Subject: [PATCH 07/17] fix throw error message --- autoload/vital/__vital__/Experimental/UI/Popup.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index d54a595ad..a0052b0b2 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -43,7 +43,7 @@ function! s:create(opt) abort let data['sx'] = data['x'] + float2nr(data['x'] / 2) + 1 let data['sy'] = data['y'] + 1 else - throw 'invalid popup pos' + throw 'vital: Experimental.UI.Popup: Invalid pos' endif if s:_has_nvim From ab4a6d56901feb7e137afb9aaeff7e44886c78df Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 23 Aug 2020 07:37:21 +0000 Subject: [PATCH 08/17] refactor to s:_set --- .../vital/__vital__/Experimental/UI/Popup.vim | 111 +++++++----------- 1 file changed, 45 insertions(+), 66 deletions(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index a0052b0b2..aa2ebbc8e 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -14,41 +14,15 @@ endfunction " 'h': 5, " 'x': 1, " 'y': 1, +" 'pos': 'topleft|topright|bottomleft|bottomright|topcenter|bottomcenter', " } function! s:create(opt) abort let data = {} - call s:_set_w(data, get(a:opt, 'w', 5)) - call s:_set_h(data, get(a:opt, 'h', 5)) - call s:_set_x(data, get(a:opt, 'x', 1)) - call s:_set_y(data, get(a:opt, 'y', 1)) - call s:_set_pos(data, get(a:opt, 'pos', 'topleft')) - call s:_set_contents(data, get(a:opt, 'contents', [])) - - if data['pos'] ==# 'topleft' - let data['sx'] = data['x'] - let data['sy'] = data['y'] - elseif data['pos'] ==# 'topright' - let data['sx'] = data['x'] + data['w'] + 1 - let data['sy'] = data['y'] - elseif data['pos'] ==# 'bottomleft' - let data['sx'] = data['x'] - let data['sy'] = data['y'] - data['h'] + 1 - elseif data['pos'] ==# 'bottomright' - let data['sx'] = data['x'] + data['w'] + 1 - let data['sy'] = data['y'] - data['h'] + 1 - elseif data['pos'] ==# 'topcenter' - let data['sx'] = data['x'] + float2nr(data['x'] / 2) + 1 - let data['sy'] = data['y'] - data['h'] - elseif data['pos'] ==# 'bottomcenter' - let data['sx'] = data['x'] + float2nr(data['x'] / 2) + 1 - let data['sy'] = data['y'] + 1 - else - throw 'vital: Experimental.UI.Popup: Invalid pos' - endif + call s:_set(data, a:opt) if s:_has_nvim let buf = nvim_create_buf(0, 1) - call nvim_buf_set_lines(buf, 0, -1, 1, s:_get_contents(data)) + call nvim_buf_set_lines(buf, 0, -1, 1, data['contents']) let opt = { \ 'relative': 'editor', \ 'style': 'minimal', @@ -61,7 +35,7 @@ function! s:create(opt) abort let id = nvim_open_win(buf, 1, opt) else " neovim doesn't support scrollbar so don't enable it - let id = popup_create(s:_get_contents(data), { + let id = popup_create(data['contents'], { \ 'width': data['w'], \ 'height': data['h'], \ 'minwidth': data['w'], @@ -77,42 +51,6 @@ function! s:create(opt) abort return id endfunction -function! s:_set_contents(data, contents) abort - let a:data['contents'] = a:contents -endfunction - -function! s:_get_contents(data) abort - return get(a:data, 'contents', []) -endfunction - -function! s:_set_w(data, w) abort - let a:data['w'] = a:w -endfunction - -function! s:_set_h(data, h) abort - let a:data['h'] = a:h -endfunction - -function! s:_set_y(data, y) abort - if s:_has_nvim - let a:data['y'] = a:y - 1 - else - let a:data['y'] = a:y - endif -endfunction - -function! s:_set_x(data, x) abort - if s:_has_nvim - let a:data['x'] = a:x - 1 - else - let a:data['x'] = a:x - endif -endfunction - -function! s:_set_pos(data, pos) abort - let a:data['pos'] = a:pos -endfunction - function! s:close(id) abort if has_key(s:_popups, a:id) if s:_has_nvim @@ -124,6 +62,47 @@ function! s:close(id) abort endif endfunction +function! s:_set(data, opt) abort + " try to set values from a:opt, if not set from a:data, if not default + let a:data['w'] = get(a:opt, 'w', get(a:data, 'w', 5)) + let a:data['h'] = get(a:opt, 'h', get(a:data, 'h', 5)) + + if s:_has_nvim + " a:opt[x/y] need to - 1 + " a:data['x/y'] already normalized + let a:data['x'] = has_key(a:opt, 'x') ? a:opt['x'] - 1 : get(a:data, 'x', 0) + let a:data['y'] = has_key(a:opt, 'y') ? a:opt['y'] - 1 : get(a:data, 'y', 0) + else + let a:data['x'] = get(a:opt, 'x', get(a:data, 'x', 1)) + let a:data['y'] = get(a:opt, 'y', get(a:data, 'y', 1)) + endif + + let a:data['contents'] = get(a:opt, 'contents', get(a:data, 'contents', [])) + let a:data['pos'] = get(a:opt, 'pos', get(a:data, 'pos', 'topleft')) + + if a:data['pos'] ==# 'topleft' + let a:data['sx'] = a:data['x'] + let a:data['sy'] = a:data['y'] + elseif a:data['pos'] ==# 'topright' + let a:data['sx'] = a:data['x'] + a:data['w'] + 1 + let a:data['sy'] = a:data['y'] + elseif a:data['pos'] ==# 'bottomleft' + let a:data['sx'] = a:data['x'] + let a:data['sy'] = a:data['y'] - a:data['h'] + 1 + elseif a:data['pos'] ==# 'bottomright' + let a:data['sx'] = a:data['x'] + a:data['w'] + 1 + let a:data['sy'] = a:data['y'] - a:data['h'] + 1 + elseif a:data['pos'] ==# 'topcenter' + let a:data['sx'] = a:data['x'] + float2nr(a:data['x'] / 2) + 1 + let a:data['sy'] = a:data['y'] - a:data['h'] + elseif a:data['pos'] ==# 'bottomcenter' + let a:data['sx'] = a:data['x'] + float2nr(a:data['x'] / 2) + 1 + let a:data['sy'] = a:data['y'] + 1 + else + throw 'vital: Experimental.UI.Popup: Invalid pos' + endif +endfunction + let &cpo = s:save_cpo unlet s:save_cpo "vim: sts=2 sw=2 smarttab et ai textwidth=0 fdm=marker From f91516d5091eba17a33aaa63fe8c93c01b267982 Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sat, 19 Sep 2020 20:51:09 +0000 Subject: [PATCH 09/17] add event support --- .../vital/__vital__/Experimental/UI/Popup.vim | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index aa2ebbc8e..6a9d9bb2c 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -48,6 +48,7 @@ function! s:create(opt) abort \ }) endif let s:_popups[id] = data + call s:_notify(id, {}, 'create') return id endfunction @@ -58,11 +59,19 @@ function! s:close(id) abort else silent! call popup_close(a:id) endif + call s:_notify(a:id, {}, 'close') call remove(s:_popups, a:id) endif endfunction function! s:_set(data, opt) abort + " copy all callbacks to data + for [key, Cb] in items(a:opt) + if stridx(key, 'on_') == 0 + let a:data[key] = Cb + endif + endfor + " try to set values from a:opt, if not set from a:data, if not default let a:data['w'] = get(a:opt, 'w', get(a:data, 'w', 5)) let a:data['h'] = get(a:opt, 'h', get(a:data, 'h', 5)) @@ -103,6 +112,16 @@ function! s:_set(data, opt) abort endif endfunction +function! s:_notify(id, data, event) abort + if has_key(s:_popups[a:id], 'on_event') + call s:_popups[a:id]['on_event'](a:id, a:data, a:event) + endif + let eventhandler = 'on_' . a:event + if has_key(s:_popups[a:id], eventhandler) + call s:_popups[a:id][eventhandler](a:id, a:data, a:event) + endif +endfunction + let &cpo = s:save_cpo unlet s:save_cpo "vim: sts=2 sw=2 smarttab et ai textwidth=0 fdm=marker From 267a61d84574df9484ae46b8ef8bff43453575a3 Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 20 Sep 2020 01:56:28 +0000 Subject: [PATCH 10/17] autogen popup id --- .../vital/__vital__/Experimental/UI/Popup.vim | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index 6a9d9bb2c..acb53366f 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -3,6 +3,7 @@ set cpo&vim let s:_has_nvim = has('nvim') let s:_popups = {} +let s:_id = 0 function! s:is_supported() abort return has('nvim') && exists('*nvim_open_win') || (!has('nvim') && exists('*popup_create') && has('patch-8.2.0286')) @@ -17,12 +18,14 @@ endfunction " 'pos': 'topleft|topright|bottomleft|bottomright|topcenter|bottomcenter', " } function! s:create(opt) abort + let id = s:_nextid() let data = {} + call s:_set(data, a:opt) if s:_has_nvim - let buf = nvim_create_buf(0, 1) - call nvim_buf_set_lines(buf, 0, -1, 1, data['contents']) + let data['bufnr'] = nvim_create_buf(0, 1) + call nvim_buf_set_lines(data['bufnr'], 0, -1, 1, data['contents']) let opt = { \ 'relative': 'editor', \ 'style': 'minimal', @@ -32,10 +35,10 @@ function! s:create(opt) abort \ 'row': data['sy'], \ 'focusable': 0, \ } - let id = nvim_open_win(buf, 1, opt) + let data['winid'] = nvim_open_win(data['bufnr'], 1, opt) else " neovim doesn't support scrollbar so don't enable it - let id = popup_create(data['contents'], { + let data['winid'] = popup_create(data['contents'], { \ 'width': data['w'], \ 'height': data['h'], \ 'minwidth': data['w'], @@ -46,6 +49,7 @@ function! s:create(opt) abort \ 'line': data['sy'], \ 'scrollbar': 0, \ }) + let data['bufnr'] = winbufnr(data['winid']) endif let s:_popups[id] = data call s:_notify(id, {}, 'create') @@ -54,10 +58,11 @@ endfunction function! s:close(id) abort if has_key(s:_popups, a:id) + let data = s:_popups[a:id] if s:_has_nvim - silent! call nvim_win_close(a:id, 1) + call nvim_win_close(data['winid'], 1) else - silent! call popup_close(a:id) + call popup_close(data['winid']) endif call s:_notify(a:id, {}, 'close') call remove(s:_popups, a:id) @@ -112,6 +117,11 @@ function! s:_set(data, opt) abort endif endfunction +function! s:_nextid() abort + let s:_id += 1 + return s:_id +endfunction + function! s:_notify(id, data, event) abort if has_key(s:_popups[a:id], 'on_event') call s:_popups[a:id]['on_event'](a:id, a:data, a:event) From 7985de65025318c9ea58fc698bbdece693302f3d Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 20 Sep 2020 02:05:29 +0000 Subject: [PATCH 11/17] add s:_nvim_open_win --- .../vital/__vital__/Experimental/UI/Popup.vim | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index acb53366f..6587f0448 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -26,16 +26,7 @@ function! s:create(opt) abort if s:_has_nvim let data['bufnr'] = nvim_create_buf(0, 1) call nvim_buf_set_lines(data['bufnr'], 0, -1, 1, data['contents']) - let opt = { - \ 'relative': 'editor', - \ 'style': 'minimal', - \ 'width': data['w'], - \ 'height': data['h'], - \ 'col': data['sx'], - \ 'row': data['sy'], - \ 'focusable': 0, - \ } - let data['winid'] = nvim_open_win(data['bufnr'], 1, opt) + let data['winid'] = s:_nvim_open_win(id, data) else " neovim doesn't support scrollbar so don't enable it let data['winid'] = popup_create(data['contents'], { @@ -69,6 +60,19 @@ function! s:close(id) abort endif endfunction +function! s:_nvim_open_win(id, data) abort + let opt = { + \ 'relative': 'editor', + \ 'style': 'minimal', + \ 'width': a:data['w'], + \ 'height': a:data['h'], + \ 'col': a:data['sx'], + \ 'row': a:data['sy'], + \ 'focusable': 0, + \ } + return nvim_open_win(a:data['bufnr'], 1, opt) +endfunction + function! s:_set(data, opt) abort " copy all callbacks to data for [key, Cb] in items(a:opt) From d04b61f0666d0f48a8ad000cd3e1b9da8904b6f5 Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 20 Sep 2020 02:08:20 +0000 Subject: [PATCH 12/17] set winid to 0 when close in neovim --- autoload/vital/__vital__/Experimental/UI/Popup.vim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index 6587f0448..b42d26b55 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -19,7 +19,7 @@ endfunction " } function! s:create(opt) abort let id = s:_nextid() - let data = {} + let data = { 'winid': 0 } call s:_set(data, a:opt) @@ -52,6 +52,7 @@ function! s:close(id) abort let data = s:_popups[a:id] if s:_has_nvim call nvim_win_close(data['winid'], 1) + let data['winid'] = 0 else call popup_close(data['winid']) endif From 79b83391444f8284e3dc9d1fb5206b948c31721b Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 20 Sep 2020 02:18:55 +0000 Subject: [PATCH 13/17] add show() hide() methods --- .../vital/__vital__/Experimental/UI/Popup.vim | 42 ++++++++++++++----- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index b42d26b55..816d672f3 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -44,21 +44,41 @@ function! s:create(opt) abort endif let s:_popups[id] = data call s:_notify(id, {}, 'create') + call s:_notify(id, {}, 'show') return id endfunction function! s:close(id) abort - if has_key(s:_popups, a:id) - let data = s:_popups[a:id] - if s:_has_nvim - call nvim_win_close(data['winid'], 1) - let data['winid'] = 0 - else - call popup_close(data['winid']) - endif - call s:_notify(a:id, {}, 'close') - call remove(s:_popups, a:id) + let data = s:_popups[a:id] + if s:_has_nvim + call nvim_win_close(data['winid'], 1) + let data['winid'] = 0 + else + call popup_close(data['winid']) + endif + call s:_notify(a:id, {}, 'close') + call remove(s:_popups, a:id) +endfunction + +function! s:hide(id) abort + let data = s:_popups[a:id] + if s:_has_nvim + call nvim_win_close(data['winid'], 1) + let data['winid'] = 0 + else + call popup_hide(data['winid']) + endif + call s:_notify(a:id, {}, 'hide') +endfunction + +function! s:show(id) abort + let data = s:_popups[a:id] + if s:_has_nvim + let data['winid'] = s:_nvim_open_win(a:id, data) + else + call popup_show(data['winid']) endif + call s:_notify(a:id, {}, 'show') endfunction function! s:_nvim_open_win(id, data) abort @@ -71,7 +91,7 @@ function! s:_nvim_open_win(id, data) abort \ 'row': a:data['sy'], \ 'focusable': 0, \ } - return nvim_open_win(a:data['bufnr'], 1, opt) + return nvim_open_win(a:data['bufnr'], 0, opt) endfunction function! s:_set(data, opt) abort From 8d7dbb9f1685beb9de113b938eac047a3d828059 Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 20 Sep 2020 02:32:01 +0000 Subject: [PATCH 14/17] add contents(['line1', 'line2']) api --- autoload/vital/__vital__/Experimental/UI/Popup.vim | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index 816d672f3..eb6540d57 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -81,6 +81,16 @@ function! s:show(id) abort call s:_notify(a:id, {}, 'show') endfunction +function! s:contents(id, contents) abort + let data = s:_popups[a:id] + let data['contents'] = a:contents + if s:_has_nvim + call nvim_buf_set_lines(data['bufnr'], 0, -1, 1, a:contents) + else + call popup_settext(data['winid'], a:contents) + endif +endfunction + function! s:_nvim_open_win(id, data) abort let opt = { \ 'relative': 'editor', From 26e70b008fe3ae1e885f9124ba411b0b1c05049b Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 20 Sep 2020 02:32:17 +0000 Subject: [PATCH 15/17] don't wrap for vim to align with neovim --- autoload/vital/__vital__/Experimental/UI/Popup.vim | 1 + 1 file changed, 1 insertion(+) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index eb6540d57..d42d73c51 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -39,6 +39,7 @@ function! s:create(opt) abort \ 'col': data['sx'], \ 'line': data['sy'], \ 'scrollbar': 0, + \ 'wrap': 0, \ }) let data['bufnr'] = winbufnr(data['winid']) endif From 5fd08176086add6d99188f88a1510712e5998a3b Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 20 Sep 2020 02:45:44 +0000 Subject: [PATCH 16/17] add winid() and bufnr() api --- autoload/vital/__vital__/Experimental/UI/Popup.vim | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index d42d73c51..cebefe79d 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -92,6 +92,14 @@ function! s:contents(id, contents) abort endif endfunction +function! s:winid(id) abort + return s:_popups[a:id]['winid'] +endfunction + +function! s:bufnr(id) abort + return s:_popups[a:id]['bufnr'] +endfunction + function! s:_nvim_open_win(id, data) abort let opt = { \ 'relative': 'editor', From 274654a8153a620b94c7e6869e838d43b8d9e701 Mon Sep 17 00:00:00 2001 From: Prabir Shrestha Date: Sun, 20 Sep 2020 19:12:33 +0000 Subject: [PATCH 17/17] add options() api to update popup --- .../vital/__vital__/Experimental/UI/Popup.vim | 75 ++++++++++++++----- 1 file changed, 55 insertions(+), 20 deletions(-) diff --git a/autoload/vital/__vital__/Experimental/UI/Popup.vim b/autoload/vital/__vital__/Experimental/UI/Popup.vim index cebefe79d..1943c4dbb 100644 --- a/autoload/vital/__vital__/Experimental/UI/Popup.vim +++ b/autoload/vital/__vital__/Experimental/UI/Popup.vim @@ -26,21 +26,10 @@ function! s:create(opt) abort if s:_has_nvim let data['bufnr'] = nvim_create_buf(0, 1) call nvim_buf_set_lines(data['bufnr'], 0, -1, 1, data['contents']) - let data['winid'] = s:_nvim_open_win(id, data) + let data['winid'] = s:_nvim_open_win(data) else " neovim doesn't support scrollbar so don't enable it - let data['winid'] = popup_create(data['contents'], { - \ 'width': data['w'], - \ 'height': data['h'], - \ 'minwidth': data['w'], - \ 'minheight': data['h'], - \ 'maxwidth': data['w'], - \ 'maxheight': data['h'], - \ 'col': data['sx'], - \ 'line': data['sy'], - \ 'scrollbar': 0, - \ 'wrap': 0, - \ }) + let data['winid'] = popup_create(data['contents'], s:_get_vim_options(data)) let data['bufnr'] = winbufnr(data['winid']) endif let s:_popups[id] = data @@ -75,7 +64,7 @@ endfunction function! s:show(id) abort let data = s:_popups[a:id] if s:_has_nvim - let data['winid'] = s:_nvim_open_win(a:id, data) + let data['winid'] = s:_nvim_open_win(data) else call popup_show(data['winid']) endif @@ -92,7 +81,19 @@ function! s:contents(id, contents) abort endif endfunction +function! s:options(id, opt) abort + let data = s:_popups[a:id] + call s:_set(data, a:opt) + if s:_has_nvim + call nvim_win_set_config(data['winid'], s:_get_nvim_options(data)) + else + call popup_setoptions(data['winid'], s:_get_vim_options(data)) + endif + call s:_notify(a:id, {}, 'options') +endfunction + function! s:winid(id) abort + " can return 0 when hidden for neovim return s:_popups[a:id]['winid'] endfunction @@ -100,8 +101,23 @@ function! s:bufnr(id) abort return s:_popups[a:id]['bufnr'] endfunction -function! s:_nvim_open_win(id, data) abort - let opt = { +function! s:_get_vim_options(data) abort + return { + \ 'width': a:data['w'], + \ 'height': a:data['h'], + \ 'minwidth': a:data['w'], + \ 'minheight': a:data['h'], + \ 'maxwidth': a:data['w'], + \ 'maxheight': a:data['h'], + \ 'col': a:data['sx'], + \ 'line': a:data['sy'], + \ 'scrollbar': 0, + \ 'wrap': 0, + \ } +endfunction + +function! s:_get_nvim_options(data) abort + return { \ 'relative': 'editor', \ 'style': 'minimal', \ 'width': a:data['w'], @@ -110,7 +126,26 @@ function! s:_nvim_open_win(id, data) abort \ 'row': a:data['sy'], \ 'focusable': 0, \ } - return nvim_open_win(a:data['bufnr'], 0, opt) +endfunction + +function! s:_nvim_open_win(data) abort + return nvim_open_win(a:data['bufnr'], 0, s:_get_nvim_options(a:data)) +endfunction + +function! s:_user_to_editor_xy(val) abort + if s:_has_nvim + return a:val - 1 + else + return a:val + endif +endfunction + +function! s:_editor_to_user_xy(val) abort + if s:_has_nvim + return a:val + 1 + else + return a:val + endif endfunction function! s:_set(data, opt) abort @@ -126,10 +161,10 @@ function! s:_set(data, opt) abort let a:data['h'] = get(a:opt, 'h', get(a:data, 'h', 5)) if s:_has_nvim - " a:opt[x/y] need to - 1 + " a:opt[x/y] need to normalize " a:data['x/y'] already normalized - let a:data['x'] = has_key(a:opt, 'x') ? a:opt['x'] - 1 : get(a:data, 'x', 0) - let a:data['y'] = has_key(a:opt, 'y') ? a:opt['y'] - 1 : get(a:data, 'y', 0) + let a:data['x'] = has_key(a:opt, 'x') ? s:_user_to_editor_xy(a:opt['x']) : get(a:data, 'x', 0) + let a:data['y'] = has_key(a:opt, 'y') ? s:_user_to_editor_xy(a:opt['y']) : get(a:data, 'y', 0) else let a:data['x'] = get(a:opt, 'x', get(a:data, 'x', 1)) let a:data['y'] = get(a:opt, 'y', get(a:data, 'y', 1))