# egui-selectable-table
A library for [egui](https://github.com/emilk/egui) to create tables with draggable cell and row selection.
[](https://github.com/user-attachments/assets/54aadfbf-e795-4948-933b-68c08dce6242)
## Features
- Individual cell or full-row selection while dragging
- Auto vertical table scrolling during drag with adjustable parameters
- Sort rows by clicking headers, both ascending and descending
- Customizable rows and header UI
- Built-in select all (Ctrl+A) and copy (Ctrl+C) functionality
- Capable of handling a substantial amount of rows (1M+) with proper settings
## Usage
```rust
// See Demo folder for a complete example
use egui_selectable_table::{
ColumnOperations, ColumnOrdering, SelectableRow, SelectableTable, SortOrder,
};
// other use imports
struct Config {
// anything you want to pass
}
struct MyRow {
field_1: String,
// .. more fields
}
enum Column {
Field1,
// .. more column names
}
// Implement both traits for row and column
impl ColumnOperations for Column {
// The text of a row based on the column
fn column_text(&self, row: &WhiteListRowData) -> String {}
// Create your own header or no header
fn create_header(&self, ui: &mut Ui, sort_order: Option, table: &mut SelectableTable) -> Option {}
//Create your own table row UI
fn create_table_row(&self, ui: &mut Ui, row: &SelectableRow, selected: bool, table: &mut SelectableTable,) -> Response {}
}
impl ColumnOrdering for Column {
fn order_by(&self, row_1: &MyRow, row_2: &MyRow) -> std::cmp::Ordering {
match self {
Column::Field1 => row_1.field_1.cmp(&row_2.field_1),
}
}
}
pub struct MainWindow {
table: SelectableTable
}
impl MainWindow {
pub fn new() -> Self {
Self {
table: SelectableTable::new(vec![Column::Field1])
}
}
}
impl eframe::App for MainWindow {
fn update(&mut self, ctx: &eframe::egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
self.table.show_ui(ui |table| {
table.striped(true)
.cell_layout(Layout::left_to_right(Align::Center))
.column(Column::exact(column_size).clip(true))
})
});
}
}
```
## Run Demo
The demo is accessible online via [this link](https://therustypickle.github.io/egui-selectable-table/)
- Clone the repository `git clone https://github.com/TheRustyPickle/egui-selectable-table`
- Move into the demo folder `cd egui-selectable-table/demo`
- To run natively `cargo run --release`
or
- To run in wasm locally install the required target with `rustup target add wasm32-unknown-unknown`
- Install Trunk with `cargo install --locked trunk`
- `trunk serve` to run and visit `http://127.0.0.1:8080/`
## Contributing
Contributions, issues, and feature requests are welcome! If you'd like to contribute, please open a pull request.
## License
This project is licensed under the MIT License.