diff --git a/apps/codetrack/Cargo.toml b/apps/codetrack/Cargo.toml deleted file mode 100644 index e3ebf50..0000000 --- a/apps/codetrack/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "panorama-codetrack" -version = "0.1.0" -edition = "2021" - -[[bin]] -name = "panorama-codetrack" -path = "rust-src/main.rs" - -[dependencies] diff --git a/apps/codetrack/manifest.yml b/apps/codetrack/manifest.yml deleted file mode 100644 index 9adb312..0000000 --- a/apps/codetrack/manifest.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: panorama/codetrack -version: 0.1.0 -panorama_version: 0.1.0 -description: Code tracking app similar to WakaTime - -command: cargo run -p panorama-codetrack - -node_types: - - name: heartbeat - -keys: - - name: start_time - type: date - - - name: end_time - type: date - - - name: project - type: text - -indexes: - - type: rtree - start: panorama/codetrack/start_time - end: panorama/codetrack/start_time - -endpoints: - -profiles: - release: - module: ./main.wasm diff --git a/apps/codetrack/rust-src/main.rs b/apps/codetrack/rust-src/main.rs deleted file mode 100644 index 80a1832..0000000 --- a/apps/codetrack/rust-src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -} diff --git a/apps/codetrack/tsconfig.json b/apps/codetrack/tsconfig.json deleted file mode 100644 index 9f23a65..0000000 --- a/apps/codetrack/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "lib": ["ESNext", "DOM", "DOM.Iterable"], - "allowJs": false, - "skipLibCheck": true, - "target": "ESNext", - "module": "ESNext" - } -} diff --git a/apps/codetrack/web-src/index.ts b/apps/codetrack/web-src/index.ts deleted file mode 100644 index e1c65a1..0000000 --- a/apps/codetrack/web-src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default { - nodeTypes: {}, -}; diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..4724444 --- /dev/null +++ b/biome.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.4.1/schema.json", + "organizeImports": { + "enabled": true + }, + "formatter": { + "enabled": true, + "indentWidth": 2, + "indentStyle": "space", + "lineWidth": 100 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + } +} diff --git a/crates/panorama-core/Cargo.toml b/crates/panorama-core/Cargo.toml deleted file mode 100644 index e128a34..0000000 --- a/crates/panorama-core/Cargo.toml +++ /dev/null @@ -1,40 +0,0 @@ -[package] -name = "panorama-core" -version = "0.1.0" -edition = "2021" - -[dependencies] -anyhow = { version = "1.0.86", features = ["backtrace"] } -backoff = { version = "0.4.0", features = ["tokio"] } -bimap = "0.6.3" -chrono = { version = "0.4.38", features = ["serde"] } -futures = "0.3.30" -itertools = "0.13.0" -schemars = "0.8.21" -serde = { version = "1.0.203", features = ["derive"] } -serde_json = "1.0.117" -serde_yaml = "0.9.34" -sqlx = { version = "0.7.4", features = [ - "runtime-tokio", - "tls-rustls", - "macros", - "sqlite", - "uuid", - "chrono", - "regexp", -] } -sugars = "3.0.1" -tantivy = { version = "0.22.0", features = ["zstd"] } -tokio = { version = "1.38.0", features = ["full"] } -uuid = { version = "1.8.0", features = ["v7"] } -walkdir = "2.5.0" -wasmtime = { version = "22.0.0", default-features = false, features = [ - "runtime", - "cranelift", -] } -wasmtime-wasi = "22.0.0" - -[dependencies.async-imap] -version = "0.9.7" -default-features = false -features = ["runtime-tokio"] diff --git a/crates/panorama-core/build.rs b/crates/panorama-core/build.rs deleted file mode 100644 index c40aa8f..0000000 --- a/crates/panorama-core/build.rs +++ /dev/null @@ -1,4 +0,0 @@ -fn main() { - println!("cargo:rerun-if-changed=../../apps"); - println!("cargo:rerun-if-changed=migrations"); -} diff --git a/crates/panorama-core/migrations/00001_initial.sql b/crates/panorama-core/migrations/00001_initial.sql deleted file mode 100644 index 5fb1424..0000000 --- a/crates/panorama-core/migrations/00001_initial.sql +++ /dev/null @@ -1,40 +0,0 @@ -CREATE TABLE node ( - node_id TEXT PRIMARY KEY, - node_type TEXT NOT NULL, - updated_at INTEGER NOT NULL DEFAULT CURRENT_TIMESTAMP, - extra_data JSON -); - -CREATE TABLE node_has_key ( - node_id TEXT NOT NULL, - full_key TEXT NOT NULL, - PRIMARY KEY (node_id, full_key) -); -CREATE INDEX node_has_key_idx_node_id ON node_has_key(node_id); -CREATE INDEX node_has_key_idx_full_key ON node_has_key(full_key); - --- App-related tables -CREATE TABLE app ( - app_id INTEGER PRIMARY KEY AUTOINCREMENT, - app_name TEXT NOT NULL, - app_version TEXT NOT NULL, - app_version_hash TEXT, - app_description TEXT, - app_homepage TEXT, - app_repository TEXT, - app_license TEXT -); - -CREATE TABLE app_table_mapping ( - app_id INTEGER NOT NULL, - app_table_name TEXT NOT NULL, - db_table_name TEXT NOT NULL -); - -CREATE TABLE key_mapping ( - full_key TEXT NOT NULL, - app_id INTEGER NOT NULL, - app_table_name TEXT NOT NULL, - app_table_field TEXT NOT NULL, - is_fts_enabled BOOLEAN NOT NULL DEFAULT FALSE -); diff --git a/crates/panorama-core/src/lib.rs b/crates/panorama-core/src/lib.rs deleted file mode 100644 index 95a222d..0000000 --- a/crates/panorama-core/src/lib.rs +++ /dev/null @@ -1,42 +0,0 @@ -#[macro_use] -extern crate serde; -#[macro_use] -extern crate serde_json; -#[macro_use] -extern crate sugars; - -pub mod migrations; -pub mod state; - -// pub mod mail; -pub mod messaging; -#[cfg(test)] -mod tests; - -use std::fmt; - -pub use crate::state::AppState; - -use anyhow::{bail, Result}; -use serde_json::Value; -use uuid::Uuid; - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] -pub struct NodeId(pub Uuid); - -impl fmt::Display for NodeId { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.0.to_string()) - } -} - -pub fn ensure_ok(s: &str) -> Result<()> { - let status: Value = serde_json::from_str(&s)?; - let status = status.as_object().unwrap(); - let ok = status.get("ok").unwrap().as_bool().unwrap_or(false); - if !ok { - let display = status.get("display").unwrap().as_str().unwrap(); - bail!("shit (error: {display})") - } - Ok(()) -} diff --git a/crates/panorama-core/src/mail.rs b/crates/panorama-core/src/mail.rs deleted file mode 100644 index d33301f..0000000 --- a/crates/panorama-core/src/mail.rs +++ /dev/null @@ -1,286 +0,0 @@ -use std::{ - collections::{HashMap, HashSet}, - time::Duration, -}; - -use anyhow::{Context as _, Result}; -use async_imap::Session; -use backoff::{exponential::ExponentialBackoff, SystemClock}; -use futures::TryStreamExt; -use itertools::Itertools; -use tokio::{net::TcpStream, time::sleep}; -use uuid::Uuid; - -use crate::{mail, AppState}; - -pub struct MailWorker { - state: AppState, -} - -impl MailWorker { - pub fn new(state: AppState) -> MailWorker { - MailWorker { state } - } - - pub async fn mail_loop(self) -> Result<()> { - loop { - let mut policy = ExponentialBackoff::::default(); - policy.current_interval = Duration::from_secs(5); - policy.initial_interval = Duration::from_secs(5); - - backoff::future::retry(policy, || async { - match self.mail_loop_inner().await { - Ok(_) => {} - Err(err) => { - eprintln!("Mail error: {:?}", err); - Err(err)?; - } - } - // For now, just sleep 30 seconds and then fetch again - // TODO: Run a bunch of connections at once and do IDLE over them (if possible) - sleep(Duration::from_secs(30)).await; - - Ok(()) - }) - .await?; - } - - Ok(()) - } - - async fn mail_loop_inner(&self) -> Result<()> { - // Fetch the mail configs - let configs = self.state.fetch_mail_configs()?; - if configs.is_empty() { - return Ok(()); - } - - // TODO: Do all configs instead of just the first - let config = &configs[0]; - - let stream = - TcpStream::connect((config.imap_hostname.as_str(), config.imap_port)) - .await?; - - let client = async_imap::Client::new(stream); - let mut session = client - .login(&config.imap_username, &config.imap_password) - .await - .map_err(|(err, _)| err)?; - - let all_mailbox_ids = self - .fetch_and_store_all_mailboxes(config.node_id.to_string(), &mut session) - .await - .context("Could not fetch mailboxes")?; - - self - .fetch_all_mail_from_single_mailbox( - &mut session, - &all_mailbox_ids, - config.node_id.to_string(), - "INBOX", - ) - .await - .context("Could not fetch mail from INBOX")?; - - session.logout().await.into_diagnostic()?; - - Ok(()) - } - - async fn fetch_and_store_all_mailboxes( - &self, - config_node_id: String, - session: &mut Session, - ) -> Result> { - // println!("Session: {:?}", session); - let mailboxes = session - .list(None, Some("*")) - .await? - .try_collect::>() - .await?; - - let mut all_mailboxes = HashMap::new(); - - // TODO: Make this more efficient by using bulk in query - - for mailbox in mailboxes { - let tx = self.state.db.multi_transaction(true); - - let result = tx.run_script( - " - ?[node_id] := - *mailbox{node_id, account_node_id, mailbox_name}, - account_node_id = $account_node_id, - mailbox_name = $mailbox_name, - ", - btmap! { - "account_node_id".to_owned()=>DataValue::from(config_node_id.clone()), - "mailbox_name".to_owned()=>DataValue::from(mailbox.name().to_string()), - }, - )?; - - let node_id = if result.rows.len() == 0 { - let new_node_id = Uuid::now_v7(); - let new_node_id = new_node_id.to_string(); - let extra_data = json!({ - "name": mailbox.name(), - }); - tx.run_script(" - ?[node_id, account_node_id, mailbox_name, extra_data] <- - [[$new_node_id, $account_node_id, $mailbox_name, $extra_data]] - :put mailbox { node_id, account_node_id, mailbox_name, extra_data } - ", - btmap! { - "new_node_id".to_owned() => DataValue::from(new_node_id.clone()), - "account_node_id".to_owned() => DataValue::from(config_node_id.clone()), - "mailbox_name".to_owned()=>DataValue::from(mailbox.name().to_string()), - "extra_data".to_owned()=>DataValue::Json(JsonData(extra_data)), - }, - )?; - new_node_id - } else { - result.rows[0][0].get_str().unwrap().to_owned() - }; - - tx.commit()?; - - all_mailboxes.insert(mailbox.name().to_owned(), node_id); - } - - // println!("All mailboxes: {:?}", all_mailboxes); - - Ok(all_mailboxes) - } - - async fn fetch_all_mail_from_single_mailbox( - &self, - session: &mut Session, - all_mailbox_ids: &HashMap, - config_node_id: String, - mailbox_name: impl AsRef, - ) -> Result<()> { - let mailbox_name = mailbox_name.as_ref(); - let mailbox = session.select(mailbox_name).await.into_diagnostic()?; - let mailbox_node_id = all_mailbox_ids.get(mailbox_name).unwrap(); - - let extra_data = json!({ - "uid_validity": mailbox.uid_validity, - "last_seen": mailbox.unseen, - }); - - // TODO: Validate uid validity here - - let all_uids = session - .uid_search("ALL") - .await - .context("Could not fetch all UIDs")?; - - println!("All UIDs ({}): {:?}", all_uids.len(), all_uids); - - let messages = session - .uid_fetch( - all_uids.iter().join(","), - "(FLAGS ENVELOPE BODY[HEADER] BODY[TEXT] INTERNALDATE)", - ) - .await - .into_diagnostic()? - .try_collect::>() - .await - .into_diagnostic() - .context("Could not fetch messages")?; - println!( - "messages {:?}", - messages.iter().map(|f| f.body()).collect::>() - ); - - let mut unique_message_ids = HashSet::new(); - let data: Vec<_> = messages - .iter() - .map(|msg| { - let message_node_id = Uuid::now_v7(); - let headers = - String::from_utf8(msg.header().unwrap().to_vec()).unwrap(); - let headers = headers - .split("\r\n") - .filter_map(|s| { - // This is really bad lmao - let p = s.split(": ").collect::>(); - if p.len() < 2 { - None - } else { - Some((p[0], p[1..].join(": "))) - } - }) - .collect::>(); - - let message_id = headers - .get("Message-ID") - .map(|s| (*s).to_owned()) - .unwrap_or(message_node_id.to_string()); - unique_message_ids.insert(message_id.clone()); - - DataValue::List(vec![ - DataValue::from(message_node_id.to_string()), - DataValue::from(config_node_id.to_string()), - DataValue::from(mailbox_node_id.clone()), - DataValue::from( - headers - .get("Subject") - .map(|s| (*s).to_owned()) - .unwrap_or("Subject".to_owned()), - ), - DataValue::Json(JsonData(serde_json::to_value(&headers).unwrap())), - DataValue::Bytes(msg.text().unwrap().to_vec()), - DataValue::from(msg.internal_date().unwrap().to_rfc3339()), - DataValue::from(message_id), - ]) - }) - .collect(); - - println!("Adding {} messages to database...", data.len()); - let input_data = DataValue::List(data); - - // TODO: Can this be one query? - let tx = self.state.db.multi_transaction(true); - - let unique_message_ids_data_value = DataValue::List( - unique_message_ids - .into_iter() - .map(|s| DataValue::from(s)) - .collect_vec(), - ); - - let existing_ids = tx.run_script( - " - ?[node_id] := *message { node_id, message_id }, - is_in(message_id, $message_ids) - ", - btmap! { "message_ids".to_owned() => unique_message_ids_data_value }, - )?; - println!("Existing ids: {:?}", existing_ids); - - self - .state - .db - .run_script( - " - ?[ - node_id, account_node_id, mailbox_node_id, subject, headers, body, - internal_date, message_id - ] <- $input_data - :put message { - node_id, account_node_id, mailbox_node_id, subject, headers, body, - internal_date, message_id - } - ", - btmap! { - "input_data".to_owned() => input_data, - }, - ScriptMutability::Mutable, - ) - .context("Could not add message to database")?; - - Ok(()) - } -} diff --git a/crates/panorama-core/src/messaging/mod.rs b/crates/panorama-core/src/messaging/mod.rs deleted file mode 100644 index 9a3ba71..0000000 --- a/crates/panorama-core/src/messaging/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! Panorama uses an internal messaging system to pass content around -//! -//! This implementation is dead simple, just passes all messages and filters on the other end -pub struct Messaging {} diff --git a/crates/panorama-core/src/migrations.rs b/crates/panorama-core/src/migrations.rs deleted file mode 100644 index 6c4682c..0000000 --- a/crates/panorama-core/src/migrations.rs +++ /dev/null @@ -1,197 +0,0 @@ -use sqlx::migrate::Migrator; - - - -pub static MIGRATOR: Migrator = sqlx::migrate!(); - -// pub async fn run_migrations(db: &DbInstance) -> Result<()> { -// let migration_status = check_migration_status(db).await?; -// println!("migration status: {:?}", migration_status); - -// let migrations: Vec Fn(&'a DbInstance) -> Result<()>>> = -// vec![Box::new(no_op), Box::new(migration_01)]; - -// if let MigrationStatus::NoMigrations = migration_status { -// let result = db.run_script_str( -// " -// { :create migrations { yeah: Int default 0 => version: Int default 0 } } -// { -// ?[yeah, version] <- [[0, 0]] -// :put migrations { yeah, version } -// } -// ", -// "", -// false, -// ); -// ensure_ok(&result)?; -// } - -// let start_at_migration = match migration_status { -// MigrationStatus::NoMigrations => 0, -// MigrationStatus::HasVersion(n) => n, -// }; -// let migrations_to_run = migrations -// .iter() -// .enumerate() -// .skip(start_at_migration as usize + 1); -// // println!("running {} migrations...", migrations_to_run.len()); - -// //TODO: This should all be done in a transaction -// for (idx, migration) in migrations_to_run { -// println!("running migration {idx}..."); - -// migration(db)?; - -// let result = db.run_script_str( -// " -// ?[yeah, version] <- [[0, $version]] -// :put migrations { yeah => version } -// ", -// &format!("{{\"version\":{}}}", idx), -// false, -// ); - -// ensure_ok(&result)?; - -// println!("succeeded migration {idx}!"); -// } - -// Ok(()) -// } - -// #[derive(Debug)] -// enum MigrationStatus { -// NoMigrations, -// HasVersion(u64), -// } - -// async fn check_migration_status(db: &DbInstance) -> Result { -// let status = db.run_script_str( -// " -// ?[yeah, version] := *migrations[yeah, version] -// ", -// "", -// true, -// ); -// println!("Status: {}", status); - -// let status: Value = serde_json::from_str(&status).into_diagnostic()?; -// let status = status.as_object().unwrap(); -// let ok = status.get("ok").unwrap().as_bool().unwrap_or(false); -// if !ok { -// let status_code = status.get("code").unwrap().as_str().unwrap(); -// if status_code == "query::relation_not_found" { -// return Ok(MigrationStatus::NoMigrations); -// } -// } - -// let rows = status.get("rows").unwrap().as_array().unwrap(); -// let row = rows[0].as_array().unwrap(); -// let version = row[1].as_number().unwrap().as_u64().unwrap(); -// println!("row: {row:?}"); - -// Ok(MigrationStatus::HasVersion(version)) -// } - -// fn no_op(_: &DbInstance) -> Result<()> { -// Ok(()) -// } - -// fn migration_01(db: &DbInstance) -> Result<()> { -// let result = db.run_script_str( -// " -// # Primary node type -// { -// :create node { -// id: String -// => -// type: String, -// created_at: Float default now(), -// updated_at: Float default now(), -// extra_data: Json default {}, -// } -// } - -// # Inverse mappings for easy querying -// { :create node_has_key { key: String => id: String } } -// { ::index create node_has_key:inverse { id } } -// { :create node_managed_by_app { node_id: String => app: String } } -// { :create node_refers_to { node_id: String => other_node_id: String } } -// { -// :create fqkey_to_dbkey { -// key: String -// => -// relation: String, -// field_name: String, -// type: String, -// is_fts_enabled: Bool, -// } -// } -// { -// ?[key, relation, field_name, type, is_fts_enabled] <- [ -// ['panorama/journal/page/day', 'journal_day', 'day', 'string', false], -// ['panorama/journal/page/title', 'journal', 'title', 'string', true], -// ['panorama/journal/page/content', 'journal', 'content', 'string', true], -// ['panorama/mail/config/imap_hostname', 'mail_config', 'imap_hostname', 'string', false], -// ['panorama/mail/config/imap_port', 'mail_config', 'imap_port', 'int', false], -// ['panorama/mail/config/imap_username', 'mail_config', 'imap_username', 'string', false], -// ['panorama/mail/config/imap_password', 'mail_config', 'imap_password', 'string', false], -// ['panorama/mail/message/body', 'message', 'body', 'string', true], -// ['panorama/mail/message/subject', 'message', 'subject', 'string', true], -// ['panorama/mail/message/message_id', 'message', 'message_id', 'string', false], -// ] -// :put fqkey_to_dbkey { key, relation, field_name, type, is_fts_enabled } -// } - -// # Create journal type -// { :create journal { node_id: String => title: String default '', content: String } } -// { :create journal_day { day: String => node_id: String } } - -// # Mail -// { -// :create mail_config { -// node_id: String -// => -// imap_hostname: String, -// imap_port: Int, -// imap_username: String, -// imap_password: String, -// } -// } -// { -// :create mailbox { -// node_id: String -// => -// account_node_id: String, -// mailbox_name: String, -// uid_validity: Int? default null, -// extra_data: Json default {}, -// } -// } -// { ::index create mailbox:by_account_id_and_name { account_node_id, mailbox_name } } -// { -// :create message { -// node_id: String -// => -// message_id: String, -// account_node_id: String, -// mailbox_node_id: String, -// subject: String, -// headers: Json?, -// body: Bytes, -// internal_date: String, -// } -// } -// { ::index create message:message_id { message_id } } -// { ::index create message:date { internal_date } } -// { ::index create message:by_mailbox_id { mailbox_node_id } } - -// # Calendar -// ", -// "", -// false, -// ); -// ensure_ok(&result)?; - -// Ok(()) -// } diff --git a/crates/panorama-core/src/state/apps/internal.rs b/crates/panorama-core/src/state/apps/internal.rs deleted file mode 100644 index 42cbf2a..0000000 --- a/crates/panorama-core/src/state/apps/internal.rs +++ /dev/null @@ -1,51 +0,0 @@ -use std::io::{stdout, Write}; - -use anyhow::Result; -use chrono::{DateTime, Utc}; -use wasmtime::{Caller, InstancePre, Linker, Memory}; - -pub struct WasmtimeModule { - pub(crate) module: InstancePre, -} - -impl WasmtimeModule { - pub fn link_imports(linker: &mut Linker) -> Result<()> { - macro_rules! link_function { - ($($module:literal :: $func:ident),* $(,)?) => { - linker $( - .func_wrap( - $module, - concat!("_", stringify!($func)), - WasmtimeInstanceEnv::$func, - )? - )*; - }; - } - abi_funcs!(link_function); - Ok(()) - } -} - -/// This is loosely based on SpacetimeDB's implementation of their host. -/// See: https://github.com/clockworklabs/SpacetimeDB/blob/c19c0d45c454db2a4215deb23c7f9f82cb5d7561/crates/core/src/host/wasmtime/wasm_instance_env.rs -pub struct WasmtimeInstanceEnv { - /// This is only an Option because memory is initialized after this is created so we need to come back and put it in later - pub(crate) mem: Option, -} - -impl WasmtimeInstanceEnv { - pub fn print(mut caller: Caller<'_, Self>, len: u64, ptr: u32) { - let mem = caller.data().mem.unwrap(); - let mut buffer = vec![0; len as usize]; - mem.read(caller, ptr as usize, &mut buffer); - let s = String::from_utf8(buffer).unwrap(); - println!("Called print: {}", s); - } - - pub fn get_current_time(_: Caller<'_, Self>) -> i64 { - let now = Utc::now(); - now.timestamp_nanos_opt().unwrap() - } - - pub fn register_endpoint(mut caller: Caller<'_, Self>) {} -} diff --git a/crates/panorama-core/src/state/apps/macros.rs b/crates/panorama-core/src/state/apps/macros.rs deleted file mode 100644 index d9fa4a2..0000000 --- a/crates/panorama-core/src/state/apps/macros.rs +++ /dev/null @@ -1,10 +0,0 @@ -macro_rules! abi_funcs { - ($macro_name:ident) => { - // TODO: Why is this "env"? How do i use another name - $macro_name! { - "env"::get_current_time, - "env"::print, - "env"::register_endpoint, - } - }; -} diff --git a/crates/panorama-core/src/state/apps/memory.rs b/crates/panorama-core/src/state/apps/memory.rs deleted file mode 100644 index 8fd0f50..0000000 --- a/crates/panorama-core/src/state/apps/memory.rs +++ /dev/null @@ -1,7 +0,0 @@ -use anyhow::Result; - -pub struct Memory { - pub memory: wasmtime::Memory, -} - -impl Memory {} diff --git a/crates/panorama-core/src/state/apps/mod.rs b/crates/panorama-core/src/state/apps/mod.rs deleted file mode 100644 index c8cbd06..0000000 --- a/crates/panorama-core/src/state/apps/mod.rs +++ /dev/null @@ -1,160 +0,0 @@ -#[macro_use] -pub mod macros; -pub mod internal; -pub mod manifest; -pub mod memory; - -use std::{ - collections::HashMap, - fs::{self, File}, - io::Read, - path::{Path, PathBuf}, -}; - -use anyhow::{anyhow, Context as _, Result}; -use internal::{WasmtimeInstanceEnv, WasmtimeModule}; -use itertools::Itertools; -use wasmtime::{AsContext, Config, Engine, Linker, Memory, Module, Store}; - -use crate::AppState; - -use self::manifest::AppManifest; - -pub type AllAppData = HashMap; - -impl AppState { - pub async fn install_apps_from_search_paths(&self) -> Result { - let search_paths = vec![ - PathBuf::from("/Users/michael/Projects/panorama/apps"), - PathBuf::from("/home/michael/Projects/panorama/apps"), - ]; - - let mut found = Vec::new(); - - for path in search_paths { - if !path.exists() { - continue; - } - - let read_dir = fs::read_dir(&path) - .with_context(|| format!("could not read {}", path.display()))?; - - for dir_entry in read_dir { - let dir_entry = dir_entry?; - let path = dir_entry.path(); - - let manifest_path = path.join("manifest.yml"); - if manifest_path.exists() { - found.push(path); - } - } - } - - let mut all_app_data = HashMap::new(); - for path in found { - let app_data = self.install_app_from_path(&path).await?; - println!("App data: {:?}", app_data); - all_app_data.insert( - path.display().to_string(), - AppData { - name: "hello".to_string(), - }, - ); - } - - Ok(all_app_data) - } -} - -#[derive(Debug)] -pub struct AppData { - name: String, -} - -impl AppState { - async fn install_app_from_path(&self, path: impl AsRef) -> Result<()> { - let app_path = path.as_ref(); - let manifest_path = app_path.join("manifest.yml"); - let manifest: AppManifest = { - let file = File::open(&manifest_path)?; - serde_yaml::from_reader(file).with_context(|| { - format!( - "Could not parse config file from {}", - manifest_path.display() - ) - })? - }; - println!("Manifest: {:?}", manifest); - - let module_path = app_path.join(manifest.module); - - let installer_program = { - let mut file = File::open(&module_path).with_context(|| { - format!( - "Could not open installer from path: {}", - module_path.display() - ) - })?; - let mut buf = Vec::new(); - file.read_to_end(&mut buf)?; - buf - }; - - println!("Installer program: {} bytes", installer_program.len()); - - let config = Config::new(); - let engine = Engine::new(&config)?; - let module = Module::new(&engine, &installer_program)?; - - let mut linker = Linker::new(&engine); - WasmtimeModule::link_imports(&mut linker)?; - let module = linker.instantiate_pre(&module)?; - let module = WasmtimeModule { module }; - - let mut state = WasmtimeInstanceEnv { mem: None }; - let mut store = Store::new(&engine, state); - println!( - "Required imports: {:?}", - module - .module - .module() - .imports() - .map(|s| s.name()) - .collect_vec() - ); - let instance = module - .module - .instantiate(&mut store) - .context("Could not instantiate")?; - let mem = instance - .get_memory(&mut store, "memory") - .ok_or_else(|| anyhow!("Fuck!"))?; - store.data_mut().mem = Some(mem); - - instance.exports(&mut store).for_each(|export| { - println!("Export: {}", export.name()); - }); - - let hello = instance - .get_typed_func::<(), i32>(&mut store, "install") - .context("Could not get typed function")?; - hello.call(&mut store, ()).context("Could not call")?; - - Ok(()) - } -} - -fn read_utf_8string( - c: C, - mem: &Memory, - len: usize, - offset: usize, -) -> Result -where - C: AsContext, -{ - let mut buffer = vec![0; len]; - mem.read(c, offset, &mut buffer)?; - let string = String::from_utf8(buffer)?; - Ok(string) -} diff --git a/crates/panorama-core/src/state/appsv0/manifest.rs b/crates/panorama-core/src/state/appsv0/manifest.rs deleted file mode 100644 index fee2edc..0000000 --- a/crates/panorama-core/src/state/appsv0/manifest.rs +++ /dev/null @@ -1,27 +0,0 @@ -use std::path::PathBuf; - -use schemars::JsonSchema; - -#[derive(Debug, Serialize, Deserialize, JsonSchema)] -pub struct AppManifest { - pub name: String, - pub version: Option, - pub panorama_version: Option, - pub description: Option, - pub module: PathBuf, - - #[serde(default)] - pub endpoints: Vec, - #[serde(default)] - pub triggers: Vec, -} - -#[derive(Debug, Serialize, Deserialize, JsonSchema)] -pub struct AppManifestEndpoint { - pub url: String, - pub method: String, - pub export_name: String, -} - -#[derive(Debug, Serialize, Deserialize, JsonSchema)] -pub struct AppManifestTriggers {} diff --git a/crates/panorama-core/src/state/appsv0/mod.rs b/crates/panorama-core/src/state/appsv0/mod.rs deleted file mode 100644 index c3a9fb8..0000000 --- a/crates/panorama-core/src/state/appsv0/mod.rs +++ /dev/null @@ -1,74 +0,0 @@ -pub mod manifest; - -use std::{ - collections::HashMap, - fs::{self, File}, - path::{Path, PathBuf}, -}; - -use anyhow::{Context as _, Result}; - -use crate::AppState; - -use self::manifest::AppManifest; - -impl AppState { - pub async fn install_apps_from_search_paths(&self) -> Result<()> { - let search_paths = vec![ - PathBuf::from("/Users/michael/Projects/panorama/apps"), - PathBuf::from("/home/michael/Projects/panorama/apps"), - ]; - - let mut found = Vec::new(); - - for path in search_paths { - if !path.exists() { - continue; - } - - let read_dir = fs::read_dir(&path) - .with_context(|| format!("could not read {}", path.display()))?; - - for dir_entry in read_dir { - let dir_entry = dir_entry?; - let path = dir_entry.path(); - - let manifest_path = path.join("manifest.yml"); - if manifest_path.exists() { - found.push(path); - } - } - } - - // let mut all_app_data = HashMap::new(); - // for path in found { - // let app_data = self.install_app_from_path(&path).await?; - // println!("App data: {:?}", app_data); - // all_app_data.insert( - // path.display().to_string(), - // AppData { - // name: "hello".to_string(), - // }, - // ); - // } - - Ok(()) - } - - async fn install_app_from_path(&self, path: impl AsRef) -> Result<()> { - let app_path = path.as_ref(); - let manifest_path = app_path.join("manifest.yml"); - let manifest: AppManifest = { - let file = File::open(&manifest_path)?; - serde_yaml::from_reader(file).with_context(|| { - format!( - "Could not parse config file from {}", - manifest_path.display() - ) - })? - }; - println!("Manifest: {:?}", manifest); - - todo!() - } -} diff --git a/crates/panorama-core/src/state/codetrack.rs b/crates/panorama-core/src/state/codetrack.rs deleted file mode 100644 index 9710d2b..0000000 --- a/crates/panorama-core/src/state/codetrack.rs +++ /dev/null @@ -1,3 +0,0 @@ -use crate::AppState; - -impl AppState {} diff --git a/crates/panorama-core/src/state/export.rs b/crates/panorama-core/src/state/export.rs deleted file mode 100644 index 1f39d86..0000000 --- a/crates/panorama-core/src/state/export.rs +++ /dev/null @@ -1,77 +0,0 @@ -use std::collections::HashMap; - -use anyhow::Result; -use cozo::ScriptMutability; -use serde_json::Value; - -use crate::AppState; - -use super::utils::data_value_to_json_value; - -impl AppState { - pub async fn export(&self) -> Result { - let result = self.db.run_script( - "::relations", - Default::default(), - ScriptMutability::Immutable, - )?; - - let name_index = result.headers.iter().position(|x| x == "name").unwrap(); - let relation_names = result - .rows - .into_iter() - .map(|row| row[name_index].get_str().unwrap().to_owned()) - .collect::>(); - - let mut relation_columns = HashMap::new(); - - for relation_name in relation_names.iter() { - let result = self.db.run_script( - &format!("::columns {relation_name}"), - Default::default(), - ScriptMutability::Immutable, - )?; - - let column_index = - result.headers.iter().position(|x| x == "column").unwrap(); - let columns = result - .rows - .into_iter() - .map(|row| row[column_index].get_str().unwrap().to_owned()) - .collect::>(); - - relation_columns.insert(relation_name.clone(), columns); - } - - let tx = self.db.multi_transaction(false); - - let mut all_relations = hmap! {}; - for relation_name in relation_names.iter() { - if relation_name.contains(":") { - continue; - } - - let mut relation_info = vec![]; - - let columns = relation_columns.get(relation_name.as_str()).unwrap(); - let columns_str = columns.join(", "); - - let query = - format!("?[{columns_str}] := *{relation_name} {{ {columns_str} }}"); - let result = tx.run_script(&query, Default::default())?; - - for row in result.rows.into_iter() { - let mut object = hmap! {}; - row.into_iter().enumerate().for_each(|(idx, col)| { - object - .insert(columns[idx].to_owned(), data_value_to_json_value(&col)); - }); - relation_info.push(object); - } - - all_relations.insert(relation_name.to_owned(), relation_info); - } - - Ok(json!({"relations": all_relations})) - } -} diff --git a/crates/panorama-core/src/state/journal.rs b/crates/panorama-core/src/state/journal.rs deleted file mode 100644 index 364f010..0000000 --- a/crates/panorama-core/src/state/journal.rs +++ /dev/null @@ -1,56 +0,0 @@ -use std::str::FromStr; - -use anyhow::Result; -use chrono::Local; -use uuid::Uuid; - -use crate::{AppState, NodeId}; - -use super::node::CreateOrUpdate; - -impl AppState { - pub async fn get_todays_journal_id(&self) -> Result { - let today = todays_date(); - - let result = self.db.run_script( - " - ?[node_id] := *journal_day{day, node_id}, day = $day - ", - btmap! { - "day".to_owned() => today.clone().into(), - }, - ScriptMutability::Immutable, - )?; - - // TODO: Do this check on the server side - if result.rows.len() == 0 { - // Insert a new one - // let uuid = Uuid::now_v7(); - // let node_id = uuid.to_string(); - - let node_info = self - .create_or_update_node( - CreateOrUpdate::Create { - r#type: "panorama/journal/page".to_owned(), - }, - Some(btmap! { - "panorama/journal/page/day".to_owned() => today.clone().into(), - "panorama/journal/page/content".to_owned() => "".to_owned().into(), - "panorama/journal/page/title".to_owned() => today.clone().into(), - }), - ) - .await?; - - return Ok(node_info.node_id); - } - - let node_id = result.rows[0][0].get_str().unwrap(); - Ok(NodeId(Uuid::from_str(node_id).into_diagnostic()?)) - } -} - -fn todays_date() -> String { - let now = Local::now(); - let date = now.date_naive(); - date.format("%Y-%m-%d").to_string() -} diff --git a/crates/panorama-core/src/state/mail.rs b/crates/panorama-core/src/state/mail.rs deleted file mode 100644 index 362c322..0000000 --- a/crates/panorama-core/src/state/mail.rs +++ /dev/null @@ -1,47 +0,0 @@ -use std::{collections::HashMap, str::FromStr, time::Duration}; - -use anyhow::Result; -use cozo::{DataValue, JsonData, ScriptMutability}; -use futures::TryStreamExt; -use tokio::{net::TcpStream, time::sleep}; -use uuid::Uuid; - -use crate::{AppState, NodeId}; - -#[derive(Debug, Serialize)] -pub struct MailConfig { - pub node_id: NodeId, - pub imap_hostname: String, - pub imap_port: u16, - pub imap_username: String, - pub imap_password: String, -} - -impl AppState { - /// Fetch the list of mail configs in the database - pub fn fetch_mail_configs(&self) -> Result> { - let result = self.db.run_script( - " - ?[node_id, imap_hostname, imap_port, imap_username, imap_password] := - *node{ id: node_id }, - *mail_config{ node_id, imap_hostname, imap_port, imap_username, imap_password } - ", - Default::default(), - ScriptMutability::Immutable, - )?; - - let result = result - .rows - .into_iter() - .map(|row| MailConfig { - node_id: NodeId(Uuid::from_str(row[0].get_str().unwrap()).unwrap()), - imap_hostname: row[1].get_str().unwrap().to_owned(), - imap_port: row[2].get_int().unwrap() as u16, - imap_username: row[3].get_str().unwrap().to_owned(), - imap_password: row[4].get_str().unwrap().to_owned(), - }) - .collect::>(); - - Ok(result) - } -} diff --git a/crates/panorama-core/src/state/mod.rs b/crates/panorama-core/src/state/mod.rs deleted file mode 100644 index 0cc8b1e..0000000 --- a/crates/panorama-core/src/state/mod.rs +++ /dev/null @@ -1,117 +0,0 @@ -// pub mod apps; -// pub mod codetrack; -// pub mod export; -// pub mod journal; -// pub mod mail; -pub mod appsv0; -pub mod node; -pub mod node_raw; -// pub mod utils; - -use std::{collections::HashMap, fs, path::Path}; - -use anyhow::{Context, Result}; -use bimap::BiMap; -use sqlx::{ - pool::PoolConnection, - sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions}, - Sqlite, SqlitePool, -}; -use tantivy::{ - directory::MmapDirectory, - schema::{Field, Schema, STORED, STRING, TEXT}, - Index, -}; -use wasmtime::Module; - -use crate::{ - // mail::MailWorker, - migrations::MIGRATOR, -}; - -pub fn tantivy_schema() -> (Schema, BiMap) { - let mut schema_builder = Schema::builder(); - - let mut field_map = BiMap::new(); - - let node_id = schema_builder.add_text_field("node_id", STRING | STORED); - field_map.insert("node_id".to_owned(), node_id); - - let journal_content = schema_builder.add_text_field("title", TEXT | STORED); - field_map.insert("panorama/journal/page/content".to_owned(), journal_content); - - (schema_builder.build(), field_map) -} - -#[derive(Clone)] -pub struct AppState { - pub db: SqlitePool, - pub tantivy_index: Index, - pub tantivy_field_map: BiMap, - - pub app_wasm_modules: HashMap, - // TODO: Compile this into a more efficient thing than just iter - pub app_routes: HashMap>, -} - -#[derive(Clone)] -pub struct AppRoute { - route: String, - handler_name: String, -} - -impl AppState { - pub async fn new(panorama_dir: impl AsRef) -> Result { - let panorama_dir = panorama_dir.as_ref().to_path_buf(); - fs::create_dir_all(&panorama_dir) - .context("Could not create panorama directory")?; - - println!("Panorama dir: {}", panorama_dir.display()); - - let (tantivy_index, tantivy_field_map) = { - let (schema, field_map) = tantivy_schema(); - let tantivy_path = panorama_dir.join("tantivy-index"); - fs::create_dir_all(&tantivy_path)?; - let dir = MmapDirectory::open(&tantivy_path)?; - let index = Index::builder().schema(schema).open_or_create(dir)?; - (index, field_map) - }; - - let db_path = panorama_dir.join("db.sqlite"); - let sqlite_connect_options = SqliteConnectOptions::new() - .filename(db_path) - .journal_mode(SqliteJournalMode::Wal) - .create_if_missing(true); - let db = SqlitePoolOptions::new() - .connect_with(sqlite_connect_options) - .await - .context("Could not connect to SQLite database")?; - - let state = AppState { - db, - tantivy_index, - tantivy_field_map, - app_wasm_modules: Default::default(), - app_routes: Default::default(), - }; - state.init().await?; - - Ok(state) - } - - pub async fn conn(&self) -> Result> { - self.db.acquire().await.map_err(|err| err.into()) - } - - async fn init(&self) -> Result<()> { - // run_migrations(&self.db).await?; - MIGRATOR - .run(&self.db) - .await - .context("Could not migrate database")?; - - Ok(()) - } - - pub fn handle_app_route() {} -} diff --git a/crates/panorama-core/src/state/node.rs b/crates/panorama-core/src/state/node.rs deleted file mode 100644 index 893656d..0000000 --- a/crates/panorama-core/src/state/node.rs +++ /dev/null @@ -1,523 +0,0 @@ -use std::collections::{BTreeMap, HashMap}; - -use anyhow::Result; -use chrono::{DateTime, Utc}; -use itertools::Itertools; -use serde_json::Value; -use sqlx::{Connection, Executor, FromRow, QueryBuilder, Sqlite}; -use uuid::Uuid; - -use crate::{state::node_raw::FieldMappingRow, AppState, NodeId}; - -// use super::utils::owned_value_to_json_value; - -pub type ExtraData = BTreeMap; -pub type FieldsByTable<'a> = - HashMap<(&'a i64, &'a String), Vec<&'a FieldMappingRow>>; - -#[derive(Debug)] -pub struct NodeInfo { - pub node_id: NodeId, - pub created_at: DateTime, - pub updated_at: DateTime, - pub fields: Option>, -} - -impl AppState { - /// Get all properties of a node - pub async fn get_node(&self, node_id: impl AsRef) -> Result { - let node_id = node_id.as_ref().to_owned(); - let mut conn = self.conn().await?; - - conn - .transaction::<_, _, sqlx::Error>(|tx| { - Box::pin(async move { - let node_id = node_id.clone(); - let field_mapping = - AppState::get_related_field_list_for_node_id(&mut **tx, &node_id) - .await?; - - // Group the keys by which relation they're in - let fields_by_table = field_mapping.iter().into_group_map_by( - |FieldMappingRow { - app_id, - app_table_name, - .. - }| (app_id, app_table_name), - ); - - // Run the query that grabs all of the relevant fields, and coalesce - // the fields back - let related_fields = - AppState::query_related_fields(&mut **tx, &fields_by_table).await?; - - println!("Related fields: {:?}", related_fields); - - // let created_at = DateTime::from_timestamp_millis( - // (result.rows[0][2].get_float().unwrap() * 1000.0) as i64, - // ) - // .unwrap(); - - // let updated_at = DateTime::from_timestamp_millis( - // (result.rows[0][3].get_float().unwrap() * 1000.0) as i64, - // ) - // .unwrap(); - - // let mut fields = HashMap::new(); - - // for row in result - // .rows - // .into_iter() - // .map(|row| row.into_iter().skip(4).zip(all_fields.iter())) - // { - // for (value, (_, _, field_name)) in row { - // fields.insert( - // field_name.to_string(), - // data_value_to_json_value(&value), - // ); - // } - // } - - todo!() - - // Ok(NodeInfo { - // node_id: NodeId(Uuid::from_str(&node_id).unwrap()), - // created_at, - // updated_at, - // fields: Some(fields), - // }) - }) - }) - .await?; - - todo!() - // Ok(()) - } - - async fn query_related_fields<'e, 'c: 'e, X>( - x: X, - fields_by_table: &FieldsByTable<'_>, - ) -> sqlx::Result> - where - X: 'e + Executor<'c, Database = Sqlite>, - { - let mut query = QueryBuilder::new(""); - let mut mapping = HashMap::new(); - let mut ctr = 0; - - let mut selected_fields = vec![]; - for ((app_id, app_table_name), fields) in fields_by_table.iter() { - let table_gen_name = format!("c{ctr}"); - ctr += 1; - - let mut keys = vec![]; - for field_info in fields.iter() { - let field_gen_name = format!("f{ctr}"); - ctr += 1; - mapping.insert(&field_info.full_key, field_gen_name.clone()); - - keys.push(field_gen_name.clone()); - - selected_fields.push(format!( - "{}.{} as {}", - table_gen_name, field_info.app_table_field, field_gen_name - )); - - // constraints.push(format!( - // "{}: {}", - // field_info.relation_field.to_owned(), - // field_gen_name, - // )); - // all_fields.push(( - // field_gen_name, - // field_info.relation_field.to_owned(), - // key, - // )) - } - - // let keys = keys.join(", "); - // let constraints = constraints.join(", "); - // all_relation_queries.push(format!( - // " - // {table_gen_name}[{keys}] := - // *{relation}{{ node_id, {constraints} }}, - // node_id = $node_id - // " - // )); - // all_relation_constraints.push(format!("{table_gen_name}[{keys}],")) - } - - if selected_fields.is_empty() { - return Ok(HashMap::new()); - } - - query.push("SELECT "); - query.push(selected_fields.join(", ")); - query.push(" FROM "); - println!("Query: {:?}", query.sql()); - - // let all_relation_constraints = all_relation_constraints.join("\n"); - // let all_relation_queries = all_relation_queries.join("\n\n"); - // let all_field_names = all_fields - // .iter() - // .map(|(field_name, _, _)| field_name) - // .join(", "); - // let _query = format!( - // " - // {all_relation_queries} - - // ?[type, extra_data, created_at, updated_at, {all_field_names}] := - // *node {{ id, type, created_at, updated_at, extra_data }}, - // {all_relation_constraints} - // id = $node_id - // " - // ); - - let rows = query.build().fetch_all(x).await; - - todo!() - } -} - -#[derive(Debug)] -pub enum CreateOrUpdate { - Create { r#type: String }, - Update { node_id: NodeId }, -} - -impl AppState { - // TODO: Split this out into create and update - pub async fn create_or_update_node( - &self, - opts: CreateOrUpdate, - extra_data: Option, - ) -> Result { - let node_id = match opts { - CreateOrUpdate::Create { .. } => NodeId(Uuid::now_v7()), - CreateOrUpdate::Update { ref node_id } => node_id.clone(), - }; - let node_id = node_id.to_string(); - - let action = match opts { - CreateOrUpdate::Create { .. } => "put", - CreateOrUpdate::Update { .. } => "update", - }; - - println!("Request: {opts:?} {extra_data:?}"); - - let mut conn = self.conn().await?; - - conn - .transaction::<_, _, sqlx::Error>(|tx| { - Box::pin(async move { - let node_info = match opts { - CreateOrUpdate::Create { r#type } => { - AppState::create_node_raw(&mut **tx, &r#type).await? - } - CreateOrUpdate::Update { node_id } => todo!(), - }; - - if let Some(extra_data) = extra_data { - if !extra_data.is_empty() { - let node_id_str = node_id.to_string(); - let field_mapping = AppState::get_related_field_list_for_node_id( - &mut **tx, - &node_id_str, - ) - .await?; - - // Group the keys by which relation they're in - let fields_by_table = field_mapping.iter().into_group_map_by( - |FieldMappingRow { - app_id, - app_table_name, - .. - }| (app_id, app_table_name), - ); - - AppState::write_extra_data( - &mut **tx, - &node_id_str, - &fields_by_table, - extra_data, - ) - .await?; - } - } - - Ok(node_info) - }) - }) - .await - .map_err(|err| err.into()) - } - - async fn create_node_raw<'e, 'c: 'e, X>( - x: X, - r#type: &str, - ) -> sqlx::Result - where - X: 'e + Executor<'c, Database = Sqlite>, - { - let node_id = Uuid::now_v7(); - let node_id_str = node_id.to_string(); - - #[derive(FromRow)] - struct Result { - updated_at: i64, - } - - let result = sqlx::query_as!( - Result, - r#" - INSERT INTO node (node_id, node_type, extra_data) - VALUES (?, ?, "{}") - RETURNING updated_at - "#, - node_id_str, - r#type, - ) - .fetch_one(x) - .await?; - - let updated_at = - DateTime::from_timestamp_millis(result.updated_at * 1000).unwrap(); - let created_at = DateTime::from_timestamp_millis( - node_id.get_timestamp().unwrap().to_unix().0 as i64 * 1000, - ) - .unwrap(); - - Ok(NodeInfo { - node_id: NodeId(node_id), - created_at, - updated_at, - fields: None, - }) - } - - async fn write_extra_data<'e, 'c: 'e, X>( - x: X, - node_id: &str, - fields_by_table: &FieldsByTable<'_>, - extra_data: ExtraData, - ) -> sqlx::Result<()> - where - X: 'e + Executor<'c, Database = Sqlite>, - { - // Update Tantivy indexes - // for ((app_id, app_table_name), fields) in fields_by_table.iter() { - // let mut writer = - // self.tantivy_index.writer(15_000_000).into_diagnostic()?; - - // let delete_term = Term::from_field_text(node_id_field.clone(), &node_id); - // writer.delete_term(delete_term); - - // writer.add_document(doc).into_diagnostic()?; - // writer.commit().into_diagnostic()?; - // drop(writer); - // } - - // Update database - let mut node_has_keys = Vec::new(); - println!("Fields by table: {:?}", fields_by_table); - for ((app_id, app_table_name), fields) in fields_by_table.iter() { - for field_info in fields { - node_has_keys.push(&field_info.full_key); - } - - // let mut doc = - // btmap! { node_id_field.clone() => OwnedValue::Str(node_id.to_owned()) }; - // let fields_mapping = fields - // .into_iter() - // .map( - // |( - // key, - // FieldInfo { - // relation_field, - // r#type, - // is_fts_enabled, - // .. - // }, - // )| { - // let new_value = extra_data.get(*key).unwrap(); - - // // TODO: Make this more generic - // let new_value = match r#type.as_str() { - // "int" => DataValue::from(new_value.as_i64().unwrap()), - // _ => DataValue::from(new_value.as_str().unwrap()), - // }; - - // if *is_fts_enabled { - // if let Some(field) = self.tantivy_field_map.get_by_left(*key) { - // doc.insert( - // field.clone(), - // OwnedValue::Str(new_value.get_str().unwrap().to_owned()), - // ); - // } - // } - - // (relation_field.to_owned(), new_value) - // }, - // ) - // .collect::>(); - - // let keys = fields_mapping.keys().collect::>(); - // let keys_joined = keys.iter().join(", "); - - // if !keys.is_empty() { - // let query = format!( - // " - // ?[ node_id, {keys_joined} ] <- [$input_data] - // :{action} {relation} {{ node_id, {keys_joined} }} - // " - // ); - - // let mut params = vec![]; - // params.push(DataValue::from(node_id.clone())); - // for key in keys { - // params.push(fields_mapping[key].clone()); - // } - - // let result = tx.run_script( - // &query, - // btmap! { - // "input_data".to_owned() => DataValue::List(params), - // }, - // ); - // } - } - - if !node_has_keys.is_empty() { - let mut query = - QueryBuilder::new("INSERT INTO node_has_key (node_id, full_key) "); - query.push_values(node_has_keys, |mut b, key| { - b.push_bind(node_id).push_bind(key); - }); - println!("Query: {:?}", query.sql()); - query.build().execute(x).await?; - } - - Ok(()) - } -} - -// impl AppState { - -// pub async fn update_node() {} - -// pub async fn search_nodes( -// &self, -// query: impl AsRef, -// ) -> Result> { -// let query = query.as_ref(); - -// let reader = self.tantivy_index.reader().into_diagnostic()?; -// let searcher = reader.searcher(); - -// let node_id_field = self -// .tantivy_field_map -// .get_by_left("node_id") -// .unwrap() -// .clone(); -// let journal_page_field = self -// .tantivy_field_map -// .get_by_left("panorama/journal/page/content") -// .unwrap() -// .clone(); -// let mut query_parser = -// QueryParser::for_index(&self.tantivy_index, vec![journal_page_field]); -// query_parser.set_field_fuzzy(journal_page_field, true, 2, true); -// let query = query_parser.parse_query(query).into_diagnostic()?; - -// let top_docs = searcher -// .search(&query, &TopDocs::with_limit(10)) -// .into_diagnostic()?; - -// Ok( -// top_docs -// .into_iter() -// .map(|(score, doc_address)| { -// let retrieved_doc = -// searcher.doc::(doc_address).unwrap(); -// let node_id = retrieved_doc -// .get_first(node_id_field.clone()) -// .unwrap() -// .as_str() -// .unwrap(); -// let all_fields = retrieved_doc.get_sorted_field_values(); -// let node_id = NodeId(Uuid::from_str(node_id).unwrap()); -// let fields = all_fields -// .into_iter() -// .map(|(field, values)| { -// ( -// self.tantivy_field_map.get_by_right(&field).unwrap(), -// if values.len() == 1 { -// owned_value_to_json_value(values[0]) -// } else { -// Value::Array( -// values -// .into_iter() -// .map(owned_value_to_json_value) -// .collect_vec(), -// ) -// }, -// ) -// }) -// .collect::>(); -// ( -// node_id, -// json!({ -// "score": score, -// "fields": fields, -// }), -// ) -// }) -// .collect::>(), -// ) -// } - -// fn get_rows_for_extra_keys( -// &self, -// tx: &MultiTransaction, -// keys: &[String], -// ) -> Result { -// let result = tx.run_script( -// " -// ?[key, relation, field_name, type, is_fts_enabled] := -// *fqkey_to_dbkey{key, relation, field_name, type, is_fts_enabled}, -// is_in(key, $keys) -// ", -// btmap! { -// "keys".to_owned() => DataValue::List( -// keys.into_iter() -// .map(|s| DataValue::from(s.as_str())) -// .collect::>() -// ), -// }, -// )?; - -// AppState::rows_to_field_mapping(result) -// } - -// fn rows_to_field_mapping(result: NamedRows) -> Result { -// let s = |s: &DataValue| s.get_str().unwrap().to_owned(); - -// Ok( -// result -// .rows -// .into_iter() -// .map(|row| { -// ( -// s(&row[0]), -// FieldInfo { -// relation_name: s(&row[1]), -// relation_field: s(&row[2]), -// r#type: s(&row[3]), -// is_fts_enabled: row[4].get_bool().unwrap(), -// }, -// ) -// }) -// .collect::>(), -// ) -// } -// } diff --git a/crates/panorama-core/src/state/node_raw.rs b/crates/panorama-core/src/state/node_raw.rs deleted file mode 100644 index 102f979..0000000 --- a/crates/panorama-core/src/state/node_raw.rs +++ /dev/null @@ -1,42 +0,0 @@ -use sqlx::{Executor, FromRow, Sqlite}; - -use crate::AppState; - -#[derive(Debug, FromRow)] -pub struct FieldMappingRow { - pub full_key: String, - pub app_id: i64, - pub app_table_name: String, - pub app_table_field: String, - pub db_table_name: Option, -} - -impl AppState { - pub(crate) async fn get_related_field_list_for_node_id<'e, 'c: 'e, X>( - x: X, - node_id: &str, - ) -> sqlx::Result> - where - X: 'e + Executor<'c, Database = Sqlite>, - { - sqlx::query_as!( - FieldMappingRow, - " - SELECT - node_has_key.full_key, key_mapping.app_id, - key_mapping.app_table_name, app_table_field, - app_table_mapping.db_table_name - FROM node_has_key - INNER JOIN key_mapping - ON node_has_key.full_key = key_mapping.full_key - INNER JOIN app_table_mapping - ON key_mapping.app_id = app_table_mapping.app_id - AND key_mapping.app_table_name = app_table_mapping.app_table_name - WHERE node_id = $1 - ", - node_id - ) - .fetch_all(x) - .await - } -} diff --git a/crates/panorama-core/src/state/utils.rs b/crates/panorama-core/src/state/utils.rs deleted file mode 100644 index ef2d54a..0000000 --- a/crates/panorama-core/src/state/utils.rs +++ /dev/null @@ -1,59 +0,0 @@ -use itertools::Itertools; -use serde_json::{Number, Value}; -use tantivy::schema::OwnedValue; - -pub fn owned_value_to_json_value(data_value: &OwnedValue) -> Value { - match data_value { - OwnedValue::Null => Value::Null, - OwnedValue::Str(s) => Value::String(s.to_string()), - OwnedValue::U64(u) => Value::Number(Number::from(*u)), - OwnedValue::I64(i) => Value::Number(Number::from(*i)), - OwnedValue::F64(f) => Value::Number(Number::from_f64(*f).unwrap()), - OwnedValue::Bool(b) => Value::Bool(*b), - OwnedValue::Array(a) => { - Value::Array(a.into_iter().map(owned_value_to_json_value).collect_vec()) - } - OwnedValue::Object(o) => Value::Object( - o.into_iter() - .map(|(k, v)| (k.to_owned(), owned_value_to_json_value(v))) - .collect(), - ), - _ => { - println!("Converting unknown {:?}", data_value); - serde_json::to_value(data_value).unwrap() - } // OwnedValue::Date(_) => todo!(), - // OwnedValue::Facet(_) => todo!(), - // OwnedValue::Bytes(_) => todo!(), - // OwnedValue::IpAddr(_) => todo!(), - // OwnedValue::PreTokStr(_) => todo!(), - } -} - -// pub fn data_value_to_json_value(data_value: &DataValue) -> Value { -// match data_value { -// DataValue::Null => Value::Null, -// DataValue::Bool(b) => Value::Bool(*b), -// DataValue::Num(n) => Value::Number(match n { -// Num::Int(i) => Number::from(*i), -// Num::Float(f) => Number::from_f64(*f).unwrap(), -// }), -// DataValue::Str(s) => Value::String(s.to_string()), -// DataValue::List(v) => { -// Value::Array(v.into_iter().map(data_value_to_json_value).collect_vec()) -// } -// DataValue::Json(v) => v.0.clone(), -// DataValue::Bytes(s) => { -// Value::String(String::from_utf8_lossy(s).to_string()) -// } -// _ => { -// println!("Converting unknown {:?}", data_value); -// serde_json::to_value(data_value).unwrap() -// } // DataValue::Bytes(s) => todo!(), -// // DataValue::Uuid(_) => todo!(), -// // DataValue::Regex(_) => todo!(), -// // DataValue::Set(_) => todo!(), -// // DataValue::Vec(_) => todo!(), -// // DataValue::Validity(_) => todo!(), -// // DataValue::Bot => todo!(), -// } -// } diff --git a/crates/panorama-core/src/tests/mod.rs b/crates/panorama-core/src/tests/mod.rs deleted file mode 100644 index c9725de..0000000 --- a/crates/panorama-core/src/tests/mod.rs +++ /dev/null @@ -1,87 +0,0 @@ -use anyhow::Result; -use sqlx::SqlitePool; -use tantivy::Index; - -use crate::{ - migrations::MIGRATOR, - state::{node::CreateOrUpdate, tantivy_schema}, - AppState, -}; - -pub async fn test_state() -> Result { - let db = SqlitePool::connect(":memory:").await?; - let (schema, tantivy_field_map) = tantivy_schema(); - let tantivy_index = Index::create_in_ram(schema); - MIGRATOR.run(&db).await?; - - let state = AppState { - db, - tantivy_index, - tantivy_field_map, - app_routes: Default::default(), - app_wasm_modules: Default::default(), - }; - - Ok(state) -} - -#[tokio::test] -pub async fn test_create_node() -> Result<()> { - let state = test_state().await?; - - let node_info = state - .create_or_update_node( - CreateOrUpdate::Create { - r#type: "panorama/journal/page".to_string(), - }, - Some(btmap! { - "panorama/journal/page/content".to_owned() => json!("helloge"), - }), - ) - .await?; - - let mut node = state.get_node(node_info.node_id.to_string()).await?; - assert!(node.fields.is_some()); - - let fields = node.fields.take().unwrap(); - assert!(fields.contains_key("panorama/journal/page/content")); - - Ok(()) -} - -#[tokio::test] -pub async fn test_full_text_search() -> Result<()> { - let state = test_state().await?; - - let node_info = state - .create_or_update_node( - CreateOrUpdate::Create { - r#type: "panorama/journal/page".to_string(), - }, - Some(btmap! { - "panorama/journal/page/content".to_owned() => json!("Hello, world!"), - }), - ) - .await?; - - todo!(); - // let results = state.search_nodes("world").await?; - - // assert!(results - // .into_iter() - // .map(|entry| entry.0) - // .contains(&node_info.node_id)); - - Ok(()) -} - -#[tokio::test] -pub async fn test_install_apps() -> Result<()> { - let state = test_state().await?; - - state.install_apps_from_search_paths().await?; - - todo!(); - - Ok(()) -} diff --git a/crates/panorama-daemon/.gitignore b/crates/panorama-daemon/.gitignore deleted file mode 100644 index 1f5d640..0000000 --- a/crates/panorama-daemon/.gitignore +++ /dev/null @@ -1 +0,0 @@ -export \ No newline at end of file diff --git a/crates/panorama-daemon/Cargo.toml b/crates/panorama-daemon/Cargo.toml deleted file mode 100644 index 8835f57..0000000 --- a/crates/panorama-daemon/Cargo.toml +++ /dev/null @@ -1,41 +0,0 @@ -[package] -name = "panorama-daemon" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -anyhow = "1.0.86" -axum = "0.7.5" -chrono = { version = "0.4.38", features = ["serde"] } -clap = { version = "4.5.7", features = ["derive"] } -# cozo = { version = "0.7.6", features = ["storage-rocksdb"] } -csv = "1.3.0" -dirs = "5.0.1" -futures = "0.3.30" -itertools = "0.13.0" -panorama-core = { path = "../panorama-core" } -schemars = "0.8.21" -serde = { version = "1.0.202", features = ["derive"] } -serde_json = "1.0.117" -sugars = "3.0.1" -tantivy = { version = "0.22.0", features = ["zstd"] } -tokio = { version = "1.37.0", features = ["full"] } -tower = "0.4.13" -tower-http = { version = "0.5.2", features = ["cors", "trace"] } -tracing-subscriber = "0.3.18" -uuid = { version = "1.8.0", features = ["v7"] } - -[dependencies.utoipa] -git = "https://github.com/juhaku/utoipa" -features = ["axum_extras", "time", "uuid", "chrono", "yaml"] - -[dependencies.utoipa-scalar] -git = "https://github.com/juhaku/utoipa" -features = ["axum"] - -[dependencies.async-imap] -version = "0.9.7" -default-features = false -features = ["runtime-tokio"] diff --git a/crates/panorama-daemon/src/apps.rs b/crates/panorama-daemon/src/apps.rs deleted file mode 100644 index 103f3a8..0000000 --- a/crates/panorama-daemon/src/apps.rs +++ /dev/null @@ -1,15 +0,0 @@ -use axum::{ - routing::{method_routing, MethodFilter}, - Router, -}; -use panorama_core::AppState; -use utoipa::OpenApi; - -#[derive(OpenApi)] -#[openapi(paths(), components(schemas()))] -pub(super) struct AppsApi; - -pub(super) fn router() -> Router { - Router::new() - // .route("/app/:id/*path", method_routing::any(handler)) -} diff --git a/crates/panorama-daemon/src/codetrack.rs b/crates/panorama-daemon/src/codetrack.rs deleted file mode 100644 index e69de29..0000000 diff --git a/crates/panorama-daemon/src/error.rs b/crates/panorama-daemon/src/error.rs deleted file mode 100644 index 2915687..0000000 --- a/crates/panorama-daemon/src/error.rs +++ /dev/null @@ -1,34 +0,0 @@ -use axum::{ - http::StatusCode, - response::{IntoResponse, Response}, -}; - -pub type AppResult = std::result::Result; - -// Make our own error that wraps `anyhow::Error`. -#[derive(Debug)] -pub struct AppError(anyhow::Error); - -// Tell axum how to convert `AppError` into a response. -impl IntoResponse for AppError { - fn into_response(self) -> Response { - eprintln!("Encountered error: {}", self.0); - eprintln!("{:?}", self.0); - ( - StatusCode::INTERNAL_SERVER_ERROR, - format!("Something went wrong: {}", self.0), - ) - .into_response() - } -} - -// This enables using `?` on functions that return `Result<_, anyhow::Error>` to turn them into -// `Result<_, AppError>`. That way you don't need to do that manually. -impl From for AppError -where - E: Into, -{ - fn from(err: E) -> Self { - Self(err.into()) - } -} diff --git a/crates/panorama-daemon/src/journal.rs b/crates/panorama-daemon/src/journal.rs deleted file mode 100644 index 1a4a154..0000000 --- a/crates/panorama-daemon/src/journal.rs +++ /dev/null @@ -1,31 +0,0 @@ -use axum::Router; -use utoipa::OpenApi; - -use crate::AppState; - -/// Node API -#[derive(OpenApi)] -#[openapi(paths(), components(schemas()))] -pub(super) struct JournalApi; - -pub(super) fn router() -> Router { - Router::new() - // .route("/get_todays_journal_id", get(get_todays_journal_id)) -} - -// #[utoipa::path( -// get, -// path = "/get_todays_journal_id", -// responses( -// (status = 200), -// ), -// )] -// pub async fn get_todays_journal_id( -// State(state): State, -// ) -> AppResult> { -// let node_id = state.get_todays_journal_id().await?; - -// Ok(Json(json!({ -// "node_id": node_id.to_string(), -// }))) -// } diff --git a/crates/panorama-daemon/src/lib.rs b/crates/panorama-daemon/src/lib.rs deleted file mode 100644 index bbb0283..0000000 --- a/crates/panorama-daemon/src/lib.rs +++ /dev/null @@ -1,73 +0,0 @@ -#[macro_use] -extern crate anyhow; -#[macro_use] -extern crate serde; -#[macro_use] -extern crate serde_json; -#[macro_use] -extern crate sugars; - -pub mod apps; -mod error; -mod journal; -pub mod mail; -mod node; - -use std::fs; - -use anyhow::Result; -use axum::{http::Method, routing::get, Router}; -use panorama_core::AppState; -use tokio::net::TcpListener; -use tower::ServiceBuilder; -use tower_http::{ - cors::{self, CorsLayer}, - trace::TraceLayer, -}; -use utoipa::OpenApi; -use utoipa_scalar::{Scalar, Servable}; - -pub async fn run() -> Result<()> { - #[derive(OpenApi)] - #[openapi( - modifiers(), - nest( - (path = "/journal", api = crate::journal::JournalApi), - (path = "/node", api = crate::node::NodeApi), - ), - )] - struct ApiDoc; - - let data_dir = dirs::data_dir().unwrap(); - let panorama_dir = data_dir.join("panorama"); - fs::create_dir_all(&panorama_dir)?; - - let state = AppState::new(&panorama_dir).await?; - - state.install_apps_from_search_paths().await?; - - let cors_layer = CorsLayer::new() - .allow_methods([Method::GET, Method::POST, Method::PUT]) - .allow_headers(cors::Any) - .allow_origin(cors::Any); - - let trace_layer = TraceLayer::new_for_http(); - - // build our application with a single route - let app = Router::new() - .merge(Scalar::with_url("/api/docs", ApiDoc::openapi())) - .route("/", get(|| async { "Hello, World!" })) - .nest("/node", node::router().with_state(state.clone())) - .nest("/journal", journal::router().with_state(state.clone())) - // .route("/mail/config", get(get_mail_config)) - // .route("/mail", get(get_mail)) - .layer(ServiceBuilder::new().layer(cors_layer)) - .layer(ServiceBuilder::new().layer(trace_layer)) - .with_state(state.clone()); - - let listener = TcpListener::bind("0.0.0.0:5195").await?; - println!("Listening... {:?}", listener); - axum::serve(listener, app).await?; - - Ok(()) -} diff --git a/crates/panorama-daemon/src/mail.rs b/crates/panorama-daemon/src/mail.rs deleted file mode 100644 index 72c4ac7..0000000 --- a/crates/panorama-daemon/src/mail.rs +++ /dev/null @@ -1,47 +0,0 @@ -// pub async fn get_mail_config( -// State(state): State, -// ) -> AppResult> { -// let configs = state.fetch_mail_configs()?; -// Ok(Json(json!({ "configs": configs }))) -// } - -// pub async fn get_mail(State(state): State) -> AppResult> { -// let mailboxes = state.db.run_script(" -// ?[node_id, account_node_id, mailbox_name] := *mailbox {node_id, account_node_id, mailbox_name} -// ", Default::default(), ScriptMutability::Immutable)?; - -// let mailboxes = mailboxes -// .rows -// .iter() -// .map(|mb| { -// json!({ -// "node_id": mb[0].get_str().unwrap(), -// "account_node_id": mb[1].get_str().unwrap(), -// "mailbox_name": mb[2].get_str().unwrap(), -// }) -// }) -// .collect::>(); - -// let messages = state.db.run_script(" -// ?[node_id, subject, body, internal_date] := *message {node_id, subject, body, internal_date} -// :limit 10 -// ", Default::default(), ScriptMutability::Immutable)?; - -// let messages = messages -// .rows -// .iter() -// .map(|m| { -// json!({ -// "node_id": m[0].get_str().unwrap(), -// "subject": m[1].get_str().unwrap(), -// "body": m[2].get_str(), -// "internal_date": m[3].get_str().unwrap(), -// }) -// }) -// .collect::>(); - -// Ok(Json(json!({ -// "mailboxes": mailboxes, -// "messages": messages, -// }))) -// } diff --git a/crates/panorama-daemon/src/main.rs b/crates/panorama-daemon/src/main.rs deleted file mode 100644 index 4f38a7b..0000000 --- a/crates/panorama-daemon/src/main.rs +++ /dev/null @@ -1,32 +0,0 @@ -use anyhow::Result; -use clap::{Parser, Subcommand}; -use panorama_core::state::appsv0::manifest::AppManifest; -use schemars::schema_for; - -#[derive(Debug, Parser)] -struct Opt { - #[clap(subcommand)] - command: Option, -} - -#[derive(Debug, Subcommand)] -enum Command { - GenerateConfigSchema, -} - -#[tokio::main] -async fn main() -> Result<()> { - let opt = Opt::parse(); - - tracing_subscriber::fmt::init(); - - match opt.command { - Some(Command::GenerateConfigSchema) => { - let schema = schema_for!(AppManifest); - println!("{}", serde_json::to_string_pretty(&schema).unwrap()); - } - None => panorama_daemon::run().await?, - } - - Ok(()) -} diff --git a/crates/panorama-daemon/src/node.rs b/crates/panorama-daemon/src/node.rs deleted file mode 100644 index a5bd337..0000000 --- a/crates/panorama-daemon/src/node.rs +++ /dev/null @@ -1,173 +0,0 @@ -use axum::Router; -use utoipa::OpenApi; - -use crate::AppState; - -/// Node API -#[derive(OpenApi)] -#[openapi(paths(), components(schemas()))] -pub(super) struct NodeApi; - -pub(super) fn router() -> Router { - Router::new() - // .route("/", put(create_node)) - // .route("/:id", get(get_node)) - // .route("/:id", post(update_node)) - // .route("/search", get(search_nodes)) -} - -// #[derive(Serialize, Deserialize, ToSchema, Clone)] -// struct GetNodeResult { -// node_id: String, -// fields: HashMap, -// created_at: DateTime, -// updated_at: DateTime, -// } - -// /// Get node info -// /// -// /// This endpoint retrieves all the fields for a particular node -// #[utoipa::path( -// get, -// path = "/{id}", -// responses( -// (status = 200, body = [GetNodeResult]), -// (status = 404, description = "the node ID provided was not found") -// ), -// params( -// ("id" = String, Path, description = "Node ID"), -// ), -// )] -// pub async fn get_node( -// State(state): State, -// Path(node_id): Path, -// ) -> AppResult<(StatusCode, Json)> { -// let node_info = state.get_node(&node_id).await?; - -// Ok(( -// StatusCode::OK, -// Json(json!({ -// "node_id": node_id, -// "fields": node_info.fields, -// "created_at": node_info.created_at, -// "updated_at": node_info.updated_at, -// })), -// )) -// } - -// #[derive(Deserialize, Debug)] -// pub struct UpdateData { -// extra_data: Option, -// } - -// /// Update node info -// #[utoipa::path( -// post, -// path = "/{id}", -// responses( -// (status = 200) -// ), -// params( -// ("id" = String, Path, description = "Node ID"), -// ) -// )] -// pub async fn update_node( -// State(state): State, -// Path(node_id): Path, -// Json(opts): Json, -// ) -> AppResult> { -// let node_id = NodeId(Uuid::from_str(&node_id).into_diagnostic()?); -// let node_info = state -// .create_or_update_node(CreateOrUpdate::Update { node_id }, opts.extra_data) -// .await?; - -// Ok(Json(json!({ -// "node_id": node_info.node_id.to_string(), -// }))) -// } - -// #[derive(Debug, Deserialize)] -// pub struct CreateNodeOpts { -// // TODO: Allow submitting a string -// // id: Option, -// #[serde(rename = "type")] -// ty: String, -// extra_data: Option, -// } - -// #[utoipa::path( -// put, -// path = "/", -// responses((status = 200)), -// )] -// pub async fn create_node( -// State(state): State, -// Json(opts): Json, -// ) -> AppResult> { -// let node_info = state -// .create_or_update_node( -// CreateOrUpdate::Create { r#type: opts.ty }, -// opts.extra_data, -// ) -// .await?; - -// Ok(Json(json!({ -// "node_id": node_info.node_id.to_string(), -// }))) -// } - -// #[derive(Deserialize)] -// pub struct SearchQuery { -// query: String, -// } - -// #[utoipa::path( -// get, -// path = "/search", -// responses((status = 200)), -// )] -// pub async fn search_nodes( -// State(state): State, -// Query(query): Query, -// ) -> AppResult> { -// let search_result = state.search_nodes(query.query).await?; -// let search_result = search_result -// .into_iter() -// .map(|(id, value)| value["fields"].clone()) -// .collect_vec(); - -// Ok(Json(json!({ -// "results": search_result, -// }))) -// } - -// fn get_rows_for_extra_keys( -// tx: &MultiTransaction, -// extra_data: &ExtraData, -// ) -> AppResult> { -// let result = tx.run_script( -// " -// ?[key, relation, field_name, type] := -// *fqkey_to_dbkey{key, relation, field_name, type}, -// is_in(key, $keys) -// ", -// btmap! { -// "keys".to_owned() => DataValue::List( -// extra_data -// .keys() -// .map(|s| DataValue::from(s.as_str())) -// .collect::>() -// ), -// }, -// )?; - -// let s = |s: &DataValue| s.get_str().unwrap().to_owned(); - -// Ok( -// result -// .rows -// .into_iter() -// .map(|row| (s(&row[0]), (s(&row[1]), s(&row[2]), s(&row[3])))) -// .collect::>(), -// ) -// } diff --git a/crates/panorama-macros/Cargo.toml b/crates/panorama-macros/Cargo.toml deleted file mode 100644 index 8a48040..0000000 --- a/crates/panorama-macros/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "panorama-macros" -version = "0.1.0" -edition = "2021" - -[lib] -proc-macro = true - -[dependencies] diff --git a/crates/panorama-macros/src/lib.rs b/crates/panorama-macros/src/lib.rs deleted file mode 100644 index 5ffe4f6..0000000 --- a/crates/panorama-macros/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -// TODO: derive named rows diff --git a/crates/panorama-sync/Cargo.toml b/crates/panorama-sync/Cargo.toml deleted file mode 100644 index 618f9f6..0000000 --- a/crates/panorama-sync/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "panorama-sync" -version = "0.1.0" -edition = "2021" - -[dependencies] diff --git a/crates/panorama-sync/src/lib.rs b/crates/panorama-sync/src/lib.rs deleted file mode 100644 index 8b13789..0000000 --- a/crates/panorama-sync/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 80ea161..54871a6 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -22,6 +22,10 @@ export default defineConfig({ label: "Technical Docs", autogenerate: { directory: "technical-docs" }, }, + { + label: "Protocols", + autogenerate: { directory: "protocols" }, + }, ], customCss: ["./node_modules/katex/dist/katex.min.css"], }), diff --git a/docs/src/content/docs/high-level-design/device.md b/docs/src/content/docs/high-level-design/device.md new file mode 100644 index 0000000..4782472 --- /dev/null +++ b/docs/src/content/docs/high-level-design/device.md @@ -0,0 +1,30 @@ +--- +title: Device +--- + +The panorama network keeps track of what devices join and leave the network. + +Each device has certain attributes: + +```ts +interface DeviceConfig { + // Not used for anything important, just for displaying an icon if needed + formFactor: "desktop" | "server" | "laptop" | "phone" | "tablet" | string; + + // A string that represents a duration of time. If it has been longer than + // this amount of time since last contacting this device, consider it to have + // gone offline + heartbeatDuration: string; + + // Whether or not to schedule services to this device + canRunServices: boolean; + + // Whether or not this device should be treated as a file store + // (recommended to be off for phones) + canStoreFiles: boolean; +} +``` + +Each device keeps track of each other device, with a merkle tree of signatures. + +Devices have their own keypairs. TODO: See how matrix does cross-signing \ No newline at end of file diff --git a/docs/src/content/docs/high-level-design/principles.md b/docs/src/content/docs/high-level-design/principles.md new file mode 100644 index 0000000..fcae971 --- /dev/null +++ b/docs/src/content/docs/high-level-design/principles.md @@ -0,0 +1,14 @@ +--- +title: Design Principles +--- + +## Architecture + +- **Never use fully-qualified names starting from domain (i.e `com.example.package`).** + This makes it so migrating domains / package names becomes very hard. + +## Data governance + +- **Offline first, full control to the user.** + Synchronization is an important feature but must be built as a separate thing. + This also means that it should be possible for some devices to stay offline for long periods of time. \ No newline at end of file diff --git a/docs/src/content/docs/high-level-design/sync.md b/docs/src/content/docs/high-level-design/sync.md index 938c3ae..abe0767 100644 --- a/docs/src/content/docs/high-level-design/sync.md +++ b/docs/src/content/docs/high-level-design/sync.md @@ -8,13 +8,8 @@ This is documentation for a feature that is in development. Almost none of this is implemented and most of it will probably change in the future. ::: -This **only** deals with syncing nodes and files between devices owned by the same person. Permissions are not considered here. +## Node-level sync -## Design notes +## Attribute-level sync -- - Devices need to have some kind of knowledge of each other's existence. This may not necessarily be exposed to apps, but the thing that's responsible for syncing needs to know which nodes have which files. -- - Slow internet connections and largely offline usage patterns need to be considered. -- - **TODO:** does this need to be deeply integrated within the panorama daemon itself or is there a way to expose enough APIs for this to just be an app? +## Index-level sync \ No newline at end of file diff --git a/docs/src/content/docs/high-level-design/types.md b/docs/src/content/docs/high-level-design/types.md index ee02107..856eed0 100644 --- a/docs/src/content/docs/high-level-design/types.md +++ b/docs/src/content/docs/high-level-design/types.md @@ -6,7 +6,7 @@ Types exist to ensure that apps are treating data properly. ## Formal definition -A node's type can be one of the following: +An attribute's type can be one of the following: $\tau :\equiv$ @@ -25,7 +25,8 @@ the URL format will need to be decided upon by then. ## Notes -- All nodes must belong to _closed_ types. +- Nodes don't have types; only attributes do. +- All attributes must belong to _closed_ types. This means type variables cannot exist at the top-level. - When shown in the panorama UI, the constant type will not be shown as a separate type. Instead the actual type itself will be inlined. diff --git a/docs/src/content/docs/protocols/client_bridge.md b/docs/src/content/docs/protocols/client_bridge.md new file mode 100644 index 0000000..4b8d3d3 --- /dev/null +++ b/docs/src/content/docs/protocols/client_bridge.md @@ -0,0 +1,5 @@ +--- +title: Client-Bridge Protocols +--- + +A **bridge** is just a way of connecting two devices. \ No newline at end of file diff --git a/docs/src/content/docs/protocols/client_client.md b/docs/src/content/docs/protocols/client_client.md new file mode 100644 index 0000000..e0f9b08 --- /dev/null +++ b/docs/src/content/docs/protocols/client_client.md @@ -0,0 +1,4 @@ +--- +title: Client-Client Protocols +--- + diff --git a/flutter-app/.gitignore b/flutter-app/.gitignore deleted file mode 100644 index 29a3a50..0000000 --- a/flutter-app/.gitignore +++ /dev/null @@ -1,43 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ -migrate_working_dir/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -**/ios/Flutter/.last_build_id -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.pub-cache/ -.pub/ -/build/ - -# Symbolication related -app.*.symbols - -# Obfuscation related -app.*.map.json - -# Android Studio will place build artifacts here -/android/app/debug -/android/app/profile -/android/app/release diff --git a/flutter-app/.metadata b/flutter-app/.metadata deleted file mode 100644 index 6eb54a1..0000000 --- a/flutter-app/.metadata +++ /dev/null @@ -1,45 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: "761747bfc538b5af34aa0d3fac380f1bc331ec49" - channel: "stable" - -project_type: app - -# Tracks metadata for the flutter migrate command -migration: - platforms: - - platform: root - create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - - platform: android - create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - - platform: ios - create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - - platform: linux - create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - - platform: macos - create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - - platform: web - create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - - platform: windows - create_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - base_revision: 761747bfc538b5af34aa0d3fac380f1bc331ec49 - - # User provided section - - # List of Local paths (relative to this file) that should be - # ignored by the migrate tool. - # - # Files that are not part of the templates will be ignored by default. - unmanaged_files: - - 'lib/main.dart' - - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/flutter-app/README.md b/flutter-app/README.md deleted file mode 100644 index 8dda049..0000000 --- a/flutter-app/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# panorama - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/flutter-app/analysis_options.yaml b/flutter-app/analysis_options.yaml deleted file mode 100644 index 0d29021..0000000 --- a/flutter-app/analysis_options.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. -include: package:flutter_lints/flutter.yaml - -linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at https://dart.dev/lints. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. - rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/flutter-app/android/.gitignore b/flutter-app/android/.gitignore deleted file mode 100644 index 6f56801..0000000 --- a/flutter-app/android/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties -**/*.keystore -**/*.jks diff --git a/flutter-app/android/app/build.gradle b/flutter-app/android/app/build.gradle deleted file mode 100644 index 0623d36..0000000 --- a/flutter-app/android/app/build.gradle +++ /dev/null @@ -1,58 +0,0 @@ -plugins { - id "com.android.application" - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file("local.properties") -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader("UTF-8") { reader -> - localProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty("flutter.versionCode") -if (flutterVersionCode == null) { - flutterVersionCode = "1" -} - -def flutterVersionName = localProperties.getProperty("flutter.versionName") -if (flutterVersionName == null) { - flutterVersionName = "1.0" -} - -android { - namespace = "com.example.panorama" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.example.panorama" - // You can update the following values to match your application needs. - // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutterVersionCode.toInteger() - versionName = flutterVersionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } -} - -flutter { - source = "../.." -} diff --git a/flutter-app/android/app/src/debug/AndroidManifest.xml b/flutter-app/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/flutter-app/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/flutter-app/android/app/src/main/AndroidManifest.xml b/flutter-app/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index ec37f54..0000000 --- a/flutter-app/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/flutter-app/android/app/src/main/kotlin/com/example/panorama/MainActivity.kt b/flutter-app/android/app/src/main/kotlin/com/example/panorama/MainActivity.kt deleted file mode 100644 index b5e25ff..0000000 --- a/flutter-app/android/app/src/main/kotlin/com/example/panorama/MainActivity.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.example.panorama - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() diff --git a/flutter-app/android/app/src/main/res/drawable-v21/launch_background.xml b/flutter-app/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100644 index f74085f..0000000 --- a/flutter-app/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/flutter-app/android/app/src/main/res/drawable/launch_background.xml b/flutter-app/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f..0000000 --- a/flutter-app/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/flutter-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/flutter-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4..0000000 Binary files a/flutter-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/flutter-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/flutter-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b7..0000000 Binary files a/flutter-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/flutter-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/flutter-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 09d4391..0000000 Binary files a/flutter-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/flutter-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/flutter-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d..0000000 Binary files a/flutter-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/flutter-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/flutter-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372e..0000000 Binary files a/flutter-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/flutter-app/android/app/src/main/res/values-night/styles.xml b/flutter-app/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 06952be..0000000 --- a/flutter-app/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/flutter-app/android/app/src/main/res/values/styles.xml b/flutter-app/android/app/src/main/res/values/styles.xml deleted file mode 100644 index cb1ef88..0000000 --- a/flutter-app/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/flutter-app/android/app/src/profile/AndroidManifest.xml b/flutter-app/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/flutter-app/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/flutter-app/android/build.gradle b/flutter-app/android/build.gradle deleted file mode 100644 index d2ffbff..0000000 --- a/flutter-app/android/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = "../build" -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/flutter-app/android/gradle.properties b/flutter-app/android/gradle.properties deleted file mode 100644 index 3b5b324..0000000 --- a/flutter-app/android/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.jvmargs=-Xmx4G -XX:+HeapDumpOnOutOfMemoryError -android.useAndroidX=true -android.enableJetifier=true diff --git a/flutter-app/android/gradle/wrapper/gradle-wrapper.properties b/flutter-app/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e1ca574..0000000 --- a/flutter-app/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip diff --git a/flutter-app/android/settings.gradle b/flutter-app/android/settings.gradle deleted file mode 100644 index 536165d..0000000 --- a/flutter-app/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.3.0" apply false - id "org.jetbrains.kotlin.android" version "1.7.10" apply false -} - -include ":app" diff --git a/flutter-app/ios/.gitignore b/flutter-app/ios/.gitignore deleted file mode 100644 index 7a7f987..0000000 --- a/flutter-app/ios/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -**/dgph -*.mode1v3 -*.mode2v3 -*.moved-aside -*.pbxuser -*.perspectivev3 -**/*sync/ -.sconsign.dblite -.tags* -**/.vagrant/ -**/DerivedData/ -Icon? -**/Pods/ -**/.symlinks/ -profile -xcuserdata -**/.generated/ -Flutter/App.framework -Flutter/Flutter.framework -Flutter/Flutter.podspec -Flutter/Generated.xcconfig -Flutter/ephemeral/ -Flutter/app.flx -Flutter/app.zip -Flutter/flutter_assets/ -Flutter/flutter_export_environment.sh -ServiceDefinitions.json -Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!default.mode1v3 -!default.mode2v3 -!default.pbxuser -!default.perspectivev3 diff --git a/flutter-app/ios/Flutter/AppFrameworkInfo.plist b/flutter-app/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 7c56964..0000000 --- a/flutter-app/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 12.0 - - diff --git a/flutter-app/ios/Flutter/Debug.xcconfig b/flutter-app/ios/Flutter/Debug.xcconfig deleted file mode 100644 index 592ceee..0000000 --- a/flutter-app/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "Generated.xcconfig" diff --git a/flutter-app/ios/Flutter/Release.xcconfig b/flutter-app/ios/Flutter/Release.xcconfig deleted file mode 100644 index 592ceee..0000000 --- a/flutter-app/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "Generated.xcconfig" diff --git a/flutter-app/ios/Runner.xcodeproj/project.pbxproj b/flutter-app/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 9db54fd..0000000 --- a/flutter-app/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,616 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 97C146E61CF9000F007C117D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 97C146ED1CF9000F007C117D; - remoteInfo = Runner; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 331C8082294A63A400263BE5 /* RunnerTests */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - 331C8081294A63A400263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - ); - path = Runner; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C8080294A63A400263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - 331C807D294A63A400263BE5 /* Sources */, - 331C807F294A63A400263BE5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 331C8086294A63A400263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C8080294A63A400263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 97C146ED1CF9000F007C117D; - }; - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 1100; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - 331C8080294A63A400263BE5 /* RunnerTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C807F294A63A400263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C807D294A63A400263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97C146ED1CF9000F007C117D /* Runner */; - targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.panorama; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 331C8088294A63A400263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.panorama.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Debug; - }; - 331C8089294A63A400263BE5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.panorama.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Release; - }; - 331C808A294A63A400263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.panorama.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.panorama; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.panorama; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C8088294A63A400263BE5 /* Debug */, - 331C8089294A63A400263BE5 /* Release */, - 331C808A294A63A400263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/flutter-app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/flutter-app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/flutter-app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/flutter-app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/flutter-app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/flutter-app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/flutter-app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/flutter-app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/flutter-app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/flutter-app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/flutter-app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 8e3ca5d..0000000 --- a/flutter-app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/flutter-app/ios/Runner.xcworkspace/contents.xcworkspacedata b/flutter-app/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a1..0000000 --- a/flutter-app/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/flutter-app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/flutter-app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/flutter-app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/flutter-app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/flutter-app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/flutter-app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/flutter-app/ios/Runner/AppDelegate.swift b/flutter-app/ios/Runner/AppDelegate.swift deleted file mode 100644 index 9074fee..0000000 --- a/flutter-app/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -import Flutter -import UIKit - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } -} diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fa..0000000 --- a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 7353c41..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 797d452..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index 6ed2d93..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 4cd7b00..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index fe73094..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index 321773c..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 797d452..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index 502f463..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index 0ec3034..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index 0ec3034..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index e9f5fea..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index 84ac32a..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 8953cba..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index 0467bf1..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json deleted file mode 100644 index 0bedcf2..0000000 --- a/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "LaunchImage.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100644 index 9da19ea..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19ea..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19ea..0000000 Binary files a/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ diff --git a/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725..0000000 --- a/flutter-app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/flutter-app/ios/Runner/Base.lproj/LaunchScreen.storyboard b/flutter-app/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c..0000000 --- a/flutter-app/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/flutter-app/ios/Runner/Base.lproj/Main.storyboard b/flutter-app/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c2851..0000000 --- a/flutter-app/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/flutter-app/ios/Runner/Info.plist b/flutter-app/ios/Runner/Info.plist deleted file mode 100644 index 526bf03..0000000 --- a/flutter-app/ios/Runner/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Panorama - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - panorama - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - - - diff --git a/flutter-app/ios/Runner/Runner-Bridging-Header.h b/flutter-app/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 308a2a5..0000000 --- a/flutter-app/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1 +0,0 @@ -#import "GeneratedPluginRegistrant.h" diff --git a/flutter-app/ios/RunnerTests/RunnerTests.swift b/flutter-app/ios/RunnerTests/RunnerTests.swift deleted file mode 100644 index 86a7c3b..0000000 --- a/flutter-app/ios/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Flutter -import UIKit -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/flutter-app/lib/main.dart b/flutter-app/lib/main.dart deleted file mode 100644 index a8f6073..0000000 --- a/flutter-app/lib/main.dart +++ /dev/null @@ -1,125 +0,0 @@ -import "package:flutter/material.dart"; - -void main() { - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - // This widget is the root of your application. - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - useMaterial3: true, - ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. - ); - } -} diff --git a/flutter-app/linux/.gitignore b/flutter-app/linux/.gitignore deleted file mode 100644 index d3896c9..0000000 --- a/flutter-app/linux/.gitignore +++ /dev/null @@ -1 +0,0 @@ -flutter/ephemeral diff --git a/flutter-app/linux/CMakeLists.txt b/flutter-app/linux/CMakeLists.txt deleted file mode 100644 index 8feaa99..0000000 --- a/flutter-app/linux/CMakeLists.txt +++ /dev/null @@ -1,145 +0,0 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.10) -project(runner LANGUAGES CXX) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "panorama") -# The unique GTK application identifier for this application. See: -# https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.example.panorama") - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(SET CMP0063 NEW) - -# Load bundled libraries from the lib/ directory relative to the binary. -set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") - -# Root filesystem for cross-building. -if(FLUTTER_TARGET_PLATFORM_SYSROOT) - set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) - set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -endif() - -# Define build configuration options. -if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") -endif() - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_14) - target_compile_options(${TARGET} PRIVATE -Wall -Werror) - target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") - target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") -endfunction() - -# Flutter library and tool build rules. -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) - -add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") - -# Define the application target. To change its name, change BINARY_NAME above, -# not the value here, or `flutter run` will no longer work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} - "main.cc" - "my_application.cc" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add dependency libraries. Add any application-specific dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter) -target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) - -# Only the install-generated bundle's copy of the executable will launch -# correctly, since the resources must in the right relative locations. To avoid -# people trying to run the unbundled copy, put it in a subdirectory instead of -# the default top-level location. -set_target_properties(${BINARY_NAME} - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" -) - - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# By default, "installing" just makes a relocatable bundle in the build -# directory. -set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -# Start with a clean build bundle directory every time. -install(CODE " - file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") - " COMPONENT Runtime) - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") - -install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) - install(FILES "${bundled_library}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endforeach(bundled_library) - -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") -install(DIRECTORY "${NATIVE_ASSETS_DIR}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) - -# Install the AOT library on non-Debug builds only. -if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") - install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() diff --git a/flutter-app/linux/flutter/CMakeLists.txt b/flutter-app/linux/flutter/CMakeLists.txt deleted file mode 100644 index d5bd016..0000000 --- a/flutter-app/linux/flutter/CMakeLists.txt +++ /dev/null @@ -1,88 +0,0 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.10) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. - -# Serves the same purpose as list(TRANSFORM ... PREPEND ...), -# which isn't available in 3.10. -function(list_prepend LIST_NAME PREFIX) - set(NEW_LIST "") - foreach(element ${${LIST_NAME}}) - list(APPEND NEW_LIST "${PREFIX}${element}") - endforeach(element) - set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) -endfunction() - -# === Flutter Library === -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) -pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) -pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) - -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "fl_basic_message_channel.h" - "fl_binary_codec.h" - "fl_binary_messenger.h" - "fl_dart_project.h" - "fl_engine.h" - "fl_json_message_codec.h" - "fl_json_method_codec.h" - "fl_message_codec.h" - "fl_method_call.h" - "fl_method_channel.h" - "fl_method_codec.h" - "fl_method_response.h" - "fl_plugin_registrar.h" - "fl_plugin_registry.h" - "fl_standard_message_codec.h" - "fl_standard_method_codec.h" - "fl_string_codec.h" - "fl_value.h" - "fl_view.h" - "flutter_linux.h" -) -list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") -target_link_libraries(flutter INTERFACE - PkgConfig::GTK - PkgConfig::GLIB - PkgConfig::GIO -) -add_dependencies(flutter flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CMAKE_CURRENT_BINARY_DIR}/_phony_ - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" - ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} -) diff --git a/flutter-app/linux/flutter/generated_plugin_registrant.cc b/flutter-app/linux/flutter/generated_plugin_registrant.cc deleted file mode 100644 index e71a16d..0000000 --- a/flutter-app/linux/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,11 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - - -void fl_register_plugins(FlPluginRegistry* registry) { -} diff --git a/flutter-app/linux/flutter/generated_plugin_registrant.h b/flutter-app/linux/flutter/generated_plugin_registrant.h deleted file mode 100644 index e0f0a47..0000000 --- a/flutter-app/linux/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void fl_register_plugins(FlPluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/flutter-app/linux/flutter/generated_plugins.cmake b/flutter-app/linux/flutter/generated_plugins.cmake deleted file mode 100644 index 2e1de87..0000000 --- a/flutter-app/linux/flutter/generated_plugins.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/flutter-app/linux/main.cc b/flutter-app/linux/main.cc deleted file mode 100644 index e7c5c54..0000000 --- a/flutter-app/linux/main.cc +++ /dev/null @@ -1,6 +0,0 @@ -#include "my_application.h" - -int main(int argc, char** argv) { - g_autoptr(MyApplication) app = my_application_new(); - return g_application_run(G_APPLICATION(app), argc, argv); -} diff --git a/flutter-app/linux/my_application.cc b/flutter-app/linux/my_application.cc deleted file mode 100644 index 93fb281..0000000 --- a/flutter-app/linux/my_application.cc +++ /dev/null @@ -1,124 +0,0 @@ -#include "my_application.h" - -#include -#ifdef GDK_WINDOWING_X11 -#include -#endif - -#include "flutter/generated_plugin_registrant.h" - -struct _MyApplication { - GtkApplication parent_instance; - char** dart_entrypoint_arguments; -}; - -G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) - -// Implements GApplication::activate. -static void my_application_activate(GApplication* application) { - MyApplication* self = MY_APPLICATION(application); - GtkWindow* window = - GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); - - // Use a header bar when running in GNOME as this is the common style used - // by applications and is the setup most users will be using (e.g. Ubuntu - // desktop). - // If running on X and not using GNOME then just use a traditional title bar - // in case the window manager does more exotic layout, e.g. tiling. - // If running on Wayland assume the header bar will work (may need changing - // if future cases occur). - gboolean use_header_bar = TRUE; -#ifdef GDK_WINDOWING_X11 - GdkScreen* screen = gtk_window_get_screen(window); - if (GDK_IS_X11_SCREEN(screen)) { - const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); - if (g_strcmp0(wm_name, "GNOME Shell") != 0) { - use_header_bar = FALSE; - } - } -#endif - if (use_header_bar) { - GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); - gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "panorama"); - gtk_header_bar_set_show_close_button(header_bar, TRUE); - gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); - } else { - gtk_window_set_title(window, "panorama"); - } - - gtk_window_set_default_size(window, 1280, 720); - gtk_widget_show(GTK_WIDGET(window)); - - g_autoptr(FlDartProject) project = fl_dart_project_new(); - fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); - - FlView* view = fl_view_new(project); - gtk_widget_show(GTK_WIDGET(view)); - gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); - - fl_register_plugins(FL_PLUGIN_REGISTRY(view)); - - gtk_widget_grab_focus(GTK_WIDGET(view)); -} - -// Implements GApplication::local_command_line. -static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { - MyApplication* self = MY_APPLICATION(application); - // Strip out the first argument as it is the binary name. - self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); - - g_autoptr(GError) error = nullptr; - if (!g_application_register(application, nullptr, &error)) { - g_warning("Failed to register: %s", error->message); - *exit_status = 1; - return TRUE; - } - - g_application_activate(application); - *exit_status = 0; - - return TRUE; -} - -// Implements GApplication::startup. -static void my_application_startup(GApplication* application) { - //MyApplication* self = MY_APPLICATION(object); - - // Perform any actions required at application startup. - - G_APPLICATION_CLASS(my_application_parent_class)->startup(application); -} - -// Implements GApplication::shutdown. -static void my_application_shutdown(GApplication* application) { - //MyApplication* self = MY_APPLICATION(object); - - // Perform any actions required at application shutdown. - - G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); -} - -// Implements GObject::dispose. -static void my_application_dispose(GObject* object) { - MyApplication* self = MY_APPLICATION(object); - g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); - G_OBJECT_CLASS(my_application_parent_class)->dispose(object); -} - -static void my_application_class_init(MyApplicationClass* klass) { - G_APPLICATION_CLASS(klass)->activate = my_application_activate; - G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; - G_APPLICATION_CLASS(klass)->startup = my_application_startup; - G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; - G_OBJECT_CLASS(klass)->dispose = my_application_dispose; -} - -static void my_application_init(MyApplication* self) {} - -MyApplication* my_application_new() { - return MY_APPLICATION(g_object_new(my_application_get_type(), - "application-id", APPLICATION_ID, - "flags", G_APPLICATION_NON_UNIQUE, - nullptr)); -} diff --git a/flutter-app/linux/my_application.h b/flutter-app/linux/my_application.h deleted file mode 100644 index 72271d5..0000000 --- a/flutter-app/linux/my_application.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef FLUTTER_MY_APPLICATION_H_ -#define FLUTTER_MY_APPLICATION_H_ - -#include - -G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, - GtkApplication) - -/** - * my_application_new: - * - * Creates a new Flutter-based application. - * - * Returns: a new #MyApplication. - */ -MyApplication* my_application_new(); - -#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/flutter-app/macos/.gitignore b/flutter-app/macos/.gitignore deleted file mode 100644 index 746adbb..0000000 --- a/flutter-app/macos/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# Flutter-related -**/Flutter/ephemeral/ -**/Pods/ - -# Xcode-related -**/dgph -**/xcuserdata/ diff --git a/flutter-app/macos/Flutter/Flutter-Debug.xcconfig b/flutter-app/macos/Flutter/Flutter-Debug.xcconfig deleted file mode 100644 index c2efd0b..0000000 --- a/flutter-app/macos/Flutter/Flutter-Debug.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/flutter-app/macos/Flutter/Flutter-Release.xcconfig b/flutter-app/macos/Flutter/Flutter-Release.xcconfig deleted file mode 100644 index c2efd0b..0000000 --- a/flutter-app/macos/Flutter/Flutter-Release.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/flutter-app/macos/Flutter/GeneratedPluginRegistrant.swift b/flutter-app/macos/Flutter/GeneratedPluginRegistrant.swift deleted file mode 100644 index cccf817..0000000 --- a/flutter-app/macos/Flutter/GeneratedPluginRegistrant.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// Generated file. Do not edit. -// - -import FlutterMacOS -import Foundation - - -func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { -} diff --git a/flutter-app/macos/Runner.xcodeproj/project.pbxproj b/flutter-app/macos/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 81929e1..0000000 --- a/flutter-app/macos/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,705 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXAggregateTarget section */ - 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; - buildPhases = ( - 33CC111E2044C6BF0003C045 /* ShellScript */, - ); - dependencies = ( - ); - name = "Flutter Assemble"; - productName = FLX; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC10EC2044A3C60003C045; - remoteInfo = Runner; - }; - 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC111A2044C6BA0003C045; - remoteInfo = FLX; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 33CC110E2044A8840003C045 /* Bundle Framework */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Bundle Framework"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* panorama.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "panorama.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; - 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; - 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; - 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; - 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; - 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; - 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; - 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; - 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; - 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 331C80D2294CF70F00263BE5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EA2044A3C60003C045 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C80D6294CF71000263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C80D7294CF71000263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 33BA886A226E78AF003329D5 /* Configs */ = { - isa = PBXGroup; - children = ( - 33E5194F232828860026EE4D /* AppInfo.xcconfig */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, - ); - path = Configs; - sourceTree = ""; - }; - 33CC10E42044A3C60003C045 = { - isa = PBXGroup; - children = ( - 33FAB671232836740065AC1E /* Runner */, - 33CEB47122A05771004F2AC0 /* Flutter */, - 331C80D6294CF71000263BE5 /* RunnerTests */, - 33CC10EE2044A3C60003C045 /* Products */, - D73912EC22F37F3D000D13A0 /* Frameworks */, - ); - sourceTree = ""; - }; - 33CC10EE2044A3C60003C045 /* Products */ = { - isa = PBXGroup; - children = ( - 33CC10ED2044A3C60003C045 /* panorama.app */, - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 33CC11242044D66E0003C045 /* Resources */ = { - isa = PBXGroup; - children = ( - 33CC10F22044A3C60003C045 /* Assets.xcassets */, - 33CC10F42044A3C60003C045 /* MainMenu.xib */, - 33CC10F72044A3C60003C045 /* Info.plist */, - ); - name = Resources; - path = ..; - sourceTree = ""; - }; - 33CEB47122A05771004F2AC0 /* Flutter */ = { - isa = PBXGroup; - children = ( - 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, - 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, - 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, - 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, - ); - path = Flutter; - sourceTree = ""; - }; - 33FAB671232836740065AC1E /* Runner */ = { - isa = PBXGroup; - children = ( - 33CC10F02044A3C60003C045 /* AppDelegate.swift */, - 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, - 33E51913231747F40026EE4D /* DebugProfile.entitlements */, - 33E51914231749380026EE4D /* Release.entitlements */, - 33CC11242044D66E0003C045 /* Resources */, - 33BA886A226E78AF003329D5 /* Configs */, - ); - path = Runner; - sourceTree = ""; - }; - D73912EC22F37F3D000D13A0 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C80D4294CF70F00263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - 331C80D1294CF70F00263BE5 /* Sources */, - 331C80D2294CF70F00263BE5 /* Frameworks */, - 331C80D3294CF70F00263BE5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 331C80DA294CF71000263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 33CC10EC2044A3C60003C045 /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 33CC10E92044A3C60003C045 /* Sources */, - 33CC10EA2044A3C60003C045 /* Frameworks */, - 33CC10EB2044A3C60003C045 /* Resources */, - 33CC110E2044A8840003C045 /* Bundle Framework */, - 3399D490228B24CF009A79C7 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 33CC11202044C79F0003C045 /* PBXTargetDependency */, - ); - name = Runner; - productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* panorama.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 33CC10E52044A3C60003C045 /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C80D4294CF70F00263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 33CC10EC2044A3C60003C045; - }; - 33CC10EC2044A3C60003C045 = { - CreatedOnToolsVersion = 9.2; - LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.Sandbox = { - enabled = 1; - }; - }; - }; - 33CC111A2044C6BA0003C045 = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Manual; - }; - }; - }; - buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 33CC10E42044A3C60003C045; - productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 33CC10EC2044A3C60003C045 /* Runner */, - 331C80D4294CF70F00263BE5 /* RunnerTests */, - 33CC111A2044C6BA0003C045 /* Flutter Assemble */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C80D3294CF70F00263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EB2044A3C60003C045 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; - }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, - ); - inputPaths = ( - Flutter/ephemeral/tripwire, - ); - outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C80D1294CF70F00263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10E92044A3C60003C045 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC10EC2044A3C60003C045 /* Runner */; - targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; - }; - 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; - targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 33CC10F52044A3C60003C045 /* Base */, - ); - name = MainMenu.xib; - path = Runner; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 331C80DB294CF71000263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.panorama.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/panorama.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/panorama"; - }; - name = Debug; - }; - 331C80DC294CF71000263BE5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.panorama.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/panorama.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/panorama"; - }; - name = Release; - }; - 331C80DD294CF71000263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.panorama.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/panorama.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/panorama"; - }; - name = Profile; - }; - 338D0CE9231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Profile; - }; - 338D0CEA231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Profile; - }; - 338D0CEB231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Profile; - }; - 33CC10F92044A3C60003C045 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 33CC10FA2044A3C60003C045 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 33CC10FC2044A3C60003C045 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 33CC10FD2044A3C60003C045 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 33CC111C2044C6BA0003C045 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 33CC111D2044C6BA0003C045 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C80DB294CF71000263BE5 /* Debug */, - 331C80DC294CF71000263BE5 /* Release */, - 331C80DD294CF71000263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC10F92044A3C60003C045 /* Debug */, - 33CC10FA2044A3C60003C045 /* Release */, - 338D0CE9231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC10FC2044A3C60003C045 /* Debug */, - 33CC10FD2044A3C60003C045 /* Release */, - 338D0CEA231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC111C2044C6BA0003C045 /* Debug */, - 33CC111D2044C6BA0003C045 /* Release */, - 338D0CEB231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 33CC10E52044A3C60003C045 /* Project object */; -} diff --git a/flutter-app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/flutter-app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/flutter-app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/flutter-app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/flutter-app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 78210f1..0000000 --- a/flutter-app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/flutter-app/macos/Runner.xcworkspace/contents.xcworkspacedata b/flutter-app/macos/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a1..0000000 --- a/flutter-app/macos/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/flutter-app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/flutter-app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/flutter-app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/flutter-app/macos/Runner/AppDelegate.swift b/flutter-app/macos/Runner/AppDelegate.swift deleted file mode 100644 index d53ef64..0000000 --- a/flutter-app/macos/Runner/AppDelegate.swift +++ /dev/null @@ -1,9 +0,0 @@ -import Cocoa -import FlutterMacOS - -@NSApplicationMain -class AppDelegate: FlutterAppDelegate { - override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { - return true - } -} diff --git a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index a2ec33f..0000000 --- a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "images" : [ - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_16.png", - "scale" : "1x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "2x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "1x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_64.png", - "scale" : "2x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_128.png", - "scale" : "1x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "2x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "1x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "2x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "1x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_1024.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png deleted file mode 100644 index 82b6f9d..0000000 Binary files a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and /dev/null differ diff --git a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png deleted file mode 100644 index 13b35eb..0000000 Binary files a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and /dev/null differ diff --git a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png deleted file mode 100644 index 0a3f5fa..0000000 Binary files a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and /dev/null differ diff --git a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png deleted file mode 100644 index bdb5722..0000000 Binary files a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and /dev/null differ diff --git a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png deleted file mode 100644 index f083318..0000000 Binary files a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and /dev/null differ diff --git a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png deleted file mode 100644 index 326c0e7..0000000 Binary files a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and /dev/null differ diff --git a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png deleted file mode 100644 index 2f1632c..0000000 Binary files a/flutter-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and /dev/null differ diff --git a/flutter-app/macos/Runner/Base.lproj/MainMenu.xib b/flutter-app/macos/Runner/Base.lproj/MainMenu.xib deleted file mode 100644 index 80e867a..0000000 --- a/flutter-app/macos/Runner/Base.lproj/MainMenu.xib +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/flutter-app/macos/Runner/Configs/AppInfo.xcconfig b/flutter-app/macos/Runner/Configs/AppInfo.xcconfig deleted file mode 100644 index 24817a6..0000000 --- a/flutter-app/macos/Runner/Configs/AppInfo.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -// Application-level settings for the Runner target. -// -// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the -// future. If not, the values below would default to using the project name when this becomes a -// 'flutter create' template. - -// The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = panorama - -// The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.example.panorama - -// The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. diff --git a/flutter-app/macos/Runner/Configs/Debug.xcconfig b/flutter-app/macos/Runner/Configs/Debug.xcconfig deleted file mode 100644 index 36b0fd9..0000000 --- a/flutter-app/macos/Runner/Configs/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Flutter/Flutter-Debug.xcconfig" -#include "Warnings.xcconfig" diff --git a/flutter-app/macos/Runner/Configs/Release.xcconfig b/flutter-app/macos/Runner/Configs/Release.xcconfig deleted file mode 100644 index dff4f49..0000000 --- a/flutter-app/macos/Runner/Configs/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Flutter/Flutter-Release.xcconfig" -#include "Warnings.xcconfig" diff --git a/flutter-app/macos/Runner/Configs/Warnings.xcconfig b/flutter-app/macos/Runner/Configs/Warnings.xcconfig deleted file mode 100644 index 42bcbf4..0000000 --- a/flutter-app/macos/Runner/Configs/Warnings.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings -GCC_WARN_UNDECLARED_SELECTOR = YES -CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES -CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES -CLANG_WARN_PRAGMA_PACK = YES -CLANG_WARN_STRICT_PROTOTYPES = YES -CLANG_WARN_COMMA = YES -GCC_WARN_STRICT_SELECTOR_MATCH = YES -CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES -GCC_WARN_SHADOW = YES -CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/flutter-app/macos/Runner/DebugProfile.entitlements b/flutter-app/macos/Runner/DebugProfile.entitlements deleted file mode 100644 index dddb8a3..0000000 --- a/flutter-app/macos/Runner/DebugProfile.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.cs.allow-jit - - com.apple.security.network.server - - - diff --git a/flutter-app/macos/Runner/Info.plist b/flutter-app/macos/Runner/Info.plist deleted file mode 100644 index 4789daa..0000000 --- a/flutter-app/macos/Runner/Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - $(PRODUCT_COPYRIGHT) - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/flutter-app/macos/Runner/MainFlutterWindow.swift b/flutter-app/macos/Runner/MainFlutterWindow.swift deleted file mode 100644 index 3cc05eb..0000000 --- a/flutter-app/macos/Runner/MainFlutterWindow.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Cocoa -import FlutterMacOS - -class MainFlutterWindow: NSWindow { - override func awakeFromNib() { - let flutterViewController = FlutterViewController() - let windowFrame = self.frame - self.contentViewController = flutterViewController - self.setFrame(windowFrame, display: true) - - RegisterGeneratedPlugins(registry: flutterViewController) - - super.awakeFromNib() - } -} diff --git a/flutter-app/macos/Runner/Release.entitlements b/flutter-app/macos/Runner/Release.entitlements deleted file mode 100644 index 852fa1a..0000000 --- a/flutter-app/macos/Runner/Release.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - - com.apple.security.app-sandbox - - - diff --git a/flutter-app/macos/RunnerTests/RunnerTests.swift b/flutter-app/macos/RunnerTests/RunnerTests.swift deleted file mode 100644 index 61f3bd1..0000000 --- a/flutter-app/macos/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Cocoa -import FlutterMacOS -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/flutter-app/pubspec.lock b/flutter-app/pubspec.lock deleted file mode 100644 index ed4160b..0000000 --- a/flutter-app/pubspec.lock +++ /dev/null @@ -1,213 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - async: - dependency: transitive - description: - name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" - source: hosted - version: "2.11.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - characters: - dependency: transitive - description: - name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev" - source: hosted - version: "1.3.0" - clock: - dependency: transitive - description: - name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" - source: hosted - version: "1.1.1" - collection: - dependency: transitive - description: - name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a - url: "https://pub.dev" - source: hosted - version: "1.18.0" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" - source: hosted - version: "1.0.8" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" - source: hosted - version: "1.3.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" - url: "https://pub.dev" - source: hosted - version: "10.0.4" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" - url: "https://pub.dev" - source: hosted - version: "3.0.3" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev" - source: hosted - version: "3.0.1" - lints: - dependency: transitive - description: - name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 - url: "https://pub.dev" - source: hosted - version: "3.0.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.dev" - source: hosted - version: "0.12.16+1" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" - url: "https://pub.dev" - source: hosted - version: "0.8.0" - meta: - dependency: transitive - description: - name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" - url: "https://pub.dev" - source: hosted - version: "1.12.0" - path: - dependency: transitive - description: - name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev" - source: hosted - version: "1.9.0" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_span: - dependency: transitive - description: - name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" - source: hosted - version: "1.10.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" - url: "https://pub.dev" - source: hosted - version: "1.11.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" - source: hosted - version: "2.1.2" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" - source: hosted - version: "1.2.0" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - test_api: - dependency: transitive - description: - name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" - url: "https://pub.dev" - source: hosted - version: "0.7.0" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" - url: "https://pub.dev" - source: hosted - version: "14.2.1" -sdks: - dart: ">=3.4.3 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" diff --git a/flutter-app/pubspec.yaml b/flutter-app/pubspec.yaml deleted file mode 100644 index b6f460a..0000000 --- a/flutter-app/pubspec.yaml +++ /dev/null @@ -1,90 +0,0 @@ -name: panorama -description: "A new Flutter project." -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+1 - -environment: - sdk: '>=3.4.3 <4.0.0' - -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. -dependencies: - flutter: - sdk: flutter - - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.6 - -dev_dependencies: - flutter_test: - sdk: flutter - - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. - flutter_lints: ^3.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. - uses-material-design: true - - # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/assets-and-images/#from-packages - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages diff --git a/flutter-app/test/widget_test.dart b/flutter-app/test/widget_test.dart deleted file mode 100644 index e91afa3..0000000 --- a/flutter-app/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:panorama/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} diff --git a/flutter-app/web/favicon.png b/flutter-app/web/favicon.png deleted file mode 100644 index 8aaa46a..0000000 Binary files a/flutter-app/web/favicon.png and /dev/null differ diff --git a/flutter-app/web/icons/Icon-192.png b/flutter-app/web/icons/Icon-192.png deleted file mode 100644 index b749bfe..0000000 Binary files a/flutter-app/web/icons/Icon-192.png and /dev/null differ diff --git a/flutter-app/web/icons/Icon-512.png b/flutter-app/web/icons/Icon-512.png deleted file mode 100644 index 88cfd48..0000000 Binary files a/flutter-app/web/icons/Icon-512.png and /dev/null differ diff --git a/flutter-app/web/icons/Icon-maskable-192.png b/flutter-app/web/icons/Icon-maskable-192.png deleted file mode 100644 index eb9b4d7..0000000 Binary files a/flutter-app/web/icons/Icon-maskable-192.png and /dev/null differ diff --git a/flutter-app/web/icons/Icon-maskable-512.png b/flutter-app/web/icons/Icon-maskable-512.png deleted file mode 100644 index d69c566..0000000 Binary files a/flutter-app/web/icons/Icon-maskable-512.png and /dev/null differ diff --git a/flutter-app/web/index.html b/flutter-app/web/index.html deleted file mode 100644 index fa5a172..0000000 --- a/flutter-app/web/index.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - panorama - - - - - - diff --git a/flutter-app/web/manifest.json b/flutter-app/web/manifest.json deleted file mode 100644 index a532b09..0000000 --- a/flutter-app/web/manifest.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "panorama", - "short_name": "panorama", - "start_url": ".", - "display": "standalone", - "background_color": "#0175C2", - "theme_color": "#0175C2", - "description": "A new Flutter project.", - "orientation": "portrait-primary", - "prefer_related_applications": false, - "icons": [ - { - "src": "icons/Icon-192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "icons/Icon-512.png", - "sizes": "512x512", - "type": "image/png" - }, - { - "src": "icons/Icon-maskable-192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "icons/Icon-maskable-512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ] -} diff --git a/flutter-app/windows/.gitignore b/flutter-app/windows/.gitignore deleted file mode 100644 index d492d0d..0000000 --- a/flutter-app/windows/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -flutter/ephemeral/ - -# Visual Studio user-specific files. -*.suo -*.user -*.userosscache -*.sln.docstates - -# Visual Studio build-related files. -x64/ -x86/ - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ diff --git a/flutter-app/windows/CMakeLists.txt b/flutter-app/windows/CMakeLists.txt deleted file mode 100644 index d75a537..0000000 --- a/flutter-app/windows/CMakeLists.txt +++ /dev/null @@ -1,108 +0,0 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.14) -project(panorama LANGUAGES CXX) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "panorama") - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(VERSION 3.14...3.25) - -# Define build configuration option. -get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) -if(IS_MULTICONFIG) - set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" - CACHE STRING "" FORCE) -else() - if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") - endif() -endif() -# Define settings for the Profile build mode. -set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") -set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") -set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") -set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") - -# Use Unicode for all projects. -add_definitions(-DUNICODE -D_UNICODE) - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_17) - target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") - target_compile_options(${TARGET} PRIVATE /EHsc) - target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") - target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") -endfunction() - -# Flutter library and tool build rules. -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# Application build; see runner/CMakeLists.txt. -add_subdirectory("runner") - - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# Support files are copied into place next to the executable, so that it can -# run in place. This is done instead of making a separate bundle (as on Linux) -# so that building and running from within Visual Studio will work. -set(BUILD_BUNDLE_DIR "$") -# Make the "install" step default, as it's required to run. -set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") - -install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -if(PLUGIN_BUNDLED_LIBRARIES) - install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() - -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") -install(DIRECTORY "${NATIVE_ASSETS_DIR}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) - -# Install the AOT library on non-Debug builds only. -install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - CONFIGURATIONS Profile;Release - COMPONENT Runtime) diff --git a/flutter-app/windows/flutter/CMakeLists.txt b/flutter-app/windows/flutter/CMakeLists.txt deleted file mode 100644 index 903f489..0000000 --- a/flutter-app/windows/flutter/CMakeLists.txt +++ /dev/null @@ -1,109 +0,0 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.14) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. -set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") - -# Set fallback configurations for older versions of the flutter tool. -if (NOT DEFINED FLUTTER_TARGET_PLATFORM) - set(FLUTTER_TARGET_PLATFORM "windows-x64") -endif() - -# === Flutter Library === -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "flutter_export.h" - "flutter_windows.h" - "flutter_messenger.h" - "flutter_plugin_registrar.h" - "flutter_texture_registrar.h" -) -list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") -add_dependencies(flutter flutter_assemble) - -# === Wrapper === -list(APPEND CPP_WRAPPER_SOURCES_CORE - "core_implementations.cc" - "standard_codec.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_PLUGIN - "plugin_registrar.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_APP - "flutter_engine.cc" - "flutter_view_controller.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") - -# Wrapper sources needed for a plugin. -add_library(flutter_wrapper_plugin STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} -) -apply_standard_settings(flutter_wrapper_plugin) -set_target_properties(flutter_wrapper_plugin PROPERTIES - POSITION_INDEPENDENT_CODE ON) -set_target_properties(flutter_wrapper_plugin PROPERTIES - CXX_VISIBILITY_PRESET hidden) -target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) -target_include_directories(flutter_wrapper_plugin PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_plugin flutter_assemble) - -# Wrapper sources needed for the runner. -add_library(flutter_wrapper_app STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_APP} -) -apply_standard_settings(flutter_wrapper_app) -target_link_libraries(flutter_wrapper_app PUBLIC flutter) -target_include_directories(flutter_wrapper_app PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_app flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") -set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} - ${PHONY_OUTPUT} - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - ${FLUTTER_TARGET_PLATFORM} $ - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} -) diff --git a/flutter-app/windows/flutter/generated_plugin_registrant.cc b/flutter-app/windows/flutter/generated_plugin_registrant.cc deleted file mode 100644 index 8b6d468..0000000 --- a/flutter-app/windows/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,11 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - - -void RegisterPlugins(flutter::PluginRegistry* registry) { -} diff --git a/flutter-app/windows/flutter/generated_plugin_registrant.h b/flutter-app/windows/flutter/generated_plugin_registrant.h deleted file mode 100644 index dc139d8..0000000 --- a/flutter-app/windows/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void RegisterPlugins(flutter::PluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/flutter-app/windows/flutter/generated_plugins.cmake b/flutter-app/windows/flutter/generated_plugins.cmake deleted file mode 100644 index b93c4c3..0000000 --- a/flutter-app/windows/flutter/generated_plugins.cmake +++ /dev/null @@ -1,23 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/flutter-app/windows/runner/CMakeLists.txt b/flutter-app/windows/runner/CMakeLists.txt deleted file mode 100644 index 394917c..0000000 --- a/flutter-app/windows/runner/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(runner LANGUAGES CXX) - -# Define the application target. To change its name, change BINARY_NAME in the -# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer -# work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} WIN32 - "flutter_window.cpp" - "main.cpp" - "utils.cpp" - "win32_window.cpp" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" - "Runner.rc" - "runner.exe.manifest" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add preprocessor definitions for the build version. -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") - -# Disable Windows macros that collide with C++ standard library functions. -target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") - -# Add dependency libraries and include directories. Add any application-specific -# dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) -target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/flutter-app/windows/runner/Runner.rc b/flutter-app/windows/runner/Runner.rc deleted file mode 100644 index 81edab6..0000000 --- a/flutter-app/windows/runner/Runner.rc +++ /dev/null @@ -1,121 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#pragma code_page(65001) -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_APP_ICON ICON "resources\\app_icon.ico" - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) -#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD -#else -#define VERSION_AS_NUMBER 1,0,0,0 -#endif - -#if defined(FLUTTER_VERSION) -#define VERSION_AS_STRING FLUTTER_VERSION -#else -#define VERSION_AS_STRING "1.0.0" -#endif - -VS_VERSION_INFO VERSIONINFO - FILEVERSION VERSION_AS_NUMBER - PRODUCTVERSION VERSION_AS_NUMBER - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_APP - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904e4" - BEGIN - VALUE "CompanyName", "com.example" "\0" - VALUE "FileDescription", "panorama" "\0" - VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "panorama" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" - VALUE "OriginalFilename", "panorama.exe" "\0" - VALUE "ProductName", "panorama" "\0" - VALUE "ProductVersion", VERSION_AS_STRING "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/flutter-app/windows/runner/flutter_window.cpp b/flutter-app/windows/runner/flutter_window.cpp deleted file mode 100644 index 955ee30..0000000 --- a/flutter-app/windows/runner/flutter_window.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "flutter_window.h" - -#include - -#include "flutter/generated_plugin_registrant.h" - -FlutterWindow::FlutterWindow(const flutter::DartProject& project) - : project_(project) {} - -FlutterWindow::~FlutterWindow() {} - -bool FlutterWindow::OnCreate() { - if (!Win32Window::OnCreate()) { - return false; - } - - RECT frame = GetClientArea(); - - // The size here must match the window dimensions to avoid unnecessary surface - // creation / destruction in the startup path. - flutter_controller_ = std::make_unique( - frame.right - frame.left, frame.bottom - frame.top, project_); - // Ensure that basic setup of the controller was successful. - if (!flutter_controller_->engine() || !flutter_controller_->view()) { - return false; - } - RegisterPlugins(flutter_controller_->engine()); - SetChildContent(flutter_controller_->view()->GetNativeWindow()); - - flutter_controller_->engine()->SetNextFrameCallback([&]() { - this->Show(); - }); - - // Flutter can complete the first frame before the "show window" callback is - // registered. The following call ensures a frame is pending to ensure the - // window is shown. It is a no-op if the first frame hasn't completed yet. - flutter_controller_->ForceRedraw(); - - return true; -} - -void FlutterWindow::OnDestroy() { - if (flutter_controller_) { - flutter_controller_ = nullptr; - } - - Win32Window::OnDestroy(); -} - -LRESULT -FlutterWindow::MessageHandler(HWND hwnd, UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - // Give Flutter, including plugins, an opportunity to handle window messages. - if (flutter_controller_) { - std::optional result = - flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, - lparam); - if (result) { - return *result; - } - } - - switch (message) { - case WM_FONTCHANGE: - flutter_controller_->engine()->ReloadSystemFonts(); - break; - } - - return Win32Window::MessageHandler(hwnd, message, wparam, lparam); -} diff --git a/flutter-app/windows/runner/flutter_window.h b/flutter-app/windows/runner/flutter_window.h deleted file mode 100644 index 6da0652..0000000 --- a/flutter-app/windows/runner/flutter_window.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef RUNNER_FLUTTER_WINDOW_H_ -#define RUNNER_FLUTTER_WINDOW_H_ - -#include -#include - -#include - -#include "win32_window.h" - -// A window that does nothing but host a Flutter view. -class FlutterWindow : public Win32Window { - public: - // Creates a new FlutterWindow hosting a Flutter view running |project|. - explicit FlutterWindow(const flutter::DartProject& project); - virtual ~FlutterWindow(); - - protected: - // Win32Window: - bool OnCreate() override; - void OnDestroy() override; - LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, - LPARAM const lparam) noexcept override; - - private: - // The project to run. - flutter::DartProject project_; - - // The Flutter instance hosted by this window. - std::unique_ptr flutter_controller_; -}; - -#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/flutter-app/windows/runner/main.cpp b/flutter-app/windows/runner/main.cpp deleted file mode 100644 index e4ee5bf..0000000 --- a/flutter-app/windows/runner/main.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include - -#include "flutter_window.h" -#include "utils.h" - -int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, - _In_ wchar_t *command_line, _In_ int show_command) { - // Attach to console when present (e.g., 'flutter run') or create a - // new console when running with a debugger. - if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { - CreateAndAttachConsole(); - } - - // Initialize COM, so that it is available for use in the library and/or - // plugins. - ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); - - flutter::DartProject project(L"data"); - - std::vector command_line_arguments = - GetCommandLineArguments(); - - project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); - - FlutterWindow window(project); - Win32Window::Point origin(10, 10); - Win32Window::Size size(1280, 720); - if (!window.Create(L"panorama", origin, size)) { - return EXIT_FAILURE; - } - window.SetQuitOnClose(true); - - ::MSG msg; - while (::GetMessage(&msg, nullptr, 0, 0)) { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - } - - ::CoUninitialize(); - return EXIT_SUCCESS; -} diff --git a/flutter-app/windows/runner/resource.h b/flutter-app/windows/runner/resource.h deleted file mode 100644 index 66a65d1..0000000 --- a/flutter-app/windows/runner/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Runner.rc -// -#define IDI_APP_ICON 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/flutter-app/windows/runner/resources/app_icon.ico b/flutter-app/windows/runner/resources/app_icon.ico deleted file mode 100644 index c04e20c..0000000 Binary files a/flutter-app/windows/runner/resources/app_icon.ico and /dev/null differ diff --git a/flutter-app/windows/runner/runner.exe.manifest b/flutter-app/windows/runner/runner.exe.manifest deleted file mode 100644 index a42ea76..0000000 --- a/flutter-app/windows/runner/runner.exe.manifest +++ /dev/null @@ -1,20 +0,0 @@ - - - - - PerMonitorV2 - - - - - - - - - - - - - - - diff --git a/flutter-app/windows/runner/utils.cpp b/flutter-app/windows/runner/utils.cpp deleted file mode 100644 index 3a0b465..0000000 --- a/flutter-app/windows/runner/utils.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "utils.h" - -#include -#include -#include -#include - -#include - -void CreateAndAttachConsole() { - if (::AllocConsole()) { - FILE *unused; - if (freopen_s(&unused, "CONOUT$", "w", stdout)) { - _dup2(_fileno(stdout), 1); - } - if (freopen_s(&unused, "CONOUT$", "w", stderr)) { - _dup2(_fileno(stdout), 2); - } - std::ios::sync_with_stdio(); - FlutterDesktopResyncOutputStreams(); - } -} - -std::vector GetCommandLineArguments() { - // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. - int argc; - wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); - if (argv == nullptr) { - return std::vector(); - } - - std::vector command_line_arguments; - - // Skip the first argument as it's the binary name. - for (int i = 1; i < argc; i++) { - command_line_arguments.push_back(Utf8FromUtf16(argv[i])); - } - - ::LocalFree(argv); - - return command_line_arguments; -} - -std::string Utf8FromUtf16(const wchar_t* utf16_string) { - if (utf16_string == nullptr) { - return std::string(); - } - unsigned int target_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, nullptr, 0, nullptr, nullptr) - -1; // remove the trailing null character - int input_length = (int)wcslen(utf16_string); - std::string utf8_string; - if (target_length == 0 || target_length > utf8_string.max_size()) { - return utf8_string; - } - utf8_string.resize(target_length); - int converted_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - input_length, utf8_string.data(), target_length, nullptr, nullptr); - if (converted_length == 0) { - return std::string(); - } - return utf8_string; -} diff --git a/flutter-app/windows/runner/utils.h b/flutter-app/windows/runner/utils.h deleted file mode 100644 index 3879d54..0000000 --- a/flutter-app/windows/runner/utils.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef RUNNER_UTILS_H_ -#define RUNNER_UTILS_H_ - -#include -#include - -// Creates a console for the process, and redirects stdout and stderr to -// it for both the runner and the Flutter library. -void CreateAndAttachConsole(); - -// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string -// encoded in UTF-8. Returns an empty std::string on failure. -std::string Utf8FromUtf16(const wchar_t* utf16_string); - -// Gets the command line arguments passed in as a std::vector, -// encoded in UTF-8. Returns an empty std::vector on failure. -std::vector GetCommandLineArguments(); - -#endif // RUNNER_UTILS_H_ diff --git a/flutter-app/windows/runner/win32_window.cpp b/flutter-app/windows/runner/win32_window.cpp deleted file mode 100644 index 60608d0..0000000 --- a/flutter-app/windows/runner/win32_window.cpp +++ /dev/null @@ -1,288 +0,0 @@ -#include "win32_window.h" - -#include -#include - -#include "resource.h" - -namespace { - -/// Window attribute that enables dark mode window decorations. -/// -/// Redefined in case the developer's machine has a Windows SDK older than -/// version 10.0.22000.0. -/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute -#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE -#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 -#endif - -constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; - -/// Registry key for app theme preference. -/// -/// A value of 0 indicates apps should use dark mode. A non-zero or missing -/// value indicates apps should use light mode. -constexpr const wchar_t kGetPreferredBrightnessRegKey[] = - L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; -constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; - -// The number of Win32Window objects that currently exist. -static int g_active_window_count = 0; - -using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); - -// Scale helper to convert logical scaler values to physical using passed in -// scale factor -int Scale(int source, double scale_factor) { - return static_cast(source * scale_factor); -} - -// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. -// This API is only needed for PerMonitor V1 awareness mode. -void EnableFullDpiSupportIfAvailable(HWND hwnd) { - HMODULE user32_module = LoadLibraryA("User32.dll"); - if (!user32_module) { - return; - } - auto enable_non_client_dpi_scaling = - reinterpret_cast( - GetProcAddress(user32_module, "EnableNonClientDpiScaling")); - if (enable_non_client_dpi_scaling != nullptr) { - enable_non_client_dpi_scaling(hwnd); - } - FreeLibrary(user32_module); -} - -} // namespace - -// Manages the Win32Window's window class registration. -class WindowClassRegistrar { - public: - ~WindowClassRegistrar() = default; - - // Returns the singleton registrar instance. - static WindowClassRegistrar* GetInstance() { - if (!instance_) { - instance_ = new WindowClassRegistrar(); - } - return instance_; - } - - // Returns the name of the window class, registering the class if it hasn't - // previously been registered. - const wchar_t* GetWindowClass(); - - // Unregisters the window class. Should only be called if there are no - // instances of the window. - void UnregisterWindowClass(); - - private: - WindowClassRegistrar() = default; - - static WindowClassRegistrar* instance_; - - bool class_registered_ = false; -}; - -WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; - -const wchar_t* WindowClassRegistrar::GetWindowClass() { - if (!class_registered_) { - WNDCLASS window_class{}; - window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); - window_class.lpszClassName = kWindowClassName; - window_class.style = CS_HREDRAW | CS_VREDRAW; - window_class.cbClsExtra = 0; - window_class.cbWndExtra = 0; - window_class.hInstance = GetModuleHandle(nullptr); - window_class.hIcon = - LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); - window_class.hbrBackground = 0; - window_class.lpszMenuName = nullptr; - window_class.lpfnWndProc = Win32Window::WndProc; - RegisterClass(&window_class); - class_registered_ = true; - } - return kWindowClassName; -} - -void WindowClassRegistrar::UnregisterWindowClass() { - UnregisterClass(kWindowClassName, nullptr); - class_registered_ = false; -} - -Win32Window::Win32Window() { - ++g_active_window_count; -} - -Win32Window::~Win32Window() { - --g_active_window_count; - Destroy(); -} - -bool Win32Window::Create(const std::wstring& title, - const Point& origin, - const Size& size) { - Destroy(); - - const wchar_t* window_class = - WindowClassRegistrar::GetInstance()->GetWindowClass(); - - const POINT target_point = {static_cast(origin.x), - static_cast(origin.y)}; - HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); - UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); - double scale_factor = dpi / 96.0; - - HWND window = CreateWindow( - window_class, title.c_str(), WS_OVERLAPPEDWINDOW, - Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), - Scale(size.width, scale_factor), Scale(size.height, scale_factor), - nullptr, nullptr, GetModuleHandle(nullptr), this); - - if (!window) { - return false; - } - - UpdateTheme(window); - - return OnCreate(); -} - -bool Win32Window::Show() { - return ShowWindow(window_handle_, SW_SHOWNORMAL); -} - -// static -LRESULT CALLBACK Win32Window::WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - if (message == WM_NCCREATE) { - auto window_struct = reinterpret_cast(lparam); - SetWindowLongPtr(window, GWLP_USERDATA, - reinterpret_cast(window_struct->lpCreateParams)); - - auto that = static_cast(window_struct->lpCreateParams); - EnableFullDpiSupportIfAvailable(window); - that->window_handle_ = window; - } else if (Win32Window* that = GetThisFromHandle(window)) { - return that->MessageHandler(window, message, wparam, lparam); - } - - return DefWindowProc(window, message, wparam, lparam); -} - -LRESULT -Win32Window::MessageHandler(HWND hwnd, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - switch (message) { - case WM_DESTROY: - window_handle_ = nullptr; - Destroy(); - if (quit_on_close_) { - PostQuitMessage(0); - } - return 0; - - case WM_DPICHANGED: { - auto newRectSize = reinterpret_cast(lparam); - LONG newWidth = newRectSize->right - newRectSize->left; - LONG newHeight = newRectSize->bottom - newRectSize->top; - - SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, - newHeight, SWP_NOZORDER | SWP_NOACTIVATE); - - return 0; - } - case WM_SIZE: { - RECT rect = GetClientArea(); - if (child_content_ != nullptr) { - // Size and position the child window. - MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, - rect.bottom - rect.top, TRUE); - } - return 0; - } - - case WM_ACTIVATE: - if (child_content_ != nullptr) { - SetFocus(child_content_); - } - return 0; - - case WM_DWMCOLORIZATIONCOLORCHANGED: - UpdateTheme(hwnd); - return 0; - } - - return DefWindowProc(window_handle_, message, wparam, lparam); -} - -void Win32Window::Destroy() { - OnDestroy(); - - if (window_handle_) { - DestroyWindow(window_handle_); - window_handle_ = nullptr; - } - if (g_active_window_count == 0) { - WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); - } -} - -Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { - return reinterpret_cast( - GetWindowLongPtr(window, GWLP_USERDATA)); -} - -void Win32Window::SetChildContent(HWND content) { - child_content_ = content; - SetParent(content, window_handle_); - RECT frame = GetClientArea(); - - MoveWindow(content, frame.left, frame.top, frame.right - frame.left, - frame.bottom - frame.top, true); - - SetFocus(child_content_); -} - -RECT Win32Window::GetClientArea() { - RECT frame; - GetClientRect(window_handle_, &frame); - return frame; -} - -HWND Win32Window::GetHandle() { - return window_handle_; -} - -void Win32Window::SetQuitOnClose(bool quit_on_close) { - quit_on_close_ = quit_on_close; -} - -bool Win32Window::OnCreate() { - // No-op; provided for subclasses. - return true; -} - -void Win32Window::OnDestroy() { - // No-op; provided for subclasses. -} - -void Win32Window::UpdateTheme(HWND const window) { - DWORD light_mode; - DWORD light_mode_size = sizeof(light_mode); - LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, - kGetPreferredBrightnessRegValue, - RRF_RT_REG_DWORD, nullptr, &light_mode, - &light_mode_size); - - if (result == ERROR_SUCCESS) { - BOOL enable_dark_mode = light_mode == 0; - DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, - &enable_dark_mode, sizeof(enable_dark_mode)); - } -} diff --git a/flutter-app/windows/runner/win32_window.h b/flutter-app/windows/runner/win32_window.h deleted file mode 100644 index e901dde..0000000 --- a/flutter-app/windows/runner/win32_window.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef RUNNER_WIN32_WINDOW_H_ -#define RUNNER_WIN32_WINDOW_H_ - -#include - -#include -#include -#include - -// A class abstraction for a high DPI-aware Win32 Window. Intended to be -// inherited from by classes that wish to specialize with custom -// rendering and input handling -class Win32Window { - public: - struct Point { - unsigned int x; - unsigned int y; - Point(unsigned int x, unsigned int y) : x(x), y(y) {} - }; - - struct Size { - unsigned int width; - unsigned int height; - Size(unsigned int width, unsigned int height) - : width(width), height(height) {} - }; - - Win32Window(); - virtual ~Win32Window(); - - // Creates a win32 window with |title| that is positioned and sized using - // |origin| and |size|. New windows are created on the default monitor. Window - // sizes are specified to the OS in physical pixels, hence to ensure a - // consistent size this function will scale the inputted width and height as - // as appropriate for the default monitor. The window is invisible until - // |Show| is called. Returns true if the window was created successfully. - bool Create(const std::wstring& title, const Point& origin, const Size& size); - - // Show the current window. Returns true if the window was successfully shown. - bool Show(); - - // Release OS resources associated with window. - void Destroy(); - - // Inserts |content| into the window tree. - void SetChildContent(HWND content); - - // Returns the backing Window handle to enable clients to set icon and other - // window properties. Returns nullptr if the window has been destroyed. - HWND GetHandle(); - - // If true, closing this window will quit the application. - void SetQuitOnClose(bool quit_on_close); - - // Return a RECT representing the bounds of the current client area. - RECT GetClientArea(); - - protected: - // Processes and route salient window messages for mouse handling, - // size change and DPI. Delegates handling of these to member overloads that - // inheriting classes can handle. - virtual LRESULT MessageHandler(HWND window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Called when CreateAndShow is called, allowing subclass window-related - // setup. Subclasses should return false if setup fails. - virtual bool OnCreate(); - - // Called when Destroy is called. - virtual void OnDestroy(); - - private: - friend class WindowClassRegistrar; - - // OS callback called by message pump. Handles the WM_NCCREATE message which - // is passed when the non-client area is being created and enables automatic - // non-client DPI scaling so that the non-client area automatically - // responds to changes in DPI. All other messages are handled by - // MessageHandler. - static LRESULT CALLBACK WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Retrieves a class instance pointer for |window| - static Win32Window* GetThisFromHandle(HWND const window) noexcept; - - // Update the window frame's theme to match the system theme. - static void UpdateTheme(HWND const window); - - bool quit_on_close_ = false; - - // window handle for top level window. - HWND window_handle_ = nullptr; - - // window handle for hosted content. - HWND child_content_ = nullptr; -}; - -#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/packages/panorama-daemon/.gitignore b/packages/panorama-daemon/.gitignore new file mode 100644 index 0000000..468f82a --- /dev/null +++ b/packages/panorama-daemon/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/packages/panorama-daemon/README.md b/packages/panorama-daemon/README.md new file mode 100644 index 0000000..cf0c7d0 --- /dev/null +++ b/packages/panorama-daemon/README.md @@ -0,0 +1,15 @@ +# panorama-daemon + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.0.25. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/packages/panorama-daemon/bun.lockb b/packages/panorama-daemon/bun.lockb new file mode 100755 index 0000000..c5fc541 Binary files /dev/null and b/packages/panorama-daemon/bun.lockb differ diff --git a/packages/panorama-daemon/package.json b/packages/panorama-daemon/package.json new file mode 100644 index 0000000..e34343b --- /dev/null +++ b/packages/panorama-daemon/package.json @@ -0,0 +1,22 @@ +{ + "name": "panorama-daemon", + "module": "src/index.ts", + "type": "module", + "devDependencies": { + "@types/bun": "latest", + "@types/koa-json": "^2.0.23", + "@types/koa__router": "^12.0.4" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@koa/router": "^12.0.1", + "koa": "^2.15.3", + "koa-json": "^2.0.2", + "reflect-metadata": "^0.2.2", + "sqlite3": "^5.1.7", + "typeorm": "^0.3.20", + "uuidv7": "^1.0.1" + } +} \ No newline at end of file diff --git a/packages/panorama-daemon/src/db.ts b/packages/panorama-daemon/src/db.ts new file mode 100644 index 0000000..cce3e65 --- /dev/null +++ b/packages/panorama-daemon/src/db.ts @@ -0,0 +1,16 @@ +import { DataSource } from "typeorm"; +import { App, Attribute, PNode, NodeHasAttribute } from "./models"; + +const AppDataSource = new DataSource({ + type: "sqlite", + database: "test.db", + + entities: [PNode, App, Attribute, NodeHasAttribute], + synchronize: true, + logging: true, + + migrationsTableName: "migrations", + migrations: ["migrations/*"], +}); + +export const dataSource = await AppDataSource.initialize(); diff --git a/packages/panorama-daemon/src/index.ts b/packages/panorama-daemon/src/index.ts new file mode 100644 index 0000000..274f8b8 --- /dev/null +++ b/packages/panorama-daemon/src/index.ts @@ -0,0 +1,43 @@ +import Koa, { type Context } from "koa"; +import json from "koa-json"; +import Router from "@koa/router"; +import { dataSource } from "./db"; +import { PNode } from "./models"; +import { uuidv7 } from "uuidv7"; + +const app = new Koa(); +const router = new Router(); + +app.use(json()); + +router.get("/", async (ctx: Context) => { + const nodeRepo = dataSource.getRepository(PNode); + const numNodes = await nodeRepo.count(); + ctx.body = { nodes: numNodes }; +}); + +router.put("/node", async (ctx) => { + const id = uuidv7(); + await dataSource.getRepository(PNode).insert({ id }); + ctx.body = { id }; +}); + +router.get("/node/:id", async (ctx) => { + const query = dataSource + // .getRepository(Node) + .createQueryBuilder() + .select("node") + .from(PNode, "node") + .where("node.id = :id", { id: ctx.params.id }); + const node = await query.getOne(); + if (node === null) { + ctx.status = 404; + ctx.body = { error: "Not found" }; + return; + } + ctx.body = { node }; +}); + +app.use(router.routes()).use(router.allowedMethods()); + +app.listen(3000); diff --git a/packages/panorama-daemon/src/models.ts b/packages/panorama-daemon/src/models.ts new file mode 100644 index 0000000..9eff94e --- /dev/null +++ b/packages/panorama-daemon/src/models.ts @@ -0,0 +1,59 @@ +import { Column, Entity, ManyToOne, OneToMany, PrimaryColumn } from "typeorm"; + +@Entity() +export class PNode { + @PrimaryColumn() + id!: string; +} + +@Entity() +export class App { + @PrimaryColumn() + id!: string; + + @OneToMany( + () => Attribute, + (attr) => attr.appId, + ) + attributes!: Attribute[]; +} + +@Entity() +export class Attribute { + @PrimaryColumn() + @ManyToOne( + () => App, + (app) => app.id, + ) + appId!: string; + + @PrimaryColumn() + name!: string; + + type!: string; +} + +@Entity() +export class NodeHasAttribute { + @PrimaryColumn() + nodeId!: string; + + @PrimaryColumn() + appId!: string; + + @PrimaryColumn() + name!: string; + + @Column({ nullable: true }) + nodeRef: number | undefined; + @Column({ nullable: true }) + number: number | undefined; + @Column({ nullable: true }) + string: string | undefined; + @Column({ nullable: true }) + boolean: boolean | undefined; + @Column({ nullable: true }) + instant: Date | undefined; + @Column({ nullable: true }) + url: string | undefined; +} diff --git a/packages/panorama-daemon/tsconfig.json b/packages/panorama-daemon/tsconfig.json new file mode 100644 index 0000000..1ca2052 --- /dev/null +++ b/packages/panorama-daemon/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "lib": ["ESNext"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + /* Linting */ + "skipLibCheck": true, + "strict": true, + "noFallthroughCasesInSwitch": true, + "forceConsistentCasingInFileNames": true, + + "esModuleInterop": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f7920e..5ec43f6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,6 +33,12 @@ importers: specifier: ^5.5.2 version: 5.5.2 + packages/panorama-daemon: + devDependencies: + nodemon: + specifier: ^3.1.4 + version: 3.1.4 + packages: '@ampproject/remapping@2.3.0': @@ -800,6 +806,9 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.4.2: resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} @@ -841,6 +850,9 @@ packages: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -947,6 +959,9 @@ packages: common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -966,15 +981,6 @@ packages: engines: {node: '>=4'} hasBin: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.5: resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} @@ -1277,6 +1283,9 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + immutable@4.3.6: resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} @@ -1637,6 +1646,9 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -1674,6 +1686,11 @@ packages: node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + nodemon@3.1.4: + resolution: {integrity: sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==} + engines: {node: '>=10'} + hasBin: true + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -1818,6 +1835,9 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -1982,6 +2002,10 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -2090,6 +2114,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -2127,6 +2155,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + unified@11.0.4: resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} @@ -2496,7 +2527,7 @@ snapshots: '@astrojs/telemetry@3.1.0': dependencies: ci-info: 4.0.0 - debug: 4.3.5 + debug: 4.3.5(supports-color@5.5.0) dlv: 1.1.3 dset: 3.1.3 is-docker: 3.0.0 @@ -2525,7 +2556,7 @@ snapshots: '@babel/traverse': 7.24.7 '@babel/types': 7.24.7 convert-source-map: 2.0.0 - debug: 4.3.5 + debug: 4.3.5(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -2649,7 +2680,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.24.7 '@babel/types': 7.24.7 - debug: 4.3.5 + debug: 4.3.5(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -3191,7 +3222,7 @@ snapshots: common-ancestor-path: 1.0.1 cookie: 0.6.0 cssesc: 3.0.0 - debug: 4.3.5 + debug: 4.3.5(supports-color@5.5.0) deterministic-object-hash: 2.0.2 devalue: 5.0.0 diff: 5.2.0 @@ -3252,6 +3283,8 @@ snapshots: bail@2.0.2: {} + balanced-match@1.0.2: {} + bare-events@2.4.2: optional: true @@ -3308,6 +3341,11 @@ snapshots: widest-line: 4.0.1 wrap-ansi: 8.1.0 + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -3408,6 +3446,8 @@ snapshots: common-ancestor-path@1.0.1: {} + concat-map@0.0.1: {} + convert-source-map@2.0.0: {} cookie@0.6.0: {} @@ -3422,13 +3462,11 @@ snapshots: cssesc@3.0.0: {} - debug@4.3.4: - dependencies: - ms: 2.1.2 - - debug@4.3.5: + debug@4.3.5(supports-color@5.5.0): dependencies: ms: 2.1.2 + optionalDependencies: + supports-color: 5.5.0 decode-named-character-reference@1.0.2: dependencies: @@ -3851,6 +3889,8 @@ snapshots: ieee754@1.2.1: {} + ignore-by-default@1.0.1: {} + immutable@4.3.6: optional: true @@ -4443,7 +4483,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.4 + debug: 4.3.5(supports-color@5.5.0) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -4473,6 +4513,10 @@ snapshots: mimic-response@3.1.0: {} + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + minimist@1.2.8: {} mkdirp-classic@0.5.3: {} @@ -4499,6 +4543,19 @@ snapshots: node-releases@2.0.14: {} + nodemon@3.1.4: + dependencies: + chokidar: 3.6.0 + debug: 4.3.5(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.6.2 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 + normalize-path@3.0.0: {} not@0.1.0: {} @@ -4669,6 +4726,8 @@ snapshots: property-information@6.5.0: {} + pstree.remy@1.1.8: {} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 @@ -4965,6 +5024,10 @@ snapshots: dependencies: is-arrayish: 0.3.2 + simple-update-notifier@2.0.0: + dependencies: + semver: 7.6.2 + sisteransi@1.0.5: {} sitemap@7.1.2: @@ -5088,6 +5151,8 @@ snapshots: dependencies: is-number: 7.0.0 + touch@3.1.1: {} + trim-lines@3.0.1: {} trough@2.2.0: {} @@ -5113,6 +5178,8 @@ snapshots: typescript@5.5.2: {} + undefsafe@2.0.5: {} + unified@11.0.4: dependencies: '@types/unist': 3.0.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index dc4ef46..5a6e372 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - 'app' -- 'docs' \ No newline at end of file +- 'docs' +- 'packages/*' \ No newline at end of file diff --git a/proto/panorama.proto b/proto/panorama.proto deleted file mode 100644 index bbb7f73..0000000 --- a/proto/panorama.proto +++ /dev/null @@ -1,33 +0,0 @@ -syntax = "proto3"; -package io.mzhang.panorama; - -service PanoramaHost { - rpc Hello (HelloRequest) returns (HelloResponse) {} - rpc RegisterSingletonType (RegisterSingletonTypeRequest) returns (RegisterSingletonTypeResponse) {} - rpc RegisterType (RegisterTypeRequest) returns (RegisterTypeResponse) {} -} - -message HelloRequest {} -message HelloResponse { - // What the actual given name of your app is installed as; this is not easily changed - string appName = 1; - string panoramaVersion = 2; -} - -message RegisterTypeRequest { - string typeName = 1; - string typeExpr = 2; -} -message RegisterTypeResponse {} - -message RegisterSingletonTypeRequest { - // The name given to the attribute you want to reserve - string attributeName = 1; -} -message RegisterSingletonTypeResponse { - // Node id corresponding to the Singleton type - string nodeId = 1; -} - -service PanoramaApp { -} \ No newline at end of file diff --git a/ui/.gitignore b/ui/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/ui/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/ui/.vscode/extensions.json b/ui/.vscode/extensions.json deleted file mode 100644 index 24d7cc6..0000000 --- a/ui/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] -} diff --git a/ui/README.md b/ui/README.md deleted file mode 100644 index 102e366..0000000 --- a/ui/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Tauri + React + Typescript - -This template should help get you started developing with Tauri, React and Typescript in Vite. - -## Recommended IDE Setup - -- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) diff --git a/ui/index.html b/ui/index.html deleted file mode 100644 index ff93803..0000000 --- a/ui/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - Tauri + React + Typescript - - - -
- - - diff --git a/ui/package.json b/ui/package.json deleted file mode 100644 index fd71271..0000000 --- a/ui/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "name": "panorama", - "version": "0.1.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview", - "tauri": "tauri" - }, - "dependencies": { - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", - "@floating-ui/react": "^0.26.16", - "@fontsource/inter": "^5.0.18", - "@mui/icons-material": "^5.15.18", - "@mui/material": "^5.15.18", - "@react-spring/web": "^9.7.3", - "@remark-embedder/core": "^3.0.3", - "@tanstack/react-query": "^5.37.1", - "@tauri-apps/api": "^1", - "@tauri-apps/plugin-window-state": "2.0.0-beta.6", - "@uidotdev/usehooks": "^2.4.1", - "@uiw/react-md-editor": "^4.0.4", - "classnames": "^2.5.1", - "date-fns": "^3.6.0", - "formik": "^2.4.6", - "hast-util-to-jsx-runtime": "^2.3.0", - "hast-util-to-mdast": "^10.1.0", - "immutable": "^4.3.6", - "javascript-time-ago": "^2.5.10", - "jotai": "^2.8.1", - "katex": "^0.16.10", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-markdown": "^9.0.1", - "react-time-ago": "^7.3.3", - "rehype-katex": "^7.0.0", - "remark": "^15.0.1", - "remark-math": "^6.0.0", - "remark-rehype": "^11.1.0", - "use-debounce": "^10.0.1", - "uuidv7": "^1.0.0", - "vfile": "^6.0.1" - }, - "devDependencies": { - "@tauri-apps/cli": "2.0.0-beta.20", - "@types/mdast": "^4.0.4", - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@vitejs/plugin-react": "^4.2.1", - "rollup-plugin-visualizer": "^5.12.0", - "sass": "^1.77.2", - "typescript": "^5.0.2", - "vite": "^5.0.0" - } -} diff --git a/ui/public/tauri.svg b/ui/public/tauri.svg deleted file mode 100644 index 31b62c9..0000000 --- a/ui/public/tauri.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/ui/public/vite.svg b/ui/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/ui/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/src-tauri/.gitignore b/ui/src-tauri/.gitignore deleted file mode 100644 index b21bd68..0000000 --- a/ui/src-tauri/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# Generated by Cargo -# will have compiled files and executables -/target/ - -# Generated by Tauri -# will have schema files for capabilities auto-completion -/gen/schemas diff --git a/ui/src-tauri/Cargo.toml b/ui/src-tauri/Cargo.toml deleted file mode 100644 index 67401e4..0000000 --- a/ui/src-tauri/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "panorama" -version = "0.1.0" -description = "A Tauri App" -authors = ["you"] -edition = "2021" - -[lib] -name = "app_lib" -crate-type = [ - "staticlib", - "cdylib", - # "rlib", - "lib", -] - -[build-dependencies] -tauri-build = { version = "2.0.0-beta", features = [] } - -[dependencies] -clap = { version = "4.5.7", features = ["derive"] } -panorama-daemon = { path = "../../crates/panorama-daemon" } -serde = { version = "1", features = ["derive"] } -serde_json = "1" -tauri = { version = "2.0.0-beta", features = [] } -tauri-build = { version = "2.0.0-beta.17", features = ["config-toml"] } -tauri-plugin-http = "2.0.0-beta.9" -tauri-plugin-shell = "2.0.0-beta.7" -tauri-plugin-single-instance = "2.0.0-beta.9" -tauri-plugin-window-state = "2.0.0-beta" -tokio = { version = "1.38.0", features = ["full"] } -tracing-subscriber = "0.3.18" - -[features] -# This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!! -custom-protocol = ["tauri/custom-protocol"] diff --git a/ui/src-tauri/build.rs b/ui/src-tauri/build.rs deleted file mode 100644 index 795b9b7..0000000 --- a/ui/src-tauri/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - tauri_build::build() -} diff --git a/ui/src-tauri/capabilities/migrated.json b/ui/src-tauri/capabilities/migrated.json deleted file mode 100644 index 75e4c97..0000000 --- a/ui/src-tauri/capabilities/migrated.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "identifier": "migrated", - "description": "permissions that were migrated from v1", - "local": true, - "windows": [ - "main" - ], - "permissions": [ - "path:default", - "event:default", - "window:default", - "app:default", - "resources:default", - "menu:default", - "tray:default", - "shell:allow-open", - { - "identifier": "http:default", - "allow": [ - { - "url": "http://localhost:5195/*" - } - ] - }, - "app:allow-app-show", - "app:allow-app-hide", - "shell:default", - "http:default" - ] -} \ No newline at end of file diff --git a/ui/src-tauri/icons/128x128.png b/ui/src-tauri/icons/128x128.png deleted file mode 100644 index 35270cb..0000000 Binary files a/ui/src-tauri/icons/128x128.png and /dev/null differ diff --git a/ui/src-tauri/icons/128x128@2x.png b/ui/src-tauri/icons/128x128@2x.png deleted file mode 100644 index 977f127..0000000 Binary files a/ui/src-tauri/icons/128x128@2x.png and /dev/null differ diff --git a/ui/src-tauri/icons/32x32.png b/ui/src-tauri/icons/32x32.png deleted file mode 100644 index c43f6ad..0000000 Binary files a/ui/src-tauri/icons/32x32.png and /dev/null differ diff --git a/ui/src-tauri/icons/Square107x107Logo.png b/ui/src-tauri/icons/Square107x107Logo.png deleted file mode 100644 index 2fc3789..0000000 Binary files a/ui/src-tauri/icons/Square107x107Logo.png and /dev/null differ diff --git a/ui/src-tauri/icons/Square142x142Logo.png b/ui/src-tauri/icons/Square142x142Logo.png deleted file mode 100644 index 948d76e..0000000 Binary files a/ui/src-tauri/icons/Square142x142Logo.png and /dev/null differ diff --git a/ui/src-tauri/icons/Square150x150Logo.png b/ui/src-tauri/icons/Square150x150Logo.png deleted file mode 100644 index 407bf1c..0000000 Binary files a/ui/src-tauri/icons/Square150x150Logo.png and /dev/null differ diff --git a/ui/src-tauri/icons/Square284x284Logo.png b/ui/src-tauri/icons/Square284x284Logo.png deleted file mode 100644 index c3a323c..0000000 Binary files a/ui/src-tauri/icons/Square284x284Logo.png and /dev/null differ diff --git a/ui/src-tauri/icons/Square30x30Logo.png b/ui/src-tauri/icons/Square30x30Logo.png deleted file mode 100644 index 152ca34..0000000 Binary files a/ui/src-tauri/icons/Square30x30Logo.png and /dev/null differ diff --git a/ui/src-tauri/icons/Square310x310Logo.png b/ui/src-tauri/icons/Square310x310Logo.png deleted file mode 100644 index 714f276..0000000 Binary files a/ui/src-tauri/icons/Square310x310Logo.png and /dev/null differ diff --git a/ui/src-tauri/icons/Square44x44Logo.png b/ui/src-tauri/icons/Square44x44Logo.png deleted file mode 100644 index 3fed016..0000000 Binary files a/ui/src-tauri/icons/Square44x44Logo.png and /dev/null differ diff --git a/ui/src-tauri/icons/Square71x71Logo.png b/ui/src-tauri/icons/Square71x71Logo.png deleted file mode 100644 index ba1cd58..0000000 Binary files a/ui/src-tauri/icons/Square71x71Logo.png and /dev/null differ diff --git a/ui/src-tauri/icons/Square89x89Logo.png b/ui/src-tauri/icons/Square89x89Logo.png deleted file mode 100644 index 46af11b..0000000 Binary files a/ui/src-tauri/icons/Square89x89Logo.png and /dev/null differ diff --git a/ui/src-tauri/icons/StoreLogo.png b/ui/src-tauri/icons/StoreLogo.png deleted file mode 100644 index 60f4726..0000000 Binary files a/ui/src-tauri/icons/StoreLogo.png and /dev/null differ diff --git a/ui/src-tauri/icons/icon.icns b/ui/src-tauri/icons/icon.icns deleted file mode 100644 index 0821eef..0000000 Binary files a/ui/src-tauri/icons/icon.icns and /dev/null differ diff --git a/ui/src-tauri/icons/icon.ico b/ui/src-tauri/icons/icon.ico deleted file mode 100644 index 987c040..0000000 Binary files a/ui/src-tauri/icons/icon.ico and /dev/null differ diff --git a/ui/src-tauri/icons/icon.png b/ui/src-tauri/icons/icon.png deleted file mode 100644 index 1fd567e..0000000 Binary files a/ui/src-tauri/icons/icon.png and /dev/null differ diff --git a/ui/src-tauri/src/lib.rs b/ui/src-tauri/src/lib.rs deleted file mode 100644 index d4d1e86..0000000 --- a/ui/src-tauri/src/lib.rs +++ /dev/null @@ -1,30 +0,0 @@ -use tauri::Manager; - -// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command -#[tauri::command] -fn greet(name: &str) -> String { - format!("Hello, {}! You've been greeted from Rust!", name) -} - -#[derive(Clone, serde::Serialize)] -struct Payload { - args: Vec, - cwd: String, -} - -#[cfg_attr(mobile, tauri::mobile_entry_point)] -pub fn run() { - tauri::Builder::default() - .plugin(tauri_plugin_http::init()) - .plugin(tauri_plugin_shell::init()) - .plugin(tauri_plugin_single_instance::init(|app, argv, cwd| { - println!("{}, {argv:?}, {cwd}", app.package_info().name); - app - .emit("single-instance", Payload { args: argv, cwd }) - .unwrap(); - })) - .plugin(tauri_plugin_window_state::Builder::default().build()) - .invoke_handler(tauri::generate_handler![greet]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); -} diff --git a/ui/src-tauri/src/main.rs b/ui/src-tauri/src/main.rs deleted file mode 100644 index 1f493dc..0000000 --- a/ui/src-tauri/src/main.rs +++ /dev/null @@ -1,36 +0,0 @@ -#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] - -use clap::{Parser, Subcommand}; - -#[derive(Parser, Debug)] -struct Opt { - #[clap(long = "no-embedded-daemon")] - no_embedded_daemon: bool, - - #[clap(subcommand)] - command: Option, -} - -#[derive(Subcommand, Debug)] -enum Command { - Daemon, -} - -#[tokio::main] -async fn main() { - tracing_subscriber::fmt::init(); - let opt = Opt::parse(); - - match opt.command { - Some(Command::Daemon) => { - panorama_daemon::run().await; - } - - None => { - if !opt.no_embedded_daemon { - tokio::spawn(panorama_daemon::run()); - } - app_lib::run(); - } - } -} diff --git a/ui/src-tauri/tauri.conf.json b/ui/src-tauri/tauri.conf.json deleted file mode 100644 index 9132534..0000000 --- a/ui/src-tauri/tauri.conf.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "build": { - "beforeDevCommand": "pnpm dev", - "beforeBuildCommand": "pnpm build", - "frontendDist": "../dist", - "devUrl": "http://localhost:1420" - }, - "bundle": { - "active": true, - "targets": "all", - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ] - }, - "identifier": "io.mzhang.panorama", - "plugins": {}, - "app": { - "security": { - "csp": null - }, - "windows": [ - { - "title": "panorama", - "width": 800, - "height": 600 - } - ] - } -} diff --git a/ui/src/App.module.scss b/ui/src/App.module.scss deleted file mode 100644 index ce1d4af..0000000 --- a/ui/src/App.module.scss +++ /dev/null @@ -1,33 +0,0 @@ -.container { - display: flex; - flex-direction: column; - - min-height: 0; - - width: 100%; - height: 100%; -} - -.main { - flex-grow: 1; - display: flex; -} - -.nodeContainer { - display: flex; - justify-items: stretch; - - padding: 12px; - gap: 12px; - - min-width: 0; - flex-grow: 1; - flex-basis: auto; - overflow-x: scroll; - - // Cribbed from https://www.magicpattern.design/tools/css-backgrounds - background-color: #e5e5f7; - opacity: 0.8; - background-image: radial-gradient(#444cf7 0.5px, #e5e5f7 0.5px); - background-size: 10px 10px; -} \ No newline at end of file diff --git a/ui/src/App.tsx b/ui/src/App.tsx deleted file mode 100644 index b369805..0000000 --- a/ui/src/App.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import Header from "./components/Header"; -import styles from "./App.module.scss"; - -import "@fontsource/inter"; -import "@fontsource/inter/700.css"; -import "./global.scss"; -import "katex/dist/katex.min.css"; -import { useEffect } from "react"; -import NodeDisplay from "./components/NodeDisplay"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import TimeAgo from "javascript-time-ago"; -import en from "javascript-time-ago/locale/en"; -import Sidebar from "./components/Sidebar"; -import { atom, useAtom, useAtomValue } from "jotai"; -import { OrderedSet } from "immutable"; - -const queryClient = new QueryClient(); - -TimeAgo.addDefaultLocale(en); - -export const nodesOpenedAtom = atom>(OrderedSet()); - -function App() { - const nodesOpened = useAtomValue(nodesOpenedAtom); - const { openNode } = useNodeControls(); - - // Open today's journal entry if it's not already opened - useEffect(() => { - (async () => { - console.log("ndoes", nodesOpened); - if (nodesOpened.size === 0) { - console.log("Opening today's entry."); - const resp = await fetch( - "http://localhost:5195/journal/get_todays_journal_id", - ); - const data = await resp.json(); - console.log("resp", data); - openNode(data.node_id); - } - })(); - }, [nodesOpened, openNode]); - - const nodes = [...nodesOpened.reverse().values()].map((nodeId, idx) => ( - - )); - - return ( - -
-
- -
- -
{nodes}
-
-
-
- ); -} - -export default App; - -export function useNodeControls() { - const [nodesOpened, setNodesOpened] = useAtom(nodesOpenedAtom); - return { - isOpen: (node_id: string) => nodesOpened.has(node_id), - toggleNode: (node_id: string) => { - if (nodesOpened.has(node_id)) setNodesOpened(nodesOpened.remove(node_id)); - else setNodesOpened(nodesOpened.remove(node_id).add(node_id)); - }, - openNode: (node_id: string) => { - setNodesOpened(nodesOpened.remove(node_id).add(node_id)); - }, - closeNode: (node_id: string) => { - setNodesOpened(nodesOpened.remove(node_id)); - }, - }; -} diff --git a/ui/src/assets/react.svg b/ui/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/ui/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/components/Header.module.scss b/ui/src/components/Header.module.scss deleted file mode 100644 index e38d263..0000000 --- a/ui/src/components/Header.module.scss +++ /dev/null @@ -1,59 +0,0 @@ -.Header { - display: flex; - align-items: center; - - padding: 2px 12px; - gap: 12px; - - background: rgb(204, 201, 255); - background: linear-gradient(90deg, rgba(204, 201, 255, 1) 0%, rgba(255, 255, 255, 1) 100%); -} - -.headerBorder { - height: 1px; - background: rgb(170, 166, 255); - background: linear-gradient(90deg, rgba(170, 166, 255, 1) 0%, rgba(255, 255, 255, 1) 100%); -} - -.brand { - display: flex; - flex-direction: column; - - .title { - font-size: 1.2em; - margin: 0; - } - - .version { - font-size: .6em; - color: rgb(0, 0, 0, 0.5); - margin: 0; - } -} - -.newNodeMenu { - background-color: rgba(255, 255, 255, 0.5); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(10px); - box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.25); - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - - ul { - display: flex; - flex-direction: column; - padding: 0; - list-style-type: none; - - li { - display: flex; - flex-direction: column; - align-items: stretch; - - button { - cursor: pointer; - display: flex; - } - } - } -} \ No newline at end of file diff --git a/ui/src/components/Header.tsx b/ui/src/components/Header.tsx deleted file mode 100644 index 1c10327..0000000 --- a/ui/src/components/Header.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import styles from "./Header.module.scss"; -import NoteAddIcon from "@mui/icons-material/NoteAdd"; -import SearchBar from "./SearchBar"; -import ListIcon from "@mui/icons-material/List"; -import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown"; -import { useSetAtom } from "jotai"; -import { sidebarExpandedAtom } from "./Sidebar"; -import { useNodeControls } from "../App"; -import { useCallback, useState } from "react"; -import { useQuery } from "@tanstack/react-query"; -import { getVersion } from "@tauri-apps/api/app"; -import { - FloatingOverlay, - FloatingPortal, - autoUpdate, - offset, - useDismiss, - useFloating, - useFocus, - useInteractions, -} from "@floating-ui/react"; - -export default function Header() { - const { openNode } = useNodeControls(); - const setSidebarExpanded = useSetAtom(sidebarExpandedAtom); - const versionData = useQuery({ - queryKey: ["appVersion"], - queryFn: getVersion, - }); - const { data: version } = versionData; - console.log("version", version); - - const createNewJournalPage = useCallback(() => { - (async () => { - const resp = await fetch("http://localhost:5195/node", { - method: "PUT", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - type: "panorama/journal/page", - extra_data: { - "panorama/journal/page/content": "", - }, - }), - }); - const data = await resp.json(); - openNode(data.node_id); - })(); - }, [openNode]); - - return ( - <> -
- -
- Panorama - v{version} -
-
- - -
- -
-
- - ); -} - -function NewNodeButton() { - const [showMenu, setShowMenu] = useState(false); - const { refs, context, floatingStyles } = useFloating({ - placement: "bottom-start", - open: showMenu, - onOpenChange: setShowMenu, - whileElementsMounted: autoUpdate, - // middleware: [offset(10)], - }); - const focus = useFocus(context); - const { getReferenceProps, getFloatingProps } = useInteractions([ - focus, - useDismiss(context), - ]); - - return ( - <> - - - {showMenu && ( - - -
- -
-
-
- )} - - ); -} - -function NewNodeMenu() { - return ( -
-
    -
  • - -
  • -
  • - -
  • -
-
- ); -} diff --git a/ui/src/components/NodeDisplay.module.scss b/ui/src/components/NodeDisplay.module.scss deleted file mode 100644 index 9950d01..0000000 --- a/ui/src/components/NodeDisplay.module.scss +++ /dev/null @@ -1,74 +0,0 @@ -.container { - flex-shrink: 0; - - width: 500px; - overflow-wrap: break-word; - overflow-y: auto; - - border: 1px solid lightgray; - border-radius: 4px; - - display: flex; - align-items: stretch; - flex-direction: column; - - resize: horizontal; - - background-color: rgba(255, 255, 255, 0.5); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); -} - -.header { - color: rgb(106, 103, 160); - background: rgb(204, 201, 255); - background: linear-gradient(90deg, rgba(204, 201, 255, 1) 0%, rgba(255, 255, 255, 1) 100%); - - font-size: 0.6rem; - display: flex; - align-items: stretch; - padding: 0 6px; - - button { - background-color: transparent; - border: none; - display: flex; - justify-content: center; - cursor: pointer; - align-items: center; - - &:hover { - background-color: rgba(0, 0, 0, 0.25); - } - - &.closeButton:hover { - background-color: red; - color: white; - } - } - - span { - padding: 6px; - } -} - -.footer { - padding: 2px 12px; - font-size: 0.6rem; - align-self: flex-start; - - // For the resize handle - // TODO: Make the entire right side resize and then remove this - width: calc(100% - 20px); - // border: 1px solid red; - // box-sizing: border-box; -} - -.body { - flex-grow: 1; - - // padding: 12px; - - display: flex; - flex-direction: column; -} \ No newline at end of file diff --git a/ui/src/components/NodeDisplay.tsx b/ui/src/components/NodeDisplay.tsx deleted file mode 100644 index 3be2470..0000000 --- a/ui/src/components/NodeDisplay.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import styles from "./NodeDisplay.module.scss"; -import ReactTimeAgo from "react-time-ago"; -import { getNode } from "../lib/getNode"; -import FirstPageIcon from "@mui/icons-material/FirstPage"; -import MoreVertIcon from "@mui/icons-material/MoreVert"; -import CloseIcon from "@mui/icons-material/Close"; -import { useNodeControls } from "../App"; - -export interface NodeDisplayProps { - id: string; - idx?: number | undefined; -} - -export default function NodeDisplay({ id, idx }: NodeDisplayProps) { - const query = useQuery({ - queryKey: ["fetchNode", id], - queryFn: getNode, - }); - - const { isSuccess, status, data: nodeDescriptor } = query; - - let Component = undefined; - let data = undefined; - if (isSuccess) { - Component = nodeDescriptor.render; - data = nodeDescriptor.data; - } - - return ( -
-
- {isSuccess ? ( - - ) : ( - <> - ID {id} ({status}) - - )} -
- -
- {Component && } -
- -
{id}
-
- ); -} - -function NodeDisplayHeaderLoaded({ idx, id, data }) { - const { openNode, closeNode } = useNodeControls(); - const updatedAt = data.updated_at && Date.parse(data.updated_at); - - return ( - <> - {idx === 0 || ( - - )} - - Type {data.type}{" "} - {updatedAt && ( - <> - · Last updated - - )} - -
- - - - - - ); -} diff --git a/ui/src/components/SearchBar.module.scss b/ui/src/components/SearchBar.module.scss deleted file mode 100644 index 3bf84a0..0000000 --- a/ui/src/components/SearchBar.module.scss +++ /dev/null @@ -1,54 +0,0 @@ -.menu { - background-color: rgba(255, 255, 255, 0.5); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(10px); - box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.25); - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - - width: 500px; - min-height: 200px; - - padding: 6px; - - text-wrap: wrap; - white-space: pre-wrap; - word-wrap: break-word; - overflow-wrap: break-word; -} - -.entry { - padding: 2px 6px; - font-size: 14pt; - border-radius: 4px; - border: none; - outline: none; -} - -.searchResults { - display: flex; - flex-direction: column; - align-items: stretch; -} - -.searchResult { - padding: 12px; - cursor: pointer; - border-radius: 4px; - text-align: left; - background-color: unset; - border: none; - - &:hover { - background-color: rgba(0, 0, 0, 0.05); - } - - .title { - font-size: 1rem; - } - - .subtitle { - font-size: .75rem; - color: rgba(0, 0, 0, 0.8); - } -} \ No newline at end of file diff --git a/ui/src/components/SearchBar.tsx b/ui/src/components/SearchBar.tsx deleted file mode 100644 index 57fbde7..0000000 --- a/ui/src/components/SearchBar.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import styles from "./SearchBar.module.scss"; -import { - FloatingOverlay, - FloatingPortal, - autoUpdate, - offset, - useDismiss, - useFloating, - useFocus, - useInteractions, -} from "@floating-ui/react"; -import { useCallback, useEffect, useState } from "react"; -import { atom, useAtom, useSetAtom } from "jotai"; -import { useNodeControls } from "../App"; -import { useDebounce, useDebouncedCallback } from "use-debounce"; - -const searchQueryAtom = atom(""); -const showMenuAtom = atom(false); - -export default function SearchBar() { - const [showMenu, setShowMenu] = useAtom(showMenuAtom); - const [searchQuery, setSearchQuery] = useAtom(searchQueryAtom); - const [searchResults, setSearchResults] = useState([]); - - const { refs, context, floatingStyles } = useFloating({ - placement: "bottom-start", - open: showMenu, - onOpenChange: setShowMenu, - whileElementsMounted: autoUpdate, - middleware: [offset(10)], - }); - const focus = useFocus(context); - const { getReferenceProps, getFloatingProps } = useInteractions([ - focus, - useDismiss(context), - ]); - - const performSearch = useCallback(() => { - const trimmed = searchQuery.trim(); - if (trimmed === "") return; - - (async () => { - const params = new URLSearchParams(); - params.set("query", trimmed); - const resp = await fetch( - `http://localhost:5195/node/search?${params.toString()}`, - ); - const data = await resp.json(); - setSearchResults(data.results); - })(); - }, [searchQuery]); - - return ( - <> -
- setShowMenu(true)} - ref={refs.setReference} - value={searchQuery} - onChange={(evt) => { - setSearchQuery(evt.target.value); - if (evt.target.value) performSearch(); - else setSearchResults([]); - }} - {...getReferenceProps()} - /> -
- - {showMenu && ( - - -
- -
-
-
- )} - - ); -} - -function SearchMenu({ results }) { - const setSearchQuery = useSetAtom(searchQueryAtom); - const setShowMenu = useSetAtom(showMenuAtom); - const { openNode } = useNodeControls(); - - return ( -
- {results.map((result) => { - return ( - - ); - })} -
- ); -} diff --git a/ui/src/components/Sidebar.module.scss b/ui/src/components/Sidebar.module.scss deleted file mode 100644 index 37d0db5..0000000 --- a/ui/src/components/Sidebar.module.scss +++ /dev/null @@ -1,39 +0,0 @@ -.sidebar { - display: flex; - flex-direction: column; - gap: 6px; - - background-color: rgba(204, 201, 255); - padding: 12px 6px; - - &.expanded { - padding: 12px; - } - - .item { - display: flex; - align-items: center; - padding: 6px; - font-size: 0.95em; - border-radius: 4px; - border: none; - background-color: unset; - - &:hover { - background-color: rgba(255, 255, 255, 0.2); - cursor: pointer; - } - - &.active { - background-color: rgba(255, 255, 255, 0.75); - } - } - - &.expanded .item { - gap: 6px; - } - - &.collapsed .item .label { - display: none; - } -} \ No newline at end of file diff --git a/ui/src/components/Sidebar.tsx b/ui/src/components/Sidebar.tsx deleted file mode 100644 index 0c98878..0000000 --- a/ui/src/components/Sidebar.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { atom, useAtomValue } from "jotai"; -import styles from "./Sidebar.module.scss"; -import classNames from "classnames"; -import EmailIcon from "@mui/icons-material/Email"; -import SettingsIcon from "@mui/icons-material/Settings"; -import { useNodeControls } from "../App"; - -export const sidebarExpandedAtom = atom(false); - -export default function Sidebar() { - const sidebarExpanded = useAtomValue(sidebarExpandedAtom); - const { toggleNode, isOpen } = useNodeControls(); - - return ( -
- - -
- -
- - Settings -
-
- ); -} diff --git a/ui/src/components/nodes/JournalPage.module.scss b/ui/src/components/nodes/JournalPage.module.scss deleted file mode 100644 index af4b3c3..0000000 --- a/ui/src/components/nodes/JournalPage.module.scss +++ /dev/null @@ -1,61 +0,0 @@ -.container { - flex-grow: 1; - display: flex; - flex-direction: column; -} - -.titleContainer, -.titleEditorForm { - display: flex; -} - -.title, -.titleEditor { - flex-grow: 1; - padding: 12px; - border: none; - border-bottom: 1px solid lightgray; - outline: none; - font-size: 1.2em; -} - -.untitled { - color: gray; -} - -.mdContent { - flex-grow: 1; - display: flex; - flex-direction: column; -} - -.mdEditor { - flex-grow: 1; - - border-radius: 0; -} - -.dayIndicator { - background-color: lavender; - padding: 2px 12px; - font-size: 0.8em; -} - -.block { - padding: 12px; - - &:not(.isEditing) { - user-select: none; - -webkit-user-select: none; - } - - &.isEditing { - background-color: rgb(235, 243, 246); - outline: 2px solid skyblue; - } - - &:hover { - background-color: rgb(235, 243, 246); - cursor: text; - } -} \ No newline at end of file diff --git a/ui/src/components/nodes/JournalPage.tsx b/ui/src/components/nodes/JournalPage.tsx deleted file mode 100644 index e4c7665..0000000 --- a/ui/src/components/nodes/JournalPage.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react"; -import MDEditor, { PreviewType } from "@uiw/react-md-editor"; -import { usePrevious } from "@uidotdev/usehooks"; -import { useQueryClient } from "@tanstack/react-query"; -import styles from "./JournalPage.module.scss"; -import remarkMath from "remark-math"; -import rehypeKatex from "rehype-katex"; -import { parse as parseDate, format as formatDate } from "date-fns"; -import { useDebounce } from "use-debounce"; -import { - JOURNAL_PAGE_CONTENT_FIELD_NAME, - JOURNAL_PAGE_TITLE_FIELD_NAME, - NodeInfo, -} from "../../lib/data"; - -export interface JournalPageProps { - id: string; - data: NodeInfo; -} - -export default function JournalPage({ id, data }: JournalPageProps) { - const { day } = data; - const queryClient = useQueryClient(); - const [value, setValue] = useState( - () => data?.fields?.[JOURNAL_PAGE_CONTENT_FIELD_NAME], - ); - const [valueToSave] = useDebounce(value, 1000, { - leading: true, - trailing: true, - }); - const previous = usePrevious(valueToSave); - const changed = valueToSave !== previous; - const [mode, setMode] = useState("preview"); - const [title, setTitle] = useState( - () => data?.fields?.[JOURNAL_PAGE_TITLE_FIELD_NAME], - ); - const [isEditingTitle, setIsEditingTitle] = useState(false); - - const saveData = useCallback(async () => { - const extra_data = { - [JOURNAL_PAGE_TITLE_FIELD_NAME]: title, - [JOURNAL_PAGE_CONTENT_FIELD_NAME]: valueToSave, - }; - console.log("extra Data", extra_data); - const resp = await fetch(`http://localhost:5195/node/${id}`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ extra_data }), - }); - const data = await resp.text(); - console.log("result", data); - }, [title, valueToSave, id]); - - useEffect(() => { - if (changed) { - (async () => { - await saveData(); - queryClient.invalidateQueries({ queryKey: ["fetchNode", id] }); - })(); - } - }, [changed, queryClient, saveData]); - - const saveChangedTitle = useCallback(() => { - (async () => { - await saveData(); - setIsEditingTitle(false); - })(); - }, [saveData]); - - return ( - <> - {isEditingTitle ? ( -
{ - evt.preventDefault(); - saveChangedTitle(); - }} - > - { - let newTitle = evt.target.value; - if (newTitle.trim().length === 0) newTitle = null; - setTitle(newTitle); - }} - onBlur={() => saveChangedTitle()} - // biome-ignore lint/a11y/noAutofocus: - autoFocus - /> - - ) : ( -
-
setIsEditingTitle(true)} - > - {title ?? (untitled)} -
-
- )} -
- {day && } - - newValue !== undefined && setValue(newValue)} - preview={mode} - visibleDragbar={false} - onDoubleClick={() => setMode("live")} - previewOptions={{ - remarkPlugins: [remarkMath], - rehypePlugins: [rehypeKatex], - }} - /> -
- - ); -} - -function DayIndicator({ day }) { - const parsedDate = parseDate(day, "yyyy-MM-dd", new Date()); - const formattedDate = formatDate(parsedDate, "PPPP"); - return ( -
- Journal entry for {formattedDate} -
- ); -} diff --git a/ui/src/components/nodes/Mail.module.scss b/ui/src/components/nodes/Mail.module.scss deleted file mode 100644 index 18d3395..0000000 --- a/ui/src/components/nodes/Mail.module.scss +++ /dev/null @@ -1,25 +0,0 @@ -.container { - display: flex; - flex-direction: column; -} - -.header { - display: flex; - align-items: center; - padding: 2px 12px; - - .title { - font-size: 1rem; - } -} - -.settings { - h2 { - margin: 0; - } -} - -.mailList { - flex-grow: 1; - border-top: 1px solid lightgray; -} \ No newline at end of file diff --git a/ui/src/components/nodes/Mail.tsx b/ui/src/components/nodes/Mail.tsx deleted file mode 100644 index 73f8fd5..0000000 --- a/ui/src/components/nodes/Mail.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import { useCallback, useState } from "react"; -import styles from "./Mail.module.scss"; -import { Formik } from "formik"; -import SettingsIcon from "@mui/icons-material/Settings"; -import { useQuery, useQueryClient } from "@tanstack/react-query"; -import ReactTimeAgo from "react-time-ago"; -import { parseISO } from "date-fns"; - -export default function Mail() { - const [showSettings, setShowSettings] = useState(false); - const fetchedMail = useQuery({ - queryKey: ["mail"], - queryFn: fetchMail, - staleTime: 10000, - }); - - const { isSuccess, data } = fetchedMail; - - return ( -
-
-
- {showSettings ? <>Settings : <>Mail} -
-
- -
- - {showSettings && ( -
- -
- )} - -
- {isSuccess && ( -
    - {data.messages.map((message) => { - const date = parseISO(message.internal_date); - return ( -
  • -
    - - {message.subject} () - - - {message.body} -
    -
  • - ); - })} -
- )} -
-
- ); -} - -function MailConfig() { - const queryClient = useQueryClient(); - const config = useQuery({ - queryKey: ["mailConfigs"], - queryFn: fetchMailConfig, - }); - - const { isSuccess, data } = config; - - return ( - <> -
- Add a new config - { - (async () => { - const resp = await fetch("http://localhost:5195/node", { - method: "PUT", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - type: "panorama/mail/config", - extra_data: { - "panorama/mail/config/imap_hostname": values.imapHostname, - "panorama/mail/config/imap_port": values.imapPort, - "panorama/mail/config/imap_username": values.imapUsername, - "panorama/mail/config/imap_password": values.imapPassword, - }, - }), - }); - const data = await resp.json(); - console.log("result", data); - queryClient.invalidateQueries({ queryKey: ["mailConfigs"] }); - })(); - }} - initialValues={{ - imapHostname: "", - imapPort: 993, - imapUsername: "", - imapPassword: "", - }} - > - {({ values, handleSubmit, handleChange, handleBlur }) => ( -
- - -
- - - -
- )} -
-
- -
- {isSuccess && ( -
    - {data.map((config) => ( -
  • {JSON.stringify(config)}
  • - ))} -
- )} -
- - ); -} - -async function fetchMailConfig() { - const resp = await fetch("http://localhost:5195/mail/config"); - const data = await resp.json(); - return data.configs; -} - -async function fetchMail() { - const resp = await fetch("http://localhost:5195/mail"); - const data = await resp.json(); - return data; -} diff --git a/ui/src/global.scss b/ui/src/global.scss deleted file mode 100644 index cb9ead2..0000000 --- a/ui/src/global.scss +++ /dev/null @@ -1,23 +0,0 @@ -body, -html { - padding: 0; - margin: 0; - overscroll-behavior: none; - - font-family: "Inter"; -} - -body, -html, -#root { - width: 100%; - height: 100%; -} - -.spacer { - flex-grow: 1; -} - -* { - box-sizing: border-box; -} \ No newline at end of file diff --git a/ui/src/lib/data.ts b/ui/src/lib/data.ts deleted file mode 100644 index b94cef8..0000000 --- a/ui/src/lib/data.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface NodeInfo { - fields: Partial; -} - -export const JOURNAL_PAGE_CONTENT_FIELD_NAME = "panorama/journal/page/content"; -export const JOURNAL_PAGE_TITLE_FIELD_NAME = "panorama/journal/page/title"; - -export interface NodeFields { - [JOURNAL_PAGE_CONTENT_FIELD_NAME]: string; - [JOURNAL_PAGE_TITLE_FIELD_NAME]: string; -} diff --git a/ui/src/lib/getNode.ts b/ui/src/lib/getNode.ts deleted file mode 100644 index 5176a69..0000000 --- a/ui/src/lib/getNode.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Component, FC } from "react"; -import JournalPage from "../components/nodes/JournalPage"; -import Mail from "../components/nodes/Mail"; -import { QueryFunctionContext } from "@tanstack/react-query"; - -export interface RenderProps { - id: string; - data: D; -} - -export interface NodeDescriptor { - render: FC>; - data: { - type: string; - } & D; -} - -export async function getNode({ - queryKey, -}: QueryFunctionContext): Promise> { - const [, node_id] = queryKey; - switch (node_id) { - case "panorama/mail": - return { data: { type: "panorama/mail" }, render: Mail }; - default: { - const resp = await fetch(`http://localhost:5195/node/${node_id}`); - const data = await resp.json(); - return { - data: { ...data, type: "panorama/journal/page" }, - render: JournalPage, - }; - } - } -} diff --git a/ui/src/main.tsx b/ui/src/main.tsx deleted file mode 100644 index 2be325e..0000000 --- a/ui/src/main.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import App from "./App"; - -ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - - - , -); diff --git a/ui/src/vite-env.d.ts b/ui/src/vite-env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/ui/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/ui/tsconfig.json b/ui/tsconfig.json deleted file mode 100644 index a7fc6fb..0000000 --- a/ui/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/ui/tsconfig.node.json b/ui/tsconfig.node.json deleted file mode 100644 index 42872c5..0000000 --- a/ui/tsconfig.node.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/ui/vite.config.ts b/ui/vite.config.ts deleted file mode 100644 index 58e738a..0000000 --- a/ui/vite.config.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { defineConfig, type PluginOption } from "vite"; -import react from "@vitejs/plugin-react"; -import { visualizer } from "rollup-plugin-visualizer"; - -// https://vitejs.dev/config/ -export default defineConfig(async () => ({ - plugins: [ - react(), - visualizer({ - emitFile: true, - filename: "stats.html", - }) as PluginOption, - ], - - // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` - // - // 1. prevent vite from obscuring rust errors - clearScreen: false, - // 2. tauri expects a fixed port, fail if that port is not available - server: { - port: 1420, - strictPort: true, - watch: { - // 3. tell vite to ignore watching `src-tauri` - ignored: ["**/src-tauri/**"], - }, - }, -}));