commit b5a66618e4fee8e4197f263e7d0a9b9932d2f6e4 Author: Michael Howard Date: Wed May 13 12:37:25 2026 -0500 v1.1.8 - Source and Assets diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..e97a7a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Ignore everything by default +/* + +# Whitelist ONLY the documentation, assets, and the Windows installer +!README.md +!version.txt +!PastorsSermonPro_Setup.exe +!installer_build/ +!installer_build/PastorsSermonPro_Installer.run +!resources/ +!resources/*.bmp +!resources/*.png +!resources/*.ico +!.gitignore diff --git a/README.md b/README.md new file mode 100755 index 0000000..b77424c --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ +

+ Pastors Sermon Pro +

+ +# Pastors Sermon Pro 📖✨ +**Version 1.1.7** + +## ✨ What's New in V1.1.7 +- **Dynamic Theming Engine**: Complete support for Light and Dark modes across all components (Bible Reader, Sermon Builder, Search, etc.). +- **Integrated Model Downloader**: Background downloading of AI models from HuggingFace with status bar progress tracking. +- **Enhanced Bug Reporting**: Added screenshot capture and automated debug.log attachment for faster troubleshooting. +- **Hardware-Aware AI**: Smart recommendations for AI models based on your system's RAM and GPU specs. + +## ✨ What's New in V1.0.7 +- **Audio Optimization:** Reduced default video volume to 40% to prevent distortion and speaker crackling on some systems. +- **Improved Multimedia:** Finalized FFmpeg dependency bundling for stable video playback. +- **Enhanced Settings:** Added version tracking and manual update controls. + +## ✨ What's New in V1.0.3 +- **Smart Updates:** The app now correctly compares version numbers to only notify you of truly newer updates. +- **Intro Video ESC:** You can now press ESC to exit full screen mode during the introductory video. +- **Improved Startup:** Essential library and resource folders are now automatically created on first launch. +- **Expanded Library:** Includes "The Pilgrim's Progress" by John Bunyan as a default library resource. + +[![Status](https://img.shields.io/badge/Status-Development-orange.svg)](https://git.linology.tech/michael/PastorsSermonPro) +[![Platform](https://img.shields.io/badge/Platform-Windows%20%7C%20Linux-blue.svg)](https://git.linology.tech/michael/PastorsSermonPro) +[![License](https://img.shields.io/badge/License-Proprietary-red.svg)](https://git.linology.tech/michael/PastorsSermonPro) + +**Pastors Sermon Pro** is a comprehensive desktop suite built specifically for sermon preparation and deep theological research. Designed to be a pastor's primary workspace, it centralizes Scripture, reference materials, and manuscript writing into one powerful, distraction-free environment. + +--- + +## 📚 Core Features + +### 📖 Extensive Bible Library +- **Multiple Translations:** Instant access to over 25 Bible versions with full formal names (ESV, NASB, NKJV, NIV, etc.). +- **Side-by-Side Comparison:** Compare different translations in a parallel view for deeper linguistic insight. +- **Instant Search:** Lightning-fast search across the entire canon of Scripture. + +### ✍️ Professional Sermon Builder +- **Manuscript Editor:** A rich-text editor tailored for sermon writing, allowing you to focus on the message. +- **Workflow Persistence:** Pick up exactly where you left off. The app remembers every open tab, document, and Bible passage from your last session. +- **Flexible Export:** Export your finished manuscripts directly to `.odt` or PDF. + +### 🏛️ Integrated Reference Tools +- **Theological Lexicons:** Built-in access to Easton's Bible Dictionary and Thompson Chain Topics. +- **Personal Library Manager:** Add your own PDF and ePub study materials to your local library and read them alongside your notes. + +### 🤖 AI Assistant (Optional Tool) +Pastors Sermon Pro includes an **optional** AI assistant designed to help with brainstorming, outlining, and cross-referencing. It is an *added tool* to assist your study, not replace it. +- **Privacy First:** Choose **Local Mode** to run AI models directly on your hardware with no data ever leaving your machine. +- **Hybrid Choice:** Use **Online Mode** via API for high-speed assistance without needing to download large local models. + +--- + +## 🚀 Installation + +### 🪟 Windows +1. **[Download the Latest Release](https://git.linology.tech/michael/PastorsSermonPro/releases)** +2. Run the `PastorsSermonPro_Setup.exe` installer. +3. **Optional AI:** During setup, you can choose to download the offline AI model. This is purely optional; the core Bible study features do not require it. + +--- + +## 🛠 Development + +Built with **C++ 17** and **Qt 6**. + +### Prerequisites +- CMake 3.16+ +- Qt 6 (Core, Gui, Widgets, Xml, PrintSupport, Network) +- A working C++ compiler + +### Build Instructions +```bash +cmake -B build -S . +cmake --build build -j$(nproc) +``` + +--- + +## 📬 Updates +The application checks this repository for updates to ensure you have the latest theological tools and software refinements. + +--- + +*Developed by Michael Howard | Sponsored by [614ministries.org](https://614ministries.org)* diff --git a/ai.png b/ai.png new file mode 100755 index 0000000..39ef627 Binary files /dev/null and b/ai.png differ diff --git a/f8e67864-3723-48a6-9878-4169b409eb3c.png b/f8e67864-3723-48a6-9878-4169b409eb3c.png new file mode 100755 index 0000000..c44ca6d Binary files /dev/null and b/f8e67864-3723-48a6-9878-4169b409eb3c.png differ diff --git a/library.png b/library.png new file mode 100755 index 0000000..9a2b540 Binary files /dev/null and b/library.png differ diff --git a/resources/ai.png b/resources/ai.png new file mode 100755 index 0000000..39ef627 Binary files /dev/null and b/resources/ai.png differ diff --git a/resources/bible.ico b/resources/bible.ico new file mode 100755 index 0000000..35de2d1 Binary files /dev/null and b/resources/bible.ico differ diff --git a/resources/bible.png b/resources/bible.png new file mode 100755 index 0000000..3c29458 Binary files /dev/null and b/resources/bible.png differ diff --git a/resources/installer_splash.bmp b/resources/installer_splash.bmp new file mode 100755 index 0000000..67b9158 Binary files /dev/null and b/resources/installer_splash.bmp differ diff --git a/resources/library.png b/resources/library.png new file mode 100755 index 0000000..9a2b540 Binary files /dev/null and b/resources/library.png differ diff --git a/resources/resources.qrc b/resources/resources.qrc new file mode 100755 index 0000000..bd04369 --- /dev/null +++ b/resources/resources.qrc @@ -0,0 +1,16 @@ + + + ../splash.png + bible.png + search.png + sermon.png + ai.png + library.png + setting.png + ../src/help.html + welcome/welcome_1.png + welcome/welcome_2.png + welcome/welcome_3.png + welcome/welcome_4.png + + diff --git a/resources/search.png b/resources/search.png new file mode 100755 index 0000000..848e7c8 Binary files /dev/null and b/resources/search.png differ diff --git a/resources/sermon.png b/resources/sermon.png new file mode 100755 index 0000000..1339ccb Binary files /dev/null and b/resources/sermon.png differ diff --git a/resources/setting.png b/resources/setting.png new file mode 100755 index 0000000..313dd01 Binary files /dev/null and b/resources/setting.png differ diff --git a/resources/settings.png b/resources/settings.png new file mode 100755 index 0000000..83531d5 Binary files /dev/null and b/resources/settings.png differ diff --git a/resources/welcome/welcome_1.png b/resources/welcome/welcome_1.png new file mode 100755 index 0000000..fdf7d94 Binary files /dev/null and b/resources/welcome/welcome_1.png differ diff --git a/resources/welcome/welcome_2.png b/resources/welcome/welcome_2.png new file mode 100755 index 0000000..cc33cde Binary files /dev/null and b/resources/welcome/welcome_2.png differ diff --git a/resources/welcome/welcome_3.png b/resources/welcome/welcome_3.png new file mode 100755 index 0000000..b0750ac Binary files /dev/null and b/resources/welcome/welcome_3.png differ diff --git a/resources/welcome/welcome_4.png b/resources/welcome/welcome_4.png new file mode 100755 index 0000000..b779f05 Binary files /dev/null and b/resources/welcome/welcome_4.png differ diff --git a/setting.png b/setting.png new file mode 100755 index 0000000..313dd01 Binary files /dev/null and b/setting.png differ diff --git a/splash.png b/splash.png new file mode 100755 index 0000000..8ba2bb0 Binary files /dev/null and b/splash.png differ diff --git a/src/UpdateManager.cpp b/src/UpdateManager.cpp new file mode 100755 index 0000000..0cd0f94 --- /dev/null +++ b/src/UpdateManager.cpp @@ -0,0 +1,121 @@ +#include "UpdateManager.h" +#include +#include +#include +#include +#include +#include +#include +#include + +UpdateManager::UpdateManager(const QString& currentVersion, QObject *parent) + : QObject(parent), m_currentVersion(currentVersion), m_downloadFile(nullptr) +{ + m_network = new QNetworkAccessManager(this); +} + +void UpdateManager::checkForUpdates() { + emit checkStarted(); + + QUrl url; + if (m_isBeta) { + url = QUrl("https://git.linology.tech/michael/Pastors-Sermon-Pro-Bug-Reports/raw/branch/main/version.txt"); + } else { + url = QUrl("https://git.linology.tech/michael/PastorsSermonPro/raw/branch/master/version.txt"); + } + + QNetworkRequest request; + request.setUrl(url); + QNetworkReply* reply = m_network->get(request); + connect(reply, &QNetworkReply::finished, this, &UpdateManager::onVersionFetched); +} + +void UpdateManager::onVersionFetched() { + QNetworkReply* reply = qobject_cast(sender()); + if (!reply) return; + + if (reply->error() == QNetworkReply::NoError) { + m_latestVersion = QString::fromUtf8(reply->readAll()).trimmed(); + + // Smart semantic version comparison + if (!m_latestVersion.isEmpty() && isNewer(m_currentVersion, m_latestVersion)) { + // Construct the download URL for the Windows installer + if (m_isBeta) { + m_downloadUrl = QString("https://git.linology.tech/michael/Pastors-Sermon-Pro-Bug-Reports/releases/download/v%1/PastorsSermonPro_Setup.exe").arg(m_latestVersion); + } else { + m_downloadUrl = QString("https://git.linology.tech/michael/PastorsSermonPro/releases/download/v%1/PastorsSermonPro_Setup.exe").arg(m_latestVersion); + } + emit updateAvailable(m_latestVersion, m_downloadUrl); + } else { + emit noUpdateFound(); + } + } else { + emit errorOccurred("Could not reach update server: " + reply->errorString()); + } + reply->deleteLater(); +} + +void UpdateManager::startDownload(const QString& url) { + m_downloadUrl = url; + QString tempPath = QStandardPaths::writableLocation(QStandardPaths::TempLocation); + QString fileName = tempPath + "/PastorsSermonPro_Update.exe"; + + m_downloadFile = new QFile(fileName, this); + if (!m_downloadFile->open(QIODevice::WriteOnly)) { + emit errorOccurred("Could not create temporary file for download."); + delete m_downloadFile; + m_downloadFile = nullptr; + return; + } + + QNetworkRequest request; + request.setUrl(QUrl(m_downloadUrl)); + QNetworkReply* reply = m_network->get(request); + + connect(reply, &QNetworkReply::downloadProgress, this, &UpdateManager::onDownloadProgress); + connect(reply, &QNetworkReply::finished, this, &UpdateManager::onDownloadFinished); +} + +void UpdateManager::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) { + if (bytesTotal > 0) { + int percentage = static_cast((bytesReceived * 100) / bytesTotal); + emit progressUpdated(percentage); + } +} + +void UpdateManager::onDownloadFinished() { + QNetworkReply* reply = qobject_cast(sender()); + if (!reply) return; + + if (reply->error() == QNetworkReply::NoError) { + m_downloadFile->write(reply->readAll()); + m_downloadFile->flush(); + QString filePath = m_downloadFile->fileName(); + m_downloadFile->close(); + + emit downloadFinished(filePath); + + // Launch the installer + QProcess::startDetached(filePath); + } else { + emit errorOccurred("Download failed: " + reply->errorString()); + m_downloadFile->close(); + m_downloadFile->remove(); + } + + reply->deleteLater(); +} + +bool UpdateManager::isNewer(const QString& current, const QString& latest) { + QStringList curParts = current.split('.'); + QStringList latParts = latest.split('.'); + + int maxLen = std::max(curParts.size(), latParts.size()); + for (int i = 0; i < maxLen; ++i) { + int cur = (i < curParts.size()) ? curParts[i].toInt() : 0; + int lat = (i < latParts.size()) ? latParts[i].toInt() : 0; + if (lat > cur) return true; + if (lat < cur) return false; + } + return false; +} diff --git a/version.txt b/version.txt new file mode 100755 index 0000000..18efdb9 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +1.1.8