Compare commits
No commits in common. "v1.0.7" and "main" have entirely different histories.
|
|
@ -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
|
||||||
|
|
@ -1,3 +1,87 @@
|
||||||
# Pastors-Sermon-Pro-Bug-Reports
|
<p align="center">
|
||||||
|
<img src="splash.png" alt="Pastors Sermon Pro" width="600">
|
||||||
|
</p>
|
||||||
|
|
||||||
Just for reporting bugs
|
# 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.
|
||||||
|
|
||||||
|
[](https://git.linology.tech/michael/PastorsSermonPro)
|
||||||
|
[](https://git.linology.tech/michael/PastorsSermonPro)
|
||||||
|
[](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)*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
# Release Notes: Pastors Sermon Pro v2.0.0-RC
|
||||||
|
|
||||||
|
This release introduces critical stability enhancements, bundles C++ SQL database drivers for seamless offline Bible storage, and resolves Windows permission bugs during AI model downloads.
|
||||||
|
|
||||||
|
### ⚡ Compiler Concurrency & Safety Fix
|
||||||
|
- **Safe Parallel Compilation:** Restructured the Windows cross-compilation pipeline to cap parallel build threads at `4` (down from an unrestricted `nproc` of 24). This prevents Out-Of-Memory system memory panics and high peak thermal power trips during build processes, ensuring long-term build system stability.
|
||||||
|
|
||||||
|
### 💾 Core SQLite & SQL Database Support
|
||||||
|
- **Bundled SQL Drivers:** Integrated `Qt6Sql.dll` directly into the Windows distribution package.
|
||||||
|
- **SQLite Plugin Integration:** Bundled the required `qsqlite.dll` driver under the `sqldrivers` directory, resolving the `Qt6Sql.dll was not found` startup crash and restoring full database connectivity for offline Bibles, dictionaries, and sermon storage on Windows.
|
||||||
|
|
||||||
|
### 🔒 Permission-Aware AI Model Downloader
|
||||||
|
- **AppData Redirection:** Redirected AI model downloads from the write-restricted Program Files folder to the standard user-writable Local AppData directory (`C:/Users/<Username>/AppData/Local/PastorsSermonPro/AI`). This fully resolves the `Could not open AI folder for writing` error on Windows.
|
||||||
|
- **Dual-Directory Scanning:** Hardened the settings menu model picker to scan both the Program Files install folder and the local user AppData folder, ensuring full backward compatibility.
|
||||||
|
- **Robust Server Logging:** Directed local `llama-server` logs (`ai_server.log`) to the AppData folder, avoiding any permission failures during AI initialization.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📦 Windows Deliverables
|
||||||
|
- **Setup Executable:** `PastorsSermonPro_Setup.exe` (approx. 180 MB)
|
||||||
|
- **Database Engine:** Offline SQLite support fully active
|
||||||
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 3.1 MiB |
|
After Width: | Height: | Size: 2.9 MiB |
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 151 KiB |
|
After Width: | Height: | Size: 3.1 MiB |
|
|
@ -0,0 +1,16 @@
|
||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file alias="splash.png">../splash.png</file>
|
||||||
|
<file>bible.png</file>
|
||||||
|
<file>search.png</file>
|
||||||
|
<file>sermon.png</file>
|
||||||
|
<file>ai.png</file>
|
||||||
|
<file>library.png</file>
|
||||||
|
<file>setting.png</file>
|
||||||
|
<file alias="help.html">../src/help.html</file>
|
||||||
|
<file>welcome/welcome_1.png</file>
|
||||||
|
<file>welcome/welcome_2.png</file>
|
||||||
|
<file>welcome/welcome_3.png</file>
|
||||||
|
<file>welcome/welcome_4.png</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
|
After Width: | Height: | Size: 2.4 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 3.0 MiB |
|
After Width: | Height: | Size: 214 KiB |
|
After Width: | Height: | Size: 429 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 3.0 MiB |
|
After Width: | Height: | Size: 3.2 MiB |
|
|
@ -0,0 +1,121 @@
|
||||||
|
#include "UpdateManager.h"
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QNetworkRequest>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QDesktopServices>
|
||||||
|
#include <QUrl>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
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<QNetworkReply*>(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<int>((bytesReceived * 100) / bytesTotal);
|
||||||
|
emit progressUpdated(percentage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateManager::onDownloadFinished() {
|
||||||
|
QNetworkReply* reply = qobject_cast<QNetworkReply*>(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;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
2.0.0-RC
|
||||||