From 6c119e9c8338da336cfb080ab26fe35abe648dc2 Mon Sep 17 00:00:00 2001 From: Dmitriy Pleshevskiy Date: Mon, 12 Feb 2024 19:52:47 +0300 Subject: [PATCH] initial commit --- .gitattributes | 2 + .gitignore | 2 + assets/back.png | Bin 0 -> 2754 bytes assets/back.png.import | 34 +++++++++ assets/edit.png | Bin 0 -> 8017 bytes assets/edit.png.import | 34 +++++++++ assets/next.png | Bin 0 -> 4532 bytes assets/next.png.import | 34 +++++++++ components/note_item/note_item.gd | 21 ++++++ components/note_item/note_item.tscn | 36 +++++++++ data/note.gd | 15 ++++ icon.svg | 1 + icon.svg.import | 37 +++++++++ main.gd | 65 ++++++++++++++++ main.tscn | 86 +++++++++++++++++++++ project.godot | 33 ++++++++ save_manager/save_manager.gd | 19 +++++ save_manager/saved_data.gd | 4 + styles/app_theme.tres | 16 ++++ styles/white_panel_flat.tres | 4 + utils/uuid.gd | 113 ++++++++++++++++++++++++++++ 21 files changed, 556 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 assets/back.png create mode 100644 assets/back.png.import create mode 100644 assets/edit.png create mode 100644 assets/edit.png.import create mode 100644 assets/next.png create mode 100644 assets/next.png.import create mode 100644 components/note_item/note_item.gd create mode 100644 components/note_item/note_item.tscn create mode 100644 data/note.gd create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 main.gd create mode 100644 main.tscn create mode 100644 project.godot create mode 100644 save_manager/save_manager.gd create mode 100644 save_manager/saved_data.gd create mode 100644 styles/app_theme.tres create mode 100644 styles/white_panel_flat.tres create mode 100644 utils/uuid.gd diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4709183 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Godot 4+ specific ignores +.godot/ diff --git a/assets/back.png b/assets/back.png new file mode 100644 index 0000000000000000000000000000000000000000..aafa5a63c7e3457dd2b7341256f6c79a8e2726c7 GIT binary patch literal 2754 zcmeHJ`BxKH6rRLJS)^D+5P{Ox4G>1b)5cUGse*t&u*|OE%VVk3q^L7_kH=_Hu-oAc20|JA;BS%qUsIf=l zjvhNsJ9#SpY{E~8$rmoBUP{Ygve=w!S=VpmqvKS5#agC>4szetqy;d4>2< zbxnQ4y(%952X=!b1mv(kNe<6GMS9kxw;Lz~M-}2X^W8)JFrE0To>`n+;5bSLK zjn@w?y-#BqNfcvo#8s!Xg)N?*DIWP`&Y8!h9-&XRXs^0xZ;`P0(zS{Lm-$=MGNc=N zq+eU77rXD{b`OtlK8cey#q|}}30#H8<-$YFTOaw5Lv8E; z%B0@kj|`=CKM^5L$x6ZEMSY~0B2ocutOmtVK1zm{^^)%4g0Eq3F;sgKjkZlN_9lT) zW@Pz(#HP}aqtxBikyNSr(}a3nzD{@J_XSA9FK|W=DXj#!Wt~LeW=2%)N0g`9Y$U>{ z69KCy80F#q6QQjDvrLONmn->g@ahI8Bd`tK%Uoh)Uoh1 zm11mIHpk(&eyUR3I>4-)buR10S6Pou;qdJ4`_C@LKS0c8!?`zyeF%Q4VPT8$jN`cc zHpMhLR@LZ>WdL@?D)H!h{N4c2OqzaG^ApI)k?&7f|6*|NR8wsgW2{jAsBZ*SRX%IJ z+0zJ#{Bs{x2jGzSZ8iT@>%))7BR`HNM^{^nn@;oS?=0=Ao4kozd1SlUVoj&19c1Sr z)W04JWB3f($bEz%U?vT?w-0=!sx-QtKpWZJX)5R@4kouBP&F{?%kf9L#~kxAX!6YG zEJ2NeL#=dHHSmS6RnnonfwZBz_U$T3s|X*rX>?z|uSzoE07+W=+zIl=xW(xLo?v0R zz(BC*vfxa+*2DG-OMuC4|F||&_w?!hZKj&q()pP0`}Iw=b)^%f%Tfg0$G)^Y>T(W! z6&u7s=VJ@JQIdn_eZgx4z1HY0!)$bCF)q z(&jLX8QZ#*qbBgSRvn(qYHY%~yyH39`+^_Ak)yS&H~meLWg%SvI+=@dcp1|Zy<<6Z zP7u|QEd1bP^vu3Ej2UQLi8&wP3aH$SWFEJFuk{?^2q;5l)+{YY!ttP^T7k(a{C1-l zxR6y?@0nOPFvdQU+RtH1Xv_ljiT=6hX$@w80a|2oK3cDyjfSaemQ#Y|c#1xsn(K(* z*rXnt=3exiW^XCjho!th}r^;^Z>TQn*mIEJiV$<{-fT&*{vZ41DTtEkrAk%x?}@zZ>|LF`2d&Q! zh(UE-u_~e08C&t`&f)rjqIg(8kRaQ*;2bQ2|D=?{Nz>* literal 0 HcmV?d00001 diff --git a/assets/back.png.import b/assets/back.png.import new file mode 100644 index 0000000..5c52b2e --- /dev/null +++ b/assets/back.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://byohq4ewrecgx" +path="res://.godot/imported/back.png-515119acda62477b1fef7f62900af1e0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/back.png" +dest_files=["res://.godot/imported/back.png-515119acda62477b1fef7f62900af1e0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/edit.png b/assets/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..93bac4c6cbe0f619f6d78e8abe73b2e7273b2647 GIT binary patch literal 8017 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 JH6h$n{{& diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..0af1a6c --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cfx1f18ued3w" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/main.gd b/main.gd new file mode 100644 index 0000000..3412f36 --- /dev/null +++ b/main.gd @@ -0,0 +1,65 @@ +class_name Main +extends Control + +var notes: Array[Note] = [] +var previous_notes: Array[Note] = [] +var current_note: Note + +@onready var back_button: Button = %BackButton +@onready var page_title: Label = %PageTitle +@onready var notes_container: VBoxContainer = %NotesContainer +const NOTE_ITEM = preload("res://components/note_item/note_item.tscn") + + +func display_note() -> void: + back_button.disabled = previous_notes.size() == 0 + + page_title.text = current_note.title if current_note else "Главная" + + for child in notes_container.get_children(): + notes_container.remove_child(child) + + var display_notes = notes.filter(func (note): return note.parent_id == (current_note.id if current_note else "")) + + for note in display_notes: + var note_item = NOTE_ITEM.instantiate() + note_item.note = note + notes_container.add_child(note_item) + note_item.pressed.connect(_on_note_item_pressed) + + +func _ready(): + var note_1 = Note.new("Тест 1") + var note_2 = Note.new("Тест 2") + var note_3 = Note.new("Тест 3") + var note_1_1 = Note.new("Тест 1 1", note_1.id) + var note_1_2 = Note.new("Тест 1 2", note_1.id) + var note_1_2_1 = Note.new("Тест 1 2 1", note_1_2.id) + var note_2_1 = Note.new("Тест 2 1", note_2.id) + + notes = [ + note_1, + note_2, + note_3, + note_1_1, + note_1_2, + note_1_2_1, + note_2_1, + ] + + display_note() + + +func _on_back_button_pressed(): + current_note = previous_notes.pop_back() + display_note() + + +func _on_note_item_pressed(note: Note) -> void: + previous_notes.append(current_note) + current_note = note + display_note() + + +func _on_save_manager_load_notes(loaded_notes): + notes = loaded_notes diff --git a/main.tscn b/main.tscn new file mode 100644 index 0000000..773ccfb --- /dev/null +++ b/main.tscn @@ -0,0 +1,86 @@ +[gd_scene load_steps=5 format=3 uid="uid://3snttmw814qx"] + +[ext_resource type="Script" path="res://main.gd" id="1_nrdxj"] +[ext_resource type="Texture2D" uid="uid://byohq4ewrecgx" path="res://assets/back.png" id="1_rigm4"] +[ext_resource type="Texture2D" uid="uid://bel5s26rbieoi" path="res://assets/edit.png" id="2_grsek"] +[ext_resource type="Script" path="res://save_manager/save_manager.gd" id="5_o2kvf"] + +[node name="Main" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_nrdxj") + +[node name="PanelContainer" type="PanelContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer"] +layout_mode = 2 + +[node name="PanelContainer" type="PanelContainer" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/VBoxContainer/PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 16 +theme_override_constants/margin_top = 16 +theme_override_constants/margin_right = 16 +theme_override_constants/margin_bottom = 16 + +[node name="HBoxContainer" type="HBoxContainer" parent="PanelContainer/VBoxContainer/PanelContainer/MarginContainer"] +layout_mode = 2 + +[node name="BackButton" type="Button" parent="PanelContainer/VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(64, 64) +layout_mode = 2 +icon = ExtResource("1_rigm4") +flat = true +expand_icon = true + +[node name="PageTitle" type="Label" parent="PanelContainer/VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "Главная" + +[node name="EditButton" type="Button" parent="PanelContainer/VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] +custom_minimum_size = Vector2(64, 64) +layout_mode = 2 +icon = ExtResource("2_grsek") +flat = true +expand_icon = true + +[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="PanelContainer/VBoxContainer/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_left = 16 +theme_override_constants/margin_top = 16 +theme_override_constants/margin_right = 16 +theme_override_constants/margin_bottom = 16 + +[node name="NotesContainer" type="VBoxContainer" parent="PanelContainer/VBoxContainer/ScrollContainer/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_constants/separation = 8 + +[node name="Utils" type="Node" parent="."] + +[node name="SaveManager" type="Node" parent="Utils"] +script = ExtResource("5_o2kvf") + +[connection signal="pressed" from="PanelContainer/VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/BackButton" to="." method="_on_back_button_pressed"] +[connection signal="load_notes" from="Utils/SaveManager" to="." method="_on_save_manager_load_notes"] diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..3abe619 --- /dev/null +++ b/project.godot @@ -0,0 +1,33 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Boronotes" +config/version="0.0.1" +run/main_scene="res://main.tscn" +config/features=PackedStringArray("4.2", "Mobile") +config/icon="res://icon.svg" + +[display] + +window/size/viewport_width=900 +window/size/viewport_height=1600 +window/size/resizable=false +window/stretch/mode="canvas_items" +window/handheld/orientation=1 + +[gui] + +theme/custom="res://styles/app_theme.tres" + +[rendering] + +renderer/rendering_method="mobile" diff --git a/save_manager/save_manager.gd b/save_manager/save_manager.gd new file mode 100644 index 0000000..7154747 --- /dev/null +++ b/save_manager/save_manager.gd @@ -0,0 +1,19 @@ +class_name SaveManager +extends Node + +signal load_notes(notes: Array[Note]) + +var file_name: String = "user://save_notes.tres" + + +func save_data(notes: Array[Note]) -> void: + var saved_data = SavedData.new() + saved_data.notes = notes + ResourceSaver.save(saved_data, file_name) + + +func load_data() -> void: + if ResourceLoader.exists(file_name): + var saved_data = ResourceLoader.load(file_name) as SavedData + load_notes.emit(saved_data.notes) + diff --git a/save_manager/saved_data.gd b/save_manager/saved_data.gd new file mode 100644 index 0000000..e8d6d16 --- /dev/null +++ b/save_manager/saved_data.gd @@ -0,0 +1,4 @@ +class_name SavedData +extends Resource + +@export var notes: Array[Note] = [] diff --git a/styles/app_theme.tres b/styles/app_theme.tres new file mode 100644 index 0000000..32b83d7 --- /dev/null +++ b/styles/app_theme.tres @@ -0,0 +1,16 @@ +[gd_resource type="Theme" load_steps=2 format=3 uid="uid://dhg5k56ynipbp"] + +[ext_resource type="StyleBox" uid="uid://bfvw2cfuiduki" path="res://styles/white_panel_flat.tres" id="1_rasl3"] + +[resource] +Button/colors/font_color = Color(0, 0, 0, 1) +Button/colors/font_focus_color = Color(0, 0, 0, 1) +Button/colors/font_hover_color = Color(0, 0, 0, 1) +Button/colors/font_hover_pressed_color = Color(0, 0, 0, 1) +Button/colors/font_outline_color = Color(0, 0, 0, 1) +Button/colors/font_pressed_color = Color(0, 0, 0, 1) +Button/font_sizes/font_size = 18 +Button/styles/normal = null +Label/colors/font_color = Color(0, 0, 0, 1) +Label/font_sizes/font_size = 30 +PanelContainer/styles/panel = ExtResource("1_rasl3") diff --git a/styles/white_panel_flat.tres b/styles/white_panel_flat.tres new file mode 100644 index 0000000..2a39ec2 --- /dev/null +++ b/styles/white_panel_flat.tres @@ -0,0 +1,4 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://bfvw2cfuiduki"] + +[resource] +bg_color = Color(1, 1, 1, 0.784314) diff --git a/utils/uuid.gd b/utils/uuid.gd new file mode 100644 index 0000000..80840b6 --- /dev/null +++ b/utils/uuid.gd @@ -0,0 +1,113 @@ +# Note: The code might not be as pretty it could be, since it's written +# in a way that maximizes performance. Methods are inlined and loops are avoided. +extends Node + +const BYTE_MASK: int = 0b11111111 + +static func uuidbin(): + # 16 random bytes with the bytes on index 6 and 8 modified + return [ + randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, + randi() & BYTE_MASK, randi() & BYTE_MASK, ((randi() & BYTE_MASK) & 0x0f) | 0x40, randi() & BYTE_MASK, + ((randi() & BYTE_MASK) & 0x3f) | 0x80, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, + randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, + ] + +static func uuidbinrng(rng: RandomNumberGenerator): + return [ + rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, + rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, ((rng.randi() & BYTE_MASK) & 0x0f) | 0x40, rng.randi() & BYTE_MASK, + ((rng.randi() & BYTE_MASK) & 0x3f) | 0x80, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, + rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, + ] + +static func v4(): + # 16 random bytes with the bytes on index 6 and 8 modified + var b = uuidbin() + + return '%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x' % [ + # low + b[0], b[1], b[2], b[3], + + # mid + b[4], b[5], + + # hi + b[6], b[7], + + # clock + b[8], b[9], + + # clock + b[10], b[11], b[12], b[13], b[14], b[15] + ] + +static func v4_rng(rng: RandomNumberGenerator): + # 16 random bytes with the bytes on index 6 and 8 modified + var b = uuidbinrng(rng) + + return '%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x' % [ + # low + b[0], b[1], b[2], b[3], + + # mid + b[4], b[5], + + # hi + b[6], b[7], + + # clock + b[8], b[9], + + # clock + b[10], b[11], b[12], b[13], b[14], b[15] + ] + +var _uuid: Array + +func _init(rng := RandomNumberGenerator.new()) -> void: + _uuid = uuidbinrng(rng) + +func as_array() -> Array: + return _uuid.duplicate() + +func as_dict(big_endian := true) -> Dictionary: + if big_endian: + return { + "low" : (_uuid[0] << 24) + (_uuid[1] << 16) + (_uuid[2] << 8 ) + _uuid[3], + "mid" : (_uuid[4] << 8 ) + _uuid[5], + "hi" : (_uuid[6] << 8 ) + _uuid[7], + "clock": (_uuid[8] << 8 ) + _uuid[9], + "node" : (_uuid[10] << 40) + (_uuid[11] << 32) + (_uuid[12] << 24) + (_uuid[13] << 16) + (_uuid[14] << 8 ) + _uuid[15] + } + else: + return { + "low" : _uuid[0] + (_uuid[1] << 8 ) + (_uuid[2] << 16) + (_uuid[3] << 24), + "mid" : _uuid[4] + (_uuid[5] << 8 ), + "hi" : _uuid[6] + (_uuid[7] << 8 ), + "clock": _uuid[8] + (_uuid[9] << 8 ), + "node" : _uuid[10] + (_uuid[11] << 8 ) + (_uuid[12] << 16) + (_uuid[13] << 24) + (_uuid[14] << 32) + (_uuid[15] << 40) + } + +func as_string() -> String: + return '%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x' % [ + # low + _uuid[0], _uuid[1], _uuid[2], _uuid[3], + + # mid + _uuid[4], _uuid[5], + + # hi + _uuid[6], _uuid[7], + + # clock + _uuid[8], _uuid[9], + + # node + _uuid[10], _uuid[11], _uuid[12], _uuid[13], _uuid[14], _uuid[15] + ] + +func is_equal(other) -> bool: + # Godot Engine compares Array recursively + # There's no need for custom comparison here. + return _uuid == other._uuid