diff --git a/.gitignore b/.gitignore index 4709183..6a52a51 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ # Godot 4+ specific ignores .godot/ + +# Android +android/ +*.apk +*.apk.idsig diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eee2f5c --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +ANDROID_PACKAGE_NAME = ru.pleshevski.boronotes +ANDROID_DEBUG_FILE = Boronotes.apk + +help: + cat Makefile + +android-build-debug: + godot4 --headless --export-debug "Android" $(ANDROID_DEBUG_FILE) + +android-install: android-build + adb install $(ANDROID_DEBUG_FILE) + +android-uninstall: + adb shell pm uninstall $(ANDROID_PACKAGE_NAME) diff --git a/assets/add.png b/assets/add.png new file mode 100644 index 0000000..a2ead82 Binary files /dev/null and b/assets/add.png differ diff --git a/assets/add.png.import b/assets/add.png.import new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/assets/add.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5djp0ut3b0ck" +path="res://.godot/imported/add.png-49fe8db0fedbecae82b656c4501f68bc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/add.png" +dest_files=["res://.godot/imported/add.png-49fe8db0fedbecae82b656c4501f68bc.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/close.png b/assets/close.png new file mode 100644 index 0000000..a941383 Binary files /dev/null and b/assets/close.png differ diff --git a/assets/close.png.import b/assets/close.png.import new file mode 100644 index 0000000..55f2686 --- /dev/null +++ b/assets/close.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c56dek8bl3vq0" +path="res://.godot/imported/close.png-5dfda58792925f4ecef1b7dd0e814906.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/close.png" +dest_files=["res://.godot/imported/close.png-5dfda58792925f4ecef1b7dd0e814906.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/save.png b/assets/save.png new file mode 100644 index 0000000..ea9f6ce Binary files /dev/null and b/assets/save.png differ diff --git a/assets/save.png.import b/assets/save.png.import new file mode 100644 index 0000000..378b8cc --- /dev/null +++ b/assets/save.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cwnsbx7xl0syt" +path="res://.godot/imported/save.png-9622b5303508ebb9968ebd80fc3666f1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/save.png" +dest_files=["res://.godot/imported/save.png-9622b5303508ebb9968ebd80fc3666f1.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/components/edit_note_item/edit_note_item.gd b/components/edit_note_item/edit_note_item.gd new file mode 100644 index 0000000..4e9df5d --- /dev/null +++ b/components/edit_note_item/edit_note_item.gd @@ -0,0 +1,25 @@ +class_name EditNoteItem +extends PanelContainer + +signal deleted(note: Note) + +@export var note: Note : + set(new_note): + if note != new_note: + note = new_note + if line_edit: + line_edit.text = note.title + +@onready var line_edit: LineEdit = %LineEdit + + +func _ready(): + line_edit.text = note.title + + +func _on_line_edit_text_changed(new_text: String): + note.title = new_text + + +func _on_delete_button_pressed(): + deleted.emit(note) diff --git a/components/edit_note_item/edit_note_item.tscn b/components/edit_note_item/edit_note_item.tscn new file mode 100644 index 0000000..7cad615 --- /dev/null +++ b/components/edit_note_item/edit_note_item.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=4 format=3 uid="uid://cy7qciptrj71w"] + +[ext_resource type="Script" path="res://components/edit_note_item/edit_note_item.gd" id="1_0fnc8"] +[ext_resource type="Texture2D" uid="uid://c56dek8bl3vq0" path="res://assets/close.png" id="2_gotov"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q7ab1"] +bg_color = Color(1, 1, 1, 0.784314) +corner_radius_top_left = 6 +corner_radius_top_right = 6 +corner_radius_bottom_right = 6 +corner_radius_bottom_left = 6 + +[node name="EditNoteItem" type="PanelContainer"] +theme_override_styles/panel = SubResource("StyleBoxFlat_q7ab1") +script = ExtResource("1_0fnc8") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 9 +theme_override_constants/margin_top = 6 +theme_override_constants/margin_right = 9 +theme_override_constants/margin_bottom = 6 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer"] +layout_mode = 2 + +[node name="LineEdit" type="LineEdit" parent="MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +placeholder_text = "Введите заметку" + +[node name="DeleteButton" type="Button" parent="MarginContainer/HBoxContainer"] +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +icon = ExtResource("2_gotov") +flat = true +expand_icon = true + +[connection signal="text_changed" from="MarginContainer/HBoxContainer/LineEdit" to="." method="_on_line_edit_text_changed"] +[connection signal="pressed" from="MarginContainer/HBoxContainer/DeleteButton" to="." method="_on_delete_button_pressed"] diff --git a/components/note_item/note_item.gd b/components/note_item/note_item.gd index ee6608a..5b73cc3 100644 --- a/components/note_item/note_item.gd +++ b/components/note_item/note_item.gd @@ -17,5 +17,8 @@ func _ready(): button.text = note.title + func _on_button_pressed(): pressed.emit(note) + + diff --git a/data/change_note.gd b/data/change_note.gd new file mode 100644 index 0000000..0aca182 --- /dev/null +++ b/data/change_note.gd @@ -0,0 +1,15 @@ +class_name ChangeNote +extends Resource + +enum Kind { + ADDED, + CHANGED, + DELETED, +} + +@export var kind: Kind +@export var note: Note + +func _init(change_kind: Kind, change_note: Note): + kind = change_kind + note = change_note diff --git a/data/note.gd b/data/note.gd index 389db2b..afe6fda 100644 --- a/data/note.gd +++ b/data/note.gd @@ -8,8 +8,9 @@ const uuid = preload("res://utils/uuid.gd") @export var title: String -func _init(note_title: String, note_parent_id: String = ""): - id = uuid.v4() - title = note_title - parent_id = note_parent_id - +static func create(note_title: String, note_parent_id: String = "") -> Note: + var note = Note.new() + note.id = uuid.v4() + note.title = note_title + note.parent_id = note_parent_id + return note diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..a9e30c3 --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,239 @@ +[preset.0] + +name="Android" +platform="Android" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="" +encryption_include_filters="" +encryption_exclude_filters="" +encrypt_pck=false +encrypt_directory=false + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +gradle_build/use_gradle_build=false +gradle_build/export_format=0 +gradle_build/min_sdk="" +gradle_build/target_sdk="" +architectures/armeabi-v7a=false +architectures/arm64-v8a=true +architectures/x86=false +architectures/x86_64=false +version/code=1 +version/name="" +package/unique_name="com.example.$genname" +package/name="" +package/signed=true +package/app_category=2 +package/retain_data_on_uninstall=false +package/exclude_from_recents=false +package/show_in_android_tv=false +package/show_in_app_library=true +package/show_as_launcher_app=false +launcher_icons/main_192x192="" +launcher_icons/adaptive_foreground_432x432="" +launcher_icons/adaptive_background_432x432="" +graphics/opengl_debug=false +xr_features/xr_mode=0 +screen/immersive_mode=true +screen/support_small=true +screen/support_normal=true +screen/support_large=true +screen/support_xlarge=true +user_data_backup/allow=false +command_line/extra_args="" +apk_expansion/enable=false +apk_expansion/SALT="" +apk_expansion/public_key="" +permissions/custom_permissions=PackedStringArray() +permissions/access_checkin_properties=false +permissions/access_coarse_location=false +permissions/access_fine_location=false +permissions/access_location_extra_commands=false +permissions/access_mock_location=false +permissions/access_network_state=false +permissions/access_surface_flinger=false +permissions/access_wifi_state=false +permissions/account_manager=false +permissions/add_voicemail=false +permissions/authenticate_accounts=false +permissions/battery_stats=false +permissions/bind_accessibility_service=false +permissions/bind_appwidget=false +permissions/bind_device_admin=false +permissions/bind_input_method=false +permissions/bind_nfc_service=false +permissions/bind_notification_listener_service=false +permissions/bind_print_service=false +permissions/bind_remoteviews=false +permissions/bind_text_service=false +permissions/bind_vpn_service=false +permissions/bind_wallpaper=false +permissions/bluetooth=false +permissions/bluetooth_admin=false +permissions/bluetooth_privileged=false +permissions/brick=false +permissions/broadcast_package_removed=false +permissions/broadcast_sms=false +permissions/broadcast_sticky=false +permissions/broadcast_wap_push=false +permissions/call_phone=false +permissions/call_privileged=false +permissions/camera=false +permissions/capture_audio_output=false +permissions/capture_secure_video_output=false +permissions/capture_video_output=false +permissions/change_component_enabled_state=false +permissions/change_configuration=false +permissions/change_network_state=false +permissions/change_wifi_multicast_state=false +permissions/change_wifi_state=false +permissions/clear_app_cache=false +permissions/clear_app_user_data=false +permissions/control_location_updates=false +permissions/delete_cache_files=false +permissions/delete_packages=false +permissions/device_power=false +permissions/diagnostic=false +permissions/disable_keyguard=false +permissions/dump=false +permissions/expand_status_bar=false +permissions/factory_test=false +permissions/flashlight=false +permissions/force_back=false +permissions/get_accounts=false +permissions/get_package_size=false +permissions/get_tasks=false +permissions/get_top_activity_info=false +permissions/global_search=false +permissions/hardware_test=false +permissions/inject_events=false +permissions/install_location_provider=false +permissions/install_packages=false +permissions/install_shortcut=false +permissions/internal_system_window=false +permissions/internet=false +permissions/kill_background_processes=false +permissions/location_hardware=false +permissions/manage_accounts=false +permissions/manage_app_tokens=false +permissions/manage_documents=false +permissions/manage_external_storage=false +permissions/master_clear=false +permissions/media_content_control=false +permissions/modify_audio_settings=false +permissions/modify_phone_state=false +permissions/mount_format_filesystems=false +permissions/mount_unmount_filesystems=false +permissions/nfc=false +permissions/persistent_activity=false +permissions/process_outgoing_calls=false +permissions/read_calendar=false +permissions/read_call_log=false +permissions/read_contacts=false +permissions/read_external_storage=false +permissions/read_frame_buffer=false +permissions/read_history_bookmarks=false +permissions/read_input_state=false +permissions/read_logs=false +permissions/read_phone_state=false +permissions/read_profile=false +permissions/read_sms=false +permissions/read_social_stream=false +permissions/read_sync_settings=false +permissions/read_sync_stats=false +permissions/read_user_dictionary=false +permissions/reboot=false +permissions/receive_boot_completed=false +permissions/receive_mms=false +permissions/receive_sms=false +permissions/receive_wap_push=false +permissions/record_audio=false +permissions/reorder_tasks=false +permissions/restart_packages=false +permissions/send_respond_via_message=false +permissions/send_sms=false +permissions/set_activity_watcher=false +permissions/set_alarm=false +permissions/set_always_finish=false +permissions/set_animation_scale=false +permissions/set_debug_app=false +permissions/set_orientation=false +permissions/set_pointer_speed=false +permissions/set_preferred_applications=false +permissions/set_process_limit=false +permissions/set_time=false +permissions/set_time_zone=false +permissions/set_wallpaper=false +permissions/set_wallpaper_hints=false +permissions/signal_persistent_processes=false +permissions/status_bar=false +permissions/subscribed_feeds_read=false +permissions/subscribed_feeds_write=false +permissions/system_alert_window=false +permissions/transmit_ir=false +permissions/uninstall_shortcut=false +permissions/update_device_stats=false +permissions/use_credentials=false +permissions/use_sip=false +permissions/vibrate=false +permissions/wake_lock=false +permissions/write_apn_settings=false +permissions/write_calendar=false +permissions/write_call_log=false +permissions/write_contacts=false +permissions/write_external_storage=false +permissions/write_gservices=false +permissions/write_history_bookmarks=false +permissions/write_profile=false +permissions/write_secure_settings=false +permissions/write_settings=false +permissions/write_sms=false +permissions/write_social_stream=false +permissions/write_sync_settings=false +permissions/write_user_dictionary=false + +[preset.1] + +name="Web" +platform="Web" +runnable=false +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="web/Boronotes.html" +encryption_include_filters="" +encryption_exclude_filters="" +encrypt_pck=false +encrypt_directory=false + +[preset.1.options] + +custom_template/debug="" +custom_template/release="" +variant/extensions_support=false +vram_texture_compression/for_desktop=false +vram_texture_compression/for_mobile=false +html/export_icon=true +html/custom_html_shell="" +html/head_include="" +html/canvas_resize_policy=2 +html/focus_canvas_on_start=true +html/experimental_virtual_keyboard=false +progressive_web_app/enabled=true +progressive_web_app/offline_page="" +progressive_web_app/display=1 +progressive_web_app/orientation=2 +progressive_web_app/icon_144x144="" +progressive_web_app/icon_180x180="" +progressive_web_app/icon_512x512="" +progressive_web_app/background_color=Color(0, 0, 0, 1) diff --git a/main.gd b/main.gd index 3412f36..acb3f31 100644 --- a/main.gd +++ b/main.gd @@ -1,65 +1,96 @@ class_name Main extends Control +@onready var note_page: NotePage = %NotePage +@onready var edit_note_page: EditNotePage = %EditNotePage +@onready var save_manager = $Utils/SaveManager + +var editing: bool = false : + set(value): + editing = value + note_page.visible = not editing + edit_note_page.visible = editing + 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) - +func display_page() -> void: + var note_title = current_note.title if current_note else "Главная" 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) + if editing: + edit_note_page.display( + current_note.id if current_note else "", + note_title, + display_notes + ) + else: + note_page.display(note_title, display_notes) 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) + save_manager.load_data() - notes = [ - note_1, - note_2, - note_3, - note_1_1, - note_1_2, - note_1_2_1, - note_2_1, - ] - - display_note() + display_page() -func _on_back_button_pressed(): +func _on_note_page_back_pressed(): current_note = previous_notes.pop_back() - display_note() + note_page.back_button.disabled = previous_notes.size() == 0 + display_page() -func _on_note_item_pressed(note: Note) -> void: +func _on_note_page_edit_pressed(): + editing = true + display_page() + + +func _on_note_page_note_pressed(note: Note) -> void: previous_notes.append(current_note) current_note = note - display_note() + note_page.back_button.disabled = false + display_page() func _on_save_manager_load_notes(loaded_notes): + editing = false notes = loaded_notes + print(loaded_notes) + display_page() + + +func _on_edit_button_pressed(): + editing = true + display_page() + + +func _on_edit_note_page_canceled(): + editing = false + + +func _on_edit_note_page_saved(changed_notes: Array[ChangeNote]): + editing = false + for changed_note in changed_notes: + match changed_note.kind: + ChangeNote.Kind.ADDED: + if changed_note.note.title.strip_edges(): + notes.append(changed_note.note) + ChangeNote.Kind.DELETED: + notes.erase(changed_note.note) + display_page() + save_manager.save_data(notes) + + +func _notification(what: int) -> void: + match what: + NOTIFICATION_WM_GO_BACK_REQUEST: + if editing: + editing = false + elif previous_notes.size(): + _on_note_page_back_pressed() + else: + get_tree().quit() + + + diff --git a/main.tscn b/main.tscn index 773ccfb..4624800 100644 --- a/main.tscn +++ b/main.tscn @@ -1,8 +1,8 @@ [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="PackedScene" uid="uid://cfqcqoc8kxmde" path="res://pages/note_page/note_page.tscn" id="2_jvvy0"] +[ext_resource type="PackedScene" uid="uid://bjv84skijj764" path="res://pages/edit_note_page/edit_note_page.tscn" id="3_801py"] [ext_resource type="Script" path="res://save_manager/save_manager.gd" id="5_o2kvf"] [node name="Main" type="Control"] @@ -14,73 +14,23 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("1_nrdxj") -[node name="PanelContainer" type="PanelContainer" parent="."] +[node name="NotePage" parent="." instance=ExtResource("2_jvvy0")] +unique_name_in_owner = true 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"] +[node name="EditNotePage" parent="." instance=ExtResource("3_801py")] 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 +visible = false +layout_mode = 1 [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="back_pressed" from="NotePage" to="." method="_on_note_page_back_pressed"] +[connection signal="edit_pressed" from="NotePage" to="." method="_on_note_page_edit_pressed"] +[connection signal="note_pressed" from="NotePage" to="." method="_on_note_page_note_pressed"] +[connection signal="canceled" from="EditNotePage" to="." method="_on_edit_note_page_canceled"] +[connection signal="saved" from="EditNotePage" to="." method="_on_edit_note_page_saved"] [connection signal="load_notes" from="Utils/SaveManager" to="." method="_on_save_manager_load_notes"] diff --git a/pages/edit_note_page/edit_note_page.gd b/pages/edit_note_page/edit_note_page.gd new file mode 100644 index 0000000..b8bf086 --- /dev/null +++ b/pages/edit_note_page/edit_note_page.gd @@ -0,0 +1,58 @@ +class_name EditNotePage +extends PanelContainer + +signal canceled() +signal saved(changed_notes: Array[ChangeNote]) + +@onready var page_title: Label = %PageTitle +@onready var notes_container: VBoxContainer = %NotesContainer + +const EDIT_NOTE_ITEM = preload("res://components/edit_note_item/edit_note_item.tscn") + +var _current_note_id: String +var _changes: Array[ChangeNote] = [] + + +func display_notes(): + for child in notes_container.get_children(): + notes_container.remove_child(child) + + for change_note in _changes: + if change_note.kind == ChangeNote.Kind.DELETED: + continue + var note_item = EDIT_NOTE_ITEM.instantiate() + note_item.note = change_note.note + notes_container.add_child(note_item) + note_item.deleted.connect(_on_edit_node_item_deleted) + + +func display(current_note_id: String, title: String, notes: Array[Note]): + _current_note_id = current_note_id + page_title.text = title + + _changes = [] + for note in notes: + _changes.append(ChangeNote.new(ChangeNote.Kind.CHANGED, note)) + + display_notes() + + +func _on_edit_node_item_deleted(note: Note): + for changed_note in _changes: + if changed_note.note == note: + changed_note.kind = ChangeNote.Kind.DELETED + display_notes() + break + + +func _on_cancel_button_pressed(): + canceled.emit() + + +func _on_save_button_pressed(): + saved.emit(_changes) + + +func _on_add_note_button_pressed(): + _changes.append(ChangeNote.new(ChangeNote.Kind.ADDED, Note.create("", _current_note_id))) + display_notes() diff --git a/pages/edit_note_page/edit_note_page.tscn b/pages/edit_note_page/edit_note_page.tscn new file mode 100644 index 0000000..247f2d7 --- /dev/null +++ b/pages/edit_note_page/edit_note_page.tscn @@ -0,0 +1,83 @@ +[gd_scene load_steps=5 format=3 uid="uid://bjv84skijj764"] + +[ext_resource type="Texture2D" uid="uid://c56dek8bl3vq0" path="res://assets/close.png" id="1_4wdhj"] +[ext_resource type="Script" path="res://pages/edit_note_page/edit_note_page.gd" id="1_41gfg"] +[ext_resource type="Texture2D" uid="uid://cwnsbx7xl0syt" path="res://assets/save.png" id="2_pkfdj"] +[ext_resource type="Texture2D" uid="uid://b5djp0ut3b0ck" path="res://assets/add.png" id="3_ca8sq"] + +[node name="EditNotePage" type="PanelContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_41gfg") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 32 +theme_override_constants/margin_top = 32 +theme_override_constants/margin_right = 32 +theme_override_constants/margin_bottom = 32 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/PanelContainer/MarginContainer"] +layout_mode = 2 + +[node name="CancelButton" type="Button" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] +custom_minimum_size = Vector2(64, 64) +layout_mode = 2 +icon = ExtResource("1_4wdhj") +flat = true +expand_icon = true + +[node name="PageTitle" type="Label" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "Главная" + +[node name="SaveButton" type="Button" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] +custom_minimum_size = Vector2(64, 64) +layout_mode = 2 +icon = ExtResource("2_pkfdj") +flat = true +expand_icon = true + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_left = 32 +theme_override_constants/margin_top = 32 +theme_override_constants/margin_right = 32 +theme_override_constants/margin_bottom = 32 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="NotesContainer" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="AddNoteButton" type="Button" parent="VBoxContainer/ScrollContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "Добавить Запись" +icon = ExtResource("3_ca8sq") +alignment = 0 +expand_icon = true + +[connection signal="pressed" from="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/CancelButton" to="." method="_on_cancel_button_pressed"] +[connection signal="pressed" from="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/SaveButton" to="." method="_on_save_button_pressed"] +[connection signal="pressed" from="VBoxContainer/ScrollContainer/MarginContainer/VBoxContainer/AddNoteButton" to="." method="_on_add_note_button_pressed"] diff --git a/pages/note_page/note_page.gd b/pages/note_page/note_page.gd new file mode 100644 index 0000000..905ad3b --- /dev/null +++ b/pages/note_page/note_page.gd @@ -0,0 +1,38 @@ +class_name NotePage +extends PanelContainer + +signal edit_pressed() +signal back_pressed() +signal note_pressed(note: Note) + +const NOTE_ITEM = preload("res://components/note_item/note_item.tscn") + +@onready var back_button = %BackButton + +@onready var page_title: Label = %PageTitle +@onready var notes_container: VBoxContainer = %NotesContainer + + +func display(title: String, notes: Array[Note]) -> void: + page_title.text = title + + for child in notes_container.get_children(): + notes_container.remove_child(child) + + for note in 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 _on_note_item_pressed(note: Note) -> void: + note_pressed.emit(note) + + +func _on_back_button_pressed(): + back_pressed.emit() + + +func _on_edit_button_pressed(): + edit_pressed.emit() diff --git a/pages/note_page/note_page.tscn b/pages/note_page/note_page.tscn new file mode 100644 index 0000000..f55550c --- /dev/null +++ b/pages/note_page/note_page.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=4 format=3 uid="uid://cfqcqoc8kxmde"] + +[ext_resource type="Texture2D" uid="uid://byohq4ewrecgx" path="res://assets/back.png" id="1_oquw8"] +[ext_resource type="Script" path="res://pages/note_page/note_page.gd" id="1_toc5b"] +[ext_resource type="Texture2D" uid="uid://bel5s26rbieoi" path="res://assets/edit.png" id="2_gvek1"] + +[node name="NotePage" type="PanelContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_toc5b") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="PanelContainer" type="PanelContainer" parent="VBoxContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 32 +theme_override_constants/margin_top = 32 +theme_override_constants/margin_right = 32 +theme_override_constants/margin_bottom = 32 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/PanelContainer/MarginContainer"] +layout_mode = 2 + +[node name="BackButton" type="Button" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(64, 64) +layout_mode = 2 +disabled = true +icon = ExtResource("1_oquw8") +flat = true +expand_icon = true + +[node name="PageTitle" type="Label" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +text = "Главная" + +[node name="EditButton" type="Button" parent="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer"] +custom_minimum_size = Vector2(64, 64) +layout_mode = 2 +icon = ExtResource("2_gvek1") +flat = true +expand_icon = true + +[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_left = 32 +theme_override_constants/margin_top = 32 +theme_override_constants/margin_right = 32 +theme_override_constants/margin_bottom = 32 + +[node name="NotesContainer" type="VBoxContainer" parent="VBoxContainer/ScrollContainer/MarginContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_constants/separation = 16 + +[connection signal="pressed" from="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/BackButton" to="." method="_on_back_button_pressed"] +[connection signal="pressed" from="VBoxContainer/PanelContainer/MarginContainer/HBoxContainer/EditButton" to="." method="_on_edit_button_pressed"] diff --git a/project.godot b/project.godot index 3abe619..2fdede1 100644 --- a/project.godot +++ b/project.godot @@ -13,6 +13,7 @@ config_version=5 config/name="Boronotes" config/version="0.0.1" run/main_scene="res://main.tscn" +config/quit_on_go_back=false config/features=PackedStringArray("4.2", "Mobile") config/icon="res://icon.svg" @@ -22,6 +23,7 @@ window/size/viewport_width=900 window/size/viewport_height=1600 window/size/resizable=false window/stretch/mode="canvas_items" +window/stretch/aspect="expand" window/handheld/orientation=1 [gui] @@ -31,3 +33,4 @@ theme/custom="res://styles/app_theme.tres" [rendering] renderer/rendering_method="mobile" +textures/vram_compression/import_etc2_astc=true diff --git a/save_manager/save_manager.gd b/save_manager/save_manager.gd index 7154747..d46089e 100644 --- a/save_manager/save_manager.gd +++ b/save_manager/save_manager.gd @@ -8,6 +8,7 @@ var file_name: String = "user://save_notes.tres" func save_data(notes: Array[Note]) -> void: var saved_data = SavedData.new() + print(notes.size()) saved_data.notes = notes ResourceSaver.save(saved_data, file_name) @@ -15,5 +16,6 @@ func save_data(notes: Array[Note]) -> void: func load_data() -> void: if ResourceLoader.exists(file_name): var saved_data = ResourceLoader.load(file_name) as SavedData + print(saved_data.notes.size()) load_notes.emit(saved_data.notes) diff --git a/styles/app_theme.tres b/styles/app_theme.tres index 32b83d7..b1d8141 100644 --- a/styles/app_theme.tres +++ b/styles/app_theme.tres @@ -1,7 +1,24 @@ -[gd_resource type="Theme" load_steps=2 format=3 uid="uid://dhg5k56ynipbp"] +[gd_resource type="Theme" load_steps=4 format=3 uid="uid://dhg5k56ynipbp"] [ext_resource type="StyleBox" uid="uid://bfvw2cfuiduki" path="res://styles/white_panel_flat.tres" id="1_rasl3"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3hlj0"] +bg_color = Color(1, 1, 1, 0.784314) +border_width_left = 8 +border_width_top = 8 +border_width_right = 8 +border_width_bottom = 8 +border_color = Color(1, 1, 1, 0.784314) +corner_radius_top_left = 8 +corner_radius_top_right = 8 +corner_radius_bottom_right = 8 +corner_radius_bottom_left = 8 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_r70c8"] +bg_color = Color(1, 1, 1, 0.784314) +border_width_bottom = 2 +border_color = Color(0, 0.309804, 0.819608, 1) + [resource] Button/colors/font_color = Color(0, 0, 0, 1) Button/colors/font_focus_color = Color(0, 0, 0, 1) @@ -10,7 +27,12 @@ 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 +Button/styles/normal = SubResource("StyleBoxFlat_3hlj0") Label/colors/font_color = Color(0, 0, 0, 1) Label/font_sizes/font_size = 30 +LineEdit/colors/caret_color = Color(0.521569, 0.521569, 0.521569, 1) +LineEdit/colors/clear_button_color = Color(0.521569, 0.521569, 0.521569, 1) +LineEdit/colors/font_color = Color(0, 0, 0, 1) +LineEdit/colors/font_placeholder_color = Color(0.54902, 0.54902, 0.54902, 0.6) +LineEdit/styles/normal = SubResource("StyleBoxFlat_r70c8") PanelContainer/styles/panel = ExtResource("1_rasl3")