let g:PymodeSigns = {}


fun! pymode#tools#signs#init() "{{{
    call g:PymodeSigns.setup()
endfunction "}}}


fun! g:PymodeSigns.enabled() "{{{
    return (g:pymode_lint_signs && has('signs'))
endfunction "}}}


fun! g:PymodeSigns.setup() "{{{
    if self.enabled()
        execute 'sign define PymodeW text=' . g:pymode_lint_todo_symbol     . " texthl=Todo"
        execute 'sign define PymodeD text=' . g:pymode_lint_docs_symbol     . " texthl=String"
        execute 'sign define PymodeC text=' . g:pymode_lint_comment_symbol  . " texthl=Comment"
        execute 'sign define PymodeR text=' . g:pymode_lint_visual_symbol   . " texthl=Visual"
        execute 'sign define PymodeE text=' . g:pymode_lint_error_symbol    . " texthl=Error"
        execute 'sign define PymodeI text=' . g:pymode_lint_info_symbol     . " texthl=Info"
        execute 'sign define PymodeF text=' . g:pymode_lint_pyflakes_symbol . " texthl=Info"
    endif
    let self._sign_ids = []
    let self._next_id = 10000
    let self._messages = {}
endfunction "}}}


fun! g:PymodeSigns.refresh(loclist) "{{{
    if self.enabled()
        call self.clear()
        call self.place(a:loclist)
    endif
endfunction "}}}


fun! g:PymodeSigns.clear() "{{{
    let ids = copy(self._sign_ids)
    for i in ids
        execute "sign unplace " . i
        call remove(self._sign_ids, index(self._sign_ids, i))
    endfor
endfunction "}}}


fun! g:PymodeSigns.place(loclist) "{{{
    let seen = {}
    for issue in a:loclist._loclist
        if !has_key(seen, issue.lnum)
            let seen[issue.lnum] = 1
            call add(self._sign_ids, self._next_id)
            execute printf('sign place %d line=%d name=%s buffer=%d', self._next_id, issue.lnum, "Pymode".issue.type[0], issue.bufnr)
            let self._next_id += 1
        endif
    endfor
endfunction "}}}
