select first item in listviews initially

This commit is contained in:
Henrik Friedrichsen
2019-03-17 23:03:07 +01:00
parent 9842b89457
commit e0d1d456f4
3 changed files with 17 additions and 38 deletions

View File

@@ -109,8 +109,6 @@ impl CommandManager {
s.call_on_id("search", |v: &mut SearchView| { s.call_on_id("search", |v: &mut SearchView| {
if args.len() >= 1 { if args.len() >= 1 {
v.run_search(args.join(" "), spotify.clone()); v.run_search(args.join(" "), spotify.clone());
} else {
v.focus_search();
} }
}); });
Ok(None) Ok(None)
@@ -241,7 +239,7 @@ impl CommandManager {
{ {
let queue = queue.clone(); let queue = queue.clone();
s.call_on_id("queue_list", |v: &mut ListView<Track>| { s.call_on_id("queue_list", |v: &mut ListView<Track>| {
v.get_selected_index().map(|i| queue.play(i)); queue.play(v.get_selected_index());
}); });
} }
@@ -290,7 +288,7 @@ impl CommandManager {
{ {
let queue = queue.clone(); let queue = queue.clone();
s.call_on_id("queue_list", |v: &mut ListView<Track>| { s.call_on_id("queue_list", |v: &mut ListView<Track>| {
v.get_selected_index().map(|i| queue.remove(i)); queue.remove(v.get_selected_index());
}); });
} }

View File

@@ -13,7 +13,7 @@ use traits::ListItem;
pub struct ListView<I: 'static + ListItem> { pub struct ListView<I: 'static + ListItem> {
content: Arc<RwLock<Vec<I>>>, content: Arc<RwLock<Vec<I>>>,
selected: Option<usize>, selected: usize,
queue: Arc<Queue>, queue: Arc<Queue>,
} }
@@ -21,46 +21,33 @@ impl<I: ListItem> ListView<I> {
pub fn new(content: Arc<RwLock<Vec<I>>>, queue: Arc<Queue>) -> Self { pub fn new(content: Arc<RwLock<Vec<I>>>, queue: Arc<Queue>) -> Self {
Self { Self {
content: content, content: content,
selected: None, selected: 0,
queue: queue, queue: queue,
} }
} }
pub fn with_selected(&self, cb: Box<Fn(&I) -> ()>) { pub fn with_selected(&self, cb: Box<Fn(&I) -> ()>) {
if let Some(i) = self.selected { match self.content.read().unwrap().get(self.selected) {
if let Some(x) = self.content.read().unwrap().get(i) { Some(x) => cb(x),
cb(x); None => error!("listview: invalid item index: {})", self.selected)
}
} }
} }
pub fn get_selected_index(&self) -> Option<usize> { pub fn get_selected_index(&self) -> usize {
self.selected self.selected
} }
pub fn move_focus(&mut self, delta: i32) { pub fn move_focus(&mut self, delta: i32) {
let len = self.content.read().unwrap().len() as i32; let len = self.content.read().unwrap().len() as i32;
let new = self.selected as i32 + delta;
let new = if let Some(i) = self.selected { self.selected = min(max(new, 0), len - 1) as usize;
i as i32
} else {
if delta < 0 {
len
} else {
-1
}
};
let new = min(max(new + delta, 0), len - 1);
self.selected = Some(new as usize);
} }
} }
impl<I: ListItem> View for ListView<I> { impl<I: ListItem> View for ListView<I> {
fn draw(&self, printer: &Printer<'_, '_>) { fn draw(&self, printer: &Printer<'_, '_>) {
for (i, item) in self.content.read().unwrap().iter().enumerate() { for (i, item) in self.content.read().unwrap().iter().enumerate() {
let style = if self.selected.is_some() && self.selected.unwrap_or(0) == i { let style = if self.selected == i {
ColorStyle::highlight() ColorStyle::highlight()
} else if item.is_playing(self.queue.clone()) { } else if item.is_playing(self.queue.clone()) {
ColorStyle::secondary() ColorStyle::secondary()
@@ -121,9 +108,11 @@ impl<I: ListItem> View for ListView<I> {
} }
fn important_area(&self, view_size: Vec2) -> Rect { fn important_area(&self, view_size: Vec2) -> Rect {
match self.selected { if self.content.read().unwrap().len() > 0 {
Some(index) => Rect::from((view_size.x, index)), Rect::from((view_size.x, self.selected))
None => Rect::from((0, 0)), }
else {
Rect::from((0, 0))
} }
} }
} }

View File

@@ -42,7 +42,7 @@ impl SearchView {
results: results, results: results,
edit: searchfield, edit: searchfield,
list: scrollable, list: scrollable,
edit_focused: false, edit_focused: true,
} }
} }
@@ -67,14 +67,6 @@ impl SearchView {
} }
} }
pub fn focus_search(&mut self) {
self.edit
.call_on(&Selector::Id("search_edit"), |v: &mut EditView| {
v.set_content("");
});
self.edit_focused = true;
}
fn pass_event_focused(&mut self, event: Event) -> EventResult { fn pass_event_focused(&mut self, event: Event) -> EventResult {
match self.edit_focused { match self.edit_focused {
true => self.edit.on_event(event), true => self.edit.on_event(event),