#table-row #row-column #table #egui #row #drag #selectable-table

egui-selectable-table

A library for egui to create tables with draggable cell and row selection

1 unstable release

0.1.0 Oct 16, 2024

#181 in GUI

Download history 135/week @ 2024-10-13 33/week @ 2024-10-20 12/week @ 2024-10-27

180 downloads per month
Used in talon-gui

MIT license

65KB
873 lines

egui-selectable-table

Crates version Downloads

A library for egui to create tables with draggable cell and row selection.

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

// 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<MyRow, ColumnName, Config> 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<SortOrder>, table: &mut SelectableTable<MyRow, Column, Config>) -> Option<Response> {}
    //Create your own table row UI
    fn create_table_row(&self, ui: &mut Ui, row: &SelectableRow<MyRow, Column>, selected: bool, table: &mut SelectableTable<MyRow, Column, Config>,) -> Response {}
}
impl ColumnOrdering<MyRow> 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<MyRow, Column, Config>
}

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

  • 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.

Dependencies

~6–11MB
~136K SLoC