Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
sudo apt-get update
sudo apt-get install -y \
build-essential cmake \
qt6-base-dev qt6-tools-dev-tools \
qt6-base-dev qt6-tools-dev qt6-tools-dev-tools \
libqt6widgets6 \
cppcheck \
dpkg-dev
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# .idea
.idea/
.vscode/

# Executable
UniBackpack
Expand Down
11 changes: 10 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ project(UniBackpack VERSION 0.1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network)
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network LinguistTools)

set(CMAKE_AUTOMOC ON) # Handles Signals/Slots
set(CMAKE_AUTORCC ON) # Handles .qrc resource files
Expand Down Expand Up @@ -38,6 +38,15 @@ target_link_libraries(UniBackpack PRIVATE
Qt6::Network
)

# --- Internationalization (i18n) ---
# Compiles .ts -> .qm and embeds them under ":/i18n/" automatically.
# Run "cmake --build build --target update_translations" to populate .ts from tr() strings.
qt_add_translations(UniBackpack
TS_FILES
translations/unibackpack_en.ts
translations/unibackpack_el.ts
)

install(TARGETS UniBackpack DESTINATION bin)

# CPack configuration to generate the Debian installer (.deb)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ sudo pacman -S base-devel cmake qt6-base qt6-tools polkit

**For Debian / Ubuntu / Linux Mint:**
```bash
sudo apt install build-essential cmake qt6-base-dev qt6-tools-dev-tools policykit-1
sudo apt install build-essential cmake qt6-base-dev qt6-tools-dev qt6-tools-dev-tools policykit-1
```

## Project Structure
Expand Down
1 change: 1 addition & 0 deletions include/Downloader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class Downloader : public QObject {
signals:
void progress_updated(int percentage);
void status_message(const QString &message);
void status_update(const QString &message);
void download_completed(bool success);
};

Expand Down
7 changes: 7 additions & 0 deletions include/MainWindow.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
#include <QMainWindow>
#include <QStandardItemModel>
#include <QModelIndex>
#include <QTranslator>

void applyTranslator(const QString &locale);

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
Expand All @@ -18,6 +21,10 @@ class MainWindow : public QMainWindow
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void retranslate();

protected:
void changeEvent(QEvent *event) override;

private slots:
void on_university_selection(const QModelIndex &index);
Expand Down
53 changes: 38 additions & 15 deletions src/Downloader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,15 @@ bool Downloader::is_in_pacman_repo(const QString &package_name) {
process.start("pacman", QStringList() << "-Si" << package_name);
process.waitForFinished();
if (process.exitCode() == 0) {
emit status_message("Found: " + package_name);
QString msg = tr("Found: %1").arg(package_name);
emit status_message(msg);
emit status_update(msg);
QCoreApplication::processEvents();
return true;
} else {
emit status_message("Not in repos: " + package_name);
QString msg = tr("Not in repos: %1").arg(package_name);
emit status_message(msg);
emit status_update(msg);
QCoreApplication::processEvents();
return false;
}
Expand All @@ -46,11 +50,15 @@ bool Downloader::is_in_apt_repo(const QString &package_name) {
QString stdout_output = process.readAllStandardOutput();

if (process.exitCode() == 0 && stdout_output.contains("Package:")) {
emit status_message("Found: " + package_name);
QString msg = tr("Found: %1").arg(package_name);
emit status_message(msg);
emit status_update(msg);
QCoreApplication::processEvents();
return true;
} else {
emit status_message("Not in repos: " + package_name);
QString msg = tr("Not in repos: %1").arg(package_name);
emit status_message(msg);
emit status_update(msg);
QCoreApplication::processEvents();
return false;
}
Expand All @@ -62,7 +70,9 @@ QStringList Downloader::read_package_list(bool standard_package_manager, QString

if (standard_package_manager && package_manager == "pacman") {
QString filepath_of_list = ":/lists/" + name_of_university + "/" + name_of_department + "/pacman_list.txt";
emit status_message("Checking packages for " + name_of_department + "...");
QString msg = tr("Checking packages for %1...").arg(name_of_department);
emit status_message(msg);
emit status_update(msg);
QFile file(filepath_of_list);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Critical Error: Could not open the file!" << file.errorString();
Expand All @@ -72,7 +82,9 @@ QStringList Downloader::read_package_list(bool standard_package_manager, QString
while (!in.atEnd()) {
QString package = in.readLine().trimmed();
if (!package.isEmpty() && is_in_pacman_repo(package)) {
emit status_message("Adding: " + package);
QString addMsg = tr("Adding: %1").arg(package);
emit status_message(addMsg);
emit status_update(addMsg);
installable_with_standard_package_manager.append(package);
}
}
Expand All @@ -82,7 +94,9 @@ QStringList Downloader::read_package_list(bool standard_package_manager, QString

if (!standard_package_manager && package_manager == "pacman") {
QString filepath_of_list = ":/lists/" + name_of_university + "/" + name_of_department + "/pacman_list.txt";
emit status_message("Checking packages for " + name_of_department + "...");
QString msg = tr("Checking packages for %1...").arg(name_of_department);
emit status_message(msg);
emit status_update(msg);
QFile file(filepath_of_list);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Critical Error: Could not open the file!" << file.errorString();
Expand All @@ -92,7 +106,9 @@ QStringList Downloader::read_package_list(bool standard_package_manager, QString
while (!in.atEnd()) {
QString package = in.readLine().trimmed();
if (!package.isEmpty() && !is_in_pacman_repo(package)) {
emit status_message("Adding (non-standard): " + package);
QString addMsg = tr("Adding (non-standard): %1").arg(package);
emit status_message(addMsg);
emit status_update(addMsg);
installable_with_non_standard_package_manager.append(package);
}
}
Expand All @@ -102,7 +118,9 @@ QStringList Downloader::read_package_list(bool standard_package_manager, QString

if (standard_package_manager && package_manager == "apt") {
QString filepath_of_list = ":/lists/" + name_of_university + "/" + name_of_department + "/apt_list.txt";
emit status_message("Checking packages for " + name_of_department + "...");
QString msg = tr("Checking packages for %1...").arg(name_of_department);
emit status_message(msg);
emit status_update(msg);
QFile file(filepath_of_list);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Critical Error: Could not open the file!" << file.errorString();
Expand All @@ -112,7 +130,9 @@ QStringList Downloader::read_package_list(bool standard_package_manager, QString
while (!in.atEnd()) {
QString package = in.readLine().trimmed();
if (!package.isEmpty() && is_in_apt_repo(package)) {
emit status_message("Adding: " + package);
QString addMsg = tr("Adding: %1").arg(package);
emit status_message(addMsg);
emit status_update(addMsg);
installable_with_standard_package_manager.append(package);
}
}
Expand All @@ -122,7 +142,9 @@ QStringList Downloader::read_package_list(bool standard_package_manager, QString

if (!standard_package_manager && package_manager == "apt") {
QString filepath_of_list = ":/lists/" + name_of_university + "/" + name_of_department + "/apt_list.txt";
emit status_message("Checking packages for " + name_of_department + "...");
QString msg = tr("Checking packages for %1...").arg(name_of_department);
emit status_message(msg);
emit status_update(msg);
QFile file(filepath_of_list);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "Critical Error: Could not open the file!" << file.errorString();
Expand All @@ -132,7 +154,9 @@ QStringList Downloader::read_package_list(bool standard_package_manager, QString
while (!in.atEnd()) {
QString package = in.readLine().trimmed();
if (!package.isEmpty() && !is_in_apt_repo(package)) {
emit status_message("Adding (non-standard): " + package);
QString addMsg = tr("Adding (non-standard): %1").arg(package);
emit status_message(addMsg);
emit status_update(addMsg);;
installable_with_non_standard_package_manager.append(package);
}
}
Expand All @@ -148,9 +172,8 @@ void Downloader::download_via_pacman(const QStringList &list_to_be_downloaded) {
// there is a problem with pacman -Syu though, so the user should be alerted about that
QMessageBox::warning(
nullptr,
"Warning",
"It is advised to update your system before proceeding."
"\nRun sudo pacman -Syu"
tr("Warning"),
tr("It is advised to update your system before proceeding.\nRun sudo pacman -Syu")
);

if (list_to_be_downloaded.isEmpty()) {
Expand Down
Loading
Loading