changeset 241:06d6c351925c

*: reorganize resources, +docs, build translations with autotools
author Paper <paper@paper.us.eu.org>
date Mon, 22 Jan 2024 16:36:19 -0500
parents 6ffe42286978
children 82470f83f0c2
files .builds/linux.yml .builds/windows.yml CMakeLists.txt INSTALL LICENSE Makefile.am README README.md configure.ac m4/libcurl.m4 m4/m4_ax_have_qt.m4 rc/dark.qrc rc/dark.qss rc/favicon.png rc/favicon256.png rc/icons.qrc rc/icons/favicon.png rc/icons/icons.qrc rc/linux/Minori.png rc/osx/deploy_build.sh rc/win32/dark/dark.qrc rc/win32/dark/dark.qss scripts/osx/deploy_build.sh src/gui/window.cc
diffstat 24 files changed, 530 insertions(+), 1070 deletions(-) [+]
line wrap: on
line diff
--- a/.builds/linux.yml	Fri Jan 19 13:47:56 2024 -0500
+++ b/.builds/linux.yml	Mon Jan 22 16:36:19 2024 -0500
@@ -30,7 +30,7 @@
       # resources
       mkdir -p rc
       cp ../rc/linux/Minori.desktop rc/Minori.desktop
-      cp ../rc/favicon256.png rc/Minori.png
+      cp ../rc/linux/Minori.png rc/Minori.png
 
       # use linuxdeploy to make an appimage
       wget -O linuxdeploy "https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20231026-1/linuxdeploy-x86_64.AppImage"
--- a/.builds/windows.yml	Fri Jan 19 13:47:56 2024 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-image: debian/bookworm
-packages:
-  - wget
-  - tar
-  - zstd
-  - gpg
-  - clang
-  - lld
-  - xz-utils
-  - wine
-  - automake
-  - autoconf
-  - libtool
-  - ncurses-bin
-  - qtbase5-dev
-  - qttools5-dev
-sources:
-  - https://hg.sr.ht/~mrpapersonic/minori
-tasks:
-  - get-wine: |
-      sudo dpkg --add-architecture i386
-
-      sudo mkdir -pm755 /etc/apt/keyrings
-      sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
-
-      sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/debian/dists/bookworm/winehq-bookworm.sources
-
-      sudo apt update
-
-      sudo apt install -y --install-recommends winehq-devel
-  - autoreconf: |
-      cd minori
-      autoreconf -i
-  - install-win64-deps: |
-      export WINEARCH=win64
-      git clone https://github.com/holyblackcat/quasi-msys2 quasi-msys2-win64
-      cd quasi-msys2-win64
-      echo MINGW64 >msystem.txt
-      make install _gcc _qt5-base _qt5-tools _curl
-      sudo ln -nfs $(realpath ./root/mingw64) /mingw64
-  - build-win64: |
-      export WINEARCH=win64
-      mkdir -p minori/build64
-      cd minori/build64
-      sudo bash -c 'echo -n 1 >/proc/sys/fs/binfmt_misc/status'
-      bash -c 'source ../../quasi-msys2-win64/env/all.src && ../configure && make'
-  - install-win32-deps: |
-      export WINEARCH=win32
-      export WINEPREFIX="$HOME/.wine32"
-      git clone https://github.com/holyblackcat/quasi-msys2 quasi-msys2-win32
-      cd quasi-msys2-win32
-      echo MINGW32 >msystem.txt
-      make install _gcc _qt5-base _qt5-tools _curl
-  - build-win32: |
-      export WINEARCH=win32
-      export WINEPREFIX="$HOME/.wine32"
-      mkdir -p ../minori/build32
-      cd ../minori/build32
-      sudo bash -c 'echo -n 1 >/proc/sys/fs/binfmt_misc/status'
-      bash -c 'source ../../quasi-msys2-win32/env/all.src && ../configure && make'
-triggers:
-  - action: email
-    condition: failure
-    to: Paper <mrpapersonic@gmail.com>
--- a/CMakeLists.txt	Fri Jan 19 13:47:56 2024 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,224 +0,0 @@
-cmake_minimum_required(VERSION 3.18)
-project(minori LANGUAGES CXX VERSION 0.1.0)
-
-set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
-set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
-set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
-
-option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
-option(USE_QT6 "Force build with Qt 6" OFF)
-option(USE_QT5 "Force build with Qt 5" OFF)
-option(UPDATE_TRANSLATIONS "Update *.ts translation files" OFF)
-
-add_subdirectory(dep/anitomy)
-add_subdirectory(dep/animia)
-add_subdirectory(dep/pugixml)
-
-# Fix for mingw64
-list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".dll.a" ".a")
-
-if(USE_QT6)
-	set(QT_VERSION_MAJOR 6)
-elseif(USE_QT5)
-	set(QT_VERSION_MAJOR 5)
-else()
-	find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
-endif()
-
-find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets LinguistTools)
-
-find_package(CURL REQUIRED)
-
-set(LIBRARIES
-	${CURL_LIBRARIES}
-	${Qt${QT_VERSION_MAJOR}Widgets_LIBRARIES}
-	anitomy
-	animia
-	pugixml
-)
-
-# We need Cocoa for some OS X stuff
-if(APPLE)
-	find_library(FOUNDATION_LIBRARY Foundation)
-	find_library(APPKIT_LIBRARY AppKit)
-	list(APPEND LIBRARIES ${FOUNDATION_LIBRARY} ${APPKIT_LIBRARY})
-endif()
-
-set(SRC_FILES
-	# Main entrypoint
-	src/main.cc
-
-	# Core files and datatype declarations...
-	src/core/anime.cc
-	src/core/anime_db.cc
-	src/core/config.cc
-	src/core/date.cc
-	src/core/filesystem.cc
-	src/core/http.cc
-	src/core/json.cc
-	src/core/strings.cc
-	src/core/time.cc
-
-	# Main window
-	src/gui/window.cc
-	src/gui/theme.cc
-	src/gui/locale.cc
-
-	# Main window pages
-	src/gui/pages/anime_list.cc
-	src/gui/pages/now_playing.cc
-	src/gui/pages/statistics.cc
-	src/gui/pages/search.cc
-	src/gui/pages/seasons.cc
-	src/gui/pages/torrents.cc
-	src/gui/pages/history.cc
-
-	# Custom widgets
-	src/gui/widgets/anime_info.cc
-	src/gui/widgets/poster.cc
-	src/gui/widgets/clickable_label.cc
-	src/gui/widgets/sidebar.cc
-	src/gui/widgets/text.cc
-	src/gui/widgets/optional_date.cc
-
-	# Dialogs
-	src/gui/dialog/about.cc
-	src/gui/dialog/information.cc
-	src/gui/dialog/settings.cc
-	src/gui/dialog/settings/application.cc
-	src/gui/dialog/settings/services.cc
-	src/gui/dialog/settings/torrents.cc
-	src/gui/dialog/settings/recognition.cc
-	src/gui/dialog/settings/library.cc
-
-	# Translate
-	src/gui/translate/anime.cc
-	src/gui/translate/anilist.cc
-	src/gui/translate/config.cc
-
-	# Services (only AniList for now)
-	src/services/services.cc
-	src/services/anilist.cc
-
-	# Library
-	src/library/library.cc
-
-	# Tracking
-	src/track/media.cc
-
-	# Qt resources
-	rc/icons.qrc
-	rc/dark.qrc
-	rc/player_data.qrc
-)
-
-set(INCLUDE
-	include
-	dep/pugixml/src
-	dep/animia/include
-	dep/anitomy
-	dep
-)
-
-set(TS_FILES
-	rc/locale/en_GB.ts
-	rc/locale/es.ts
-)
-
-set(DEFINES)
-
-set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/rc/locale")
-
-if(UPDATE_TRANSLATIONS)
-	cmake_language(CALL qt${QT_VERSION_MAJOR}_create_translation ${SRC_FILES} ${TS_FILES} OPTIONS "-I${CMAKE_CURRENT_SOURCE_DIR}/include")
-endif()
-cmake_language(CALL qt${QT_VERSION_MAJOR}_add_translation QM_FILES ${TS_FILES})
-list(APPEND SRC_FILES ${QM_FILES})
-
-function(qt_create_resource_file outfile)
-	set(QRC "<!DOCTYPE rcc><RCC version=\"1.0\">\n\t<qresource>\n")
-	get_filename_component(DIR ${outfile} DIRECTORY)
-	foreach (qm ${ARGN})
-		file(RELATIVE_PATH name ${DIR} ${qm})
-		string(APPEND QRC "\t\t<file>${name}</file>\n")
-	endforeach()
-	string(APPEND QRC "\t</qresource>\n</RCC>\n")
-	file(WRITE ${outfile} ${QRC})
-endfunction()
-
-qt_create_resource_file("${CMAKE_CURRENT_BINARY_DIR}/rc/locale.qrc" ${QM_FILES})
-list(APPEND SRC_FILES "${CMAKE_CURRENT_BINARY_DIR}/rc/locale.qrc")
-
-# This is also used in the Win32 rc file
-set(RC_INFO_STRING "A lightweight anime tracker built with Qt.")
-
-if(APPLE) # Mac OS X (or OS X (or macOS))
-	set(MACOSX_BUNDLE_BUNDLE_NAME "Minori")
-	set(MACOSX_BUNDLE_BUNDLE_VERSION ${minori_VERSION})
-	set(MACOSX_BUNDLE_COPYRIGHT "Copyright (C) Paper 2023")
-	set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.eu.us.paper.minori")
-	set(MACOSX_BUNDLE_INFO_STRING ${RC_INFO_STRING})
-	set(MACOSX_BUNDLE_ICON_FILE rc/osx/favicon.icns)
-	set(app_icon_osx "${CMAKE_CURRENT_SOURCE_DIR}/rc/osx/favicon.icns")
-	set_source_files_properties(${app_icon_osx} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
-
-	list(APPEND SRC_FILES
-		src/sys/osx/dark_theme.cc
-		src/sys/osx/filesystem.cc
-		src/sys/osx/permissions.cc
-		${app_icon_osx}
-	)
-	list(APPEND DEFINES MACOSX)
-elseif(WIN32) # Windows
-	configure_file(
-		${CMAKE_CURRENT_SOURCE_DIR}/rc/win32/version.rc.in
-		${CMAKE_CURRENT_BINARY_DIR}/rc/version.rc
-		@ONLY
-	)
-	list(APPEND SRC_FILES
-		src/sys/win32/dark_theme.cc
-		rc/win32/resource.rc
-		${CMAKE_CURRENT_BINARY_DIR}/rc/version.rc
-	)
-	list(APPEND DEFINES WIN32)
-else()
-	if(LINUX)
-		configure_file(
-			${CMAKE_CURRENT_SOURCE_DIR}/rc/linux/Minori.desktop.in
-			${CMAKE_CURRENT_BINARY_DIR}/rc/Minori.desktop
-			@ONLY
-		)
-		configure_file(
-			${CMAKE_CURRENT_SOURCE_DIR}/rc/favicon256.png
-			${CMAKE_CURRENT_BINARY_DIR}/rc/Minori.png
-			COPYONLY
-		)
-	endif()
-
-	find_package(PkgConfig)
-	if (PKG_CONFIG_FOUND)
-		pkg_check_modules(GLIB gio-2.0 glib-2.0)
-		if (GLIB_FOUND)
-			list(APPEND SRC_FILES src/sys/glib/dark_theme.cc)
-			list(APPEND INCLUDE ${GLIB_INCLUDE_DIRS})
-			list(APPEND LIBRARIES ${GLIB_LINK_LIBRARIES})
-			list(APPEND DEFINES GLIB)
-		endif()
-	endif()
-endif()
-
-add_executable(minori WIN32 MACOSX_BUNDLE ${SRC_FILES})
-set_property(TARGET minori PROPERTY CXX_STANDARD 17)
-set_property(TARGET minori PROPERTY AUTOMOC ON)
-set_property(TARGET minori PROPERTY AUTORCC ON)
-
-target_include_directories(minori PRIVATE ${Qt${QT_VERSION_MAJOR}Widgets_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} PUBLIC ${INCLUDE})
-target_link_libraries(minori PRIVATE ${LIBRARIES})
-target_compile_options(minori PRIVATE -Wall -Wpedantic -Wextra -Wsuggest-override -Wold-style-cast)
-target_compile_definitions(minori PRIVATE ${DEFINES})
-
-if(APPLE)
-	set_target_properties(minori PROPERTIES MACOSX_BUNDLE TRUE)
-elseif(WIN32)
-	install(FILES $<TARGET_RUNTIME_DLLS:minori> TYPE BIN)
-endif()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/INSTALL	Mon Jan 22 16:36:19 2024 -0500
@@ -0,0 +1,26 @@
+This is just like any typical autotools-based project.
+
+To install, it's as simple as:
+	0). autoreconf -i
+			This step is only necessary if you're cloning from the repository.
+			Tarballs will have this step done already.
+	1). ./configure
+			Configures the build, finds Qt and the necessary runtime libraries.
+
+			NOTE: If you don't have Qt binaries on your PATH (e.g. MacPorts),
+			you can temporarily add it by prepending `PATH=qt_path:$PATH"
+			before configuring.
+	2). make
+			Builds the package.
+	3). make install
+			Installs the package. Use a suitable permission escalator like sudo
+			or doas.
+
+In some cases, the configure script will fail to find Qt. To solve this, put the
+path containing qmake into your PATH or configure pkg-config with the correct
+paths for Qt[5/6]Widgets.
+
+On OS X/macOS, you'll probably want an app bundle. To create this, simply call
+`scripts/osx/deploy_build.sh` from the build directory.
+	NOTE: This script relies on `macdeployqt` being in your PATH for it to work
+	      properly.
--- a/LICENSE	Fri Jan 19 13:47:56 2024 -0500
+++ b/LICENSE	Mon Jan 22 16:36:19 2024 -0500
@@ -1,6 +1,6 @@
 BSD 3-Clause License
 
-Copyright (c) 2023, Paper
+Copyright (c) 2023-2024, Paper
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
--- a/Makefile.am	Fri Jan 19 13:47:56 2024 -0500
+++ b/Makefile.am	Mon Jan 22 16:36:19 2024 -0500
@@ -1,9 +1,33 @@
 bin_PROGRAMS = minori
 
+minori_locale_ts = \
+	rc/locale/en_GB.ts \
+	rc/locale/es.ts
+
+.ts.qm:
+	@MKDIR_P@ `dirname $@`; \
+	@QT_LRELEASE@ $< -qm $@
+
+minori_locale_qm = $(minori_locale_ts:.ts=.qm)
+
+# this has to be in the root build folder
+translations.qrc: $(minori_locale_qm)
+	printf "<!DOCTYPE rcc><RCC version=\"1.0\">\n\t<qresource prefix=\"locale/\">\n" > $@; \
+	for q in $(minori_locale_qm); do \
+		printf "\t\t<file alias=\"%s\">%s</file>\n" "`basename $$q`" "$$q" >> $@; \
+	done; \
+	printf "\t</qresource>\n</RCC>\n" >> $@;
+
 minori_qtrc = \
-	$(top_srcdir)/rc/dark.qrc	\
-	$(top_srcdir)/rc/icons.qrc	\
-	$(top_srcdir)/rc/player_data.qrc
+	$(top_srcdir)/rc/icons/icons.qrc	\
+	$(top_srcdir)/rc/player_data.qrc	\
+	translations.qrc
+
+if BUILD_WIN
+
+minori_qtrc += $(top_srcdir)/rc/win32/dark/dark.qrc
+
+endif
 
 rc/final_qrc.cc: $(minori_qtrc)
 	@QT_RCC@ -o $@ $(minori_qtrc)
@@ -152,6 +176,6 @@
 	@MKDIR_P@ -- `dirname $@`
 	@QT_MOC@ -o $@ $(minori_includes) $<
 
-SUFFIXES = .h _moc.cc
+SUFFIXES = .h _moc.cc .ts .qm
 SUBDIRS = $(subdirs)
 ACLOCAL_AMFLAGS = -I m4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README	Mon Jan 22 16:36:19 2024 -0500
@@ -0,0 +1,4 @@
+Minori is a cross-platform Taiga clone built with Qt.
+
+For instructions on installing, view INSTALL. For documentation,
+view the docs/ directory.
\ No newline at end of file
--- a/README.md	Fri Jan 19 13:47:56 2024 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-# Minori
-A cross-platform Taiga clone.
--- a/configure.ac	Fri Jan 19 13:47:56 2024 -0500
+++ b/configure.ac	Mon Jan 22 16:36:19 2024 -0500
@@ -18,21 +18,11 @@
 AM_PROG_AR
 LT_INIT
 
-have_qt=no
 # Qt?
 AX_HAVE_QT
 
 if test "x$have_qt" = "xno"; then
-	PKG_CHECK_MODULES([QT], [Qt6Widgets >= 6.0.0], [have_qt=yes], [true])
-	# prioritize qt 5
-	PKG_CHECK_MODULES([QT], [Qt5Widgets >= 5.15.0], [have_qt=yes], [true])
-
-	if test "x$have_qt" = "xno"; then
-		AC_MSG_ERROR([*** Qt not found.])
-	fi
-
-	QT_CXXFLAGS=$QT_CFLAGS
-	AC_SUBST([QT_CXXFLAGS])
+	AC_MSG_ERROR([*** Qt not found.])
 fi
 
 # need this for moc
--- a/m4/libcurl.m4	Fri Jan 19 13:47:56 2024 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,274 +0,0 @@
-#***************************************************************************
-#                                  _   _ ____  _
-#  Project                     ___| | | |  _ \| |
-#                             / __| | | | |_) | |
-#                            | (__| |_| |  _ <| |___
-#                             \___|\___/|_| \_\_____|
-#
-# Copyright (C) David Shaw <dshaw@jabberwocky.com>
-#
-# This software is licensed as described in the file COPYING, which
-# you should have received as part of this distribution. The terms
-# are also available at https://curl.se/docs/copyright.html.
-#
-# You may opt to use, copy, modify, merge, publish, distribute and/or sell
-# copies of the Software, and permit persons to whom the Software is
-# furnished to do so, under the terms of the COPYING file.
-#
-# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
-# KIND, either express or implied.
-#
-# SPDX-License-Identifier: curl
-#
-###########################################################################
-# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION],
-#                       [ACTION-IF-YES], [ACTION-IF-NO])
-# ----------------------------------------------------------
-#      David Shaw <dshaw@jabberwocky.com>   May-09-2006
-#
-# Checks for libcurl.  DEFAULT-ACTION is the string yes or no to
-# specify whether to default to --with-libcurl or --without-libcurl.
-# If not supplied, DEFAULT-ACTION is yes.  MINIMUM-VERSION is the
-# minimum version of libcurl to accept.  Pass the version as a regular
-# version number like 7.10.1. If not supplied, any version is
-# accepted.  ACTION-IF-YES is a list of shell commands to run if
-# libcurl was successfully found and passed the various tests.
-# ACTION-IF-NO is a list of shell commands that are run otherwise.
-# Note that using --without-libcurl does run ACTION-IF-NO.
-#
-# This macro #defines HAVE_LIBCURL if a working libcurl setup is
-# found, and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary
-# values.  Other useful defines are LIBCURL_FEATURE_xxx where xxx are
-# the various features supported by libcurl, and LIBCURL_PROTOCOL_yyy
-# where yyy are the various protocols supported by libcurl.  Both xxx
-# and yyy are capitalized.  See the list of AH_TEMPLATEs at the top of
-# the macro for the complete list of possible defines.  Shell
-# variables $libcurl_feature_xxx and $libcurl_protocol_yyy are also
-# defined to 'yes' for those features and protocols that were found.
-# Note that xxx and yyy keep the same capitalization as in the
-# curl-config list (e.g. it's "HTTP" and not "http").
-#
-# Users may override the detected values by doing something like:
-# LIBCURL="-lcurl" LIBCURL_CPPFLAGS="-I/usr/myinclude" ./configure
-#
-# For the sake of sanity, this macro assumes that any libcurl that is found is
-# after version 7.7.2, the first version that included the curl-config script.
-# Note that it is important for people packaging binary versions of libcurl to
-# include this script!  Without curl-config, we can only guess what protocols
-# are available, or use curl_version_info to figure it out at runtime.
-
-AC_DEFUN([LIBCURL_CHECK_CONFIG],
-[
-  AH_TEMPLATE([LIBCURL_FEATURE_SSL],[Defined if libcurl supports SSL])
-  AH_TEMPLATE([LIBCURL_FEATURE_KRB4],[Defined if libcurl supports KRB4])
-  AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6])
-  AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz])
-  AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports AsynchDNS])
-  AH_TEMPLATE([LIBCURL_FEATURE_IDN],[Defined if libcurl supports IDN])
-  AH_TEMPLATE([LIBCURL_FEATURE_SSPI],[Defined if libcurl supports SSPI])
-  AH_TEMPLATE([LIBCURL_FEATURE_NTLM],[Defined if libcurl supports NTLM])
-
-  AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_TFTP],[Defined if libcurl supports TFTP])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_RTSP],[Defined if libcurl supports RTSP])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_POP3],[Defined if libcurl supports POP3])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_IMAP],[Defined if libcurl supports IMAP])
-  AH_TEMPLATE([LIBCURL_PROTOCOL_SMTP],[Defined if libcurl supports SMTP])
-
-  AC_ARG_WITH(libcurl,
-     AS_HELP_STRING([--with-libcurl=PREFIX],[look for the curl library in PREFIX/lib and headers in PREFIX/include]),
-     [_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])])
-
-  if test "$_libcurl_with" != "no" ; then
-
-     AC_PROG_AWK
-
-     _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[[1]]+256*A[[2]]+A[[3]]; print X;}'"
-
-     _libcurl_try_link=yes
-
-     if test -d "$_libcurl_with" ; then
-        LIBCURL_CPPFLAGS="-I$withval/include"
-        _libcurl_ldflags="-L$withval/lib"
-        AC_PATH_PROG([_libcurl_config],[curl-config],[],
-                     ["$withval/bin"])
-     else
-        AC_PATH_PROG([_libcurl_config],[curl-config],[],[$PATH])
-     fi
-
-     if test x$_libcurl_config != "x" ; then
-        AC_CACHE_CHECK([for the version of libcurl],
-           [libcurl_cv_lib_curl_version],
-           [libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $[]2}'`])
-
-        _libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse`
-        _libcurl_wanted=`echo ifelse([$2],,[0],[$2]) | $_libcurl_version_parse`
-
-        if test $_libcurl_wanted -gt 0 ; then
-           AC_CACHE_CHECK([for libcurl >= version $2],
-              [libcurl_cv_lib_version_ok],
-              [
-              if test $_libcurl_version -ge $_libcurl_wanted ; then
-                 libcurl_cv_lib_version_ok=yes
-              else
-                 libcurl_cv_lib_version_ok=no
-              fi
-              ])
-        fi
-
-        if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then
-           if test x"$LIBCURL_CPPFLAGS" = "x" ; then
-              LIBCURL_CPPFLAGS=`$_libcurl_config --cflags`
-           fi
-           if test x"$LIBCURL" = "x" ; then
-              LIBCURL=`$_libcurl_config --libs`
-
-              # This is so silly, but Apple actually has a bug in their
-              # curl-config script.  Fixed in Tiger, but there are still
-              # lots of Panther installs around.
-              case "${host}" in
-                 powerpc-apple-darwin7*)
-                    LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'`
-                 ;;
-              esac
-           fi
-
-           # All curl-config scripts support --feature
-           _libcurl_features=`$_libcurl_config --feature`
-
-           # Is it modern enough to have --protocols? (7.12.4)
-           if test $_libcurl_version -ge 461828 ; then
-              _libcurl_protocols=`$_libcurl_config --protocols`
-           fi
-        else
-           _libcurl_try_link=no
-        fi
-
-        unset _libcurl_wanted
-     fi
-
-     if test $_libcurl_try_link = yes ; then
-
-        # we did not find curl-config, so let's see if the user-supplied
-        # link line (or failing that, "-lcurl") is enough.
-        LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"}
-
-        AC_CACHE_CHECK([whether libcurl is usable],
-           [libcurl_cv_lib_curl_usable],
-           [
-           _libcurl_save_cppflags=$CPPFLAGS
-           CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS"
-           _libcurl_save_libs=$LIBS
-           LIBS="$LIBCURL $LIBS"
-
-           AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <curl/curl.h>]],[[
-/* Try and use a few common options to force a failure if we are
-   missing symbols or cannot link. */
-int x;
-curl_easy_setopt(NULL,CURLOPT_URL,NULL);
-x=CURL_ERROR_SIZE;
-x=CURLOPT_WRITEFUNCTION;
-x=CURLOPT_WRITEDATA;
-x=CURLOPT_ERRORBUFFER;
-x=CURLOPT_STDERR;
-x=CURLOPT_VERBOSE;
-if (x) {;}
-]])],libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no)
-
-           CPPFLAGS=$_libcurl_save_cppflags
-           LIBS=$_libcurl_save_libs
-           unset _libcurl_save_cppflags
-           unset _libcurl_save_libs
-           ])
-
-        if test $libcurl_cv_lib_curl_usable = yes ; then
-
-           # Does curl_free() exist in this version of libcurl?
-           # If not, fake it with free()
-
-           _libcurl_save_cppflags=$CPPFLAGS
-           CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
-           _libcurl_save_libs=$LIBS
-           LIBS="$LIBS $LIBCURL"
-
-           AC_CHECK_DECL([curl_free],[],
-              [AC_DEFINE([curl_free],[free],
-                [Define curl_free() as free() if our version of curl lacks curl_free.])],
-              [[#include <curl/curl.h>]])
-
-           CPPFLAGS=$_libcurl_save_cppflags
-           LIBS=$_libcurl_save_libs
-           unset _libcurl_save_cppflags
-           unset _libcurl_save_libs
-
-           AC_DEFINE(HAVE_LIBCURL,1,
-             [Define to 1 if you have a functional curl library.])
-           AC_SUBST(LIBCURL_CPPFLAGS)
-           AC_SUBST(LIBCURL)
-
-           for _libcurl_feature in $_libcurl_features ; do
-              AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_feature_$_libcurl_feature),[1])
-              eval AS_TR_SH(libcurl_feature_$_libcurl_feature)=yes
-           done
-
-           if test "x$_libcurl_protocols" = "x" ; then
-
-              # We do not have --protocols, so just assume that all
-              # protocols are available
-              _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT TFTP"
-
-              if test x$libcurl_feature_SSL = xyes ; then
-                 _libcurl_protocols="$_libcurl_protocols HTTPS"
-
-                 # FTPS was not standards-compliant until version
-                 # 7.11.0 (0x070b00 == 461568)
-                 if test $_libcurl_version -ge 461568; then
-                    _libcurl_protocols="$_libcurl_protocols FTPS"
-                 fi
-              fi
-
-              # RTSP, IMAP, POP3 and SMTP were added in
-              # 7.20.0 (0x071400 == 463872)
-              if test $_libcurl_version -ge 463872; then
-                 _libcurl_protocols="$_libcurl_protocols RTSP IMAP POP3 SMTP"
-              fi
-           fi
-
-           for _libcurl_protocol in $_libcurl_protocols ; do
-              AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_protocol_$_libcurl_protocol),[1])
-              eval AS_TR_SH(libcurl_protocol_$_libcurl_protocol)=yes
-           done
-        else
-           unset LIBCURL
-           unset LIBCURL_CPPFLAGS
-        fi
-     fi
-
-     unset _libcurl_try_link
-     unset _libcurl_version_parse
-     unset _libcurl_config
-     unset _libcurl_feature
-     unset _libcurl_features
-     unset _libcurl_protocol
-     unset _libcurl_protocols
-     unset _libcurl_version
-     unset _libcurl_ldflags
-  fi
-
-  if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then
-     # This is the IF-NO path
-     ifelse([$4],,:,[$4])
-  else
-     # This is the IF-YES path
-     ifelse([$3],,:,[$3])
-  fi
-
-  unset _libcurl_with
-])
--- a/m4/m4_ax_have_qt.m4	Fri Jan 19 13:47:56 2024 -0500
+++ b/m4/m4_ax_have_qt.m4	Mon Jan 22 16:36:19 2024 -0500
@@ -49,7 +49,6 @@
 #
 #   Copyright (c) 2008 Bastiaan Veelo <Bastiaan@Veelo.net>
 #   Copyright (c) 2014 Alex Henrie <alexhenrie24@gmail.com>
-#   Copyright (c) 2024 Paper <mrpapersonic@gmail.com>
 #
 #   Copying and distribution of this file, with or without modification, are
 #   permitted in any medium without royalty provided the copyright notice
@@ -61,40 +60,33 @@
 AU_ALIAS([BNV_HAVE_QT], [AX_HAVE_QT])
 AC_DEFUN([AX_HAVE_QT],
 [
-	AC_REQUIRE([AC_PROG_CXX])
-	AC_REQUIRE([AC_PATH_X])
-	AC_REQUIRE([AC_PATH_XTRA])
-	# openSUSE leap 15.3 installs qmake-qt5, not qmake, for example.
-	# Store the full name (like qmake-qt5) into QMAKE
-	# and the specifier (like -qt5 or empty) into am_have_qt_qmexe_suff.
-	AC_ARG_VAR([QMAKE],"Qt make tool")
-	AC_CHECK_TOOLS([QMAKE],[qmake qmake-qt6 qmake-qt5],[false])
+  AC_REQUIRE([AC_PROG_CXX])
+  AC_REQUIRE([AC_PATH_X])
+  AC_REQUIRE([AC_PATH_XTRA])
+  # openSUSE leap 15.3 installs qmake-qt5, not qmake, for example.
+  # Store the full name (like qmake-qt5) into QMAKE
+  # and the specifier (like -qt5 or empty) into am_have_qt_qmexe_suff.
+  AC_ARG_VAR([QMAKE],"Qt make tool")
+  AC_CHECK_TOOLS([QMAKE],[qmake qmake-qt6 qmake-qt5],[false])
 
-	AC_MSG_CHECKING(for Qt)
-	am_have_qt_qmexe_suff=`echo $QMAKE | sed 's,^.*qmake,,'`
-	# If we have Qt5 or later in the path, we're golden
-	ver=`$QMAKE --version | grep -o "Qt version ."`
+  AC_MSG_CHECKING(for Qt)
+  am_have_qt_qmexe_suff=`echo $QMAKE | sed 's,^.*qmake,,'`
+  # If we have Qt5 or later in the path, we're golden
+  ver=`$QMAKE --version | grep -o "Qt version ."`
 
-	if test "$ver" ">" "Qt version 4"; then
-		have_qt=yes
-		# This pro file dumps qmake's variables, but it only works on Qt 5 or later
-		am_have_qt_dir=`mktemp -d`
-		am_have_qt_pro="$am_have_qt_dir/test.pro"
-		am_have_qt_stash="$am_have_qt_dir/.qmake.stash"
-		am_have_qt_makefile="$am_have_qt_dir/Makefile"
-		am_have_qt_makefile_cxxflags="$am_have_qt_dir/cxxm"
-		am_have_qt_makefile_libs="$am_have_qt_dir/libsm"
-		# http://qt-project.org/doc/qt-5/qmake-variable-reference.html#qt
-		cat > $am_have_qt_pro << EOF
+  if test "$ver" ">" "Qt version 4"; then
+    have_qt=yes
+    # This pro file dumps qmake's variables, but it only works on Qt 5 or later
+    am_have_qt_dir=`mktemp -d`
+    am_have_qt_pro="$am_have_qt_dir/test.pro"
+    am_have_qt_stash="$am_have_qt_dir/.qmake.stash"
+    am_have_qt_makefile="$am_have_qt_dir/Makefile"
+    # http://qt-project.org/doc/qt-5/qmake-variable-reference.html#qt
+    cat > $am_have_qt_pro << EOF
 win32 {
-		CONFIG -= debug_and_release
-		CONFIG += release
+    CONFIG -= debug_and_release
+    CONFIG += release
 }
-mac {
-	CONFIG += sdk_no_version_check
-}
-# commented out all the modules we don't use
-#   - paper
 #qtHaveModule(axcontainer):       QT += axcontainer
 #qtHaveModule(axserver):          QT += axserver
 #qtHaveModule(concurrent):        QT += concurrent
@@ -129,139 +121,127 @@
 percent.commands = @echo -n "\$(\$(@))\ "
 QMAKE_EXTRA_TARGETS += percent
 EOF
-		cat > $am_have_qt_makefile_cxxflags << EOF
-include $am_have_qt_makefile
-
-VAR:
-	@echo \$(CXXFLAGS) \$(INCPATH)
-EOF
-		cat > $am_have_qt_makefile_libs << EOF
-include $am_have_qt_makefile
+    $QMAKE $am_have_qt_pro -o $am_have_qt_makefile
+    QT_CXXFLAGS=`cd $am_have_qt_dir; make -s -f $am_have_qt_makefile CXXFLAGS INCPATH`
+    QT_LIBS=`cd $am_have_qt_dir; make -s -f $am_have_qt_makefile LIBS`
+    rm $am_have_qt_pro $am_have_qt_stash $am_have_qt_makefile
+    rmdir $am_have_qt_dir
 
-VAR:
-	@echo \$(LIBS)
-EOF
-		$QMAKE "$am_have_qt_pro" -o "$am_have_qt_makefile"
-		QT_CXXFLAGS=`cd $am_have_qt_dir; make -s -f $am_have_qt_makefile_cxxflags VAR`
-		QT_LIBS=`cd $am_have_qt_dir; make -s -f $am_have_qt_makefile_libs VAR`
-		rm $am_have_qt_pro $am_have_qt_stash $am_have_qt_makefile $am_have_qt_makefile_cxxflags $am_have_qt_makefile_libs
-		rmdir $am_have_qt_dir
+    # Look for specific tools in $PATH
+    QT_MOC=`which moc$am_have_qt_qmexe_suff`
+    QT_UIC=`which uic$am_have_qt_qmexe_suff`
+    QT_RCC=`which rcc$am_have_qt_qmexe_suff`
+    QT_LRELEASE=`which lrelease$am_have_qt_qmexe_suff`
+    QT_LUPDATE=`which lupdate$am_have_qt_qmexe_suff`
 
-		# Look for specific tools in $PATH
-		QT_MOC=`which moc$am_have_qt_qmexe_suff`
-		QT_UIC=`which uic$am_have_qt_qmexe_suff`
-		QT_RCC=`which rcc$am_have_qt_qmexe_suff`
-		QT_LRELEASE=`which lrelease$am_have_qt_qmexe_suff`
-		QT_LUPDATE=`which lupdate$am_have_qt_qmexe_suff`
-
-		# Get Qt version from qmake
-		QT_DIR=`$QMAKE --version | grep -o -E /.+`
+    # Get Qt version from qmake
+    QT_DIR=`$QMAKE --version | grep -o -E /.+`
 
-		# All variables are defined, report the result
-		AC_MSG_RESULT([$have_qt:
-		QT_CXXFLAGS=$QT_CXXFLAGS
-		QT_DIR=$QT_DIR
-		QT_LIBS=$QT_LIBS
-		QT_UIC=$QT_UIC
-		QT_MOC=$QT_MOC
-		QT_RCC=$QT_RCC
-		QT_LRELEASE=$QT_LRELEASE
-		QT_LUPDATE=$QT_LUPDATE])
-	else
-		# Qt was not found
-		have_qt=no
-		QT_CXXFLAGS=
-		QT_DIR=
-		QT_LIBS=
-		QT_UIC=
-		QT_MOC=
-		QT_RCC=
-		QT_LRELEASE=
-		QT_LUPDATE=
-		AC_MSG_RESULT($have_qt)
-	fi
-	AC_SUBST(QT_CXXFLAGS)
-	AC_SUBST(QT_DIR)
-	AC_SUBST(QT_LIBS)
-	AC_SUBST(QT_UIC)
-	AC_SUBST(QT_MOC)
-	AC_SUBST(QT_RCC)
-	AC_SUBST(QT_LRELEASE)
-	AC_SUBST(QT_LUPDATE)
-	AC_SUBST(QMAKE)
+    # All variables are defined, report the result
+    AC_MSG_RESULT([$have_qt:
+    QT_CXXFLAGS=$QT_CXXFLAGS
+    QT_DIR=$QT_DIR
+    QT_LIBS=$QT_LIBS
+    QT_UIC=$QT_UIC
+    QT_MOC=$QT_MOC
+    QT_RCC=$QT_RCC
+    QT_LRELEASE=$QT_LRELEASE
+    QT_LUPDATE=$QT_LUPDATE])
+  else
+    # Qt was not found
+    have_qt=no
+    QT_CXXFLAGS=
+    QT_DIR=
+    QT_LIBS=
+    QT_UIC=
+    QT_MOC=
+    QT_RCC=
+    QT_LRELEASE=
+    QT_LUPDATE=
+    AC_MSG_RESULT($have_qt)
+  fi
+  AC_SUBST(QT_CXXFLAGS)
+  AC_SUBST(QT_DIR)
+  AC_SUBST(QT_LIBS)
+  AC_SUBST(QT_UIC)
+  AC_SUBST(QT_MOC)
+  AC_SUBST(QT_RCC)
+  AC_SUBST(QT_LRELEASE)
+  AC_SUBST(QT_LUPDATE)
+  AC_SUBST(QMAKE)
 
-	#### Being paranoid:
-	if test x"$have_qt" = xyes; then
-		AC_MSG_CHECKING(correct functioning of Qt installation)
-		AC_CACHE_VAL(ax_cv_qt_test_result,
-		[
-			cat > ax_qt_test.h << EOF
+  #### Being paranoid:
+  if test x"$have_qt" = xyes; then
+    AC_MSG_CHECKING(correct functioning of Qt installation)
+    AC_CACHE_VAL(ax_cv_qt_test_result,
+    [
+      cat > ax_qt_test.h << EOF
 #include <qobject.h>
 class Test : public QObject
 {
 Q_OBJECT
 public:
-	Test() {}
-	~Test() {}
+  Test() {}
+  ~Test() {}
 public slots:
-	void receive() {}
+  void receive() {}
 signals:
-	void send();
+  void send();
 };
 EOF
 
-			cat > ax_qt_main.$ac_ext << EOF
+      cat > ax_qt_main.$ac_ext << EOF
 #include "ax_qt_test.h"
 #include <qapplication.h>
 int main( int argc, char **argv )
 {
-	QApplication app( argc, argv );
-	Test t;
-	QObject::connect( &t, SIGNAL(send()), &t, SLOT(receive()) );
+  QApplication app( argc, argv );
+  Test t;
+  QObject::connect( &t, SIGNAL(send()), &t, SLOT(receive()) );
 }
 EOF
 
-			ax_cv_qt_test_result="failure"
-			ax_try_1="$QT_MOC ax_qt_test.h -o moc_ax_qt_test.$ac_ext >/dev/null 2>/dev/null"
-			AC_TRY_EVAL(ax_try_1)
-			if test x"$ac_status" != x0; then
-				echo "$ax_err_1" >&AS_MESSAGE_LOG_FD
-				echo "configure: could not run $QT_MOC on:" >&AS_MESSAGE_LOG_FD
-				cat ax_qt_test.h >&AS_MESSAGE_LOG_FD
-			else
-				ax_try_2="$CXX $QT_CXXFLAGS -c $CXXFLAGS -o moc_ax_qt_test.o moc_ax_qt_test.$ac_ext >AS_MESSAGE_LOG_FD 2>&1"
-				AC_TRY_EVAL(ax_try_2)
-				if test x"$ac_status" != x0; then
-					echo "$ax_err_2" >&AS_MESSAGE_LOG_FD
-					echo "configure: could not compile:" >&AS_MESSAGE_LOG_FD
-					cat moc_ax_qt_test.$ac_ext >&AS_MESSAGE_LOG_FD
-				else
-					ax_try_3="$CXX $QT_CXXFLAGS -c $CXXFLAGS -o ax_qt_main.o ax_qt_main.$ac_ext >/dev/null 2>/dev/null"
-					AC_TRY_EVAL(ax_try_3)
-					if test x"$ac_status" != x0; then
-						echo "$ax_err_3" >&AS_MESSAGE_LOG_FD
-						echo "configure: could not compile:" >&AS_MESSAGE_LOG_FD
-						cat ax_qt_main.$ac_ext >&AS_MESSAGE_LOG_FD
-					else
-						ax_try_4="$CXX -o ax_qt_main ax_qt_main.o moc_ax_qt_test.o $QT_LIBS $LIBS >/dev/null 2>/dev/null"
-						AC_TRY_EVAL(ax_try_4)
-						if test x"$ac_status" != x0; then
-							echo "$ax_err_4" >&AS_MESSAGE_LOG_FD
-						else
-							ax_cv_qt_test_result="success"
-						fi
-					fi
-				fi
-			fi
-		])dnl AC_CACHE_VAL ax_cv_qt_test_result
-		AC_MSG_RESULT([$ax_cv_qt_test_result])
-		if test x"$ax_cv_qt_test_result" = "xfailure"; then
-			AC_MSG_ERROR([Failed to find matching components of a complete
-									Qt installation. Try using more options,
-									see ./configure --help.])
-		fi
+      ax_cv_qt_test_result="failure"
+      ax_try_1="$QT_MOC ax_qt_test.h -o moc_ax_qt_test.$ac_ext >/dev/null 2>/dev/null"
+      AC_TRY_EVAL(ax_try_1)
+      if test x"$ac_status" != x0; then
+        echo "$ax_err_1" >&AS_MESSAGE_LOG_FD
+        echo "configure: could not run $QT_MOC on:" >&AS_MESSAGE_LOG_FD
+        cat ax_qt_test.h >&AS_MESSAGE_LOG_FD
+      else
+        ax_try_2="$CXX $QT_CXXFLAGS -c $CXXFLAGS -o moc_ax_qt_test.o moc_ax_qt_test.$ac_ext >/dev/null 2>/dev/null"
+        AC_TRY_EVAL(ax_try_2)
+        if test x"$ac_status" != x0; then
+          echo "$ax_err_2" >&AS_MESSAGE_LOG_FD
+          echo "configure: could not compile:" >&AS_MESSAGE_LOG_FD
+          cat moc_ax_qt_test.$ac_ext >&AS_MESSAGE_LOG_FD
+        else
+          ax_try_3="$CXX $QT_CXXFLAGS -c $CXXFLAGS -o ax_qt_main.o ax_qt_main.$ac_ext >/dev/null 2>/dev/null"
+          AC_TRY_EVAL(ax_try_3)
+          if test x"$ac_status" != x0; then
+            echo "$ax_err_3" >&AS_MESSAGE_LOG_FD
+            echo "configure: could not compile:" >&AS_MESSAGE_LOG_FD
+            cat ax_qt_main.$ac_ext >&AS_MESSAGE_LOG_FD
+          else
+            ax_try_4="$CXX -o ax_qt_main ax_qt_main.o moc_ax_qt_test.o $QT_LIBS $LIBS >/dev/null 2>/dev/null"
+            AC_TRY_EVAL(ax_try_4)
+            if test x"$ac_status" != x0; then
+              echo "$ax_err_4" >&AS_MESSAGE_LOG_FD
+            else
+              ax_cv_qt_test_result="success"
+            fi
+          fi
+        fi
+      fi
+    ])dnl AC_CACHE_VAL ax_cv_qt_test_result
+    AC_MSG_RESULT([$ax_cv_qt_test_result])
+    if test x"$ax_cv_qt_test_result" = "xfailure"; then
+      AC_MSG_ERROR([Failed to find matching components of a complete
+                  Qt installation. Try using more options,
+                  see ./configure --help.])
+    fi
 
-		rm -f ax_qt_test.h moc_ax_qt_test.$ac_ext moc_ax_qt_test.o \
-					ax_qt_main.$ac_ext ax_qt_main.o ax_qt_main
-	fi
-])
+    rm -f ax_qt_test.h moc_ax_qt_test.$ac_ext moc_ax_qt_test.o \
+          ax_qt_main.$ac_ext ax_qt_main.o ax_qt_main
+  fi
+])
\ No newline at end of file
--- a/rc/dark.qrc	Fri Jan 19 13:47:56 2024 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-<!DOCTYPE rcc><RCC version="1.0">
-	<qresource>
-		<file>dark.qss</file>
-	</qresource>
-</RCC>
--- a/rc/dark.qss	Fri Jan 19 13:47:56 2024 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-/*
-Much of this is taken from the Breeze Style Sheets,
-which is under the MIT license:
-
-Copyright © `<2013-2014>` `<Colin Duquesnoy>`
-Copyright © `<2015-2016>` `<Alex Huszagh>`
-
-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.
-*/
-
-/* Colors should be the same as the QPalette in gui/theme.cc, i.e.:
-	window == darkgray == #353535;
-	??? == gray == #808080;
-	base == black == #191919;
-	highlighted == blue = #2A82DA;
-   We could include a preprocessor like sass to make these constants,
-   but that's really lame :(
-*/
-
-AnimeListPage::pane {
-	margin: 0.04em;
-	border: 0.04em solid #808080;
-	top: -0.04em;
-	left: -0.04em;
-}
-
-QTabWidget::pane:top {
-	border: 0.04em solid #808080;
-	top: -0.04em;
-}
-
-QTabWidget::pane:bottom {
-	border: 0.04em solid #808080;
-	bottom: -0.04em;
-}
-
-QTabWidget::pane:left {
-	border: 0.04em solid #808080;
-	left: -0.04em;
-}
-
-QTabWidget::pane:right {
-	border: 0.04em solid #808080;
-	right: -0.04em;
-}
-
-QTabBar {
-	qproperty-drawBase: 0;
-	left: 0.23em;
-	border-radius: 0.13em;
-	selection-color: transparent;
-}
-
-QTabBar:focus {
-	border: 0em transparent black;
-}
-
-QTabBar::tab:top,
-QTabBar::tab:top:last,
-QTabBar::tab:top:only-one {
-	color: white;
-	border: 0.04em transparent black;
-	border-left: 0.04em solid #808080;
-	border-right: 0.04em solid #808080;
-	border-top: 0.04em solid #808080;
-	background-color: #353535;
-	min-width: 50px;
-	padding-top: 0.23em;
-	padding-bottom: 0.23em;
-	padding-left: 0.78em;
-	padding-right: 0.78em;
-	border-radius: 0.09em;
-	border-bottom-left-radius: 0em;
-	border-bottom-right-radius: 0em;
-}
-
-QTabBar::tab:top:!selected {
-	color: white;
-	background-color: #353535;
-	border: 0.04em solid #808080;
-	border-radius: 0.09em;
-	border-bottom-left-radius: 0em;
-	border-bottom-right-radius: 0em;
-	margin-top: 0.13em;
-}
-
-QTabBar::tab:top:next-selected {
-	border-right: 0.04em transparent #353535;
-	border-bottom-left-radius: 0em;
-	border-bottom-right-radius: 0em;
-}
-
-QTabBar::tab:top:previous-selected {
-	border-left: 0.04em transparent #353535;
-	border-bottom-left-radius: 0em;
-	border-bottom-right-radius: 0em;
-}
-
-QTabBar::tab:top:!selected:hover {
-	background-color: rgba(42, 130, 218, 0.1);
-	border-radius: 0.09em;
-	border-bottom-left-radius: 0em;
-	border-bottom-right-radius: 0em;
-}
-
-QTabBar::tab:top:!selected:first:hover {
-	background-color: rgba(42, 130, 218, 0.1);
-}
-
-QGroupBox::title {
-	color: white;
-}
-
-QComboBox,
-QPushButton,
-QDateEdit,
-QSpinBox {
-	background-color: #353535;
-	color: white;
-}
-
-QComboBox,
-QDateEdit,
-QSpinBox {
-	border: 0.04em solid #808080;
-}
-
-QComboBox:disabled,
-QPushButton:disabled,
-QDateEdit:disabled,
-QSpinBox:disabled {
-	color: #808080;
-}
-
-QPushButton:hover {
-	background-color: #39424B;
-}
-
-/*
- * QLineEdit
- */
-
-QLineEdit {
-	background: transparent;
-	color: white;
-}
-
-QLineEdit:!read-only {
-	background-color: #191919;
-	padding: 0.23em;
-	border-style: solid;
-	border: 0.04em solid #808080;
-	border-radius: 0.09em;
-}
-
-/* QMenuBar */
-
-QMenuBar {
-	background-color: #353535;
-	color: white;
-}
-
-QMenuBar::item:selected {
-	background-color: #414141;
-}
-
-QMenuBar::item:disabled {
-	color: #808080;
-}
-
-QMenuBar::item:pressed {
-	background-color: #414141;
-	margin-bottom: -0.09em;
-	padding-bottom: 0.09em;
-}
-
-/* QMenu */
-
-QMenu {
-	color: white;
-	background-color: #353535;
-	padding: 0.18em 0.18em;
-	border: 0.09em solid #A0A0A0;
-}
-
-QMenu::icon {
-	margin: 0.23em;
-}
-
-QMenu::item {
-	/* Add extra padding on the right for the QMenu arrow */
-	padding: 0.23em 1.5em 0.23em 1.3em;
-	border: 0.09em solid transparent;
-	background: transparent;
-}
-
-QMenu::item:selected {
-	color: white;
-	background-color: #414141;
-}
-
-QMenu::item:selected:disabled {
-	background-color: #353535;
-}
-
-QMenu::item:disabled {
-	color: #808080;
-}
-
-QMenu::indicator {
-	width: 0.8em;
-	height: 0.8em;
-	/* To align with QMenu::icon, which has a 0.23em margin. */
-	margin-left: 0.3em;
-	subcontrol-position: center left;
-}
-
-/*
- * QHeaderView:
- * Need this for the anime list, on Windows it gets screwed up.
-*/
-
-QHeaderView {
-	background-color: #353535;
-	border: 0.04em transparent;
-	border-radius: 0em;
-	margin: 0em;
-	padding: 0em;
-}
-
-QHeaderView::section {
-	background-color: #353535;
-	border: 0.04em solid #808080;
-	color: #eff0f1;
-	border-radius: 0em;
-	padding: 0em 0.23em 0em 0.23em;
-	text-align: center;
-}
-
-QHeaderView::section::vertical::first,
-QHeaderView::section::vertical::only-one {
-	border-top: 0.04em solid #808080;
-}
-
-QHeaderView::section::vertical {
-	border-top: transparent;
-}
-
-QHeaderView::section::horizontal::first,
-QHeaderView::section::horizontal::only-one {
-	border-left: 0.04em solid #808080;
-}
-
-QHeaderView::section::horizontal {
-	border-left: transparent;
-}
-
-QHeaderView[showSortIndicator="true"]::section::horizontal {
-	/* Same as the width of the arrow subcontrols below. */
-	padding-right: 0.8em;
-}
-
-QHeaderView::section:checked {
-	color: white;
-	background-color: #808080;
-}
-
-/* Note that this doesn't work for QTreeView unless the header is clickable */
-QHeaderView::section:hover,
-QHeaderView::section::horizontal::first:hover,
-QHeaderView::section::horizontal::only-one:hover,
-QHeaderView::section::vertical::first:hover,
-QHeaderView::section::vertical::only-one:hover {
-	background-color: #353535;
-}
Binary file rc/favicon.png has changed
Binary file rc/favicon256.png has changed
--- a/rc/icons.qrc	Fri Jan 19 13:47:56 2024 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-<!DOCTYPE rcc><RCC version="1.0">
-	<qresource>
-		<file>favicon.png</file>
-		<file>icons/16x16/arrow-circle-315.png</file>
-		<file>icons/16x16/calendar.png</file>
-		<file>icons/16x16/chart.png</file>
-		<file>icons/16x16/clock-history-frame.png</file>
-		<file>icons/16x16/cross-button.png</file>
-		<file>icons/16x16/document-list.png</file>
-		<file>icons/16x16/feed.png</file>
-		<file>icons/16x16/film.png</file>
-		<file>icons/16x16/gear.png</file>
-		<file>icons/16x16/magnifier.png</file>
-		<file>icons/16x16/navigation-270-button.png</file>
-		<file>icons/16x16/plus-button.png</file>
-		<file>icons/24x24/application-export.png</file>
-		<file>icons/24x24/application-sidebar-list.png</file>
-		<file>icons/24x24/arrow-circle-double-135.png</file>
-		<file>icons/24x24/feed.png</file>
-		<file>icons/24x24/folder-open.png</file>
-		<file>icons/24x24/gear.png</file>
-		<file>icons/24x24/globe.png</file>
-		<file>icons/24x24/inbox-film.png</file>
-		<file>icons/24x24/megaphone.png</file>
-		<file>icons/24x24/question.png</file>
-	</qresource>
-</RCC>
Binary file rc/icons/favicon.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rc/icons/icons.qrc	Mon Jan 22 16:36:19 2024 -0500
@@ -0,0 +1,27 @@
+<!DOCTYPE rcc><RCC version="1.0">
+	<qresource prefix="icons/">
+		<file>favicon.png</file>
+		<file>16x16/arrow-circle-315.png</file>
+		<file>16x16/calendar.png</file>
+		<file>16x16/chart.png</file>
+		<file>16x16/clock-history-frame.png</file>
+		<file>16x16/cross-button.png</file>
+		<file>16x16/document-list.png</file>
+		<file>16x16/feed.png</file>
+		<file>16x16/film.png</file>
+		<file>16x16/gear.png</file>
+		<file>16x16/magnifier.png</file>
+		<file>16x16/navigation-270-button.png</file>
+		<file>16x16/plus-button.png</file>
+		<file>24x24/application-export.png</file>
+		<file>24x24/application-sidebar-list.png</file>
+		<file>24x24/arrow-circle-double-135.png</file>
+		<file>24x24/feed.png</file>
+		<file>24x24/folder-open.png</file>
+		<file>24x24/gear.png</file>
+		<file>24x24/globe.png</file>
+		<file>24x24/inbox-film.png</file>
+		<file>24x24/megaphone.png</file>
+		<file>24x24/question.png</file>
+	</qresource>
+</RCC>
Binary file rc/linux/Minori.png has changed
--- a/rc/osx/deploy_build.sh	Fri Jan 19 13:47:56 2024 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# deploy_build.sh:
-# run this in your build dir to get a usable app bundle
-
-SCRIPT_DIR=$(dirname -- "$0")
-BUNDLE_NAME="Minori"
-
-cp -r "$SCRIPT_DIR/$BUNDLE_NAME.app" .
-mkdir -p "$BUNDLE_NAME.app/Contents/MacOS"
-cp ".libs/minori" "$BUNDLE_NAME.app/Contents/MacOS/minori"
-mkdir -p "$BUNDLE_NAME.app/Contents/Frameworks"
-for i in animia pugixml anitomy; do
-	cp "dep/$i/.libs/lib$i.0.dylib" "$BUNDLE_NAME.app/Contents/Frameworks"
-	install_name_tool -change "/usr/local/lib/lib$i.0.dylib" "@executable_path/../Frameworks/lib$i.0.dylib" "$BUNDLE_NAME.app/Contents/MacOS/minori"
-done
-macdeployqt "$BUNDLE_NAME.app"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rc/win32/dark/dark.qrc	Mon Jan 22 16:36:19 2024 -0500
@@ -0,0 +1,5 @@
+<!DOCTYPE rcc><RCC version="1.0">
+	<qresource>
+		<file>dark.qss</file>
+	</qresource>
+</RCC>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rc/win32/dark/dark.qss	Mon Jan 22 16:36:19 2024 -0500
@@ -0,0 +1,294 @@
+/*
+Much of this is taken from the Breeze Style Sheets,
+which is under the MIT license:
+
+Copyright © `<2013-2014>` `<Colin Duquesnoy>`
+Copyright © `<2015-2016>` `<Alex Huszagh>`
+
+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.
+*/
+
+/* Colors should be the same as the QPalette in gui/theme.cc, i.e.:
+	window == darkgray == #353535;
+	??? == gray == #808080;
+	base == black == #191919;
+	highlighted == blue = #2A82DA;
+   We could include a preprocessor like sass to make these constants,
+   but that's really lame :(
+*/
+
+AnimeListPage::pane {
+	margin: 0.04em;
+	border: 0.04em solid #808080;
+	top: -0.04em;
+	left: -0.04em;
+}
+
+QTabWidget::pane:top {
+	border: 0.04em solid #808080;
+	top: -0.04em;
+}
+
+QTabWidget::pane:bottom {
+	border: 0.04em solid #808080;
+	bottom: -0.04em;
+}
+
+QTabWidget::pane:left {
+	border: 0.04em solid #808080;
+	left: -0.04em;
+}
+
+QTabWidget::pane:right {
+	border: 0.04em solid #808080;
+	right: -0.04em;
+}
+
+QTabBar {
+	qproperty-drawBase: 0;
+	left: 0.23em;
+	border-radius: 0.13em;
+	selection-color: transparent;
+}
+
+QTabBar:focus {
+	border: 0em transparent black;
+}
+
+QTabBar::tab:top,
+QTabBar::tab:top:last,
+QTabBar::tab:top:only-one {
+	color: white;
+	border: 0.04em transparent black;
+	border-left: 0.04em solid #808080;
+	border-right: 0.04em solid #808080;
+	border-top: 0.04em solid #808080;
+	background-color: #353535;
+	min-width: 50px;
+	padding-top: 0.23em;
+	padding-bottom: 0.23em;
+	padding-left: 0.78em;
+	padding-right: 0.78em;
+	border-radius: 0.09em;
+	border-bottom-left-radius: 0em;
+	border-bottom-right-radius: 0em;
+}
+
+QTabBar::tab:top:!selected {
+	color: white;
+	background-color: #353535;
+	border: 0.04em solid #808080;
+	border-radius: 0.09em;
+	border-bottom-left-radius: 0em;
+	border-bottom-right-radius: 0em;
+	margin-top: 0.13em;
+}
+
+QTabBar::tab:top:next-selected {
+	border-right: 0.04em transparent #353535;
+	border-bottom-left-radius: 0em;
+	border-bottom-right-radius: 0em;
+}
+
+QTabBar::tab:top:previous-selected {
+	border-left: 0.04em transparent #353535;
+	border-bottom-left-radius: 0em;
+	border-bottom-right-radius: 0em;
+}
+
+QTabBar::tab:top:!selected:hover {
+	background-color: rgba(42, 130, 218, 0.1);
+	border-radius: 0.09em;
+	border-bottom-left-radius: 0em;
+	border-bottom-right-radius: 0em;
+}
+
+QTabBar::tab:top:!selected:first:hover {
+	background-color: rgba(42, 130, 218, 0.1);
+}
+
+QGroupBox::title {
+	color: white;
+}
+
+QComboBox,
+QPushButton,
+QDateEdit,
+QSpinBox {
+	background-color: #353535;
+	color: white;
+}
+
+QComboBox,
+QDateEdit,
+QSpinBox {
+	border: 0.04em solid #808080;
+}
+
+QComboBox:disabled,
+QPushButton:disabled,
+QDateEdit:disabled,
+QSpinBox:disabled {
+	color: #808080;
+}
+
+QPushButton:hover {
+	background-color: #39424B;
+}
+
+/*
+ * QLineEdit
+ */
+
+QLineEdit {
+	background: transparent;
+	color: white;
+}
+
+QLineEdit:!read-only {
+	background-color: #191919;
+	padding: 0.23em;
+	border-style: solid;
+	border: 0.04em solid #808080;
+	border-radius: 0.09em;
+}
+
+/* QMenuBar */
+
+QMenuBar {
+	background-color: #353535;
+	color: white;
+}
+
+QMenuBar::item:selected {
+	background-color: #414141;
+}
+
+QMenuBar::item:disabled {
+	color: #808080;
+}
+
+QMenuBar::item:pressed {
+	background-color: #414141;
+	margin-bottom: -0.09em;
+	padding-bottom: 0.09em;
+}
+
+/* QMenu */
+
+QMenu {
+	color: white;
+	background-color: #353535;
+	padding: 0.18em 0.18em;
+	border: 0.09em solid #A0A0A0;
+}
+
+QMenu::icon {
+	margin: 0.23em;
+}
+
+QMenu::item {
+	/* Add extra padding on the right for the QMenu arrow */
+	padding: 0.23em 1.5em 0.23em 1.3em;
+	border: 0.09em solid transparent;
+	background: transparent;
+}
+
+QMenu::item:selected {
+	color: white;
+	background-color: #414141;
+}
+
+QMenu::item:selected:disabled {
+	background-color: #353535;
+}
+
+QMenu::item:disabled {
+	color: #808080;
+}
+
+QMenu::indicator {
+	width: 0.8em;
+	height: 0.8em;
+	/* To align with QMenu::icon, which has a 0.23em margin. */
+	margin-left: 0.3em;
+	subcontrol-position: center left;
+}
+
+/*
+ * QHeaderView:
+ * Need this for the anime list, on Windows it gets screwed up.
+*/
+
+QHeaderView {
+	background-color: #353535;
+	border: 0.04em transparent;
+	border-radius: 0em;
+	margin: 0em;
+	padding: 0em;
+}
+
+QHeaderView::section {
+	background-color: #353535;
+	border: 0.04em solid #808080;
+	color: #eff0f1;
+	border-radius: 0em;
+	padding: 0em 0.23em 0em 0.23em;
+	text-align: center;
+}
+
+QHeaderView::section::vertical::first,
+QHeaderView::section::vertical::only-one {
+	border-top: 0.04em solid #808080;
+}
+
+QHeaderView::section::vertical {
+	border-top: transparent;
+}
+
+QHeaderView::section::horizontal::first,
+QHeaderView::section::horizontal::only-one {
+	border-left: 0.04em solid #808080;
+}
+
+QHeaderView::section::horizontal {
+	border-left: transparent;
+}
+
+QHeaderView[showSortIndicator="true"]::section::horizontal {
+	/* Same as the width of the arrow subcontrols below. */
+	padding-right: 0.8em;
+}
+
+QHeaderView::section:checked {
+	color: white;
+	background-color: #808080;
+}
+
+/* Note that this doesn't work for QTreeView unless the header is clickable */
+QHeaderView::section:hover,
+QHeaderView::section::horizontal::first:hover,
+QHeaderView::section::horizontal::only-one:hover,
+QHeaderView::section::vertical::first:hover,
+QHeaderView::section::vertical::only-one:hover {
+	background-color: #353535;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/osx/deploy_build.sh	Mon Jan 22 16:36:19 2024 -0500
@@ -0,0 +1,17 @@
+#!/bin/bash
+#
+# deploy_build.sh:
+# run this in your build dir to get a usable app bundle
+
+SCRIPT_DIR=$(dirname -- "$0")
+BUNDLE_NAME="Minori"
+
+cp -r "$SCRIPT_DIR/$BUNDLE_NAME.app" .
+mkdir -p "$BUNDLE_NAME.app/Contents/MacOS"
+cp ".libs/minori" "$BUNDLE_NAME.app/Contents/MacOS/minori"
+mkdir -p "$BUNDLE_NAME.app/Contents/Frameworks"
+for i in animia pugixml anitomy; do
+	cp "dep/$i/.libs/lib$i.0.dylib" "$BUNDLE_NAME.app/Contents/Frameworks"
+	install_name_tool -change "/usr/local/lib/lib$i.0.dylib" "@executable_path/../Frameworks/lib$i.0.dylib" "$BUNDLE_NAME.app/Contents/MacOS/minori"
+done
+macdeployqt "$BUNDLE_NAME.app"
--- a/src/gui/window.cc	Fri Jan 19 13:47:56 2024 -0500
+++ b/src/gui/window.cc	Mon Jan 22 16:36:19 2024 -0500
@@ -67,7 +67,7 @@
 }
 
 MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) {
-	setWindowIcon(QIcon(":/favicon.png"));
+	setWindowIcon(QIcon(":/icons/favicon.png"));
 
 	main_widget.reset(new QWidget(this));
 	new QHBoxLayout(main_widget.get());