From c2c7d9ccb10216065a4d14e3b2783758e1130031 Mon Sep 17 00:00:00 2001 From: Lionel DARNIS Date: Sat, 8 Aug 2026 16:42:48 +0200 Subject: [PATCH] feat(printers): types de papier et mode de couleur par defaut Le tiroir de details expose desormais MediaType et ColorModel en plus de PageSize, cupsPrintQuality et Duplex, avec des libellets localises pour les valeurs usuelles (papier ordinaire, photo brillante/mate/satinee, couleur, niveaux de gris...). Persiste via lpadmin -o comme les autres options. --- cosmic-settings/src/pages/printers/backend.rs | 9 +- cosmic-settings/src/pages/printers/mod.rs | 99 +++++++++++++++++++ i18n/en/cosmic_settings.ftl | 25 +++++ i18n/fr/cosmic_settings.ftl | 25 +++++ 4 files changed, 157 insertions(+), 1 deletion(-) diff --git a/cosmic-settings/src/pages/printers/backend.rs b/cosmic-settings/src/pages/printers/backend.rs index 055902c..d1bb95f 100644 --- a/cosmic-settings/src/pages/printers/backend.rs +++ b/cosmic-settings/src/pages/printers/backend.rs @@ -203,11 +203,16 @@ pub async fn remove_printer(name: &str) -> Result<(), String> { /// Default job options supported by a queue, with their current values. /// /// Values are taken from the queue's PPD view (`lpoptions -l`): `PageSize`, -/// `cupsPrintQuality` and `Duplex`, which `lpadmin -o` can persist. +/// `MediaType`, `ColorModel`, `cupsPrintQuality` and `Duplex`, which +/// `lpadmin -o` can persist. #[derive(Clone, Debug, Default)] pub struct PrinterOptions { pub media: Vec, pub media_default: Option, + pub media_types: Vec, + pub media_type_default: Option, + pub color_models: Vec, + pub color_model_default: Option, pub qualities: Vec, pub quality_default: Option, pub sides: Vec, @@ -237,6 +242,8 @@ pub async fn printer_options(name: &str) -> Result { let (list, default) = match key { "PageSize" => (&mut options.media, &mut options.media_default), + "MediaType" => (&mut options.media_types, &mut options.media_type_default), + "ColorModel" => (&mut options.color_models, &mut options.color_model_default), "cupsPrintQuality" => (&mut options.qualities, &mut options.quality_default), "Duplex" => (&mut options.sides, &mut options.sides_default), _ => continue, diff --git a/cosmic-settings/src/pages/printers/mod.rs b/cosmic-settings/src/pages/printers/mod.rs index a180f95..f259400 100644 --- a/cosmic-settings/src/pages/printers/mod.rs +++ b/cosmic-settings/src/pages/printers/mod.rs @@ -129,6 +129,41 @@ fn quality_label(value: &str) -> String { } } +fn media_type_label(value: &str) -> String { + match value { + "Stationery" => fl!("printers-media-type-stationery"), + "Photographic" => fl!("printers-media-type-photographic"), + "PhotographicGlossy" => fl!("printers-media-type-photographic-glossy"), + "PhotographicMatte" => fl!("printers-media-type-photographic-matte"), + "PhotographicSatin" => fl!("printers-media-type-photographic-satin"), + "StationeryCoated" => fl!("printers-media-type-stationery-coated"), + "StationeryFine" => fl!("printers-media-type-stationery-fine"), + "StationeryInkjet" => fl!("printers-media-type-stationery-inkjet"), + "StationeryLetterhead" => fl!("printers-media-type-stationery-letterhead"), + "StationeryPreprint" => fl!("printers-media-type-stationery-preprint"), + "StationeryRecycled" => fl!("printers-media-type-stationery-recycled"), + "Envelope" => fl!("printers-media-type-envelope"), + "Transparency" => fl!("printers-media-type-transparency"), + "Labels" => fl!("printers-media-type-labels"), + "Cardstock" => fl!("printers-media-type-cardstock"), + _ => value.to_string(), + } +} + +fn color_model_label(value: &str) -> String { + match value { + "RGB" => fl!("printers-color-rgb"), + "RGB16" => fl!("printers-color-rgb-16"), + "RGB24" => fl!("printers-color-rgb-24"), + "RGB48" => fl!("printers-color-rgb-48"), + "Gray" | "KGray" => fl!("printers-color-gray"), + "CMYK" => fl!("printers-color-cmyk"), + "CMY" => fl!("printers-color-cmy"), + "Black" => fl!("printers-color-black"), + _ => value.to_string(), + } +} + fn sides_label(value: &str) -> String { match value { "None" => fl!("printers-sides-one-sided"), @@ -551,6 +586,8 @@ impl Page { if let Some((options_name, options)) = self.options.as_ref() && options_name == &printer.name && (!options.media.is_empty() + || !options.media_types.is_empty() + || !options.color_models.is_empty() || !options.qualities.is_empty() || !options.sides.is_empty()) { @@ -589,6 +626,68 @@ impl Page { ); } + if !options.media_types.is_empty() { + let values = options.media_types.clone(); + let selected = options + .media_type_default + .as_ref() + .and_then(|default| values.iter().position(|value| value == default)); + let labels: Vec = values.iter().map(|v| media_type_label(v)).collect(); + let name = printer.name.clone(); + + list = list.add( + widget::settings::item::builder(fl!("printers-option-media-type")).control( + widget::dropdown::popup_dropdown( + labels, + selected, + move |index| Message::SetOption { + printer: name.clone(), + option: "MediaType".to_string(), + value: values.get(index).cloned().unwrap_or_default(), + }, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |action| { + crate::app::Message::PageMessage( + crate::pages::Message::Printers(action), + ) + }, + ), + ), + ); + } + + if !options.color_models.is_empty() { + let values = options.color_models.clone(); + let selected = options + .color_model_default + .as_ref() + .and_then(|default| values.iter().position(|value| value == default)); + let labels: Vec = values.iter().map(|v| color_model_label(v)).collect(); + let name = printer.name.clone(); + + list = list.add( + widget::settings::item::builder(fl!("printers-option-color")).control( + widget::dropdown::popup_dropdown( + labels, + selected, + move |index| Message::SetOption { + printer: name.clone(), + option: "ColorModel".to_string(), + value: values.get(index).cloned().unwrap_or_default(), + }, + cosmic::iced::window::Id::RESERVED, + Message::Surface, + |action| { + crate::app::Message::PageMessage( + crate::pages::Message::Printers(action), + ) + }, + ), + ), + ); + } + if !options.qualities.is_empty() { let values = options.qualities.clone(); let selected = options diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index 8bd4cbf..c78ba5b 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -649,6 +649,14 @@ printers-add = Add printer printers-add-in-progress = Adding printer… printers-added = Printer “{ $name }” added printers-cancel-job = Cancel job +printers-color-black = Black +printers-color-cmy = CMY +printers-color-cmyk = CMYK +printers-color-gray = Grayscale +printers-color-rgb = Color +printers-color-rgb-16 = Color (16-bit) +printers-color-rgb-24 = Color (24-bit) +printers-color-rgb-48 = Color (48-bit) printers-default = Default printers-details = Printer details printers-device = Device @@ -667,13 +675,30 @@ printers-jobs = Print jobs printers-loading = Searching for devices… printers-location = Location printers-make-default = Set as default +printers-media-type-cardstock = Cardstock +printers-media-type-envelope = Envelope +printers-media-type-labels = Labels +printers-media-type-photographic = Photo paper +printers-media-type-photographic-glossy = Glossy photo paper +printers-media-type-photographic-matte = Matte photo paper +printers-media-type-photographic-satin = Satin photo paper +printers-media-type-stationery = Plain paper +printers-media-type-stationery-coated = Coated paper +printers-media-type-stationery-fine = Fine paper +printers-media-type-stationery-inkjet = Inkjet paper +printers-media-type-stationery-letterhead = Letterhead paper +printers-media-type-stationery-preprint = Preprinted paper +printers-media-type-stationery-recycled = Recycled paper +printers-media-type-transparency = Transparency printers-name = Name printers-no-devices = No devices found printers-no-matching-drivers = No matching drivers printers-no-printers = No printers configured printers-no-printers-desc = Printers connected to this computer or discovered on the network will appear here. printers-not-accepting = Not accepting jobs +printers-option-color = Color mode printers-option-media = Paper format +printers-option-media-type = Paper type printers-option-quality = Print quality printers-option-sides = Two-sided printing printers-options = Print options diff --git a/i18n/fr/cosmic_settings.ftl b/i18n/fr/cosmic_settings.ftl index 5ef94de..e101132 100644 --- a/i18n/fr/cosmic_settings.ftl +++ b/i18n/fr/cosmic_settings.ftl @@ -437,6 +437,14 @@ printers-add = Ajouter une imprimante printers-add-in-progress = Ajout de l'imprimante… printers-added = Imprimante « { $name } » ajoutée printers-cancel-job = Annuler le travail +printers-color-black = Noir +printers-color-cmy = CMJ +printers-color-cmyk = CMJN +printers-color-gray = Niveaux de gris +printers-color-rgb = Couleur +printers-color-rgb-16 = Couleur (16 bits) +printers-color-rgb-24 = Couleur (24 bits) +printers-color-rgb-48 = Couleur (48 bits) printers-default = Par défaut printers-details = Détails de l'imprimante printers-device = Périphérique @@ -455,13 +463,30 @@ printers-jobs = Travaux d'impression printers-loading = Recherche des périphériques… printers-location = Emplacement printers-make-default = Définir par défaut +printers-media-type-cardstock = Papier cartonné +printers-media-type-envelope = Enveloppe +printers-media-type-labels = Étiquettes +printers-media-type-photographic = Papier photo +printers-media-type-photographic-glossy = Papier photo brillant +printers-media-type-photographic-matte = Papier photo mat +printers-media-type-photographic-satin = Papier photo satiné +printers-media-type-stationery = Papier ordinaire +printers-media-type-stationery-coated = Papier couché +printers-media-type-stationery-fine = Papier fin +printers-media-type-stationery-inkjet = Papier jet d'encre +printers-media-type-stationery-letterhead = Papier à en-tête +printers-media-type-stationery-preprint = Papier pré-imprimé +printers-media-type-stationery-recycled = Papier recyclé +printers-media-type-transparency = Transparent printers-name = Nom printers-no-devices = Aucun périphérique trouvé printers-no-matching-drivers = Aucun pilote ne correspond printers-no-printers = Aucune imprimante configurée printers-no-printers-desc = Les imprimantes connectées à cet ordinateur ou découvertes sur le réseau apparaîtront ici. printers-not-accepting = N'accepte pas les travaux +printers-option-color = Mode de couleur printers-option-media = Format du papier +printers-option-media-type = Type de papier printers-option-quality = Qualité d'impression printers-option-sides = Impression recto-verso printers-options = Options d'impression