Skip to content

Commit

Permalink
Add menu component, proper code block support with syntax highlighting
Browse files Browse the repository at this point in the history
Syntax highlighting is being done on main thread. This is kinda slow operation and blocks the main thread. It should be done in a web worker but that is unsupported by trunk and is a hassle to get working.
See: trunk-rs/trunk#46
  • Loading branch information
ranile committed Oct 6, 2020
1 parent 4e654b6 commit 78c012f
Show file tree
Hide file tree
Showing 22 changed files with 749 additions and 115 deletions.
1 change: 1 addition & 0 deletions main.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,4 @@ export { Snackbar } from '@material/mwc-snackbar'
export { TextField } from '@material/mwc-textfield'
export { TextArea } from '@material/mwc-textarea'
export { Select } from '@material/mwc-select'
export { Menu } from '@material/mwc-menu'
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"@material/mwc-icon-button-toggle": "^0.18.0",
"@material/mwc-linear-progress": "^0.18.0",
"@material/mwc-list": "^0.18.0",
"@material/mwc-menu": "^0.18.0",
"@material/mwc-radio": "^0.18.0",
"@material/mwc-select": "^0.18.0",
"@material/mwc-slider": "^0.18.0",
Expand Down
3 changes: 3 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,4 +178,7 @@ pub use text_inputs::*;
pub mod select;
pub use select::MatSelect;

pub mod menu;
pub use menu::MatMenu;

pub use utils::WeakComponentLink;
81 changes: 2 additions & 79 deletions src/list/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ use yew::prelude::*;
use crate::{add_event_listener, to_option, add_event_listener_with_one_param, WeakComponentLink};
use yew::web_sys::Node;
use std::collections::HashSet;
use wasm_bindgen::__rt::core::result::Result::Ok;
use wasm_bindgen::JsCast;
use js_sys::Object;
use yew::virtual_dom::Attributes::IndexMap;
use crate::list::list_index::ListIndex;
use crate::list::SelectedDetail;

#[wasm_bindgen(module = "/build/built-js.js")]
extern "C" {
Expand All @@ -32,84 +33,6 @@ extern "C" {

loader_hack!(List);

#[wasm_bindgen]
extern "C" {
#[derive(Debug)]
#[wasm_bindgen(extends = Object)]
type SelectedDetailJS;

#[wasm_bindgen(method, getter)]
pub fn index(this: &SelectedDetailJS) -> JsValue;

#[wasm_bindgen(method, getter)]
pub fn diff(this: &SelectedDetailJS) -> IndexDiffJS;

#[derive(Debug)]
#[wasm_bindgen(extends = Object)]
type IndexDiffJS;

#[wasm_bindgen(method, getter)]
pub fn added(this: &IndexDiffJS) -> Vec<usize>;

#[wasm_bindgen(method, getter)]
pub fn removed(this: &IndexDiffJS) -> Vec<usize>;
}

#[derive(Debug)]
pub enum ListIndex {
Single(Option<usize>),
Multi(HashSet<usize>),
}

#[derive(Debug)]
pub struct SelectedDetail {
index: ListIndex,
diff: Option<IndexDiff>,
}

#[derive(Debug)]
pub struct IndexDiff {
added: Vec<usize>,
removed: Vec<usize>,
}

impl From<JsValue> for ListIndex {
fn from(val: JsValue) -> Self {
if let Ok(set) = val.clone().dyn_into::<js_sys::Set>() {
let indices = set.values()
.into_iter()
.filter_map(|item| item.ok())
.filter_map(|value| value.as_f64())
.map(|num| num as usize)
.collect();
ListIndex::Multi(indices)
} else if let Some(value) = val.as_f64() {
ListIndex::Single(if value != -1.0 { Some(value as usize) } else { None })
} else {
panic!("This should never happen")
}
}
}

impl From<JsValue> for SelectedDetail {
fn from(value: JsValue) -> Self {
let detail = value.unchecked_into::<SelectedDetailJS>();
let index = ListIndex::from(detail.index());

let diff = if detail.diff().is_undefined() { None } else {
let diff = detail.diff();
Some(IndexDiff {
added: diff.added(),
removed: diff.removed(),
})
};
Self {
index,
diff,
}
}
}

pub struct MatList {
props: Props,
node_ref: NodeRef,
Expand Down
28 changes: 28 additions & 0 deletions src/list/list_index.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use std::collections::HashSet;
use wasm_bindgen::{JsValue, JsCast};

#[derive(Debug)]
pub enum ListIndex {
Single(Option<usize>),
Multi(HashSet<usize>),
}


impl From<JsValue> for ListIndex {
fn from(val: JsValue) -> Self {
if let Ok(set) = val.clone().dyn_into::<js_sys::Set>() {
let indices = set.values()
.into_iter()
.filter_map(|item| item.ok())
.filter_map(|value| value.as_f64())
.map(|num| num as usize)
.collect();
ListIndex::Multi(indices)
} else if let Some(value) = val.as_f64() {
ListIndex::Single(if value != -1.0 { Some(value as usize) } else { None })
} else {
panic!("This should never happen")
}
}
}

5 changes: 5 additions & 0 deletions src/list/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ pub mod check_list_item;
pub use check_list_item::MatCheckListItem;

pub mod radio_list_item;
mod list_index;
mod selected_detail;

pub use list_index::ListIndex;
pub use selected_detail::{SelectedDetail, IndexDiff};
pub use radio_list_item::MatRadioListItem;

#[derive(Clone, Debug)]
Expand Down
60 changes: 60 additions & 0 deletions src/list/selected_detail.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
use crate::list::ListIndex;
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;
use js_sys::Object;

#[derive(Debug)]
pub struct SelectedDetail {
index: ListIndex,
diff: Option<IndexDiff>,
}

#[derive(Debug)]
pub struct IndexDiff {
added: Vec<usize>,
removed: Vec<usize>,
}

impl From<JsValue> for SelectedDetail {
fn from(value: JsValue) -> Self {
let detail = value.unchecked_into::<SelectedDetailJS>();
let index = ListIndex::from(detail.index());

let diff = if detail.diff().is_undefined() { None } else {
let diff = detail.diff();
Some(IndexDiff {
added: diff.added(),
removed: diff.removed(),
})
};
Self {
index,
diff,
}
}
}


#[wasm_bindgen]
extern "C" {
#[derive(Debug)]
#[wasm_bindgen(extends = Object)]
type SelectedDetailJS;

#[wasm_bindgen(method, getter)]
pub fn index(this: &SelectedDetailJS) -> JsValue;

#[wasm_bindgen(method, getter)]
pub fn diff(this: &SelectedDetailJS) -> IndexDiffJS;

#[derive(Debug)]
#[wasm_bindgen(extends = Object)]
type IndexDiffJS;

#[wasm_bindgen(method, getter)]
pub fn added(this: &IndexDiffJS) -> Vec<usize>;

#[wasm_bindgen(method, getter)]
pub fn removed(this: &IndexDiffJS) -> Vec<usize>;
}

Loading

0 comments on commit 78c012f

Please sign in to comment.