moved development over to github

This commit is contained in:
Jaap Marsman 2023-10-07 08:17:00 +08:00
parent 306304c2a6
commit afc53483d1
57 changed files with 975 additions and 1 deletions

2
.gitignore vendored
View File

@ -8,6 +8,8 @@ export.cfg
export_presets.cfg
*.import
.godot/
godot/.import/
godot/.godot/
# Imported translations (automatically generated from CSV files)
*.translation

39
COPYRIGHTS.md Normal file
View File

@ -0,0 +1,39 @@
# Copyrights
This document attributes the different components used to build the Wellbeing App.
## The engine: Godot
This app uses Godot Engine, available under the following license:
Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. Copyright (c) 2014-2022 Godot Engine contributors.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
## Fonts (as part of Godot)
Portions of this software are copyright © 2022 The FreeType Project (www.freetype.org). All rights reserved. The app uses the Noto font family, for which <a href="https://github.com/notofonts/noto-fonts/blob/main/LICENSE" target="_blank">the full license is available here</a>.
## Internet module Mbed TLS (as part of Godot)
Copyright The Mbed TLS Contributors
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
## Multiplayer module ENET (as part of Godot)
Copyright (c) 2002-2020 Lee Salzman
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

22
FEATURES.md Normal file
View File

@ -0,0 +1,22 @@
# A list of features currently implemented
- Saving & loading of persistent variables to user.ini on the default folder. This should work across all devices. (Currently tested across MacOS and Linux)
- Ability to add your own name.
- Coded several controllers in separate scripts that access different variables and portions of the app, to allow for flexible future development.
# A list of features "in progress"
- Working with the system time to present time-related information.
- Bug-testing and a robust "welcome new user" approach to the saving of persistent data.
- A "reset" button to remove the user.ini file from within the app.
# A list of future features to come before next release
- Wellbeing Cards (one-a-day) depending on user-selected categories.
- A serviceable GUI.
- A name (and logo, icon, etc).
# Bucket list of features for future releases
- White Noise sound section
- Journal section

1
LICENSE.md Normal file
View File

@ -0,0 +1 @@
<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank"><img alt="Creative Commons Licence" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank">Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License</a>.

7
PRIVACY.md Normal file
View File

@ -0,0 +1,7 @@
# Privacy Statement
- As can be seen by inspecting the source code, the app contains no tracking features or advertisement systems of ANY kind. I am not interested in your data.
- Any data entered into the app (your name, birthdate, etc) is stored locally on your device.
- The only internet connectivity that the app employs is to check for app updates online (by checking the file version_stuff.csv here on GitHub). If you're not online, the check fails, simple as that. The code for this function will only trigger if you press the "Check for Updates" button. It can be inspected in start_menu.gd
Too often "free" apps make you their product. Or are free with a hefty subscription lurking around the corner. I get it, for some people, such apps are their livelihood. For me, it's something I wish to develop and hope other people find useful. There is no monetary gain here. Of course I'm curious to see who uses the app. That's why I offer the option to subscribe to a newsletter, which is different. It's opt-in privacy-by-design stuff. You don't want to sign up? Don't press the button. It's really that simple. :)

View File

@ -1,3 +1,43 @@
<p align="center">
<img src="./data/main_icon_smaller.png" width="200" height="200">
</p>
# Wellbeing App (currently unnamed)
I have moved all code and future development to my self-hosted Gitea: [click here to view this repo there](https://gitea.defiantjc.synology.me/jaap/wellbeingapp).
A freeware and open source wellbeing app.
## Guiding Principles
This app is being developed, researched and released using the following guiding principles:
1. **Research-informed**: Wherever possible, any intervention or activity suggested by the app will be supported by academic research. An up-to-date list of academic references (APA style) will be kept within the app with a very brief description on what segment of the app it informed. A more detailed breakdown may appear on my private website, or here, at some point.
2. **Agile practises**: I will try to adopt agile coding practises as I go through. This means I aim to release useful features as soon as possible and reiterate, refactor and improve based on feedback. Using the in-app feedback button to let me know how things work for you is therefore the best way to gather this information at this stage.
3. **Cross-platform**: The app will (when a first release happens, see the [Features document for an overview](FEATURES.md)) be cross-platform, available initially for Windows, MacOS, Linux & iOS. Android may happen, I currently don't have any Android devices to play with.
4. **Free, Open Source**: Inspired by the likes of the NOBA project, the Linux community and countless other highly successful Free, Open Source Software (FOSS) projects out there, my aim is to offer a wide-ranging wellbeing tool available for free to anyone who seeks to use this. The only exception may be future iOS versions, due to the requirement for a paid Developer account with Apple. This will depend on any changes in my personal financial situation.
5. **Potentially informing my own research**: This guiding principle may develop into something cohesive or fall away completely. I am currently a student at Glasgow University, completing my Master's in Science in Psychology (online conversion). Depending on how successful I am with developing this project, I may end up designing a research project around it to inform my dissertation / thesis. This is an idea I'm toying with. If this pans out, the research project will run separate from this app, but I will seek volunteers to gather anonymous usage data from. I will not build *any* telemetry into this app. Ever. Any sampling and data collection will run through a separate platform (most likely LimeSurvey).
## Psychological Principles, Definitions and Criteria
Equally important are the psychological principles that guide decisions about what to include in this app. Since many concepts have varying definitions I will keep an overview here.
1. All activities and interventions available in the app will be *research-informed*. As explained by Ashman (2018), it is noted where evidence exists and where it does not, with decisions made accordingly. This approach acknowledges that, even where evidence exists, it may have other considerations, e.g. a very small number of participants or participants from a similar background or ethnicity.
2. There is no conclusive definition of *wellbeing*. For the purposes of this app, wellbeing is seen not as a state or fixed endpoint. Similar to work-life balance, it is seen as something we must always strive to maintain. A number of *self-care* interventions can assist with this balancing.
3. The concept of a psychologically rich life, as defined by Oishi & Westgate (2022) which states three related, but distinct aspects of a good life: happiness, meaning and psychological richness.
## Development Logs
My aim is to write a development log (or potentially record one on YouTube now and again) whenever I have something meaningful to say. These are hosted on my personal blog. Links to these dev logs are listed below, for easy reference.
- <a href="https://www.jaapmarsman.com/post/2022-08-10-devlog-one/" target="_blank">DevLog #1</a>
## License & Attributions
<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank"><img alt="Creative Commons Licence" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank">Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License</a>.
For an overview of all underlying licences, copyrights and attributions, please see the [Copyrights document](COPYRIGHTS.md).
## References
Ashman, G. (2018). The truth about teaching: An evidence-informed guide for new teachers. SAGE.
Oishi, S., & Westgate, E. C. (2022). A psychologically rich life: Beyond happiness and meaning. Psychological Review, 129(4), 790811. [https://doi.org/10.1037/rev0000317](https://doi.org/10.1037/rev0000317)

BIN
data/main_icon_smaller.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

3
data/wellbeing_cards.csv Normal file
View File

@ -0,0 +1,3 @@
id,category,title,description,picture_id,audio_id,language
00001,GWB,Nostalgic Media Consumption,,,,en
,,,,,,
1 id category title description picture_id audio_id language
2 00001 GWB Nostalgic Media Consumption en
3

BIN
design_files/colour_scheme.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
design_files/journal_idea.md (Stored with Git LFS) Normal file

Binary file not shown.

BIN
design_files/main_icon.afdesign (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-Black.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-BlackItalic.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-Bold.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-BoldItalic.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-ExtraBold.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-ExtraBoldItalic.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-ExtraLight.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-ExtraLightItalic.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-Italic.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-Light.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-LightItalic.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-Medium.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-MediumItalic.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-Regular.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-SemiBold.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-SemiBoldItalic.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-Thin.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/NotoSansDisplay-ThinItalic.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/noto_sans_display.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/noto_sans_display_bold.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/fonts/noto_sans_display_italic.ttf (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/icons/mac_icon.icns (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/icons/main_icon.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/icons/main_icon_big_sur_small.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
godot/Assets/icons/main_icon_smaller.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,3 @@
[gd_scene format=2]
[node name="daily_prompts" type="CanvasLayer"]

5
godot/apps/pomodoro.tscn Normal file
View File

@ -0,0 +1,5 @@
[gd_scene format=2]
[node name="pomodoro" type="CanvasLayer"]
[node name="25min_timer" type="Timer" parent="."]

View File

@ -0,0 +1,31 @@
extends GridContainer
@onready var user_values = get_node("/root/UserValues")
func _ready():
# Access the "country_menu" PopupMenu through this.
var birth_month_popup_menu: PopupMenu = $button_birth_month.get_popup()
var birth_day_popup_menu: PopupMenu = $button_birth_day.get_popup()
# Signal for when the user selects an PopupMenu item.
var _error = birth_month_popup_menu.connect("id_pressed",Callable(self,"_on_month_selected"))
var _error2 = birth_day_popup_menu.connect("id_pressed",Callable(self,"_on_day_selected"))
if user_values.user_birth_month != 0:
$button_birth_month.text = str("Month " + str(user_values.user_birth_month))
if user_values.user_birth_day != 0:
$button_birth_day.text = str("Day " + str(user_values.user_birth_day))
func _on_month_selected( id ):
print(id)
user_values.user_birth_month = id
$button_birth_month.text = str("Month " + str(id))
func _on_day_selected( id ):
print(id)
user_values.user_birth_day = id
$button_birth_day.text = str("Day " + str(id))

View File

@ -0,0 +1,9 @@
extends Button
func _ready():
pass # Replace with function body.
func _on_button_email_feedback_pressed():
var _error = OS.shell_open("mailto:feedback@jaapmarsman.com")

8
godot/button_name.gd Normal file
View File

@ -0,0 +1,8 @@
extends Button
@onready var ui_control = get_node("/root/UiControl")
func _on_button_name_pressed():
ui_control.show_user_menu()

View File

@ -0,0 +1,5 @@
extends Button
func _on_button_open_github_pressed():
var _error = OS.shell_open("https://gitea.defiantjc.synology.me/jaap/wellbeingapp")

39
godot/button_user_save.gd Normal file
View File

@ -0,0 +1,39 @@
extends Button
@onready var node_variables = get_node("/root/NodeVariables")
@onready var ui_control = get_node("/root/UiControl")
@onready var user_values = get_node("/root/UserValues")
@onready var user_name = get_node("%textbox_user_name")
func _on_button_user_save_pressed():
if user_name.text == "":
# Prettify this later with a friendly user prompt
print("Won't continue. Put in name.")
else:
# First time label turns off - this is done every time - no harm in that?
node_variables.first_time_label.visible = false
# Stores values in ini file
user_values.config.set_value("User", "user_name", user_name.text)
user_values.user_first_name = user_name.text
user_values.config.set_value("User", "user_birth_month", user_values.user_birth_month)
user_values.config.set_value("User", "user_birth_day", user_values.user_birth_day)
#config.set_value("Player1", "best_score", 10)
#onfig.set_value("Player2", "player_name", "V3geta")
#config.set_value("Player2", "best_score", 9001)
# Save it to a file (overwrite if already exists).
# Need to make sure I never lose any values I add.
# This seems to be a manual thing to program.
# So per value, make sure to read it upon load.
# And write it out again as well.
user_values.config.save("user://user.ini")
node_variables.welcome_label.text = user_values.welcome_day_part + user_values.user_first_name + "!"
ui_control.show_start_menu()

View File

@ -0,0 +1,3 @@
[
{"id": "", "category": "", "title": "", "description": "", "picture_id": "", "audio_id": "", "language": ""}
]

7
godot/default_env.tres Normal file
View File

@ -0,0 +1,7 @@
[gd_resource type="Environment" load_steps=2 format=3 uid="uid://dkny61n28xihu"]
[sub_resource type="Sky" id="1"]
[resource]
background_mode = 2
sky = SubResource("1")

33
godot/main_screen.gd Normal file
View File

@ -0,0 +1,33 @@
extends CanvasLayer
@onready var node_variables = get_node("/root/NodeVariables")
@onready var ui_control = get_node("/root/UiControl")
@onready var user_values = get_node("/root/UserValues")
func _ready():
# Read config file if it exists
# otherwise set up new user data
if user_values.err != OK:
ui_control.show_user_menu()
node_variables.first_time_label.visible = true
else:
# Set starting state visibility
ui_control.show_start_menu()
node_variables.first_time_label.visible = false
# define variables from ini file
node_variables.user_name.text = user_values.user_first_name
# Iterate over all sections.
# for player in config.get_sections():
# # Fetch the data for each section.
# var player_name = config.get_value(player, "player_name")
# var player_score = config.get_value(player, "best_score")
#func _process(delta):
# pass

16
godot/node_variables.gd Normal file
View File

@ -0,0 +1,16 @@
extends Node
@onready var main_screen = get_node("/root/main_screen")
@onready var start_menu = get_node("/root/main_screen/UI/top_container/start_menu")
@onready var user_menu = get_node("/root/main_screen/UI/top_container/user_details")
@onready var daily_prompts = get_node("/root/main_screen/UI/top_container/daily_prompts")
@onready var user_name = get_node("/root/main_screen/UI/top_container/user_details/user_menu/green_panel/textbox_user_name")
@onready var first_time_label = get_node("/root/main_screen/UI/top_container/user_details/user_menu/green_panel/label_first_time")
@onready var welcome_label = get_node("/root/main_screen/UI/top_container/start_menu/welcome_title")
func _ready():
pass

18
godot/program_values.gd Normal file
View File

@ -0,0 +1,18 @@
extends Node
# This variable lists the release number.
# This is "the number of releases".
var release_version : int = 1
# The var web_release_version is pulled from GitHub
# when the update button is checked. A higher value means
# an update is available
var web_release_version : int = 0
var current_version : String = "0.0.8"
func _ready():
pass

46
godot/project.godot Normal file
View File

@ -0,0 +1,46 @@
; 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="Wellbeing App"
run/main_scene="res://start_screen.tscn"
config/features=PackedStringArray("4.1")
run/low_processor_mode=true
config/icon="res://Assets/icons/main_icon.png"
[autoload]
UserValues="*res://user_values.gd"
ProgramValues="*res://program_values.gd"
UiControl="*res://ui_control.gd"
NodeVariables="*res://node_variables.gd"
[display]
window/size/viewport_width=1280
window/size/viewport_height=720
window/size/window_width_override=2560
window/size/window_height_override=1440
window/energy_saving/keep_screen_on=false
window/stretch/mode="2d"
window/stretch/aspect="keep_width"
[gui]
theme/use_hidpi=true
[physics]
common/enable_pause_aware_picking=true
[rendering]
environment/defaults/default_environment="res://default_env.tres"

33
godot/start_menu.gd Normal file
View File

@ -0,0 +1,33 @@
extends CanvasLayer
var csv_url : String = "https://gitea.defiantjc.synology.me/jaap/wellbeingapp/raw/branch/main/version_info.csv"
var welcome_day_part : String = " "
func _ready():
$version_label.text = "Version " + str(ProgramValues.current_version)
UserValues.get_device_time()
UserValues.set_welcome_day_part()
$welcome_title.text = UserValues.welcome_day_part + UserValues.user_first_name + "!"
func _on_button_update_check_pressed():
$HTTPRequest.request(csv_url)
func update_user_name_label():
$welcome_title.text = "Good morning, " + UserValues.user_first_name + "!"
func _on_HTTPRequest_request_completed(_result, _response_code, _headers, body):
var test_json_conv = JSON.new()
test_json_conv.parse(body.get_string_from_utf8())
var json = test_json_conv.get_data()
print(json)
ProgramValues.web_release_version = json
if ProgramValues.web_release_version > ProgramValues.release_version:
print("There's an update!")
elif ProgramValues.web_release_version == ProgramValues.release_version:
print("There is no update!")

95
godot/start_menu.tscn Normal file
View File

@ -0,0 +1,95 @@
[gd_scene load_steps=6 format=3 uid="uid://wp6d880w6h6u"]
[ext_resource type="Script" path="res://start_menu.gd" id="1"]
[ext_resource type="Script" path="res://button_name.gd" id="2"]
[ext_resource type="Script" path="res://button_email_feedback.gd" id="3"]
[ext_resource type="Script" path="res://button_open_github.gd" id="4"]
[ext_resource type="Theme" uid="uid://cqlpsmjde8oae" path="res://wb_theme.tres" id="5"]
[node name="start_menu" type="CanvasLayer"]
script = ExtResource("1")
[node name="welcome_title" type="Label" parent="."]
unique_name_in_owner = true
anchors_preset = 5
anchor_left = 0.5
anchor_right = 0.5
offset_left = -185.0
offset_top = 2.0
offset_right = 185.0
offset_bottom = 36.0
theme = ExtResource("5")
text = "All your base are belong to us"
[node name="HTTPRequest" type="HTTPRequest" parent="."]
[node name="version_label" type="Label" parent="."]
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_left = 5.0
offset_top = -31.0
offset_right = 1280.0
offset_bottom = -1.0
theme = ExtResource("5")
text = "Version"
[node name="GridContainer" type="HFlowContainer" parent="."]
offset_left = 10.0
offset_top = 55.0
offset_right = 1270.0
offset_bottom = 665.0
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="button_daily_action" type="Button" parent="GridContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme = ExtResource("5")
text = "Daily Action"
[node name="button_open_github" type="Button" parent="GridContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme = ExtResource("5")
text = "GitHub"
script = ExtResource("4")
[node name="button_email_feedback" type="Button" parent="GridContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme = ExtResource("5")
text = "Feedback"
script = ExtResource("3")
[node name="button_name" type="Button" parent="GridContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme = ExtResource("5")
text = "Name"
script = ExtResource("2")
[node name="button_update_check" type="Button" parent="GridContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme = ExtResource("5")
text = "Check for Updates"
[node name="button_journal" type="Button" parent="GridContainer"]
visible = false
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme = ExtResource("5")
text = "Journal"
[connection signal="request_completed" from="HTTPRequest" to="." method="_on_HTTPRequest_request_completed"]
[connection signal="pressed" from="GridContainer/button_open_github" to="GridContainer/button_open_github" method="_on_button_open_github_pressed"]
[connection signal="pressed" from="GridContainer/button_email_feedback" to="GridContainer/button_email_feedback" method="_on_button_email_feedback_pressed"]
[connection signal="pressed" from="GridContainer/button_name" to="GridContainer/button_name" method="_on_button_name_pressed"]
[connection signal="pressed" from="GridContainer/button_update_check" to="." method="_on_button_update_check_pressed"]

141
godot/start_screen.tscn Normal file
View File

@ -0,0 +1,141 @@
[gd_scene load_steps=7 format=3 uid="uid://dqlqsachnxomy"]
[ext_resource type="Script" path="res://main_screen.gd" id="1"]
[ext_resource type="PackedScene" path="res://user_details.tscn" id="2"]
[ext_resource type="PackedScene" uid="uid://wp6d880w6h6u" path="res://start_menu.tscn" id="3"]
[ext_resource type="PackedScene" path="res://apps/daily_prompts.tscn" id="4"]
[ext_resource type="Theme" uid="uid://cqlpsmjde8oae" path="res://wb_theme.tres" id="5"]
[ext_resource type="PackedScene" path="res://apps/pomodoro.tscn" id="6"]
[node name="main_screen" type="CanvasLayer"]
script = ExtResource("1")
[node name="UI" type="CanvasLayer" parent="."]
[node name="background_light" type="ColorRect" parent="UI"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
color = Color(0.94902, 0.937255, 0.85098, 1)
[node name="top_bar" type="Panel" parent="UI"]
custom_minimum_size = Vector2(0, 40)
offset_right = 1280.0
offset_bottom = 40.0
[node name="top_container" type="VBoxContainer" parent="UI"]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = 42.0
offset_bottom = -48.0
theme = ExtResource("5")
[node name="start_menu" parent="UI/top_container" instance=ExtResource("3")]
visible = false
[node name="welcome_title" parent="UI/top_container/start_menu" index="0"]
anchors_preset = 5
offset_top = 0.0
offset_bottom = 34.0
grow_horizontal = 2
[node name="version_label" parent="UI/top_container/start_menu" index="2"]
anchors_preset = 2
offset_left = 0.0
offset_top = -30.0
offset_right = 1275.0
offset_bottom = 0.0
grow_vertical = 0
[node name="button_daily_action" parent="UI/top_container/start_menu/GridContainer" index="0"]
layout_mode = 2
[node name="button_open_github" parent="UI/top_container/start_menu/GridContainer" index="1"]
layout_mode = 2
[node name="button_email_feedback" parent="UI/top_container/start_menu/GridContainer" index="2"]
layout_mode = 2
[node name="button_name" parent="UI/top_container/start_menu/GridContainer" index="3"]
layout_mode = 2
[node name="button_update_check" parent="UI/top_container/start_menu/GridContainer" index="4"]
layout_mode = 2
[node name="button_journal" parent="UI/top_container/start_menu/GridContainer" index="5"]
layout_mode = 2
[node name="user_details" parent="UI/top_container" instance=ExtResource("2")]
visible = false
[node name="user_menu" parent="UI/top_container/user_details" index="0"]
anchors_preset = 8
grow_horizontal = 2
grow_vertical = 2
[node name="green_panel" parent="UI/top_container/user_details/user_menu" index="0"]
layout_mode = 2
[node name="label_first_time" parent="UI/top_container/user_details/user_menu/green_panel" index="0"]
layout_mode = 0
anchor_right = 0.0
offset_top = 0.0
offset_right = 1.0
offset_bottom = 34.0
[node name="textbox_user_name" parent="UI/top_container/user_details/user_menu/green_panel" index="1"]
layout_mode = 0
anchor_left = 0.0
anchor_right = 0.0
offset_left = 0.0
offset_top = 0.0
offset_right = 700.0
offset_bottom = 34.0
[node name="birthday_selector" parent="UI/top_container/user_details/user_menu/green_panel" index="2"]
layout_mode = 0
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 0.0
offset_top = 0.0
offset_right = 267.0
offset_bottom = 34.0
[node name="button_birth_month" parent="UI/top_container/user_details/user_menu/green_panel/birthday_selector" index="0"]
layout_mode = 2
[node name="button_birth_day" parent="UI/top_container/user_details/user_menu/green_panel/birthday_selector" index="1"]
layout_mode = 2
[node name="button_user_save" parent="UI/top_container/user_details/user_menu/green_panel" index="3"]
layout_mode = 0
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 0.0
anchor_bottom = 0.0
offset_left = 0.0
offset_top = 0.0
offset_right = 148.57
offset_bottom = 34.0
[node name="daily_prompts" parent="UI/top_container" instance=ExtResource("4")]
visible = false
[node name="pomodoro" parent="UI/top_container" instance=ExtResource("6")]
visible = false
[node name="bottom_bar" type="Panel" parent="UI"]
custom_minimum_size = Vector2(0, 40)
anchors_preset = 12
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = -40.0
[editable path="UI/top_container/start_menu"]
[editable path="UI/top_container/user_details"]
[editable path="UI/top_container/daily_prompts"]
[editable path="UI/top_container/pomodoro"]

30
godot/ui_control.gd Normal file
View File

@ -0,0 +1,30 @@
extends Node
@onready var node_variables = get_node("/root/NodeVariables")
@onready var user_values = get_node("/root/UserValues")
func _ready():
pass
func show_start_menu():
node_variables.main_screen.visible = true
node_variables.start_menu.visible = true
node_variables.user_menu.visible = false
node_variables.daily_prompts.visible = false
func show_user_menu():
node_variables.main_screen.visible = true
node_variables.start_menu.visible = false
node_variables.user_menu.visible = true
node_variables.daily_prompts.visible = false
func show_daily_prompts():
node_variables.main_screen.visible = true
node_variables.start_menu.visible = false
node_variables.user_menu.visible = false
node_variables.daily_prompts.visible = true

89
godot/user_details.tscn Normal file
View File

@ -0,0 +1,89 @@
[gd_scene load_steps=4 format=2]
[ext_resource path="res://button_user_save.gd" type="Script" id=1]
[ext_resource path="res://wb_theme.tres" type="Theme" id=2]
[ext_resource path="res://birthday_selector.gd" type="Script" id=3]
[node name="user_details" type="CanvasLayer"]
[node name="user_menu" type="PanelContainer" parent="."]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -500.0
offset_top = -300.0
offset_right = 500.0
offset_bottom = 300.0
theme = ExtResource( 2 )
[node name="green_panel" type="Panel" parent="user_menu"]
offset_right = 1000.0
offset_bottom = 600.0
theme = ExtResource( 2 )
[node name="label_first_time" type="Label" parent="user_menu/green_panel"]
unique_name_in_owner = true
anchor_right = 1.0
offset_top = 3.0
offset_bottom = 37.0
theme = ExtResource( 2 )
text = "First time user: Please fill in your first name below."
align = 1
[node name="textbox_user_name" type="LineEdit" parent="user_menu/green_panel"]
unique_name_in_owner = true
anchor_left = 0.5
anchor_right = 0.5
offset_left = -350.0
offset_top = 41.0
offset_right = 350.0
offset_bottom = 75.0
theme = ExtResource( 2 )
caret_blink = true
caret_blink_interval = 0.5
[node name="birthday_selector" type="GridContainer" parent="user_menu/green_panel"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -134.0
offset_top = -150.0
offset_right = 133.0
offset_bottom = -116.0
columns = 2
script = ExtResource( 3 )
[node name="button_birth_month" type="MenuButton" parent="user_menu/green_panel/birthday_selector"]
offset_right = 130.0
offset_bottom = 34.0
size_flags_horizontal = 3
text = "Month"
items = [ "January", null, 0, false, false, 1, 0, null, "", false, "February", null, 0, false, false, 2, 0, null, "", false, "March", null, 0, false, false, 3, 0, null, "", false, "April", null, 0, false, false, 4, 0, null, "", false, "May", null, 0, false, false, 5, 0, null, "", false, "June", null, 0, false, false, 6, 0, null, "", false, "July", null, 0, false, false, 7, 0, null, "", false, "August", null, 0, false, false, 8, 0, null, "", false, "September", null, 0, false, false, 9, 0, null, "", false, "October", null, 0, false, false, 10, 0, null, "", false, "November", null, 0, false, false, 11, 0, null, "", false, "December", null, 0, false, false, 12, 0, null, "", false ]
[node name="button_birth_day" type="MenuButton" parent="user_menu/green_panel/birthday_selector"]
offset_left = 138.0
offset_right = 267.0
offset_bottom = 34.0
focus_mode = 2
size_flags_horizontal = 3
theme = ExtResource( 2 )
text = "Day"
items = [ "1", null, 0, false, false, 1, 0, null, "", false, "2", null, 0, false, false, 2, 0, null, "", false, "3", null, 0, false, false, 3, 0, null, "", false, "4", null, 0, false, false, 4, 0, null, "", false, "5", null, 0, false, false, 5, 0, null, "", false, "6", null, 0, false, false, 6, 0, null, "", false, "7", null, 0, false, false, 7, 0, null, "", false, "8", null, 0, false, false, 8, 0, null, "", false, "9", null, 0, false, false, 9, 0, null, "", false, "10", null, 0, false, false, 10, 0, null, "", false, "11", null, 0, false, false, 11, 0, null, "", false, "12", null, 0, false, false, 12, 0, null, "", false, "13", null, 0, false, false, 13, 0, null, "", false, "14", null, 0, false, false, 14, 0, null, "", false, "15", null, 0, false, false, 15, 0, null, "", false, "16", null, 0, false, false, 16, 0, null, "", false, "17", null, 0, false, false, 17, 0, null, "", false, "18", null, 0, false, false, 18, 0, null, "", false, "19", null, 0, false, false, 19, 0, null, "", false, "20", null, 0, false, false, 20, 0, null, "", false, "21", null, 0, false, false, 21, 0, null, "", false, "22", null, 0, false, false, 22, 0, null, "", false, "23", null, 0, false, false, 23, 0, null, "", false, "24", null, 0, false, false, 24, 0, null, "", false, "25", null, 0, false, false, 25, 0, null, "", false, "26", null, 0, false, false, 26, 0, null, "", false, "27", null, 0, false, false, 27, 0, null, "", false, "28", null, 0, false, false, 28, 0, null, "", false, "29", null, 0, false, false, 29, 0, null, "", false, "30", null, 0, false, false, 30, 0, null, "", false, "31", null, 0, false, false, 31, 0, null, "", false ]
[node name="button_user_save" type="Button" parent="user_menu/green_panel"]
anchor_left = 0.5
anchor_top = 1.0
anchor_right = 0.5
anchor_bottom = 1.0
offset_left = -74.0
offset_top = -49.0
offset_right = 74.5701
offset_bottom = -15.0
theme = ExtResource( 2 )
text = "Done"
expand_icon = true
script = ExtResource( 1 )
[connection signal="pressed" from="user_menu/green_panel/button_user_save" to="user_menu/green_panel/button_user_save" method="_on_button_user_save_pressed"]

62
godot/user_values.gd Normal file
View File

@ -0,0 +1,62 @@
extends Node
# User values
var user_first_name = " "
var user_birth_month = 0
var user_birth_day = 0
# System time values
var date
var date_month
var date_day
var date_time
var date_time_hour
var welcome_day_part = " "
# For the login-streak thing
#var user_login_streak
#var user_last_login_year
#var user_last_login_month
#var user_last_login_day
var config = ConfigFile.new()
var err = config.load("user://user.ini")
# This function can be triggered to update the known system time.
func get_device_time():
date = Time.get_date_dict_from_system()
date_time = Time.get_time_dict_from_system()
date_time_hour = date_time.hour
date_month = date.month
date_day = date.day
print(date_month)
print(date_day)
print(date_time_hour)
func set_welcome_day_part():
if date_time_hour < 24:
welcome_day_part = "Good evening, "
if date_time_hour < 18:
welcome_day_part = "Good afternoon, "
if date_time_hour < 12:
welcome_day_part = "Good morning, "
if date_time_hour < 6:
welcome_day_part = "Good night, "
func _ready():
get_device_time()
# Read config file if it exists
# define variables from ini file
if err == OK:
user_first_name = config.get_value("User", "user_name")
user_birth_month = config.get_value("User", "user_birth_month")
user_birth_day = config.get_value("User", "user_birth_day")
else:
pass

102
godot/wb_theme.tres Normal file
View File

@ -0,0 +1,102 @@
[gd_resource type="Theme" load_steps=14 format=3 uid="uid://cqlpsmjde8oae"]
[ext_resource type="FontFile" uid="uid://xsnm8cium6dl" path="res://Assets/fonts/noto_sans_display_bold.ttf" id="1"]
[ext_resource type="FontFile" uid="uid://cvcedf0p6452r" path="res://Assets/fonts/noto_sans_display.ttf" id="2"]
[sub_resource type="FontFile" id="1"]
fallbacks = Array[Font]([ExtResource("1")])
cache/0/16/0/ascent = 0.0
cache/0/16/0/descent = 0.0
cache/0/16/0/underline_position = 0.0
cache/0/16/0/underline_thickness = 0.0
cache/0/16/0/scale = 1.0
cache/0/16/0/kerning_overrides/16/0 = Vector2(0, 0)
[sub_resource type="StyleBoxFlat" id="4"]
bg_color = Color(0.207843, 0.219608, 0.317647, 1)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
[sub_resource type="StyleBoxFlat" id="5"]
bg_color = Color(0.862745, 0.435294, 0.329412, 1)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
[sub_resource type="StyleBoxFlat" id="6"]
bg_color = Color(0.941176, 0.772549, 0.517647, 1)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
[sub_resource type="StyleBoxFlat" id="2"]
bg_color = Color(0.862745, 0.435294, 0.329412, 1)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
[sub_resource type="StyleBoxFlat" id="7"]
bg_color = Color(0.941176, 0.772549, 0.517647, 1)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
[sub_resource type="FontFile" id="3"]
fallbacks = Array[Font]([ExtResource("2")])
cache/0/16/0/ascent = 0.0
cache/0/16/0/descent = 0.0
cache/0/16/0/underline_position = 0.0
cache/0/16/0/underline_thickness = 0.0
cache/0/16/0/scale = 1.0
cache/0/16/0/kerning_overrides/16/0 = Vector2(0, 0)
[sub_resource type="FontFile" id="8"]
fallbacks = Array[Font]([ExtResource("2")])
cache/0/16/0/ascent = 0.0
cache/0/16/0/descent = 0.0
cache/0/16/0/underline_position = 0.0
cache/0/16/0/underline_thickness = 0.0
cache/0/16/0/scale = 1.0
cache/0/16/0/kerning_overrides/16/0 = Vector2(0, 0)
[sub_resource type="StyleBoxFlat" id="9"]
content_margin_left = 15.0
content_margin_right = 5.0
bg_color = Color(0.207843, 0.219608, 0.317647, 1)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
[sub_resource type="StyleBoxFlat" id="11"]
bg_color = Color(0.462745, 0.662745, 0.560784, 1)
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
border_color = Color(0.207843, 0.219608, 0.317647, 1)
corner_radius_top_left = 10
corner_radius_top_right = 10
corner_radius_bottom_right = 10
corner_radius_bottom_left = 10
[sub_resource type="StyleBoxEmpty" id="12"]
[resource]
Button/fonts/font = SubResource("1")
Button/styles/disabled = SubResource("4")
Button/styles/focus = SubResource("5")
Button/styles/hover = SubResource("6")
Button/styles/normal = SubResource("2")
Button/styles/pressed = SubResource("7")
Label/fonts/font = SubResource("3")
LineEdit/fonts/font = SubResource("8")
LineEdit/styles/normal = SubResource("9")
Panel/styles/panel = SubResource("11")
PanelContainer/styles/panel = SubResource("12")

1
version_info.csv Normal file
View File

@ -0,0 +1 @@
1
1 1