" =============================================================================
" Filename: autoload/screensaver/source/helloworld.vim
" Author: itchyny
" License: MIT License
" Last Change: 2015/02/18 10:08:05.
" =============================================================================

let s:save_cpo = &cpo
set cpo&vim

function! screensaver#source#helloworld#new() abort
  return deepcopy(s:self)
endfunction

let s:self = {}
let s:self.message = 'Hello, world!'

" Actions when the screensaver starts.
function! s:self.start() dict abort
  let self.i = winheight(0) / 2
  let self.j = winwidth(0) / 2
  let self.di = 1
  let self.dj = 2
  call setline(1, repeat([''], winheight(0)))
endfunction

" Actions when the screensaver redraws.
function! s:self.redraw() dict abort
  call setline(self.i, '')
  let self.i += self.di
  let self.j += self.dj
  if self.di > 0 && self.i - 1 >= winheight(0) || self.di < 0 && self.i <= 1
    let self.di = - self.di
    let self.i += self.di * 2
  endif
  if self.dj > 0 && self.j + s:strdisplaywidth(self.message) >= winwidth(0) || self.dj < 0 && self.j <= 1
    let self.dj = - self.dj
    let self.j += self.dj * 2
  endif
  call setline(self.i, repeat(' ', self.j) . self.message)
endfunction
let s:strdisplaywidth = exists('*strdisplaywidth') ? function('strdisplaywidth') : function('strwidth')

" Actions when the screensaver exists.
function! s:self.end() dict abort
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo