mirror of
https://github.com/13hannes11/toolbx-tuner.git
synced 2024-09-03 23:21:00 +02:00
Compare commits
16 Commits
v0.1.0
...
51-support
| Author | SHA1 | Date | |
|---|---|---|---|
| e9beaf3d80 | |||
| 56acda7aae | |||
| 308374396b | |||
| d036368dd0 | |||
| 3b9efb6963 | |||
| 81a0099663 | |||
|
|
dc44d223b2 | ||
| 5e28d5cb6a | |||
| a1c22fa714 | |||
| 14d948cfa3 | |||
|
|
ce85300e1c | ||
| 112cc6607c | |||
|
|
7fa5e2bf03 | ||
|
|
e9a1428084 | ||
|
|
0412bcd0f8 | ||
| 7987aeed8f |
31
.github/workflows/pre-release.yml
vendored
31
.github/workflows/pre-release.yml
vendored
@@ -8,25 +8,46 @@ name: build-and-prerelease
|
||||
|
||||
jobs:
|
||||
flatpak:
|
||||
name: Flatpak-prerelease
|
||||
name: "Flatpak"
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: bilelmoussaoui/flatpak-github-actions:gnome-46
|
||||
options: --privileged
|
||||
strategy:
|
||||
matrix:
|
||||
target: [ToolboxTuner, ToolboxTuner.Devel, ToolboxTuner.Screenshot]
|
||||
arch: [x86_64]
|
||||
include:
|
||||
- target: ToolboxTuner.Devel
|
||||
arch: aarch64
|
||||
# Don't fail the whole workflow if one architecture fails
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
lfs: true
|
||||
# Docker is required by the docker/setup-qemu-action which enables emulation
|
||||
- name: Install deps
|
||||
if: ${{ matrix.arch != 'x86_64' }}
|
||||
run: |
|
||||
dnf -y install docker
|
||||
- name: Set up QEMU
|
||||
if: ${{ matrix.arch != 'x86_64' }}
|
||||
id: qemu
|
||||
uses: docker/setup-qemu-action@v2
|
||||
with:
|
||||
platforms: arm64
|
||||
- uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v6.3
|
||||
with:
|
||||
bundle: toolboxtuner.flatpak
|
||||
manifest-path: build-aux/org.kuchelmeister.ToolboxTuner.Devel.json
|
||||
bundle: ${{ matrix.target }}.${{ matrix.arch }}.flatpak
|
||||
manifest-path: build-aux/org.kuchelmeister.${{ matrix.target }}.json
|
||||
run-tests: true
|
||||
cache-key: flatpak-builder-${{ github.sha }}
|
||||
upload-artifact: false
|
||||
arch: ${{ matrix.arch }}
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: flatpak
|
||||
name: flatpak-release-${{ matrix.target }}-${{ matrix.arch }}
|
||||
path: |
|
||||
*.flatpak
|
||||
vendor:
|
||||
@@ -61,7 +82,7 @@ jobs:
|
||||
automatic_release_tag: dev
|
||||
title: 'Latest Development Build'
|
||||
files: |
|
||||
**/*.flatpak
|
||||
**/*.Devel.*.flatpak
|
||||
**/*.tar.gz
|
||||
**/*.sha256sum
|
||||
|
||||
|
||||
490
Cargo.lock
generated
490
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -12,7 +12,7 @@ lto = true
|
||||
gettext-rs = { version = "0.7", features = ["gettext-system"] }
|
||||
tracing = "0.1"
|
||||
tracing-subscriber = "0.3"
|
||||
relm4 = { version = "0.8.1", features = ["libadwaita", "gnome_46", "macros"] }
|
||||
relm4-icons = { version = "0.8.1" }
|
||||
relm4 = { version = "0.9", features = ["libadwaita", "gnome_46", "macros"] }
|
||||
relm4-icons = { version = "0.9" }
|
||||
serde = { version = "1.0.199", features = ["derive"] }
|
||||
serde_json = "1.0.116"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"sdk" : "org.gnome.Sdk",
|
||||
"sdk-extensions" : [
|
||||
"org.freedesktop.Sdk.Extension.rust-stable",
|
||||
"org.freedesktop.Sdk.Extension.llvm15"
|
||||
"org.freedesktop.Sdk.Extension.llvm18"
|
||||
],
|
||||
"command" : "toolbox-tuner",
|
||||
"finish-args" : [
|
||||
@@ -19,18 +19,10 @@
|
||||
"--share=ipc"
|
||||
],
|
||||
"build-options" : {
|
||||
"append-path" : "/usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/llvm15/bin",
|
||||
"prepend-ld-library-path" : "/usr/lib/sdk/llvm15/lib",
|
||||
"append-path" : "/usr/lib/sdk/rust-stable/bin",
|
||||
"build-args" : [
|
||||
"--share=network"
|
||||
],
|
||||
"env" : {
|
||||
"CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER" : "clang",
|
||||
"CARGO_REGISTRIES_CRATES_IO_PROTOCOL" : "sparse",
|
||||
"CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS" : "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold",
|
||||
"CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER" : "clang",
|
||||
"CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS" : "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold"
|
||||
},
|
||||
"test-args" : [
|
||||
"--socket=x11",
|
||||
"--share=network"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"sdk" : "org.gnome.Sdk",
|
||||
"sdk-extensions" : [
|
||||
"org.freedesktop.Sdk.Extension.rust-stable",
|
||||
"org.freedesktop.Sdk.Extension.llvm15"
|
||||
"org.freedesktop.Sdk.Extension.llvm18"
|
||||
],
|
||||
"command" : "toolbox-tuner",
|
||||
"finish-args" : [
|
||||
@@ -19,18 +19,10 @@
|
||||
"--share=ipc"
|
||||
],
|
||||
"build-options" : {
|
||||
"append-path" : "/usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/llvm15/bin",
|
||||
"prepend-ld-library-path" : "/usr/lib/sdk/llvm15/lib",
|
||||
"append-path" : "/usr/lib/sdk/rust-stable/bin",
|
||||
"build-args" : [
|
||||
"--share=network"
|
||||
],
|
||||
"env" : {
|
||||
"CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER" : "clang",
|
||||
"CARGO_REGISTRIES_CRATES_IO_PROTOCOL" : "sparse",
|
||||
"CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS" : "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold",
|
||||
"CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER" : "clang",
|
||||
"CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS" : "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold"
|
||||
},
|
||||
"test-args" : [
|
||||
"--socket=x11",
|
||||
"--share=network"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"sdk" : "org.gnome.Sdk",
|
||||
"sdk-extensions" : [
|
||||
"org.freedesktop.Sdk.Extension.rust-stable",
|
||||
"org.freedesktop.Sdk.Extension.llvm15"
|
||||
"org.freedesktop.Sdk.Extension.llvm18"
|
||||
],
|
||||
"command" : "toolbox-tuner",
|
||||
"finish-args" : [
|
||||
@@ -16,18 +16,10 @@
|
||||
"--talk-name=org.freedesktop.Flatpak"
|
||||
],
|
||||
"build-options" : {
|
||||
"append-path" : "/usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/llvm15/bin",
|
||||
"prepend-ld-library-path" : "/usr/lib/sdk/llvm15/lib",
|
||||
"append-path" : "/usr/lib/sdk/rust-stable/bin",
|
||||
"build-args" : [
|
||||
"--share=network"
|
||||
],
|
||||
"env" : {
|
||||
"CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER" : "clang",
|
||||
"CARGO_REGISTRIES_CRATES_IO_PROTOCOL" : "sparse",
|
||||
"CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS" : "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold",
|
||||
"CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER" : "clang",
|
||||
"CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS" : "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold"
|
||||
},
|
||||
"test-args" : [
|
||||
"--socket=x11",
|
||||
"--share=network"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<schemalist>
|
||||
<schema path="/org/kuchelmeister/ToolboxTuner/" id="@app-id@" gettext-domain="@gettext-package@">
|
||||
<key name="window-width" type="i">
|
||||
@@ -13,5 +13,10 @@
|
||||
<default>false</default>
|
||||
<summary>Window maximized state</summary>
|
||||
</key>
|
||||
<key name="terminal" type="s">
|
||||
<default>""</default>
|
||||
<summary>Terminal to use</summary>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
|
||||
|
||||
22
src/app.rs
22
src/app.rs
@@ -2,6 +2,7 @@ use crate::gtk::Align;
|
||||
use crate::util::prerequisit::get_installed_terminals;
|
||||
use crate::util::prerequisit::is_toolbox_installed;
|
||||
|
||||
use crate::modals::settings::SettingsMsg;
|
||||
use crate::util::toolbox::ToolbxContainer;
|
||||
use relm4::adw::prelude::PreferencesGroupExt;
|
||||
use relm4::factory::FactoryHashMap;
|
||||
@@ -20,6 +21,7 @@ use crate::config::{APP_ID, PROFILE};
|
||||
use crate::factories::container_list::Container;
|
||||
use crate::factories::container_list::ContainerStatus;
|
||||
use crate::modals::about::AboutDialog;
|
||||
use crate::modals::settings::SettingsDialog;
|
||||
use crate::modals::unsupported::UnsupportedDialog;
|
||||
use crate::modals::unsupported::UnsupportedDialogOutput;
|
||||
use crate::util::toolbox::ToolbxStatus;
|
||||
@@ -29,6 +31,7 @@ use gtk::prelude::{
|
||||
use gtk::{gio, glib};
|
||||
|
||||
pub(super) struct App {
|
||||
settings_dialog: Controller<SettingsDialog>,
|
||||
unsupported_dialog: Controller<UnsupportedDialog>,
|
||||
about_dialog: Controller<AboutDialog>,
|
||||
containers: FactoryHashMap<String, Container>,
|
||||
@@ -48,7 +51,7 @@ pub(super) enum AppCommandMsg {
|
||||
}
|
||||
|
||||
relm4::new_action_group!(pub(super) WindowActionGroup, "win");
|
||||
//relm4::new_stateless_action!(PreferencesAction, WindowActionGroup, "preferences");
|
||||
relm4::new_stateless_action!(PreferencesAction, WindowActionGroup, "preferences");
|
||||
relm4::new_stateless_action!(pub(super) ShortcutsAction, WindowActionGroup, "show-help-overlay");
|
||||
relm4::new_stateless_action!(AboutAction, WindowActionGroup, "about");
|
||||
use crate::factories::container_list::ContainerInit;
|
||||
@@ -64,7 +67,7 @@ impl Component for App {
|
||||
menu! {
|
||||
primary_menu: {
|
||||
section! {
|
||||
//"_Preferences" => PreferencesAction,
|
||||
"_Preferences" => PreferencesAction,
|
||||
"_Keyboard" => ShortcutsAction,
|
||||
"_About Toolbox Tuner" => AboutAction,
|
||||
}
|
||||
@@ -148,6 +151,11 @@ impl Component for App {
|
||||
.launch(())
|
||||
.detach();
|
||||
|
||||
let settings_dialog = SettingsDialog::builder()
|
||||
.transient_for(&root)
|
||||
.launch(())
|
||||
.detach();
|
||||
|
||||
let unsupported_dialog = UnsupportedDialog::builder()
|
||||
.transient_for(&root)
|
||||
.launch(())
|
||||
@@ -158,6 +166,7 @@ impl Component for App {
|
||||
let containers = FactoryHashMap::builder().launch_default().detach();
|
||||
|
||||
let model = Self {
|
||||
settings_dialog,
|
||||
about_dialog,
|
||||
unsupported_dialog,
|
||||
containers,
|
||||
@@ -169,6 +178,13 @@ impl Component for App {
|
||||
|
||||
let mut actions = RelmActionGroup::<WindowActionGroup>::new();
|
||||
|
||||
let preference_action = {
|
||||
let settings = model.settings_dialog.sender().clone();
|
||||
RelmAction::<PreferencesAction>::new_stateless(move |_| {
|
||||
settings.send(SettingsMsg::OpenSettings).unwrap();
|
||||
})
|
||||
};
|
||||
|
||||
let shortcuts_action = {
|
||||
let shortcuts = widgets.shortcuts.clone();
|
||||
RelmAction::<ShortcutsAction>::new_stateless(move |_| {
|
||||
@@ -189,12 +205,12 @@ impl Component for App {
|
||||
AppCommandMsg::PrerequisitsInstalled(terminals.len() > 0 && toolbox_installed)
|
||||
});
|
||||
|
||||
actions.add_action(preference_action);
|
||||
actions.add_action(shortcuts_action);
|
||||
actions.add_action(about_action);
|
||||
actions.register_for_widget(&widgets.main_window);
|
||||
|
||||
widgets.load_window_size();
|
||||
|
||||
ComponentParts { model, widgets }
|
||||
}
|
||||
|
||||
|
||||
@@ -63,6 +63,6 @@ fn main() {
|
||||
gio::ResourceLookupFlags::NONE,
|
||||
)
|
||||
.unwrap();
|
||||
app.set_global_css(&glib::GString::from_utf8_checked(data.to_vec()).unwrap());
|
||||
relm4::set_global_css(&glib::GString::from_utf8_checked(data.to_vec()).unwrap());
|
||||
app.visible_on_activate(false).run::<App>(());
|
||||
}
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
pub mod about;
|
||||
pub mod settings;
|
||||
pub mod unsupported;
|
||||
|
||||
117
src/modals/settings.rs
Normal file
117
src/modals/settings.rs
Normal file
@@ -0,0 +1,117 @@
|
||||
use crate::util::prerequisit::get_installed_terminals;
|
||||
use relm4::adw::prelude::{
|
||||
ComboRowExt, PreferencesGroupExt, PreferencesPageExt, PreferencesRowExt, PreferencesWindowExt,
|
||||
};
|
||||
use relm4::gtk::prelude::Cast;
|
||||
use relm4::gtk::prelude::GtkWindowExt;
|
||||
use relm4::gtk::prelude::ListModelExt;
|
||||
use relm4::gtk::prelude::WidgetExt;
|
||||
use relm4::view;
|
||||
use relm4::{adw, gtk, ComponentParts, ComponentSender, SimpleComponent};
|
||||
pub struct SettingsDialog {
|
||||
hidden: bool,
|
||||
terminal: String,
|
||||
}
|
||||
use crate::APP_ID;
|
||||
use gtk::gio;
|
||||
use relm4::gtk::prelude::CastNone;
|
||||
use relm4::gtk::prelude::SettingsExt;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum SettingsMsg {
|
||||
OpenSettings,
|
||||
TerminalSelectionChanged(String),
|
||||
}
|
||||
|
||||
impl SimpleComponent for SettingsDialog {
|
||||
type Init = ();
|
||||
type Widgets = adw::PreferencesWindow;
|
||||
type Input = SettingsMsg;
|
||||
type Output = ();
|
||||
type Root = adw::PreferencesWindow;
|
||||
|
||||
fn init_root() -> Self::Root {
|
||||
adw::PreferencesWindow::new()
|
||||
}
|
||||
|
||||
fn init(
|
||||
_: Self::Init,
|
||||
root: Self::Root,
|
||||
sender: ComponentSender<Self>,
|
||||
) -> ComponentParts<Self> {
|
||||
let model = Self {
|
||||
hidden: true,
|
||||
terminal: "".to_string(),
|
||||
};
|
||||
let terminal_selection_model = gtk::gio::ListStore::new::<gtk::StringObject>();
|
||||
|
||||
let sort_function = |to_insert: >k::glib::Object,
|
||||
existing: >k::glib::Object|
|
||||
-> std::cmp::Ordering { to_insert.cmp(existing) };
|
||||
|
||||
let terminals = get_installed_terminals().unwrap_or_default();
|
||||
|
||||
terminals.iter().for_each(|t| {
|
||||
terminal_selection_model.insert_sorted(
|
||||
>k::StringObject::new(format!("{:?}", t).as_str()),
|
||||
&sort_function,
|
||||
);
|
||||
});
|
||||
|
||||
let settings = gio::Settings::new(APP_ID);
|
||||
let terminal = settings.string("terminal");
|
||||
println!("{}", terminal);
|
||||
|
||||
let terminal_selection = terminal_selection_model
|
||||
.find_with_equal_func(|obj| {
|
||||
gtk::StringObject::new(terminal.as_str()).string()
|
||||
== obj.downcast_ref::<gtk::StringObject>().unwrap().string()
|
||||
})
|
||||
.unwrap_or(0);
|
||||
|
||||
println!("{}", terminal_selection);
|
||||
|
||||
let str_object: String = terminal_selection_model
|
||||
.item(terminal_selection)
|
||||
.and_downcast::<gtk::StringObject>()
|
||||
.expect("The item has to be an `StringObject`.")
|
||||
.into();
|
||||
sender.input(SettingsMsg::TerminalSelectionChanged(str_object));
|
||||
|
||||
view! {
|
||||
widgets = root.clone() {
|
||||
|
||||
add = &adw::PreferencesPage::new() {
|
||||
add = &adw::PreferencesGroup::new() {
|
||||
set_title: "Terminal settings",
|
||||
add = &adw::ComboRow::new() {
|
||||
set_title: "Terminal",
|
||||
#[wrap(Some)]
|
||||
set_model = >k::SingleSelection::new(Some(terminal_selection_model)),
|
||||
#[watch]
|
||||
set_selected: terminal_selection,
|
||||
connect_selected_item_notify[sender] => move |combo_row| {
|
||||
let str_object: String = combo_row.selected_item().and_downcast::<gtk::StringObject>().expect("The item has to be an `StringObject`.").into();
|
||||
sender.input(SettingsMsg::TerminalSelectionChanged(str_object));
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
ComponentParts { model, widgets }
|
||||
}
|
||||
|
||||
fn update_view(&self, dialog: &mut Self::Widgets, _sender: ComponentSender<Self>) {
|
||||
dialog.show();
|
||||
}
|
||||
fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
|
||||
match msg {
|
||||
SettingsMsg::OpenSettings => {}
|
||||
SettingsMsg::TerminalSelectionChanged(terminal) => {
|
||||
let settings = gio::Settings::new(APP_ID);
|
||||
settings.set_string("terminal", &terminal);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,10 @@
|
||||
use crate::util::toolbox::ToolbxError;
|
||||
use std::process::Command;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum TerminalType {
|
||||
GnomeTerminal,
|
||||
Konsole,
|
||||
}
|
||||
|
||||
pub fn get_installed_terminals() -> Result<Vec<TerminalType>, ToolbxError> {
|
||||
@@ -20,7 +22,7 @@ pub fn get_installed_terminals() -> Result<Vec<TerminalType>, ToolbxError> {
|
||||
let output = output.unwrap();
|
||||
|
||||
if output.status.code() == Some(0) {
|
||||
Ok(vec![TerminalType::GnomeTerminal])
|
||||
Ok(vec![TerminalType::GnomeTerminal, TerminalType::Konsole])
|
||||
} else {
|
||||
Err(ToolbxError::CommandUnsuccessfulError(
|
||||
String::from_utf8_lossy(&output.stderr).into_owned(),
|
||||
|
||||
Reference in New Issue
Block a user