Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rclone-shuttle"
version = "0.1.7"
version = "0.1.8"
edition = "2021"
exclude = [
".flatpak-builder",
Expand Down
1 change: 1 addition & 0 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ fn main() {
"info-outline",
"minus-circle-filled",
"brush",
"leaflet",
],
);
}
17 changes: 0 additions & 17 deletions icons.toml

This file was deleted.

16 changes: 16 additions & 0 deletions meta/io.github.pieterdd.RcloneShuttle.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
</screenshots>

<url type="homepage">https://github.com/pieterdd/RcloneShuttle</url>
<url type="vcs-browser">https://github.com/pieterdd/RcloneShuttle</url>

<description>
<p>
Expand Down Expand Up @@ -81,6 +82,11 @@
</description>

<releases>
<release version="0.1.8" date="2026-01-10">
<description>
<p>Improve compatibility with small screens</p>
</description>
</release>
<release version="0.1.7" date="2025-12-19">
<description>
<ul>
Expand Down Expand Up @@ -147,4 +153,14 @@
</releases>

<launchable type="desktop-id">io.github.pieterdd.RcloneShuttle.desktop</launchable>

<recommends>
<control>keyboard</control>
<control>pointing</control>
<control>touch</control>
</recommends>

<requires>
<display_length compare="ge">410</display_length>
</requires>
</component>
2 changes: 1 addition & 1 deletion src/components/queue_dialog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ impl Component for QueueDialog {
set_margin_all: 20,
set_margin_top: 0,
set_spacing: 20,
set_width_request: 500,

#[local_ref]
ongoing_queue_view -> adw::PreferencesGroup {
Expand Down Expand Up @@ -106,6 +105,7 @@ impl Component for QueueDialog {
set_sensitive: !model.terminated_queue_wrapper.is_empty(),
set_tooltip_text: Some("Clear terminated jobs"),
connect_clicked => Self::Input::CleanNonOngoingJobs,
set_margin_start: 10,
},

add = &adw::PreferencesRow {
Expand Down
53 changes: 46 additions & 7 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,14 @@ use globals::JOBS;
use model::{RcloneJob, RcloneJobType};
use path_tools::RclonePath;
use relm4::actions::{AccelsPlus, RelmAction, RelmActionGroup};
use relm4::adw::prelude::{AlertDialogExt, NavigationPageExt};
use relm4::adw::prelude::{AdwApplicationWindowExt, AlertDialogExt, NavigationPageExt};
use relm4::adw::ToolbarStyle;
use relm4::factory::FactoryVecDeque;
use relm4::gtk::gdk::{DragAction, FileList};
use relm4::gtk::prelude::{
BoxExt, EntryExt, FileExt, GtkWindowExt, OrientableExt, StaticType, WidgetExt,
};
use relm4::gtk::{self};
use relm4::gtk::{self, glib};
use relm4::typed_view::list::TypedListView;
use relm4::ComponentParts;
use relm4::ComponentSender;
Expand Down Expand Up @@ -122,6 +122,8 @@ pub enum AppInMsg {
FilePickerModeChange(FilePickerMode),
DownloadRequested,
DownloadPathConfirmed(RclonePath),
RevealSidebar,
SplitCollapsed(bool),
NoOperation,
}

Expand Down Expand Up @@ -153,6 +155,8 @@ struct App {
selected_file_listing_copy: Option<RcloneFileListing>,
active_string_prompt: Option<Controller<StringPromptDialog>>,
save_copy_dialog: Option<Controller<SaveDialog>>,
split_collapsed: bool,
reveal_files_on_small_screens: bool,
}

impl App {
Expand Down Expand Up @@ -186,14 +190,34 @@ impl Component for App {
set_title: Some("Rclone Shuttle"),
set_default_size: (800, 600),

add_breakpoint = adw::Breakpoint::new(adw::BreakpointCondition::new_length(
adw::BreakpointConditionLengthType::MaxWidth,
500.0,
adw::LengthUnit::Sp,
)) {
add_setter: (
&split_view,
"collapsed",
Some(&glib::Value::from(&true))
)
},
adw::ToolbarView {
set_top_bar_style: ToolbarStyle::Raised,
add_top_bar = &adw::HeaderBar {
pack_start = &gtk::MenuButton {
set_icon_name: icon_names::MENU,
set_tooltip_text: Some("Menu"),
#[wrap(Some)]
set_popover = &gtk::PopoverMenu::from_model(Some(&main_menu)) {}
pack_start = &gtk::Box {
gtk::Button {
#[watch]
set_visible: model.reveal_files_on_small_screens && model.split_collapsed,
set_icon_name: icon_names::LEAFLET,
set_tooltip_text: Some("Open sidebar"),
connect_clicked => Self::Input::RevealSidebar,
},
gtk::MenuButton {
set_icon_name: icon_names::MENU,
set_tooltip_text: Some("Menu"),
#[wrap(Some)]
set_popover = &gtk::PopoverMenu::from_model(Some(&main_menu)) {}
}
}
},

Expand All @@ -216,7 +240,13 @@ impl Component for App {
set_icon_name: Some(icon_names::INFO_OUTLINE),
}
} else {
#[name = "split_view"]
adw::NavigationSplitView {
#[watch]
set_show_content: model.reveal_files_on_small_screens,
connect_collapsed_notify[sender] => move |value| {
sender.input(Self::Input::SplitCollapsed(value.is_collapsed()));
},
#[wrap(Some)]
set_sidebar = &adw::NavigationPage {
set_title: "Remotes",
Expand Down Expand Up @@ -561,6 +591,8 @@ impl Component for App {
selected_file_listing_copy: None,
active_string_prompt: None,
save_copy_dialog: None,
reveal_files_on_small_screens: false,
split_collapsed: false,
};
let remotes_view = model.remotes_view_wrapper.widget();
let file_listing_view = &model.file_listing_view_wrapper.view;
Expand Down Expand Up @@ -771,6 +803,7 @@ impl Component for App {
dialog.show(Some(root));
}
Self::Input::RemoteSelectionChanged(row) => {
self.reveal_files_on_small_screens = true;
let raw_path = self.remotes_view_wrapper.get(row).unwrap().name.clone();
let path = RclonePath::from(&raw_path);
if path != self.path {
Expand Down Expand Up @@ -1186,6 +1219,12 @@ impl Component for App {
});
}
},
Self::Input::RevealSidebar => {
self.reveal_files_on_small_screens = false;
}
Self::Input::SplitCollapsed(value) => {
self.split_collapsed = value;
}
Self::Input::NoOperation => {},
}
}
Expand Down