Add Servo page zoom support
This commit is contained in:
@@ -41,6 +41,9 @@ pub enum DomainError {
|
||||
#[error("invalid reading progress percent: {value}")]
|
||||
InvalidReadingProgressPercent { value: String },
|
||||
|
||||
#[error("invalid tab zoom percent: {value} (expected {min}-{max})")]
|
||||
InvalidZoomPercent { value: u16, min: u16, max: u16 },
|
||||
|
||||
#[error("invalid plugin manifest: {reason}")]
|
||||
InvalidPluginManifest { reason: String },
|
||||
|
||||
|
||||
@@ -60,7 +60,10 @@ pub use sync::{
|
||||
SyncConnectionState, SyncObjectKind, SyncObjectPolicy, SyncObjectState, SyncObjectStatus,
|
||||
SyncStatus,
|
||||
};
|
||||
pub use tab::{BrowserTab, TabFlags, TabState};
|
||||
pub use tab::{
|
||||
BrowserTab, DEFAULT_ZOOM_PERCENT, MAX_ZOOM_PERCENT, MIN_ZOOM_PERCENT, TabFlags, TabState,
|
||||
ZOOM_PERCENT_STEP, validate_zoom_percent,
|
||||
};
|
||||
pub use tab_group::TabGroup;
|
||||
pub use update::UpdatePolicy;
|
||||
pub use url_text::UrlText;
|
||||
|
||||
@@ -2,6 +2,11 @@ use std::time::SystemTime;
|
||||
|
||||
use crate::{DomainError, ProfileId, SpaceId, SplitId, TabGroupId, TabId, UrlText};
|
||||
|
||||
pub const DEFAULT_ZOOM_PERCENT: u16 = 100;
|
||||
pub const MIN_ZOOM_PERCENT: u16 = 25;
|
||||
pub const MAX_ZOOM_PERCENT: u16 = 500;
|
||||
pub const ZOOM_PERCENT_STEP: u16 = 10;
|
||||
|
||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||
pub enum TabState {
|
||||
Loading,
|
||||
@@ -34,6 +39,7 @@ pub struct BrowserTab {
|
||||
split_id: Option<SplitId>,
|
||||
sort_key: u64,
|
||||
sync_enabled: bool,
|
||||
zoom_percent: u16,
|
||||
created_at: SystemTime,
|
||||
last_active_at: SystemTime,
|
||||
}
|
||||
@@ -62,6 +68,7 @@ impl BrowserTab {
|
||||
split_id: None,
|
||||
sort_key: 0,
|
||||
sync_enabled: true,
|
||||
zoom_percent: DEFAULT_ZOOM_PERCENT,
|
||||
created_at,
|
||||
last_active_at: created_at,
|
||||
}
|
||||
@@ -209,6 +216,35 @@ impl BrowserTab {
|
||||
self.sync_enabled
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn zoom_percent(&self) -> u16 {
|
||||
self.zoom_percent
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn zoom_factor(&self) -> f32 {
|
||||
f32::from(self.zoom_percent) / f32::from(DEFAULT_ZOOM_PERCENT)
|
||||
}
|
||||
|
||||
pub fn set_zoom_percent(&mut self, zoom_percent: u16) -> Result<(), DomainError> {
|
||||
self.zoom_percent = validate_zoom_percent(zoom_percent)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn zoom_in(&mut self) {
|
||||
self.zoom_percent =
|
||||
self.zoom_percent.saturating_add(ZOOM_PERCENT_STEP).min(MAX_ZOOM_PERCENT);
|
||||
}
|
||||
|
||||
pub fn zoom_out(&mut self) {
|
||||
self.zoom_percent =
|
||||
self.zoom_percent.saturating_sub(ZOOM_PERCENT_STEP).max(MIN_ZOOM_PERCENT);
|
||||
}
|
||||
|
||||
pub fn reset_zoom(&mut self) {
|
||||
self.zoom_percent = DEFAULT_ZOOM_PERCENT;
|
||||
}
|
||||
|
||||
pub fn set_split_id(&mut self, split_id: SplitId) {
|
||||
self.split_id = Some(split_id);
|
||||
}
|
||||
@@ -230,3 +266,11 @@ impl BrowserTab {
|
||||
self.sync_enabled = sync_enabled;
|
||||
}
|
||||
}
|
||||
|
||||
pub fn validate_zoom_percent(value: u16) -> Result<u16, DomainError> {
|
||||
if (MIN_ZOOM_PERCENT..=MAX_ZOOM_PERCENT).contains(&value) {
|
||||
return Ok(value);
|
||||
}
|
||||
|
||||
Err(DomainError::InvalidZoomPercent { value, min: MIN_ZOOM_PERCENT, max: MAX_ZOOM_PERCENT })
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user