From 9186e6222f710d9d488b849e2dc3afe01831d49f Mon Sep 17 00:00:00 2001 From: florian Date: Tue, 2 Sep 2025 21:08:11 +0200 Subject: [PATCH] la fin des fins --- src/main.cpp | 8 + src/mainQt.cpp | 6 +- src/model/stock.hpp | 2 +- src/view/qtView.cpp | 428 ++++++++++++++++++----------------- src/view/qtView.hpp | 22 +- src/view/virtualKeyboard.cpp | 42 ++-- 6 files changed, 263 insertions(+), 245 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 956659f..e4167b8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,6 +11,7 @@ int main(int argc, char *argv[]) { // Vérifier les arguments de ligne de commande pour choisir l'interface + // Check command line arguments to choose the interface bool useTerminal = false; for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; @@ -22,6 +23,7 @@ int main(int argc, char *argv[]) if (useTerminal) { // Interface Terminal + // Terminal interface Model model; TerminalView view; StockController controller(&view, &model); @@ -30,6 +32,7 @@ int main(int argc, char *argv[]) return 0; } else { // Interface Qt (par défaut) + // Qt interface (default) QApplication app(argc, argv); Model model; @@ -37,18 +40,23 @@ int main(int argc, char *argv[]) StockController controller(&view, &model); // Configuration dans le thread principal + // Configuration in the main thread view.setController(&controller); view.start(); // Affiche la fenêtre Qt + // Show the Qt window // Démarrer seulement le traitement dans un thread séparé + // Start only the processing in a separate thread std::thread controllerThread([&controller]() { controller.startProcessing(); }); // La boucle d'événements Qt reste sur le thread principal + // The Qt event loop remains on the main thread int result = app.exec(); // Arrêter le contrôleur avant de quitter + // Stop the controller before exiting controller.stop(); controllerThread.join(); diff --git a/src/mainQt.cpp b/src/mainQt.cpp index 58f91c1..3e5d7d2 100644 --- a/src/mainQt.cpp +++ b/src/mainQt.cpp @@ -10,14 +10,14 @@ int main(int argc, char *argv[]) { QApplication app(argc, argv); - // Créer le modèle et la vue + // Create the model and the view Model model; QtView view; - // Créer le contrôleur + // Create the controller StockController controller(&view, &model); - // Démarrer l'application + // Start the application controller.start(); return app.exec(); diff --git a/src/model/stock.hpp b/src/model/stock.hpp index 2265e35..f7ec9f7 100644 --- a/src/model/stock.hpp +++ b/src/model/stock.hpp @@ -14,7 +14,7 @@ public: void addItem(const ItemType &item); void removeItem(int id); - bool removeItem(const ItemType &item); // Nouvelle méthode + bool removeItem(const ItemType &item); // New method ItemType getItem(int id) const; std::map> getItemsWithQuantities() const; diff --git a/src/view/qtView.cpp b/src/view/qtView.cpp index 1bb6e06..b51295f 100644 --- a/src/view/qtView.cpp +++ b/src/view/qtView.cpp @@ -49,58 +49,71 @@ void QtView::stop() void QtView::setupUI() { - // Layout principal vertical + // Main vertical layout m_mainLayout = new QVBoxLayout(this); m_mainLayout->setSpacing(0); m_mainLayout->setContentsMargins(0, 0, 0, 0); - // Widget conteneur principal horizontal (menu gauche + contenu droite) + // Main horizontal container widget (left menu + right content) m_menuDisplayWidget = new QWidget(this); m_menuDisplayLayout = new QHBoxLayout(m_menuDisplayWidget); m_menuDisplayLayout->setSpacing(0); m_menuDisplayLayout->setContentsMargins(0, 0, 0, 0); - // Configuration des layouts + // Layout configuration setupLeftMenu(); setupStackedWidget(); setupMainMenuScreens(); setupActionScreens(); - // Zone de sortie en bas (plus petite) + // Output area at the bottom (smaller) m_outputDisplay = new QTextEdit(this); m_outputDisplay->setReadOnly(true); - m_outputDisplay->setPlaceholderText("Messages et résultats..."); - m_outputDisplay->setMinimumHeight(80); - m_outputDisplay->setMaximumHeight(120); + m_outputDisplay->setPlaceholderText("Messages and results..."); + m_outputDisplay->setMinimumHeight(180); + m_outputDisplay->setMaximumHeight(220); + m_outputDisplay->setStyleSheet( + "QTextEdit {" + " border: 2px solid #bdc3c7;" + " border-radius: 12px;" + " padding: 18px;" + " font-size: 22px;" + " background-color: #ecf0f1;" + " color: #2c3e50;" + "}" + ); - // Ajout des éléments au layout principal - m_mainLayout->addWidget(m_menuDisplayWidget, 1); // Prend la majorité de l'espace - m_mainLayout->addWidget(m_outputDisplay, 0); // Taille fixe + // Add elements to the main layout + m_mainLayout->addWidget(m_menuDisplayWidget, 1); // Takes most of the space + m_mainLayout->addWidget(m_outputDisplay, 0); // Fixed size - // Configuration du clavier virtuel + // Virtual keyboard configuration setupVirtualKeyboard(); + + // Disable the virtual keyboard when clicking on the notification area + m_outputDisplay->installEventFilter(this); - // Connecter les événements des champs de texte après avoir créé tous les écrans + // Connect text field events after creating all screens connectTextFieldEvents(); - // Application des styles tactiles + // Apply touch-friendly styles applyTouchFriendlyStyling(); - // Afficher le menu Stock par défaut seulement si le contrôleur est défini + // Show the Stock menu by default only if the controller is set if (m_controller) { showMainMenu(0); } else { - // Créer un écran d'accueil temporaire + // Create a temporary welcome screen QWidget* welcomeScreen = new QWidget(); QVBoxLayout* welcomeLayout = new QVBoxLayout(welcomeScreen); - QLabel* welcomeLabel = new QLabel("🏭 Gestionnaire de Stock"); - welcomeLabel->setStyleSheet("font-size: 32px; font-weight: bold; color: #2c3e50; padding: 50px;"); - welcomeLabel->setAlignment(Qt::AlignCenter); - - QLabel* infoLabel = new QLabel("Interface tactile prête\nSélectionnez un menu à gauche"); - infoLabel->setStyleSheet("font-size: 18px; color: #7f8c8d; text-align: center;"); - infoLabel->setAlignment(Qt::AlignCenter); + QLabel* welcomeLabel = new QLabel("Stock Manager"); + welcomeLabel->setStyleSheet("font-size: 32px; font-weight: bold; color: #2c3e50; padding: 50px;"); + welcomeLabel->setAlignment(Qt::AlignCenter); + + QLabel* infoLabel = new QLabel("Touch interface ready\nSelect a menu on the left"); + infoLabel->setStyleSheet("font-size: 18px; color: #7f8c8d; text-align: center;"); + infoLabel->setAlignment(Qt::AlignCenter); welcomeLayout->addStretch(); welcomeLayout->addWidget(welcomeLabel); @@ -118,7 +131,7 @@ void QtView::setController(StockController* controller) { m_controller = controller; - // Une fois le contrôleur défini, afficher le menu principal par défaut + // Once the controller is set, show the main menu by default if (m_controller && m_stackedWidget) { showMainMenu(0); } @@ -126,91 +139,88 @@ void QtView::setController(StockController* controller) void QtView::displayStocks(const std::vector& stocks) { - // Créer un écran d'affichage des stocks avec la liste détaillée + // Create and show the stock display screen updateStockDisplayScreen(stocks); - - // Afficher l'écran des stocks showActionScreen(m_showStocksScreen); - - // Optionnel : afficher aussi un message succinct dans la zone de notifications - QString message = QString("📦 %1 stock(s) affiché(s)").arg(stocks.size()); + // Show a notification message in English, no icon + QString message = QString("%1 stock(s) displayed").arg(stocks.size()); m_outputDisplay->append(message); } void QtView::displayStockCreate(const Stock& stock) { - QString message = QString("✅ Stock '%1' créé avec succès ! (Capacité: %2)") + QString message = QString("Stock '%1' created successfully! (Capacity: %2)") .arg(QString::fromStdString(stock.getName())) .arg(stock.getCapacity()); - m_outputDisplay->append(message); - showMessage("Stock créé avec succès !"); + showMessage("Stock created successfully!"); } void QtView::displayItemTypes(const std::vector& itemTypes) { - // Créer un écran d'affichage des types d'articles avec la liste détaillée + // Create and show the item type display screen updateItemTypeDisplayScreen(itemTypes); - - // Afficher l'écran des types d'articles showActionScreen(m_showItemTypesScreen); - - // Optionnel : afficher aussi un message succinct dans la zone de notifications - QString message = QString("🏷️ %1 type(s) d'article(s) affiché(s)").arg(itemTypes.size()); + // Show a notification message in English, no icon + QString message = QString("%1 item type(s) displayed").arg(itemTypes.size()); m_outputDisplay->append(message); } void QtView::displayItemTypeCreate(const ItemType& itemType) { - QString message = QString("✅ Type d'article '%1' créé avec succès !") + QString message = QString("Item type '%1' created successfully!") .arg(QString::fromStdString(itemType.getName())); - m_outputDisplay->append(message); - showMessage("Type d'article créé avec succès !"); + showMessage("Item type created successfully!"); } void QtView::displayAddItemResult(const std::string& stockName, const std::string& itemTypeName, int quantity, bool success) { QString message; if (success) { - message = QString("✅ %1 article(s) de type '%2' ajouté(s) au stock '%3' avec succès !") + message = QString("%1 item(s) of type '%2' successfully added to stock '%3'") .arg(quantity) .arg(QString::fromStdString(itemTypeName)) .arg(QString::fromStdString(stockName)); - showMessage("Articles ajoutés avec succès !"); + showMessage("Items added successfully!"); } else { - message = QString("❌ Échec lors de l'ajout de %1 article(s) de type '%2' au stock '%3'") + message = QString("Failed to add %1 item(s) of type '%2' to stock '%3'") .arg(quantity) .arg(QString::fromStdString(itemTypeName)) .arg(QString::fromStdString(stockName)); - showMessage("Erreur lors de l'ajout des articles", true); + showMessage("Error adding items", true); } - m_outputDisplay->append(message); } void QtView::displayError(const std::string& message) { - QString errorMsg = QString("❌ ERREUR: %1").arg(QString::fromStdString(message)); + QString errorMsg = QString("ERROR: %1").arg(QString::fromStdString(message)); m_outputDisplay->append(errorMsg); showMessage(QString::fromStdString(message), true); } void QtView::displayMessage(const std::string& message) { - QString infoMsg = QString("ℹ️ %1").arg(QString::fromStdString(message)); + QString infoMsg = QString("%1").arg(QString::fromStdString(message)); m_outputDisplay->append(infoMsg); } bool QtView::eventFilter(QObject* obj, QEvent* event) { - // Détecter les clics sur les champs de texte pour afficher le clavier virtuel + // Detect clicks on text fields to show the virtual keyboard if (event->type() == QEvent::MouseButtonPress) { QLineEdit* lineEdit = qobject_cast(obj); QTextEdit* textEdit = qobject_cast(obj); - - if (lineEdit || textEdit) { - // Un champ de texte a été cliqué, afficher le clavier virtuel + + // If clicking on the notification area, hide the keyboard + if (obj == m_outputDisplay && m_virtualKeyboard) { + m_virtualKeyboard->hide(); + return true; // Consume the event + } + + if (lineEdit || (textEdit && obj != m_outputDisplay)) { + // A text field was clicked, show the virtual keyboard QWidget* targetWidget = qobject_cast(obj); if (targetWidget && m_virtualKeyboard) { m_virtualKeyboard->showForWidget(targetWidget); @@ -218,31 +228,31 @@ bool QtView::eventFilter(QObject* obj, QEvent* event) } } - // Laisser l'événement se propager normalement + // Let the event propagate normally return QWidget::eventFilter(obj, event); } void QtView::setupLeftMenu() { - // Widget conteneur pour le menu gauche + // Container widget for the left menu m_leftMenuWidget = new QWidget(); - m_leftMenuWidget->setFixedWidth(200); // Largeur fixe pour le menu + m_leftMenuWidget->setFixedWidth(200); // Fixed width for the menu m_leftMenuWidget->setStyleSheet("background-color: #2c3e50; border-right: 2px solid #34495e;"); - // Scroll area pour le menu gauche + // Scroll area for the left menu m_leftMenuScrollArea = new QScrollArea(); m_leftMenuScrollArea->setWidget(m_leftMenuWidget); m_leftMenuScrollArea->setWidgetResizable(true); m_leftMenuScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_leftMenuScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - // Layout vertical pour les boutons du menu + // Vertical layout for menu buttons m_leftMenuLayout = new QVBoxLayout(m_leftMenuWidget); m_leftMenuLayout->setSpacing(5); m_leftMenuLayout->setContentsMargins(10, 10, 10, 10); - // Bouton retour (masqué par défaut) - m_backButton = new QPushButton("⬅️ Retour", m_leftMenuWidget); + // Back button (hidden by default) + m_backButton = new QPushButton("Back", m_leftMenuWidget); m_backButton->setMinimumHeight(50); m_backButton->setStyleSheet( "QPushButton {" @@ -259,16 +269,16 @@ void QtView::setupLeftMenu() " background-color: #d35400;" "}" ); - m_backButton->hide(); // Masqué par défaut + m_backButton->hide(); // Hidden by default connect(m_backButton, &QPushButton::clicked, this, &QtView::goBack); - // Création des boutons de menu - m_stockMenuButton = new QPushButton("📦 Stocks", m_leftMenuWidget); - m_itemTypeMenuButton = new QPushButton("🏷️ Types d'articles", m_leftMenuWidget); - m_itemMenuButton = new QPushButton("📋 Articles", m_leftMenuWidget); - m_displayMenuButton = new QPushButton("📊 Affichage", m_leftMenuWidget); + // Create menu buttons + m_stockMenuButton = new QPushButton("Stocks", m_leftMenuWidget); + m_itemTypeMenuButton = new QPushButton("Item Types", m_leftMenuWidget); + m_itemMenuButton = new QPushButton("Items", m_leftMenuWidget); + m_displayMenuButton = new QPushButton("Display", m_leftMenuWidget); - // Configuration des boutons pour le tactile + // Configure buttons for touch QList menuButtons = {m_stockMenuButton, m_itemTypeMenuButton, m_itemMenuButton, m_displayMenuButton}; for (QPushButton* button : menuButtons) { button->setMinimumHeight(60); @@ -303,34 +313,34 @@ void QtView::setupLeftMenu() m_leftMenuLayout->addWidget(m_itemTypeMenuButton); m_leftMenuLayout->addWidget(m_itemMenuButton); m_leftMenuLayout->addWidget(m_displayMenuButton); - m_leftMenuLayout->addStretch(); // Pousse les boutons vers le haut + m_leftMenuLayout->addStretch(); // Pushes buttons to the top - // Connexions des signaux pour navigation vers les menus principaux + // Connect signals for navigation to main menus connect(m_stockMenuButton, &QPushButton::clicked, [this]() { showMainMenu(0); }); connect(m_itemTypeMenuButton, &QPushButton::clicked, [this]() { showMainMenu(1); }); connect(m_itemMenuButton, &QPushButton::clicked, [this]() { showMainMenu(2); }); connect(m_displayMenuButton, &QPushButton::clicked, [this]() { showMainMenu(3); }); - // Ajout au layout principal + // Add to main layout m_menuDisplayLayout->addWidget(m_leftMenuScrollArea, 0); } void QtView::setupVirtualKeyboard() { - // Le clavier virtuel sera initialisé dans start() - // et affiché/masqué selon les besoins + // The virtual keyboard will be initialized in start() + // and shown/hidden as needed } void QtView::connectTextFieldEvents() { - // Connecter tous les QLineEdit existants au clavier virtuel + // Connect all existing QLineEdits to the virtual keyboard QList lineEdits = findChildren(); for (QLineEdit* lineEdit : lineEdits) { - // Installer un filtre d'événements pour détecter les clics (pas les changements de texte) + // Install an event filter to detect clicks (not text changes) lineEdit->installEventFilter(this); } - // Connecter aussi les QTextEdit s'il y en a + // Also connect QTextEdits if any QList textEdits = findChildren(); for (QTextEdit* textEdit : textEdits) { textEdit->installEventFilter(this); @@ -339,7 +349,7 @@ void QtView::connectTextFieldEvents() void QtView::updateMenuButtonStyles() { - // Réinitialiser tous les boutons + // Reset all buttons QList buttons = {m_stockMenuButton, m_itemTypeMenuButton, m_itemMenuButton, m_displayMenuButton}; for (QPushButton* btn : buttons) { btn->setChecked(false); @@ -349,8 +359,8 @@ void QtView::updateMenuButtonStyles() // Slots pour le clavier virtuel void QtView::onTextFieldFocused() { - // Cette méthode peut être appelée manuellement si nécessaire - // Trouver le widget qui a le focus et afficher le clavier pour lui + // This method can be called manually if needed + // Find the widget that has focus and show the keyboard for it QWidget* focusedWidget = QApplication::focusWidget(); if (focusedWidget && m_virtualKeyboard) { if (qobject_cast(focusedWidget) || qobject_cast(focusedWidget)) { @@ -380,25 +390,25 @@ void QtView::hideVirtualKeyboard() void QtView::setupStackedWidget() { - // Créer le widget empilé pour la zone de contenu + // Create the stacked widget for the content area m_stackedWidget = new QStackedWidget(); m_stackedWidget->setStyleSheet("background-color: white;"); - // Ajout au layout principal + // Add to main layout m_menuDisplayLayout->addWidget(m_stackedWidget, 1); } void QtView::setupMainMenuScreens() { - // Créer les écrans de menu principal pour chaque catégorie + // Create main menu screens for each category - // Menu principal des stocks - QStringList stockActions = {"➕ Créer un nouveau stock", "👁️ Afficher tous les stocks", "🗑️ Supprimer un stock"}; + // Main menu for stocks + QStringList stockActions = {"Create new stock", "Show all stocks", "Delete a stock"}; std::vector> stockCallbacks = { [this]() { showActionScreen(m_createStockScreen); }, [this]() { showActionScreen(m_showStocksScreen); }, [this]() { - // Créer l'écran de suppression si nécessaire + // Create the deletion screen if needed if (!m_deleteStockScreen) { m_deleteStockScreen = createStockSelectionScreen(); m_stackedWidget->addWidget(m_deleteStockScreen); @@ -406,36 +416,36 @@ void QtView::setupMainMenuScreens() showActionScreen(m_deleteStockScreen); } }; - m_stockMainScreen = createTitleAndButtonScreen("Gestion des Stocks", stockActions, stockCallbacks); + m_stockMainScreen = createTitleAndButtonScreen("Stock Management", stockActions, stockCallbacks); - // Menu principal des types d'articles - QStringList itemTypeActions = {"➕ Créer un nouveau type", "👁️ Afficher tous les types", "🗑️ Supprimer un type"}; + // Main menu for item types + QStringList itemTypeActions = {"Create new type", "Show all types", "Delete a type"}; std::vector> itemTypeCallbacks = { [this]() { showActionScreen(m_createItemTypeScreen); }, [this]() { showActionScreen(m_showItemTypesScreen); }, [this]() { showActionScreen(m_deleteItemTypeScreen); } }; - m_itemTypeMainScreen = createTitleAndButtonScreen("Gestion des Types d'Articles", itemTypeActions, itemTypeCallbacks); + m_itemTypeMainScreen = createTitleAndButtonScreen("Item Type Management", itemTypeActions, itemTypeCallbacks); - // Menu principal des articles - QStringList itemActions = {"➕ Ajouter un article", "🔄 Déplacer un article", "➖ Retirer un article"}; + // Main menu for items + QStringList itemActions = {"Add item", "Move item", "Remove item"}; std::vector> itemCallbacks = { [this]() { showActionScreen(m_addItemScreen); }, [this]() { showActionScreen(m_moveItemScreen); }, [this]() { showActionScreen(m_removeItemScreen); } }; - m_itemMainScreen = createTitleAndButtonScreen("Gestion des Articles", itemActions, itemCallbacks); + m_itemMainScreen = createTitleAndButtonScreen("Item Management", itemActions, itemCallbacks); - // Menu principal de l'affichage - QStringList displayActions = {"📋 Contenu des stocks", "📊 Capacités des stocks", "📈 Statistiques"}; + // Main menu for display + QStringList displayActions = {"Stock contents", "Stock capacities", "Statistics"}; std::vector> displayCallbacks = { [this]() { showActionScreen(m_showStockContentScreen); }, [this]() { showActionScreen(m_showCapacitiesScreen); }, [this]() { showActionScreen(m_showStatisticsScreen); } }; - m_displayMainScreen = createTitleAndButtonScreen("Affichage et Rapports", displayActions, displayCallbacks); + m_displayMainScreen = createTitleAndButtonScreen("Display & Reports", displayActions, displayCallbacks); - // Ajouter tous les écrans au widget empilé + // Add all screens to the stacked widget m_stackedWidget->addWidget(m_stockMainScreen); // Index 0 m_stackedWidget->addWidget(m_itemTypeMainScreen); // Index 1 m_stackedWidget->addWidget(m_itemMainScreen); // Index 2 @@ -452,69 +462,69 @@ void QtView::setupActionScreens() void QtView::setupStockActionScreens() { - // Écran de création de stock - QStringList createStockLabels = {"Nom du stock:", "Capacité:", "Commentaire (optionnel):"}; - QStringList createStockPlaceholders = {"Entrez le nom", "100", "Description du stock"}; + // Stock creation screen + QStringList createStockLabels = {"Stock name:", "Capacity:", "Comment (optional):"}; + QStringList createStockPlaceholders = {"Enter name", "100", "Stock description"}; m_createStockScreen = createFormScreen("Créer un Nouveau Stock", createStockLabels, createStockPlaceholders); m_stackedWidget->addWidget(m_createStockScreen); - // Écran d'affichage des stocks - Créer un écran personnalisé au lieu d'utiliser createTitleAndButtonScreen + // Stock display screen - create a custom screen instead of using createTitleAndButtonScreen m_showStocksScreen = createStockDisplayScreen(); m_stackedWidget->addWidget(m_showStocksScreen); - // Écran de suppression de stock - Sera créé à la demande + // Stock deletion screen - will be created on demand m_deleteStockScreen = nullptr; } void QtView::setupItemTypeActionScreens() { - // Écran de création de type d'article - QStringList createTypeLabels = {"Nom du type:", "Commentaire:", "Taille:"}; - QStringList createTypePlaceholders = {"Type d'article", "Description", "1"}; + // Item type creation screen + QStringList createTypeLabels = {"Type name:", "Comment:", "Size:"}; + QStringList createTypePlaceholders = {"Item type", "Description", "1"}; m_createItemTypeScreen = createFormScreen("Créer un Type d'Article", createTypeLabels, createTypePlaceholders); m_stackedWidget->addWidget(m_createItemTypeScreen); - // Écran d'affichage des types - Créer un écran personnalisé au lieu d'utiliser createTitleAndButtonScreen + // Item type display screen - create a custom screen instead of using createTitleAndButtonScreen m_showItemTypesScreen = createItemTypeDisplayScreen(); m_stackedWidget->addWidget(m_showItemTypesScreen); - // Écran de suppression de type + // Item type deletion screen m_deleteItemTypeScreen = createItemTypeSelectionScreen(); m_stackedWidget->addWidget(m_deleteItemTypeScreen); } void QtView::setupItemActionScreens() { - // Écran d'ajout d'article avec interface tactile - QStringList addItemLabels = {"Stock:", "Type d'article:", "Quantité:"}; + // Item addition screen with touch interface + QStringList addItemLabels = {"Stock:", "Item type:", "Quantity:"}; QStringList addItemFieldTypes = {"stock", "itemtype", "quantity"}; m_addItemScreen = createTactileQuantityScreen("Ajouter un Article", addItemLabels, addItemFieldTypes); m_stackedWidget->addWidget(m_addItemScreen); - // Écran de déplacement d'article avec interface tactile - QStringList moveItemLabels = {"Stock source:", "Stock destination:", "Type d'article:", "Quantité:"}; + // Item move screen with touch interface + QStringList moveItemLabels = {"Source stock:", "Destination stock:", "Item type:", "Quantity:"}; QStringList moveItemFieldTypes = {"stock", "stock", "itemtype", "quantity"}; m_moveItemScreen = createTactileQuantityScreen("Déplacer un Article", moveItemLabels, moveItemFieldTypes); m_stackedWidget->addWidget(m_moveItemScreen); - // Écran de retrait d'article + // Item removal screen m_removeItemScreen = createItemRemovalScreen(); m_stackedWidget->addWidget(m_removeItemScreen); } void QtView::setupDisplayActionScreens() { - // Écran de contenu des stocks + // Stock content screen QStringList stockContentLabels = {"Stock (optionnel):"}; QStringList stockContentPlaceholders = {"Laisser vide pour tous"}; m_showStockContentScreen = createFormScreen("Contenu des Stocks", stockContentLabels, stockContentPlaceholders); m_stackedWidget->addWidget(m_showStockContentScreen); - // Écran des capacités + // Stock capacity screen m_showCapacitiesScreen = createTitleAndButtonScreen("Capacités des Stocks", {"📊 Afficher les capacités"}, {[this]() { onShowCapacities(); }}); m_stackedWidget->addWidget(m_showCapacitiesScreen); - // Écran des statistiques + // Statistics screen m_showStatisticsScreen = createTitleAndButtonScreen("Statistiques", {"📈 Afficher les statistiques"}, {[this]() { onShowStatistics(); }}); m_stackedWidget->addWidget(m_showStatisticsScreen); } @@ -526,13 +536,13 @@ QWidget* QtView::createTitleAndButtonScreen(const QString& title, const QStringL layout->setSpacing(20); layout->setContentsMargins(30, 30, 30, 30); - // Titre + // Title QLabel* titleLabel = new QLabel(title); titleLabel->setStyleSheet("font-size: 28px; font-weight: bold; color: #2c3e50; margin-bottom: 30px;"); titleLabel->setAlignment(Qt::AlignCenter); layout->addWidget(titleLabel); - // Boutons d'action + // Action buttons for (int i = 0; i < buttonTexts.size() && i < callbacks.size(); ++i) { QPushButton* button = new QPushButton(buttonTexts[i]); button->setMinimumHeight(80); @@ -571,24 +581,24 @@ QWidget* QtView::createFormScreen(const QString& title, const QStringList& label layout->setSpacing(20); layout->setContentsMargins(30, 30, 30, 30); - // Titre + // Title QLabel* titleLabel = new QLabel(title); titleLabel->setStyleSheet("font-size: 28px; font-weight: bold; color: #2c3e50; margin-bottom: 30px;"); titleLabel->setAlignment(Qt::AlignCenter); layout->addWidget(titleLabel); - // Formulaire + // Form QWidget* formWidget = new QWidget(); QVBoxLayout* formLayout = new QVBoxLayout(formWidget); formLayout->setSpacing(15); for (int i = 0; i < labels.size(); ++i) { - // Label + // Label QLabel* label = new QLabel(labels[i]); label->setStyleSheet("font-size: 16px; font-weight: bold; color: #34495e;"); formLayout->addWidget(label); - // Champ de saisie + // Input field QLineEdit* field = new QLineEdit(); field->setMinimumHeight(50); field->setStyleSheet( @@ -608,10 +618,10 @@ QWidget* QtView::createFormScreen(const QString& title, const QStringList& label field->setPlaceholderText(placeholders[i]); } - // Objectname pour pouvoir retrouver les champs + // Objectname to find fields field->setObjectName(QString("field_%1").arg(i)); - // Connecter le champ au clavier virtuel + // Connect the field to the virtual keyboard field->installEventFilter(this); formLayout->addWidget(field); @@ -619,12 +629,12 @@ QWidget* QtView::createFormScreen(const QString& title, const QStringList& label layout->addWidget(formWidget); - // Boutons d'action + // Action buttons QWidget* buttonWidget = new QWidget(); QHBoxLayout* buttonLayout = new QHBoxLayout(buttonWidget); - QPushButton* executeButton = new QPushButton("✓ Exécuter"); - QPushButton* cancelButton = new QPushButton("✕ Annuler"); + QPushButton* executeButton = new QPushButton("Execute"); + QPushButton* cancelButton = new QPushButton("Cancel"); QString buttonStyle = "QPushButton {" @@ -647,7 +657,7 @@ QWidget* QtView::createFormScreen(const QString& title, const QStringList& label "QPushButton { background-color: #e74c3c; color: white; }" "QPushButton:hover { background-color: #c0392b; }"); - // Connecter les boutons + // Connect buttons connect(executeButton, &QPushButton::clicked, [this, screen, title]() { executeFormAction(screen, title); }); @@ -668,19 +678,19 @@ QWidget* QtView::createSelectionFormScreen(const QString& title, const QStringLi layout->setSpacing(20); layout->setContentsMargins(30, 30, 30, 30); - // Titre + // Title QLabel* titleLabel = new QLabel(title); titleLabel->setStyleSheet("font-size: 28px; font-weight: bold; color: #2c3e50; margin-bottom: 30px;"); titleLabel->setAlignment(Qt::AlignCenter); layout->addWidget(titleLabel); - // Formulaire + // Form QWidget* formWidget = new QWidget(); QVBoxLayout* formLayout = new QVBoxLayout(formWidget); formLayout->setSpacing(15); for (int i = 0; i < labels.size(); ++i) { - // Label + // Label QLabel* label = new QLabel(labels[i]); label->setStyleSheet("font-size: 16px; font-weight: bold; color: #34495e;"); formLayout->addWidget(label); @@ -688,7 +698,7 @@ QWidget* QtView::createSelectionFormScreen(const QString& title, const QStringLi QString fieldType = (i < fieldTypes.size()) ? fieldTypes[i] : "text"; if (fieldType == "stock") { - // ComboBox pour sélectionner un stock + // ComboBox to select a stock QComboBox* combo = new QComboBox(); combo->setMinimumHeight(50); combo->setStyleSheet( @@ -718,7 +728,7 @@ QWidget* QtView::createSelectionFormScreen(const QString& title, const QStringLi "}" ); - // Remplir avec les stocks disponibles + // Fill with available stocks QStringList stocks = getAvailableStocks(); combo->addItems(stocks); @@ -726,7 +736,7 @@ QWidget* QtView::createSelectionFormScreen(const QString& title, const QStringLi formLayout->addWidget(combo); } else if (fieldType == "itemtype") { - // ComboBox pour sélectionner un type d'article + // ComboBox to select an item type QComboBox* combo = new QComboBox(); combo->setMinimumHeight(50); combo->setStyleSheet( @@ -756,7 +766,7 @@ QWidget* QtView::createSelectionFormScreen(const QString& title, const QStringLi "}" ); - // Remplir avec les types d'articles disponibles + // Fill with available item types QStringList itemTypes = getAvailableItemTypes(); combo->addItems(itemTypes); @@ -764,7 +774,7 @@ QWidget* QtView::createSelectionFormScreen(const QString& title, const QStringLi formLayout->addWidget(combo); } else { - // Champ de saisie normal pour la quantité ou autre + // Normal input field for quantity or other QLineEdit* field = new QLineEdit(); field->setMinimumHeight(50); field->setStyleSheet( @@ -782,7 +792,7 @@ QWidget* QtView::createSelectionFormScreen(const QString& title, const QStringLi if (fieldType == "quantity") { field->setPlaceholderText("1"); - // Accepter seulement les nombres + // Accept only numbers field->setValidator(new QIntValidator(1, 999999, this)); } @@ -799,8 +809,8 @@ QWidget* QtView::createSelectionFormScreen(const QString& title, const QStringLi QHBoxLayout* buttonLayout = new QHBoxLayout(buttonWidget); buttonLayout->setSpacing(20); - QPushButton* executeButton = new QPushButton("✅ Exécuter"); - QPushButton* cancelButton = new QPushButton("❌ Annuler"); + QPushButton* executeButton = new QPushButton("Execute"); + QPushButton* cancelButton = new QPushButton("Cancel"); // Style des boutons executeButton->setMinimumHeight(60); @@ -815,7 +825,7 @@ QWidget* QtView::createSelectionFormScreen(const QString& title, const QStringLi "QPushButton:pressed { background-color: #c0392b; }" "QPushButton:hover { background-color: #c0392b; }"); - // Connecter les boutons + // Connect buttons connect(executeButton, &QPushButton::clicked, [this, screen, title]() { executeFormAction(screen, title); }); @@ -836,19 +846,19 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString layout->setSpacing(20); layout->setContentsMargins(30, 30, 30, 30); - // Titre + // Title QLabel* titleLabel = new QLabel(title); titleLabel->setStyleSheet("font-size: 28px; font-weight: bold; color: #2c3e50; margin-bottom: 30px;"); titleLabel->setAlignment(Qt::AlignCenter); layout->addWidget(titleLabel); - // Formulaire + // Form QWidget* formWidget = new QWidget(); QVBoxLayout* formLayout = new QVBoxLayout(formWidget); formLayout->setSpacing(15); for (int i = 0; i < labels.size(); ++i) { - // Label + // Label QLabel* label = new QLabel(labels[i]); label->setStyleSheet("font-size: 16px; font-weight: bold; color: #34495e;"); formLayout->addWidget(label); @@ -856,7 +866,7 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString QString fieldType = (i < fieldTypes.size()) ? fieldTypes[i] : "text"; if (fieldType == "stock") { - // ComboBox pour sélectionner un stock + // ComboBox to select a stock QComboBox* combo = new QComboBox(); combo->setMinimumHeight(50); combo->setStyleSheet( @@ -886,7 +896,7 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString "}" ); - // Remplir avec les stocks disponibles + // Fill with available stocks QStringList stocks = getAvailableStocks(); combo->addItems(stocks); @@ -894,7 +904,7 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString formLayout->addWidget(combo); } else if (fieldType == "itemtype") { - // ComboBox pour sélectionner un type d'article + // ComboBox to select an item type QComboBox* combo = new QComboBox(); combo->setMinimumHeight(50); combo->setStyleSheet( @@ -924,7 +934,7 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString "}" ); - // Remplir avec les types d'articles disponibles + // Fill with available item types QStringList itemTypes = getAvailableItemTypes(); combo->addItems(itemTypes); @@ -932,12 +942,12 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString formLayout->addWidget(combo); } else if (fieldType == "quantity") { - // Interface tactile pour la quantité avec boutons + et - + // Touch interface for quantity with + and - buttons QWidget* quantityWidget = new QWidget(); QHBoxLayout* quantityLayout = new QHBoxLayout(quantityWidget); quantityLayout->setSpacing(15); - // Bouton - + // Minus button QPushButton* minusButton = new QPushButton("−"); minusButton->setMinimumSize(80, 80); minusButton->setStyleSheet( @@ -958,7 +968,7 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString "}" ); - // Affichage de la quantité + // Quantity display QLabel* quantityDisplay = new QLabel("1"); quantityDisplay->setAlignment(Qt::AlignCenter); quantityDisplay->setMinimumSize(120, 80); @@ -974,7 +984,7 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString ); quantityDisplay->setObjectName(QString("field_%1").arg(i)); - // Bouton + + // Plus button QPushButton* plusButton = new QPushButton("+"); plusButton->setMinimumSize(80, 80); plusButton->setStyleSheet( @@ -995,7 +1005,7 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString "}" ); - // Connecter les boutons + // Connect buttons connect(minusButton, &QPushButton::clicked, [quantityDisplay]() { int currentValue = quantityDisplay->text().toInt(); if (currentValue > 1) { @@ -1019,7 +1029,7 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString formLayout->addWidget(quantityWidget); } else { - // Champ de saisie normal pour autres types + // Normal input field for other types QLineEdit* field = new QLineEdit(); field->setMinimumHeight(50); field->setStyleSheet( @@ -1048,8 +1058,8 @@ QWidget* QtView::createTactileQuantityScreen(const QString& title, const QString QHBoxLayout* buttonLayout = new QHBoxLayout(buttonWidget); buttonLayout->setSpacing(20); - QPushButton* executeButton = new QPushButton("✅ Exécuter"); - QPushButton* cancelButton = new QPushButton("❌ Annuler"); + QPushButton* executeButton = new QPushButton("Execute"); + QPushButton* cancelButton = new QPushButton("Cancel"); // Style des boutons executeButton->setMinimumHeight(60); @@ -1085,13 +1095,13 @@ QWidget* QtView::createStockSelectionScreen() layout->setSpacing(20); layout->setContentsMargins(30, 30, 30, 30); - // Titre - QLabel* titleLabel = new QLabel("Sélectionner un Stock à Supprimer"); + // Title + QLabel* titleLabel = new QLabel("Select a Stock to Delete"); titleLabel->setStyleSheet("font-size: 28px; font-weight: bold; color: #2c3e50; margin-bottom: 30px;"); titleLabel->setAlignment(Qt::AlignCenter); layout->addWidget(titleLabel); - // Scroll area pour la liste des stocks + // Scroll area for the list of stocks QScrollArea* scrollArea = new QScrollArea(); scrollArea->setWidgetResizable(true); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -1104,7 +1114,7 @@ QWidget* QtView::createStockSelectionScreen() "}" ); - // Widget conteneur pour les boutons de stock + // Container widget for stock buttons QWidget* stockListWidget = new QWidget(); m_stockSelectionLayout = new QVBoxLayout(stockListWidget); m_stockSelectionLayout->setSpacing(10); @@ -1113,8 +1123,8 @@ QWidget* QtView::createStockSelectionScreen() scrollArea->setWidget(stockListWidget); layout->addWidget(scrollArea); - // Bouton retour - QPushButton* backButton = new QPushButton("← Retour"); + // Back button + QPushButton* backButton = new QPushButton("Back"); backButton->setStyleSheet( "QPushButton {" " background-color: #95a5a6;" @@ -1132,7 +1142,7 @@ QWidget* QtView::createStockSelectionScreen() connect(backButton, &QPushButton::clicked, this, &QtView::goBack); layout->addWidget(backButton); - // Charger la liste des stocks + // Load the list of stocks refreshStockSelectionScreen(); return screen; @@ -1145,13 +1155,13 @@ QWidget* QtView::createItemTypeSelectionScreen() layout->setSpacing(20); layout->setContentsMargins(30, 30, 30, 30); - // Titre - QLabel* titleLabel = new QLabel("Sélectionner un Type d'Article à Supprimer"); + // Title + QLabel* titleLabel = new QLabel("Select an Item Type to Delete"); titleLabel->setStyleSheet("font-size: 28px; font-weight: bold; color: #2c3e50; margin-bottom: 30px;"); titleLabel->setAlignment(Qt::AlignCenter); layout->addWidget(titleLabel); - // Scroll area pour la liste des types d'articles + // Scroll area for the list of item types QScrollArea* scrollArea = new QScrollArea(); scrollArea->setWidgetResizable(true); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -1164,7 +1174,7 @@ QWidget* QtView::createItemTypeSelectionScreen() "}" ); - // Widget conteneur pour les boutons de types d'articles + // Container widget for item type buttons QWidget* itemTypeListWidget = new QWidget(); m_itemTypeSelectionLayout = new QVBoxLayout(itemTypeListWidget); m_itemTypeSelectionLayout->setSpacing(10); @@ -1173,8 +1183,8 @@ QWidget* QtView::createItemTypeSelectionScreen() scrollArea->setWidget(itemTypeListWidget); layout->addWidget(scrollArea); - // Bouton retour - QPushButton* backButton = new QPushButton("← Retour"); + // Back button + QPushButton* backButton = new QPushButton("Back"); backButton->setStyleSheet( "QPushButton {" " background-color: #95a5a6;" @@ -1192,7 +1202,7 @@ QWidget* QtView::createItemTypeSelectionScreen() connect(backButton, &QPushButton::clicked, this, &QtView::goBack); layout->addWidget(backButton); - // Charger la liste des types d'articles + // Load the list of item types refreshItemTypeSelectionScreen(); return screen; @@ -1205,19 +1215,19 @@ QWidget* QtView::createItemRemovalScreen() layout->setSpacing(20); layout->setContentsMargins(30, 30, 30, 30); - // Titre - QLabel* titleLabel = new QLabel("Sélectionner un Stock"); + // Title + QLabel* titleLabel = new QLabel("Select a Stock"); titleLabel->setStyleSheet("font-size: 28px; font-weight: bold; color: #2c3e50; margin-bottom: 30px;"); titleLabel->setAlignment(Qt::AlignCenter); layout->addWidget(titleLabel); - // Sous-titre - QLabel* subtitleLabel = new QLabel("Choisissez le stock duquel retirer des articles"); + // Subtitle + QLabel* subtitleLabel = new QLabel("Choose the stock from which to remove items"); subtitleLabel->setStyleSheet("font-size: 16px; color: #7f8c8d; margin-bottom: 20px;"); subtitleLabel->setAlignment(Qt::AlignCenter); layout->addWidget(subtitleLabel); - // Scroll area pour la liste des stocks + // Scroll area for the list of stocks QScrollArea* scrollArea = new QScrollArea(); scrollArea->setWidgetResizable(true); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -1230,7 +1240,7 @@ QWidget* QtView::createItemRemovalScreen() "}" ); - // Widget conteneur pour les boutons de stocks + // Container widget for stock buttons QWidget* stockListWidget = new QWidget(); m_removeItemLayout = new QVBoxLayout(stockListWidget); m_removeItemLayout->setSpacing(10); @@ -1239,8 +1249,8 @@ QWidget* QtView::createItemRemovalScreen() scrollArea->setWidget(stockListWidget); layout->addWidget(scrollArea); - // Bouton retour - QPushButton* backButton = new QPushButton("← Retour"); + // Back button + QPushButton* backButton = new QPushButton("Back"); backButton->setStyleSheet( "QPushButton {" " background-color: #95a5a6;" @@ -1258,7 +1268,7 @@ QWidget* QtView::createItemRemovalScreen() connect(backButton, &QPushButton::clicked, this, &QtView::goBack); layout->addWidget(backButton); - // Charger la liste des stocks + // Load the list of stocks refreshItemRemovalScreen(); return screen; @@ -1269,17 +1279,17 @@ void QtView::refreshStockSelectionScreen() if (!m_stockSelectionLayout) return; if (!m_controller) return; - // Supprimer tous les boutons existants + // Remove all existing buttons QLayoutItem *child; while ((child = m_stockSelectionLayout->takeAt(0)) != nullptr) { delete child->widget(); delete child; } - // Vérifier que le modèle existe + // Check that the model exists auto model = m_controller->getModel(); if (!model) { - QLabel* errorLabel = new QLabel("Erreur: Modèle non disponible"); + QLabel* errorLabel = new QLabel("Error: Model not available"); errorLabel->setStyleSheet( "QLabel {" " font-size: 18px;" @@ -1294,11 +1304,11 @@ void QtView::refreshStockSelectionScreen() return; } - // Obtenir la liste des stocks depuis le modèle + // Get the list of stocks from the model auto stocks = model->getStocks(); if (stocks.empty()) { - QLabel* noStockLabel = new QLabel("Aucun stock disponible"); + QLabel* noStockLabel = new QLabel("No stock available"); noStockLabel->setStyleSheet( "QLabel {" " font-size: 18px;" @@ -1310,17 +1320,17 @@ void QtView::refreshStockSelectionScreen() noStockLabel->setAlignment(Qt::AlignCenter); m_stockSelectionLayout->addWidget(noStockLabel); } else { - // Créer un bouton pour chaque stock + // Create a button for each stock for (const auto& stock : stocks) { QString stockName = QString::fromStdString(stock.getName()); - // Créer des informations détaillées sur le stock + // Create detailed information about the stock QString stockInfo = QString("%1\nCapacité: %2 | Utilisé: %3") .arg(stockName) .arg(stock.getCapacity()) .arg(stock.getCurrentSize()); - QPushButton* stockButton = new QPushButton(stockInfo); + QPushButton* stockButton = new QPushButton(stockInfo.remove(QRegExp("[^a-zA-Z0-9À-ÿ '-]"))); stockButton->setMinimumHeight(80); stockButton->setStyleSheet( "QPushButton {" @@ -1341,7 +1351,7 @@ void QtView::refreshStockSelectionScreen() "}" ); - // Connecter le bouton à la confirmation de suppression + // Connect the button to the deletion confirmation connect(stockButton, &QPushButton::clicked, [this, stockName]() { confirmStockDeletion(stockName); }); @@ -1350,7 +1360,7 @@ void QtView::refreshStockSelectionScreen() } } - // Ajouter un stretch à la fin + // Add a stretch at the end m_stockSelectionLayout->addStretch(); } @@ -1359,17 +1369,17 @@ void QtView::refreshItemTypeSelectionScreen() if (!m_itemTypeSelectionLayout) return; if (!m_controller) return; - // Supprimer tous les boutons existants + // Remove all existing buttons QLayoutItem *child; while ((child = m_itemTypeSelectionLayout->takeAt(0)) != nullptr) { delete child->widget(); delete child; } - // Vérifier que le modèle existe + // Check that the model exists auto model = m_controller->getModel(); if (!model) { - QLabel* errorLabel = new QLabel("Erreur: Modèle non disponible"); + QLabel* errorLabel = new QLabel("Error: Model not available"); errorLabel->setStyleSheet( "QLabel {" " font-size: 18px;" @@ -1384,11 +1394,11 @@ void QtView::refreshItemTypeSelectionScreen() return; } - // Obtenir la liste des types d'articles depuis le modèle + // Get the list of item types from the model auto itemTypes = model->getItemTypes(); if (itemTypes.empty()) { - QLabel* noItemTypeLabel = new QLabel("Aucun type d'article disponible"); + QLabel* noItemTypeLabel = new QLabel("No item type available"); noItemTypeLabel->setStyleSheet( "QLabel {" " font-size: 18px;" @@ -1400,12 +1410,12 @@ void QtView::refreshItemTypeSelectionScreen() noItemTypeLabel->setAlignment(Qt::AlignCenter); m_itemTypeSelectionLayout->addWidget(noItemTypeLabel); } else { - // Créer un bouton pour chaque type d'article + // Create a button for each item type for (const auto& itemType : itemTypes) { QString typeName = QString::fromStdString(itemType.getName()); QString comment = QString::fromStdString(itemType.getComment()); - // Créer des informations détaillées sur le type + // Create detailed information about the type QString typeInfo; if (!comment.isEmpty()) { typeInfo = QString("%1\nTaille: %2 | Commentaire: %3") @@ -1418,7 +1428,7 @@ void QtView::refreshItemTypeSelectionScreen() .arg(itemType.getSize()); } - QPushButton* typeButton = new QPushButton(typeInfo); + QPushButton* typeButton = new QPushButton(typeInfo.remove(QRegExp("[^a-zA-Z0-9À-ÿ '-]"))); typeButton->setMinimumHeight(80); typeButton->setStyleSheet( "QPushButton {" @@ -1448,7 +1458,7 @@ void QtView::refreshItemTypeSelectionScreen() } } - // Ajouter un stretch à la fin + // Add a stretch at the end m_itemTypeSelectionLayout->addStretch(); } @@ -1457,17 +1467,17 @@ void QtView::refreshItemRemovalScreen() if (!m_removeItemLayout) return; if (!m_controller) return; - // Supprimer tous les boutons existants + // Remove all existing buttons QLayoutItem *child; while ((child = m_removeItemLayout->takeAt(0)) != nullptr) { delete child->widget(); delete child; } - // Vérifier que le modèle existe + // Check that the model exists auto model = m_controller->getModel(); if (!model) { - QLabel* errorLabel = new QLabel("Erreur: Modèle non disponible"); + QLabel* errorLabel = new QLabel("Error: Model not available"); errorLabel->setStyleSheet( "QLabel {" " font-size: 18px;" @@ -1482,11 +1492,11 @@ void QtView::refreshItemRemovalScreen() return; } - // Obtenir la liste des stocks depuis le modèle + // Get the list of stocks from the model auto stocks = model->getStocks(); if (stocks.empty()) { - QLabel* noStockLabel = new QLabel("Aucun stock disponible"); + QLabel* noStockLabel = new QLabel("No stock available"); noStockLabel->setStyleSheet( "QLabel {" " font-size: 18px;" @@ -1498,7 +1508,7 @@ void QtView::refreshItemRemovalScreen() noStockLabel->setAlignment(Qt::AlignCenter); m_removeItemLayout->addWidget(noStockLabel); } else { - // Créer un bouton pour chaque stock + // Create a button for each stock for (const auto& stock : stocks) { QString stockName = QString::fromStdString(stock.getName()); @@ -1557,7 +1567,7 @@ void QtView::refreshItemRemovalScreen() } } - // Ajouter un stretch à la fin + // Add a stretch at the end m_removeItemLayout->addStretch(); } @@ -1568,14 +1578,14 @@ QWidget* QtView::createStockDisplayScreen() layout->setSpacing(20); layout->setContentsMargins(30, 30, 30, 30); - // Titre - QLabel* titleLabel = new QLabel("📦 Liste des Stocks"); + // Title + QLabel* titleLabel = new QLabel("Stock List"); titleLabel->setStyleSheet("font-size: 28px; font-weight: bold; color: #2c3e50; margin-bottom: 30px;"); titleLabel->setAlignment(Qt::AlignCenter); layout->addWidget(titleLabel); - // Bouton d'actualisation - QPushButton* refreshButton = new QPushButton("🔄 Actualiser la liste"); + // Refresh button + QPushButton* refreshButton = new QPushButton("Refresh list"); refreshButton->setMinimumHeight(60); refreshButton->setStyleSheet( "QPushButton {" @@ -1597,7 +1607,7 @@ QWidget* QtView::createStockDisplayScreen() connect(refreshButton, &QPushButton::clicked, [this]() { onShowStocks(); }); layout->addWidget(refreshButton); - // Zone de contenu avec scroll + // Content area with scroll QScrollArea* scrollArea = new QScrollArea(); scrollArea->setWidgetResizable(true); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -1610,7 +1620,7 @@ QWidget* QtView::createStockDisplayScreen() "}" ); - // Widget conteneur pour la liste des stocks + // Container widget for the list of stocks m_stockDisplayWidget = new QWidget(); m_stockDisplayLayout = new QVBoxLayout(m_stockDisplayWidget); m_stockDisplayLayout->setSpacing(10); @@ -1626,7 +1636,7 @@ void QtView::updateStockDisplayScreen(const std::vector& stocks) { if (!m_stockDisplayLayout) return; - // Supprimer tous les widgets existants + // Remove all existing widgets QLayoutItem *child; while ((child = m_stockDisplayLayout->takeAt(0)) != nullptr) { delete child->widget(); @@ -2389,8 +2399,8 @@ QWidget* QtView::createItemQuantityRemovalScreen(const QString& stockName, const QHBoxLayout* buttonLayout = new QHBoxLayout(buttonWidget); buttonLayout->setSpacing(20); - QPushButton* confirmButton = new QPushButton("✓ Confirmer le retrait"); - QPushButton* cancelButton = new QPushButton("✕ Annuler"); + QPushButton* confirmButton = new QPushButton("Confirmer le retrait"); + QPushButton* cancelButton = new QPushButton("Annuler"); QString buttonStyle = "QPushButton {" diff --git a/src/view/qtView.hpp b/src/view/qtView.hpp index a94a264..750e26d 100644 --- a/src/view/qtView.hpp +++ b/src/view/qtView.hpp @@ -136,13 +136,13 @@ private: void onShowCapacities(); void onShowStatistics(); - // Méthodes pour les notifications (plus de popups) + // Methods for notifications (no more popups) void clearMessages(); void displayNotify(const QString& message); void showMessage(const QString& message, bool isError = false); - void displayResult(const QString& message); // Méthode pour afficher les résultats + void displayResult(const QString& message); // Method to display results - // Méthodes utilitaires pour obtenir les données du modèle + // Utility methods to get model data QStringList getAvailableStocks(); QStringList getAvailableItemTypes(); @@ -151,7 +151,7 @@ private: // Main layout and widgets QVBoxLayout* m_mainLayout; - QWidget* m_menuDisplayWidget; // Widget conteneur pour le layout horizontal + QWidget* m_menuDisplayWidget; // Container widget for horizontal layout QHBoxLayout* m_menuDisplayLayout; // Left side menu (vertical selection) @@ -167,7 +167,7 @@ private: QPushButton* m_itemTypeMenuButton; QPushButton* m_itemMenuButton; QPushButton* m_displayMenuButton; - QPushButton* m_backButton; // Pour retourner au menu principal + QPushButton* m_backButton; // To return to the main menu // Main menu screens QWidget* m_stockMainScreen; @@ -179,16 +179,16 @@ private: QWidget* m_createStockScreen; QWidget* m_showStocksScreen; QWidget* m_deleteStockScreen; - QVBoxLayout* m_stockSelectionLayout; // Layout pour les boutons de stock - QWidget* m_stockDisplayWidget; // Widget pour l'affichage des stocks - QVBoxLayout* m_stockDisplayLayout; // Layout pour l'affichage des stocks + QVBoxLayout* m_stockSelectionLayout; // Layout for stock buttons + QWidget* m_stockDisplayWidget; // Widget for stock display + QVBoxLayout* m_stockDisplayLayout; // Layout for stock display QWidget* m_createItemTypeScreen; QWidget* m_showItemTypesScreen; QWidget* m_deleteItemTypeScreen; - QVBoxLayout* m_itemTypeSelectionLayout; // Layout pour les boutons de types d'articles - QWidget* m_itemTypeDisplayWidget; // Widget pour l'affichage des types d'articles - QVBoxLayout* m_itemTypeDisplayLayout; // Layout pour l'affichage des types d'articles + QVBoxLayout* m_itemTypeSelectionLayout; // Layout for item type buttons + QWidget* m_itemTypeDisplayWidget; // Widget for item type display + QVBoxLayout* m_itemTypeDisplayLayout; // Layout for item type display QWidget* m_addItemScreen; QWidget* m_moveItemScreen; diff --git a/src/view/virtualKeyboard.cpp b/src/view/virtualKeyboard.cpp index 4430568..f1a5572 100644 --- a/src/view/virtualKeyboard.cpp +++ b/src/view/virtualKeyboard.cpp @@ -25,9 +25,9 @@ VirtualKeyboard::VirtualKeyboard(QWidget* parent) , m_capsLockButton(nullptr) , m_hideButton(nullptr) { - // Ne pas créer de fenêtre séparée, utiliser le parent + // Do not create a separate window, use the parent setAttribute(Qt::WA_ShowWithoutActivating); - setAutoFillBackground(true); // Permettre le fond personnalisé + setAutoFillBackground(true); // Allow custom background // Initialize key layouts m_qwertyLayout << "q" << "w" << "e" << "r" << "t" << "y" << "u" << "i" << "o" << "p" @@ -55,7 +55,7 @@ void VirtualKeyboard::showForWidget(QWidget* target) { setTargetWidget(target); - // Initialiser la zone d'affichage avec le contenu actuel + // Initialize the display area with the current content if (QLineEdit* lineEdit = qobject_cast(target)) { m_displayEdit->setText(lineEdit->text()); } else if (QTextEdit* textEdit = qobject_cast(target)) { @@ -64,7 +64,7 @@ void VirtualKeyboard::showForWidget(QWidget* target) m_displayEdit->clear(); } - // Positionner le clavier comme overlay sur l'application parent + // Position the keyboard as an overlay on the parent application if (parentWidget()) { setGeometry(parentWidget()->rect()); } @@ -88,10 +88,10 @@ void VirtualKeyboard::setupKeyboard() // Header with title and hide button QHBoxLayout* headerLayout = new QHBoxLayout(); - QLabel* titleLabel = new QLabel("Clavier Virtuel"); + QLabel* titleLabel = new QLabel("Virtual Keyboard"); titleLabel->setObjectName("keyboardTitle"); - m_hideButton = new QPushButton("✕ Fermer"); + m_hideButton = new QPushButton("Close"); m_hideButton->setObjectName("hideButton"); m_hideButton->setFixedSize(180, 70); connect(m_hideButton, &QPushButton::clicked, this, &VirtualKeyboard::hideKeyboard); @@ -107,7 +107,7 @@ void VirtualKeyboard::setupKeyboard() m_displayEdit->setObjectName("displayEdit"); m_displayEdit->setReadOnly(true); m_displayEdit->setFixedHeight(80); - m_displayEdit->setPlaceholderText("Le texte saisi apparaîtra ici..."); + m_displayEdit->setPlaceholderText("Entered text will appear here..."); m_mainLayout->addWidget(m_displayEdit); // Add spacer to center keyboard @@ -130,7 +130,7 @@ void VirtualKeyboard::setupNumericKeys() { QHBoxLayout* numericLayout = new QHBoxLayout(); numericLayout->setSpacing(15); - numericLayout->addStretch(); // Centrer les touches + numericLayout->addStretch(); // Center the keys for (const QString& key : m_numericLayout) { QPushButton* button = new QPushButton(key); @@ -151,7 +151,7 @@ void VirtualKeyboard::setupNumericKeys() numericLayout->addWidget(button); } - numericLayout->addStretch(); // Centrer les touches + numericLayout->addStretch(); // Center the keys m_mainLayout->addLayout(numericLayout); } @@ -197,7 +197,7 @@ void VirtualKeyboard::setupAlphabeticKeys() thirdRow->addStretch(); // Shift button - m_shiftButton = new QPushButton("⇧"); + m_shiftButton = new QPushButton("Shift"); m_shiftButton->setObjectName("functionKey"); m_shiftButton->setFixedSize(80, 60); m_shiftButton->setCheckable(true); @@ -214,7 +214,7 @@ void VirtualKeyboard::setupAlphabeticKeys() } // Backspace button - m_backspaceButton = new QPushButton("⌫"); + m_backspaceButton = new QPushButton("Backspace"); m_backspaceButton->setObjectName("functionKey"); m_backspaceButton->setFixedSize(80, 60); connect(m_backspaceButton, &QPushButton::clicked, this, &VirtualKeyboard::onBackspacePressed); @@ -239,14 +239,14 @@ void VirtualKeyboard::setupFunctionKeys() m_functionLayout->addWidget(m_capsLockButton); // Space bar - m_spaceButton = new QPushButton("Espace"); + m_spaceButton = new QPushButton("Space"); m_spaceButton->setObjectName("spaceKey"); m_spaceButton->setFixedSize(240, 60); connect(m_spaceButton, &QPushButton::clicked, this, &VirtualKeyboard::onSpacePressed); m_functionLayout->addWidget(m_spaceButton); // Enter - m_enterButton = new QPushButton("↵"); + m_enterButton = new QPushButton("Enter"); m_enterButton->setObjectName("functionKey"); m_enterButton->setFixedSize(80, 60); connect(m_enterButton, &QPushButton::clicked, this, &VirtualKeyboard::onEnterPressed); @@ -268,7 +268,7 @@ void VirtualKeyboard::setupFunctionKeys() void VirtualKeyboard::applyKeyboardStyling() { - // Utiliser une palette pour le fond au lieu du stylesheet + // Use a palette for the background instead of stylesheet QPalette palette = this->palette(); palette.setColor(QPalette::Window, QColor(44, 62, 80, 250)); setPalette(palette); @@ -402,11 +402,11 @@ void VirtualKeyboard::insertTextToTarget(const QString& text) if (QLineEdit* lineEdit = qobject_cast(m_targetWidget)) { lineEdit->insert(text); - // Mettre à jour la zone d'affichage + // Update the display area m_displayEdit->setText(lineEdit->text()); } else if (QTextEdit* textEdit = qobject_cast(m_targetWidget)) { textEdit->insertPlainText(text); - // Mettre à jour la zone d'affichage + // Update the display area m_displayEdit->setText(textEdit->toPlainText()); } } @@ -440,7 +440,7 @@ void VirtualKeyboard::positionKeyboard() } if (y + keyboardSize.height() > screenGeometry.bottom()) { - // If no space below, position above the target widget + // If no space below, position above the target widget y = targetPos.y() - keyboardSize.height() - 10; } @@ -450,7 +450,7 @@ void VirtualKeyboard::positionKeyboard() void VirtualKeyboard::showEvent(QShowEvent* event) { QWidget::showEvent(event); - // Le clavier est maintenant en plein écran, pas besoin de positionner + // The keyboard is now fullscreen, no need to position } void VirtualKeyboard::hideEvent(QHideEvent* event) @@ -462,7 +462,7 @@ void VirtualKeyboard::hideEvent(QHideEvent* event) void VirtualKeyboard::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); - // S'assurer que le clavier couvre toute la fenêtre parent si visible + // Ensure the keyboard covers the entire parent window if visible if (isVisible() && parentWidget()) { setGeometry(parentWidget()->rect()); } @@ -473,11 +473,11 @@ void VirtualKeyboard::paintEvent(QPaintEvent* event) QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); - // Dessiner le fond avec transparence + // Draw the background with transparency QColor backgroundColor(44, 62, 80, 250); painter.fillRect(rect(), backgroundColor); - // Dessiner la bordure + // Draw the border QPen borderPen(QColor(52, 73, 94), 3); painter.setPen(borderPen); painter.drawRoundedRect(rect().adjusted(1, 1, -1, -1), 15, 15);