This commit is contained in:
Jeremy Soller 2023-10-25 07:35:38 -06:00
parent 0d54d87153
commit 036712ec6e
No known key found for this signature in database
GPG key ID: DCFCA852D3906975
3 changed files with 95 additions and 31 deletions

17
Cargo.lock generated
View file

@ -839,7 +839,6 @@ dependencies = [
[[package]]
name = "cosmic-config"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"atomicwrites",
"cosmic-config-derive",
@ -853,7 +852,6 @@ dependencies = [
[[package]]
name = "cosmic-config-derive"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"quote",
"syn 1.0.109",
@ -916,7 +914,6 @@ dependencies = [
[[package]]
name = "cosmic-theme"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"almost",
"cosmic-config",
@ -2047,7 +2044,6 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "iced"
version = "0.10.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"iced_accessibility",
"iced_core",
@ -2063,7 +2059,6 @@ dependencies = [
[[package]]
name = "iced_accessibility"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"accesskit",
"accesskit_unix",
@ -2073,7 +2068,6 @@ dependencies = [
[[package]]
name = "iced_core"
version = "0.10.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"bitflags 1.3.2",
"iced_accessibility",
@ -2088,7 +2082,6 @@ dependencies = [
[[package]]
name = "iced_futures"
version = "0.7.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"futures",
"iced_core",
@ -2100,7 +2093,6 @@ dependencies = [
[[package]]
name = "iced_graphics"
version = "0.9.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"bitflags 1.3.2",
"bytemuck",
@ -2118,7 +2110,6 @@ dependencies = [
[[package]]
name = "iced_renderer"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"iced_graphics",
"iced_tiny_skia",
@ -2131,7 +2122,6 @@ dependencies = [
[[package]]
name = "iced_runtime"
version = "0.1.1"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"iced_accessibility",
"iced_core",
@ -2143,7 +2133,6 @@ dependencies = [
[[package]]
name = "iced_sctk"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"enum-repr",
"float-cmp",
@ -2167,7 +2156,6 @@ dependencies = [
[[package]]
name = "iced_style"
version = "0.9.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"iced_core",
"once_cell",
@ -2177,7 +2165,6 @@ dependencies = [
[[package]]
name = "iced_tiny_skia"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"bytemuck",
"cosmic-text 0.9.0",
@ -2195,7 +2182,6 @@ dependencies = [
[[package]]
name = "iced_wgpu"
version = "0.11.1"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"bitflags 1.3.2",
"bytemuck",
@ -2217,7 +2203,6 @@ dependencies = [
[[package]]
name = "iced_widget"
version = "0.1.3"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"iced_renderer",
"iced_runtime",
@ -2232,7 +2217,6 @@ dependencies = [
[[package]]
name = "iced_winit"
version = "0.10.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"iced_graphics",
"iced_runtime",
@ -2479,7 +2463,6 @@ checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
[[package]]
name = "libcosmic"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#a2bda491520093c3343018204bfc8c4169b5e3b9"
dependencies = [
"apply",
"ashpd",

View file

@ -19,8 +19,9 @@ features = ["syntect", "vi"]
#path = "../cosmic-text"
[dependencies.libcosmic]
git = "https://github.com/pop-os/libcosmic"
#git = "https://github.com/pop-os/libcosmic"
default-features = false
path = "../libcosmic"
[features]
default = ["wayland"]

View file

@ -7,13 +7,22 @@ use cosmic::{
widget::{column, row, text},
Alignment, Length, Limits,
},
widget::{self, icon, segmented_button, view_switcher},
theme,
widget::{
self, button, icon,
menu::{MenuBar, MenuTree},
segmented_button, view_switcher,
},
ApplicationExt, Element,
};
use cosmic_text::{
Attrs, Buffer, Edit, FontSystem, Metrics, SyntaxEditor, SyntaxSystem, ViEditor, ViMode,
};
use std::{env, fs, path::PathBuf, sync::Mutex};
use std::{
env, fs, io,
path::{Path, PathBuf},
sync::Mutex,
};
use self::menu_list::MenuList;
mod menu_list;
@ -45,6 +54,30 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
Ok(())
}
pub struct Project {
path: PathBuf,
name: String,
}
impl Project {
pub fn new<P: AsRef<Path>>(path: P) -> io::Result<Self> {
let path = fs::canonicalize(path)?;
let name = path
.file_name()
.ok_or(io::Error::new(
io::ErrorKind::Other,
format!("Path {:?} has no file name", path),
))?
.to_str()
.ok_or(io::Error::new(
io::ErrorKind::Other,
format!("Path {:?} is not valid UTF-8", path),
))?
.to_string();
Ok(Self { path, name })
}
}
pub struct Tab {
path_opt: Option<PathBuf>,
attrs: Attrs<'static>,
@ -127,6 +160,7 @@ impl Tab {
pub struct App {
core: Core,
projects: Vec<Project>,
tab_model: segmented_button::SingleSelectModel,
}
@ -149,6 +183,15 @@ impl App {
self.tab_model.active_data_mut()
}
pub fn open_project<P: AsRef<Path>>(&mut self, path: P) {
match Project::new(&path) {
Ok(project) => self.projects.push(project),
Err(err) => {
log::error!("failed to open '{}': {}", path.as_ref().display(), err);
}
}
}
pub fn open_tab(&mut self, path_opt: Option<PathBuf>) {
let mut tab = Tab::new();
if let Some(path) = path_opt {
@ -200,11 +243,17 @@ impl cosmic::Application for App {
fn init(core: Core, _flags: Self::Flags) -> (Self, Command<Self::Message>) {
let mut app = App {
core,
projects: Vec::new(),
tab_model: segmented_button::Model::builder().build(),
};
for path in env::args().skip(1) {
app.open_tab(Some(PathBuf::from(path)));
for arg in env::args().skip(1) {
let path = PathBuf::from(arg);
if path.is_dir() {
app.open_project(path);
} else {
app.open_tab(Some(path));
}
}
// Open an empty file if no arguments provided
@ -277,14 +326,25 @@ impl cosmic::Application for App {
}
fn view(&self) -> Element<Message> {
/*
let menu_bar = row![
MenuList::new(vec!["Open", "Save"], None, |item| {
MenuList::new(
vec![
"New file",
"New window",
"Open file...",
"Save",
"Save as..."
],
None,
|item| {
match item {
"Open" => Message::Open,
"Save" => Message::Save,
_ => Message::Todo,
}
})
}
)
.padding(8)
.placeholder("File"),
MenuList::new(vec!["Todo"], None, |_| Message::Todo).placeholder("Edit"),
@ -294,6 +354,14 @@ impl cosmic::Application for App {
.align_items(Alignment::Start)
.padding(4)
.spacing(16);
*/
//TODO: port macros menu_bar! and menu_tree!
let menu_bar: Element<_> = MenuBar::new(vec![MenuTree::with_children(
button("File"),
vec![MenuTree::new(button("New file"))],
)])
.into();
let mut tab_column = widget::column::with_capacity(3).padding([0, 16]);
@ -337,10 +405,22 @@ impl cosmic::Application for App {
}
};
let content: Element<_> = column![menu_bar, tab_column].into();
let mut project_row = widget::row::with_capacity(2);
if !self.projects.is_empty() {
/*TODO: project tree view
let mut project_list = widget::column::with_capacity(self.projects.len());
for project in self.projects.iter() {
project_list = project_list.push(widget::text(&project.name));
}
project_row = project_row.push(project_list);
*/
}
project_row = project_row.push(tab_column);
let content: Element<_> = column![menu_bar, project_row].into();
// Uncomment to debug layout:
//content.explain(Color::WHITE)
content
content.explain(cosmic::iced::Color::WHITE)
//content
}
}