Skip to content

Commit

Permalink
use Option<u32> for selection in List
Browse files Browse the repository at this point in the history
  • Loading branch information
Emily committed Mar 9, 2017
1 parent 5add947 commit 8a377cb
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 45 deletions.
2 changes: 1 addition & 1 deletion examples/canvas.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use std::rc::Rc;
use std::cell::RefCell;

fn main() {
let window = Window::new(Rect::new(100, 100, 420, 420), "Canvas");
let mut window = Window::new(Rect::new(100, 100, 420, 420), "Canvas");

let click_pos: Rc<RefCell<Option<Point>>>= Rc::new(RefCell::new(None));

Expand Down
2 changes: 1 addition & 1 deletion examples/filtered.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use orbtk::{Window, TextBox, Rect, Label, Event};
use orbtk::traits::{EventFilter, Place, Text};

fn main() {
let window = Window::new(Rect::new(100, 100, 420, 420), "Filtered Textbox");
let mut window = Window::new(Rect::new(100, 100, 420, 420), "Filtered Textbox");

let label = Label::new();
label.text("Field below will ignore all 'e' chars.")
Expand Down
4 changes: 2 additions & 2 deletions examples/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use orbtk::{ Window, List, Rect, Entry, Button };
use orbtk::traits::{ Place, Text, Click };

fn main() {
let window = Window::new(Rect::new(100, 100, 420, 500), "OrbTK");
let mut window = Window::new(Rect::new(100, 100, 420, 500), "OrbTK");

let list = List::new();
list.position(5, 5).size(400, 400);
Expand All @@ -23,4 +23,4 @@ fn main() {
window.add(&list);

window.exec();
}
}
2 changes: 1 addition & 1 deletion examples/widgets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use orbtk::{Action, Button, Grid, Image, Label, Menu, Point, ProgressBar, Rect,
use orbtk::traits::{Border, Click, Enter, Place, Text};

fn main() {
let window = Window::new(Rect::new(100, 100, 420, 730), "OrbTK");
let mut window = Window::new(Rect::new(100, 100, 420, 730), "OrbTK");

let x = 10;
let mut y = 0;
Expand Down
102 changes: 62 additions & 40 deletions src/widgets/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ pub struct List {
current_height: Cell<u32>,
entries: RefCell<Vec<Arc<Entry>>>,
pressed: Cell<bool>,
selected: Cell<i32>,
selected: Cell<Option<u32>>,
}

impl List {
Expand All @@ -74,7 +74,7 @@ impl List {
current_height: Cell::new(0),
entries: RefCell::new(vec![]),
pressed: Cell::new(false),
selected: Cell::new(-1),
selected: Cell::new(None),
})
}

Expand All @@ -86,7 +86,7 @@ impl List {

// Given absolute coordinates, returns the list entry index
// drawn at that point.
fn get_entry_index(&self, p: Point) -> i32 {
fn get_entry_index(&self, p: Point) -> Option<u32> {
if self.rect.get().contains(p) {
let mut current_y = 0;
let x = self.rect.get().x;
Expand All @@ -96,15 +96,13 @@ impl List {

for (i, entry) in self.entries.borrow().iter().enumerate() {
if Rect::new(x, y+current_y-scroll, width, entry.height.get()).contains(p) {
return i as i32
return Some(i as u32)
}
current_y += entry.height.get() as i32
}

-1
} else {
-1
}

None
}

pub fn scroll(&self, y: i32) {
Expand All @@ -117,14 +115,22 @@ impl List {
self.v_scroll.set(set_to);
}

fn change_selection(&self, i: i32) {
if let Some(entry) = self.entries.borrow().get(self.selected.get() as usize) {
entry.highlighted.set(false);
fn change_selection(&self, i: u32) {
match self.selected.get() {
Some(i) => {
match self.entries.borrow().get(i as usize) {
Some(entry) => {
entry.highlighted.set(false);
},
None => {},
}
},
_ => {},
}

if let Some(entry) = self.entries.borrow().get(i as usize) {
entry.highlighted.set(true);
self.selected.set(i);
self.selected.set(Some(i));

let mut y = 0;

Expand Down Expand Up @@ -205,58 +211,74 @@ impl Widget for List {
}
}

let i = self.get_entry_index(point);

if i >= 0 {
if let Some(i) = self.get_entry_index(point) {
if click {
if let Some(entry) = self.entries.borrow().get(i as usize) {
entry.emit_click(point);
}
}

if self.selected.get() != i {
if self.selected.get() != -1 {
if let Some(entry) = self.entries.borrow().get(self.selected.get() as usize) {
entry.highlighted.set(false);
match self.selected.get() {
None => {
self.change_selection(i);
*redraw = true;
},
Some(selected) => {
if selected != i {
self.change_selection(i);
*redraw = true;
}
}

if let Some(entry) = self.entries.borrow().get(i as usize) {
entry.highlighted.set(true);
self.selected.set(i);
}
*redraw = true
},
}
}
},
Event::UpArrow => {
if self.selected.get() > 0 {
self.change_selection(self.selected.get() - 1);
*redraw = true
} else if self.selected.get() == -1 {
self.change_selection(0);
*redraw = true
match self.selected.get() {
None => {
self.change_selection(0);
*redraw = true;
},
Some(i) => {
if i > 0 {
self.change_selection(i - 1);
*redraw = true;
}
}
}
},
Event::DownArrow => {
if self.selected.get() < self.entries.borrow().len() as i32 - 1 {
self.change_selection(self.selected.get() + 1);
*redraw = true
match self.selected.get() {
None => {
self.change_selection(0);
*redraw = true;
},
Some(i) => {
if i < self.entries.borrow().len() as u32 - 1 {
self.change_selection(i + 1);
*redraw = true;
}
}
}
},
Event::Home => {
self.change_selection(0);
*redraw = true
},
Event::End => {
self.change_selection(self.entries.borrow().len() as i32 - 1);
self.change_selection(self.entries.borrow().len() as u32 - 1);
*redraw = true
},
Event::Enter => {
let i = self.selected.get();

if let Some(entry) = self.entries.borrow().get(i as usize) {
entry.emit_click(Point { x: 0, y: 0});
match self.selected.get() {
Some(i) => {
match self.entries.borrow().get(i as usize) {
Some(entry) => {
entry.emit_click(Point { x: 0, y: 0});
},
None => {},
}
},
_ => {},
}
},
Event::Scroll { y, .. } => {
Expand Down

0 comments on commit 8a377cb

Please sign in to comment.