diff --git a/Cargo.lock b/Cargo.lock
index 85f20c7..0088458 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -182,7 +182,7 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]]
name = "comicviewer"
-version = "0.2.5"
+version = "0.2.6"
dependencies = [
"anyhow",
"chrono",
diff --git a/Cargo.toml b/Cargo.toml
index 0e39e2c..b37e02f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "comicviewer"
-version = "0.2.5"
+version = "0.2.6"
edition = "2024"
description = "A comic archive viewer for local and remote locations"
license = "GPL-3.0-or-later"
diff --git a/data/io.github.comicviewer.Comicviewer.metainfo.xml b/data/io.github.comicviewer.Comicviewer.metainfo.xml
index 7d8fb58..1025231 100644
--- a/data/io.github.comicviewer.Comicviewer.metainfo.xml
+++ b/data/io.github.comicviewer.Comicviewer.metainfo.xml
@@ -26,6 +26,7 @@
+
diff --git a/docs/INSTALL.ko.md b/docs/INSTALL.ko.md
index 1094e7f..bf92e93 100644
--- a/docs/INSTALL.ko.md
+++ b/docs/INSTALL.ko.md
@@ -89,7 +89,11 @@ Comicviewer는 XDG 표준 경로를 사용합니다.
- `Home`과 `End`: 폴더의 첫 번째/마지막 파일 열기
- 동영상에서 `←`와 `→`: 5초 뒤/앞으로 이동
- 동영상에서 `↑`와 `↓`: 음량을 5%씩 조절
-- `파일 목록`: 우측 폴더 목록 표시 또는 숨기기
+- `L`: 우측 파일 목록 표시 또는 숨기기
+- 이미지에서 `+`와 `-`: 현재 화면의 이미지를 임시로 10%씩 확대 또는 축소
+- 이미지에서 `Ctrl` + 마우스 휠: 현재 화면의 이미지를 임시로 10%씩 확대 또는 축소
+- 전체 화면에서 마우스 클릭: 숨겨진 컨트롤을 5초 동안 표시
+- 전체 화면에서 `←`, `→`, `↑`, `↓`: 컨트롤을 즉시 숨기고 해당 키 동작 실행
- 파일 목록의 더블클릭 또는 선택 후 `Enter`: 해당 파일 열기
- 파일 목록의 우클릭: 즐겨찾기 추가·제거 또는 다운로드
- 메인 창이나 뷰어에 로컬 파일 드롭: 부모 폴더를 열고 새 뷰어에서 해당 파일 열기
diff --git a/docs/RELEASING.ko.md b/docs/RELEASING.ko.md
index 8437a92..15dedde 100644
--- a/docs/RELEASING.ko.md
+++ b/docs/RELEASING.ko.md
@@ -55,7 +55,7 @@ AppImage 빌드가 끝나면 다음 스크립트로 체크섬과 통합 `tar.gz`
스크립트는 `Cargo.toml`에서 버전을 읽고 다음 파일을 생성합니다.
-- `dist/Comicviewer-0.2.5-x86_64.AppImage.sha256`
+- `dist/Comicviewer-0.2.6-x86_64.AppImage.sha256`
- `dist/Comicviewer-latest-x86_64.tar.gz`
- `dist/Comicviewer-latest-x86_64.tar.gz.sha256`
@@ -78,10 +78,10 @@ sha256sum -c Comicviewer-latest-x86_64.tar.gz.sha256
```sh
git add Cargo.toml Cargo.lock data packaging README.md docs
-git commit -m "Release v0.2.5"
-git tag -a v0.2.5 -m "Comicviewer v0.2.5"
+git commit -m "Release v0.2.6"
+git tag -a v0.2.6 -m "Comicviewer v0.2.6"
git push origin main
-git push origin v0.2.5
+git push origin v0.2.6
```
이미 원격에 공개한 태그는 이동하거나 덮어쓰지 않습니다. 수정이 필요하면 새
diff --git a/src/viewer.rs b/src/viewer.rs
index 05dfd18..29d68ad 100644
--- a/src/viewer.rs
+++ b/src/viewer.rs
@@ -20,6 +20,9 @@ const FAST_CACHE_LIMIT_BYTES: usize = 1024 * 1024 * 1024;
const FAST_CACHE_LIMIT_PAGES: usize = 64;
const VIDEO_SEEK_STEP_US: i64 = 5_000_000;
const VIDEO_VOLUME_STEP: f64 = 0.05;
+const IMAGE_ZOOM_STEP: f64 = 0.1;
+const IMAGE_ZOOM_MIN: f64 = 0.1;
+const IMAGE_ZOOM_MAX: f64 = 4.0;
const VIEWER_CONTROLLER_KEY: &str = "comicviewer-viewer-controller";
const MEDIA_VIEWER_CONTROLLER_KEY: &str = "comicviewer-media-viewer-controller";
@@ -60,15 +63,15 @@ pub(crate) fn set_viewer_loading(window: >k::ApplicationWindow, loading: bool)
if !window.has_css_class("viewer-loading") || !window.is_fullscreen() {
return glib::Propagation::Proceed;
}
- if let Some(titlebar) = window.titlebar() {
- titlebar.set_visible(true);
- }
if key == gdk::Key::Escape
|| key
.to_unicode()
.is_some_and(|character| character.eq_ignore_ascii_case(&'f'))
{
window.unfullscreen();
+ if let Some(titlebar) = window.titlebar() {
+ titlebar.set_visible(true);
+ }
return glib::Propagation::Stop;
}
glib::Propagation::Proceed
@@ -348,6 +351,11 @@ impl ViewerWindow {
spread_box.set_homogeneous(true);
spread_box.append(&left_picture);
spread_box.append(&right_picture);
+ let spread_scrolled = gtk::ScrolledWindow::builder()
+ .hexpand(true)
+ .vexpand(true)
+ .child(&spread_box)
+ .build();
let continuous_box = gtk::Box::new(gtk::Orientation::Vertical, 8);
continuous_box.set_halign(gtk::Align::Fill);
@@ -360,7 +368,7 @@ impl ViewerWindow {
stack.set_hexpand(true);
stack.set_vexpand(true);
stack.add_named(&single_scrolled, Some("single"));
- stack.add_named(&spread_box, Some("spread"));
+ stack.add_named(&spread_scrolled, Some("spread"));
stack.add_named(&continuous_scrolled, Some("continuous"));
let spinner = gtk::Spinner::new();
@@ -408,6 +416,8 @@ impl ViewerWindow {
single_picture,
left_picture,
right_picture,
+ spread_box,
+ spread_scrolled,
continuous_box,
continuous_scrolled,
spinner,
@@ -439,9 +449,11 @@ impl ViewerWindow {
key_controller: RefCell::new(None),
motion_controller: RefCell::new(None),
fullscreen_key_controller: RefCell::new(None),
+ fullscreen_click_controller: RefCell::new(None),
fullscreen_ui_hide_timer: RefCell::new(None),
fullscreen_ui_visible: Cell::new(false),
fullscreen_notify_handler: RefCell::new(None),
+ image_zoom: Cell::new(1.0),
navigation_message,
navigation_message_label,
navigation_message_generation: Rc::new(Cell::new(0)),
@@ -563,6 +575,8 @@ struct ViewerController {
single_picture: gtk::Picture,
left_picture: gtk::Picture,
right_picture: gtk::Picture,
+ spread_box: gtk::Box,
+ spread_scrolled: gtk::ScrolledWindow,
continuous_box: gtk::Box,
continuous_scrolled: gtk::ScrolledWindow,
spinner: gtk::Spinner,
@@ -594,9 +608,11 @@ struct ViewerController {
key_controller: RefCell