C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

D&Dで入れ替わるリストビュー4

こちらの続きです。
D&Dで入れ替わるリストビュー3 - C#ATIA

ほぼ進展ないのですが、コントロールのdataに文字列ではなく、
オブジェクト的なものを代入出来るものかどうかをテストしました。

# python using-flet
import flet as ft


class Character():
    def __init__(self, name: str, isDropOnly: bool = False) -> None:
        self.name = name
        self.isDropOnly = isDropOnly
        
    def get_name(self) -> str:
        return self.name

    def is_dropOnly(self) -> bool:
        return self.isDropOnly


class DragAndDropItem(ft.UserControl):
    def __init__(self, group: str, value: Character):
        super().__init__()
        self.group = group
        self.vaule = value

    def build(self):
        self.view = ft.Draggable(
            group = self.group,
            content = ft.DragTarget(
                group = self.group,
                content = ft.Text(
                    self.vaule.get_name(),
                    size = 20,
                    data = self.vaule,
                ),
                on_accept = self._drag_accept,
            )
        )
        return self.view

    def _drag_accept(self, e: ft.DragTargetAcceptEvent):
        '''
        ドラッグもドロップもOK
        '''
        src = e.page.get_control(e.src_id).content.content
        target = e.page.get_control(e.target).content

        if src.data.is_dropOnly() == target.data.is_dropOnly():
            # お互いのタイプが一致
            target.data, src.data = src.data, target.data
        elif not src.data.is_dropOnly() and target.data.is_dropOnly():
            # ドロップされる側がドロップオンリーの場合のみ受け入れる
            target.data = src.data

        self._update_control(src)
        self._update_control(target)

    def _update_control(self, control) -> None:
        control.value = control.data.get_name()

        control.update()


def main(page: ft.Page):

    page.title = "Drag and drop test"
    groupName = "test"
    isonoGrp = [
        Character("さざえ"),
        Character("かつお"),
        Character("わかめ"),
        Character("たらお"),
    ]

    sakuraGrp = [
        Character("まるこ", True),
        Character("たまえ", True),
        Character("はまじ", True),
        Character("みぎわ", True),
    ]

    isonolistView = ft.ListView(
        expand=1,
        spacing=20,
        padding=20,
        auto_scroll = True
    )
    [isonolistView.controls.append(DragAndDropItem(groupName, c)) for c in isonoGrp]

    sakuralistView = ft.ListView(
        expand=1,
        spacing=20,
        padding=20,
        auto_scroll = True
    )
    [sakuralistView.controls.append(DragAndDropItem(groupName, c)) for c in sakuraGrp]

    page.add(
        ft.Row(
            controls=[
                isonolistView,
                sakuralistView,
            ]
        )
    )

    page.update()


ft.app(target = main)


こちらにチラッと記載したコントロール自体のスワップ
出来ない為の代案です。
D&Dで入れ替わるリストビュー2 - C#ATIA