import runtime
import utils
import config
from basemodel import Stage
from baseui import BaseUI
import uiconfig
import mmscomposestage
from mmsmanager import mmsmgr
import os
def Get_SlideInfo(smil):
import mmssmilparser
rootlayout, region, par = mmssmilparser.setsmil(smil)
return par
class PlayUI(BaseUI):
def __init__(self, msg, fname, mode, title):
self.msg = msg
self.replay = False
self.mode = mode
self.rootlayout = []
self.region = []
self.par = []
self.mms_image = None
self.up_img = None
self.down_img = None
self.snd_id = None
try:
if self.mode == False:
leftname = ''
else:
leftname = _('OPTIONS')
BaseUI.__init__(self, leftname, _('BACK'), title)
import mmssmilparser
self.rootlayout, self.region, self.par = mmssmilparser.setsmil(fname)
except:
pass
self.ori_par = self.par
if self.par != []:
self.Player()
def destroy(self):
self.kill_all()
BaseUI.destroy(self)
def restart(self):
if self.par != []:
if self.cur_slide != 0:
for z in range(self.npar - self.cur_slide, 0, -1):
tmp_list = self.par.pop(0)
self.par.append(tmp_list)
self.cur_slide = 0
self.Player()
def Player(self):
self.videoplay_pid = None
self.npar = len(self.par) # slide count
self.imgfit_value = ''
self.message_list = []
self.img_rg = []
self.vdo_rg = []
self.txt_rg = []
self.txt_list = []
self.txt_point = 0
self.nline = 0
self.cur_slide = 0 # now slide
self.m_list = [] # each line's text list
self.vdoever = None
self.bvideo_play = False
try:
self.rw = self.trans_unit(self.rootlayout['width'], 256) #player region
self.rh = self.trans_unit(self.rootlayout['height'], 192)
except:
self.rw = 256
self.rh = 192
if self.rw > 256:
x_diff = self.rw - 256
self.rh = self.rh - self.rh * x_diff / self.rw
self.rw = 256
if self.rh > 192:
y_diff = self.rh - 192
self.rw = self.rw - self.rw * y_diff / self.rh
self.rh = 192
self.rx = 32 + (256 - self.rw) / 2
self.ry = 24 + (192 - self.rh) / 2
self.pMain()
def par_queue(self):
if self.npar - 1 > self.cur_slide:
self.cur_slide = self.cur_slide + 1
else:
if self.mode == False:
self.set_left(_('REPLAY'))
if self.par[0][2] != {}:
self.aud_stop()
if self.par[0][4] != {}:
self.video_stop(True)
return
if self.par[0][1] != {}:
self.img_hide()
elif self.par[0][4] != {}:
self.video_stop()
if self.par[0][3] != {}:
self.txt_hide()
self.txt_free()
if self.par[0][2] != {}:
self.aud_stop()
self.txt_list = []
tmp_list = self.par.pop(0)
self.par.append(tmp_list)
self.pMain()
def txt_free(self):
if self.m_list != []:
for z in self.m_list:
for zz in z:
if type(zz) == list:
zz[0].free()
else:
zz.free()
if self.up_img != None:
self.up_img.free()
if self.down_img != None:
self.down_img.free()
def txt_hide(self):
if self.m_list != []:
for z in self.m_list[self.txt_point:self.txt_point+ self.nline]:
for zz in z:
if type(zz) == list:
zz[0].hide()
else:
zz.hide()
if self.up_img != None:
self.up_img.hide()
if self.down_img != None:
self.down_img.hide()
runtime.evas.render()
def img_hide(self):
if self.mms_image != None:
self.mms_image.hide()
self.mms_image.free()
runtime.evas.render()
def aud_stop(self):
if self.snd_id != None:
utils.player.stop(self.snd_id)
def video_stop(self, last = False):
if self.bvideo_play == False:
return
os.system('fb0top 1')
if self.videoplay_pid:
utils.player.stop(self.videoplay_pid)
self.videoplay_pid = None
self.bvideo_play = True
if last:
y, x, sy, sx = self.vdo_pos
self.vdoever = utils.put_image(uiconfig.image_image_sound_video_icon[0], (x + (sx - x)/2 - 36 - 20, y + (sy - y)/2 - 36))
def video_play(self):
startx = self.rx + self.trans_unit(self.vdo_rg['left'], self.rw)
starty = self.ry + self.trans_unit(self.vdo_rg['top'], self.rh)
video_Width = self.trans_unit(self.vdo_rg['width'], self.rw)
video_Height = self.trans_unit(self.vdo_rg['height'], self.rh)
vdo_right = startx + video_Width
vdo_bottom = starty + video_Height
if vdo_bottom > 216:
vdo_bottom = 216
if vdo_right > 298:
vdo_right = 298
if starty%2 == 1:
starty = starty + 1
if vdo_bottom%2 == 1:
vdo_bottom += 1
self.vdo_pos = (starty, startx + 40, vdo_bottom, vdo_right)
vdo_fname = self.msg[self.cur_slide].fname_video
if vdo_fname:
vdo_fname = vdo_fname.replace('cid:','')
else:
return
if vdo_fname.endswith('3gp'):
self.bvideo_play = True
else:
return
os.system('fb0top 0')
self.videoplay_pid = utils.player.play(vdo_fname, videopos = self.vdo_pos, loop=False)
if self.vdo_tend != 0:
self.vdot2 = utils.Timer(self.vdo_tend, self.video_stop)
def img_play(self):
try:
imgrg_Width = self.trans_unit(self.img_rg['width'], self.rw)
imgrg_Height = self.trans_unit(self.img_rg['height'], self.rh)
img_fname = str(self.msg[self.cur_slide].fname_image)
img_fname = img_fname.replace('cid:','')
tmp_w, tmp_h = utils.get_img_size(img_fname)
if tmp_w * tmp_h > 640 * 480:
img_fname = '/usr/local/lgvp/images/image_big.png'
if self.imgfit_value == 'fill':
self.mms_image = utils.put_image_sized(img_fname,
(self.rx + self.trans_unit(self.img_rg['left'], self.rw), self.ry + self.trans_unit(self.img_rg['top'], self.rh)),
(imgrg_Width, imgrg_Height))
else:
img_fname = utils.changefile_gif(img_fname)
image = runtime.evas.image(file=img_fname)
w, h = image.size_get()
image.free()
if imgrg_Width < w:
imgratio = w / float(w -imgrg_Width)
w = imgrg_Width
h = int(h - h/imgratio)
if imgrg_Height < h:
imgratio = h / float(h - imgrg_Height)
h = imgrg_Height
w = int(w-w/imgratio)
ictrx = (imgrg_Width - w) /2
ictry = (imgrg_Height - h) /2
self.mms_image = utils.put_image(img_fname,
(self.rx + self.trans_unit(self.img_rg['left'], self.rw) + ictrx, self.ry + self.trans_unit(self.img_rg['top'], self.rh) + ictry),
[w, h])
except:
self.mms_image = runtime.evas.text(text='Image error', font=('Vera',15), pos=(80, 60), color=(0,0,0,128))
self.mms_image.show()
self.mms_image.layer = -11
runtime.evas.render()
if self.img_tend != 0 and self.npar - 1 != self.cur_slide:
self.imgt2 = utils.Timer(self.img_tend, self.img_hide)
def aud_play(self):
try:
aud_fname = str(self.msg[self.cur_slide].fname_sound)
aud_fname = aud_fname.replace('cid:','')
self.snd_id = utils.player.play(aud_fname, False)
except:
pass
if self.aud_tend != 0:
self.audt2 = utils.Timer(self.aud_tend, self.aud_stop)
def txt_play(self):
yindex = 0
for z in self.m_list[self.txt_point:self.txt_point+ self.nline]:
for zz in z:
if type(zz) == list:
xp, yp = zz[0].pos
zz[0].pos = xp, self.ry + 2 + 27*yindex + self.trans_unit(self.txt_rg['top'], self.rh)
zz[0].show()
else:
xp, yp = zz.pos
zz.pos = xp, self.ry + 8 + 27*yindex + self.trans_unit(self.txt_rg['top'], self.rh)
zz.show()
yindex = yindex + 1
self.up_img = utils.put_image(uiconfig.up_arrow,
(self.rx + self.trans_unit(self.txt_rg['width'], self.rw)+ self.trans_unit(self.txt_rg['left'], self.rw),self.ry + self.trans_unit(self.txt_rg['top'], self.rh)))
self.down_img = utils.put_image(uiconfig.down_arrow,
(self.rx + self.trans_unit(self.txt_rg['width'], self.rw)+ self.trans_unit(self.txt_rg['left'], self.rw), self.ry + yindex*25 + self.trans_unit(self.txt_rg['top'], self.rh)))
if self.txt_point != 0:
self.up_img.show()
else:
self.up_img.hide()
if self.txt_point + self.nline < len(self.m_list):
self.down_img.show()
else:
self.down_img.hide()
runtime.evas.render()
if self.txt_tend != 0 and self.npar - 1 != self.cur_slide:
self.txtt2 = utils.Timer(self.txt_tend, self.txt_hide)
def trans_time(self, tvalue):
if str(tvalue).endswith('ms'):
if int(str(tvalue).replace('ms','')) < 3600000:
return int(str(tvalue).replace('ms',''))
elif str(self.par[0][0]['dur']).endswith('s'):
if int(str(tvalue).replace('s',''))* 1000 < 3600000:
return int(str(tvalue).replace('s',''))* 1000
return 3600000
def trans_unit(self, unit, woh):
if str(unit).endswith('px'):
if int(str(unit).replace('px','')) > woh:
return woh
return int(str(unit).replace('px',''))
elif str(unit).endswith('%'):
return woh*int(str(unit).replace('%',''))/100
else:
return int(unit)
def pMain(self):
img_tbegin = 0
vdo_tbegin = 0
txt_tbegin = 0
aud_tbegin = 0
self.txt_point = 0
if self.par[0][0].has_key('dur') == True:
tdur = self.trans_time(self.par[0][0]['dur'])
else:
tdur = 5000
if self.par[0][3] != {}:
self.txt_list = []
for i in self.region:
if i['id'] == self.par[0][3]['region']:
self.txt_rg = i
break
if self.txt_rg.has_key('top') == False:
self.txt_rg['top'] = 0
if self.txt_rg.has_key('left') == False:
self.txt_rg['left'] = 0
if self.par[0][3].has_key('begin') == True:
txt_tbegin = self.trans_time(self.par[0][3]['begin'])
if self.par[0][3].has_key('dur') == True:
self.txt_tend = self.trans_time(self.par[0][3]['dur'])
elif self.par[0][3].has_key('end') == True:
self.txt_tend = self.trans_time(self.par[0][3]['end'])
else:
self.txt_tend = 0
x_width = self.trans_unit(self.txt_rg['width'], self.rw)
start_xpos = self.trans_unit(self.txt_rg['left'], self.rw)
effect_text = []
inserted_text = []
txt_type = 'text/plain'
txt_fname = str(self.msg[self.cur_slide].fname_text)
txt_fname = txt_fname.replace('cid:',"")
try:
if txt_type == 'text/plain':
f = open(txt_fname)
ftmp = [('h3'), f.read()]
inserted_text.append(ftmp)
else:
import mmsxhtmlparser
effect_text, inserted_text = mmsxhtmlparser.setsmil(txt_fname)
except:
inserted_text.append( [('h3'),'Text error'])
for index, (x, y) in enumerate(inserted_text):
ni = 0
new_y = []
for yi in range(len(y)):
if ni > yi:
continue
for uistr, img, e in uiconfig.emoticons:
if y[yi:yi+2] == e:
if yi != 0:
new_y.append(y[ni:yi])
ni = yi + 2
new_y.append([img, e])
break
elif y[yi:yi+3] == e:
if yi != 0:
new_y.append(y[ni:yi])
ni = yi + 3
new_y.append([img, e])
break
else:
new_y.append(y[ni:])
inserted_text[index][1] = new_y
self.m_list = []
self.message_list = []
self.nline = self.trans_unit(self.txt_rg['height'], self.rh)/25
str_width = 0
wpoint = 0
for x in inserted_text:
fontsize = 13
hcolor = uiconfig.entry_color
hf = uiconfig.def_font
alignL = False
alignC = False
hfont = hf, fontsize
yy = ''
for y in x[1]:
if type(y) != list:
for y2 in range(0,len(y),8):
yy = yy + y[y2:y2+8]
if yy.find('\n') != -1:
ccf = yy.count('\n')
for z in range(ccf):
if yy.find('\n') == 0:
self.message_list.append((' ', hfont, (self.rx + 3 + start_xpos + wpoint, 0), hcolor))
self.m_list.append(self.message_list)
self.message_list = []
wpoint = 0
yy = yy[1:]
continue
self.message_list.append((yy[:yy.find('\n')], hfont, (self.rx + 3 + start_xpos + wpoint, 0), hcolor))
self.m_list.append(self.message_list)
self.message_list = []
wpoint = 0
yy = yy[yy.find('\n')+1:]
continue
message = runtime.evas.text(text = yy,font = hfont )
str_width = message.geometry[2]
message.free()
message = None
if x_width - wpoint - str_width < 11:
txt_index = 1
while True:
message = runtime.evas.text(text = yy[:-txt_index],font = hfont)
str_width = message.geometry[2]
message.free()
message = None
if x_width - wpoint - str_width < 11:
if txt_index == 7:
if self.message_list == []:
self.m_list.append([(yy[:-txt_index], hfont, (self.rx + 3 + start_xpos + wpoint, 0), hcolor)])
else:
self.message_list.append((yy[:-txt_index] , hfont,(self.rx + 3 + start_xpos + wpoint, 0), hcolor))
self.m_list.append(self.message_list)
self.message_list = []
wpoint = 0
yy = yy[-txt_index:]
break
else:
txt_index += 1
continue
else:
if txt_index == 1:
tmpLine = yy
yy = ''
else:
tmpLine = yy[:-(txt_index-1)]
yy = yy[-(txt_index-1):]
if self.message_list == []:
self.m_list.append([(tmpLine, hfont, (self.rx + 3 + start_xpos + wpoint, 0), hcolor)])
else:
self.message_list.append((tmpLine , hfont,(self.rx + 3 + start_xpos + wpoint, 0), hcolor))
self.m_list.append(self.message_list)
self.message_list = []
wpoint = 0
break
else:
if str_width != 0:
message = runtime.evas.text(text = yy,font = hfont)
self.message_list.append((yy, hfont,(self.rx + 3 + start_xpos + wpoint, 0), hcolor))
wpoint = wpoint + message.geometry[2]
message.free()
message = None
yy=''
else:
if x_width - wpoint - 35 < 11:
wpoint = 0
self.m_list.append(self.message_list)
self.message_list = []
self.message_list.append([(str(y[0]), (self.rx + 5 + start_xpos + wpoint, 0))])
wpoint = wpoint + 35
wpoint = wpoint + 10
if self.message_list != []:
if self.message_list[0][0] != '':
self.m_list.append(self.message_list)
evas_txt = []
for z in self.m_list:
evas_txt_line = []
for zz in z:
if type(zz) == tuple:
evas_txt_line.append(runtime.evas.text(text = zz[0], font = zz[1], pos = zz[2], color = zz[3]))
else:
im = utils.put_image(*zz[0])
evas_txt_line.append([im])
im.hide()
evas_txt.append(evas_txt_line)
self.m_list = evas_txt
if alignC == True:
for z in self.m_list:
total_width = 0
cblank = 0
if type(z[0]) != list:
for x in z[0].text_get():
if x != ' ':
break
cblank = cblank + 1
for zz in z:
if type(zz) == list:
wrtn_width = zz[0].geometry[2]
else:
wrtn_width = zz.geometry[2]
total_width = total_width + wrtn_width
for zz in z:
if type(zz) == list:
xp, yp = zz[0].pos
zz[0].pos = xp - 6 * cblank + (self.trans_unit(self.txt_rg['width'], self.rw) - total_width) / 2, yp
else:
xp, yp = zz.pos
zz.pos = xp - 6 * cblank + (self.trans_unit(self.txt_rg['width'], self.rw) - total_width) / 2, yp
elif alignL == True:
for z in self.m_list:
cblank = 0
if type(z[0]) != list:
for x in z[0].text_get():
if x != ' ':
break
cblank = cblank + 1
for zz in z:
if type(zz) == list:
xp, yp = zz[0].pos
zz[0].pos = xp - 6*cblank, yp
else:
xp, yp = zz.pos
zz.pos = xp - 6*cblank, yp
if self.par[0][5] != {}:
pass
if self.par[0][1] != {}:
for i in self.region:
if i['id'] == self.par[0][1]['region']:
self.img_rg = i
if self.par[0][1].has_key('fit') == True:
self.imgfit_value = str(self.par[0][1]['fit'])
elif i.has_key('fit'):
self.imgfit_value = i['fit']
else:
self.imgfit_value = ''
if self.img_rg.has_key('top') == False:
self.img_rg['top'] = 0
if self.img_rg.has_key('left') == False:
self.img_rg['left'] = 0
break
if self.par[0][1].has_key('begin') == True:
img_tbegin = self.trans_time(self.par[0][1]['begin'])
if self.par[0][1].has_key('dur') == True:
self.img_tend = self.trans_time(self.par[0][1]['dur'])
elif self.par[0][1].has_key('end') == True:
self.img_tend = self.trans_time(self.par[0][1]['end']) #end를 기준으로
else:
self.img_tend = 0
elif self.par[0][4] != {}: #video
for i in self.region:
if i['id'] == self.par[0][4]['region']:
self.vdo_rg = i
break
if self.vdo_rg.has_key('top') == False:
self.vdo_rg['top'] = 0
if self.vdo_rg.has_key('left') == False:
self.vdo_rg['left'] = 0
if self.par[0][4].has_key('begin') == True:
vdo_tbegin = self.trans_time(self.par[0][4]['begin'])
if self.par[0][4].has_key('dur') == True:
self.vdo_tend = self.trans_time(self.par[0][4]['dur'])
elif self.par[0][4].has_key('end') == True:
self.vdo_tend = self.trans_time(self.par[0][4]['end']) #end를 기준으로
else:
self.vdo_tend = 0
if self.par[0][2] != {}: #sound
if self.par[0][2].has_key('begin') == True:
aud_tbegin = self.trans_time(self.par[0][2]['begin'])
if self.par[0][2].has_key('dur') == True:
self.aud_tend = self.trans_time(self.par[0][2]['dur'])
elif self.par[0][2].has_key('end') == True:
self.aud_tend = self.trans_time(self.par[0][2]['end']) #end를 기준으로
else:
self.aud_tend = 0
if self.par[0][1] != {}:
if img_tbegin == 0: #이미지 타임 적용 플레이
self.img_play()
else:
self.imgt1 = utils.Timer(img_tbegin, self.img_play)
elif self.par[0][4] != {}:
if vdo_tbegin == 0: #비디오 타임 적용 플레이
self.video_play()
else:
self.vdot1 = utils.Timer(vdo_tbegin, self.video_play)
if self.par[0][2] != {}:
if aud_tbegin == 0: #사운드 플레이
self.aud_play()
else:
self.audt1 = utils.Timer(aud_tbegin, self.aud_play)
if self.par[0][3] != {}:
if txt_tbegin == 0: #txt 타임 적용 플레이
self.txt_play()
else:
self.txtt1 = utils.Timer(txt_tbegin, self.txt_play)
self.t = utils.Timer(tdur, self.par_queue)
def kill_all(self):
if self.par != []:
if self.par[0][3] != {}:
self.txt_hide()
self.txt_free()
if self.par[0][2] != {}:
self.aud_stop()
if self.par[0][1] != {}:
self.img_hide()
elif self.par[0][4] != {}:
self.video_stop()
if self.vdoever:
self.vdoever.hide()
self.vdoever.free()
self.imgt1 = None
self.txtt1 = None
self.imgt2 = None
self.txtt2 = None
self.vdot1 = None
self.vdot2 = None
self.t = None
def handle_key(self, key):
if key == 'Up' and self.par[0][3] != {}:
if self.txt_point > 0:
self.txt_hide()
self.txt_point = self.txt_point - 1
self.txt_play()
elif key == 'Down' and self.par[0][3] != {}:
if len(self.m_list) - self.nline > self.txt_point:
self.txt_hide()
self.txt_point = self.txt_point + 1
self.txt_play()
elif key == config.Menu2 or key == config.Menu1: # or key == config.Red:
if key == config.Menu1:
runtime.manager.back_activate()
else:
runtime.manager.back_stage()
def change_title(self, title):
self.set_title(title)
def set_left(self, left, breplay = True):
self.replay = breplay
BaseUI.set_left(self, left)
class PlayStage(Stage):
name = 'play'
def __init__(self, msg, fname, mode = False, title=_('PREVIEW')):
self.title = None
if title:
self.title = title
else:
self.title = _('PREVIEW')
self.fname = fname
self.mode = mode
self.msg = msg
self.is_hide = False
self.ui = PlayUI(self.msg, self.fname, self.mode, self.title)
def handle_key(self, key):
if key in ('Up', 'Down', config.Menu2, config.Red):
return self.ui.handle_key(key)
elif key == config.Menu1 and self.mode == False and self.ui.replay == True:
self.ui.kill_all()
self.ui.set_left('', False)
self.ui.restart()
return
elif key == config.Menu1 and self.mode == True:
return self.ui.handle_key(key)
def show(self):
if self.is_hide == True:
self.ui.restart()
self.is_hide = False
Stage.show(self)
def hide(self):
self.is_hide = True
self.ui.kill_all()
Stage.hide(self)
def change_title(self, title):
self.ui.change_title(title)
self.title = title