【Godot4.2】自定义Todo清单类 - myTodoList

概述

在写myList类的时候,就想到可以写一个类似的Todo清单类

基础思路

  • 本质还是在内部维护一个数组,在其基础上进行增删改查操作的封装
  • 为了方便存储数据,编写一个自定义内置类TodoItem,内部数组就变成了Array[TodoItem]类型的类型化数组。在这个数组基础上编写各种方法。

基于本文所写的这个类实际上已经可以写简单的清单应用了。当然为了能用于打印输出,所以我也设定了以纯字符形式输出的方法。

代码

# ========================================================
# 名称:myTodoList
# 类型:类
# 简介:专用于构造待办清单列表的类
# 作者:巽星石
# Godot版本:v4.2.2.stable.official [15073afe3]
# 创建时间:202442713:30:09
# 最后修改时间:202442722:17:18
# ========================================================
class_name myTodoListvar _arr:Array[TodoItem]  # 数据 - 内部维护的类型化数组# ============================= 常量与取值函数 ===========================
# 列表项状态
enum {UNCHECKED,CHECKED,CANCLE}var state_chars := "☐☑☒"  # 状态字符# 获取对应常量的状态字符
func get_state_char(state:=UNCHECKED):return state_chars[state]
# ============================= 内部类 ===========================
# 清单列表项
class TodoItem:var status:int = UNCHECKED  # 状态var content:String =""      # 内容func _init(ctn:String,state:int = UNCHECKED) -> void:content = ctnstatus = state
# ============================= 虚函数 ===========================
# 实例化
func _init(list:PackedStringArray = []) -> void:for itm in list:var item = TodoItem.new(itm)_arr.append(item)
# ============================= 方法 ===========================
# -------------------- 增删改查 -------------------- 
# -------------------- 增
# 添加清单项
func append(itm:String,state:int = UNCHECKED)  -> void:var item = TodoItem.new(itm,state)_arr.append(item)# 添加多个清单项
func append_array(items:PackedStringArray,state:int = UNCHECKED)  -> void:for i in range(items.size()):append(items[i],state)# 在指定位置添加清单项
func insert(pos:int,itm:String,state:int = UNCHECKED)  -> void:var item = TodoItem.new(itm,state)_arr.insert(pos,item)
# -------------------- 删
# 移除列表项
func remove(idx:int) -> void:_arr.remove_at(idx)# 清空列表项
func clear()  -> void:_arr.clear()
# -------------------- 改
# --------- 修改清单项的勾选状态 --------- 
# 勾选列表项
func check(idx:int)  -> void:_arr[idx].status = CHECKED# 勾选列表项
func uncheck(idx:int)  -> void:_arr[idx].status = UNCHECKED# 勾选列表项
func cancle(idx:int)  -> void:_arr[idx].status = CANCLE
# --------- 修改清单项的值和位置 --------- 
# 修改列表项的值
func set_item(idx:int,new_val:String) -> void:_arr[idx].content = new_val# 修改列表项的位置
func move_to(idx:int,new_pos:int) -> void:var item = _arr[idx]_arr.remove_at(idx)_arr.insert(new_pos if new_pos !=0 else 0,item)
# -------------------- 查
# 获取列表项
func get_item(idx:int) ->TodoItem:return _arr[idx]# 返回列表项的总数
func get_count() ->int:return _arr.size()
# -------------------- 遍历
# 遍历函数
func for_item(callback:Callable) ->void:for i in range(_arr.size()):callback.callv([_arr[i],i,_arr.size()])
# -------------------- 获取清单 -------------------- 
# 返回清单列表
func get_data() -> Array[TodoItem]:return _arr.duplicate()  # 返回副本# 返回清单列表
func _to_string() -> String:var strr = ""for i in range(_arr.size()):strr += "%s %s\n" % [get_state_char(_arr[i].status),_arr[i].content]return strr

基础原理

class_name myTodoListvar _arr:Array[TodoItem]  # 数据 - 内部维护的类型化数组# ============================= 常量与取值函数 ===========================
# 列表项状态
enum {UNCHECKED,CHECKED,CANCLE}var state_chars := "☐☑☒"  # 状态字符# 获取对应常量的状态字符
func get_state_char(state:=UNCHECKED):return state_chars[state]
# ============================= 内部类 ===========================
# 清单列表项
class TodoItem:var status:int = UNCHECKED  # 状态var content:String =""      # 内容func _init(ctn:String,state:int = UNCHECKED) -> void:content = ctnstatus = state

观察最顶部的代码可以发现:

  • 整个myTodoList内部维护一个名为_arr的数组,它是Array[TodoItem]的类型数组,只存储也只能存储TodoItem类型的实例
  • TodoItem是内部类,有2个基础属性statuscontent,分别存储清单项的状态(是否选中或取消),以及文本内容
  • TodoItem构造函数中默认的状态设置为UNCHECKED也就是未选中
  • TodoItem的状态可以是UNCHECKED,CHECKED,CANCLE其中之一,分别对应未选中选中取消
  • state_chars中存储了TodoItem3种状态对应的字符组成的字符串☐☑☒
  • get_state_char()用于获取UNCHECKED,CHECKED,CANCLE对应的state_chars中的字符,用于在get_todo_list_string()中返回纯字符串的Todo清单。

基础使用

myTodoList的方法和使用基本上与myList类一致,也与GDScript的数组基本保持一致,所以上手没什么难度。除了设定状态的3个方法:

  • uncheck():将指定位置的项设为不勾选
  • check():将指定位置的项设为勾选
  • cancle():将指定位置的项设为取消
var list = myTodoList.new(["待办事项1","待办事项2","待办事项3"])   # 创建实例
list.check(0)   # 选中第1项
list.cancle(1)  # 取消第2项
list.append("待办事项4")        
list.append("待办事项5",list.CHECKED)
list.append_array(["待办事项6","待办事项7","待办事项8"],list.CHECKED)
print(list.get_todo_list_string())

输出:

☑ 待办事项1
☒ 待办事项2
☐ 待办事项3
☐ 待办事项4
☑ 待办事项5
☑ 待办事项6
☑ 待办事项7
☑ 待办事项8

改进

使用_to_string()

  • _to_string()虚函数是用于在类内部自定义to_string()返回值的。在使用print()或其他打印函数时,会自动调用to_string(),打印其返回值。

在这里插入图片描述

我们将原来的get_todo_list_string()方法改为_to_string()

# 返回清单列表
func _to_string() -> String:var strr = ""for i in range(_arr.size()):strr += "%s %s\n" % [get_state_char(_arr[i].status),_arr[i].content]return strr

则,在打印时,我们可以直接print()我们创建的实例:

var list = myTodoList.new(["待办事项1","待办事项2","待办事项3"])   # 创建实例
print(list)

而如果我们想要字符串本身,可以使用list.to_string()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/317170.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JENKINS 安装,学习运维从这里开始

Download and deployJenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their softwarehttps://www.jenkins.io/download/首先点击上面。下载Jenkins 为了学习,从windows开始&#x…

mysql-sql练习-5-行列互转

目录 成绩单 简单互转 需求 多行转多列 分组 判断 聚合 理解 分组 合并 逆向需求 多列转多行 输出 合并 abc 去重 合并 拆分 需求 建表 多行转多列 逆向需求 多列转多行 拆分 按长度 拆分 按个数 成绩单 简单互转 需求 多行转多列 分组 判断 聚合 with tmp as(--…

【快速入门 LVGL】-- 5、Gui Guider界面移植到STM32工程

上篇,我们已学习:【快速入门 LVGL】-- 4、显示中文 工程中添加了两个按钮作示范。运行效果如图: 本篇:把Gui Guider设计好的界面,移植到STM32工程。 特别地: 在使用Gui Guider进行界面设计时,应…

如何在Linux上安装Python?2024Python安装教程

在Linux上安装Python并不难,对于Ubuntu或Debian系统,使用命令sudo apt install python3;对于CentOS、Red Hat或Fedora系统,使用命令sudo yum install python3。 如何在Linux上安装Python? 确切的安装步骤有所不同&am…

LabVIEW 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包,选择“解压到LabVIEW.2024”。 返回解压后的文件夹,鼠标右击“ni_labview-2024”选择“装载”。 鼠标右击“Install”选择“以管理员身份运行”。 点击“我接受上述2条许可协议”,然后点击“下一步”。 点击“下一步”。 …

用html画一个四叶草

<!DOCTYPE html> <html lang"en" > <head> <meta charset"UTF-8"> <title>四叶草</title> <link href"" rel"stylesheet"> <link rel"stylesheet" href"css/style.css&q…

xLua详解

目录 环境准备xLua导入 C#调用LuaLua解析器Lua文件加载重定向Lua解析管理器全局变量的获取全局函数的获取List和Dictionary映射table类映射table接口映射tableLuaTable映射table Lua调用C#准备工作Lua使用C#类Lua调用C#枚举Lua使用C# 数组 List 字典数组List字典 Lua使用C#扩展…

Ubuntu如何更换 PyTorch 版本

环境&#xff1a; Ubuntu22.04 WLS2 问题描述&#xff1a; Ubuntu如何更换 PyTorch 版本考虑安装一个为 CUDA 11.5 编译的 PyTorch 版本。如何安装旧版本 解决方案&#xff1a; 决定不升级CUDA版本&#xff0c;而是使用一个与CUDA 11.5兼容的PyTorch版本&#xff0c;您可…

22 重构系统升级-实现不停服的数据迁移和用户切量

专栏的前 21 讲&#xff0c;从读、写以及扣减的角度介绍了三种特点各异的微服务的构建技巧&#xff0c;最后从微服务的共性问题出发&#xff0c;介绍了这些共性问题的应对技巧。 在实际工作中&#xff0c;你就可以参考本专栏介绍的技巧构建新的微服务&#xff0c;架构一个具备…

图像处理的基本操作

一、PyCharm中安装OpenCV模块 二、读取图像 1、基本语法 OpenCV提供了用于读取图像的imread()方法&#xff0c;其语法如下&#xff1a; image cv2.imread&#xff08;filename&#xff0c;flags&#xff09; &#xff08;1&#xff09;image&#xff1a;是imread方法的返回…

前后缀分离,CF1209 C. Maximal Intersection

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1029C - Codeforces 二、解题报告 1、思路分析 线段相交具有可…

预编码算法学习笔记

文章目录 1. 基本原理2. 常见应用2.1 自编码器2.2 变分自编码器2.3 稀疏自编码器 3. 学习笔记 在机器学习领域&#xff0c;预编码算法是一种强大的工具&#xff0c;用于将高维数据映射到低维表示&#xff0c;从而提取数据中的重要特征。本文将介绍预编码算法的基本原理、常见应…

分布式与一致性协议之拜占庭将军问题(三)

拜占庭将军问题 叛将先发送消息 如果是叛将楚先发送作战消息&#xff0c;干扰作战计划&#xff0c;结果会有所不同吗&#xff1f; 在第一轮作战信息协商中&#xff0c;楚向苏秦发送作战指令"进攻",向齐、燕发送作战指令"撤退"&#xff0c;如图所示(当然还…

SpringCloud 学习笔记 —— 六、Ribbon:负载均衡(基于客户端)

SpringCloud 学习笔记 —— 一、背景-CSDN博客 SpringCloud 学习笔记 —— 二、微服务与微服务架构-CSDN博客 SpringCloud 学习笔记 —— 三、SpringCloud 入门概述-CSDN博客 SpringCloud 学习笔记 —— 四、SpringCloud Rest 学习环境搭建&#xff1a;服务提供者-CSDN博客 …

Linux 的静态库和动态库

本文目录 一、静态库1. 创建静态库2. 静态库的使用 二、动态库1. 为什么要引入动态库呢&#xff1f;2. 创建动态库3. 动态库的使用4. 查看可执行文件依赖的动态库 一、静态库 在编译程序的链接阶段&#xff0c;会将源码汇编生成的目标文件.o与引用到的库&#xff08;包括静态库…

对话访谈——五问RAG与搜索引擎:探索知识检索的未来

记一次关于RAG和搜索引擎在知识检索方面的对话访谈&#xff0c;针对 RAG 与传统搜索引擎的异同,以及它们在知识检索领域的优劣势进行了深入的探讨。 Q&#xff1a;传统搜索引擎吗&#xff0c;通过召回-排序的两阶段模式&#xff0c;实现搜索逻辑的实现&#xff0c;当前RAG技术也…

数字旅游:通过科技赋能,创新旅游服务模式,提供智能化、个性化的旅游服务,满足游客多元化、个性化的旅游需求

目录 一、数字旅游的概念与内涵 二、科技赋能数字旅游的创新实践 1、大数据技术的应用 2、人工智能技术的应用 3、物联网技术的应用 4、云计算技术的应用 三、智能化、个性化旅游服务的实现路径 1、提升旅游服务的智能化水平 2、实现旅游服务的个性化定制 四、数字旅…

想要接触网络安全,应该怎么入门学习?

作为一个网络安全新手&#xff0c;首先你要明确以下几点&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f;要学哪些东西&#xff1f;有哪些方向&#xff1f;怎么选&#xff1f;这一行职业前景如何&#xff1f; 其次&#xff0c;如果你现在不清楚学什么的话&…

vim的IDE进阶之路

一 ctags 1 安装 安装ctags比较简单&#xff0c;我用的是vim-plug&#xff0c;网络上随便一搜应该就有很多教程&#xff0c;而且没有什么坑 2 使用 vim之函数跳转功能_nvim函数跳转-CSDN博客https://blog.csdn.net/ballack_linux/article/details/71036072不过针对cuda程序…

Java基础_集合类_List

List Collection、List接口1、继承结构2、方法 Collection实现类1、继承结构2、相关类&#xff08;1&#xff09;AbstractCollection&#xff08;2&#xff09;AbstractListAbstractSequentialList&#xff08;子类&#xff09; 其它接口RandomAccess【java.util】Cloneable【j…