#PySimple examples (v 3.8)
#Tony Crewe
#Sep 2018

import PySimpleGUI as sg

sg.SetOptions (font =('Calibri',12,'bold'))

#names for Demo, could be loaded from a file

names = ['Roberta', 'Kylie', 'Jenny', 'Helen',
        'Andrea', 'Meredith','Deborah','Pauline',
        'Belinda', 'Wendy']
name = ''
for l in names:
    name = name + l + '\n'
    
sorted_names = ['Andrea','Belinda','Deborah','Helen',
               'Jenny','Kylie','Meredith','Pauline',
            'Roberta','Wendy']

sortname = ''
for l in sorted_names:
    sortname = sortname + l +'\n'
    
layout =[[sg.Text('Search Demo', font =('Calibri', 18, 'bold'))],
[sg.Text(name, size = (14, 11),relief=sg.RELIEF_SOLID,font = ('Calibri', 12), background_color = 'White',key = '_display1_'),
 sg.Text(sortname, size = (14, 11),relief=sg.RELIEF_SOLID,font = ('Calibri', 12), background_color = 'White',key = '_display2_')],
         [sg.Text('_'*32,font = ('Calibri', 12))],
         [sg.InputText(size = (14,1), key = '_linear_'), sg.InputText(size = (14,1), key = '_binary_')],
          [sg.ReadButton('Linear Search', size = (13,1)), sg.ReadButton('Binary Search', size = (14,1))],
         ]
window = sg.Window('Search Demo').Layout(layout)
   
#Linear Search - no need for Ordered list
def linear_search():
    l = names[:]
    found = False
    for l in l:
        if l == value['_linear_']:            
            found = True
            sg.Popup('Linear search\n' + l + ' found.')
            break
    if not found:
        sg.Popup('Linear search\n' +(value['_linear_'] + ' was not found'))

#Binary Search - only works for ordered lists      
def binary_search():
    l = sorted_names[:]                                 
    lo = 0
    hi = len(l)-1
    found = False           
    while lo <= hi:
        mid = (lo + hi) //2     
        if l[mid] == value['_binary_']:    
            sg.Popup('Binary search\n' + l[mid] + ' found.')
            found = True            
            break                   
        elif l[mid] < value['_binary_']:
            lo = mid + 1            
        else:
            hi = mid - 1            
    if not found:           
        sg.Popup('Binary search\n' +(value['_binary_'] + ' was not found'))

while True:
    button, value = window.Read() 

    if button is not None:  
        if button == 'Show Names':
            display_list(names,'_display1_')
            display_list(sorted_names, '_display2_')
        if button == 'Linear Search':
            linear_search()
        if button == 'Binary Search':
            binary_search()
    else:
        break