mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
feat: init desktop app
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "opencut-desktop"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[[bin]]
|
||||
name = "opencut"
|
||||
path = "src/main.rs"
|
||||
|
||||
[dependencies]
|
||||
gpui = "0.2.2"
|
||||
@@ -0,0 +1,47 @@
|
||||
# Desktop
|
||||
|
||||
The native desktop app, built with [GPUI](https://gpui.rs).
|
||||
|
||||
## Getting started
|
||||
|
||||
**1. Install Rust:**
|
||||
|
||||
```bash
|
||||
# Linux / macOS / WSL
|
||||
./script/setup-rust
|
||||
```
|
||||
|
||||
```powershell
|
||||
# Windows
|
||||
powershell -ExecutionPolicy Bypass -File .\script\setup-rust.ps1
|
||||
```
|
||||
|
||||
Both scripts skip installation if Rust is already present. On Linux/macOS/WSL only: after a fresh install, reload your shell with `source "$HOME/.cargo/env"`
|
||||
|
||||
**2. Install native dependencies:**
|
||||
|
||||
```bash
|
||||
# Linux / macOS / WSL
|
||||
./apps/desktop/script/setup
|
||||
```
|
||||
|
||||
```powershell
|
||||
# Windows
|
||||
powershell -ExecutionPolicy Bypass -File .\apps\desktop\script\setup.ps1
|
||||
```
|
||||
|
||||
**3. Run:**
|
||||
|
||||
```bash
|
||||
cargo run -p opencut-desktop
|
||||
```
|
||||
|
||||
## Platform notes
|
||||
|
||||
**Linux:** supports apt (Debian/Ubuntu/Mint), dnf (Fedora/RHEL), and pacman (Arch).
|
||||
|
||||
**macOS:** installs Xcode Command Line Tools if missing.
|
||||
|
||||
**Windows:** the setup script checks for Visual Studio Build Tools. If missing, it prints the install link.
|
||||
|
||||
**WSL:** runs the same scripts as Linux. Window rendering works via WSLg on Windows 11 and Windows 10 22H2+. If you're on an older build, test on the host instead.
|
||||
@@ -0,0 +1,110 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Installs the native system libraries GPUI needs to compile on Linux/macOS.
|
||||
# Run script/setup-rust first if you don't have Rust installed yet.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [ "$(id -u)" -eq 0 ]; then
|
||||
maysudo=''
|
||||
else
|
||||
maysudo="$(command -v sudo || command -v doas || true)"
|
||||
fi
|
||||
|
||||
# Ubuntu, Debian, Mint, Pop!_OS, Kali, Raspbian, etc.
|
||||
apt=$(command -v apt-get || true)
|
||||
if [[ -n $apt ]]; then
|
||||
deps=(
|
||||
curl
|
||||
build-essential
|
||||
pkg-config
|
||||
gcc
|
||||
g++
|
||||
make
|
||||
libasound2-dev
|
||||
libfontconfig-dev
|
||||
libglib2.0-dev
|
||||
libssl-dev
|
||||
libva-dev
|
||||
libvulkan1
|
||||
libwayland-dev
|
||||
libx11-xcb-dev
|
||||
libxkbcommon-x11-dev
|
||||
libzstd-dev
|
||||
libsqlite3-dev
|
||||
)
|
||||
|
||||
$maysudo "$apt" update
|
||||
$maysudo "$apt" install -y "${deps[@]}"
|
||||
echo "Desktop native dependencies installed."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Fedora, RHEL, CentOS, Alma, etc.
|
||||
dnf=$(command -v dnf || true)
|
||||
if [[ -n $dnf ]]; then
|
||||
deps=(
|
||||
gcc
|
||||
gcc-c++
|
||||
make
|
||||
pkg-config
|
||||
alsa-lib-devel
|
||||
fontconfig-devel
|
||||
glib2-devel
|
||||
openssl-devel
|
||||
libva-devel
|
||||
vulkan-loader
|
||||
wayland-devel
|
||||
libxcb-devel
|
||||
libxkbcommon-x11-devel
|
||||
libzstd-devel
|
||||
sqlite-devel
|
||||
curl
|
||||
)
|
||||
|
||||
$maysudo "$dnf" install -y "${deps[@]}"
|
||||
echo "Desktop native dependencies installed."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Arch, Manjaro, etc.
|
||||
pacman=$(command -v pacman || true)
|
||||
if [[ -n $pacman ]]; then
|
||||
deps=(
|
||||
gcc
|
||||
make
|
||||
pkgconf
|
||||
alsa-lib
|
||||
fontconfig
|
||||
glib2
|
||||
openssl
|
||||
libva
|
||||
vulkan-loader
|
||||
wayland
|
||||
libxcb
|
||||
libxkbcommon-x11
|
||||
zstd
|
||||
sqlite
|
||||
curl
|
||||
)
|
||||
|
||||
$maysudo "$pacman" -Syu --needed --noconfirm "${deps[@]}"
|
||||
echo "Desktop native dependencies installed."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# macOS
|
||||
if [[ "$(uname)" == "Darwin" ]]; then
|
||||
if ! xcode-select -p &> /dev/null; then
|
||||
echo "Installing Xcode Command Line Tools..."
|
||||
xcode-select --install
|
||||
echo "Re-run this script after the Xcode install completes."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Desktop native dependencies installed."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Unsupported platform. See apps/desktop/README.md for manual setup instructions."
|
||||
exit 1
|
||||
@@ -0,0 +1,27 @@
|
||||
# Installs the native build tools GPUI needs to compile on Windows.
|
||||
# Run script/setup-rust.ps1 first if you don't have Rust installed yet.
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
function Check-VSBuildTools {
|
||||
$vswhere = "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
|
||||
|
||||
if (-not (Test-Path $vswhere)) {
|
||||
return $false
|
||||
}
|
||||
|
||||
$result = & $vswhere -latest -requires Microsoft.VisualStudio.Workload.NativeDesktop -property installationPath
|
||||
return $result -and $result.Trim().Length -gt 0
|
||||
}
|
||||
|
||||
if (-not (Check-VSBuildTools)) {
|
||||
Write-Output ""
|
||||
Write-Output "Visual Studio Build Tools with 'Desktop development with C++' not found."
|
||||
Write-Output ""
|
||||
Write-Output "Install it from: https://visualstudio.microsoft.com/visual-cpp-build-tools/"
|
||||
Write-Output "Check the 'Desktop development with C++' workload during setup, then re-run this script."
|
||||
Write-Output ""
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Output "Desktop native dependencies ready."
|
||||
@@ -0,0 +1,41 @@
|
||||
use gpui::{
|
||||
App, Application, Bounds, Context, SharedString, Window, WindowBounds, WindowOptions, div,
|
||||
prelude::*, px, rgb, size,
|
||||
};
|
||||
|
||||
struct AppWindow {
|
||||
title: SharedString,
|
||||
}
|
||||
|
||||
impl Render for AppWindow {
|
||||
fn render(&mut self, _window: &mut Window, _cx: &mut Context<Self>) -> impl IntoElement {
|
||||
div()
|
||||
.size_full()
|
||||
.bg(rgb(0x0f0f0f))
|
||||
.flex()
|
||||
.justify_center()
|
||||
.items_center()
|
||||
.text_xl()
|
||||
.text_color(rgb(0xffffff))
|
||||
.child(self.title.clone())
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
Application::new().run(|cx: &mut App| {
|
||||
let bounds = Bounds::centered(None, size(px(1280.), px(720.)), cx);
|
||||
cx.open_window(
|
||||
WindowOptions {
|
||||
window_bounds: Some(WindowBounds::Windowed(bounds)),
|
||||
..Default::default()
|
||||
},
|
||||
|_, cx| {
|
||||
cx.new(|_| AppWindow {
|
||||
title: "OpenCut".into(),
|
||||
})
|
||||
},
|
||||
)
|
||||
.unwrap();
|
||||
cx.activate(true);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user