diff --git a/data/translations/Internationalization_fr.ts b/data/translations/Internationalization_fr.ts
index 6b88ecb6..750a1a33 100644
--- a/data/translations/Internationalization_fr.ts
+++ b/data/translations/Internationalization_fr.ts
@@ -4,24 +4,20 @@
AbstractWidgetList
- Add New
- Ajouter nouveau
+ Ajouter nouveau
- Move Up
- Déplacer vers le haut
+ Déplacer vers le haut
- Move Down
- Déplacer vers le bas
+ Déplacer vers le bas
- Remove
- Enlever
+ Enlever
@@ -53,33 +49,33 @@
AppLauncherWidget
-
+ Open WithOuvrir avec
-
+ Launch in terminalLancer dans le terminal
-
+ Keep open after selectionMaintenir ouvert après la sélection
-
-
+
+ ErrorErreur
-
+ Unable to write inImpossible d'écrire dessus
-
+ Unable to launch in terminal.Impossible de lancer dans le terminal.
@@ -141,66 +137,42 @@
-
-
- seconds secondes
-
-
- Take new screenshotPrendre une nouvelle capture
-
-
- Area:Zone :
-
-
- Capture LauncherLanceur de capture
-
-
- TextLabelÉtiquette de texte
-
-
- Capture ModeMode de capture
-
-
- Delay:Retard :
-
-
- WxH+x+yWxH+x+y
@@ -208,62 +180,62 @@
CaptureWidget
-
+ Unable to capture screenImpossible de capturer l'écran
-
+ MouseSouris
-
+ Select screenshot areaSélectionner la zone de capture d'écran
-
+ Mouse WheelMolette de la souris
-
+ Change tool sizeChanger la taille de l'outil
-
+ Right ClickClic droit
-
+ Show color pickerAfficher la palette des couleurs
-
+ Open side panelOuvrir le panneau latéral
-
+ EscÉchap
-
+ ExitQuitter
-
+ Flameshot has lost focus. Keyboard shortcuts won't work until you click somewhere.Flameshot a perdu focus. Les raccourcis clavier ne fonctionneront pas sans avoir cliquer quelque part.
-
+ Configuration error resolved. Launch `flameshot gui` again to apply it.Erreur de configuration résolue. Lancer `flameshot gui` à nouveau.
@@ -280,7 +252,7 @@ Utiliser la molette de la souris pour changer l'épaisseur de l'outil.
Appuyer sur Espace pour ouvrir le panneau latéral.
-
+ Tool SettingsRéglages des outils
@@ -314,76 +286,40 @@ Appuyer sur Espace pour ouvrir le panneau latéral.
ColorDialog
-
-
-
- Select Color
- Sélectionner Couleur
+ Sélectionner Couleur
-
-
-
- Saturation
- Saturation
+ Saturation
-
-
-
- Hue
- Teinte
+ Teinte
-
-
-
- Hex
- Hex
+ Hex
-
-
-
- Blue
- Bleu
+ Bleu
-
-
-
- Value
- Valeur
+ Valeur
-
-
-
- Green
- Vert
+ Vert
-
-
-
- Alpha
- Alpha
+ Alpha
-
-
-
- Red
- Rouge
+ Rouge
@@ -517,45 +453,45 @@ Appuyer sur Espace pour ouvrir le panneau latéral.
ConfigHandler
-
+ Unrecognized setting: '%1'
Préférence inconnue : '%1'
-
+ Unrecognized shortcut name: '%1'.
Nom de raccourcis inconnu : '%1'.
-
+ Shortcut conflict: '%1' and '%2' have the same shortcut: %3
Conflit de raccourcis : '%1' et '%2' ont le même raccourci : %3
-
+ Bad value in '%1'. Expected: %2
Mauvaise valeur dans '%1'. Attendu : %2
-
+ You have successfully resolved the configuration error.Vous avez résolu l'erreur de configuration.
-
+ The configuration contains an error. Open configuration to resolve.Cette configuration contient une erreur. Ouvrez la configuration pour la résoudre.
-
+ Bad config key '%1' in ConfigHandler. Please report this as a bug.Bad config key '%1' in ConfigHandler. Please report this as a bug.
@@ -806,17 +742,17 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
Flameshot
-
+ ErrorErreur
-
+ Unable to close active modal widgetsImpossible de fermer les widgets modales actifs
-
+ URL copied to clipboard.URL copied to clipboard.
@@ -824,22 +760,22 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
FlameshotDaemon
-
+ New version %1 is availableLa nouvelle version %1 est disponible
-
+ You have the latest versionVous avez la dernière version
-
+ Failed to get information about the latest version.Impossible d'obtenir des informations sur la dernière version.
-
+ Unable to connect via DBusImpossible de se connecter via DBus
@@ -926,47 +862,47 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
GeneralConf
-
-
+
+ ImportImporter
-
-
-
+
+
+ ErrorErreur
-
+ Unable to read file.Impossible de lire le fichier.
-
-
+
+ Unable to write file.Impossible d'écrire le fichier.
-
+ Save FileSauvegarder le fichier
-
+ Confirm ResetConfirmer la réinitialisation
-
+ Are you sure you want to reset the configuration?Êtes-vous sûr(e) de vouloir réinitialiser la configuration ?
-
+ Show help messageAfficher le message d'aide
@@ -975,7 +911,7 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
Afficher le message d'aide au lancement du mode capture.
-
+ Show the side panel buttonAfficher le bouton du panneau principal
@@ -984,12 +920,12 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
Afficher le bouton de basculement du panneau latéral en mode capture.
-
+ Show desktop notificationsAfficher les notifications du bureau
-
+ Show tray iconAfficher les icônes de la barre d'état
@@ -998,62 +934,59 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
Afficher l'icône dans la barre de tâches
-
+ Confirmation required to delete screenshot from the latest uploadsConfirmation requise pour supprimer la capture d'écran des derniers téléchargements
-
+ Configuration FileFichier de configuration
-
+ ExportExporter
-
+ ResetRéinitialiser
-
+ Automatic check for updatesContrôle automatique des mises à jour
-
+ Allow multiple flameshot GUI instances simultaneouslyAutoriser plusieurs instances simultanées de flameshot GUI
-
- Automatically close daemon when it is not needed
- Clore automatiquement le démon lorsqu'il n'est plus nécessaire
+ Clore automatiquement le démon lorsqu'il n'est plus nécessaire
- Launch at startup
- Lancer au démarrage
+ Lancer au démarrageLaunch FlameshotDémarrer Flameshot
-
+ Show welcome message on launchAfficher le message de bienvenue au démarrage
-
+ Use large predefined color paletteUtiliser une large palette de couleurs prédéfinies
-
+ Copy URL after uploadCopier l'URL après le téléchargement
@@ -1062,7 +995,7 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
Copier l'URL et fermer la fenêtre après le téléchargement
-
+ Save image after copyEnregistrer l'image après la copie
@@ -1071,182 +1004,263 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
Enregistrer le fichier image après l'avoir copiée
-
+ Show the help message at the beginning in the capture modeAfficher un message d'aide au début du mode de capture
-
+ Use last regionUse last region
-
+ Uses the last region as the default selection for the next screenshotUses the last region as the default selection for the next screenshot
-
+ Show the side panel toggle button in the capture modeAfficher le bouton pour activer le panneau du côté en mode capture
-
+ Enable desktop notificationsActiver les notifications sur le bureau
-
+ Show icon in the system trayAfficher une icône dans la barre de tâches
-
+ Ask for confirmation to delete screenshot from the latest uploadsDemander la confirmation avant de supprimer les captures d'écran précédemment envoyées
-
+ Check for updates automaticallyVérifier automatiquement les mises à jour
-
+ This allows you to take screenshots of Flameshot itself for exampleCela permet par exemple de prendre des captures d'écran de Flameshot
- Launch Flameshot daemon when computer is booted
- Lancer le démon de Flameshot quand l'ordinateur démarre
+ Lancer le démon de Flameshot quand l'ordinateur démarre
-
+ Show the welcome message box in the middle of the screen while taking a screenshotAfficher la boite de message de bienvenue à milieu de l'écran à la prise d'une capture d'écran
-
+ Use a large predefined color paletteUtiliser une vaste palette de couleurs prédéfinie
-
+ Copy on double clickCopy on double click
- Enable Copy on Double Click
- Enable Copy on Double Click
+ Enable Copy on Double Click
- Copy URL and close window after uploading was successful
- Copier l'URL puis fermer la fenêtre au succès de l'envoi
+ Copier l'URL puis fermer la fenêtre au succès de l'envoi
-
+
+ Automatically unload from memory when it is not needed
+
+
+
+
+ Automatically close daemon (background process) when it is not needed
+
+
+
+
+ Launch in background at startup
+
+
+
+
+ Launch Flameshot daemon (background process) when computer is booted
+
+
+
+
+ Enable Copy to clipboard on Double Click
+
+
+
+
+ Copy URL after uploading was successful
+
+
+
+ After copying the screenshot, save it to a file as wellAprès la copie de la capture d'écran, l'enregistrée aussi dans un fichier
-
+ Save PathEnregistrer le chemin
-
+ Change...modifier...
-
+ Use fixed path for screenshots to saveUtiliser un emplacement spécifique pour l'enregistrement des captures d'écran
-
+ Preferred save file extension:Extension de fichier préférée pour l'enregistrement :
-
+ Latest Uploads Max SizeDerniers téléchargements, taille maximale
-
+ Imgur Application Client IDImgur Application Client ID
-
+ Undo limitAnnuler la limite
-
-
+ Use JPG format for clipboard (PNG default)Utiliser le format JPG pour le presse-papiers (PNG par défaut)
-
+
+ Use lossy JPG format for clipboard (lossless PNG default)
+
+
+
+ Copy file path after saveCopier le chemin du fichier après l'enregistrement
-
+ Copy the file path to clipboard after the file is savedCopier le chemin vers le fichier dans le presse-papier quand il a été enregistré
-
+ Anti-aliasing image when zoom the pinned imageAnticrénelage de l'image lors du zoom de l'image épinglée
-
+ After zooming the pinned image, should the image get smoothened or stay pixelatedAprès avoir zoomé sur l'image épinglée, l'image doit-elle être lissée ou rester pixelisée ?
-
-
+
+ Upload image without confirmationUploader image sans confirmation
-
+ Choose a FolderChoisir un dossier
-
+ Unable to write to directory.Impossible d'écrire dans le répertoire.
-
+ Show magnifierAfficher la loupe
-
+ Enable a magnifier while selecting the screenshot areaActiver la loupe lors de la sélection de l'aire de capture d'écran
-
+ Square shaped magnifierLoupe carrée
-
+ Make the magnifier to be square-shapedAffiche la loupe avec une forme carrée
+
+
+ Milliseconds before geometry display hides; 0 means do not hide
+
+
+
+
+ Set geometry display timeout (ms)
+
+
+
+
+ Selection Geometry Display
+
+
+
+
+ Display Location
+
+
+
+
+ None
+
+
+
+
+ Top Left
+
+
+
+
+ Top Right
+
+
+
+
+ Bottom Left
+
+
+
+
+ Bottom Right
+
+
+
+
+ Center
+
+ HistoryWidget
@@ -1352,57 +1366,57 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
Upload image
-
+ Uploading ImageEnvoi de l'image
-
+ Copy URLCopier l'URL
-
+ Open URLOuvrir l'URL
-
+ Delete imageEffacer l'image
-
+ Image to Clipboard.Copier l'image dans le presse-papiers.
-
+ Save imageEnregistrer l'image
-
+ Unable to open the URL.Impossible d'ouvrir l'URL.
-
+ URL copied to clipboard.URL copiée dans le presse-papiers.
-
+ Screenshot copied to clipboard.Capture d'écran copiée dans le presse-papier.
-
+ Unable to save the screenshot to disk.Impossible d'enregistrer la capture d'écran sur le disque.
-
+ Screenshot saved.Capture d'écran enregistrée.
@@ -1475,65 +1489,41 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
InfoWindow
-
-
- AboutÀ propos
-
-
- IconIcône
-
-
- LicenseLicence
-
-
- GPLv3+GPLv3+
-
-
- VersionVersion
-
-
- Flameshot vFlameshot v
-
-
- OS InfoInfos SE
-
-
- Copy InfoCopier infos
@@ -1683,20 +1673,45 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
PinWidget
-
+ Context menuContext menu
-
+ Copy to clipboardCopier dans le presse-papier
-
+ Save to fileSave to file
+
+
+ Rotate Right
+ Pivoter à droite
+
+
+
+ Rotate Left
+ Pivoter à gauche
+
+
+
+ Increase Opacity
+ Augmenter l'opacité
+
+
+
+ Decrease Opacity
+ Diminuer l'opacité
+
+
+
+ Close
+ Fermer
+ PixelateTool
@@ -1714,14 +1729,12 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
QHotkey
- Failed to register %1. Error: %2
- Échec de l'enregistrement %1. Erreur : %2
+ Échec de l'enregistrement %1. Erreur : %2
- Failed to unregister %1. Error: %2
- Échec de la désinscription %1. Erreur : %2
+ Échec de la désinscription %1. Erreur : %2
@@ -1781,42 +1794,42 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
Capture enregistrée et copiée dans le presse-papier
-
+ Unable to connect via DBusImpossible de se connecter via DBus
-
+ Powerful yet simple to use screenshot software.Logiciel de capture d'écran puissant mais simple à utiliser.
-
+ SeeVoir
-
+ Capture the entire desktop.Capturer l'écran entier.
-
+ Open the capture launcher.Ouvrir le menu de capture.
-
+ Start a manual capture in GUI mode.Démarre une capture manuelle en mode graphique.
-
+ ConfigureConfigurer
-
+ Capture a single screen.Capturer un écran seul.
@@ -1825,107 +1838,107 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
Chemin où la capture sera enregistrée
-
+ Existing directory or new file to save toDossier existant ou nouveau fichier à sauvegarder dans
-
+ Save the capture to the clipboardEnregistrer la capture dans le presse-papier
-
+ Pin the capture to the screenPin the capture to the screen
-
+ Upload screenshotUpload screenshot
-
+ Delay time in millisecondsDélai en millisecondes
-
+ Repeat screenshot with previously selected regionRepeat screenshot with previously selected region
-
+ Screenshot region to selectZone de capture d'écran à sélectionner
-
+ Set the filename patternDéfinir le modèle de nom de fichier
-
+ Accept capture as soon as a selection is madeAccepter la capture d'écran dès qu'une sélection est faite
-
+ Enable or disable the trayiconActiver ou désactiver l'icone de la barre des tâches
-
+ Enable or disable run at startupActiver ou désactiver le lancement au démarrage
-
+ Check the configuration for errorsVérifiez l'absence d'erreurs dans la configuration
-
+ Show the help message in the capture modeAfficher le message d'aide dans le mode capture
-
+ Define the main UI colorDéfinir la couleur de base de l'interface
-
+ Define the contrast UI colorDéfinir le contraste de l'interface utilisateur
-
+ Print raw PNG capturePrint raw PNG capture
-
+ Print geometry of the selection in the format WxH+X+Y. Does nothing if raw is specifiedPrint geometry of the selection in the format WxH+X+Y. Does nothing if raw is specified
-
+ Define the screen to capture (starting from 0)Define the screen to capture (starting from 0)
-
+ Invalid delay, it must be a number greater than 0Délai invalide, il doit être supérieur à 0
-
+ Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'.Invalid region, use 'WxH+X+Y' or 'all' or 'screen0/screen1/...'.
-
+ Invalid path, must be an existing directory or a new file in an existing directoryInvalid path, must be an existing directory or a new file in an existing directory
@@ -1934,17 +1947,17 @@ Veuillez résoudre ce problème manuellement depuis le fichier de configuration.
Définir l'écran à capturer
-
+ default: screen containing the cursorPar défaut : Ecran contenant le curseur
-
+ Screen numberNuméro d'écran
-
+ Invalid color, this flag supports the following formats:
- #RGB (each of R, G, and B is a single hex digit)
- #RRGGBB
@@ -1965,7 +1978,7 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
Délai non valable, il doit être plus élevé que 0
-
+ Invalid screen number, it must be non negativeNuméro d'écran non-valable, il ne doit pas être négatif
@@ -1974,7 +1987,7 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
Chemin non-valable, il doit indiquer un chemin existant du système
-
+ Invalid value, it must be defined as 'true' or 'false'Valeur non-valable, elle doit être définie comme 'true' ou 'false'
@@ -1989,12 +2002,12 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
Impossible d'écrire par dessus
-
+ Requested screen exceeds screen countRequested screen exceeds screen count
-
+ Full screen screenshot pinned to screenFull screen screenshot pinned to screen
@@ -2082,27 +2095,27 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
Effacer l'outil actuel
-
+ Quit captureQuitter la capture d'écran
-
+ Screenshot historyHistorique des captures d'écran
-
+ Capture screenCapturer l'écran
-
+ Show color pickerAfficher la palette de couleurs
-
+ Change the tool's sizeChange the tool's size
@@ -2157,17 +2170,21 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
ScreenGrabber
- Unable to detect desktop environment (GNOME? KDE? Sway? ...)
- Impossible de détecter l’environnement de bureau (GNOME ? KDE ? Sway ? ...)
+ Impossible de détecter l’environnement de bureau (GNOME ? KDE ? Sway ? ...)
-
+
+ Unable to detect desktop environment (GNOME? KDE? Qile? Sway? ...)
+ Impossible de détecter l'environnement de bureau (GNOME ? KDE ? Qile ? Sway ?...)
+
+
+ Hint: try setting the XDG_CURRENT_DESKTOP environment variable.Conseil : essayez de définir la variable d’environnement XDG_CURRENT_DESKTOP.
-
+ Unable to capture screenImpossible de capturer l'écran
@@ -2266,47 +2283,67 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
Redimensionner la sélection de 1px vers le bas
-
+
+ Symmetrically decrease width by 2px
+ Diminuer symétriquement la largeur de 2px
+
+
+
+ Symmetrically increase width by 2px
+ Augmenter symétriquement la largeur de 2px
+
+
+
+ Symmetrically increase height by 2px
+ Augmenter symétriquement la hauteur de 2px
+
+
+
+ Symmetrically decrease height by 2px
+ Diminuer symétriquement la hauteur de 2px
+
+
+ Select entire screenSélectionner l'écran en entier
-
+ Move selection left 1pxDéplacer la sélection de 1px vers la gauche
-
+ Move selection right 1pxDéplacer la sélection de 1px vers la droite
-
+ Move selection up 1pxDéplacer la sélection de 1px vers le haut
-
+ Move selection down 1pxDéplacer la sélection de 1px vers le bas
-
+ Commit text in text areaInsérer du texte dans la zone de texte
-
+ Delete current toolEffacer l'outil actuel
-
+ Capture screenCapturer l'écran
-
+ Screenshot historyHistorique des captures d'écran
@@ -2322,20 +2359,25 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
Appuyer sur Échap pour annuler
-
+ Active tool size: Taille de l’outil actif :
-
+ Active Color: Couleur active :
-
+ Grab ColorSaisir la couleur
+
+
+ Display grid
+ Afficher la grille
+ Active thickness:Épaisseur sélectionnée:
@@ -2370,14 +2412,12 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
SizeIndicatorTool
- Selection Size Indicator
- Indicateur de la taille de la sélection
+ Indicateur de la taille de la sélection
- Show X and Y dimensions of the selection
- Show X and Y dimensions of the selection
+ Show X and Y dimensions of the selectionShow the dimensions of the selection (X Y)
@@ -2554,42 +2594,42 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
TrayIcon
-
+ &Take Screenshot&Capturer l'écran
-
+ &Open Launcher&Ouvrir le lanceur
-
+ &Configuration&Configuration
-
+ &About&À propos
-
+ Check for updatesVérifier les mises à jour
-
+ New version %1 is availableLa nouvelle version %1 est disponible
-
+ &Quit&Quitter
-
+ &Latest Uploads&Derniers téléversements
@@ -2671,9 +2711,6 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
UploadHistory
-
-
- Upload HistoryHistorique d'envois
@@ -2687,33 +2724,21 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
UploadLineItem
-
-
- FormFormulaire
-
-
- TextLabelétiquette de texte
-
-
- Copy URLCopier l'URL
-
-
- Open In BrowserOuvrir dans le navigateur
@@ -2772,176 +2797,124 @@ Vous devrez probablement remplacer le signe '#' par '\#FFF'<
color_widgets::ColorDialog
- Pick
- Pick
+ Pickcolor_widgets::ColorPalette
- Unnamed
- Unnamed
+ Unnamedcolor_widgets::ColorPaletteModel
- Unnamed
- Unnamed
+ Unnamed
- %1 (%2 colors)
- %1 (%2 colors)
+ %1 (%2 colors)color_widgets::ColorPaletteWidget
-
-
-
- Open a new palette from file
- Open a new palette from file
+ Open a new palette from file
-
-
-
- Create a new palette
- Create a new palette
+ Create a new palette
-
-
-
- Duplicate the current palette
- Duplicate the current palette
+ Duplicate the current palette
-
-
-
- Delete the current palette
- Delete the current palette
+ Delete the current palette
-
-
-
- Revert changes to the current palette
- Revert changes to the current palette
+ Revert changes to the current palette
-
-
-
- Save changes to the current palette
- Save changes to the current palette
+ Save changes to the current palette
-
-
-
- Add a color to the palette
- Add a color to the palette
+ Add a color to the palette
-
-
-
- Remove the selected color from the palette
- Remove the selected color from the palette
+ Remove the selected color from the palette
-
- New Palette
- New Palette
+ New Palette
-
- Name
- Name
+ Name
- GIMP Palettes (*.gpl)
- GIMP Palettes (*.gpl)
+ GIMP Palettes (*.gpl)
- Palette Image (%1)
- Palette Image (%1)
+ Palette Image (%1)
- All Files (*)
- All Files (*)
+ All Files (*)
-
- Open Palette
- Open Palette
+ Open Palette
- Failed to load the palette file
%1
- Failed to load the palette file
+ Failed to load the palette file
%1color_widgets::GradientEditor
- Add Color
- Add Color
+ Add Color
- Remove Color
- Remove Color
+ Remove Color
- Edit Color...
- Edit Color...
+ Edit Color...color_widgets::GradientListModel
- %1 (%2 colors)
- %1 (%2 colors)
+ %1 (%2 colors)color_widgets::Swatch
- Clear Color
- Clear Color
+ Clear Color
- %1 (%2)
- %1 (%2)
+ %1 (%2)
diff --git a/src/widgets/capture/capturewidget.cpp b/src/widgets/capture/capturewidget.cpp
index 796bdc55..c12f03b0 100644
--- a/src/widgets/capture/capturewidget.cpp
+++ b/src/widgets/capture/capturewidget.cpp
@@ -393,6 +393,18 @@ void CaptureWidget::xywhTick()
repaint();
}
+void CaptureWidget::onDisplayGridChanged(bool display)
+{
+ m_displayGrid = display;
+ repaint();
+}
+
+void CaptureWidget::onGridSizeChanged(int size)
+{
+ m_gridSize = size;
+ repaint();
+}
+
void CaptureWidget::showxywh(bool show)
{
int timeout =
@@ -605,6 +617,31 @@ void CaptureWidget::paintEvent(QPaintEvent* paintEvent)
xy);
}
+ if (m_displayGrid) {
+ painter.save();
+ QColor uicolor = ConfigHandler().uiColor();
+ uicolor.setAlpha(100);
+ painter.setPen(uicolor);
+ painter.setBrush(QBrush(uicolor));
+
+ auto topLeft = mapToGlobal(m_context.selection.topLeft());
+ topLeft.rx() -= topLeft.x() % m_gridSize;
+ topLeft.ry() -= topLeft.y() % m_gridSize;
+ topLeft = mapFromGlobal(topLeft);
+
+ const auto scale{ m_context.screenshot.devicePixelRatio() };
+ const auto step{ m_gridSize * scale };
+ const auto radius{ 1 * scale };
+
+ for (int y = topLeft.y(); y < m_context.selection.bottom(); y += step) {
+ for (int x = topLeft.x(); x < m_context.selection.right();
+ x += step) {
+ painter.drawEllipse(x, y, radius, radius);
+ }
+ }
+ painter.restore();
+ }
+
if (m_activeTool && m_mouseIsClicked) {
m_activeTool->process(painter, m_context.screenshot);
} else if (m_previewEnabled && activeButtonTool() &&
@@ -671,7 +708,8 @@ bool CaptureWidget::startDrawObjectTool(const QPoint& pos)
&CaptureTool::requestAction,
this,
&CaptureWidget::handleToolSignal);
- m_context.mousePos = pos;
+
+ m_context.mousePos = m_displayGrid ? snapToGrid(pos) : pos;
m_activeTool->drawStart(m_context);
// TODO this is the wrong place to do this
@@ -847,7 +885,8 @@ void CaptureWidget::mouseMoveEvent(QMouseEvent* e)
if (m_adjustmentButtonPressed) {
m_activeTool->drawMoveWithAdjustment(e->pos());
} else {
- m_activeTool->drawMove(e->pos());
+ m_activeTool->drawMove(m_displayGrid ? snapToGrid(e->pos())
+ : e->pos());
}
// update drawing object
updateTool(m_activeTool);
@@ -1126,6 +1165,14 @@ void CaptureWidget::initPanel()
&SidePanelWidget::togglePanel,
m_panel,
&UtilityPanel::toggle);
+ connect(m_sidePanel,
+ &SidePanelWidget::displayGridChanged,
+ this,
+ &CaptureWidget::onDisplayGridChanged);
+ connect(m_sidePanel,
+ &SidePanelWidget::gridSizeChanged,
+ this,
+ &CaptureWidget::onGridSizeChanged);
// TODO replace with a CaptureWidget signal
emit m_sidePanel->colorChanged(m_context.color);
emit toolSizeChanged(m_context.toolSize);
@@ -1721,6 +1768,20 @@ CaptureTool::Type CaptureWidget::activeButtonToolType() const
return activeTool->type();
}
+QPoint CaptureWidget::snapToGrid(const QPoint& point) const
+{
+ QPoint snapPoint = mapToGlobal(point);
+
+ const auto scale{ m_context.screenshot.devicePixelRatio() };
+
+ snapPoint.setX((qRound(snapPoint.x() / double(m_gridSize)) * m_gridSize) *
+ scale);
+ snapPoint.setY((qRound(snapPoint.y() / double(m_gridSize)) * m_gridSize) *
+ scale);
+
+ return mapFromGlobal(snapPoint);
+}
+
QPointer CaptureWidget::activeToolObject()
{
return m_captureToolObjects.at(m_panel->activeLayerIndex());
diff --git a/src/widgets/capture/capturewidget.h b/src/widgets/capture/capturewidget.h
index ece0047c..d728174a 100644
--- a/src/widgets/capture/capturewidget.h
+++ b/src/widgets/capture/capturewidget.h
@@ -87,6 +87,8 @@ private slots:
void onMoveCaptureToolDown(int captureToolIndex);
void selectAll();
void xywhTick();
+ void onDisplayGridChanged(bool display);
+ void onGridSizeChanged(int size);
public:
void removeToolObject(int index = -1);
@@ -147,6 +149,8 @@ private:
CaptureTool* activeButtonTool() const;
CaptureTool::Type activeButtonToolType() const;
+ QPoint snapToGrid(const QPoint& point) const;
+
////////////////////////////////////////
// Class members
@@ -214,4 +218,8 @@ private:
// For start moving after more than X offset
QPoint m_startMovePos;
bool m_startMove;
+
+ // Grid
+ bool m_displayGrid{ false };
+ int m_gridSize{ 10 };
};
diff --git a/src/widgets/panel/sidepanelwidget.cpp b/src/widgets/panel/sidepanelwidget.cpp
index 6764e3cc..2d156a48 100644
--- a/src/widgets/panel/sidepanelwidget.cpp
+++ b/src/widgets/panel/sidepanelwidget.cpp
@@ -8,6 +8,7 @@
#include "src/utils/pathinfo.h"
#include "utilitypanel.h"
#include
+#include
#include
#include
#include
@@ -80,6 +81,18 @@ SidePanelWidget::SidePanelWidget(QPixmap* p, QWidget* parent)
m_layout->addWidget(m_colorWheel);
m_layout->addWidget(m_colorHex);
+ QHBoxLayout* gridHBoxLayout = new QHBoxLayout(this);
+ m_gridCheck = new QCheckBox(tr("Display grid"), this);
+ m_gridSizeSpin = new QSpinBox(this);
+ m_gridSizeSpin->setRange(5, 50);
+ m_gridSizeSpin->setSingleStep(5);
+ m_gridSizeSpin->setValue(10);
+ m_gridSizeSpin->setDisabled(true);
+ m_gridSizeSpin->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+ gridHBoxLayout->addWidget(m_gridCheck);
+ gridHBoxLayout->addWidget(m_gridSizeSpin);
+ m_layout->addLayout(gridHBoxLayout);
+
// tool size sigslots
connect(m_toolSizeSpin,
static_cast(&QSpinBox::valueChanged),
@@ -112,6 +125,15 @@ SidePanelWidget::SidePanelWidget(QPixmap* p, QWidget* parent)
&color_widgets::ColorWheel::colorSelected,
this,
&SidePanelWidget::colorChanged);
+ // Grid feature
+ connect(m_gridCheck, &QCheckBox::clicked, this, [=](bool b) {
+ this->m_gridSizeSpin->setEnabled(b);
+ emit this->displayGridChanged(b);
+ });
+ connect(m_gridSizeSpin,
+ qOverload(&QSpinBox::valueChanged),
+ this,
+ &SidePanelWidget::gridSizeChanged);
}
void SidePanelWidget::onColorChanged(const QColor& color)
diff --git a/src/widgets/panel/sidepanelwidget.h b/src/widgets/panel/sidepanelwidget.h
index 770ad839..198607ae 100644
--- a/src/widgets/panel/sidepanelwidget.h
+++ b/src/widgets/panel/sidepanelwidget.h
@@ -14,6 +14,7 @@ class QLineEdit;
class ColorGrabWidget;
class QColorPickingEventFilter;
class QSlider;
+class QCheckBox;
constexpr int maxToolSize = 50;
constexpr int minSliderWidth = 100;
@@ -31,6 +32,8 @@ signals:
void colorChanged(const QColor& color);
void toolSizeChanged(int size);
void togglePanel();
+ void displayGridChanged(bool display);
+ void gridSizeChanged(int size);
public slots:
void onToolSizeChanged(int tool);
@@ -61,4 +64,6 @@ private:
QSpinBox* m_toolSizeSpin;
QSlider* m_toolSizeSlider;
int m_toolSize{};
+ QCheckBox* m_gridCheck{ nullptr };
+ QSpinBox* m_gridSizeSpin{ nullptr };
};