diff --git a/bbl/i18n/BambuStudio.pot b/bbl/i18n/BambuStudio.pot
index 9853ec7ff9..3b6a7474bc 100644
--- a/bbl/i18n/BambuStudio.pot
+++ b/bbl/i18n/BambuStudio.pot
@@ -6179,6 +6179,19 @@ msgstr ""
msgid "Camera Setting"
msgstr ""
+
+msgid "Camera Full Screen"
+msgstr ""
+
+msgid "Enter Camera Full Screen"
+msgstr ""
+
+msgid "Exit Camera Full Screen"
+msgstr ""
+
+msgid "Show the Device camera in full screen"
+msgstr ""
+
msgid "Control"
msgstr ""
@@ -8060,6 +8073,13 @@ msgstr ""
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr ""
+
+msgid "Open full screen camera view on active monitor only."
+msgstr ""
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr ""
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr ""
@@ -16606,143 +16626,143 @@ msgstr ""
msgid "Remove the third material"
msgstr ""
-
-#: resources/data/hints.ini: [hint:How to use keyboard shortcuts]
-msgid "How to use keyboard shortcuts\nDid you know that Bambu Studio offers a wide range of keyboard shortcuts and 3D scene operations."
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Cut Tool]
-msgid "Cut Tool\nDid you know that you can cut a model at any angle and position with the cutting tool?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Fix Model]
-msgid "Fix Model\nDid you know that you can fix a corrupted 3D model to avoid a lot of slicing problems on the Windows system?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Timelapse]
-msgid "Timelapse\nDid you know that you can generate a timelapse video during each print?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Auto-Arrange]
-msgid "Auto-Arrange\nDid you know that you can auto-arrange all objects in your project?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Auto-Orient]
-msgid "Auto-Orient\nDid you know that you can rotate objects to an optimal orientation for printing by a simple click?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Lay on Face]
-msgid "Lay on Face\nDid you know that you can quickly orient a model so that one of its faces sits on the print bed? Select the \"Place on face\" function or press the F key."
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Object List]
-msgid "Object List\nDid you know that you can view all objects/parts in a list and change settings for each object/part?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Simplify Model]
-msgid "Simplify Model\nDid you know that you can reduce the number of triangles in a mesh using the Simplify mesh feature? Right-click the model and select Simplify model. Read more in the documentation."
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Slicing Parameter Table]
-msgid "Slicing Parameter Table\nDid you know that you can view all objects/parts on a table and change settings for each object/part?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Split to Objects/Parts]
-msgid "Split to Objects/Parts\nDid you know that you can split a big object into small ones for easy colorizing or printing?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Subtract a Part]
-msgid "Subtract a Part\nDid you know that you can subtract one mesh from another using the Negative part modifier? That way you can, for example, create easily resizable holes directly in Bambu Studio. Read more in the documentation."
-msgstr ""
-
-#: resources/data/hints.ini: [hint:STEP]
-msgid "STEP\nDid you know that you can improve your print quality by slicing a STEP file instead of an STL?\nBambu Studio supports slicing STEP files, providing smoother results than a lower resolution STL. Give it a try!"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Z seam location]
-msgid "Z seam location\nDid you know that you can customize the location of the Z seam, and even paint it on your print, to have it in a less visible location? This improves the overall look of your model. Check it out!"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Fine-tuning for flow rate]
-msgid "Fine-tuning for flow rate\nDid you know that flow rate can be fine-tuned for even better-looking prints? Depending on the material, you can improve the overall finish of the printed model by doing some fine-tuning."
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Split your prints into plates]
-msgid "Split your prints into plates\nDid you know that you can split a model that has a lot of parts into individual plates ready to print? This will simplify the process of keeping track of all the parts."
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer Height]
-msgid "Speed up your print with Adaptive Layer Height\nDid you know that you can print a model even faster, by using the Adaptive Layer Height option? Check it out!"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Support painting]
-msgid "Support painting\nDid you know that you can paint the location of your supports? This feature makes it easy to place the support material only on the sections of the model that actually need it."
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Different types of supports]
-msgid "Different types of supports\nDid you know that you can choose from multiple types of supports? Tree supports work great for organic models, while saving filament and improving print speed. Check them out!"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Printing Silk Filament]
-msgid "Printing Silk Filament\nDid you know that Silk filament needs special consideration to print it successfully? Higher temperature and lower speed are always recommended for the best results."
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Brim for better adhesion]
-msgid "Brim for better adhesion\nDid you know that when printing models have a small contact interface with the printing surface, it's recommended to use a brim?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Set parameters for multiple objects]
-msgid "Set parameters for multiple objects\nDid you know that you can set slicing parameters for all selected objects at one time?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Stack objects]
-msgid "Stack objects\nDid you know that you can stack objects as a whole one?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Flush into support/objects/infill]
-msgid "Flush into support/objects/infill\nDid you know that you can save the wasted filament by flushing them into support/objects/infill during filament change?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Improve strength]
-msgid "Improve strength\nDid you know that you can use more wall loops and higher sparse infill density to improve the strength of the model?"
-msgstr ""
-
-#: resources/data/hints.ini: [hint:When need to print with the printer door opened]
-msgid "When need to print with the printer door opened\nDid you know that opening the printer door can reduce the probability of extruder/hotend clogging when printing lower temperature filament with a higher enclosure temperature. More info about this in the Wiki."
-msgstr ""
-
-#: resources/data/hints.ini: [hint:Avoid warping]
-msgid "Avoid warping\nDid you know that when printing materials that are prone to warping such as ABS, appropriately increasing the heatbed temperature can reduce the probability of warping."
-msgstr ""
-
-#: resources/data/helio_hints.ini: [hint: Run Nylon & PC (and other advanced materials) Like a Pro]
-msgid "Run Nylon & PC (and other advanced materials) Like a Pro\nPrinting Nylon 612 or Polycarbonate or other advanced materials? Helio helps you avoid the 'almost worked' failure."
-msgstr ""
-
-#: resources/data/helio_hints.ini: [hint: Make Prints up to 30% Faster (Safely)]
-msgid "Make Prints up to 30% Faster (Safely)\nGet real throughput, not risky 'speed mode'. A print that normally takes 8 hours might drop to ~5.6 hours."
-msgstr ""
-
-#: resources/data/helio_hints.ini: [hint: Stop Wasting Precious Design Time on Tuning]
-msgid "Stop Wasting Precious Design Time on Tuning\nFewer trial prints, faster dial-in. Instead of multiple test prints, detect issues and print first time right."
-msgstr ""
-
-#: resources/data/helio_hints.ini: [hint: Cut Warping on ASA/ABS and other advanced materials]
-msgid "Cut Warping on ASA/ABS and other advanced materials\nWarping ruins long jobs. Helio shows where risk is highest before you print, and, with enhance, cuts the risk of warping to almost nil."
-msgstr ""
-
-#: resources/data/helio_hints.ini: [hint: Quality Check Before You Hit Print]
-msgid "Quality Check Before You Hit Print\nThink of it like a pre-flight check. Example: if a PC bracket shows low TQI in thin ribs, you'll know to adjust before committing to an overnight run."
-msgstr ""
-
-#: resources/data/helio_hints.ini: [hint: Stronger Parts With One Click]
-msgid "Stronger Parts With One Click\nBetter bonding, fewer brittle failures. Example: for Polycarbonate, results show ~+65% tensile strength after optimization."
-msgstr ""
-
-#: resources/data/helio_hints.ini: [hint: Save Money Every Run]
-msgid "Save Money Every Run\nFaster + fewer failures = real savings."
-msgstr ""
-
-#: resources/data/helio_hints.ini: [hint: First-Time-Right Reliability]
-msgid "First-Time-Right Reliability\nLess babysitting, more predictable output. Example: a small farm running PETG parts avoids 'fail at hour 6' surprises and keeps batches on schedule."
-msgstr ""
+
+#: resources/data/hints.ini: [hint:How to use keyboard shortcuts]
+msgid "How to use keyboard shortcuts\nDid you know that Bambu Studio offers a wide range of keyboard shortcuts and 3D scene operations."
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Cut Tool]
+msgid "Cut Tool\nDid you know that you can cut a model at any angle and position with the cutting tool?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Fix Model]
+msgid "Fix Model\nDid you know that you can fix a corrupted 3D model to avoid a lot of slicing problems on the Windows system?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Timelapse]
+msgid "Timelapse\nDid you know that you can generate a timelapse video during each print?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Auto-Arrange]
+msgid "Auto-Arrange\nDid you know that you can auto-arrange all objects in your project?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Auto-Orient]
+msgid "Auto-Orient\nDid you know that you can rotate objects to an optimal orientation for printing by a simple click?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Lay on Face]
+msgid "Lay on Face\nDid you know that you can quickly orient a model so that one of its faces sits on the print bed? Select the \"Place on face\" function or press the F key."
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Object List]
+msgid "Object List\nDid you know that you can view all objects/parts in a list and change settings for each object/part?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Simplify Model]
+msgid "Simplify Model\nDid you know that you can reduce the number of triangles in a mesh using the Simplify mesh feature? Right-click the model and select Simplify model. Read more in the documentation."
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Slicing Parameter Table]
+msgid "Slicing Parameter Table\nDid you know that you can view all objects/parts on a table and change settings for each object/part?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Split to Objects/Parts]
+msgid "Split to Objects/Parts\nDid you know that you can split a big object into small ones for easy colorizing or printing?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Subtract a Part]
+msgid "Subtract a Part\nDid you know that you can subtract one mesh from another using the Negative part modifier? That way you can, for example, create easily resizable holes directly in Bambu Studio. Read more in the documentation."
+msgstr ""
+
+#: resources/data/hints.ini: [hint:STEP]
+msgid "STEP\nDid you know that you can improve your print quality by slicing a STEP file instead of an STL?\nBambu Studio supports slicing STEP files, providing smoother results than a lower resolution STL. Give it a try!"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Z seam location]
+msgid "Z seam location\nDid you know that you can customize the location of the Z seam, and even paint it on your print, to have it in a less visible location? This improves the overall look of your model. Check it out!"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Fine-tuning for flow rate]
+msgid "Fine-tuning for flow rate\nDid you know that flow rate can be fine-tuned for even better-looking prints? Depending on the material, you can improve the overall finish of the printed model by doing some fine-tuning."
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Split your prints into plates]
+msgid "Split your prints into plates\nDid you know that you can split a model that has a lot of parts into individual plates ready to print? This will simplify the process of keeping track of all the parts."
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Speed up your print with Adaptive Layer Height]
+msgid "Speed up your print with Adaptive Layer Height\nDid you know that you can print a model even faster, by using the Adaptive Layer Height option? Check it out!"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Support painting]
+msgid "Support painting\nDid you know that you can paint the location of your supports? This feature makes it easy to place the support material only on the sections of the model that actually need it."
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Different types of supports]
+msgid "Different types of supports\nDid you know that you can choose from multiple types of supports? Tree supports work great for organic models, while saving filament and improving print speed. Check them out!"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Printing Silk Filament]
+msgid "Printing Silk Filament\nDid you know that Silk filament needs special consideration to print it successfully? Higher temperature and lower speed are always recommended for the best results."
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Brim for better adhesion]
+msgid "Brim for better adhesion\nDid you know that when printing models have a small contact interface with the printing surface, it's recommended to use a brim?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Set parameters for multiple objects]
+msgid "Set parameters for multiple objects\nDid you know that you can set slicing parameters for all selected objects at one time?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Stack objects]
+msgid "Stack objects\nDid you know that you can stack objects as a whole one?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Flush into support/objects/infill]
+msgid "Flush into support/objects/infill\nDid you know that you can save the wasted filament by flushing them into support/objects/infill during filament change?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Improve strength]
+msgid "Improve strength\nDid you know that you can use more wall loops and higher sparse infill density to improve the strength of the model?"
+msgstr ""
+
+#: resources/data/hints.ini: [hint:When need to print with the printer door opened]
+msgid "When need to print with the printer door opened\nDid you know that opening the printer door can reduce the probability of extruder/hotend clogging when printing lower temperature filament with a higher enclosure temperature. More info about this in the Wiki."
+msgstr ""
+
+#: resources/data/hints.ini: [hint:Avoid warping]
+msgid "Avoid warping\nDid you know that when printing materials that are prone to warping such as ABS, appropriately increasing the heatbed temperature can reduce the probability of warping."
+msgstr ""
+
+#: resources/data/helio_hints.ini: [hint: Run Nylon & PC (and other advanced materials) Like a Pro]
+msgid "Run Nylon & PC (and other advanced materials) Like a Pro\nPrinting Nylon 612 or Polycarbonate or other advanced materials? Helio helps you avoid the 'almost worked' failure."
+msgstr ""
+
+#: resources/data/helio_hints.ini: [hint: Make Prints up to 30% Faster (Safely)]
+msgid "Make Prints up to 30% Faster (Safely)\nGet real throughput, not risky 'speed mode'. A print that normally takes 8 hours might drop to ~5.6 hours."
+msgstr ""
+
+#: resources/data/helio_hints.ini: [hint: Stop Wasting Precious Design Time on Tuning]
+msgid "Stop Wasting Precious Design Time on Tuning\nFewer trial prints, faster dial-in. Instead of multiple test prints, detect issues and print first time right."
+msgstr ""
+
+#: resources/data/helio_hints.ini: [hint: Cut Warping on ASA/ABS and other advanced materials]
+msgid "Cut Warping on ASA/ABS and other advanced materials\nWarping ruins long jobs. Helio shows where risk is highest before you print, and, with enhance, cuts the risk of warping to almost nil."
+msgstr ""
+
+#: resources/data/helio_hints.ini: [hint: Quality Check Before You Hit Print]
+msgid "Quality Check Before You Hit Print\nThink of it like a pre-flight check. Example: if a PC bracket shows low TQI in thin ribs, you'll know to adjust before committing to an overnight run."
+msgstr ""
+
+#: resources/data/helio_hints.ini: [hint: Stronger Parts With One Click]
+msgid "Stronger Parts With One Click\nBetter bonding, fewer brittle failures. Example: for Polycarbonate, results show ~+65% tensile strength after optimization."
+msgstr ""
+
+#: resources/data/helio_hints.ini: [hint: Save Money Every Run]
+msgid "Save Money Every Run\nFaster + fewer failures = real savings."
+msgstr ""
+
+#: resources/data/helio_hints.ini: [hint: First-Time-Right Reliability]
+msgid "First-Time-Right Reliability\nLess babysitting, more predictable output. Example: a small farm running PETG parts avoids 'fail at hour 6' surprises and keeps batches on schedule."
+msgstr ""
diff --git a/bbl/i18n/cs/BambuStudio_cs.po b/bbl/i18n/cs/BambuStudio_cs.po
index c4381010b3..a0f9267bd5 100644
--- a/bbl/i18n/cs/BambuStudio_cs.po
+++ b/bbl/i18n/cs/BambuStudio_cs.po
@@ -6313,6 +6313,19 @@ msgstr "Úložiště"
msgid "Camera Setting"
msgstr "Nastavení kamery"
+
+msgid "Camera Full Screen"
+msgstr "Kamera na celou obrazovku"
+
+msgid "Enter Camera Full Screen"
+msgstr "Přejít na kameru na celou obrazovku"
+
+msgid "Exit Camera Full Screen"
+msgstr "Ukončit kameru na celou obrazovku"
+
+msgid "Show the Device camera in full screen"
+msgstr "Zobrazit kameru zařízení na celou obrazovku"
+
msgid "Control"
msgstr "Ovládání"
@@ -8241,6 +8254,13 @@ msgstr "Odstranit omezení smíšeného tisku filamentů s vysokou a nízkou tep
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Pokud je tato volba povolena, můžete tisknout materiály s velkým rozdílem teplot současně."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Otevřít zobrazení kamery na celou obrazovku pouze na aktivním monitoru."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Je-li povoleno, zobrazení kamery na celou obrazovku se otevře pouze na monitoru, na kterém se nachází Bambu Studio."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Vymazat mou volbu pro synchronizaci přednastavení tiskárny po načtení souboru."
diff --git a/bbl/i18n/de/BambuStudio_de.po b/bbl/i18n/de/BambuStudio_de.po
index d912752f1f..582ee87ef0 100644
--- a/bbl/i18n/de/BambuStudio_de.po
+++ b/bbl/i18n/de/BambuStudio_de.po
@@ -6329,6 +6329,19 @@ msgstr "Speicher"
msgid "Camera Setting"
msgstr "Kameraeinstellung"
+
+msgid "Camera Full Screen"
+msgstr "Kamera im Vollbildmodus"
+
+msgid "Enter Camera Full Screen"
+msgstr "Kamera im Vollbildmodus öffnen"
+
+msgid "Exit Camera Full Screen"
+msgstr "Kamera-Vollbildmodus beenden"
+
+msgid "Show the Device camera in full screen"
+msgstr "Gerätekamera im Vollbildmodus anzeigen"
+
msgid "Control"
msgstr "Steuerung"
@@ -8287,6 +8300,13 @@ msgstr "Die Beschränkung für das Mischen von Filamenten mit hoher und niedrige
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Wenn diese Option aktiviert ist, können Sie Materialien mit einem großen Temperaturunterschied zusammen drucken."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Kamera-Vollbildansicht nur auf dem aktiven Monitor öffnen."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Wenn aktiviert, wird die Kamera-Vollbildansicht nur auf dem Monitor geöffnet, auf dem sich Bambu Studio befindet."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Meine Auswahl für die Synchronisierung des Druckerprofils nach dem Laden der Datei löschen."
diff --git a/bbl/i18n/en/BambuStudio_en.po b/bbl/i18n/en/BambuStudio_en.po
index 82f004ca97..154818cbfa 100644
--- a/bbl/i18n/en/BambuStudio_en.po
+++ b/bbl/i18n/en/BambuStudio_en.po
@@ -6271,6 +6271,19 @@ msgstr ""
msgid "Camera Setting"
msgstr "Camera Setting"
+
+msgid "Camera Full Screen"
+msgstr "Camera Full Screen"
+
+msgid "Enter Camera Full Screen"
+msgstr "Enter Camera Full Screen"
+
+msgid "Exit Camera Full Screen"
+msgstr "Exit Camera Full Screen"
+
+msgid "Show the Device camera in full screen"
+msgstr "Show the Device camera in full screen"
+
msgid "Control"
msgstr "Control"
@@ -8184,6 +8197,13 @@ msgstr ""
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr ""
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Open full screen camera view on active monitor only."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr ""
diff --git a/bbl/i18n/es/BambuStudio_es.po b/bbl/i18n/es/BambuStudio_es.po
index 0221563145..5a0811b96d 100644
--- a/bbl/i18n/es/BambuStudio_es.po
+++ b/bbl/i18n/es/BambuStudio_es.po
@@ -6327,6 +6327,19 @@ msgstr "Almacenamiento"
msgid "Camera Setting"
msgstr "Configuración de cámara"
+
+msgid "Camera Full Screen"
+msgstr "Cámara a pantalla completa"
+
+msgid "Enter Camera Full Screen"
+msgstr "Entrar en pantalla completa de cámara"
+
+msgid "Exit Camera Full Screen"
+msgstr "Salir de pantalla completa de cámara"
+
+msgid "Show the Device camera in full screen"
+msgstr "Mostrar la cámara del dispositivo en pantalla completa"
+
msgid "Control"
msgstr "Control"
@@ -8286,6 +8299,13 @@ msgstr "Elimine la restricción de la impresión mixta de filamentos de alta y b
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Con esta opción habilitada, puede imprimir juntos materiales con una gran diferencia de temperatura."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Abrir la vista de cámara a pantalla completa solo en el monitor activo."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Cuando está activado, la vista de cámara a pantalla completa se abre solo en el monitor que contiene Bambu Studio."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Desactive mi elección para sincronizar los ajustes preestablecidos de la impresora después de cargar el archivo."
diff --git a/bbl/i18n/fr/BambuStudio_fr.po b/bbl/i18n/fr/BambuStudio_fr.po
index f06498e196..f9e98073e4 100644
--- a/bbl/i18n/fr/BambuStudio_fr.po
+++ b/bbl/i18n/fr/BambuStudio_fr.po
@@ -6316,6 +6316,19 @@ msgstr "Stockage"
msgid "Camera Setting"
msgstr "Réglage de la Caméra"
+
+msgid "Camera Full Screen"
+msgstr "Caméra en plein écran"
+
+msgid "Enter Camera Full Screen"
+msgstr "Afficher la caméra en plein écran"
+
+msgid "Exit Camera Full Screen"
+msgstr "Quitter le plein écran de la caméra"
+
+msgid "Show the Device camera in full screen"
+msgstr "Afficher la caméra de l'appareil en plein écran"
+
msgid "Control"
msgstr "Contrôle"
@@ -8267,6 +8280,13 @@ msgstr "Supprimer la restriction sur l'impression mixte de filaments à haute et
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Si cette option est activée, vous pouvez imprimer ensemble des matériaux présentant une grande différence de température."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Ouvrir la vue caméra en plein écran uniquement sur le moniteur actif."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Lorsque cette option est activée, la vue caméra en plein écran s'ouvre uniquement sur le moniteur où se trouve Bambu Studio."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Effacer mon choix pour la synchronisation des configurations de l'imprimante après le chargement du fichier."
diff --git a/bbl/i18n/hu/BambuStudio_hu.po b/bbl/i18n/hu/BambuStudio_hu.po
index 10bee7e0bd..2aa3422a5f 100644
--- a/bbl/i18n/hu/BambuStudio_hu.po
+++ b/bbl/i18n/hu/BambuStudio_hu.po
@@ -6327,6 +6327,19 @@ msgstr "Tárhely"
msgid "Camera Setting"
msgstr "Kamera beállítása"
+
+msgid "Camera Full Screen"
+msgstr "Kamera teljes képernyőn"
+
+msgid "Enter Camera Full Screen"
+msgstr "Kamera teljes képernyőre váltása"
+
+msgid "Exit Camera Full Screen"
+msgstr "Kilépés a kamera teljes képernyős nézetéből"
+
+msgid "Show the Device camera in full screen"
+msgstr "Az eszköz kamerájának megjelenítése teljes képernyőn"
+
msgid "Control"
msgstr "Vezérlés"
@@ -8281,6 +8294,13 @@ msgstr "Megszünteti a magas és alacsony hőmérsékletű filamentek vegyes nyo
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Ha ez az opció be van kapcsolva, akkor nagy hőmérsékletkülönbségű anyagokat is nyomtathatsz egyszerre."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "A teljes képernyős kameranézet megnyitása csak az aktív monitoron."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Ha engedélyezve van, a teljes képernyős kameranézet csak azon a monitoron nyílik meg, amelyen a Bambu Studio található."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Törölje a nyomtatóbeállítás szinkronizálására vonatkozó választásomat a fájl betöltése után."
diff --git a/bbl/i18n/it/BambuStudio_it.po b/bbl/i18n/it/BambuStudio_it.po
index f250bc726d..51ddd67738 100644
--- a/bbl/i18n/it/BambuStudio_it.po
+++ b/bbl/i18n/it/BambuStudio_it.po
@@ -6326,6 +6326,19 @@ msgstr "Archiviazione"
msgid "Camera Setting"
msgstr "Impostazioni camera"
+
+msgid "Camera Full Screen"
+msgstr "Camera a schermo intero"
+
+msgid "Enter Camera Full Screen"
+msgstr "Apri camera a schermo intero"
+
+msgid "Exit Camera Full Screen"
+msgstr "Esci dalla camera a schermo intero"
+
+msgid "Show the Device camera in full screen"
+msgstr "Mostra la camera del dispositivo a schermo intero"
+
msgid "Control"
msgstr "Controllo"
@@ -8281,6 +8294,13 @@ msgstr "Rimuovi la restrizione sulla stampa mista di filamenti ad alta e bassa t
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Con questa opzione abilitata, puoi stampare materiali con una grande differenza di temperatura insieme."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Apri la vista camera a schermo intero solo sul monitor attivo."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Se abilitata, la vista camera a schermo intero si apre solo sul monitor che contiene Bambu Studio."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Annulla la mia scelta per la sincronizzazione del preset della stampante dopo il caricamento del file."
diff --git a/bbl/i18n/ja/BambuStudio_ja.po b/bbl/i18n/ja/BambuStudio_ja.po
index 0248d0e3fb..8a4a8e16fa 100644
--- a/bbl/i18n/ja/BambuStudio_ja.po
+++ b/bbl/i18n/ja/BambuStudio_ja.po
@@ -6291,6 +6291,19 @@ msgstr "ストレージ"
msgid "Camera Setting"
msgstr "カメラ設定"
+
+msgid "Camera Full Screen"
+msgstr "カメラ全画面"
+
+msgid "Enter Camera Full Screen"
+msgstr "カメラを全画面表示"
+
+msgid "Exit Camera Full Screen"
+msgstr "カメラの全画面表示を終了"
+
+msgid "Show the Device camera in full screen"
+msgstr "デバイスのカメラを全画面で表示"
+
msgid "Control"
msgstr "コントロール"
@@ -8233,6 +8246,13 @@ msgstr "高温フィラメントと低温フィラメントの混合印刷の制
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "このオプションを有効にすると、温度差の大きい材料を一緒に印刷することができます。"
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "全画面カメラ表示をアクティブなモニターのみに開く。"
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "有効にすると、全画面カメラ表示はBambu Studioがあるモニターのみに開きます。"
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "ファイルを読み込んだ後にプリンタプリセットの同期を選択解除します。"
diff --git a/bbl/i18n/ko/BambuStudio_ko.po b/bbl/i18n/ko/BambuStudio_ko.po
index 860a503f3e..75b4de4bc5 100644
--- a/bbl/i18n/ko/BambuStudio_ko.po
+++ b/bbl/i18n/ko/BambuStudio_ko.po
@@ -6319,6 +6319,19 @@ msgstr "저장고"
msgid "Camera Setting"
msgstr "카메라 설정"
+
+msgid "Camera Full Screen"
+msgstr "카메라 전체 화면"
+
+msgid "Enter Camera Full Screen"
+msgstr "카메라 전체 화면 시작"
+
+msgid "Exit Camera Full Screen"
+msgstr "카메라 전체 화면 종료"
+
+msgid "Show the Device camera in full screen"
+msgstr "장치 카메라를 전체 화면으로 표시"
+
msgid "Control"
msgstr "컨트롤"
@@ -8274,6 +8287,13 @@ msgstr "고온 및 저온 필라멘트 혼합 출력에 대한 제한을 제거
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "이 옵션을 활성화하면 온도 차이가 큰 재료를 함께 출력할 수 있습니다."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "전체 화면 카메라 보기를 활성 모니터에만 엽니다."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "활성화하면 카메라 전체 화면 보기가 Bambu Studio가 있는 모니터에만 열립니다."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "파일을 로드한 후 프린터 사전 설정 동기화를 선택 취소합니다."
diff --git a/bbl/i18n/nl/BambuStudio_nl.po b/bbl/i18n/nl/BambuStudio_nl.po
index d41aec07f1..dc3d7e3358 100644
--- a/bbl/i18n/nl/BambuStudio_nl.po
+++ b/bbl/i18n/nl/BambuStudio_nl.po
@@ -6327,6 +6327,19 @@ msgstr "Opslag"
msgid "Camera Setting"
msgstr "Camera-instelling"
+
+msgid "Camera Full Screen"
+msgstr "Camera op volledig scherm"
+
+msgid "Enter Camera Full Screen"
+msgstr "Camera op volledig scherm openen"
+
+msgid "Exit Camera Full Screen"
+msgstr "Volledig scherm van camera sluiten"
+
+msgid "Show the Device camera in full screen"
+msgstr "De apparaatcamera op volledig scherm weergeven"
+
msgid "Control"
msgstr "Besturing"
@@ -8284,6 +8297,13 @@ msgstr "De beperking op gemengd printen van hoge- en lagetemperatuurfilamenten o
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Met deze optie ingeschakeld kun je materialen met een groot temperatuurverschil samen afdrukken."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Open de cameraweergave op volledig scherm alleen op de actieve monitor."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Indien ingeschakeld wordt de cameraweergave op volledig scherm alleen geopend op de monitor waarop Bambu Studio staat."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Wis mijn keuze voor het synchroniseren van printervoorinstellingen na het laden van het bestand."
diff --git a/bbl/i18n/pl/BambuStudio_pl.po b/bbl/i18n/pl/BambuStudio_pl.po
index 4996dfde8c..ea112babca 100644
--- a/bbl/i18n/pl/BambuStudio_pl.po
+++ b/bbl/i18n/pl/BambuStudio_pl.po
@@ -6334,6 +6334,19 @@ msgstr "Pamięć"
msgid "Camera Setting"
msgstr "Ustawienia kamery"
+
+msgid "Camera Full Screen"
+msgstr "Pełny ekran kamery"
+
+msgid "Enter Camera Full Screen"
+msgstr "Otwórz kamerę w trybie pełnoekranowym"
+
+msgid "Exit Camera Full Screen"
+msgstr "Zamknij tryb pełnoekranowy kamery"
+
+msgid "Show the Device camera in full screen"
+msgstr "Pokaż kamerę urządzenia w trybie pełnoekranowym"
+
msgid "Control"
msgstr "Sterowanie"
@@ -8293,6 +8306,13 @@ msgstr "Usuń ograniczenie dotyczące mieszanego druku filamentami wysoko- i nis
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Włączając tę opcję, możesz jednocześnie drukować materiały o dużych różnicach temperatury pracy."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Otwieraj pełnoekranowy widok kamery tylko na aktywnym monitorze."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Po włączeniu pełnoekranowy widok kamery otwiera się tylko na monitorze, na którym znajduje się Bambu Studio."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Wyłącz synchronizację profilu drukarki po załadowaniu pliku."
diff --git a/bbl/i18n/pt_BR/BambuStudio_pt_BR.po b/bbl/i18n/pt_BR/BambuStudio_pt_BR.po
index 8f60bea37a..a1782001d7 100644
--- a/bbl/i18n/pt_BR/BambuStudio_pt_BR.po
+++ b/bbl/i18n/pt_BR/BambuStudio_pt_BR.po
@@ -6330,6 +6330,19 @@ msgstr "Armazenamento"
msgid "Camera Setting"
msgstr "Configuração da câmera"
+
+msgid "Camera Full Screen"
+msgstr "Câmera em tela cheia"
+
+msgid "Enter Camera Full Screen"
+msgstr "Abrir câmera em tela cheia"
+
+msgid "Exit Camera Full Screen"
+msgstr "Sair da câmera em tela cheia"
+
+msgid "Show the Device camera in full screen"
+msgstr "Mostrar a câmera do dispositivo em tela cheia"
+
msgid "Control"
msgstr "Controle"
@@ -8287,6 +8300,13 @@ msgstr "Remova a restrição à impressão mista de filamentos de alta e baixa t
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Com esta opção ativada, você pode imprimir materiais com uma grande diferença de temperatura juntos."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Abrir a visualização da câmera em tela cheia apenas no monitor ativo."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Quando ativado, a visualização da câmera em tela cheia abre apenas no monitor que contém o Bambu Studio."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Desmarque minha escolha para sincronizar predefinições da impressora após carregar o arquivo."
diff --git a/bbl/i18n/ru/BambuStudio_ru.po b/bbl/i18n/ru/BambuStudio_ru.po
index 8c29e113d3..54948c367b 100644
--- a/bbl/i18n/ru/BambuStudio_ru.po
+++ b/bbl/i18n/ru/BambuStudio_ru.po
@@ -6419,6 +6419,19 @@ msgstr "Хранилище"
msgid "Camera Setting"
msgstr "Настройки камеры"
+
+msgid "Camera Full Screen"
+msgstr "Камера в полноэкранном режиме"
+
+msgid "Enter Camera Full Screen"
+msgstr "Открыть камеру в полноэкранном режиме"
+
+msgid "Exit Camera Full Screen"
+msgstr "Выйти из полноэкранного режима камеры"
+
+msgid "Show the Device camera in full screen"
+msgstr "Показать камеру устройства в полноэкранном режиме"
+
msgid "Control"
msgstr "Управление"
@@ -8390,6 +8403,13 @@ msgstr "Снять ограничение на смешанную печать
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Если включено, вы можете одновременно печатать материалами с большой разницей температур."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Открывать полноэкранный вид камеры только на активном мониторе."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Если включено, полноэкранный вид камеры открывается только на мониторе, на котором находится Bambu Studio."
+
# ????? Сбросить текущий выбор...
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr ""
diff --git a/bbl/i18n/sv/BambuStudio_sv.po b/bbl/i18n/sv/BambuStudio_sv.po
index 0b7cd7791d..28e76968bc 100644
--- a/bbl/i18n/sv/BambuStudio_sv.po
+++ b/bbl/i18n/sv/BambuStudio_sv.po
@@ -6324,6 +6324,19 @@ msgstr "Lagring"
msgid "Camera Setting"
msgstr "Kamerainställning"
+
+msgid "Camera Full Screen"
+msgstr "Kamera i helskärmsläge"
+
+msgid "Enter Camera Full Screen"
+msgstr "Öppna kamera i helskärmsläge"
+
+msgid "Exit Camera Full Screen"
+msgstr "Stäng kamerans helskärmsläge"
+
+msgid "Show the Device camera in full screen"
+msgstr "Visa enhetens kamera i helskärmsläge"
+
msgid "Control"
msgstr "Kontroll"
@@ -8279,6 +8292,13 @@ msgstr "Ta bort begränsningen för blandad utskrift av filament med hög och l
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Med detta alternativet aktiverat kan du skriva ut material med stor temperaturskillnad tillsammans."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Öppna kameravyn i helskärm endast på den aktiva skärmen."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "När detta är aktiverat öppnas kamerans helskärmsvy endast på skärmen där Bambu Studio finns."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Rensa mitt val för synkronisering av printerns inställning efter laddning av filen."
diff --git a/bbl/i18n/tr/BambuStudio_tr.po b/bbl/i18n/tr/BambuStudio_tr.po
index 09371bd484..542dc9bcee 100644
--- a/bbl/i18n/tr/BambuStudio_tr.po
+++ b/bbl/i18n/tr/BambuStudio_tr.po
@@ -6312,6 +6312,19 @@ msgstr "Depolama"
msgid "Camera Setting"
msgstr "Kamera Ayarı"
+
+msgid "Camera Full Screen"
+msgstr "Kamera tam ekran"
+
+msgid "Enter Camera Full Screen"
+msgstr "Kamerayı tam ekranda aç"
+
+msgid "Exit Camera Full Screen"
+msgstr "Kamera tam ekrandan çık"
+
+msgid "Show the Device camera in full screen"
+msgstr "Cihaz kamerasını tam ekranda göster"
+
msgid "Control"
msgstr "Kontrol"
@@ -8243,6 +8256,13 @@ msgstr "Yüksek ve düşük sıcaklıktaki filamentlerin karışık baskısı ü
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "Bu seçenek etkinleştirildiğinde, büyük sıcaklık farkına sahip malzemeleri birlikte yazdırabilirsiniz."
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Tam ekran kamera görünümünü yalnızca etkin monitörde aç."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Etkinleştirildiğinde, tam ekran kamera görünümü yalnızca Bambu Studio'nun bulunduğu monitörde açılır."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "Dosyayı yükledikten sonra yazıcı ön ayarını senkronize etmek için seçimimi temizleyin."
diff --git a/bbl/i18n/uk/BambuStudio_uk.po b/bbl/i18n/uk/BambuStudio_uk.po
index ea71082990..421af3a06a 100644
--- a/bbl/i18n/uk/BambuStudio_uk.po
+++ b/bbl/i18n/uk/BambuStudio_uk.po
@@ -6297,6 +6297,19 @@ msgstr ""
msgid "Camera Setting"
msgstr "Налаштування камери"
+
+msgid "Camera Full Screen"
+msgstr "Камера на весь екран"
+
+msgid "Enter Camera Full Screen"
+msgstr "Відкрити камеру на весь екран"
+
+msgid "Exit Camera Full Screen"
+msgstr "Вийти з повноекранного режиму камери"
+
+msgid "Show the Device camera in full screen"
+msgstr "Показати камеру пристрою на весь екран"
+
msgid "Control"
msgstr "Контроль"
@@ -8217,6 +8230,13 @@ msgstr "Прибрати обмеження на одночасний друк
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr ""
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "Відкривати повноекранний вигляд камери лише на активному моніторі."
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "Якщо ввімкнено, повноекранний вигляд камери відкривається лише на моніторі, на якому розташовано Bambu Studio."
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr ""
diff --git a/bbl/i18n/zh_CN/BambuStudio_zh_CN.po b/bbl/i18n/zh_CN/BambuStudio_zh_CN.po
index d70793e74a..cf5c66bbf9 100644
--- a/bbl/i18n/zh_CN/BambuStudio_zh_CN.po
+++ b/bbl/i18n/zh_CN/BambuStudio_zh_CN.po
@@ -6286,6 +6286,19 @@ msgstr "存储介质"
msgid "Camera Setting"
msgstr "相机设置"
+
+msgid "Camera Full Screen"
+msgstr "摄像机全屏"
+
+msgid "Enter Camera Full Screen"
+msgstr "进入摄像机全屏"
+
+msgid "Exit Camera Full Screen"
+msgstr "退出摄像机全屏"
+
+msgid "Show the Device camera in full screen"
+msgstr "全屏显示设备摄像机"
+
msgid "Control"
msgstr "控制"
@@ -8230,6 +8243,13 @@ msgstr "取消高低温材料混合打印的限制。"
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "启用此选项后,您可以同时打印具有较大温度差异的材料。"
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "仅在活动显示器上打开摄像机全屏视图。"
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "启用后,摄像机全屏视图仅会在 Bambu Studio 所在的显示器上打开。"
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "清除加载文件后同步打印机预设的设置。"
diff --git a/bbl/i18n/zh_TW/BambuStudio_zh_TW.po b/bbl/i18n/zh_TW/BambuStudio_zh_TW.po
index b1a6eac46b..6b70f653a8 100644
--- a/bbl/i18n/zh_TW/BambuStudio_zh_TW.po
+++ b/bbl/i18n/zh_TW/BambuStudio_zh_TW.po
@@ -6280,6 +6280,19 @@ msgstr "儲存介質"
msgid "Camera Setting"
msgstr "相機設定"
+
+msgid "Camera Full Screen"
+msgstr "攝像機全螢幕"
+
+msgid "Enter Camera Full Screen"
+msgstr "進入攝像機全螢幕"
+
+msgid "Exit Camera Full Screen"
+msgstr "退出攝像機全螢幕"
+
+msgid "Show the Device camera in full screen"
+msgstr "全螢幕顯示裝置攝像機"
+
msgid "Control"
msgstr "控制"
@@ -8215,6 +8228,13 @@ msgstr "取消高低溫材料混合列印的限制。"
msgid "With this option enabled, you can print materials with a large temperature difference together."
msgstr "啟用此選項後,您可以同時列印具有較大溫度差異的材料。"
+
+msgid "Open full screen camera view on active monitor only."
+msgstr "僅在作用中的顯示器上開啟攝像機全螢幕檢視。"
+
+msgid "When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."
+msgstr "啟用後,攝像機全螢幕檢視只會在 Bambu Studio 所在的顯示器上開啟。"
+
msgid "Clear my choice for synchronizing printer preset after loading the file."
msgstr "清除載入檔案後同步印表機預設的設定。"
diff --git a/resources/images/camera_fullscreen.svg b/resources/images/camera_fullscreen.svg
new file mode 100644
index 0000000000..934922632b
--- /dev/null
+++ b/resources/images/camera_fullscreen.svg
@@ -0,0 +1,10 @@
+
diff --git a/resources/images/camera_fullscreen_hover.svg b/resources/images/camera_fullscreen_hover.svg
new file mode 100644
index 0000000000..97fd290b4b
--- /dev/null
+++ b/resources/images/camera_fullscreen_hover.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp
index cfd11bf26c..4430b38d27 100644
--- a/src/libslic3r/AppConfig.cpp
+++ b/src/libslic3r/AppConfig.cpp
@@ -320,6 +320,10 @@ void AppConfig::set_defaults()
set_bool("enable_high_low_temp_mixed_printing", false);
}
+ if (get("camera_fullscreen_active_monitor_only").empty()){
+ set_bool("camera_fullscreen_active_monitor_only", true);
+ }
+
if (get("ignore_ext_filament_in_filament_map").empty()){
set_bool("ignore_ext_filament_in_filament_map", false);
}
diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt
index 25a4313212..6edc370520 100644
--- a/src/slic3r/CMakeLists.txt
+++ b/src/slic3r/CMakeLists.txt
@@ -662,6 +662,8 @@ if (APPLE)
GUI/Mouse3DHandlerMac.mm
GUI/InstanceCheckMac.mm
GUI/InstanceCheckMac.h
+ GUI/CameraFullscreenMac.mm
+ GUI/CameraFullscreenMac.hpp
GUI/wxMediaCtrl2.mm
GUI/wxMediaCtrl2.h
GUI/wxMediaCtrl3.h
diff --git a/src/slic3r/GUI/CameraFullscreenMac.hpp b/src/slic3r/GUI/CameraFullscreenMac.hpp
new file mode 100644
index 0000000000..7c8ea964b8
--- /dev/null
+++ b/src/slic3r/GUI/CameraFullscreenMac.hpp
@@ -0,0 +1,19 @@
+#pragma once
+
+#ifdef __APPLE__
+
+class wxWindow;
+
+namespace Slic3r { namespace GUI {
+
+using CameraFullscreenEscapeCallback = void (*)(void *);
+
+void *install_camera_fullscreen_escape_monitor(CameraFullscreenEscapeCallback callback, void *context);
+void uninstall_camera_fullscreen_escape_monitor(void *monitor);
+void *enter_camera_fullscreen_presentation(wxWindow *window);
+void apply_camera_fullscreen_frame(wxWindow *window);
+void restore_camera_fullscreen_presentation(void *presentation);
+
+}} // namespace Slic3r::GUI
+
+#endif
diff --git a/src/slic3r/GUI/CameraFullscreenMac.mm b/src/slic3r/GUI/CameraFullscreenMac.mm
new file mode 100644
index 0000000000..cf81285f35
--- /dev/null
+++ b/src/slic3r/GUI/CameraFullscreenMac.mm
@@ -0,0 +1,103 @@
+#include "CameraFullscreenMac.hpp"
+
+#ifdef __APPLE__
+
+#import
+
+#include
+
+namespace Slic3r { namespace GUI {
+
+namespace {
+
+constexpr unsigned short EscapeKeyCode = 53;
+
+struct CameraFullscreenEscapeMonitor
+{
+ id monitor{ nil };
+ CameraFullscreenEscapeCallback callback{ nullptr };
+ void *context{ nullptr };
+};
+
+struct CameraFullscreenPresentationState
+{
+ NSApplicationPresentationOptions presentation_options{ NSApplicationPresentationDefault };
+};
+
+NSWindow *camera_fullscreen_window(wxWindow *window)
+{
+ if (!window || !window->GetHandle())
+ return nil;
+
+ NSView *view = (NSView *) window->GetHandle();
+ return [view window];
+}
+
+} // namespace
+
+void *install_camera_fullscreen_escape_monitor(CameraFullscreenEscapeCallback callback, void *context)
+{
+ auto *state = new CameraFullscreenEscapeMonitor;
+ state->callback = callback;
+ state->context = context;
+ state->monitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown handler:^NSEvent *(NSEvent *event) {
+ if ([event keyCode] == EscapeKeyCode) {
+ if (state->callback)
+ state->callback(state->context);
+ return nil;
+ }
+ return event;
+ }];
+ return state;
+}
+
+void uninstall_camera_fullscreen_escape_monitor(void *monitor)
+{
+ auto *state = static_cast(monitor);
+ if (!state)
+ return;
+ if (state->monitor)
+ [NSEvent removeMonitor:state->monitor];
+ delete state;
+}
+
+void *enter_camera_fullscreen_presentation(wxWindow *window)
+{
+ auto *state = new CameraFullscreenPresentationState;
+ state->presentation_options = [NSApp presentationOptions];
+
+ NSApplicationPresentationOptions fullscreen_options = state->presentation_options;
+ fullscreen_options &= ~(NSApplicationPresentationHideDock | NSApplicationPresentationHideMenuBar);
+ fullscreen_options |= NSApplicationPresentationAutoHideDock | NSApplicationPresentationAutoHideMenuBar;
+ [NSApp setPresentationOptions:fullscreen_options];
+
+ apply_camera_fullscreen_frame(window);
+ return state;
+}
+
+void apply_camera_fullscreen_frame(wxWindow *window)
+{
+ NSWindow *ns_window = camera_fullscreen_window(window);
+ if (!ns_window)
+ return;
+
+ NSScreen *screen = [ns_window screen] ?: [NSScreen mainScreen];
+ if (!screen)
+ return;
+
+ [ns_window setFrame:[screen frame] display:YES animate:NO];
+}
+
+void restore_camera_fullscreen_presentation(void *presentation)
+{
+ auto *state = static_cast(presentation);
+ if (!state)
+ return;
+
+ [NSApp setPresentationOptions:state->presentation_options];
+ delete state;
+}
+
+}} // namespace Slic3r::GUI
+
+#endif
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index 1a37b30945..45ee3aad7a 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -1764,6 +1764,21 @@ bool MainFrame::can_change_view() const
}
}
+bool MainFrame::can_toggle_camera_fullscreen() const
+{
+ StatusPanel *status_panel = m_monitor ? m_monitor->get_status_panel() : nullptr;
+ if (!status_panel) return false;
+ if (status_panel->is_camera_fullscreen()) return true;
+ return m_tabpanel && m_tabpanel->GetSelection() == TabPosition::tpMonitor && status_panel->can_show_camera_fullscreen();
+}
+
+void MainFrame::toggle_camera_fullscreen()
+{
+ StatusPanel *status_panel = m_monitor ? m_monitor->get_status_panel() : nullptr;
+ if (!status_panel || !can_toggle_camera_fullscreen()) return;
+ status_panel->toggle_camera_fullscreen();
+}
+
bool MainFrame::can_clone() const {
return can_select() && !m_plater->is_selection_empty();
}
@@ -3108,6 +3123,17 @@ void MainFrame::init_menubar_as_editor()
add_common_view_menu_items(viewMenu, this, std::bind(&MainFrame::can_change_view, this));
viewMenu->AppendSeparator();
+ wxMenuItem *camera_fullscreen_item = append_menu_item(
+ viewMenu, wxID_ANY, _L("Enter Camera Full Screen"), _L("Show the Device camera in full screen"),
+ [this](wxCommandEvent &) { toggle_camera_fullscreen(); }, "", nullptr);
+ Bind(wxEVT_UPDATE_UI, [this, camera_fullscreen_item](wxUpdateUIEvent &evt) {
+ StatusPanel *status_panel = m_monitor ? m_monitor->get_status_panel() : nullptr;
+ const bool active = status_panel && status_panel->is_camera_fullscreen();
+ camera_fullscreen_item->SetItemLabel(active ? _L("Exit Camera Full Screen") : _L("Enter Camera Full Screen"));
+ evt.Enable(can_toggle_camera_fullscreen());
+ }, camera_fullscreen_item->GetId());
+ viewMenu->AppendSeparator();
+
//BBS perspective view
wxWindowID camera_id_base = wxWindow::NewControlId(int(wxID_CAMERA_COUNT));
auto perspective_item = append_menu_radio_item(viewMenu, wxID_CAMERA_PERSPECTIVE + camera_id_base, _L("Use Perspective View"), _L("Use Perspective View"),
diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp
index bb91a740ae..99b8617718 100644
--- a/src/slic3r/GUI/MainFrame.hpp
+++ b/src/slic3r/GUI/MainFrame.hpp
@@ -134,6 +134,8 @@ class MainFrame : public DPIFrame
//bool can_eject() const;
bool can_slice() const;
bool can_change_view() const;
+ bool can_toggle_camera_fullscreen() const;
+ void toggle_camera_fullscreen();
bool can_select() const;
bool can_deselect() const;
bool can_clone() const;
diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp
index 2e2ee530ba..bfffeece0a 100644
--- a/src/slic3r/GUI/Preferences.cpp
+++ b/src/slic3r/GUI/Preferences.cpp
@@ -1326,6 +1326,7 @@ wxWindow* PreferencesDialog::create_general_page()
auto item_step_mesh_setting = create_item_checkbox(_L("Show the step mesh parameter setting dialog."), page, _L("If enabled,a parameter settings dialog will appear during STEP file import."), 50, "enable_step_mesh_setting");
auto item_beta_version_update = create_item_checkbox(_L("Support beta version update."), page, _L("With this option enabled, you can receive beta version updates."), 50, "enable_beta_version_update");
auto item_mix_print_high_low_temperature = create_item_checkbox(_L("Remove the restriction on mixed printing of high and low temperature filaments."), page, _L("With this option enabled, you can print materials with a large temperature difference together."), 50, "enable_high_low_temp_mixed_printing");
+ auto item_camera_fullscreen_active_monitor_only = create_item_checkbox(_L("Open full screen camera view on active monitor only."), page, _L("When enabled, the camera full screen view opens only on the monitor that contains Bambu Studio."), 50, "camera_fullscreen_active_monitor_only");
auto item_restore_hide_pop_ups = create_item_button(_L("Clear my choice for synchronizing printer preset after loading the file."), _L("Clear"), page, {}, []() {
wxGetApp().app_config->erase("app", "sync_after_load_file_show_flag");
});
@@ -1494,6 +1495,7 @@ wxWindow* PreferencesDialog::create_general_page()
sizer_page->Add(item_beta_version_update, 0, wxTOP, FromDIP(3));
sizer_page->Add(item_auto_transfer_when_switch_preset, 0, wxTOP, FromDIP(3));
sizer_page->Add(item_mix_print_high_low_temperature, 0, wxTOP, FromDIP(3));
+ sizer_page->Add(item_camera_fullscreen_active_monitor_only, 0, wxTOP, FromDIP(3));
sizer_page->Add(item_restore_hide_pop_ups, 0, wxTOP, FromDIP(3));
sizer_page->Add(item_restore_hide_3mf_info, 0, wxTOP, FromDIP(3));
sizer_page->Add(_3d_settings, 0, wxTOP | wxEXPAND, FromDIP(20));
diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp
index 4b78b288ed..7321df0c6c 100644
--- a/src/slic3r/GUI/StatusPanel.cpp
+++ b/src/slic3r/GUI/StatusPanel.cpp
@@ -8,6 +8,9 @@
#include "BitmapCache.hpp"
#include "GUI_App.hpp"
#include "MainFrame.hpp"
+#ifdef __APPLE__
+#include "CameraFullscreenMac.hpp"
+#endif
#include "MsgDialog.hpp"
#include "slic3r/Utils/Http.hpp"
@@ -18,7 +21,11 @@
#include "CalibUtils.hpp"
#include "BBLUtil.hpp"
#include
+#include
#include
+#include
+#include
+#include
#include
#include
#include
@@ -51,6 +58,9 @@
#include "ThermalPreconditioningDialog.hpp"
+#include
+#include
+
namespace Slic3r { namespace GUI {
#define TEMP_THRESHOLD_VAL 2
@@ -78,6 +88,370 @@ static const wxColour BUTTON_HOVER_COL = wxColour(0, 174, 66);
static const wxColour DISCONNECT_TEXT_COL = wxColour(171, 172, 172);
static const wxColour NORMAL_TEXT_COL = wxColour(48, 58, 60);
+
+class CameraFullscreenCloseButton : public wxPanel
+{
+public:
+ CameraFullscreenCloseButton(wxWindow *parent, std::function close_cb, std::function hover_cb)
+ : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE)
+ , m_close_cb(std::move(close_cb))
+ , m_hover_cb(std::move(hover_cb))
+ {
+ SetBackgroundStyle(wxBG_STYLE_PAINT);
+ SetCursor(wxCursor(wxCURSOR_HAND));
+ Bind(wxEVT_PAINT, &CameraFullscreenCloseButton::on_paint, this);
+ Bind(wxEVT_ENTER_WINDOW, &CameraFullscreenCloseButton::on_enter, this);
+ Bind(wxEVT_LEAVE_WINDOW, &CameraFullscreenCloseButton::on_leave, this);
+ Bind(wxEVT_LEFT_UP, &CameraFullscreenCloseButton::on_left_up, this);
+ }
+
+ void set_alpha(int alpha)
+ {
+ m_alpha = std::clamp(alpha, 0, 255);
+ Refresh();
+ }
+
+private:
+ void on_paint(wxPaintEvent &)
+ {
+ wxAutoBufferedPaintDC paint_dc(this);
+ paint_dc.SetBackground(wxBrush(wxColour(0, 0, 0, 0)));
+ paint_dc.Clear();
+
+ if (m_alpha <= 0) return;
+
+ wxGCDC dc(paint_dc);
+ const wxSize size = GetClientSize();
+ const int inset = FromDIP(1);
+ const int x_pad = FromDIP(14);
+ const int line_width = FromDIP(2);
+ const int bg_alpha = m_hover ? std::min(255, m_alpha + 35) : m_alpha;
+
+ dc.SetPen(*wxTRANSPARENT_PEN);
+ dc.SetBrush(wxBrush(wxColour(18, 18, 18, bg_alpha)));
+ dc.DrawEllipse(inset, inset, size.x - 2 * inset, size.y - 2 * inset);
+
+ dc.SetPen(wxPen(wxColour(255, 255, 255, std::min(255, bg_alpha + 20)), line_width, wxPENSTYLE_SOLID));
+ dc.DrawLine(x_pad, x_pad, size.x - x_pad, size.y - x_pad);
+ dc.DrawLine(size.x - x_pad, x_pad, x_pad, size.y - x_pad);
+ }
+
+ void on_enter(wxMouseEvent &event)
+ {
+ m_hover = true;
+ if (m_hover_cb) m_hover_cb(true);
+ Refresh();
+ event.Skip();
+ }
+
+ void on_leave(wxMouseEvent &event)
+ {
+ m_hover = false;
+ if (m_hover_cb) m_hover_cb(false);
+ Refresh();
+ event.Skip();
+ }
+
+ void on_left_up(wxMouseEvent &)
+ {
+ if (m_close_cb) m_close_cb();
+ }
+
+ std::function m_close_cb;
+ std::function m_hover_cb;
+ int m_alpha{0};
+ bool m_hover{false};
+};
+
+class CameraFullscreenFrame : public wxFrame
+{
+public:
+ explicit CameraFullscreenFrame(StatusBasePanel *owner)
+ : wxFrame(owner, wxID_ANY, _L("Camera Full Screen"), wxDefaultPosition, wxDefaultSize, wxBORDER_NONE | wxFRAME_NO_TASKBAR)
+ , m_owner(owner)
+ {
+ SetBackgroundColour(*wxBLACK);
+ EnableFullScreenView(true);
+
+ m_hide_timer.SetOwner(this, wxWindow::NewControlId());
+ m_fade_timer.SetOwner(this, wxWindow::NewControlId());
+
+ auto *root_sizer = new wxBoxSizer(wxVERTICAL);
+ m_video_host = new wxPanel(this, wxID_ANY);
+ m_video_host->SetBackgroundColour(*wxBLACK);
+ m_video_sizer = new wxBoxSizer(wxVERTICAL);
+ m_video_host->SetSizer(m_video_sizer);
+ root_sizer->Add(m_video_host, 1, wxEXPAND);
+ SetSizer(root_sizer);
+
+ m_close_button = new CameraFullscreenCloseButton(
+ m_video_host,
+ [this] { request_close(); },
+ [this](bool hover) { on_close_hover_changed(hover); });
+ m_close_button->Hide();
+
+ Bind(wxEVT_CLOSE_WINDOW, &CameraFullscreenFrame::on_close, this);
+ m_escape_accel_id = wxWindow::NewControlId();
+ Bind(wxEVT_MENU, &CameraFullscreenFrame::on_escape_accelerator, this, m_escape_accel_id);
+ Bind(wxEVT_CHAR_HOOK, &CameraFullscreenFrame::on_char_hook, this);
+ Bind(wxEVT_KEY_DOWN, &CameraFullscreenFrame::on_char_hook, this);
+ Bind(wxEVT_SIZE, &CameraFullscreenFrame::on_size, this);
+ Bind(wxEVT_MOTION, &CameraFullscreenFrame::on_mouse_motion, this);
+ Bind(wxEVT_TIMER, &CameraFullscreenFrame::on_hide_timer, this, m_hide_timer.GetId());
+ Bind(wxEVT_TIMER, &CameraFullscreenFrame::on_fade_timer, this, m_fade_timer.GetId());
+ wxAcceleratorEntry entries[1];
+ entries[0].Set(wxACCEL_NORMAL, WXK_ESCAPE, m_escape_accel_id);
+ SetAcceleratorTable(wxAcceleratorTable(1, entries));
+#ifdef __APPLE__
+ m_escape_monitor = install_camera_fullscreen_escape_monitor(
+ [](void *context) {
+ auto *frame = static_cast(context);
+ frame->CallAfter([frame] { frame->request_close(); });
+ },
+ this);
+#endif
+ m_video_host->Bind(wxEVT_KEY_DOWN, &CameraFullscreenFrame::on_char_hook, this);
+ m_video_host->Bind(wxEVT_MOTION, &CameraFullscreenFrame::on_mouse_motion, this);
+ m_close_button->Bind(wxEVT_CHAR_HOOK, &CameraFullscreenFrame::on_char_hook, this);
+ m_close_button->Bind(wxEVT_KEY_DOWN, &CameraFullscreenFrame::on_char_hook, this);
+
+ wxDisplay display(wxDisplay::GetFromWindow(owner));
+ if (display.IsOk()) SetSize(display.GetGeometry());
+ }
+
+ ~CameraFullscreenFrame() override
+ {
+#ifdef __APPLE__
+ restore_camera_fullscreen_presentation(m_presentation_state);
+ uninstall_camera_fullscreen_escape_monitor(m_escape_monitor);
+#endif
+ }
+
+ wxWindow *video_parent() const { return m_video_host; }
+
+ void show_camera_view(bool active_monitor_only)
+ {
+ m_native_fullscreen = false;
+ if (active_monitor_only) {
+#ifdef __APPLE__
+ m_presentation_state = enter_camera_fullscreen_presentation(this);
+#endif
+ SetSize(display_geometry_for(m_owner ? static_cast(m_owner) : this));
+ Show();
+#ifdef __APPLE__
+ apply_camera_fullscreen_frame(this);
+#else
+ ShowFullScreen(true, wxFULLSCREEN_ALL);
+ m_native_fullscreen = true;
+#endif
+ } else {
+#ifdef __APPLE__
+ Show();
+ ShowFullScreen(true, wxFULLSCREEN_ALL);
+ m_native_fullscreen = true;
+#else
+ SetSize(all_display_geometry());
+ Show();
+#endif
+ }
+
+ Raise();
+ SetFocus();
+ }
+
+ void exit_camera_view()
+ {
+ if (m_native_fullscreen) ShowFullScreen(false);
+#ifdef __APPLE__
+ restore_camera_fullscreen_presentation(m_presentation_state);
+ m_presentation_state = nullptr;
+#endif
+ }
+
+ void attach_media(wxMediaCtrl3 *media_ctrl)
+ {
+ m_media_ctrl = media_ctrl;
+ m_video_sizer->Add(m_media_ctrl, 1, wxEXPAND);
+ m_media_ctrl->Bind(wxEVT_CHAR_HOOK, &CameraFullscreenFrame::on_char_hook, this);
+ m_media_ctrl->Bind(wxEVT_KEY_DOWN, &CameraFullscreenFrame::on_char_hook, this);
+ m_media_ctrl->Bind(wxEVT_MOTION, &CameraFullscreenFrame::on_mouse_motion, this);
+ Layout();
+ position_close_button();
+ CallAfter([this] { show_close_button(); });
+ }
+
+ void detach_media()
+ {
+ if (!m_media_ctrl) return;
+ m_media_ctrl->Unbind(wxEVT_CHAR_HOOK, &CameraFullscreenFrame::on_char_hook, this);
+ m_media_ctrl->Unbind(wxEVT_KEY_DOWN, &CameraFullscreenFrame::on_char_hook, this);
+ m_media_ctrl->Unbind(wxEVT_MOTION, &CameraFullscreenFrame::on_mouse_motion, this);
+ m_video_sizer->Detach(m_media_ctrl);
+ m_media_ctrl = nullptr;
+ }
+
+ void clear_owner() { m_owner = nullptr; }
+
+private:
+ void on_close(wxCloseEvent &event)
+ {
+ if (m_owner) {
+ m_owner->close_camera_fullscreen();
+ return;
+ }
+ event.Skip();
+ }
+
+ void on_escape_accelerator(wxCommandEvent &)
+ {
+ request_close();
+ }
+
+ void on_char_hook(wxKeyEvent &event)
+ {
+ if (event.GetKeyCode() == WXK_ESCAPE) {
+ request_close();
+ return;
+ }
+ event.Skip();
+ }
+
+ void on_size(wxSizeEvent &event)
+ {
+ event.Skip();
+ position_close_button();
+ }
+
+ void on_mouse_motion(wxMouseEvent &event)
+ {
+ show_close_button();
+ event.Skip();
+ }
+
+ void on_hide_timer(wxTimerEvent &)
+ {
+ if (m_close_hover) return;
+ m_fade_elapsed_ms = 0;
+ m_fade_start_alpha = m_close_alpha;
+ m_fade_timer.Start(30);
+ }
+
+ void on_fade_timer(wxTimerEvent &)
+ {
+ if (m_close_hover) {
+ m_fade_timer.Stop();
+ return;
+ }
+
+ m_fade_elapsed_ms += 30;
+ if (m_fade_elapsed_ms >= 300) {
+ m_fade_timer.Stop();
+ m_close_alpha = 0;
+ m_close_button->set_alpha(m_close_alpha);
+ m_close_button->Hide();
+ return;
+ }
+
+ m_close_alpha = m_fade_start_alpha * (300 - m_fade_elapsed_ms) / 300;
+ m_close_button->set_alpha(m_close_alpha);
+ }
+
+ void on_close_hover_changed(bool hover)
+ {
+ m_close_hover = hover;
+ if (hover) {
+ show_close_button(false);
+ } else {
+ start_hide_timer();
+ }
+ }
+
+ void request_close()
+ {
+ if (m_owner) {
+ m_owner->close_camera_fullscreen();
+ } else {
+ Close();
+ }
+ }
+
+ static wxRect display_geometry_for(wxWindow *window)
+ {
+ const int display_index = window ? wxDisplay::GetFromWindow(window) : wxNOT_FOUND;
+ if (display_index != wxNOT_FOUND) {
+ wxDisplay display(static_cast(display_index));
+ if (display.IsOk()) return display.GetGeometry();
+ }
+
+ wxDisplay primary_display(static_cast(0));
+ return primary_display.IsOk() ? primary_display.GetGeometry() : wxGetClientDisplayRect();
+ }
+
+ static wxRect all_display_geometry()
+ {
+ wxRect geometry;
+ bool has_geometry = false;
+ const unsigned int display_count = wxDisplay::GetCount();
+ for (unsigned int i = 0; i < display_count; ++i) {
+ wxDisplay display(i);
+ if (!display.IsOk()) continue;
+ if (!has_geometry) {
+ geometry = display.GetGeometry();
+ has_geometry = true;
+ } else {
+ geometry.Union(display.GetGeometry());
+ }
+ }
+
+ return has_geometry ? geometry : wxGetClientDisplayRect();
+ }
+
+ void show_close_button(bool reset_idle_timer = true)
+ {
+ if (!m_close_button) return;
+ m_fade_timer.Stop();
+ m_close_alpha = m_close_hover ? 225 : 185;
+ m_close_button->set_alpha(m_close_alpha);
+ if (!m_close_button->IsShown()) m_close_button->Show();
+ position_close_button();
+ m_close_button->Raise();
+ if (reset_idle_timer && !m_close_hover) start_hide_timer();
+ }
+
+ void start_hide_timer()
+ {
+ m_hide_timer.Stop();
+ m_hide_timer.StartOnce(3000);
+ }
+
+ void position_close_button()
+ {
+ if (!m_video_host || !m_close_button) return;
+ const int button_size = FromDIP(44);
+ const int margin = FromDIP(24);
+ const wxSize host_size = m_video_host->GetClientSize();
+ m_close_button->SetSize(wxSize(button_size, button_size));
+ m_close_button->SetPosition(wxPoint(std::max(margin, host_size.x - button_size - margin), margin));
+ }
+
+ StatusBasePanel *m_owner{nullptr};
+ wxPanel *m_video_host{nullptr};
+ wxBoxSizer *m_video_sizer{nullptr};
+ wxMediaCtrl3 *m_media_ctrl{nullptr};
+ CameraFullscreenCloseButton *m_close_button{nullptr};
+ wxTimer m_hide_timer;
+ wxTimer m_fade_timer;
+#ifdef __APPLE__
+ void *m_escape_monitor{nullptr};
+ void *m_presentation_state{nullptr};
+#endif
+ wxWindowID m_escape_accel_id{ wxID_ANY };
+ int m_close_alpha{ 0 };
+ int m_fade_start_alpha{ 0 };
+ int m_fade_elapsed_ms{ 0 };
+ bool m_close_hover{ false };
+ bool m_native_fullscreen{ false };
+};
static const wxColour NORMAL_FAN_TEXT_COL = wxColour(107, 107, 107);
static const wxColour WARNING_INFO_BG_COL = wxColour(255, 111, 0);
static const wxColour STAGE_TEXT_COL = wxColour(107, 107, 107);
@@ -1456,7 +1830,64 @@ StatusBasePanel::StatusBasePanel(wxWindow *parent, wxWindowID id, const wxPoint
this->Layout();
}
-StatusBasePanel::~StatusBasePanel() { delete m_media_play_ctrl; }
+StatusBasePanel::~StatusBasePanel()
+{
+ close_camera_fullscreen();
+ delete m_media_play_ctrl;
+}
+
+bool StatusBasePanel::can_show_camera_fullscreen() const { return m_media_ctrl != nullptr && IsShownOnScreen(); }
+
+bool StatusBasePanel::is_camera_fullscreen() const { return m_camera_fullscreen_frame != nullptr; }
+
+void StatusBasePanel::toggle_camera_fullscreen()
+{
+ if (is_camera_fullscreen()) {
+ close_camera_fullscreen();
+ } else {
+ show_camera_fullscreen();
+ }
+}
+
+void StatusBasePanel::show_camera_fullscreen()
+{
+ if (!can_show_camera_fullscreen() || m_camera_fullscreen_frame || !m_camera_media_sizer) return;
+
+ m_camera_fullscreen_frame = new CameraFullscreenFrame(this);
+ m_camera_media_sizer->Detach(m_media_ctrl);
+ m_media_ctrl->Reparent(m_camera_fullscreen_frame->video_parent());
+ m_camera_fullscreen_frame->attach_media(m_media_ctrl);
+
+ Layout();
+ Refresh();
+
+ const bool active_monitor_only = wxGetApp().app_config == nullptr || wxGetApp().app_config->get_bool("camera_fullscreen_active_monitor_only");
+ m_camera_fullscreen_frame->show_camera_view(active_monitor_only);
+}
+
+void StatusBasePanel::close_camera_fullscreen()
+{
+ if (!m_camera_fullscreen_frame) return;
+
+ CameraFullscreenFrame *frame = m_camera_fullscreen_frame;
+ m_camera_fullscreen_frame = nullptr;
+ frame->clear_owner();
+ frame->detach_media();
+
+ m_media_ctrl->Reparent(this);
+ m_camera_media_sizer->Insert(1, m_media_ctrl, 1, wxEXPAND | wxALL, 0);
+ Layout();
+ Refresh();
+
+ frame->exit_camera_view();
+ frame->Destroy();
+}
+
+void StatusBasePanel::on_camera_fullscreen(wxMouseEvent &event)
+{
+ toggle_camera_fullscreen();
+ event.Skip();
+}
void StatusBasePanel::init_bitmaps()
{
@@ -1544,6 +1975,10 @@ wxBoxSizer *StatusBasePanel::create_monitoring_page()
m_bitmap_vcamera_img->SetMinSize(wxSize(FromDIP(38), FromDIP(24)));
m_bitmap_vcamera_img->Hide();
+ m_camera_fullscreen_button = new CameraItem(m_panel_monitoring_title, "camera_fullscreen", "camera_fullscreen_hover");
+ m_camera_fullscreen_button->SetMinSize(wxSize(FromDIP(38), FromDIP(24)));
+ m_camera_fullscreen_button->SetBackgroundColour(STATUS_TITLE_BG);
+
m_setting_button = new CameraItem(m_panel_monitoring_title, "camera_setting", "camera_setting_hover");
m_setting_button->SetMinSize(wxSize(FromDIP(38), FromDIP(24)));
m_setting_button->SetBackgroundColour(STATUS_TITLE_BG);
@@ -1552,12 +1987,14 @@ wxBoxSizer *StatusBasePanel::create_monitoring_page()
m_bitmap_timelapse_img->SetToolTip(_L("Timelapse"));
m_bitmap_recording_img->SetToolTip(_L("Video"));
m_bitmap_vcamera_img->SetToolTip(_L("Go Live"));
+ m_camera_fullscreen_button->SetToolTip(_L("Enter Camera Full Screen"));
m_setting_button->SetToolTip(_L("Camera Setting"));
bSizer_monitoring_title->Add(m_bitmap_sdcard_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5));
bSizer_monitoring_title->Add(m_bitmap_timelapse_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5));
bSizer_monitoring_title->Add(m_bitmap_recording_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5));
bSizer_monitoring_title->Add(m_bitmap_vcamera_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5));
+ bSizer_monitoring_title->Add(m_camera_fullscreen_button, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5));
bSizer_monitoring_title->Add(m_setting_button, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5));
bSizer_monitoring_title->Add(FromDIP(13), 0, 0);
@@ -1577,6 +2014,7 @@ wxBoxSizer *StatusBasePanel::create_monitoring_page()
sizer->Add(m_media_ctrl, 1, wxEXPAND | wxALL, 0);
sizer->Add(m_media_play_ctrl, 0, wxEXPAND | wxALL, 0);
+ m_camera_media_sizer = sizer;
// media_ctrl_panel->SetSizer(bSizer_monitoring);
// media_ctrl_panel->Layout();
//
@@ -2449,6 +2887,8 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co
m_setting_button->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this);
m_setting_button->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this);
+ m_camera_fullscreen_button->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusBasePanel::on_camera_fullscreen), NULL, this);
+ m_camera_fullscreen_button->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(StatusBasePanel::on_camera_fullscreen), NULL, this);
m_tempCtrl_bed->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_kill_focus), NULL, this);
m_tempCtrl_bed->Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_set_focus), NULL, this);
m_tempCtrl_nozzle->Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this);
@@ -2514,6 +2954,10 @@ StatusPanel::~StatusPanel()
m_setting_button->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this);
m_setting_button->Disconnect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(StatusPanel::on_camera_enter), NULL, this);
+ if (m_camera_fullscreen_button) {
+ m_camera_fullscreen_button->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler(StatusBasePanel::on_camera_fullscreen), NULL, this);
+ m_camera_fullscreen_button->Disconnect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(StatusBasePanel::on_camera_fullscreen), NULL, this);
+ }
m_tempCtrl_bed->Disconnect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_kill_focus), NULL, this);
m_tempCtrl_bed->Disconnect(wxEVT_SET_FOCUS, wxFocusEventHandler(StatusPanel::on_bed_temp_set_focus), NULL, this);
m_tempCtrl_nozzle->Disconnect(wxEVT_KILL_FOCUS, wxFocusEventHandler(StatusPanel::on_nozzle_temp_kill_focus), NULL, this);
@@ -5006,6 +5450,7 @@ bool StatusPanel::is_stage_list_info_changed(MachineObject *obj)
void StatusPanel::set_default()
{
BOOST_LOG_TRIVIAL(trace) << "status_panel: set_default";
+ close_camera_fullscreen();
obj = nullptr;
last_subtask = nullptr;
last_tray_exist_bits = -1;
@@ -5083,6 +5528,7 @@ void StatusPanel::rescale_camera_icons()
if (!m_setting_button || !m_media_play_ctrl || !m_bitmap_vcamera_img || !m_bitmap_sdcard_img || !m_bitmap_recording_img || !m_bitmap_timelapse_img) return;
m_setting_button->msw_rescale();
+ if (m_camera_fullscreen_button) m_camera_fullscreen_button->msw_rescale();
m_bitmap_sdcard_state_abnormal = ScalableBitmap(this, wxGetApp().dark_mode() ? "sdcard_state_abnormal_dark" : "sdcard_state_abnormal", 20);
m_bitmap_sdcard_state_normal = ScalableBitmap(this, wxGetApp().dark_mode() ? "sdcard_state_normal_dark" : "sdcard_state_normal", 20);
diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp
index 3bd970aa85..07075f34ec 100644
--- a/src/slic3r/GUI/StatusPanel.hpp
+++ b/src/slic3r/GUI/StatusPanel.hpp
@@ -50,6 +50,7 @@ namespace GUI {
// Previous definitions
class MessageDialog;
class wgtDeviceNozzleRack;
+class CameraFullscreenFrame;
enum CameraRecordingStatus {
RECORDING_NONE,
@@ -427,8 +428,10 @@ class StatusBasePanel : public wxScrolledWindow
CameraRecordingStatus m_state_recording{CameraRecordingStatus::RECORDING_NONE};
CameraTimelapseStatus m_state_timelapse{CameraTimelapseStatus::TIMELAPSE_NONE};
-
CameraItem *m_setting_button;
+ CameraItem *m_camera_fullscreen_button{ nullptr };
+ wxBoxSizer *m_camera_media_sizer{ nullptr };
+ CameraFullscreenFrame *m_camera_fullscreen_frame{ nullptr };
wxBitmap m_bitmap_camera;
ScalableBitmap m_bitmap_sdcard_state_normal;
@@ -629,11 +632,17 @@ class StatusBasePanel : public wxScrolledWindow
void jump_to_Rack();
+ bool can_show_camera_fullscreen() const;
+ bool is_camera_fullscreen() const;
+ void toggle_camera_fullscreen();
+ void close_camera_fullscreen();
+ void on_camera_fullscreen(wxMouseEvent& event);
+
private:
void on_ams_rack_switch(wxCommandEvent& event);
+ void show_camera_fullscreen();
};
-
class StatusPanel : public StatusBasePanel
{
private: