【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 myTodoList

var _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 = ctn
		status = 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 myTodoList

var _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 = ctn
		status = 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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git | 远程操作

Git | 远程操作 文章目录 Git | 远程操作0、分布式版本控制系统概念1、创建远程仓库2、克隆远程仓库https方式ssh方式 3、推送至远程仓库4、本地拉取远程仓库5、配置Git忽略特殊文件给命令配置别名 6、标签管理创建标签操作标签 0、分布式版本控制系统概念 Git是一个分布式版本…

Git--分布式版本控制系统

目录 一、理解分布式版本控制系统二、远程仓库三、克隆远程仓库四、向远程仓库推送五、拉取远程仓库六、配置Git七、给命令配置别名八、创建标签九、操作标签 一、理解分布式版本控制系统 我们⽬前所说的所有内容(⼯作区,暂存区,版本库等等&a…

24深圳杯AC题完整思路+可执行代码+参考论文!!!!

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的,大家可以参考我往期的资料,所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意:(建议先下单占坑,因为随着后续我们更新资料数…

three.js 学习笔记 | 光线投射技术 - 包围盒(碰撞检测)

文章目录 three.js 学习笔记光线投射技术实现3D场景交互事件 THREE.Raycaster坐标系的转换案例:选中的模型变为红色 包围盒Box3 - 碰撞检测AABB包围盒辅助器Box3Helper案例1:创建AABB包围盒/包围球computeBoundingBox与boundingBox 搭配使用,…

【数据结构】二叉树(带图详解)

文章目录 1.树的概念1.2 树的结构孩子表示法孩子兄弟表示法 1.3 相关概念 2.二叉树的概念及结构2.1 二叉树的概念2.2 数据结构中的二叉树-五种形态2.3 特殊的二叉树2.4 二叉树的存储结构顺序存储链式存储 2.5 二叉树的性质 3. 堆3.1 堆的定义3.2 堆的实现堆的结构堆的插入向上调…

springcloud按版本发布微服务达到不停机更新的效果

本文基于以下环境完成 spring-boot 2.3.2.RELEASEspring-cloud Hoxton.SR9spring-cloud-alibaba 2.2.6.RELEASEspring-cloud-starter-gateway 2.2.6.RELEASEspring-cloud-starter-loadbalancer 2.2.6.RELEASEnacos 2.0.3 一、思路 实现思路: 前端项目在请求后端接…

SVN--基本原理与使用(超详细)

目录 一、SVN概述二、SVN服务端软件安装三、SVN服务端配置四、SVN客户端软件安装与使用五、SVN三大指令六、SVN图标集与忽略功能6.1 图标集6.2 忽略功能 七、SVN版本回退八、SVN版本冲突九、SVN配置多仓库与权限控制9.1 配置多仓库9.2 权限控制 十、服务配置与管理十一、模拟真…

Java | Leetcode Java题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; class Solution {public int totalNQueens(int n) {Set<Integer> columns new HashSet<Integer>();Set<Integer> diagonals1 new HashSet<Integer>();Set<Integer> diagonals2 new HashSet<Integer>…

手写文本识别系统的最佳实践

手写文本识别系统的最佳实践 摘要IntroductionRelated WorkProposed HTR SystemConvolutional Backbone:Flattening Operation:Recurrent Head:CTC shortcut: Best Practices for a Handwritten Text Recognition System 摘要 手写文本识别在近年来随着深度学习及其应用的兴起…

文件夹惊变文件?揭秘原因及解决方案

在日常工作和生活中&#xff0c;电脑已经成为我们不可或缺的助手。然而&#xff0c;有时我们会遇到一些令人困惑的问题&#xff0c;比如&#xff0c;文件夹突然变成了文件。这听起来可能有些匪夷所思&#xff0c;但它确实会发生&#xff0c;而且给用户带来了不小的麻烦。当熟悉…

java-spring-mvc(知识点讲解-第一天)-欢迎各位大佬提建议

目录 &#x1f383;MVC定义 &#x1f9e8;创建工程 &#x1f3a8;SpringMVC处理请求 请求分类及处理方式 静态请求 处理静态前端页面方式 动态请求 处理动态前端页面方式 ⚙小试牛刀 &#x1f3c6;常见问题 &#x1f4cc;HTTP协议 超文本传输协议 请求 &#x1f383;MVC…

Web前端开发 小实训(二) 简易计算器

实训目的 学生能够使用函数完成简易计算器编写 操作步骤 1、请将加减乘除四个方法生成为以下函数&#xff0c;且有返回值 中文英语加法add减法subtract乘法multi除法division次幂pow()平方根sqrt() 提示&#xff1a; 除法中的除数不能为0&#xff01; 参考代码&#xff1…

在线培训考试系统在线考试功能注意事项

在线培训考试系统在线考试功能注意事项 考试前务必注意是否开启防切屏、摄像头监考等防作弊措施&#xff0c;系统一旦检测到触发了疑似作弊行为会立刻自动交卷&#xff0c;考试终止&#xff1b; 答题者准备好后&#xff0c;可点击“开始答题”按钮进入考试&#xff0c;注意考…

代码随想录第49天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之 LeetCode&#xff1a;121.买卖股票的最佳时机1_哔哩哔哩_bilibili 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一…

#C++里的引用#

目录 引用概念 定义引用类型 引用特性 常引用 传引用传参 传引用做返回值 1.引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 比如&#xff1a…

【AI】一文介绍索引增强生成RAG的原理和结构

今天向大家介绍一下关于RAG的一些知识和经验。 这里说的RAG可以理解为目前针对企业知识库问答等AI应用场景的解决方案,这个场景就是利用自然语言大模型LLM与用户自有的文件进行对话的能力。 【RAG的优势】 首先,讲一讲RAG的优势特征。 如果把AI想象成一个待上岗的人类助手,…

1、Flink DataStreamAPI 概述(上)

一、DataStream API 1、概述 1&#xff09;Flink程序剖析 1.Flink程序组成 a&#xff09;Flink程序基本组成 获取一个执行环境&#xff08;execution environment&#xff09;&#xff1b;加载/创建初始数据&#xff1b;指定数据相关的转换&#xff1b;指定计算结果的存储…

模型 AIPL(认知、兴趣、购买、忠诚)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。品牌营销的量化与链路化。 1 AIPL模型的应用 1.1 耐克如何利用AIPL模型来推广其运动鞋和服装产品? 耐克利用AIPL模型来推广其运动鞋和服装产品&#xff0c;具体如下&#xff1a; 认知&#xff08;…

为什么总说抖店做不好?做抖店需要注意这些问题,是不是都占了?

大家好&#xff0c;我是电商花花。 今天给大家总结了4个新手不注意又常犯的几个原因&#xff0c;这些建议都是我们做店这些年的实操经验&#xff0c;可以帮助大家做店自查&#xff0c;有责改之&#xff0c;无责加冕。 1、抖店核心是选品而不是玩法 很多新手在刚开始做店抖音小…

8K+/月!学习就业一把梭,祝贺誉天数通陈同学收获心仪offer !

大家好&#xff0c;我是誉天数通的陈同学。 在武汉&#xff0c;网络运维圈的人应该都会听过誉天的名字。作为华为的授权培训合作伙伴&#xff0c;誉天不仅提供专业全面的工程师培训&#xff0c;还以其独特的环境和氛围吸引着无数有志于在网络领域发展的朋友。 一年前的我&#…