diff --git a/MyObsidianVault/.obsidian/community-plugins.json b/MyObsidianVault/.obsidian/community-plugins.json index 686e2b5..ce4a2e4 100644 --- a/MyObsidianVault/.obsidian/community-plugins.json +++ b/MyObsidianVault/.obsidian/community-plugins.json @@ -2,5 +2,6 @@ "obsidian-excalidraw-plugin", "oz-clear-unused-images", "calc-craft", - "gdscript-syntax-highlighting" + "gdscript-syntax-highlighting", + "manual-sorting" ] \ No newline at end of file diff --git a/MyObsidianVault/.obsidian/plugins/manual-sorting/data.json b/MyObsidianVault/.obsidian/plugins/manual-sorting/data.json new file mode 100644 index 0000000..02adf6d --- /dev/null +++ b/MyObsidianVault/.obsidian/plugins/manual-sorting/data.json @@ -0,0 +1,705 @@ +{ + "customOrder": { + "/": { + "children": [ + "Knowledgebase", + "Projects", + "zz_images", + "zz_Scribble Space", + "Untitled.base", + "Untitled 1.base" + ], + "sortOrder": "custom" + }, + "Knowledgebase": { + "children": [ + "Knowledgebase/Blender", + "Knowledgebase/Git", + "Knowledgebase/Godot", + "Knowledgebase/Linux", + "Knowledgebase/PHP", + "Knowledgebase/Python", + "Knowledgebase/WebDev" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Blender": { + "children": [ + "Knowledgebase/Blender/AddOns" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Blender/AddOns": { + "children": [ + "Knowledgebase/Blender/AddOns/NodeWrangler.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Git": { + "children": [ + "Knowledgebase/Git/Cache credentials.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot": { + "children": [ + "Knowledgebase/Godot/2D", + "Knowledgebase/Godot/snippets", + "Knowledgebase/Godot/_Recommended Plugins.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D": { + "children": [ + "Knowledgebase/Godot/2D/_old", + "Knowledgebase/Godot/2D/Texture Atlas generation", + "Knowledgebase/Godot/2D/TileMapLayers and Camera2D", + "Knowledgebase/Godot/2D/Change editor language.md", + "Knowledgebase/Godot/2D/Get Atlas from TileSet in TileMapLayer.md", + "Knowledgebase/Godot/2D/Godot Custom Ressources.md", + "Knowledgebase/Godot/2D/Run project with F8.md", + "Knowledgebase/Godot/2D/Scrollable Image List.md", + "Knowledgebase/Godot/2D/Use Sprite Atlas Tile as Texture Rect (e.g. for ScrollContainer).md", + "Knowledgebase/Godot/2D/Use Tile from Atlas for UI TextureRect.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M4 - to space and beyond", + "Knowledgebase/Godot/2D/_old/Tutorial M5 - Loot it all", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story", + "Knowledgebase/Godot/2D/_old/Tutorial M8 - Start a dialogue (Managing data)" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M4 - to space and beyond": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M4 - to space and beyond/01. turning image towards direction (setting rotation).md", + "Knowledgebase/Godot/2D/_old/Tutorial M4 - to space and beyond/02. Player Input.md", + "Knowledgebase/Godot/2D/_old/Tutorial M4 - to space and beyond/03. Increasing speed.md", + "Knowledgebase/Godot/2D/_old/Tutorial M4 - to space and beyond/04. Steering vector.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M5 - Loot it all": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M5 - Loot it all/01. Self delete on collision (Area2D node).md", + "Knowledgebase/Godot/2D/_old/Tutorial M5 - Loot it all/2024-03-20 Simple signal example.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L1 - Setting up", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L2 - Exploiring UI node anchors", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L3 - your first UI scene", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L4 - Designing an interface theme", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L5 - Your first words", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L6 - Animating the text and playing sounds", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L7 - Changing expressions", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L8 - Code the expression change", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L9 - Generate buttons at runtime", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L10 - Talking wiith emotion", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L11 - Animate Sophia sliding in", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L12 - Striking a conversation", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L13 - Nailing the button", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L14 - Bringing text to life", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/_Quick structural overview.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L1 - Setting up": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L1 - Setting up/course url.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L2 - Exploiring UI node anchors": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L2 - Exploiring UI node anchors/Layout.md", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L2 - Exploiring UI node anchors/url.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L3 - your first UI scene": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L3 - your first UI scene/notes.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L4 - Designing an interface theme": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L4 - Designing an interface theme/notes.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L5 - Your first words": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L5 - Your first words/notes.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L6 - Animating the text and playing sounds": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L6 - Animating the text and playing sounds/1.) using tweens for animation.md", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L6 - Animating the text and playing sounds/2.) AudioStream.md", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L6 - Animating the text and playing sounds/3.) Full code.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L7 - Changing expressions": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L7 - Changing expressions/notes.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L8 - Code the expression change": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L8 - Code the expression change/notes.md", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L8 - Code the expression change/Using lamdba (anonymous) functions for one-off functionality.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L9 - Generate buttons at runtime": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L9 - Generate buttons at runtime/Generate buttons at runtime.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L10 - Talking wiith emotion": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L10 - Talking wiith emotion/Arrays of dictionaries.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L11 - Animate Sophia sliding in": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L11 - Animate Sophia sliding in/Node opacity.md", + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L11 - Animate Sophia sliding in/Tweens.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L12 - Striking a conversation": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L12 - Striking a conversation/notes (current code).md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L13 - Nailing the button": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L13 - Nailing the button/Defining and assigning input actions.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L14 - Bringing text to life": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M7 - Telling a story/M7.L14 - Bringing text to life/Using BBCode tags.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M8 - Start a dialogue (Managing data)": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M8 - Start a dialogue (Managing data)/Challenge", + "Knowledgebase/Godot/2D/_old/Tutorial M8 - Start a dialogue (Managing data)/UI Layout.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/_old/Tutorial M8 - Start a dialogue (Managing data)/Challenge": { + "children": [ + "Knowledgebase/Godot/2D/_old/Tutorial M8 - Start a dialogue (Managing data)/Challenge/UI Challenge.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/Texture Atlas generation": { + "children": [ + "Knowledgebase/Godot/2D/Texture Atlas generation/AI Summary.md", + "Knowledgebase/Godot/2D/Texture Atlas generation/Create TextureRect from Texture Atlas Tile.md", + "Knowledgebase/Godot/2D/Texture Atlas generation/Just use a custom pygame script.md", + "Knowledgebase/Godot/2D/Texture Atlas generation/TileMapLayer config for HexMap.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/2D/TileMapLayers and Camera2D": { + "children": [ + "Knowledgebase/Godot/2D/TileMapLayers and Camera2D/Camera2D focussing on larger TileMapLayer.md", + "Knowledgebase/Godot/2D/TileMapLayers and Camera2D/TileMaps and TileMapLayers.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Godot/snippets": { + "children": [ + "Knowledgebase/Godot/snippets/Godot HTTP Request Code.md", + "Knowledgebase/Godot/snippets/InputEvent Handling.md", + "Knowledgebase/Godot/snippets/String replacement.md", + "Knowledgebase/Godot/snippets/Tool Scripts run in editor.md", + "Knowledgebase/Godot/snippets/Using Globals for scene root and SignalBus.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Linux": { + "children": [ + "Knowledgebase/Linux/Configure printer for CUPS.md", + "Knowledgebase/Linux/vi Cursor Keys produce characters.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/PHP": { + "children": [ + "Knowledgebase/PHP/Count Capital Letters in String.md", + "Knowledgebase/PHP/set unique name.md", + "Knowledgebase/PHP/Storing image from PUT request.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/Python": { + "children": [ + "Knowledgebase/Python/Host website.md", + "Knowledgebase/Python/Writing a textfile.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/WebDev": { + "children": [ + "Knowledgebase/WebDev/1 Devilbox", + "Knowledgebase/WebDev/2 CodeIgniter", + "Knowledgebase/WebDev/Tippspiel", + "Knowledgebase/WebDev/Verleih", + "Knowledgebase/WebDev/Host directory as website.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/WebDev/1 Devilbox": { + "children": [ + "Knowledgebase/WebDev/1 Devilbox/1.) Install Devilbox + CodeIgniter.md", + "Knowledgebase/WebDev/1 Devilbox/2.) start devilbox environment.md", + "Knowledgebase/WebDev/1 Devilbox/3.) Check CodeIgniter Version.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/WebDev/2 CodeIgniter": { + "children": [ + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes", + "Knowledgebase/WebDev/2 CodeIgniter/API Project setup" + ], + "sortOrder": "custom" + }, + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes": { + "children": [ + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/01.) Create project + set default locale.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/02.) Migrations - Add entities.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/03.) Query Builder - insert, update , delete and select.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/04.) Model based query methods.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/05.) Seeder.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/06.) Application Route Methods.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/07.) How to create a route group, route namespace.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/08.) What is filter and how to use it.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/09.) creating a restful controller.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/10.) API Routes + route parameter.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/11.) Validate Controller Parameters, store uploaded image.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/12.) List students.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/13.) Show Student Details.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/14.) Update Student.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/15.) Shield Auth+Project Controller.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/16.) API Routes Setup.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/17.) Register API.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/18.) Create login.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/19.) Create API Auth Filter.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/20.) Getting user_id from shield.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/21.) User Logout API.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/22.) Create Project API.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/23.) Delete Project API.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/23.) List project API.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/24.) Delete Project API.md", + "Knowledgebase/WebDev/2 CodeIgniter/_Course Notes/25.) CORS (Cross Origin Resource Sharing).md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/WebDev/2 CodeIgniter/API Project setup": { + "children": [ + "Knowledgebase/WebDev/2 CodeIgniter/API Project setup/01.) Create project + set default locale 1.md", + "Knowledgebase/WebDev/2 CodeIgniter/API Project setup/02.) Create Auth Controller.md", + "Knowledgebase/WebDev/2 CodeIgniter/API Project setup/03.) API Routes Setup.md", + "Knowledgebase/WebDev/2 CodeIgniter/API Project setup/04.) Create API Auth Filter.md", + "Knowledgebase/WebDev/2 CodeIgniter/API Project setup/04a.) Enable CORS.md", + "Knowledgebase/WebDev/2 CodeIgniter/API Project setup/04b.) Postman Test 14.12.2024.md", + "Knowledgebase/WebDev/2 CodeIgniter/API Project setup/05.) Create Domain Model+Controller+Migration.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/WebDev/Tippspiel": { + "children": [ + "Knowledgebase/WebDev/Tippspiel/Direct php mysql backup", + "Knowledgebase/WebDev/Tippspiel/SQL Snippet - Delete users with more than 4 uppercase letters.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/WebDev/Tippspiel/Direct php mysql backup": { + "children": [ + "Knowledgebase/WebDev/Tippspiel/Direct php mysql backup/backup mysql from php.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/WebDev/Verleih": { + "children": [ + "Knowledgebase/WebDev/Verleih/TomTom" + ], + "sortOrder": "custom" + }, + "Knowledgebase/WebDev/Verleih/TomTom": { + "children": [ + "Knowledgebase/WebDev/Verleih/TomTom/Docs", + "Knowledgebase/WebDev/Verleih/TomTom/Location.md", + "Knowledgebase/WebDev/Verleih/TomTom/Testkarte anzeigen.md" + ], + "sortOrder": "custom" + }, + "Knowledgebase/WebDev/Verleih/TomTom/Docs": { + "children": [ + "Knowledgebase/WebDev/Verleih/TomTom/Docs/TomTom Login.md" + ], + "sortOrder": "custom" + }, + "Projects": { + "children": [ + "Projects/z_planning", + "Projects/z_retired" + ], + "sortOrder": "custom" + }, + "Projects/z_planning": { + "children": [ + "Projects/z_planning/Hexmapper", + "Projects/z_planning/MotorradIG2", + "Projects/z_planning/Weltenauge", + "Projects/z_planning/Tippspiel2.md" + ], + "sortOrder": "custom" + }, + "Projects/z_planning/Hexmapper": { + "children": [ + "Projects/z_planning/Hexmapper/_notes.md", + "Projects/z_planning/Hexmapper/Hexmapper Structure Notes.md" + ], + "sortOrder": "custom" + }, + "Projects/z_planning/MotorradIG2": { + "children": [ + "Projects/z_planning/MotorradIG2/planning.md" + ], + "sortOrder": "custom" + }, + "Projects/z_planning/Weltenauge": { + "children": [ + "Projects/z_planning/Weltenauge/_Infrastructure", + "Projects/z_planning/Weltenauge/Assets", + "Projects/z_planning/Weltenauge/_Allgemein.md", + "Projects/z_planning/Weltenauge/Environment.md" + ], + "sortOrder": "custom" + }, + "Projects/z_planning/Weltenauge/_Infrastructure": { + "children": [ + "Projects/z_planning/Weltenauge/_Infrastructure/forgejo installation scripts.md" + ], + "sortOrder": "custom" + }, + "Projects/z_planning/Weltenauge/Assets": { + "children": [ + "Projects/z_planning/Weltenauge/Assets/_git lfs installieren + aktivieren.md", + "Projects/z_planning/Weltenauge/Assets/Asset Regeln.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired": { + "children": [ + "Projects/z_retired/AWA", + "Projects/z_retired/Finanzielle Unabhängigkeit", + "Projects/z_retired/Zauberturm Forum" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA": { + "children": [ + "Projects/z_retired/AWA/00_Concepts", + "Projects/z_retired/AWA/01_AWS Access", + "Projects/z_retired/AWA/01a_Hetzner", + "Projects/z_retired/AWA/02_Running the binaries", + "Projects/z_retired/AWA/Blender", + "Projects/z_retired/AWA/Godot", + "Projects/z_retired/AWA/Struktur.md", + "Projects/z_retired/AWA/zz_useful_Youtube_tutorials.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/00_Concepts": { + "children": [ + "Projects/z_retired/AWA/00_Concepts/99_Component_Diagrams", + "Projects/z_retired/AWA/00_Concepts/AWA C4 System Context.md", + "Projects/z_retired/AWA/00_Concepts/AWA Godot Client Components.canvas", + "Projects/z_retired/AWA/00_Concepts/AWA High Level Concept.md", + "Projects/z_retired/AWA/00_Concepts/AWA Tools.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/00_Concepts/99_Component_Diagrams": { + "children": [ + "Projects/z_retired/AWA/00_Concepts/99_Component_Diagrams/Client.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/01_AWS Access": { + "children": [ + "Projects/z_retired/AWA/01_AWS Access/_Lambda Code Snippets", + "Projects/z_retired/AWA/01_AWS Access/Autostart AWA Servers on instance startup.md", + "Projects/z_retired/AWA/01_AWS Access/AWS Server Setup + Access.md", + "Projects/z_retired/AWA/01_AWS Access/Install crontab.md", + "Projects/z_retired/AWA/01_AWS Access/Lambda functions.md", + "Projects/z_retired/AWA/01_AWS Access/Setup role for lambda function.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/01_AWS Access/_Lambda Code Snippets": { + "children": [ + "Projects/z_retired/AWA/01_AWS Access/_Lambda Code Snippets/01 Stop AWA Server.md", + "Projects/z_retired/AWA/01_AWS Access/_Lambda Code Snippets/02 Start AWA Server.md", + "Projects/z_retired/AWA/01_AWS Access/_Lambda Code Snippets/03 Get AWA Server IP.md", + "Projects/z_retired/AWA/01_AWS Access/_Lambda Code Snippets/04 Get AWA Uptime.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/01a_Hetzner": { + "children": [ + "Projects/z_retired/AWA/01a_Hetzner/ssh login and setup.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/02_Running the binaries": { + "children": [ + "Projects/z_retired/AWA/02_Running the binaries/Auto updater in Go.md", + "Projects/z_retired/AWA/02_Running the binaries/Runtime Parameters.md", + "Projects/z_retired/AWA/02_Running the binaries/Storage Location Linux.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Blender": { + "children": [ + "Projects/z_retired/AWA/Blender/_Human Generation overview", + "Projects/z_retired/AWA/Blender/_Workbench", + "Projects/z_retired/AWA/Blender/Animation Handling", + "Projects/z_retired/AWA/Blender/Courses", + "Projects/z_retired/AWA/Blender/Exporting to Godot as glb", + "Projects/z_retired/AWA/Blender/Cut mesh.md", + "Projects/z_retired/AWA/Blender/Dissolve Edges.md", + "Projects/z_retired/AWA/Blender/Enter Weight Paint Mode.md", + "Projects/z_retired/AWA/Blender/Extend current selection.md", + "Projects/z_retired/AWA/Blender/Move Selection to new Collection.md", + "Projects/z_retired/AWA/Blender/Separate Selection into distinct object.md", + "Projects/z_retired/AWA/Blender/Simple Bake Settings.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Blender/_Human Generation overview": { + "children": [ + "Projects/z_retired/AWA/Blender/_Human Generation overview/01 Human Generator.md", + "Projects/z_retired/AWA/Blender/_Human Generation overview/Notes.md", + "Projects/z_retired/AWA/Blender/_Human Generation overview/objects to remove.png", + "Projects/z_retired/AWA/Blender/_Human Generation overview/objects to remove 2.png" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Blender/_Workbench": { + "children": [ + "Projects/z_retired/AWA/Blender/_Workbench/Naming conventions avatar blendfile versions.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Blender/Animation Handling": { + "children": [ + "Projects/z_retired/AWA/Blender/Animation Handling/images", + "Projects/z_retired/AWA/Blender/Animation Handling/01 Smart Rig Creation.md", + "Projects/z_retired/AWA/Blender/Animation Handling/02 Transfer animations.md", + "Projects/z_retired/AWA/Blender/Animation Handling/03 Rigging Humans with AutoRig Pro.md", + "Projects/z_retired/AWA/Blender/Animation Handling/04 Retargeting Humans with AutoRig Pro.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Blender/Animation Handling/images": { + "children": [ + "Projects/z_retired/AWA/Blender/Animation Handling/images/Pasted image 20240211083431.png" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Blender/Courses": { + "children": [ + "Projects/z_retired/AWA/Blender/Courses/Node School on YT.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Blender/Exporting to Godot as glb": { + "children": [ + "Projects/z_retired/AWA/Blender/Exporting to Godot as glb/Export Settings.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Godot": { + "children": [ + "Projects/z_retired/AWA/Godot/Networking", + "Projects/z_retired/AWA/Godot/Snippets", + "Projects/z_retired/AWA/Godot/User Interface", + "Projects/z_retired/AWA/Godot/Advanced Getters and Setters, useage of @tool.md", + "Projects/z_retired/AWA/Godot/Finite State Machine.md", + "Projects/z_retired/AWA/Godot/Godot World Environment Node (2D).md", + "Projects/z_retired/AWA/Godot/Saving and loading games.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Godot/Networking": { + "children": [ + "Projects/z_retired/AWA/Godot/Networking/Network Commands.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Godot/Snippets": { + "children": [ + "Projects/z_retired/AWA/Godot/Snippets/Load and instantiate scene.md", + "Projects/z_retired/AWA/Godot/Snippets/Picking a random item from an array.md", + "Projects/z_retired/AWA/Godot/Snippets/Randomly spawn objects on the screen.md", + "Projects/z_retired/AWA/Godot/Snippets/Timers.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/AWA/Godot/User Interface": { + "children": [ + "Projects/z_retired/AWA/Godot/User Interface/Inventory in Godot.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/Finanzielle Unabhängigkeit": { + "children": [ + "Projects/z_retired/Finanzielle Unabhängigkeit/Plan_Szenarien.md" + ], + "sortOrder": "custom" + }, + "Projects/z_retired/Zauberturm Forum": { + "children": [ + "Projects/z_retired/Zauberturm Forum/_Next Steps.md", + "Projects/z_retired/Zauberturm Forum/_Overview.md", + "Projects/z_retired/Zauberturm Forum/DB.md", + "Projects/z_retired/Zauberturm Forum/Models.md", + "Projects/z_retired/Zauberturm Forum/Python Demo Requests.md" + ], + "sortOrder": "custom" + }, + "zz_images": { + "children": [ + "zz_images/Pasted image 20240121135842.png", + "zz_images/Pasted image 20240204122751.png", + "zz_images/Pasted image 20240204123748.png", + "zz_images/Pasted image 20240204164006.png", + "zz_images/Pasted image 20240306100043.png", + "zz_images/Pasted image 20240320114003.png", + "zz_images/Pasted image 20240615074811.png", + "zz_images/Pasted image 20240623095140.png", + "zz_images/Pasted image 20240623095146.png", + "zz_images/Pasted image 20240623095156.png", + "zz_images/Pasted image 20240625081421.png", + "zz_images/Pasted image 20240625081825.png", + "zz_images/Pasted image 20240625083616.png", + "zz_images/Pasted image 20240626083938.png", + "zz_images/Pasted image 20240713073756.png", + "zz_images/Pasted image 20240713073933.png", + "zz_images/Pasted image 20240713074212.png", + "zz_images/Pasted image 20240713074345.png", + "zz_images/Pasted image 20240713080012.png", + "zz_images/Pasted image 20240713080125.png", + "zz_images/Pasted image 20240719083713.png", + "zz_images/Pasted image 20240720075840.png", + "zz_images/Pasted image 20240720080105.png", + "zz_images/Pasted image 20240720081104.png", + "zz_images/Pasted image 20240720081419.png", + "zz_images/Pasted image 20241112083749.png", + "zz_images/Pasted image 20241112084116.png", + "zz_images/Pasted image 20241112084252.png", + "zz_images/Pasted image 20241112084920.png", + "zz_images/Pasted image 20241112085347.png", + "zz_images/Pasted image 20241112090019.png", + "zz_images/Pasted image 20241112090048.png", + "zz_images/Pasted image 20241112090400.png", + "zz_images/Pasted image 20241112090526.png", + "zz_images/Pasted image 20241113082554.png", + "zz_images/Pasted image 20241113082703.png", + "zz_images/Pasted image 20241113083139.png", + "zz_images/Pasted image 20241113083603.png", + "zz_images/Pasted image 20241113083823.png", + "zz_images/Pasted image 20241113084056.png", + "zz_images/Pasted image 20241113084645.png", + "zz_images/Pasted image 20241113085432.png", + "zz_images/Pasted image 20241113085948.png", + "zz_images/Pasted image 20241113090300.png", + "zz_images/Pasted image 20241114084652.png", + "zz_images/Pasted image 20241114084843.png", + "zz_images/Pasted image 20241114084916.png", + "zz_images/Pasted image 20241114084945.png", + "zz_images/Pasted image 20241114085118.png", + "zz_images/Pasted image 20241114085726.png", + "zz_images/Pasted image 20241114085814.png", + "zz_images/Pasted image 20241114085826.png", + "zz_images/Pasted image 20241114090303.png", + "zz_images/Pasted image 20241115082725.png", + "zz_images/Pasted image 20241115082852.png", + "zz_images/Pasted image 20241115084552.png", + "zz_images/Pasted image 20241115084636.png", + "zz_images/Pasted image 20241115085338.png", + "zz_images/Pasted image 20241116111944.png", + "zz_images/Pasted image 20241116113439.png", + "zz_images/Pasted image 20241116113532.png", + "zz_images/Pasted image 20241117112106.png", + "zz_images/Pasted image 20241117113037.png", + "zz_images/Pasted image 20241117113342.png", + "zz_images/Pasted image 20241117113802.png", + "zz_images/Pasted image 20241118085649.png", + "zz_images/Pasted image 20241118090014.png", + "zz_images/Pasted image 20241118090047.png", + "zz_images/Pasted image 20241123100630.png", + "zz_images/Pasted image 20241123100706.png", + "zz_images/Pasted image 20241123100734.png", + "zz_images/Pasted image 20241123100756.png", + "zz_images/Pasted image 20241123100834.png", + "zz_images/Pasted image 20241123100851.png", + "zz_images/Pasted image 20241123100913.png", + "zz_images/Pasted image 20241123101019.png", + "zz_images/Pasted image 20241127140801.png", + "zz_images/Pasted image 20241129092837.png", + "zz_images/Pasted image 20241202084231.png", + "zz_images/Pasted image 20241202084303.png", + "zz_images/Pasted image 20241214094809.png", + "zz_images/Pasted image 20241214094906.png", + "zz_images/Pasted Image 20241215142109_638.png", + "zz_images/Pasted Image 20241215142859_450.png", + "zz_images/Pasted Image 20241215153022_430.png", + "zz_images/Pasted Image 20241215153237_438.png", + "zz_images/Pasted image 20241222121529.png", + "zz_images/Pasted image 20250322152916.png", + "zz_images/Pasted image 20250322153032.png", + "zz_images/Pasted image 20250322153057.png", + "zz_images/Pasted image 20250413094820.png", + "zz_images/Pasted image 20250519205008.png", + "zz_images/Pasted image 20250519205212.png", + "zz_images/User Icon.jpg" + ], + "sortOrder": "custom" + }, + "zz_Scribble Space": { + "children": [ + "zz_Scribble Space/2025-01-06.md", + "zz_Scribble Space/Monthly Goals.md", + "zz_Scribble Space/Project Progression.md" + ], + "sortOrder": "custom" + } + }, + "sortOrder": "custom", + "debugMode": false, + "newItemPlacement": "top" +} \ No newline at end of file diff --git a/MyObsidianVault/.obsidian/plugins/manual-sorting/main.js b/MyObsidianVault/.obsidian/plugins/manual-sorting/main.js new file mode 100644 index 0000000..c49a5a9 --- /dev/null +++ b/MyObsidianVault/.obsidian/plugins/manual-sorting/main.js @@ -0,0 +1,2 @@ +let e=require(`obsidian`);var t=class e{static logLevel=`silent`;style;prefix;constructor(e,t){this.scope=e,this.color=t,this.style=`color: ${this.color}; background: #21202a; padding: 1px 5px; border-radius: 5px; font-family: consolas, monospace; font-size: 11px; border: 1px solid ${this.color}50;`,this.prefix=`%cMS|${this.scope}`}info=(...e)=>this.log(`log`,...e);warn=(...e)=>this.log(`warn`,...e);error=(...e)=>this.log(`error`,...e);infoCompact=(t,...n)=>{e.logLevel!==`silent`&&(console.groupCollapsed(this.prefix,this.style,t),console.log(...n),console.groupEnd())};log(t=`log`,...n){e.logLevel!==`silent`&&console[t](this.prefix,this.style,...n)}},n=class extends e.PluginSettingTab{constructor(e,t){super(e,t),this.plugin=t}display(){this.containerEl.empty(),new e.Setting(this.containerEl).setName(`New item placement`).setDesc(`Default new item placement.`).addDropdown(e=>e.addOption(`top`,`Top`).addOption(`bottom`,`Bottom`).setValue(this.plugin.settings.newItemPlacement).onChange(async e=>{this.plugin.settings.newItemPlacement=e,await this.plugin.saveSettings()})),new e.Setting(this.containerEl).setName(`Debug Mode`).setDesc(`Show debug logs in the console.`).addToggle(e=>e.setValue(this.plugin.settings.debugMode).onChange(async e=>{this.plugin.settings.debugMode=e,t.logLevel=e?`debug`:`silent`,await this.plugin.saveSettings()}))}},r=class extends e.Modal{constructor(t,n){super(t),this.setTitle(`Manual Sorting`),this.modalEl.addClass(`manual-sorting-modal`,`mod-form`);let r=this.contentEl.createEl(`div`);r.createEl(`p`,{text:`Reset custom order?`});let i=r.createEl(`div`,{cls:`modal-button-container`});new e.ButtonComponent(i).setButtonText(`Yep`).setCta().onClick(()=>{this.close(),n()}),new e.ButtonComponent(i).setButtonText(`Nope`).onClick(()=>this.close())}},i=class{log=new t(`DND-MANAGER`,`#a6ff00`);explorerEl;dragStartHandler=null;mouseDownHandler=null;mouseUpHandler=null;dragStartEventType=e.Platform.isMobile?`touchstart`:`dragstart`;dragEventType=e.Platform.isMobile?`touchmove`:`drag`;dropEventType=e.Platform.isMobile?`touchend`:`dragend`;rafId=0;folderExpandTimeout=null;pendingExpandFolder=null;scrollRafId=null;scrollZone=50;scrollSpeed=5;dropZonesActivationDelay=250;dropZonesActivationTimeout=null;dragZoneWidth=36;constructor(e){this.plugin=e}async enable(){this.explorerEl=await this.plugin.explorerManager.waitForExplorerElement(!0);let t=null,n=`before`;this.dragStartHandler=r=>{let i=r.target.closest(`.tree-item-self`);if(!i)return;let a=r instanceof DragEvent?r:r.touches[0],o=i.getBoundingClientRect().right-a.clientX;if(e.Platform.isMobile){if(o>this.dragZoneWidth)return;r.preventDefault()}this.log.info(`Drag started`);let s=this.explorerEl.getBoundingClientRect(),c=!1;this.explorerEl.dataset.dragActive=``,i.dataset.isBeingDragged=``;let l=new Set(this.plugin.getFileExplorerView().tree.selectedDoms),u=r=>{e.Platform.isMobile&&(r.stopPropagation(),r.preventDefault()),cancelAnimationFrame(this.rafId),this.rafId=requestAnimationFrame(()=>{this.log.info(`Dragging...`);let e=r instanceof DragEvent?r:r.touches[0];if(c=e.clientXs.right||e.clientYs.bottom,c){this.clearDropIndicators();return}this.collapseDraggedFolder(i),{futureSibling:t,dropPosition:n}=this.findDropTarget(e.clientY),this.updateDropIndicators(t,n),this.handleAutoScroll(e.clientY,s)})};i.addEventListener(this.dragEventType,u),i.addEventListener(this.dropEventType,()=>{if(this.log.info(`Item dropped`),cancelAnimationFrame(this.rafId),i.removeEventListener(this.dragEventType,u),this.clearDropIndicators(),this.stopAutoScroll(),delete this.explorerEl.dataset.dragActive,c)return;let e=i.dataset.path,r=this.plugin.getFileExplorerView().fileItems[e];if(!t)return;let a=t.querySelector(`.tree-item-self`)?.dataset.path??``,o=t.classList.contains(`temp-child`);this.plugin.orderManager.reconcileOrder(),l.has(r)?this.moveSelectedItems(l,a,o,n):this.moveItem(r,a,n,o),t=null},{once:!0})},this.mouseDownHandler=e=>{e.button===0&&(this.dropZonesActivationTimeout=window.setTimeout(()=>{this.explorerEl.dataset.dragActive===void 0&&(this.explorerEl.dataset.dragActive=``),this.dropZonesActivationTimeout=null},this.dropZonesActivationDelay))},this.mouseUpHandler=()=>{delete this.explorerEl.dataset.dragActive,this.dropZonesActivationTimeout&&=(clearTimeout(this.dropZonesActivationTimeout),null)},this.explorerEl.addEventListener(`mousedown`,this.mouseDownHandler),window.addEventListener(`mouseup`,this.mouseUpHandler),this.explorerEl.addEventListener(this.dragStartEventType,this.dragStartHandler),this.log.info(`Drag and drop enabled`)}disable(){this.dragStartHandler&&this.explorerEl.removeEventListener(this.dragStartEventType,this.dragStartHandler),this.mouseDownHandler&&this.explorerEl.removeEventListener(`mousedown`,this.mouseDownHandler),this.mouseUpHandler&&window.removeEventListener(`mouseup`,this.mouseUpHandler),this.log.info(`Drag and drop disabled`)}collapseDraggedFolder(e){if(e.classList.contains(`nav-folder-title`)&&e.dataset.path){let t=this.plugin.getFileExplorerView().fileItems[e.dataset.path];t.collapsed||t.setCollapsed(!0,!0)}}findDropTarget(e){let t=Array.from(this.explorerEl.querySelectorAll(` .tree-item:not(.nav-folder:has(> [data-is-being-dragged]) .tree-item, .nav-folder:has(> .is-selected) .tree-item) `));if(!t.length)return{futureSibling:t[0],dropPosition:`before`};let n=t[0],r=t[0].matches(`.tree-item:nth-child(1 of .tree-item)`)?`before`:`after`;return t.forEach(t=>{let i=t.classList.contains(`temp-child`),a=t.matches(`:nth-child(1 of .tree-item:has(> .is-selected):has(+ .tree-item > .is-selected))`),o=t.getBoundingClientRect(),s=o.top,c=o.bottom;t.matches(`.tree-item-children .tree-item:nth-last-child(1 of .tree-item)`)&&(c-=.01);let l=n.getBoundingClientRect()[r===`before`?`top`:`bottom`],u=Math.abs(l-e),d=Math.abs(c-e);if(de.removeAttribute(`data-drop-position`)),t.dataset.dropPosition=n;let r=t.querySelector(`:scope > .tree-item-self`),i=r?.dataset.path??``;e.Platform.isMobile&&[`nav-folder`,`is-collapsed`].every(e=>t.classList.contains(e))&&r?.dataset.isBeingDragged===void 0?this.pendingExpandFolder!==i&&(this.folderExpandTimeout!==null&&(clearTimeout(this.folderExpandTimeout),this.folderExpandTimeout=null),this.pendingExpandFolder=i,this.folderExpandTimeout=window.setTimeout(()=>{this.plugin.getFileExplorerView().fileItems[i].setCollapsed(!1,!0),this.folderExpandTimeout=null,this.pendingExpandFolder=null},800)):this.folderExpandTimeout!==null&&(clearTimeout(this.folderExpandTimeout),this.folderExpandTimeout=null,this.pendingExpandFolder=null);let a=t.querySelector(`.tree-item-children`);if(a&&!a.children.length){let e=Object.assign(document.createElement(`div`),{className:`tree-item temp-child`,innerHTML:`
`});a.appendChild(e)}document.querySelectorAll(`.nav-folder.is-drop-target`).forEach(e=>e.classList.remove(`is-drop-target`));let o=t.parentElement.closest(`.nav-folder, [data-type="file-explorer"] > .nav-files-container > div`);o&&o.classList.add(`is-drop-target`);let s=document.querySelector(`.drag-ghost-action`);if(!s)return;let c=o?.querySelector(`:scope > .tree-item-self`)?.dataset.path||this.plugin.app.vault.getName();s.innerText=i18next.t(`interface.drag-and-drop.move-into-folder`,{folder:c})}clearDropIndicators(){this.folderExpandTimeout!==null&&(clearTimeout(this.folderExpandTimeout),this.folderExpandTimeout=null,this.pendingExpandFolder=null),this.dropZonesActivationTimeout&&=(clearTimeout(this.dropZonesActivationTimeout),null),document.querySelectorAll(`[data-is-being-dragged]`).forEach(e=>e.removeAttribute(`data-is-being-dragged`)),document.querySelectorAll(`[data-drop-position]`).forEach(e=>e.removeAttribute(`data-drop-position`)),document.querySelectorAll(`.is-drop-target`).forEach(e=>e.classList.remove(`is-drop-target`)),document.querySelectorAll(`.temp-child`).forEach(e=>e.remove())}moveItem(t,n,r,i){let a=t.file,o=a.path,s=n.substring(0,n.lastIndexOf(`/`)),c=s?s+`/`+a.name:a.name;if(o!==c&&this.plugin.app.vault.getAbstractFileByPath(c)){let t=a instanceof e.TFile?c.slice(0,-(a.extension.length+1)):c;c=this.plugin.app.vault.getAvailablePath(t,a instanceof e.TFile?a.extension:``)}return i&&(n=``),o!==c||c!==n?(this.log.info(`Moving '${o}' to '${c}' (${r} '${n}')`),this.plugin.app.fileManager.renameFile(a,c),this.plugin.orderManager.move(o,c,n,r)):this.log.info(`No move needed: '${o}' is already at the target position`),this.plugin.saveSettings(),this.plugin.getFileExplorerView().lastDropTargetEl=t.el,c}moveSelectedItems(t,n,r,i){let a=Array.from(t);a.some(t=>t.file instanceof e.TFolder)&&(a=a.filter(t=>!a.some(n=>n.file instanceof e.TFolder&&n.file.path!==t.file.path&&t.file.path.startsWith(n.file.path+`/`)))),console.log(a),a=a.sort((e,t)=>{let n=e.el,r=t.el;return n.compareDocumentPosition(r)&Node.DOCUMENT_POSITION_FOLLOWING?-1:n.compareDocumentPosition(r)&Node.DOCUMENT_POSITION_PRECEDING?1:0}),a.forEach((e,t)=>{t>0&&(i=`after`,r=!1),n=this.moveItem(e,n,i,r)})}handleAutoScroll(e,t){let n=e-t.top,r=t.bottom-e;n{this.explorerEl.scrollTop+=e,this.scrollRafId=requestAnimationFrame(t)};this.scrollRafId=requestAnimationFrame(t)}stopAutoScroll(){this.scrollRafId&&=(cancelAnimationFrame(this.scrollRafId),null)}};const a=`[data-type="file-explorer"] > .nav-files-container`;var o=class{log=new t(`EXPLORER-MANAGER`,`#ffa700`);constructor(e){this.plugin=e}waitForExplorerElement=async(e=!1)=>new Promise(t=>{this.observeExplorerMount(t,!0,!0,e)});refreshExplorerOnMount=()=>this.observeExplorerMount(()=>this.refreshExplorer(),!1,!1);refreshExplorer(){this.log.info(`Refreshing Explorer after mount`),this.plugin.orderManager.reconcileOrder(),this.plugin.getFileExplorerView().setSortOrder(this.plugin.settings.sortOrder),this.plugin.isCustomSortingActive()&&this.plugin.dndManager.enable()}observeExplorerMount(e,t=!1,n=!0,r=!1){if(n){let t=document.querySelector(a);if(t instanceof HTMLElement){r||this.log.info(`Explorer already mounted`,t),console.log(),e(t);return}}new MutationObserver((n,i)=>{for(let o of n)for(let n of o.addedNodes)if(n instanceof HTMLElement&&n.matches(a)){t&&i.disconnect(),r||this.log.info(`Explorer mounted`,n),e(n);return}}).observe(document.querySelector(`.workspace`)??document.body,{childList:!0,subtree:!0})}};const s=`custom`,c={customOrder:{"/":{children:[],sortOrder:`custom`}},sortOrder:`custom`,debugMode:!1,newItemPlacement:`top`};var l=class{log=new t(`ORDER-MANAGER`,`#00ccff`);constructor(e){this.plugin=e}add(t){let n=t.path;this.log.info(`Inserting new item: '${n}'`);let r=this.plugin.settings.customOrder,i=n.substring(0,n.lastIndexOf(`/`))||`/`,a=t instanceof e.TFolder,o=this.plugin.settings.newItemPlacement;a&&(r[n]={children:[],sortOrder:`custom`}),o===`top`?r[i].children.unshift(n):r[i].children.push(n),this.logOrder(`Updated order after adding new item:`)}rename(e,t){this.log.info(`Renaming '${e}' to '${t}'`);let n=this.plugin.settings.customOrder,r=e.substring(0,e.lastIndexOf(`/`))||`/`;n[r].children=n[r].children.map(n=>n===e?t:n),e in n&&this.renameFolder(e,t),this.plugin.saveSettings(),this.logOrder(`Updated order after renaming item:`)}move(e,t,n,r){this.log.info(`Moving '${e}' to '${t}' (${r} '${n}')`);let i=this.plugin.settings.customOrder,a=e.substring(0,e.lastIndexOf(`/`))||`/`,o=t.substring(0,t.lastIndexOf(`/`))||`/`,s=e in i,c=a!==o;i[a].children=i[a].children.filter(t=>t!==e);let l=0;if(n){let e=i[o].children.indexOf(n);l=r===`before`?e:e+1}i[o].children.splice(l,0,t),s&&this.renameFolder(e,t),this.logOrder(`Updated order after moving item:`),c||(this.log.info(`Directory did not change, calling sort on File Explorer manually`),this.plugin.getFileExplorerView().sort())}remove(e){this.log.info(`Removing item: '${e}'`);let t=this.plugin.settings.customOrder,n=e.substring(0,e.lastIndexOf(`/`))||`/`,r=e in t;t[n].children=t[n].children.filter(t=>t!==e),r&&delete t[e],this.logOrder(`Updated order after removing item:`)}reconcileOrder(){this.log.info(`Updating order...`);let e=this.getCurrentOrder(),t=this.plugin.settings.customOrder,n=this.matchSavedOrder(e,t);this.plugin.settings.customOrder=n,this.logOrder(`Order updated:`)}resetOrder(){this.plugin.settings.customOrder={"/":{children:[],sortOrder:`custom`}}}logOrder(e){this.log.infoCompact(e,JSON.stringify(this.plugin.settings.customOrder,null,4))}getCurrentOrder(){let t={},n=this.plugin.getFileExplorerView(),r=i=>{let a=n.getSortedFolderItems(i,!0),o=a.map(e=>e.file.path);t[i.path]={children:o,sortOrder:`custom`};for(let t of a){let n=t.file;n instanceof e.TFolder&&r(n)}};return r(this.plugin.app.vault.root),t}matchSavedOrder(e,t){let n={};for(let r in e)if(r in t){let i=t[r],a=e[r],o=i.children.filter(e=>a.children.includes(e)),s=a.children.filter(e=>!i.children.includes(e));this.plugin.settings.newItemPlacement===`top`?n[r]={children:Array.from(new Set([...s,...o])),sortOrder:`custom`}:n[r]={children:Array.from(new Set([...o,...s])),sortOrder:`custom`}}else n[r]={children:Array.from(new Set(e[r].children)),sortOrder:`custom`};return n}removeFolder(e){let t=this.plugin.settings.customOrder;t[e].children.forEach(e=>{e in t&&this.removeFolder(e)}),delete t[e]}renameFolder(e,t){if(e===t)return;let n=this.plugin.settings.customOrder;n[t]=n[e],delete n[e],n[t].children=n[t].children.map(r=>{let i=r.replace(e,t);return r in n&&this.renameFolder(r,i),i})}};function u(e,t){let n=Object.keys(t).map(n=>d(e,n,t[n]));return n.length===1?n[0]:function(){n.forEach(e=>e())}}function d(e,t,n){let r=e[t],i=e.hasOwnProperty(t),a=i?r:function(){return Object.getPrototypeOf(e)[t].apply(this,arguments)},o=n(a);return r&&Object.setPrototypeOf(o,r),Object.setPrototypeOf(s,o),e[t]=s,c;function s(...n){return o===a&&e[t]===s&&c(),o.apply(this,n)}function c(){e[t]===s&&(i?e[t]=a:delete e[t]),o!==a&&(o=a,Object.setPrototypeOf(s,r||Function))}}var f=class{explorerUninstaller=null;menuUninstaller=null;log=new t(`PATCHER`,`#988bff`);constructor(e){this.plugin=e}patchExplorer(){let e=this,t=this.plugin,n=t.getFileExplorerView();this.explorerUninstaller=u(Object.getPrototypeOf(n),{getSortedFolderItems:e=>function(n,r){let i=e.call(this,n);if(r||!t.isCustomSortingActive())return i;let a=n.path;if(!(a in t.settings.customOrder))return i;let o=t.settings.customOrder[a].children;return i.sort((e,t)=>o.indexOf(e.file.path)-o.indexOf(t.file.path))},setSortOrder:n=>function(r){n.call(this,r),e.log.info(`Sort order changed to: '${r}'`);let i=t.isCustomSortingActive();t.settings.sortOrder=r,t.saveSettings(),i&&!t.isCustomSortingActive()&&(t.dndManager.disable(),t.getFileExplorerView().sort())}})}patchSortOrderMenu(){let t=this.plugin;this.menuUninstaller=u(e.Menu.prototype,{showAtMouseEvent:n=>function(...i){let a=i[0].target;if(a.getAttribute(`aria-label`)===i18next.t(`plugins.file-explorer.action-change-sort`)&&a.classList.contains(`nav-action-button`)){let n=this;if(t.isCustomSortingActive()){let t=n.items.find(t=>t instanceof e.MenuItem&&t.checked===!0);t&&t.setChecked(!1)}let i=s;n.addItem(e=>{e.setTitle(`Manual sorting`).setIcon(`pin`).setChecked(t.isCustomSortingActive()).setSection(i).onClick(()=>{t.isCustomSortingActive()||(t.settings.sortOrder=s,t.orderManager.reconcileOrder(),t.saveSettings(),t.getFileExplorerView().sort(),t.dndManager.enable())})}),n.addItem(e=>{e.setTitle(`Reset order`).setIcon(`trash-2`).setSection(i).onClick(()=>{new r(t.app,()=>{t.orderManager.resetOrder(),t.orderManager.reconcileOrder(),t.saveSettings(),t.getFileExplorerView().sort()}).open()})});let a=n.items,o=a.splice(8,1)[0];a.splice(0,0,o)}return n.apply(this,i)}})}unpatchExplorer(){this.explorerUninstaller&&(this.explorerUninstaller(),this.explorerUninstaller=null,this.log.info(`Explorer unpatched`))}unpatchSortOrderMenu(){this.menuUninstaller&&(this.menuUninstaller(),this.menuUninstaller=null,this.log.info(`Sort order menu unpatched`))}},p=class extends e.Plugin{orderManager=new l(this);patcher=new f(this);explorerManager=new o(this);dndManager=new i(this);log=new t(`CORE`,`#ff4828`);settings;async onload(){await this.loadSettings(),t.logLevel=this.settings.debugMode?`debug`:`silent`,this.addSettingTab(new n(this.app,this)),this.app.workspace.onLayoutReady(()=>this.initialize())}onunload(){this.patcher.unpatchExplorer(),this.patcher.unpatchSortOrderMenu(),this.dndManager.disable(),this.getFileExplorerView().sort(),this.log.info(`Manual Sorting unloaded`)}async initialize(){await this.explorerManager.waitForExplorerElement(),this.patcher.patchExplorer(),this.patcher.patchSortOrderMenu(),this.explorerManager.refreshExplorer(),this.explorerManager.refreshExplorerOnMount(),this.registerVaultHandlers()}registerVaultHandlers(){this.app.vault.on(`rename`,(e,t)=>{(t.substring(0,t.lastIndexOf(`/`))||`/`)===(e.path.substring(0,e.path.lastIndexOf(`/`))||`/`)&&(this.log.info(`Item renamed from '${t}' to '${e.path}'`),this.orderManager.rename(t,e.path))}),this.app.vault.on(`create`,e=>{this.log.info(`Item created: '${e.path}'`),this.orderManager.add(e)}),this.app.vault.on(`delete`,e=>{this.log.info(`Item deleted: '${e.path}'`),this.orderManager.remove(e.path)})}async loadSettings(){let e=await this.loadData()||{},t;e.customOrder?.[`/`]&&Array.isArray(e.customOrder[`/`])?(this.log.info(`Migrating settings to v4 format`),t=this.migrateLegacySettings(e)):t=e,this.settings={...c,...Object.fromEntries(Object.keys(c).filter(e=>e in t).map(e=>[e,t[e]]))},this.log.info(`Settings loaded:`,this.settings)}async saveSettings(){await this.saveData(this.settings),this.log.info(`Settings saved:`,this.settings)}async onExternalSettingsChange(){await this.loadSettings(),this.log.warn(`Settings changed externally`),this.getFileExplorerView().sort()}migrateLegacySettings=e=>({...e,customOrder:Object.fromEntries(Object.entries(e.customOrder).map(([e,t])=>[e,{children:t,sortOrder:`custom`}])),sortOrder:e.sortOrder===`customOrder`?s:e.sortOrder});isCustomSortingActive=()=>this.settings.sortOrder===s;getFileExplorerView=()=>this.app.workspace.getLeavesOfType(`file-explorer`)[0].view};module.exports=p; +/* nosourcemap */ \ No newline at end of file diff --git a/MyObsidianVault/.obsidian/plugins/manual-sorting/manifest.json b/MyObsidianVault/.obsidian/plugins/manual-sorting/manifest.json new file mode 100644 index 0000000..f2bd528 --- /dev/null +++ b/MyObsidianVault/.obsidian/plugins/manual-sorting/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "manual-sorting", + "name": "Manual Sorting", + "version": "3.2.4", + "minAppVersion": "0.15.0", + "description": "Drag'n'Drop sorting within file explorer.", + "author": "kh4f", + "authorUrl": "https://github.com/kh4f", + "isDesktopOnly": false +} \ No newline at end of file diff --git a/MyObsidianVault/.obsidian/plugins/manual-sorting/styles.css b/MyObsidianVault/.obsidian/plugins/manual-sorting/styles.css new file mode 100644 index 0000000..6f50856 --- /dev/null +++ b/MyObsidianVault/.obsidian/plugins/manual-sorting/styles.css @@ -0,0 +1,80 @@ +[data-type="file-explorer"] { + &:has([data-drag-active]) { + .tree-item { position: relative;} + + .tree-item.temp-child { height: 15px; } + + .tree-item:not(.nav-folder:has(> [data-is-being-dragged]) .tree-item, + .nav-folder:has(> .is-selected) .tree-item + ) { + &:not(.temp-child, :has(> .is-selected):has(+ .tree-item > .is-selected))::after, + &:where(:nth-child(1 of .tree-item))::before { + content: ""; + position: absolute; + display: block; + translate: -52% -2px; + height: 2px; + width: 80%; + left: 50%; + background-image: linear-gradient(90deg, #8888881a 50%, transparent 50%); + background-size: 8px 2px; + background-repeat: repeat-x; + border-radius: 100px; + } + } + + .tree-item[data-drop-position="before"]::before, + .tree-item[data-drop-position="after"]::after { + background-image: linear-gradient(90deg, var(--color-accent) 50%, transparent 50%) !important; + mask-image: linear-gradient(90deg, transparent 0%, black 7%, black 93%, transparent 100%); + animation: dash-flow 0.5s linear infinite; + } + + .nav-folder.is-drop-target { + background: hsla(var(--interactive-accent-hsl), 0.05) !important; + border-radius: var(--radius-s); + + > .nav-folder-title { + color: var(--nav-item-color-highlighted) !important; + } + } + + .nav-folder.is-being-dragged-over { + background-color: transparent; + > .nav-folder-title { + color: var(--nav-item-color); + } + } + } + + @media (pointer: coarse) { + .tree-item-self:not(.temp)::after { + content: "⋮⋮"; + position: absolute; + rotate: 90deg; + right: 12px; + align-self: center; + font-size: calc(var(--nav-item-size) + 2px); + opacity: 0.4; + } + } +} + +@keyframes dash-flow { + from { background-position: 0 0; } + to { background-position: 8px 0; } +} + +.menu-item[data-section="custom"] { + .menu-item-icon:first-child { display: flex; } + + .dragging-enabled-checkbox { + margin-bottom: -2px; + input { margin: 0; } + } + + .svg-icon.lucide-pin { + transform: rotate(45deg); + margin-bottom: -2px; + } +} \ No newline at end of file diff --git a/MyObsidianVault/.obsidian/plugins/obsidian-excalidraw-plugin/data.json b/MyObsidianVault/.obsidian/plugins/obsidian-excalidraw-plugin/data.json index 2682b4e..4644b92 100644 --- a/MyObsidianVault/.obsidian/plugins/obsidian-excalidraw-plugin/data.json +++ b/MyObsidianVault/.obsidian/plugins/obsidian-excalidraw-plugin/data.json @@ -114,7 +114,7 @@ "library2": { "type": "excalidrawlib", "version": 2, - "source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.16.1", + "source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.20.5", "libraryItems": [] }, "imageElementNotice": true,