294 lines
12 KiB
Plaintext
294 lines
12 KiB
Plaintext
## модуль sms работает только в паре с модулем 7dots.rpy 2022 года
|
||
## для работы модуля нужно на экран "say" добавить строку:
|
||
## on "show" action SMSAdd(what)
|
||
|
||
# показать телефон на экране
|
||
# who - имя собеседника в шапке
|
||
# clear - очистить сообщения
|
||
# $ sms_show(who=None, clear=False)
|
||
|
||
# убрать телефон с экрана
|
||
# $ sms_hide()
|
||
|
||
# очистить экран телефона
|
||
# $ sms_clear()
|
||
|
||
# персонажи для переписки, собеседник
|
||
# $ sms_oksana = SMSL(_("Оксана Ш."))
|
||
|
||
# это слова получателя
|
||
# $ sms_r = SMSR(_("Я"))
|
||
|
||
# сервисные сообщения
|
||
# $ sms_c = SMSC(_("Системное сообщение"))
|
||
|
||
# имена лучше задавать, хоть их и не видно, для сохранения в истории
|
||
|
||
# чтобы переместить телефон, нужно поменять переменную:
|
||
# sms_trans = [align(.15, .5), rotate(-2.5, False)]
|
||
|
||
## НАСТРАИВАЕМЫЕ ПАРАМЕТРЫ
|
||
init python:
|
||
|
||
# размеры всего телефона
|
||
phone_w, phone_h = 500, 960
|
||
|
||
# размеры экрана телефона
|
||
scr_w, scr_h = 480, 860
|
||
|
||
# высота статичных участков (шапка и меню)
|
||
scr_top_h = 80
|
||
scr_bottom_h = 80
|
||
|
||
# цвет фона для шапки
|
||
scr_top_color = "#004472"
|
||
|
||
# фон экрана телефона
|
||
scr_bg = "#fff"
|
||
|
||
# максимальная ширина пузыря с сообщением
|
||
sms_w = 380
|
||
|
||
# если ширина/высота единственной в сообщении картинки больше этих,
|
||
# то картинка преобразуется в прикреплённое фото
|
||
sms_min_w, sms_min_h = 200, 200
|
||
|
||
# цвета фона
|
||
sms_left_bg_color = "#09f"
|
||
sms_right_bg_color = "#e5e5ea"
|
||
sms_center_bg_color = "#0000"
|
||
|
||
# цвета текста
|
||
sms_left_text_color = "#fff"
|
||
sms_right_text_color = "#000"
|
||
sms_center_text_color = "#aaa"
|
||
|
||
# шрифт
|
||
sms_text_size = 28
|
||
sms_text_font = "gui/fonts/Roboto-Regular.ttf"
|
||
|
||
# отступы текста sms от краёв пузырей
|
||
sms_xpadding, sms_ypadding = 24, 12
|
||
|
||
# отступы пузырей sms от краёв экрана
|
||
sms_xmargin, sms_ymargin = 24, 4
|
||
|
||
# фиксированные углы для пузырей с сообщениями (для Frame)
|
||
sms_corner_w, sms_corner_h = 16, 16
|
||
|
||
# трансформ для окна с телефоном
|
||
# например, можно задать положение
|
||
sms_trans = [align(.15, .5), rotate(-2.5, False)]
|
||
|
||
|
||
|
||
## остальное лучше не менять
|
||
|
||
# показать телефон на экране
|
||
def sms_show(who=None, clear=False):
|
||
if not sms_current_style:
|
||
store.sms_current_style = "sms_center"
|
||
if who is not None:
|
||
store.sms_who = who
|
||
# если нужно, очистить сообщения
|
||
if clear:
|
||
sms_clear()
|
||
renpy.show_screen("sms", _layer="master")
|
||
|
||
# убрать телефон с экрана
|
||
def sms_hide():
|
||
renpy.hide_screen("sms", layer="master")
|
||
|
||
# очистить экран телефона
|
||
def sms_clear():
|
||
store.sms_all = []
|
||
renpy.restart_interaction()
|
||
|
||
# текущее время читателя
|
||
def time_now():
|
||
return datetime.datetime.now().strftime("%H:%M")
|
||
|
||
init:
|
||
# стиль для фрейма с телефоном
|
||
style phone_window is empty:
|
||
xysize(phone_w, phone_h)
|
||
background None
|
||
foreground Frame("phone skin", 0, 0)
|
||
|
||
# стиль конкретно для экрана телефона
|
||
style scr_frame is empty:
|
||
xysize(scr_w, scr_h)
|
||
background Frame(scr_bg, 0, 0)
|
||
align(.5, .5)
|
||
|
||
# стиль для шапки с именем абонента
|
||
style top_frame is empty:
|
||
xysize(scr_w, scr_top_h)
|
||
background scr_top_color
|
||
foreground Frame("phone top", 0, 0)
|
||
align(.5, .0)
|
||
|
||
# стиль для подвала с псевдо-полем ввода
|
||
style bottom_frame is empty:
|
||
xysize(scr_w, scr_bottom_h)
|
||
background Frame("phone bottom", 0, 0)
|
||
align(.5, 1.)
|
||
|
||
# стиль для sms от собеседника
|
||
style sms_left is frame:
|
||
background Frame(At("phone mask", color(sms_left_bg_color)), sms_corner_w, sms_corner_h)
|
||
xmaximum sms_w
|
||
xpadding sms_xpadding
|
||
ypadding sms_ypadding
|
||
xmargin sms_xmargin
|
||
ymargin sms_ymargin
|
||
xalign .0
|
||
|
||
# стиль для sms от получателя
|
||
style sms_right is sms_left:
|
||
background Frame(At("phone mask", color(sms_right_bg_color)), sms_corner_w, sms_corner_h)
|
||
xalign 1.
|
||
|
||
# стиль для сервисных сообщений
|
||
style sms_center is sms_left:
|
||
background None
|
||
xmaximum scr_w
|
||
xalign .5
|
||
|
||
# стили для текста сообщений
|
||
style sms_left_text is text:
|
||
font sms_text_font
|
||
size sms_text_size
|
||
color sms_left_text_color
|
||
text_align .0
|
||
|
||
style sms_right_text is sms_left_text:
|
||
color sms_right_text_color
|
||
|
||
style sms_center_text is sms_left_text:
|
||
color sms_center_text_color
|
||
|
||
init -1 python:
|
||
# листать вниз при добавлении сообщений
|
||
yadjValue = float("inf")
|
||
yadj = ui.adjustment()
|
||
|
||
# все sms в формате кортежей (стиль, текст)
|
||
sms_all = []
|
||
|
||
# здесь будет храниться стиль текущего сообщения
|
||
sms_current_style = ""
|
||
|
||
from functools import partial
|
||
|
||
# определяем стиль текущего персонажа
|
||
def call_style(smsstyle, event_name, *args, **kwarg):
|
||
if event_name == "begin":
|
||
store.sms_current_style = smsstyle
|
||
# если это sms, то пикаем
|
||
if smsstyle in sms_beep_styles:
|
||
splay("new_message", ext="mp3")
|
||
|
||
# функция с параметрами в качестве одного параметра
|
||
def sms_style(*args, **kwarg):
|
||
return partial(call_style, *args, **kwarg)
|
||
|
||
# заготовки для невидимых на экране персонажей
|
||
def SMS(narrator=None, smsstyle="sms_center", *args, **kwarg):
|
||
return Character(narrator=narrator, window_style="empty", window_yoffset=config.screen_height, statement_name="say-centered", callback=sms_style(smsstyle), *args, **kwarg)
|
||
def SMSL(narrator=None, *args, **kwarg):
|
||
return SMS(narrator, "sms_left", *args, **kwarg)
|
||
def SMSR(narrator=None, *args, **kwarg):
|
||
return SMS(narrator, "sms_right", *args, **kwarg)
|
||
def SMSC(narrator=None, *args, **kwarg):
|
||
return SMS(narrator, *args, **kwarg)
|
||
|
||
sms_beep_styles = ["sms_left", "sms_right"]
|
||
|
||
# читаем сообщение, чтобы вывести на экран в общей куче
|
||
def sms_add(what=None):
|
||
# добавляем сообщение в список сообщений на экране
|
||
if what is not None and sms_current_style is not None:
|
||
store.sms_all.append((sms_current_style, what))
|
||
# если это не системное сообщение, то пикаем
|
||
if style in sms_beep_styles:
|
||
splay("new_message")
|
||
SMSAdd = renpy.curry(sms_add)
|
||
|
||
# не будет работать с пробелами, типа такого: "{ image = smile }"
|
||
# если вместо текста только картинка, то показать её с закруглёнными краями, а не пузырь
|
||
def sms_image(i_style, i_text):
|
||
if "{image=" in i_text.replace(" ", "") and not del_tags(i_text, ""):
|
||
imgs = get_tags(i_text, "image")
|
||
if imgs:
|
||
key = list(imgs.keys())
|
||
if len(key) == 1:
|
||
img = imgs[key[0]]
|
||
w, h = get_size(img)
|
||
# если картинка больше указанных в настройках размеров
|
||
if w >= sms_min_w or h >= sms_min_h:
|
||
# вписываем картинку в сообщение
|
||
if w > h:
|
||
z = sms_w / w
|
||
else:
|
||
z = sms_h / h
|
||
img = Transform(img, zoom=z)
|
||
w2, h2 = int(w * z), int(h * z)
|
||
# скругляем края
|
||
mask = Frame("phone mask", sms_corner_w, sms_corner_h, xysize=(w2, h2))
|
||
return AlphaMask(img, mask)
|
||
return None
|
||
|
||
# экран телефона
|
||
screen sms():
|
||
$ yadj.value = yadjValue
|
||
# окно с телефоном
|
||
frame:
|
||
style "phone_window"
|
||
at sms_trans
|
||
# фрейм с экраном телефона
|
||
frame:
|
||
style "scr_frame"
|
||
# стопочкой шапка, смски и подвал
|
||
vbox:
|
||
xfill True
|
||
yfill True
|
||
# шапка с абонентом
|
||
frame:
|
||
style "top_frame"
|
||
# имя абонента
|
||
text sms_who style "sms_center_text" align(.5, .7) color sms_who_color
|
||
# смски с прокруткой
|
||
viewport:
|
||
id "sms_vp"
|
||
# размеры окна прокрутки с учетом шапки и подвала
|
||
xysize(scr_w, scr_h - scr_top_h - scr_bottom_h)
|
||
xinitial 1.
|
||
yfill False
|
||
mousewheel True
|
||
draggable True
|
||
side_xfill True
|
||
transclude
|
||
# перематываем в конец
|
||
yadjustment yadj
|
||
# стопочкой все сообщения
|
||
vbox:
|
||
xfill True
|
||
for i_style, i_text in sms_all:
|
||
# если это единственная картинка больше пузыря
|
||
$ img = sms_image(i_style, i_text)
|
||
if img:
|
||
# вписываем её в пузырь
|
||
frame:
|
||
style i_style
|
||
xpadding 0
|
||
ypadding 0
|
||
background None
|
||
add img
|
||
# иначе просто выводим текст в пузыре
|
||
else:
|
||
textbutton i_text style i_style
|
||
# подвал с псевдо-полем ввода
|
||
frame:
|
||
style "bottom_frame"
|