From fbe0295f6d0ba1331b06a22baf0b04819e8ee773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Sun, 22 Oct 2023 12:18:41 +0200 Subject: [PATCH] Opening items --- Cargo.lock | 1 + czkawka_slint_gui/Cargo.toml | 1 + czkawka_slint_gui/src/connect_open.rs | 15 +++++++++++++++ czkawka_slint_gui/src/main.rs | 3 +++ czkawka_slint_gui/ui/common.slint | 5 +++++ czkawka_slint_gui/ui/main_lists.slint | 12 +++++++++++- czkawka_slint_gui/ui/main_window.slint | 3 +++ czkawka_slint_gui/ui/selectable_tree_view.slint | 17 ++++++++++++++++- 8 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 czkawka_slint_gui/src/connect_open.rs diff --git a/Cargo.lock b/Cargo.lock index dc88854..1cff485 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1329,6 +1329,7 @@ version = "6.1.0" dependencies = [ "chrono", "czkawka_core", + "open", "rand", "slint", "slint-build", diff --git a/czkawka_slint_gui/Cargo.toml b/czkawka_slint_gui/Cargo.toml index dd97e85..ee1e794 100644 --- a/czkawka_slint_gui/Cargo.toml +++ b/czkawka_slint_gui/Cargo.toml @@ -16,6 +16,7 @@ slint = { git = "https://github.com/slint-ui/slint.git", branch = "olivier/fix-3 rand = "0.8.5" czkawka_core = { version = "6.1.0", path = "../czkawka_core" } chrono = "0.4.31" +open="5.0.0" [build-dependencies] #slint-build = "1.2.2" diff --git a/czkawka_slint_gui/src/connect_open.rs b/czkawka_slint_gui/src/connect_open.rs new file mode 100644 index 0000000..7316790 --- /dev/null +++ b/czkawka_slint_gui/src/connect_open.rs @@ -0,0 +1,15 @@ +use crate::MainWindow; +use slint::{ComponentHandle, Model, ModelRc, SharedString, VecModel}; +use std::borrow::BorrowMut; + +pub fn connect_open_items(app: &MainWindow) { + app.on_item_opened(move |path| { + match open::that(&*path) { + Ok(_) => {} + Err(e) => { + eprintln!("Failed to open file: {}", e); + } + }; + // TODO - this should be added to line edit + }); +} diff --git a/czkawka_slint_gui/src/main.rs b/czkawka_slint_gui/src/main.rs index 8ae91f1..9c857a1 100644 --- a/czkawka_slint_gui/src/main.rs +++ b/czkawka_slint_gui/src/main.rs @@ -1,10 +1,12 @@ mod connect_delete; +mod connect_open; mod connect_scan; use std::path::Path; use std::rc::Rc; use crate::connect_delete::connect_delete_button; +use crate::connect_open::connect_open_items; use crate::connect_scan::connect_scan_button; use slint::{ModelRc, SharedString, VecModel}; @@ -17,6 +19,7 @@ fn main() { connect_delete_button(&app); connect_scan_button(&app); + connect_open_items(&app); app.run().unwrap(); } diff --git a/czkawka_slint_gui/ui/common.slint b/czkawka_slint_gui/ui/common.slint index 20f9cab..b1de472 100644 --- a/czkawka_slint_gui/ui/common.slint +++ b/czkawka_slint_gui/ui/common.slint @@ -2,4 +2,9 @@ export enum CurrentTab { EmptyFolders, EmptyFiles, SimilarImages, +} + +export enum TypeOfOpenedItem { + CurrentItem, + ParentItem, } \ No newline at end of file diff --git a/czkawka_slint_gui/ui/main_lists.slint b/czkawka_slint_gui/ui/main_lists.slint index 1cc1045..cfe6300 100644 --- a/czkawka_slint_gui/ui/main_lists.slint +++ b/czkawka_slint_gui/ui/main_lists.slint @@ -1,9 +1,10 @@ import { Button, VerticalBox , HorizontalBox, TabWidget, ListView, StandardListView, StandardTableView, CheckBox} from "std-widgets.slint"; import {SelectableTableView} from "selectable_tree_view.slint"; import {LeftSidePanel} from "left_side_panel.slint"; -import {CurrentTab} from "common.slint"; +import {CurrentTab, TypeOfOpenedItem} from "common.slint"; export component MainList { + callback item_opened(string); in-out property active-tab; in-out property <[{checked: bool, header_row: bool, selected_row: bool, val:[string]}]> empty_folder_model; @@ -18,6 +19,9 @@ export component MainList { last-column: "Modification Date"; column-sizes: [30px, 100px, 100px, 100px]; values <=> empty-folder-model; + parentPathIdx: 2; + fileNameIdx: 1; + item_opened(item) => {item_opened(item)} } if root.active-tab == CurrentTab.EmptyFiles: SelectableTableView { min-width: 200px; @@ -26,6 +30,9 @@ export component MainList { last-column: "Modification Date"; column-sizes: [30px, 100px, 100px, 100px]; values <=> empty-files-model; + parentPathIdx: 2; + fileNameIdx: 1; + item_opened(item) => {item_opened(item)} } if root.active-tab == CurrentTab.SimilarImages: SelectableTableView { min-width: 200px; @@ -34,5 +41,8 @@ export component MainList { last-column: "Modification Date"; column-sizes: [30px, 100px, 100px, 100px]; values <=> similar-images-model; + parentPathIdx: 2; + fileNameIdx: 1; + item_opened(item) => {item_opened(item)} } } \ No newline at end of file diff --git a/czkawka_slint_gui/ui/main_window.slint b/czkawka_slint_gui/ui/main_window.slint index 7d79dd7..21f4f63 100644 --- a/czkawka_slint_gui/ui/main_window.slint +++ b/czkawka_slint_gui/ui/main_window.slint @@ -8,6 +8,7 @@ import { ActionButtons } from "action_buttons.slint"; export component MainWindow inherits Window { callback deleted; callback scanned(CurrentTab); + callback item_opened(string); min-width: 300px; preferred-width: 1024px; min-height: 300px; @@ -68,6 +69,8 @@ export component MainWindow inherits Window { empty_folder_model <=> root.empty_folder_model; empty_files_model <=> root.empty_files_model; similar_images_model <=> root.similar_images_model; + + item_opened(item) => {item_opened(item)} } } ActionButtons { diff --git a/czkawka_slint_gui/ui/selectable_tree_view.slint b/czkawka_slint_gui/ui/selectable_tree_view.slint index 90de282..7288be5 100644 --- a/czkawka_slint_gui/ui/selectable_tree_view.slint +++ b/czkawka_slint_gui/ui/selectable_tree_view.slint @@ -1,14 +1,21 @@ import { Button, VerticalBox , HorizontalBox, TabWidget, ListView, StandardListView, StandardTableView, CheckBox} from "std-widgets.slint"; +import {TypeOfOpenedItem} from "common.slint"; export component SelectableTableView inherits Rectangle { + callback item_opened(string); + in property <[string]> columns; in property last_column; in-out property <[{checked: bool, header_row: bool, selected_row: bool, val:[string]}]> values; - in-out property <[length]> column_sizes: [200px, 100px, 100px, 100px]; + in-out property <[length]> column_sizes; private property <[length]> real_sizes: [0px,0px,0px,0px,0px,0px,0px,0px,0px,0px,0px,0px,0px,0px,0px,0px,0px,0px]; private property column_number: column-sizes.length + 1; + // This idx, starts from zero, but since first is always a checkbox, and is not in model.val values, remove 1 from idx + in-out property parentPathIdx; + in-out property fileNameIdx; + in-out property selected_item: -1; VerticalBox { @@ -74,6 +81,14 @@ export component SelectableTableView inherits Rectangle { } } } + pointer-event(event) => { + // TODO this should be clicked by double-click + if (event.button == PointerEventButton.right && event.kind == PointerEventKind.up) { + root.item_opened(r.val[root.parentPathIdx - 1]) + } else if (event.button == PointerEventButton.middle && event.kind == PointerEventKind.up) { + root.item_opened(r.val[root.parentPathIdx - 1] + "/" + r.val[root.fileNameIdx - 1]) + } + } } HorizontalLayout {