mirror of
https://github.com/vim/vim.git
synced 2025-11-13 22:54:27 -05:00
patch 8.1.1553: not easy to change the text in a popup window
Problem: Not easy to change the text in a popup window. Solution: Add popup_settext(). (Ben Jackson, closes #4549) Also display a space for an empty popup.
This commit is contained in:
@@ -601,8 +601,10 @@ popup_adjust_position(win_T *wp)
|
||||
wp->w_topline = wp->w_buffer->b_ml.ml_line_count;
|
||||
|
||||
// Compute width based on longest text line and the 'wrap' option.
|
||||
// Use a minimum width of one, so that something shows when there is no
|
||||
// text.
|
||||
// TODO: more accurate wrapping
|
||||
wp->w_width = 0;
|
||||
wp->w_width = 1;
|
||||
for (lnum = wp->w_topline; lnum <= wp->w_buffer->b_ml.ml_line_count; ++lnum)
|
||||
{
|
||||
int len = vim_strsize(ml_get_buf(wp->w_buffer, lnum, FALSE));
|
||||
@@ -703,6 +705,48 @@ typedef enum
|
||||
TYPE_DIALOG
|
||||
} create_type_T;
|
||||
|
||||
/*
|
||||
* Make "buf" empty and set the contents to "text".
|
||||
* Used by popup_create() and popup_settext().
|
||||
*/
|
||||
static void
|
||||
popup_set_buffer_text(buf_T *buf, typval_T text)
|
||||
{
|
||||
int lnum;
|
||||
|
||||
// Clear the buffer, then replace the lines.
|
||||
curbuf = buf;
|
||||
for (lnum = buf->b_ml.ml_line_count; lnum > 0; --lnum)
|
||||
ml_delete(lnum, FALSE);
|
||||
curbuf = curwin->w_buffer;
|
||||
|
||||
// Add text to the buffer.
|
||||
if (text.v_type == VAR_STRING)
|
||||
{
|
||||
// just a string
|
||||
ml_append_buf(buf, 0, text.vval.v_string, (colnr_T)0, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
list_T *l = text.vval.v_list;
|
||||
|
||||
if (l->lv_len > 0)
|
||||
{
|
||||
if (l->lv_first->li_tv.v_type == VAR_STRING)
|
||||
// list of strings
|
||||
add_popup_strings(buf, l);
|
||||
else
|
||||
// list of dictionaries
|
||||
add_popup_dicts(buf, l);
|
||||
}
|
||||
}
|
||||
|
||||
// delete the line that was in the empty buffer
|
||||
curbuf = buf;
|
||||
ml_delete(buf->b_ml.ml_line_count, FALSE);
|
||||
curbuf = curwin->w_buffer;
|
||||
}
|
||||
|
||||
/*
|
||||
* popup_create({text}, {options})
|
||||
* popup_atcursor({text}, {options})
|
||||
@@ -789,31 +833,7 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
|
||||
// TODO: find tab page "nr"
|
||||
emsg("Not implemented yet");
|
||||
|
||||
// Add text to the buffer.
|
||||
if (argvars[0].v_type == VAR_STRING)
|
||||
{
|
||||
// just a string
|
||||
ml_append_buf(buf, 0, argvars[0].vval.v_string, (colnr_T)0, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
list_T *l = argvars[0].vval.v_list;
|
||||
|
||||
if (l->lv_len > 0)
|
||||
{
|
||||
if (l->lv_first->li_tv.v_type == VAR_STRING)
|
||||
// list of strings
|
||||
add_popup_strings(buf, l);
|
||||
else
|
||||
// list of dictionaries
|
||||
add_popup_dicts(buf, l);
|
||||
}
|
||||
}
|
||||
|
||||
// Delete the line of the empty buffer.
|
||||
curbuf = buf;
|
||||
ml_delete(buf->b_ml.ml_line_count, FALSE);
|
||||
curbuf = curwin->w_buffer;
|
||||
popup_set_buffer_text(buf, argvars[0]);
|
||||
|
||||
if (type == TYPE_ATCURSOR)
|
||||
{
|
||||
@@ -1112,6 +1132,22 @@ f_popup_show(typval_T *argvars, typval_T *rettv UNUSED)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* popup_settext({id}, {text})
|
||||
*/
|
||||
void
|
||||
f_popup_settext(typval_T *argvars, typval_T *rettv UNUSED)
|
||||
{
|
||||
int id = (int)tv_get_number(&argvars[0]);
|
||||
win_T *wp = find_popup_win(id);
|
||||
|
||||
if (wp != NULL)
|
||||
{
|
||||
popup_set_buffer_text(wp->w_buffer, argvars[1]);
|
||||
popup_adjust_position(wp);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
popup_free(win_T *wp)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user