#!/bin/sh
. "`functions.locate`" || exit -1
_Version=0.01

test -r "$_RC" && . "$_RC" || :
export LC_ALL="${LANG%%.*}.UTF-8"
export LANG="${LANG%%.*}.UTF-8"

__Message() { # message [title]
  Xdialog --left --cr-wrap --wrap --title "${2:-INFO}" --infobox "$1" "" "512" "30000"
}


# Exit with optional message printing and return value
Exit() { # [message] [return]
  _Error "${1:-Работа прервана}" $2
  exit $2
}

# Read at least Number lines displaying a progress bar from 0 to Number
Progress() { # Message Number
  ( trap '' PIPE; while read; do echo "." 2>/dev/null; done ) |
  Xdialog --progress "$1" "" "" "$2"
}

Combo() { # title subtitle choice [choice ...]
  local t="$1"
  local s="$2"
  shift; shift
  Xdialog --stdout --title "$t" --combobox "$s" "" "" "$@"
}

Range() {
  Xdialog --stdout --title "$1" --rangebox "$2" "" "" "$3" "$4" "$5"
}

Radio() {
  local t="$1"
  local s="$2"
  shift; shift
  Xdialog --stdout --title "$t" --radiolist "$s" "" "" "$((($#/3)+1))" "$@"
}

YesNo() {
  Xdialog --stdout --title "$1" --yesno "$2" "" ""
}

PickFile() {
  Xdialog --stdout --title "$1" --backtitle "$2" --fselect "" "" ""
}

# select or generate catalog with frames or multygif
D="`PickFile "Выбор файла или каталога" "Выберите каталог с кадрами или многослойное изображение"`" || {
  YesNo "Пример кадров" "Создать каталог с примером кадров $HOME/example ?" && {
    multover_create_example "$HOME/example" 16 | Progress "Создание примера" 16
    D="$HOME/example"
  } || Exit
}

_TmpDir Source
if [ -d "$D" ]
then	# Directory
  N="`identify "$D"/*`" ||
    _Error "Недопустимые файлы в каталоге: `identify "$D"/* 2>&1 >/dev/null`"
  test `echo "$N" | sort -u -k3,3 | wc -l` -eq 1 ||
    _Msg "Кадры разного размера:
$N"
  FNum="$(ls "$D"/* | wc -l)"
  cp -v "$D"/* "$Source"/ | Progress "Копирование файлов" "$FNum"
elif [ -f "$D" ]
then	# File
  FNum="$(identify "$D" 2>/dev/null | wc -l)"
  test "$FNum" -gt 1 ||
    _Error "Изображение '$D' содержит мало ($FNum) кадров"
  convert "$D" -verbose "$Source/frame_%03d.png" |
    Progress "Разбиение изображения на кадры" "$FNum"
else
  _Error "Невозможно преобразовать '$D' в мультфильм"
fi

FNum="$(ls "$Source"/* | wc -l)"

# select output directory
if [ -w "$(dirname $D)" ]; then Target="$(dirname $D)"
elif [ -d "$HOME/Desktop"]; then Target="$HOME/Desktop"
else Target="$HOME"
fi

# select output filename
Outname="$(basename "$D")"; Outname="${Outname%.*}".avi

_TmpDir Dest
_TmpFile Preview
W=640; H=480; FPS=5
#TRY:
while true
do
  # select output size
  WH="$(Combo	"Размер кадра в мультфильме" \
  		"Установите размер кадра в мультфильме" \
		"640x480" "320x200" "720x576" )" || Exit
  W="${WH%%x*}"; H="${WH##*x}"
  # resize all + adjust depth
  # pity that ImageMagick refuses io _increase_ depth!
  convert "$Source"/* -resize "$W"x"$H"'!' \
  	-depth 24 -quality 100 -treedepth 2 -verbose "$Dest/frame%03d.jpg" |
	Progress "Преобразование кадорв" "$FNum"
  # select FPS
  FPS="$(Range	"Частота кадров" \
  		"Введите частоту смены кадров" \
		"1" "25" "$FPS" )" || Exit
  # create a preview and show it
  # TODO hardwired aspect 4:3
  # TODO Error hadnling along with progress
  mencoder -o "$Preview" "mf://$Dest/frame*.jpg" -v \
  	-mf fps="$FPS":type=jpg -ovc lavc 2>&1 | grep "^Pos:" |
	Progress "Создание мультфильма" "$FNum"
  # show preview until user decide to use it or to drop it
  while true
  do
    Res="$(Radio "Предвариетльный просмотр" \
    	"Предварительный просмотр мультфильма. Выберите, что делать дальше." \
	"1" "посмотреть предварительную версию мультфильма" "on" \
	"2" "переделать мультфильм" "" \
	"3" "собрать окончательную версию мультфильма $Outname" "")" || Exit
    case "$Res" in
      1) sleep 1; mplayer "$Preview"; sleep 1;;
      *) break;;
    esac
  done
  test "$Res" -ne "3" || break
  rm -f "$Dest"/*
done

# resample with 24 FPS , proper ratio etc.
# TODO hardwired aspect 4:3
# TODO Error hadnling along with progress
mencoder -o "$Target/$Outname" "mf://$Dest/frame*.jpg" -v \
	-mf fps="$FPS":type=jpg -ovc lavc -ofps 25 2>&1 | grep "^Pos:" |
	Progress "Создание мультфильма" "$FNum"

sleep 1; mplayer "$Target/$Outname"
