musicus/src/editor/translation_editor.rs

112 lines
3.2 KiB
Rust
Raw Normal View History

2024-04-01 16:57:34 +02:00
use std::cell::RefCell;
use std::collections::HashMap;
use adw::{prelude::*, subclass::prelude::*};
use gtk::glib;
use crate::db::TranslatedString;
use crate::editor::translation_entry::MusicusTranslationEntry;
use crate::util;
mod imp {
use super::*;
#[derive(Debug, Default, gtk::CompositeTemplate)]
2024-05-31 13:57:14 +02:00
#[template(file = "data/ui/translation_editor.blp")]
pub struct MusicusTranslationEditor {
#[template_child]
pub list_box: TemplateChild<gtk::ListBox>,
2024-04-01 16:57:34 +02:00
#[template_child]
pub entry_row: TemplateChild<adw::EntryRow>,
pub translation_entries: RefCell<Vec<MusicusTranslationEntry>>,
}
#[glib::object_subclass]
2024-05-31 13:57:14 +02:00
impl ObjectSubclass for MusicusTranslationEditor {
const NAME: &'static str = "MusicusTranslationEditor";
type Type = super::MusicusTranslationEditor;
type ParentType = adw::Bin;
2024-04-01 16:57:34 +02:00
fn class_init(klass: &mut Self::Class) {
klass.bind_template();
klass.bind_template_instance_callbacks();
}
fn instance_init(obj: &glib::subclass::InitializingObject<Self>) {
obj.init_template();
}
}
2024-05-31 13:57:14 +02:00
impl ObjectImpl for MusicusTranslationEditor {
2024-04-01 16:57:34 +02:00
fn constructed(&self) {
self.parent_constructed();
}
}
2024-05-31 13:57:14 +02:00
impl WidgetImpl for MusicusTranslationEditor {}
impl BinImpl for MusicusTranslationEditor {}
2024-04-01 16:57:34 +02:00
}
glib::wrapper! {
2024-05-31 13:57:14 +02:00
pub struct MusicusTranslationEditor(ObjectSubclass<imp::MusicusTranslationEditor>)
2024-04-01 16:57:34 +02:00
@extends gtk::Widget, adw::PreferencesGroup;
}
#[gtk::template_callbacks]
2024-05-31 13:57:14 +02:00
impl MusicusTranslationEditor {
pub fn new() -> Self {
glib::Object::new()
}
pub fn set_translation(&self, translation: &TranslatedString) {
let mut translation = translation.0.clone();
2024-04-01 16:57:34 +02:00
self.imp()
2024-04-01 16:57:34 +02:00
.entry_row
.set_text(&translation.remove("generic").unwrap_or_default());
for (lang, translation) in translation {
self.add_entry(&lang, &translation);
2024-04-01 16:57:34 +02:00
}
}
#[template_callback]
2024-05-31 13:57:14 +02:00
fn add_translation(&self, _: &adw::ActionRow) {
2024-04-01 16:57:34 +02:00
self.add_entry(&util::LANG, &self.imp().entry_row.text());
}
2024-06-06 15:17:56 +02:00
pub fn translation(&self) -> TranslatedString {
2024-04-01 16:57:34 +02:00
let imp = self.imp();
let mut translation = HashMap::<String, String>::new();
translation.insert(String::from("generic"), imp.entry_row.text().into());
for entry in &*imp.translation_entries.borrow() {
translation.insert(entry.lang(), entry.translation());
}
TranslatedString(translation)
}
fn add_entry(&self, lang: &str, translation: &str) {
let entry = MusicusTranslationEntry::new(lang, translation);
let obj = self.clone();
entry.connect_remove(move |entry| {
obj.imp()
.translation_entries
.borrow_mut()
.retain(|e| e != entry);
2024-05-31 13:57:14 +02:00
obj.imp().list_box.remove(entry);
2024-04-01 16:57:34 +02:00
});
self.imp().list_box.insert(
&entry,
self.imp().translation_entries.borrow().len() as i32 + 1,
);
2024-05-31 13:57:14 +02:00
entry.grab_focus();
2024-04-01 16:57:34 +02:00
self.imp().translation_entries.borrow_mut().push(entry);
}
}