print: Code cleanup
Part-of: <https://gitlab.gnome.org/GNOME/loupe/-/merge_requests/240>
This commit is contained in:
parent
2fac5e6c43
commit
172ce9d976
3 changed files with 48 additions and 39 deletions
|
|
@ -28,12 +28,14 @@
|
||||||
<object class="GtkButton">
|
<object class="GtkButton">
|
||||||
<property name="label" translatable="yes">Back</property>
|
<property name="label" translatable="yes">Back</property>
|
||||||
<property name="action-name">print.back</property>
|
<property name="action-name">print.back</property>
|
||||||
|
<property name="can-shrink">true</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child type="end">
|
<child type="end">
|
||||||
<object class="GtkButton">
|
<object class="GtkButton">
|
||||||
<property name="label" translatable="yes">Print</property>
|
<property name="label" translatable="yes">Print</property>
|
||||||
<property name="action-name">print.print</property>
|
<property name="action-name">print.print</property>
|
||||||
|
<property name="can-shrink">true</property>
|
||||||
<style>
|
<style>
|
||||||
<class name="suggested-action" />
|
<class name="suggested-action" />
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -700,7 +700,7 @@ impl LpImageView {
|
||||||
.downcast_ref::<gtk::Window>()
|
.downcast_ref::<gtk::Window>()
|
||||||
.context("Could not downcast to GtkWindow")?;
|
.context("Could not downcast to GtkWindow")?;
|
||||||
|
|
||||||
LpPrint::new(image, window.clone(), None, None).run();
|
LpPrint::new(image, window.clone(), None, None).run()?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,8 @@ enum VAlignment {
|
||||||
|
|
||||||
/// Scope guard for non user ui changes
|
/// Scope guard for non user ui changes
|
||||||
///
|
///
|
||||||
/// Creates a context in which other signals know that changes are not user input
|
/// Creates a context in which other signals know that changes are not user input.
|
||||||
|
/// This avoids things like loops between value change signals.
|
||||||
#[derive(Default, Clone, Debug)]
|
#[derive(Default, Clone, Debug)]
|
||||||
struct UiUpdates {
|
struct UiUpdates {
|
||||||
disabled: Rc<Cell<bool>>,
|
disabled: Rc<Cell<bool>>,
|
||||||
|
|
@ -306,12 +307,10 @@ mod imp {
|
||||||
glib::clone!(@weak obj => move |_| obj.on_margin_unit_changed()),
|
glib::clone!(@weak obj => move |_| obj.on_margin_unit_changed()),
|
||||||
);
|
);
|
||||||
self.margin_unit.set_expression(Some(Unit::expression()));
|
self.margin_unit.set_expression(Some(Unit::expression()));
|
||||||
self.margin_horizontal.connect_value_notify(
|
self.margin_horizontal
|
||||||
glib::clone!(@weak obj => move |_| obj.on_margin_horizontal_changed()),
|
.connect_value_notify(glib::clone!(@weak obj => move |_| obj.on_margin_changed()));
|
||||||
);
|
self.margin_vertical
|
||||||
self.margin_vertical.connect_value_notify(
|
.connect_value_notify(glib::clone!(@weak obj => move |_| obj.on_margin_changed()));
|
||||||
glib::clone!(@weak obj => move |_| obj.on_margin_vertical_changed()),
|
|
||||||
);
|
|
||||||
|
|
||||||
// Size signals
|
// Size signals
|
||||||
self.size_unit.connect_selected_notify(
|
self.size_unit.connect_selected_notify(
|
||||||
|
|
@ -390,7 +389,7 @@ mod imp {
|
||||||
};
|
};
|
||||||
obj.set_orientation(orientation);
|
obj.set_orientation(orientation);
|
||||||
|
|
||||||
obj.set_visible(true);
|
obj.present();
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
@ -458,10 +457,25 @@ impl LpPrint {
|
||||||
obj
|
obj
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Starts print preparation process by showing the print dialog
|
||||||
|
pub fn run(&self) -> Result<(), glib::Error> {
|
||||||
|
self.print_operation()
|
||||||
|
.run(
|
||||||
|
gtk::PrintOperationAction::PrintDialog,
|
||||||
|
self.imp().parent_window.get(),
|
||||||
|
)
|
||||||
|
.map(|_| ())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns if the current update is caused by user input
|
||||||
|
///
|
||||||
|
/// If ui input is changed via code, this is set to `false`
|
||||||
|
/// via `disable_ui_updates` before.
|
||||||
fn ui_updates(&self) -> bool {
|
fn ui_updates(&self) -> bool {
|
||||||
!self.imp().ui_updates.disabled.get()
|
!self.imp().ui_updates.disabled.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates scope guard that allows ui changes via code afterwards
|
||||||
fn disable_ui_updates(&self) -> UiUpdates {
|
fn disable_ui_updates(&self) -> UiUpdates {
|
||||||
self.imp().ui_updates.disable()
|
self.imp().ui_updates.disable()
|
||||||
}
|
}
|
||||||
|
|
@ -536,6 +550,7 @@ impl LpPrint {
|
||||||
f64::max(1., self.imp().width.value() / self.width_unit_factor())
|
f64::max(1., self.imp().width.value() / self.width_unit_factor())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns user selected image height in pixels
|
||||||
pub fn user_height(&self) -> f64 {
|
pub fn user_height(&self) -> f64 {
|
||||||
let (_, orig_height) = self.image().image_size();
|
let (_, orig_height) = self.image().image_size();
|
||||||
|
|
||||||
|
|
@ -549,7 +564,7 @@ impl LpPrint {
|
||||||
self.user_width() / orig_width as f64
|
self.user_width() / orig_width as f64
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn on_margin_horizontal_changed(&self) {
|
pub fn on_margin_changed(&self) {
|
||||||
if self.ui_updates() {
|
if self.ui_updates() {
|
||||||
let _ui_updates_disabled = self.disable_ui_updates();
|
let _ui_updates_disabled = self.disable_ui_updates();
|
||||||
self.set_ranges();
|
self.set_ranges();
|
||||||
|
|
@ -566,6 +581,7 @@ impl LpPrint {
|
||||||
self.imp().margin_horizontal.value() / self.margin_unit_factor()
|
self.imp().margin_horizontal.value() / self.margin_unit_factor()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns left margin that positions the image according to user settings
|
||||||
pub fn effective_margin_left(&self) -> f64 {
|
pub fn effective_margin_left(&self) -> f64 {
|
||||||
match self.user_alignment().horizontal {
|
match self.user_alignment().horizontal {
|
||||||
HAlignment::Left => self.user_margin_horizontal(),
|
HAlignment::Left => self.user_margin_horizontal(),
|
||||||
|
|
@ -576,27 +592,16 @@ impl LpPrint {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns width of physical paper in pixels
|
||||||
pub fn paper_width(&self) -> f64 {
|
pub fn paper_width(&self) -> f64 {
|
||||||
self.page_setup().paper_width(gtk::Unit::Inch) * self.dpi()
|
self.page_setup().paper_width(gtk::Unit::Inch) * self.dpi()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns height of physical paper in pixels
|
||||||
pub fn paper_height(&self) -> f64 {
|
pub fn paper_height(&self) -> f64 {
|
||||||
self.page_setup().paper_height(gtk::Unit::Inch) * self.dpi()
|
self.page_setup().paper_height(gtk::Unit::Inch) * self.dpi()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn on_margin_vertical_changed(&self) {
|
|
||||||
if self.ui_updates() {
|
|
||||||
let _ui_updates_disabled = self.disable_ui_updates();
|
|
||||||
self.set_ranges();
|
|
||||||
if self.fill_space() {
|
|
||||||
let _ui_updates_disabled = self.disable_ui_updates();
|
|
||||||
self.update_width();
|
|
||||||
self.update_height();
|
|
||||||
}
|
|
||||||
self.draw_preview();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns user selected top margin in pixels
|
/// Returns user selected top margin in pixels
|
||||||
pub fn user_margin_vertical(&self) -> f64 {
|
pub fn user_margin_vertical(&self) -> f64 {
|
||||||
self.imp().margin_vertical.value() / self.margin_unit_factor()
|
self.imp().margin_vertical.value() / self.margin_unit_factor()
|
||||||
|
|
@ -654,6 +659,7 @@ impl LpPrint {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns width that makes the image fill the page
|
||||||
fn fill_space_width(&self) -> f64 {
|
fn fill_space_width(&self) -> f64 {
|
||||||
let width1 = self.paper_width() - 2. * self.user_margin_horizontal();
|
let width1 = self.paper_width() - 2. * self.user_margin_horizontal();
|
||||||
|
|
||||||
|
|
@ -664,12 +670,14 @@ impl LpPrint {
|
||||||
f64::min(width1, width2)
|
f64::min(width1, width2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns height that makes the image fill the page
|
||||||
fn fill_space_height(&self) -> f64 {
|
fn fill_space_height(&self) -> f64 {
|
||||||
let (orig_width, orig_height) = self.image().image_size();
|
let (orig_width, orig_height) = self.image().image_size();
|
||||||
|
|
||||||
self.fill_space_width() * orig_height as f64 / orig_width as f64
|
self.fill_space_width() * orig_height as f64 / orig_width as f64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Updates width according to margins if fill space is activated
|
||||||
fn update_width(&self) {
|
fn update_width(&self) {
|
||||||
if self.fill_space() {
|
if self.fill_space() {
|
||||||
let value = self
|
let value = self
|
||||||
|
|
@ -679,6 +687,7 @@ impl LpPrint {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Updates height according to width
|
||||||
fn update_height(&self) {
|
fn update_height(&self) {
|
||||||
let height = if self.fill_space() {
|
let height = if self.fill_space() {
|
||||||
self.fill_space_height()
|
self.fill_space_height()
|
||||||
|
|
@ -741,6 +750,7 @@ impl LpPrint {
|
||||||
self.draw_preview();
|
self.draw_preview();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns if the option to fill the page with the image is activated
|
||||||
pub fn fill_space(&self) -> bool {
|
pub fn fill_space(&self) -> bool {
|
||||||
self.imp().fill_space.is_active()
|
self.imp().fill_space.is_active()
|
||||||
}
|
}
|
||||||
|
|
@ -754,15 +764,6 @@ impl LpPrint {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run(&self) {
|
|
||||||
self.print_operation()
|
|
||||||
.run(
|
|
||||||
gtk::PrintOperationAction::PrintDialog,
|
|
||||||
self.imp().parent_window.get(),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn page_setup(&self) -> gtk::PageSetup {
|
pub fn page_setup(&self) -> gtk::PageSetup {
|
||||||
self.print_operation().default_page_setup()
|
self.print_operation().default_page_setup()
|
||||||
}
|
}
|
||||||
|
|
@ -776,7 +777,11 @@ impl LpPrint {
|
||||||
self.print_operation().print_settings(),
|
self.print_operation().print_settings(),
|
||||||
Some(self.print_operation().default_page_setup()),
|
Some(self.print_operation().default_page_setup()),
|
||||||
);
|
);
|
||||||
print.run();
|
let res = print.run();
|
||||||
|
|
||||||
|
if let Err(err) = res {
|
||||||
|
log::warn!("Print dialog error: {err}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Initialize actual print operation
|
/// Initialize actual print operation
|
||||||
|
|
@ -806,12 +811,14 @@ impl LpPrint {
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
print_operation
|
let res = print_operation.run(
|
||||||
.run(
|
gtk::PrintOperationAction::Print,
|
||||||
gtk::PrintOperationAction::Print,
|
Some(&self.parent_window()),
|
||||||
Some(&self.parent_window()),
|
);
|
||||||
)
|
|
||||||
.unwrap();
|
if let Err(err) = res {
|
||||||
|
log::warn!("Print error: {err}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Draw PDF for printing
|
/// Draw PDF for printing
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue