from typing import Optional, Iterable, SupportsFloat, List
import webcface.client_data
import webcface.value
import webcface.text
import webcface.view
import webcface.func
import webcface.func_listener
import webcface.log
import webcface.image
import webcface.message
import webcface.canvas2d
import webcface.canvas3d
[docs]
class FieldBase:
_member: str
_field: str
def __init__(self, member: str, field: str = "") -> None:
self._member = member
self._field = field
[docs]
class Field(FieldBase):
_data: "Optional[webcface.client_data.ClientData]"
def __init__(
self,
data: "Optional[webcface.client_data.ClientData]",
member: str,
field: str = "",
) -> None:
super().__init__(member, field)
self._data = data
def _data_check(self) -> "webcface.client_data.ClientData":
if isinstance(self._data, webcface.client_data.ClientData):
return self._data
raise RuntimeError("Cannot access internal data")
def _set_check(self) -> "webcface.client_data.ClientData":
data = self._data_check()
if data.is_self(self._member):
return data
raise ValueError("Cannot set data to member other than self")
@property
def member(self) -> "webcface.member.Member":
"""Memberを返す (ver3.1〜)"""
return webcface.member.Member(self)
@property
def name(self) -> str:
"""field名を返す (ver3.1〜)"""
return self._field
[docs]
def child(self, field: str) -> "Field":
"""「(このFieldの名前).(追加の名前)」を新しい名前とするField (ver3.1〜)
* このFieldの名前が空文字列の場合はピリオドをつけず新しい名前とする。
"""
if self._field == "":
new_field = field
elif field == "":
new_field = self._field
else:
new_field = self._field + "." + field
return Field(self._data, self._member, new_field)
[docs]
def value(self, field: str = "") -> "webcface.value.Value":
"""Valueオブジェクトを生成(ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
return webcface.value.Value(self.child(field))
[docs]
def text(self, field: str = "") -> "webcface.text.Text":
"""Textオブジェクトを生成(ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
return webcface.text.Text(self.child(field))
[docs]
def variant(self, field: str = "") -> "webcface.text.Variant":
"""Variantオブジェクトを生成 (ver2.0〜)"""
return webcface.text.Variant(self.child(field))
[docs]
def image(self, field: str = "") -> "webcface.image.Image":
"""Imageオブジェクトを生成(ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
return webcface.image.Image(self.child(field))
[docs]
def view(self, field: str = "") -> "webcface.view.View":
"""Viewオブジェクトを生成(ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
return webcface.view.View(self.child(field))
[docs]
def canvas2d(
self,
field: str = "",
width: Optional[SupportsFloat] = None,
height: Optional[SupportsFloat] = None,
) -> "webcface.canvas2d.Canvas2D":
"""Canvas2Dオブジェクトを生成(ver3.1〜 / ver3.0までMemberクラスのメソッド)
:arg width, height: Canvas2Dのサイズを指定して初期化する
"""
return webcface.canvas2d.Canvas2D(self, field, width, height)
[docs]
def canvas3d(self, field: str = "") -> "webcface.canvas3d.Canvas3D":
"""Canvas3Dオブジェクトを生成(ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
return webcface.canvas3d.Canvas3D(self.child(field))
[docs]
def log(self, field: str = "default") -> "webcface.log.Log":
"""Logオブジェクトを生成(ver3.1〜 / ver3.0までMemberクラスのメソッド)
:arg field: (ver2.1〜) Logの名前を指定可能(省略すると"default")
"""
return webcface.log.Log(self.child(field))
[docs]
def func(self, arg: str = "", **kwargs) -> "webcface.func.Func":
"""Funcオブジェクトを生成(ver3.1〜 / ver3.0までMemberクラスのメソッド)
#. member.func(arg: str)
* 指定した名前のFuncオブジェクトを生成・参照する。
#. @member.func(arg: str, [**kwargs])
* デコレータとして使い、デコレートした関数を指定した名前でセットする。
* デコレート後、関数は元のまま返す。
#. @member.func([**kwargs])
* 3と同じだが、名前はデコレートした関数から自動で取得される。
2, 3 の場合のkwargsは Func.set() を参照。
"""
return webcface.func.Func(self.child(arg), **kwargs)
[docs]
def func_listener(self, field: str = "") -> "webcface.func_listener.FuncListener":
"""FuncListenerオブジェクトを生成(ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
return webcface.func_listener.FuncListener(self.child(field))
def _entries(self, entries: List[str], store, recurse=True):
prefix_with_sep = self._field + "." if self._field != "" else ""
for e in store.get_entry(self._member):
if self._field == "" or e.startswith(prefix_with_sep):
if not recurse and "." in e[len(prefix_with_sep) :]:
e = e[: e.find(".", len(prefix_with_sep))]
if e not in entries:
entries.append(e)
def _has_entries(self, store) -> bool:
prefix_with_sep = self._field + "." if self._field != "" else ""
for e in store.get_entry(self._member):
if self._field == "" or e.startswith(prefix_with_sep):
return True
return False
[docs]
def children(self, recurse=False) -> "Iterable[webcface.field.Field]":
"""「(thisの名前).(追加の名前)」で公開されているデータをすべて取得する (ver3.1〜)
* データ型を問わずすべてのデータを列挙する。
* recurseがFalseの場合、名前にさらにピリオドが含まれる場合はその前までの名前を返す。
* 同名で複数のデータが存在する場合も1回のみカウントする。
"""
entries: List[str] = []
self._entries(entries, self._data_check().value_store, recurse)
self._entries(entries, self._data_check().text_store, recurse)
self._entries(entries, self._data_check().image_store, recurse)
self._entries(entries, self._data_check().func_store, recurse)
self._entries(entries, self._data_check().view_store, recurse)
self._entries(entries, self._data_check().canvas2d_store, recurse)
self._entries(entries, self._data_check().canvas3d_store, recurse)
self._entries(entries, self._data_check().log_store, recurse)
return map(lambda n: Field(self._data, self._member, n), entries)
[docs]
def has_children(self) -> bool:
"""「(thisの名前).(追加の名前)」で公開されているデータが1つ以上あればtrue (ver3.1〜)"""
return (
self._has_entries(self._data_check().value_store)
or self._has_entries(self._data_check().text_store)
or self._has_entries(self._data_check().image_store)
or self._has_entries(self._data_check().func_store)
or self._has_entries(self._data_check().view_store)
or self._has_entries(self._data_check().canvas2d_store)
or self._has_entries(self._data_check().canvas3d_store)
or self._has_entries(self._data_check().log_store)
)
[docs]
def value_entries(self) -> "Iterable[webcface.value.Value]":
"""「(thisの名前).(追加の名前)」で公開されているvalueをすべて取得する (ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
entries: List[str] = []
self._entries(entries, self._data_check().value_store, True)
return map(lambda n: webcface.value.Value(self, n), entries)
[docs]
def text_entries(self) -> "Iterable[webcface.text.Text]":
"""「(thisの名前).(追加の名前)」で公開されているtextをすべて取得する (ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
entries: List[str] = []
self._entries(entries, self._data_check().text_store, True)
return map(lambda n: webcface.text.Text(self, n), entries)
[docs]
def image_entries(self) -> "Iterable[webcface.image.Image]":
"""「(thisの名前).(追加の名前)」で公開されているimageをすべて取得する (ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
entries: List[str] = []
self._entries(entries, self._data_check().image_store, True)
return map(lambda n: webcface.image.Image(self, n), entries)
[docs]
def view_entries(self) -> "Iterable[webcface.view.View]":
"""「(thisの名前).(追加の名前)」で公開されているviewをすべて取得する (ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
entries: List[str] = []
self._entries(entries, self._data_check().view_store, True)
return map(lambda n: webcface.view.View(self, n), entries)
[docs]
def func_entries(self) -> "Iterable[webcface.func.Func]":
"""「(thisの名前).(追加の名前)」で公開されているfuncをすべて取得する (ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
entries: List[str] = []
self._entries(entries, self._data_check().func_store, True)
return map(lambda n: webcface.func.Func(self, n), entries)
[docs]
def canvas2d_entries(self) -> "Iterable[webcface.canvas2d.Canvas2D]":
"""「(thisの名前).(追加の名前)」で公開されているcanvas2dをすべて取得する (ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
entries: List[str] = []
self._entries(entries, self._data_check().canvas2d_store, True)
return map(lambda n: webcface.canvas2d.Canvas2D(self, n), entries)
[docs]
def canvas3d_entries(self) -> "Iterable[webcface.canvas3d.Canvas3D]":
"""「(thisの名前).(追加の名前)」で公開されているcanvas3dをすべて取得する (ver3.1〜 / ver3.0までMemberクラスのメソッド)"""
entries: List[str] = []
self._entries(entries, self._data_check().canvas3d_store, True)
return map(lambda n: webcface.canvas3d.Canvas3D(self, n), entries)
[docs]
def log_entries(self) -> "Iterable[webcface.log.Log]":
"""「(thisの名前).(追加の名前)」で公開されているlogをすべて取得する (ver3.1〜 / ver2.1〜3.0までMemberクラスのメソッド)"""
entries: List[str] = []
self._entries(entries, self._data_check().log_store, True)
return map(lambda n: webcface.log.Log(self, n), entries)