Post by Uncle Buddy on Nov 25, 2022 18:00:30 GMT -8
<drive>:\treebard_gps\app\python\repositories.py Last Changed 2022-09-21
# repositories
import tkinter as tk
import sqlite3
from widgets import (
Toplevel, Frame, Button, Label, RadiobuttonBig, LabelHeader, LabelH3,
Entry, configall, Border, Scrollbar, open_message, MessageCopiable,
Separator, make_formats_dict, TabBook, EntryAuto, Scale, LabelStay,
ToolTip, create_tooltip, NEUTRAL_COLOR, LabelDots, LabelButtonText,
Checkbox, Combobox, EntryAutoHilited)
from right_click_menu import RightClickMenu, make_rc_menus
from toykinter_widgets import run_statusbar_tooltips
from scrolling import resize_scrolled_content
from files import get_current_file
from query_strings import (
select_repo_id_by_name, select_locators_by_repo, select_citation_id,
insert_repository_new, select_all_repository_strings, insert_locator,
select_source_id, select_locator_string_by_repo_and_citation,
select_repository_details, insert_links_links_source_and_repository)
import dev_tools as dt
from dev_tools import looky, seeline
class RepositoryDialog(Toplevel):
locators = []
def __init__(self, master, root, treebard, assertion_id, tab, repo_msg1, *args, **kwargs):
Toplevel.__init__(self, master, *args, **kwargs)
self.master = master
self.root = root
self.treebard = treebard
self.assertion_id = assertion_id
self.tab = tab
self.repo_msg1 = repo_msg1
self.new_locator_input = None
self.ok_was_pressed = False
tree = get_current_file()[0]
conn = sqlite3.connect(tree)
conn.execute("PRAGMA foreign_keys = 1")
cur = conn.cursor()
self.get_repo_data(cur)
cur.execute(select_all_repository_strings)
all_repos = [i[0] for i in cur.fetchall()]
self.all_repositories = EntryAuto.create_lists(all_repos)
self.formats = make_formats_dict()
self.default_text1 = "Type New or Existing Repository"
self.make_widgets()
self.make_inputs()
self.focus_set()
configall(self, self.formats)
resize_scrolled_content(self, self.canvas, self.window)
self.master.wait_window(self)
if self.ok_was_pressed:
self.insert_locator_to_db(cur, conn)
cur.close()
conn.close()
def make_widgets(self):
def ok():
self.locator = self.new_locator_input.get().strip()
self.ok_was_pressed = True
self.destroy()
def cancel():
self.destroy()
repo_msg2 = "Repositories where this source was found, and locator(s) at this repository:"
self.columnconfigure(1, weight=1)
self.canvas = Border(self, self.root)
self.canvas.title_1.config(text="Repositories Dialog")
txt = "{} Assertion, ID #{}".format(self.tab.title(), self.assertion_id)
self.canvas.title_2.config(text=txt)
self.window = Frame(self.canvas)
self.canvas.create_window(0, 0, anchor='nw', window=self.window)
scridth = 16
scridth_n = Frame(self.window, height=scridth)
scridth_w = Frame(self.window, width=scridth)
scridth_n.grid(column=0, row=0, sticky='ew')
scridth_w.grid(column=0, row=1, sticky='ns')
self.treebard.scroll_mouse.append_to_list([self.canvas, self.window])
self.treebard.scroll_mouse.configure_mousewheel_scrolling()
self.window.vsb = Scrollbar(
self,
hideable=True,
command=self.canvas.yview,
width=scridth)
self.window.hsb = Scrollbar(
self,
hideable=True,
width=scridth,
orient='horizontal',
command=self.canvas.xview)
self.canvas.config(
xscrollcommand=self.window.hsb.set,
yscrollcommand=self.window.vsb.set)
self.window.vsb.grid(column=2, row=4, sticky='ns')
self.window.hsb.grid(column=1, row=5, sticky='ew')
self.content = Frame(self.window)
self.content.grid(column=1, row=4, sticky="news")
self.content.columnconfigure(0, weight=1)
self.content.rowconfigure(1, weight=1)
lab = LabelHeader(
self.content, text="{}\n\n{}".format(self.repo_msg1, repo_msg2),
justify='left', wraplength=600)
lab.grid(column=0, row=0, ipady=6, ipadx=6)
self.repo_table = Frame(self.content)
self.repo_table.grid(column=0, row=1, sticky="news", pady=12)
self.new_repo_input_frm = Frame(self.content)
self.new_repo_input = EntryAutoHilited(
self.new_repo_input_frm, width=36, autofill=True, values=self.all_repositories)
self.new_repo_input.bind("<FocusOut>", self.get_locators_per_repo, add="+")
self.new_repo_input.bind("<FocusIn>", self.delete_default_text1, add="+")
self.new_repo_input.original = ""
self.new_repo_input.final = ""
self.new_repo_input.insert(0, self.default_text1)
frame_ht = self.formats["input_font"][1] * 4
self.combobox_frame = Frame(self.new_repo_input_frm, height=frame_ht)
self.combobox_frame.grid(column=0, row=2, pady=(0,6))
buttonbox = Frame(self.content)
b1 = Button(buttonbox, text="OK", width=7, command=ok)
b2 = Button(buttonbox, text="CANCEL", width=7, command=cancel)
scridth_n.grid(column=0, row=0, sticky='ew')
scridth_w.grid(column=0, row=1, sticky='ns')
self.window.columnconfigure(2, weight=1)
self.new_repo_input.grid(column=0, row=1, sticky="w", pady=(0,6))
self.new_repo_input_frm.grid(column=0, row=2, sticky="news")
buttonbox.grid(column=0, row=3, sticky='e', pady=6)
b1.grid(column=0, row=0)
b2.grid(column=1, row=0, padx=(2,0))
def make_inputs(self):
for idx, dkt in enumerate(self.repos_locators):
for k,v in dkt.items():
repolab = Label(self.repo_table, text=k[1], anchor="w")
repolab.grid(sticky="ew")
for idx, tup in enumerate(v):
loclab = MessageCopiable(self.repo_table, width=54)
loclab.insert(1.0, tup[1])
loclab.grid(padx=(36,0))
loclab.set_height()
def get_repo_data(self, cur):
CONTACT_CATEGORIES = (
"contact", "position", "company", "email", "address", "phone", "cell", "website",
"blog", "forum", "forum handle", "ancestry handle", "familysearch handle",
"findagrave handle")
all_contacts = []
cur.execute(select_citation_id, (self.assertion_id,))
self.citation_id = cur.fetchone()[0]
cur.execute(select_source_id, (self.citation_id,))
self.source_id = cur.fetchone()[0]
cur.execute(select_locator_string_by_repo_and_citation, (self.citation_id,))
self.repos_locators = [list(tup) for tup in cur.fetchall()]
for idx, lst in enumerate(list(self.repos_locators)):
repo_id, locator_id, locators = lst
cur.execute(select_repository_details, (repo_id,))
repo_stuff = list(cur.fetchone())
key = tuple([repo_id] + repo_stuff)
dkt = {key: []}
val = (locator_id, locators)
dkt[key].append(val)
self.repos_locators[idx] = dkt
def get_locators_per_repo(self, evt):
""" Run on FocusOut of self.new_repo_input autofill. """
if len(evt.widget.get()) == 0:
return
tree = get_current_file()[0]
conn = sqlite3.connect(tree)
conn.execute("PRAGMA foreign_keys = 1")
cur = conn.cursor()
widg = evt.widget
widg.final = new_repo = widg.get()
if self.new_locator_input is None:
self.make_combobox(new_repo, cur, conn)
else:
if self.new_repo_input.original != self.new_repo_input.final:
self.new_locator_input.destroy()
self.make_combobox(new_repo, cur, conn)
cur.close()
conn.close()
def make_combobox(self, new_repo, cur, conn):
self.new_locator_label = Label(
self.combobox_frame, anchor="w", text="Paste, Select or Type Locator:")
self.new_locator_input = Combobox(
self.combobox_frame, root=self.root, values=RepositoryDialog.locators)
self.new_locator_label.grid(column=0, row=0, sticky="ew")
self.new_locator_input.grid(column=0, row=1)
cur.execute(select_repo_id_by_name, (new_repo,))
self.new_repo_id = cur.fetchone()
if self.new_repo_id:
cur.execute(select_locators_by_repo, (self.new_repo_id[0], self.source_id, self.new_repo_id[0]))
RepositoryDialog.locators = [i[0] for i in cur.fetchall()]
else:
cur.execute(insert_repository_new, (new_repo,))
conn.commit()
self.new_repo_id = cur.lastrowid
cur.execute(insert_links_links_source_and_repository, (self.source_id, self.new_repo_id))
conn.commit()
cur.execute(select_locators_by_repo, (self.new_repo_id, self.source_id, self.new_repo_id))
RepositoryDialog.locators = [i[0] for i in cur.fetchall()]
self.new_locator_input.config_values(RepositoryDialog.locators)
self.new_locator_input.config_drop_width(54)
self.new_locator_input.entry.focus_set()
def delete_default_text1(self, evt):
""" Run on FocusIn of self.new_repo_input autofill. """
widg = evt.widget
widg.original = text = widg.get()
if text == self.default_text1:
widg.delete(0, "end")
def insert_locator_to_db(self, cur, conn):
if len(self.locator) != 0:
cur.execute(insert_locator, (self.locator, self.citation_id, self.new_repo_id))
conn.commit()