redraw.py
Dec 26, 2023 0:29:54 GMT -8
Post by Uncle Buddy on Dec 26, 2023 0:29:54 GMT -8
<drive>:\treebard\redraw.py Last Changed 2024-07-25
# redraw.py
from tkinter import Label, Frame
import sqlite3
from base import tree_path, Query, tbard_path
from widgets import configall, TabBook, make_formats_dict
from unigeds_queries import (
select_gender, select_nest_ids, select_name_all_current,
select_source_by_id)
import dev_tools as dt
from dev_tools import look, seeline
import inspect
def get_name_from_id(num, cur):
if num is None:
return None
cur.execute(
''' SELECT name_text
FROM name
JOIN main_tbd ON main_tbd.name_id = name.name_id
JOIN person ON person.person_id = name.person_id
WHERE name.person_id = ?
''',
(num,))
name = cur.fetchone()[0]
return name
def get_current_person_gender(cur, persid):
cur.execute(select_gender, (persid,))
gender = cur.fetchone()[0]
if gender == "male":
gender = "M"
elif gender == "female":
gender = "F"
elif gender == "unknown":
gender = "U"
elif gender == "other":
gender = "O"
return gender
class Redraw():
def __init__(self, tree, main=None, formats=None):
""" Passing changed values in the instance constructor, then using them
as instance variables for whichever method is going to be used, is
the only way I've found to keep this module from getting tangled up.
"""
self.tree = tree
self.main = main
self.formats = formats
def redraw_gui(self, evt=None):
""" To redraw with CTRL-F5 the persid can't be passed to the
instance by the button which doesn't know what the current ID will
be when the callback occurs, so in that case it's set to None.
"""
conn, cur = self.connect()
conx = sqlite3.connect(tbard_path)
curx = conx.cursor()
if self.tree.placid is None or self.tree.sorcid is None:
cur.execute(
''' SELECT nested_place_id
FROM current_tbd
WHERE current_tbd_id = 1
''')
self.tree.placid = cur.fetchone()[0]
cur.execute(
''' SELECT source_id
FROM current_tbd
WHERE current_tbd_id = 1
''')
self.tree.sorcid = cur.fetchone()[0]
if self.tree.persid is None:
cur.execute(
''' SELECT person_id
FROM current_tbd
WHERE current_tbd_id = 1
''')
self.tree.persid = cur.fetchone()[0]
self.redraw_place_tab()
self.redraw_source_tab()
self.redraw_names_tab()
self.redraw_person_tab(evt=evt)
curx.execute(
''' SELECT color_scheme_id
FROM family_tree
WHERE family_tree_id = ?
''',
(self.tree.tree_id,))
color_scheme_id = curx.fetchone()[0]
formats = make_formats_dict(
self.tree.tree_id, color_scheme_id=color_scheme_id)
configall(self.tree, formats)
self.close_connect(conx, curx)
self.close_connect(conn, cur)
def redraw_names_tab(self):
conn, cur = self.connect()
name_change_table = self.main.names_tab_content.make_existing_names_table()
cur.execute(select_name_all_current, (self.tree.persid,))
self.main.names_tab_content.all_names = cur.fetchall()
new_values = [f"{i[1]}: ({i[2]})" for i in self.main.names_tab_content.all_names]
self.main.names_tab_content.main_name_chooser.config_values(
new_values=new_values)
self.close_connect(conn, cur)
return name_change_table
def redraw_place_tab(self):
self.main.places_tab_content.show_current_place()
self.tree.place_data = self.tree.get_place_values(new_place=True)
self.tree.single_place_autofill_values = self.tree.create_single_place_lists()
configall(
self.main.places_tab_content.current_place_details,
formats=self.formats)
def redraw_source_tab(self):
conn, cur = self.connect()
self.main.sources_tab_content.show_current_source(cur)
self.tree.create_source_lists(cur=cur)
self.close_connect(conn, cur)
def redraw_person_tab(self, evt=None):
# # ## Don't delete this commented block*************
# current_frame = inspect.currentframe()
# # # This test detects where this function is being called from.
# call_frame = inspect.getouterframes(current_frame, 2)
# print('redraw_person_tab() ran, `caller name:`', call_frame[1][3])
# ##***********************************************
conn, cur = self.connect()
width, height = self.tree.geometry().split("+", 1)[0].split("x")
screen = Frame(
self.tree, bg=self.tree.formats["bg"], width=width,
height=height)
screen.grid()
self.tree.person_autofill_values = self.tree.update_person_autofill_values()
cur.execute(
''' UPDATE current_tbd
SET person_id = ?
WHERE current_tbd_id = 1
''',
(self.tree.persid,))
conn.commit()
self.redraw_current_person_area()
self.redraw_families_table()
self.redraw_events_table()
self.main.update_idletasks()
new_height = self.main.winfo_reqheight()
new_width = self.main.winfo_reqwidth()
key_ht = TabBook.related_tabbooks[self.tree]["tallest"][1]
height = TabBook.related_tabbooks[self.tree]["tallest"][2]
key_wd= TabBook.related_tabbooks[self.tree]["widest"][1]
width = TabBook.related_tabbooks[self.tree]["widest"][2]
if key_wd == "person" and width > new_width:
TabBook.related_tabbooks[self.tree]["widest"][2] = new_width
if key_ht == "person" and height > new_height:
TabBook.related_tabbooks[self.tree]["tallest"][2] = new_height
TabBook.resize_scrolled_dialog_with_tabbook(
self.tree, self.tree.canvas, self.tree.window)
screen.destroy()
self.close_connect(conn, cur)
def redraw_current_person_area(self):
conn, cur = self.connect()
self.main.current_person_input.delete(0, 'end')
self.main.show_top_pic(cur)
self.main.current_person_input.current_id = None
self.main.current_person_name = current_name = get_name_from_id(
self.tree.persid, cur)
self.main.current_person_label.config(
text=f"Current Person (ID): {current_name} ({self.tree.persid})")
self.main.current_gender = get_current_person_gender(
cur, self.tree.persid)
self.close_connect(conn, cur)
def redraw_families_table(self):
""" If you destroy some widgets in the families table, you have to destroy
them all, in order to avoid a problem restarting tab traversal from
where it left off.
"""
conn, cur = self.connect()
self.main.nukefam_table.persid = self.tree.persid
self.main.nukefam_table.original_text = ""
self.main.nukefam_table.final_text = ""
for child in self.main.nukefam_table.parents_table.winfo_children():
child.destroy()
for child in self.main.nukefam_table.progeny_table.winfo_children():
child.destroy()
for child in self.main.nukefam_table.add_area.winfo_children():
child.destroy()
self.main.nukefam_table.make_nukefam_inputs()
self.main.nukefam_table.pardrads.set(99)
configall(self.main.nukefam_table, self.tree.formats)
self.tree.resize_families_table_scrollbar()
self.close_connect(conn, cur)
def redraw_events_table(self):
conn, cur = self.connect()
width, height = self.tree.geometry().split("+", 1)[0].split("x")
screen = Frame(
self.tree, bg=self.main.events_table.formats["bg"],
width=width, height=height)
screen.grid()
for child in self.main.events_table.winfo_children():
child.destroy()
self.main.events_table.new_row = 0
self.main.events_table.persid = self.tree.persid
self.main.events_table.populate_events_table(cur)
self.main.events_table.new_event_input.delete(0, "end")
configall(self.main.events_table, self.main.formats)
screen.destroy()
self.close_connect(conn, cur)
def connect(self):
conn = sqlite3.connect(self.tree.file)
conn.execute('PRAGMA foreign_keys = 1')
cur = conn.cursor()
return conn, cur
def close_connect(self, conn, cur):
cur.close()
conn.close()