Title: Using a game engine to write a graphical interface to the
       OpenBSD package manager
       Author: Solène
       Date: 05 May 2022
       Tags: openbsd godot opensource
       Description: In this blog entry I'm explaining why I ended using a game
       engine to write a GUI program for OpenBSD and how well it turned.
       
       # Introduction
       
       I'm really trying hard to lower the barrier entry to OpenBSD, I realize
       most of my efforts are toward making OpenBSD easier.
       
       One thing I often mumbled about on OpenBSD was the lack of a user
       interface to browse packages and install them, there was a console
       program named pkg_mgr, but I never got it to work.  Of course, I'm
       totally able to install packages using the command line, but I like to
       stroll looking for packages I wouldn't know about, a GUI is perfect for
       doing so, and is also useful for people less comfortable with the
       command line.
       
       So, today, I made a graphical user interface (GUI) using OpenBSD, using
       a game engine.  Don't worry, all the packages operations are delegated
       to pkg_add and pkg_delete because they are doing they job fine.
       
 (HTM) OpenBSD AppManager project website
       
 (IMG) AppManager main menu
 (IMG) AppManager giving a summary of changes
       
       # What is it doing?
       
       The purpose of this program is simple, display the list of available
       packages, highlight in yellow the one you have installed on your
       system, and let you select new packages to install or installed
       packages to remove.
       
       It features a search input instead of displaying a blunt list of a
       dozen of thousands of entries.  The development was made on my Thinkpad
       T400 (core 2 duo), performance are excellent.
       
       One simple feature I'm proud of is the automatic classification of
       packages into three categories: GUI programs, terminal/console user
       interface programs and others.  While this is not perfect because we
       don't have this metadata anywhere, I'm reusing the dependencies'
       information to guess in which category each package belongs, so far
       it's giving great results.
       
       # About the engine
       
       I rarely write GUI application because it's often very tedious and give
       poor results, so the ratio time/result is very bad.  I've been playing
       with the Godot game engine for a week now, and I was astonished when
       I've been told the engine editor is done using the engine itself.  As
       it was blazing fast and easy to make small games, I wondered if this
       would be suitable for a simple program like a package manager
       interface.
       
       First thing I checked was if it was supporting sqlite or json data
       natively without much work.  This was important as the data used to
       query the package list is originally found in a sqlite database
       provided by the sqlports package, however the sqlite support was only
       available through 3rd party code while JSON was natively supported. 
       When writing then simple script converting data from the sqlite
       database into a json, I took the opportunity to add the logic to
       determine if it's a GUI or a TUI (Terminal UI) and make the data format
       very easy to reuse.
       
       Finally, I got a proof of concept within 2h, it was able to install
       packages from a list.  Then I added support for displaying already
       installed packages and then to delete packages.  The polishing of the
       interfaces took the most time, but the whole project didn't take more
       than 8h which is unbelievable for me.
       
       # Conclusion
       
       From today, I'll seriously think about using Godot for writing GUI
       application, did I say it's cross platform?  AppManager can be run on
       Linux or Windows (given you have pkg.json), except it will just fail at
       installing packages, but the whole UI works.
       
       Thinking about it, it could be easy to reuse it for another package
       manager.