{"id":15043193,"url":"https://github.com/supchyan/lolibar","last_synced_at":"2025-04-14T21:13:14.729Z","repository":{"id":257030518,"uuid":"857141163","full_name":"supchyan/lolibar","owner":"supchyan","description":"statusbar modding tools for windows written in C#","archived":false,"fork":false,"pushed_at":"2025-04-11T19:43:28.000Z","size":705,"stargazers_count":12,"open_issues_count":8,"forks_count":0,"subscribers_count":1,"default_branch":"stable","last_synced_at":"2025-04-14T21:13:08.903Z","etag":null,"topics":["bottombar","statusbar","topbar","windows","wpf","wpf-ui"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/supchyan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-13T22:22:03.000Z","updated_at":"2025-04-11T19:43:31.000Z","dependencies_parsed_at":"2024-09-17T13:37:06.037Z","dependency_job_id":"5a771ed6-7d44-45be-b376-e668279b51fe","html_url":"https://github.com/supchyan/lolibar","commit_stats":null,"previous_names":["supchyan/lolibar"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supchyan%2Flolibar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supchyan%2Flolibar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supchyan%2Flolibar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supchyan%2Flolibar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/supchyan","download_url":"https://codeload.github.com/supchyan/lolibar/tar.gz/refs/heads/stable","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248961237,"owners_count":21189993,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bottombar","statusbar","topbar","windows","wpf","wpf-ui"],"created_at":"2024-09-24T20:48:41.117Z","updated_at":"2025-04-14T21:13:14.705Z","avatar_url":"https://github.com/supchyan.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=center\u003e\u003cimg src=https://github.com/user-attachments/assets/8acf0034-5860-440f-a814-02f5cabfa94e width=200 height=auto /\u003e\u003c/div\u003e\n\u003cbr\u003e\n\u003cdiv align=center\u003e\u003ca href=https://github.com/supchyan/lolibar/blob/stable/Mods/SupchyanMod.cs\u003e\u003cimg src=https://github.com/user-attachments/assets/853e98d7-2e1d-4c07-a0ca-70503365d3e2 /\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv align=center\u003e\u003ca href=https://github.com/supchyan/lolibar/blob/stable/Mods/ShowcaseMod.cs\u003e\u003cimg src=https://github.com/user-attachments/assets/da0fd0f4-fd2b-4b34-b6da-06e0d16438b8 /\u003e\u003c/a\u003e\u003c/div\u003e\n\n#### \u003cdiv align=center\u003elolibar | statusbar for Windows [ 10, 11 ] | C#\u003c/div\u003e\n\n## 🌸Introduction\nThis project is the **toolkit** set for modders, which allow to create statusbars for Windows. There is **NO** `ready-to-use` executable on **[Releases](https://github.com/supchyan/lolibar/releases)** page, so if you want to gain one, you can build it using this toolkit's source! Since this is C# Project, there is no complicated stuff in building procedure. Following a guide below will help you to get into it ASAP.\n\n## 🌸Similar Projects\n- **[yasb](https://github.com/da-rth/yasb) (Cross platform, Python)**\n- **[polybar](https://github.com/polybar/polybar) (Linux, C++)**\n- **[eww](https://github.com/elkowar/eww) (Linux, Rust)**\n- **[ironbar](https://github.com/JakeStanger/ironbar) (Linux, Rust)**\n\n## 🌸Average PC Usage\n\u003cdiv align=center\u003e\u003cimg src=https://github.com/user-attachments/assets/18f4fe8c-3f8b-4540-bd77-5175a0243b87 width=800 height=auto /\u003e\u003c/div\u003e\n\n## 🌸Pre-requirements\nAll modding operations is highly recommended to do in `Visual Studio 2022+`. Moreover, to build this project, you have to install `.NET 8.0 SDK`. Alternatively, you can use other `.NET SDK` versions as well, but `stable` branch targets to `.NET 8.0`, so any issues with different SDK versions you have to solve locally.\n\n## 🌸Modding Basics\nHave you ever tried to write mods for video games? So, this toolkit provide the same vibe:\n```csharp\nnamespace LolibarApp.Mods;\n\nclass ExampleEmptyMod : LolibarMod\n{\n    public override void PreInitialize()\n    {\n        // Put your Pre-Initialization code here...\n    }\n    public override void Initialize()\n    {\n        // Put your Initialization code here...\n    }\n    public override void Update()\n    {\n        // Put your Updatable code here...\n    }\n}\n```\nAs you can see, this code looks familiar with any other mod body. You can handle every single part of Lolibar's libraries here!\n\n## 🌸Your First mod\n\u003e [!TIP]\n\u003e It's highly recommended to store all mods inside **[Mods](https://github.com/supchyan/lolibar/tree/stable/Mods/)** folder.\n\nThe first step of your modding journey - **create a mod class**. Let me explain basics on pseudo `MyFirstMod.cs` example:\n```cs\nnamespace LolibarApp.Mods;\n\nclass MyFirstMod : LolibarMod\n{\n    public override void PreInitialize() { }\n    public override void Initialize() { }\n    public override void Update() { }\n}\n```\nCode you can see above is **absolute minimum** your mod must contain. Without that, Lolibar won't compile properly. Now, talk about every part in details ↓↓↓ \u003c/br\u003e\u003c/br\u003e\n\n```cs\nnamespace LolibarApp.Mods;\n```\n`namespace` have to be set as `LolibarApp.Mods` unless you want to prevent your mod from being detected by `ModLoader`. \u003c/br\u003e\u003c/br\u003e\n\n```cs\npublic override void PreInitialize() { }\n```\n`PreInitialize()` hook useful to initialize something before `Initialize()` hook invoked, because calls before initialization process started. I recommend you to setup all properties in there. What is `properties`? Let's talk about them, referencing to **[LolibarProperties](https://github.com/supchyan/lolibar/blob/stable/Source/Tools/LolibarProperties.cs)** class:\n```cs\n// Properties stores values, which uses in Lolibar's resources.\n// It can be anything, starting from styles, such as Main Color (BarColor),\n// ending by triggers, which simulates or provides something.\n\n// Basic example:\npublic override void PreInitialize()\n{\n    BarUpdateDelay            = 250;\n    BarHeight                 = 36;\n    BarColor                  = LolibarHelper.SetColor(\"#2a3247\");\n    BarContainersContentColor = LolibarHelper.SetColor(\"#6f85bd\");\n}\n```\nThis example overrides `4` different properties, which will be applied to all Lolibar's components including Lolibar itself during initialization process. \u003c/br\u003e\u003c/br\u003e\n\n```cs\npublic override void Initialize() { }\n```\n`Initialize()` hook is about to **initialize** something on application's launch. The most common usage is **initialization of the containers**. What is `container`? Let's get into it, referencing to **[LolibarContainer](https://github.com/supchyan/lolibar/blob/stable/Source/Tools/LolibarContainer.cs)** class:\n```cs\n// All \"Buttons\" / \"Data Fields\" inside your statusbar\n// have to be generated by LolibarContainer class.\n// This class automatically does job of formatting,\n// structing and comparing content inside specified components.\n// So that component's Frankenstein can be called simply - `Container`.\n\n// How to create one, using LolibarContainer class:\npublic override void Initialize()\n{\n    LolibarContainer HelloContainer = new()\n    {\n        Name          = \"HelloContainer\",\n        Parent        = Lolibar.BarCenterContainer,\n        Text          = \"Hello!\",\n        HasBackground = true\n    };\n    HelloContainer.Create();\n}\n```\n\u003c/br\u003e\n\u003cdiv align=center\u003e\u003cimg src=https://github.com/user-attachments/assets/160c0d5f-7628-42c8-aeeb-8b2ae089f372 /\u003e\u003c/div\u003e\n\n*\u003cdiv align=center\u003eResult of the initialization process we can observe after Lolibar's launch.\u003c/div\u003e*\n\u003c/br\u003e\n\nHere we can see a new object instance, that has a couple of local properties inside. Let me explain about those, which certain example has:\n* `Name` - Initial container name. Uses for automatic resources initialization;\n* `Parent` - Any other container, where **your container** should be placed;\n* `Text` - Text content of the container;\n* `HasBackground` - Trigger to draw border around the container. It's semi-transparent and fits well with the whole statusbar theme.\n\u003c/br\u003e\u003c/br\u003e\n\nI used `Lolibar.BarCenterContainer` here, which is tricky part to put `HelloContainer` into the one of default containers. Lolibar has `3` default containers to place custom containers inside:\n* `BarLeftContainer` - Most left side of the statusbar;\n* `BarRightContainer` - Most right side of the statusbar.\n* `BarCenterContainer` - This container is centered relative to `BarLeftContainer` and `BarRightContainer`. This is not a center of the status bar! \n\u003c/br\u003e\u003c/br\u003e\n\nWe've drawn a static container. Now, let's update it's content, using `Update()` hook:\n```cs\npublic override void Update() { }\n```\nThis hook is about to **update** something along statusbar's execution process. `Update()` hook has an **Update Delay** - time span, between loop iterations. Yes, `Update()` is an infinite loop hook, so keep it in mind. The interations delay can be modified by `BarUpdateDelay` property, which can be defined in `PreInitialize()` hook as well. To understand `Update()`'s principles better, check **[Examples](https://github.com/supchyan/lolibar/tree/stable/Mods/Examples)** section. By the way, **[Examples](https://github.com/supchyan/lolibar/tree/stable/Mods/Examples)** section is **great start point** in your modding journey, because it has various examples of how to create one or other thing. Anyway, let's get back to updating info in `HelloContainer`:\n```cs\nusing LolibarApp.Source.Tools;\nusing LolibarApp.Source;\n\nnamespace LolibarApp.Mods;\n\nclass MyFirstMod : LolibarMod\n{\n    // I made this container as external var to get access to it under different hooks.\n    LolibarContainer HelloContainer;\n\n    public override void PreInitialize() { }\n    public override void Initialize()\n    {\n        HelloContainer     = new()\n        {\n            Name           = \"HelloContainer\",\n            Parent         = Lolibar.BarCenterContainer,\n            Text           = \"Hello!\",\n            HasBackground  = true\n        };\n        HelloContainer.Create();\n    }\n    public override void Update() \n    {\n        HelloContainer.Text = DateTime.Now.ToString();   // Change instance's text content ...\n        HelloContainer.Update();                         // ... And update it in resources\n\n        // Now, text inside `HelloContainer` equals current OS time after every `BarUpdateDelay`.\n    }\n}\n// Simple enough, isn't it? 🐳\n```\n\u003c/br\u003e\n\u003cdiv align=center\u003e\u003cimg src=https://github.com/user-attachments/assets/0b5f5253-ff5e-4c94-82d9-7b07559e82f7 /\u003e\u003c/div\u003e\n\n*\u003cdiv align=center\u003e`HelloContainer` shows current time (every 1000ms by default).\u003c/div\u003e*\n\u003c/br\u003e\n\nTo build 'n run `Lolibar` project, you need to select preferred profile at the top of the VS and push any of `▶` `▷` buttons.\u003c/br\u003e\n\u003cdiv align=center\u003e\u003cimg src=https://github.com/user-attachments/assets/6128d51e-2de1-4d7a-9db2-2cb0e2fbf404 /\u003e\u003c/div\u003e\n\n## 🌸Next steps\nInspired enough to start modding? Then, get into **[Examples](https://github.com/supchyan/lolibar/tree/master/Mods/Examples)** section to learn more about Lolibar's capabilities. As I mentioned before, **[Examples](https://github.com/supchyan/lolibar/tree/stable/Mods/Examples)** section is **great start point** in your modding journey. Especially **[Basics](https://github.com/supchyan/lolibar/tree/stable/Mods/Examples/Basics)** section. Good luck!\n\n## 🌸Special thanks\n- **[MouseHook](https://github.com/ikst/Ikst.MouseHook) by @ikst**\n- **[VirtualDesktop](https://github.com/MScholtes/VirtualDesktop) by @MScholtes**\n- **[WindowsMediaController](https://github.com/DubyaDude/WindowsMediaController) by @DubyaDude**\n- **[The best music covers I've ever heard](https://www.youtube.com/@vallyexe) by @vally.exe**\n\n## 🌸In the end...\n\u003cdiv align=center\u003e\u003cimg src=https://github.com/user-attachments/assets/613aa8a6-e500-455f-bd8e-d1829a3d96af /\u003e\u003c/div\u003e\n\n##### \u003cdiv align=center\u003e😎My lolibar's \u003ca href=https://github.com/supchyan/lolibar/blob/stable/Mods/SupchyanMod.cs\u003emod\u003c/a\u003e showcase\u003c/div\u003e\n\n---\n##### \u003cdiv align=center\u003e ☕Have any questions or suggestions? Feel free to contact me on my [Discord](https://discord.gg/dGF8p9UGyM) Server!\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsupchyan%2Flolibar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsupchyan%2Flolibar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsupchyan%2Flolibar/lists"}