booklibrs/actions/read/change/
simple.rs

1extern crate fltk;
2extern crate fltk_calendar;
3
4use crate::{
5    books::{book_sys::BookSystem, date::Date, genres::Genres},
6    change::{input1::Input1, Inputable},
7    reading::read_base::ReaderBase,
8    restore::caretaker::Caretaker,
9    Lang,
10};
11
12use fltk::{app, app::App, dialog::alert, input::Input, prelude::*};
13use fltk_calendar::calendar::Calendar;
14
15/// Function that changes
16/// name of already known reader
17
18#[inline]
19pub(crate) fn change_name_simple(
20    ind: usize,
21    reader_base: &mut ReaderBase,
22    book_system: &mut BookSystem,
23    genres: &Genres,
24    caretaker: &mut Caretaker,
25    app: &App,
26    lang: Lang,
27) -> Option<String> {
28    let (s3, r3) = app::channel();
29    let mut get_name = Input1::<Input>::new(
30        match lang {
31            Lang::English => "New Name",
32            Lang::Russian => "Новое Имя",
33        },
34        match lang {
35            Lang::English => "New Name",
36            Lang::Russian => "Новое Имя",
37        },
38    );
39
40    caretaker.add_memento(reader_base, book_system, genres);
41
42    get_name.show();
43    (*get_name.ok).borrow_mut().emit(s3, true);
44
45    while app.wait() {
46        if let Some(mes) = r3.recv() {
47            if mes {
48                get_name.hide();
49
50                if let Ok(new_name) = get_name.set_input(lang) {
51                    return match reader_base
52                        .change_name(ind, unsafe { new_name.get_unchecked(0).clone() })
53                    {
54                        Ok(_) => {
55                            fltk::dialog::message(
56                                500,
57                                500,
58                                match lang {
59                                    Lang::English => "Successfully changed",
60                                    Lang::Russian => "Успешно изменено",
61                                },
62                            );
63
64                            reader_base.save();
65                            book_system.save();
66                            Some(unsafe { new_name.get_unchecked(0).clone() })
67                        }
68
69                        Err(0) => {
70                            alert(
71                                500,
72                                500,
73                                match lang {
74                                    Lang::English => "Reader is not found",
75                                    Lang::Russian => "Читатель не найден",
76                                },
77                            );
78                            caretaker.pop().unwrap();
79                            None
80                        }
81
82                        Err(1) => {
83                            alert(
84                                500,
85                                500,
86                                match lang {
87                                    Lang::English => "Reader with same parameters already exists",
88                                    Lang::Russian => {
89                                        "Читатель с предложенными параметрами уже существует"
90                                    }
91                                },
92                            );
93                            caretaker.pop().unwrap();
94                            None
95                        }
96
97                        Err(_) => {
98                            alert(
99                                500,
100                                500,
101                                match lang {
102                                    Lang::English => "'New name' is empty",
103                                    Lang::Russian => "'Новое имя' пусто",
104                                },
105                            );
106                            caretaker.pop().unwrap();
107                            None
108                        }
109                    };
110                }
111            }
112            break;
113        } else if !get_name.shown() {
114            caretaker.pop().unwrap();
115            return None;
116        }
117    }
118
119    None
120}
121
122/// Function that changes
123/// 2-nd name of already known reader
124
125#[inline]
126pub(crate) fn change_family_simple(
127    ind: usize,
128    reader_base: &mut ReaderBase,
129    book_system: &mut BookSystem,
130    genres: &Genres,
131    caretaker: &mut Caretaker,
132    app: &App,
133    lang: Lang,
134) -> Option<String> {
135    let (s3, r3) = app::channel();
136    let mut get_family = Input1::<Input>::new(
137        match lang {
138            Lang::English => "'New 2-nd Name",
139            Lang::Russian => "Новая Фамилия",
140        },
141        match lang {
142            Lang::English => "'New 2-nd Name",
143            Lang::Russian => "Новая Фамилия",
144        },
145    );
146
147    caretaker.add_memento(reader_base, book_system, genres);
148
149    get_family.show();
150    (*get_family.ok).borrow_mut().emit(s3, true);
151
152    while app.wait() {
153        if let Some(mes) = r3.recv() {
154            if mes {
155                get_family.hide();
156
157                if let Ok(new_family) = get_family.set_input(lang) {
158                    return match reader_base
159                        .change_family(ind, unsafe { new_family.get_unchecked(0).clone() })
160                    {
161                        Ok(_) => {
162                            fltk::dialog::message(
163                                500,
164                                500,
165                                match lang {
166                                    Lang::English => "Successfully changed",
167                                    Lang::Russian => "Успешно изменено",
168                                },
169                            );
170
171                            reader_base.save();
172                            book_system.save();
173
174                            Some(unsafe { new_family.get_unchecked(0).clone() })
175                        }
176
177                        Err(0) => {
178                            alert(
179                                500,
180                                500,
181                                match lang {
182                                    Lang::English => "Reader is not found",
183                                    Lang::Russian => "Читатель не найден",
184                                },
185                            );
186                            caretaker.pop().unwrap();
187                            None
188                        }
189
190                        Err(1) => {
191                            alert(
192                                500,
193                                500,
194                                match lang {
195                                    Lang::English => "Reader with same parameters already exists",
196                                    Lang::Russian => {
197                                        "Читатель с предложенными параметрами уже существует"
198                                    }
199                                },
200                            );
201                            caretaker.pop().unwrap();
202                            None
203                        }
204
205                        Err(_) => {
206                            alert(
207                                500,
208                                500,
209                                match lang {
210                                    Lang::English => "'New 2-nd Name' is empty",
211                                    Lang::Russian => "'Новая Фамилия' пусто",
212                                },
213                            );
214                            caretaker.pop().unwrap();
215                            None
216                        }
217                    };
218                }
219            }
220            break;
221        } else if !get_family.shown() {
222            caretaker.pop().unwrap();
223            return None;
224        }
225    }
226
227    None
228}
229
230/// Change middle name of already known reader
231
232#[inline]
233pub(crate) fn change_father_simple(
234    ind: usize,
235    reader_base: &mut ReaderBase,
236    book_system: &mut BookSystem,
237    genres: &Genres,
238    caretaker: &mut Caretaker,
239    app: &App,
240    lang: Lang,
241) -> Option<String> {
242    let (s3, r3) = app::channel();
243    let mut get_father = Input1::<Input>::new(
244        match lang {
245            Lang::English => "New Middle Name",
246            Lang::Russian => "Новое Отчество",
247        },
248        match lang {
249            Lang::English => "New Middle Name",
250            Lang::Russian => "Новое Отчество",
251        },
252    );
253
254    caretaker.add_memento(reader_base, book_system, genres);
255
256    get_father.show();
257    (*get_father.ok).borrow_mut().emit(s3, true);
258
259    while app.wait() {
260        if let Some(mes) = r3.recv() {
261            if mes {
262                get_father.hide();
263
264                if let Ok(new_father) = get_father.set_input(lang) {
265                    return match reader_base
266                        .change_father(ind, unsafe { new_father.get_unchecked(0).clone() })
267                    {
268                        Ok(_) => {
269                            fltk::dialog::message(
270                                500,
271                                500,
272                                match lang {
273                                    Lang::English => "Successfully changed",
274                                    Lang::Russian => "Успешно изменено",
275                                },
276                            );
277
278                            reader_base.save();
279                            book_system.save();
280                            Some(unsafe { new_father.get_unchecked(0).clone() })
281                        }
282
283                        Err(0) => {
284                            alert(
285                                500,
286                                500,
287                                match lang {
288                                    Lang::English => "Reader is not found",
289                                    Lang::Russian => "Читатель не найден",
290                                },
291                            );
292                            caretaker.pop().unwrap();
293                            None
294                        }
295
296                        Err(1) => {
297                            alert(
298                                500,
299                                500,
300                                match lang {
301                                    Lang::English => "Reader with same parameters already exists",
302                                    Lang::Russian => {
303                                        "Читатель с предложенными параметрами уже существует"
304                                    }
305                                },
306                            );
307                            caretaker.pop().unwrap();
308                            None
309                        }
310
311                        Err(_) => {
312                            alert(
313                                500,
314                                500,
315                                match lang {
316                                    Lang::English => "'New Mid. Name' is empty",
317                                    Lang::Russian => "'Новое Отчество' пусто",
318                                },
319                            );
320                            caretaker.pop().unwrap();
321                            None
322                        }
323                    };
324                }
325            }
326            break;
327        } else if !get_father.shown() {
328            caretaker.pop().unwrap();
329            return None;
330        }
331    }
332
333    None
334}
335
336/// Change middle name of already known reader
337
338#[inline]
339pub(crate) fn change_info_simple(
340    ind: usize,
341    reader_base: &mut ReaderBase,
342    book_system: &mut BookSystem,
343    genres: &Genres,
344    caretaker: &mut Caretaker,
345    app: &App,
346    lang: Lang,
347) -> Option<String> {
348    let (s3, r3) = app::channel();
349    let mut get_info = Input1::<Input>::new(
350        match lang {
351            Lang::English => "New Info (< 50 symb)",
352            Lang::Russian => "Инфо (< 50 симв.)",
353        },
354        match lang {
355            Lang::English => "New Info (< 50 symb)",
356            Lang::Russian => "Инфо (< 50 симв.)",
357        },
358    );
359
360    caretaker.add_memento(reader_base, book_system, genres);
361
362    get_info.show();
363    (*get_info.ok).borrow_mut().emit(s3, true);
364
365    while app.wait() {
366        if let Some(mes) = r3.recv() {
367            if mes {
368                get_info.hide();
369
370                if let Ok(new_info) = get_info.set_input(lang) {
371                    return match reader_base
372                        .change_info(ind, unsafe { new_info.get_unchecked(0).clone() })
373                    {
374                        Ok(_) => {
375                            fltk::dialog::message(
376                                500,
377                                500,
378                                match lang {
379                                    Lang::English => "Successfully changed",
380                                    Lang::Russian => "Успешно изменено",
381                                },
382                            );
383
384                            reader_base.save();
385                            book_system.save();
386                            Some(unsafe { new_info.get_unchecked(0).clone() })
387                        }
388
389                        Err(0) => {
390                            alert(
391                                500,
392                                500,
393                                match lang {
394                                    Lang::English => "Reader is not found",
395                                    Lang::Russian => "Читатель не найден",
396                                },
397                            );
398                            caretaker.pop().unwrap();
399                            None
400                        }
401
402                        Err(_) => {
403                            alert(
404                                500,
405                                500,
406                                match lang {
407                                    Lang::English => "'New Info' is empty",
408                                    Lang::Russian => "'Инфо' пусто",
409                                },
410                            );
411                            caretaker.pop().unwrap();
412                            None
413                        }
414                    };
415                }
416            }
417            break;
418        } else if !get_info.shown() {
419            caretaker.pop().unwrap();
420            return None;
421        }
422    }
423
424    None
425}
426
427/// Function that changes
428/// age of already known reader
429
430#[inline]
431pub(crate) fn change_age_simple(
432    ind: usize,
433    reader_base: &mut ReaderBase,
434    book_system: &mut BookSystem,
435    genres: &Genres,
436    caretaker: &mut Caretaker,
437    app: &App,
438    lang: Lang,
439) -> Option<u16> {
440    caretaker.add_memento(reader_base, book_system, genres);
441
442    let mut win = fltk::window::SingleWindow::new(800, 500, 250, 100, "Choose new birth date");
443
444    let _ = fltk::frame::Frame::new(
445        50,
446        10,
447        150,
448        50,
449        match lang {
450            Lang::English => "Choose new birth date",
451            Lang::Russian => "Выберите новую дату рождения",
452        },
453    );
454
455    let mut but = fltk::button::Button::new(
456        80,
457        60,
458        60,
459        20,
460        match lang {
461            Lang::English => "OK",
462            Lang::Russian => "ОК",
463        },
464    );
465
466    win.end();
467    win.show();
468
469    let (sd, rd) = app::channel();
470    but.emit(sd, true);
471
472    while app.wait() {
473        if let Some(msg) = rd.recv() {
474            if msg {
475                win.hide();
476
477                return match Calendar::default().get_date() {
478                    Some(date) => match reader_base.change_age(ind, Date::from(date)) {
479                        Ok(_) => {
480                            fltk::dialog::message(
481                                500,
482                                500,
483                                match lang {
484                                    Lang::English => "Successfully changed",
485                                    Lang::Russian => "Успешно изменено",
486                                },
487                            );
488
489                            reader_base.save();
490                            book_system.save();
491
492                            unsafe {
493                                Some((**reader_base.readers.get_unchecked(ind)).borrow().age())
494                            }
495                        }
496
497                        Err(0) => {
498                            alert(
499                                500,
500                                500,
501                                match lang {
502                                    Lang::English => "Reader isn't found",
503                                    Lang::Russian => "Читатель не найден",
504                                },
505                            );
506                            caretaker.pop().unwrap();
507                            None
508                        }
509
510                        Err(_) => {
511                            alert(
512                                500,
513                                500,
514                                match lang {
515                                    Lang::English => "Reader with same parameters already exists",
516                                    Lang::Russian => {
517                                        "Читатель с предложенными параметрами уже существует"
518                                    }
519                                },
520                            );
521                            caretaker.pop().unwrap();
522                            None
523                        }
524                    },
525
526                    None => {
527                        alert(
528                            500,
529                            500,
530                            match lang {
531                                Lang::English => "Date wasn't selected",
532                                Lang::Russian => "Дата не была выбрана",
533                            },
534                        );
535                        None
536                    }
537                };
538            }
539            break;
540        } else if !win.shown() {
541            return None;
542        }
543    }
544
545    None
546}