Release v0.2.11
This commit is contained in:
parent
f7c67c1a79
commit
068b697b60
5 changed files with 55 additions and 71 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -182,7 +182,7 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "comicviewer"
|
name = "comicviewer"
|
||||||
version = "0.2.10"
|
version = "0.2.11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "comicviewer"
|
name = "comicviewer"
|
||||||
version = "0.2.10"
|
version = "0.2.11"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
description = "A comic archive viewer for local and remote locations"
|
description = "A comic archive viewer for local and remote locations"
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
</provides>
|
</provides>
|
||||||
<content_rating type="oars-1.1" />
|
<content_rating type="oars-1.1" />
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="0.2.11" date="2026-07-24" />
|
||||||
<release version="0.2.10" date="2026-07-24" />
|
<release version="0.2.10" date="2026-07-24" />
|
||||||
<release version="0.2.9" date="2026-07-24" />
|
<release version="0.2.9" date="2026-07-24" />
|
||||||
<release version="0.2.8" date="2026-07-24" />
|
<release version="0.2.8" date="2026-07-24" />
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ AppImage 빌드가 끝나면 다음 스크립트로 체크섬과 통합 `tar.gz`
|
||||||
|
|
||||||
스크립트는 `Cargo.toml`에서 버전을 읽고 다음 파일을 생성합니다.
|
스크립트는 `Cargo.toml`에서 버전을 읽고 다음 파일을 생성합니다.
|
||||||
|
|
||||||
- `dist/Comicviewer-0.2.10-x86_64.AppImage.sha256`
|
- `dist/Comicviewer-0.2.11-x86_64.AppImage.sha256`
|
||||||
- `dist/Comicviewer-latest-x86_64.tar.gz`
|
- `dist/Comicviewer-latest-x86_64.tar.gz`
|
||||||
- `dist/Comicviewer-latest-x86_64.tar.gz.sha256`
|
- `dist/Comicviewer-latest-x86_64.tar.gz.sha256`
|
||||||
|
|
||||||
|
|
@ -78,10 +78,10 @@ sha256sum -c Comicviewer-latest-x86_64.tar.gz.sha256
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git add Cargo.toml Cargo.lock data packaging README.md docs
|
git add Cargo.toml Cargo.lock data packaging README.md docs
|
||||||
git commit -m "Release v0.2.10"
|
git commit -m "Release v0.2.11"
|
||||||
git tag -a v0.2.10 -m "Comicviewer v0.2.10"
|
git tag -a v0.2.11 -m "Comicviewer v0.2.11"
|
||||||
git push origin main
|
git push origin main
|
||||||
git push origin v0.2.10
|
git push origin v0.2.11
|
||||||
```
|
```
|
||||||
|
|
||||||
이미 원격에 공개한 태그는 이동하거나 덮어쓰지 않습니다. 수정이 필요하면 새
|
이미 원격에 공개한 태그는 이동하거나 덮어쓰지 않습니다. 수정이 필요하면 새
|
||||||
|
|
|
||||||
113
src/viewer.rs
113
src/viewer.rs
|
|
@ -640,7 +640,7 @@ struct ViewerController {
|
||||||
key_controller: RefCell<Option<gtk::EventControllerKey>>,
|
key_controller: RefCell<Option<gtk::EventControllerKey>>,
|
||||||
motion_controller: RefCell<Option<gtk::EventControllerMotion>>,
|
motion_controller: RefCell<Option<gtk::EventControllerMotion>>,
|
||||||
fullscreen_key_controller: RefCell<Option<gtk::EventControllerKey>>,
|
fullscreen_key_controller: RefCell<Option<gtk::EventControllerKey>>,
|
||||||
fullscreen_click_controller: RefCell<Option<gtk::GestureClick>>,
|
fullscreen_click_controller: RefCell<Option<gtk::EventControllerLegacy>>,
|
||||||
fullscreen_ui_hide_timer: RefCell<Option<glib::SourceId>>,
|
fullscreen_ui_hide_timer: RefCell<Option<glib::SourceId>>,
|
||||||
fullscreen_ui_visible: Cell<bool>,
|
fullscreen_ui_visible: Cell<bool>,
|
||||||
fullscreen_notify_handler: RefCell<Option<glib::SignalHandlerId>>,
|
fullscreen_notify_handler: RefCell<Option<glib::SignalHandlerId>>,
|
||||||
|
|
@ -786,29 +786,24 @@ impl ViewerController {
|
||||||
controller.seek_page(index);
|
controller.seek_page(index);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
let seek_click = gtk::GestureClick::builder()
|
let seek_events = gtk::EventControllerLegacy::new();
|
||||||
.button(gdk::BUTTON_PRIMARY)
|
seek_events.set_propagation_phase(gtk::PropagationPhase::Capture);
|
||||||
.propagation_phase(gtk::PropagationPhase::Capture)
|
|
||||||
.build();
|
|
||||||
let controller = Rc::downgrade(self);
|
let controller = Rc::downgrade(self);
|
||||||
seek_click.connect_pressed(move |_, _, _, _| {
|
seek_events.connect_event(move |_, event| {
|
||||||
if let Some(controller) = controller.upgrade() {
|
if event
|
||||||
controller.begin_seek_interaction();
|
.downcast_ref::<gdk::ButtonEvent>()
|
||||||
|
.is_some_and(|event| event.button() == gdk::BUTTON_PRIMARY)
|
||||||
|
&& let Some(controller) = controller.upgrade()
|
||||||
|
{
|
||||||
|
match event.event_type() {
|
||||||
|
gdk::EventType::ButtonPress => controller.begin_seek_interaction(),
|
||||||
|
gdk::EventType::ButtonRelease => controller.end_seek_interaction(),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
glib::Propagation::Proceed
|
||||||
});
|
});
|
||||||
let controller = Rc::downgrade(self);
|
self.page_seek.add_controller(seek_events);
|
||||||
seek_click.connect_released(move |_, _, _, _| {
|
|
||||||
if let Some(controller) = controller.upgrade() {
|
|
||||||
controller.end_seek_interaction();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
let controller = Rc::downgrade(self);
|
|
||||||
seek_click.connect_cancel(move |_, _| {
|
|
||||||
if let Some(controller) = controller.upgrade() {
|
|
||||||
controller.end_seek_interaction();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
self.page_seek.add_controller(seek_click);
|
|
||||||
|
|
||||||
let adjustment = self.continuous_scrolled.vadjustment();
|
let adjustment = self.continuous_scrolled.vadjustment();
|
||||||
let controller = Rc::downgrade(self);
|
let controller = Rc::downgrade(self);
|
||||||
|
|
@ -895,15 +890,17 @@ impl ViewerController {
|
||||||
});
|
});
|
||||||
self.stack.add_controller(scroll_controller);
|
self.stack.add_controller(scroll_controller);
|
||||||
|
|
||||||
let fullscreen_click = gtk::GestureClick::builder()
|
let fullscreen_click = gtk::EventControllerLegacy::new();
|
||||||
.button(0)
|
fullscreen_click.set_propagation_phase(gtk::PropagationPhase::Capture);
|
||||||
.propagation_phase(gtk::PropagationPhase::Capture)
|
|
||||||
.build();
|
|
||||||
let controller = Rc::downgrade(self);
|
let controller = Rc::downgrade(self);
|
||||||
fullscreen_click.connect_pressed(move |_, _, _, _| {
|
fullscreen_click.connect_event(move |_, event| {
|
||||||
if let Some(controller) = controller.upgrade() {
|
if event.downcast_ref::<gdk::ButtonEvent>().is_some()
|
||||||
|
&& event.event_type() == gdk::EventType::ButtonPress
|
||||||
|
&& let Some(controller) = controller.upgrade()
|
||||||
|
{
|
||||||
controller.controls_clicked();
|
controller.controls_clicked();
|
||||||
}
|
}
|
||||||
|
glib::Propagation::Proceed
|
||||||
});
|
});
|
||||||
self.window.add_controller(fullscreen_click.clone());
|
self.window.add_controller(fullscreen_click.clone());
|
||||||
self.fullscreen_click_controller
|
self.fullscreen_click_controller
|
||||||
|
|
@ -2440,7 +2437,7 @@ struct MediaViewerController {
|
||||||
key_controller: RefCell<Option<gtk::EventControllerKey>>,
|
key_controller: RefCell<Option<gtk::EventControllerKey>>,
|
||||||
motion_controller: RefCell<Option<gtk::EventControllerMotion>>,
|
motion_controller: RefCell<Option<gtk::EventControllerMotion>>,
|
||||||
fullscreen_key_controller: RefCell<Option<gtk::EventControllerKey>>,
|
fullscreen_key_controller: RefCell<Option<gtk::EventControllerKey>>,
|
||||||
fullscreen_click_controller: RefCell<Option<gtk::GestureClick>>,
|
fullscreen_click_controller: RefCell<Option<gtk::EventControllerLegacy>>,
|
||||||
fullscreen_ui_hide_timer: RefCell<Option<glib::SourceId>>,
|
fullscreen_ui_hide_timer: RefCell<Option<glib::SourceId>>,
|
||||||
fullscreen_ui_visible: Cell<bool>,
|
fullscreen_ui_visible: Cell<bool>,
|
||||||
fullscreen_notify_handler: RefCell<Option<glib::SignalHandlerId>>,
|
fullscreen_notify_handler: RefCell<Option<glib::SignalHandlerId>>,
|
||||||
|
|
@ -2451,15 +2448,17 @@ struct MediaViewerController {
|
||||||
|
|
||||||
impl MediaViewerController {
|
impl MediaViewerController {
|
||||||
fn connect_signals(self: &Rc<Self>) {
|
fn connect_signals(self: &Rc<Self>) {
|
||||||
let fullscreen_click = gtk::GestureClick::builder()
|
let fullscreen_click = gtk::EventControllerLegacy::new();
|
||||||
.button(0)
|
fullscreen_click.set_propagation_phase(gtk::PropagationPhase::Capture);
|
||||||
.propagation_phase(gtk::PropagationPhase::Capture)
|
|
||||||
.build();
|
|
||||||
let controller = Rc::downgrade(self);
|
let controller = Rc::downgrade(self);
|
||||||
fullscreen_click.connect_pressed(move |_, _, _, _| {
|
fullscreen_click.connect_event(move |_, event| {
|
||||||
if let Some(controller) = controller.upgrade() {
|
if event.downcast_ref::<gdk::ButtonEvent>().is_some()
|
||||||
|
&& event.event_type() == gdk::EventType::ButtonPress
|
||||||
|
&& let Some(controller) = controller.upgrade()
|
||||||
|
{
|
||||||
controller.controls_clicked();
|
controller.controls_clicked();
|
||||||
}
|
}
|
||||||
|
glib::Propagation::Proceed
|
||||||
});
|
});
|
||||||
self.window.add_controller(fullscreen_click.clone());
|
self.window.add_controller(fullscreen_click.clone());
|
||||||
self.fullscreen_click_controller
|
self.fullscreen_click_controller
|
||||||
|
|
@ -2740,29 +2739,24 @@ impl MediaViewerController {
|
||||||
controller.schedule_seek(index);
|
controller.schedule_seek(index);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
let seek_click = gtk::GestureClick::builder()
|
let seek_events = gtk::EventControllerLegacy::new();
|
||||||
.button(gdk::BUTTON_PRIMARY)
|
seek_events.set_propagation_phase(gtk::PropagationPhase::Capture);
|
||||||
.propagation_phase(gtk::PropagationPhase::Capture)
|
|
||||||
.build();
|
|
||||||
let controller = Rc::downgrade(self);
|
let controller = Rc::downgrade(self);
|
||||||
seek_click.connect_pressed(move |_, _, _, _| {
|
seek_events.connect_event(move |_, event| {
|
||||||
if let Some(controller) = controller.upgrade() {
|
if event
|
||||||
controller.begin_seek_interaction();
|
.downcast_ref::<gdk::ButtonEvent>()
|
||||||
|
.is_some_and(|event| event.button() == gdk::BUTTON_PRIMARY)
|
||||||
|
&& let Some(controller) = controller.upgrade()
|
||||||
|
{
|
||||||
|
match event.event_type() {
|
||||||
|
gdk::EventType::ButtonPress => controller.begin_seek_interaction(),
|
||||||
|
gdk::EventType::ButtonRelease => controller.end_seek_interaction(),
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
glib::Propagation::Proceed
|
||||||
});
|
});
|
||||||
let controller = Rc::downgrade(self);
|
self.media_seek.add_controller(seek_events);
|
||||||
seek_click.connect_released(move |_, _, _, _| {
|
|
||||||
if let Some(controller) = controller.upgrade() {
|
|
||||||
controller.end_seek_interaction();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
let controller = Rc::downgrade(self);
|
|
||||||
seek_click.connect_cancel(move |_, _| {
|
|
||||||
if let Some(controller) = controller.upgrade() {
|
|
||||||
controller.cancel_seek_interaction();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
self.media_seek.add_controller(seek_click);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn refresh_file_list(&self) {
|
fn refresh_file_list(&self) {
|
||||||
|
|
@ -3064,17 +3058,6 @@ impl MediaViewerController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cancel_seek_interaction(self: &Rc<Self>) {
|
|
||||||
self.pending_seek_index.set(None);
|
|
||||||
if self.seek_interacting.replace(false) {
|
|
||||||
if self.window.is_fullscreen() {
|
|
||||||
self.show_fullscreen_ui_temporarily();
|
|
||||||
} else {
|
|
||||||
self.show_seek_temporarily();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn pointer_moved(self: &Rc<Self>, x: f64, y: f64) {
|
fn pointer_moved(self: &Rc<Self>, x: f64, y: f64) {
|
||||||
if self.last_pointer_position.get() == Some((x, y)) {
|
if self.last_pointer_position.get() == Some((x, y)) {
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue