first version

This commit is contained in:
rick 2025-01-28 00:58:49 +01:00
commit 5f771264e5
4 changed files with 4188 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

4032
Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

11
Cargo.toml Normal file
View file

@ -0,0 +1,11 @@
[package]
name = "bookmarks-reader"
version = "0.1.0"
edition = "2021"
[dependencies]
eframe = "0.30.0"
egui_extras = "0.30.0"
rfd = { version = "0.15.2", features = ["gtk3"], default-features = false }
serde = "1.0.217"
serde_json = { version = "1.0.137", features = ["raw_value"] }

144
src/main.rs Normal file
View file

@ -0,0 +1,144 @@
use eframe::egui;
use serde_json::{Result, value::RawValue};
use serde::{Deserialize, Serialize};
use std::fs::File;
use std::io::BufReader;
use std::path::Path;
use egui_extras::{TableBuilder, Column};
use std::path::PathBuf;
#[derive(Clone, Deserialize, Serialize)]
struct Tweet {
id: String,
created_at: String,
full_text: String,
media: Vec<Box<RawValue>>,
screen_name: String,
name: Box<RawValue>,
}
#[derive(Clone, PartialEq)]
enum State {
NoFile, // au démarrage
FileLoading, // parsing du fichier
Loaded, // fichier parsé et pouvant être affiché
}
#[derive(Default)]
struct MyApp {
path_file: Option<PathBuf>,
tweets: Option<Vec<Tweet>>,
saved: bool,
}
fn main() -> eframe::Result {
//env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`).
//
let native_options = eframe::NativeOptions {
viewport: egui::ViewportBuilder::default()
.with_inner_size([400.0, 300.0])
.with_min_inner_size([300.0, 220.0]),
/*
.with_icon(
eframe::icon_data::from_png_bytes(&include_bytes!("../assets/icon-256.png")[..])
.expect("Failed to load icon"),
),
*/
..Default::default()
};
eframe::run_native(
"eframe template",
native_options,
//Box::new(|cc| Ok(Box::new(eframe_template::TemplateApp::new(cc)))),
Box::new(|_cc| Ok(Box::<MyApp>::default())),
)
}
impl eframe::App for MyApp {
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
egui::CentralPanel::default().show(ctx, |ui| {
ui.label("Drag-and-drop files onto the window!");
if ui.button("Quitter").clicked() {
println!("Soon");
}
let tweets = self.tweets.clone();
if let Some(path) = &self.path_file {
if let Some(tweets) = &tweets {
if ui.button("Save").clicked() {
let mut file = File::create("pouet.json").unwrap();
if let Ok(_) = serde_json::to_writer_pretty(&file, tweets) {
self.saved = true;
}
}
if self.saved {
ui.label("Sauvgardé !");
}
let mut builder = TableBuilder::new(ui)
.min_scrolled_height(0.0)
.column(Column::auto())
.column(Column::auto())
.column(Column::auto())
.header(32.0, |mut header| {
header.col(|ui| {
ui.strong("URL");
});
header.col(|ui| {
ui.strong("Texte");
});
header.col(|ui| {
ui.strong("Supprimer");
});
})
.body(|mut body| {
body.rows(64.0, tweets.len(), |mut row| {
let index = row.index();
row.col(|ui| {
let t = tweets.get(index).unwrap();
let mut tmp = String::from("https://twitter.com/");
tmp.push_str(&t.screen_name);
tmp.push_str("/status/");
tmp.push_str(&t.id);
ui.hyperlink_to("Tweet", tmp);
});
row.col(|ui| {
ui.label(tweets.get(index).unwrap().full_text.clone());
});
row.col(|ui| {
if ui.button("Supprimer").clicked() {
self.remove_tweet(index);
}
});
});
});
} else {
ui.label("Loading file");
let file = File::open(path).unwrap();
let reader = BufReader::new(file);
self.tweets = serde_json::from_reader(reader).unwrap();
}
} else {
if ui.button("Open file").clicked() {
if let Some(path) = rfd::FileDialog::new().pick_file() {
self.path_file = Some(path);
}
}
}
});
}
}
impl MyApp {
fn remove_tweet(&mut self, index: usize) {
if let Some(ref mut tweets) = &mut self.tweets {
tweets.remove(index);
}
}
}