Starta på et gtk ColumnView

main
Trygve 2023-03-23 20:49:26 +01:00
parent 394c68ad26
commit 3d3bc2d858
2 changed files with 94 additions and 3 deletions

View File

@ -8,4 +8,8 @@ edition = "2021"
[dependencies]
csv = "1.2"
encoding_rs = "0.8"
encoding_rs_io = "0.1"
encoding_rs_io = "0.1"
[dependencies.gtk4]
package = "gtk4"
version = "0.6.4"
features = ["v4_8"]

View File

@ -4,6 +4,12 @@ use csv::ReaderBuilder;
use encoding_rs::WINDOWS_1252;
use encoding_rs_io::DecodeReaderBytesBuilder;
use gtk4 as gtk;
use gtk::glib::BoxedAnyObject;
use gtk::prelude::*;
use gtk::{gio, glib, Inscription};
use std::cell::Ref;
#[derive(Debug)]
struct Runner {
num: i16,
@ -32,6 +38,12 @@ struct Course {
name: String,
codes: Vec<String>
}
struct Row {
col1: String,
col2: String,
}
impl Course {
fn get_empty() -> Course{
return Course {name: String::from(""), codes: Vec::new()};
@ -100,8 +112,83 @@ fn check_codes(card: &CardLog, course: &Course) -> bool{
}
fn main() {
println!("{:?}", read_ttime_csv_file("/home/trygve/Prosjekter/otime_rs/k2ds/db.csv"));
println!("{:?}", read_mtr_file("/home/trygve/Prosjekter/otime_rs/k2ds/mtr.txt"));
//println!("{:?}", read_ttime_csv_file("/home/trygve/Prosjekter/otime_rs/k2ds/db.csv"));
//println!("{:?}", read_mtr_file("/home/trygve/Prosjekter/otime_rs/k2ds/mtr.txt"));
let app = gtk::Application::new(
Some("me.trygve.otimetest"),
Default::default(),
);
app.connect_activate(build_ui);
app.run();
}
fn build_ui(application: &gtk::Application) {
let window = gtk::ApplicationWindow::builder()
.default_width(600)
.default_height(480)
.application(application)
.title("Otime 😎️")
.build();
let store = gio::ListStore::new(BoxedAnyObject::static_type());
let runners = read_ttime_csv_file("/home/trygve/Prosjekter/otime_rs/k2ds/db.csv");
let cards = read_mtr_file("/home/trygve/Prosjekter/otime_rs/k2ds/mtr.txt");
for runner in runners {
store.append(&BoxedAnyObject::new(Row {
col1: format!("{}", runner.fname),
col2: format!("{}", runner.lname),
}));
}
let sel = gtk::SingleSelection::new(Some(store));
let columnview = gtk::ColumnView::new(Some(sel));
let col1factory = gtk::SignalListItemFactory::new();
let col2factory = gtk::SignalListItemFactory::new();
col1factory.connect_setup(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let row = gtk::EditableLabel::new("aaa");
item.set_child(Some(&row));
});
col1factory.connect_bind(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<gtk::EditableLabel>().unwrap();
let entry = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let r: Ref<Row> = entry.borrow();
child.set_text(&r.col1.to_string());
});
col2factory.connect_setup(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let row = gtk::EditableLabel::new("bbbb");
item.set_child(Some(&row));
});
col2factory.connect_bind(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<gtk::EditableLabel>().unwrap();
let entry = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let r: Ref<Row> = entry.borrow();
child.set_text(&r.col2.to_string());
});
let col1 = gtk::ColumnViewColumn::new(Some("Fornavn"), Some(col1factory));
let col2 = gtk::ColumnViewColumn::new(Some("Etternavn"), Some(col2factory));
col1.set_resizable(true);
col2.set_resizable(true);
columnview.append_column(&col1);
columnview.append_column(&col2);
let scrolled_window = gtk::ScrolledWindow::builder()
.hscrollbar_policy(gtk::PolicyType::Never) // Disable horizontal scrolling
.build();
scrolled_window.set_child(Some(&columnview));
window.set_child(Some(&scrolled_window));
window.show();
}
fn read_ttime_csv_file(path: &str) -> Vec<Runner> {