" Open/close/toggle the quickfix and location-list windows

" ------------------------------------------------------------------------------
" File: autoload/qf/window.vim
" ------------------------------------------------------------------------------

" Toggle quickfix or location-list window
function! qf#window#toggle(loclist = 0)
    " Check if quickfix window is open in current tabpage, or if current
    " window's location-list window is open
    let is_open = getwininfo()
            \ ->filter('v:val.tabnr == tabpagenr()')
            \ ->filter({_,info -> a:loclist
            \     ? info.loclist && info.winid == getloclist(0, {'winid': 1}).winid
            \     : !info.loclist && info.quickfix
            \   })
            \ ->len()

    if is_open
        execute a:loclist ? 'lclose' : 'cclose' .. (&filetype ==# 'qf' ? '| wincmd p' : '')
    else
        let size = a:loclist ? getloclist(0, {'size': 1}).size : getqflist({'size': 1}).size
        if size
            " See https://github.com/vim/vim/issues/5037
            execute a:loclist ? 'lopen 1' : 'botright copen 1'
            execute 'resize' min([10, size])
        endif
    endif
endfunction

" Same as :cwindow and :lwindow but resize the quickfix window automatically
function! qf#window#open(loclist = 0)
    let size = a:loclist ? getloclist(0, {'size': 1}).size : getqflist({'size': 1}).size

    if !size
        execute a:loclist ? 'lclose' : 'cclose'
    else
        execute a:loclist ? 'lopen 1' : 'botright copen 1'
        execute 'resize' min([10, size])
    endif
endfunction

function! qf#window#close()
    if getwininfo(win_getid())[0].loclist
        lclose
    else
        cclose
        " Required only after cclose
        wincmd p
    endif
endfunction


" ------------------------------------------------------------------------------
" File: vimrc
" ------------------------------------------------------------------------------

" Don't scroll windows when opening new horizontal splits
set splitkeep=topline

" Toggle quickfix and location-list windows
nnoremap <silent> goc :<c-u>call qf#window#toggle(0)<cr>
nnoremap <silent> gol :<c-u>call qf#window#toggle(1)<cr>

augroup quickfix
    autocmd!
    autocmd QuickFixCmdPost [^l]* ++nested call qf#window#open(0)
    autocmd QuickFixCmdPost    l* ++nested call qf#window#open(1)
    autocmd VimEnter            * ++nested call qf#window#open(0)
augroup END


" ------------------------------------------------------------------------------
" File: after/ftplugin/qf.vim
" ------------------------------------------------------------------------------

" Close quickfix window
nnoremap <silent> <buffer> gq :<c-u>call qf#window#close()<cr>