U
    L`cF                     @   s  d Z ddlZddlmZmZ ddlZddlZddlZddlm	Z	 ddl
mZ dZdZeefZG dd	 d	ejZG d
d dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd deZG dd dejZe  Zedkrde_de_de_dS )zlGUI for the Seven Little Words PA, containing all necessary classes.

Author: Isaac Wang
Version: Fall 2022
    N)ttksimpledialog)GameInfo)WordClueZ	Helvetica   c                       sZ   e Zd ZdZdZddgZed ZeZed Z	d fdd		Z
d
d Zdd Zdd Z  ZS )
CluesFramez>Frame that displays clues with the number of letters/solution.blackz#CBB677z#F4EFE1Zbold)Z
overstrike   c                    s<  t  | || _| jddd | jddd tj| d| jtjdjddtj	d tj| d| jtj
djddtj	d g | _g | _t| jD ]}tj| |d  d	| jtj| j| j|t| j  d
}|jd|d tj	d | j| tj| d| jtj
| j| j|t| j  d
}|jd|d tj	d | j| qd S )Nr      weight   ZClues)textfontanchorcolumnrowstickyZ	Solutions.)r   r   r   fgbgZletters)super__init__Z
CLUE_COUNTcolumnconfiguretkLabel	HEAD_FONTWgridEWE_CluesFrame__clue_labels_CluesFrame__solution_labelsrange
LABEL_FONT
FONT_COLOR
ROW_COLORSlenappend)selfparentZ
clue_counticlueZsol	__class__ game_board.pyr      s    $$6,zCluesFrame.__init__c                 C   s0   |t | jk r,| j| j|r"| jn| jd d S )Nr   )r)   r#   configSTRIKE_FONTr&   )r+   indexZstriker1   r1   r2   set_clue_strikethrough9   s    z!CluesFrame.set_clue_strikethroughc                 C   s2   |t | jk r.| j| j|d  d| d d S )Nr   . r   )r)   r#   r4   r+   r6   r   r1   r1   r2   set_clue_text=   s    zCluesFrame.set_clue_textc                 C   s&   |t | jk r"| j| j| d d S Nr9   )r)   r$   r4   r:   r1   r1   r2   set_solution_textA   s    zCluesFrame.set_solution_text)r
   )__name__
__module____qualname____doc__r'   r(   DEFAULT_FONTr   r&   r5   r   r7   r;   r=   __classcell__r1   r1   r/   r2   r      s   r   c                       sd   e Zd ZdZdZdZdZdZed Z	eZ
 fddZdd	 Zd
d Zdd Zdd Zdd Z  ZS )
GuessFramezOFrame for displaying the current guess, with buttons to reset and submit guess.#450084white#B599CEr	   c                    s   t  | | jddd tj| d| j| j| j| jd| _	| j	j
ddtjd tj| | j| jddd| _| jj
ddtjd tj| d	| j| j| j| jd| _| jj
d
dtjd d S )Nr   r   ZResetr   r   r   r   Zactivebackgroundr   r   solid)r   r   borderwidthreliefZGuessr   )r   r   r   r   ButtonBUTTON_FONTBUTTON_FG_COLORBUTTON_COLORBUTTON_PRESSED_COLOR_GuessFrame__reset_buttonr    r   r   ANSWER_FONTANSWER_COLOR_GuessFrame__answer_fieldNSEW_GuessFrame__guess_buttonr"   r+   r,   r/   r1   r2   r   R   s      zGuessFrame.__init__c                 C   s   | j dS )Nr   )rT   cgetr+   r1   r1   r2   get_answer_text`   s    zGuessFrame.get_answer_textc                 C   s   | j j|d d S r<   )rT   	configurer+   r   r1   r1   r2   set_answer_textc   s    zGuessFrame.set_answer_textc                 C   s   | j j|d d S NZcommand)rQ   r[   r+   Zfcnr1   r1   r2   set_reset_button_callbackf   s    z$GuessFrame.set_reset_button_callbackc                 C   s   | j j|d d S r^   )rV   r[   r`   r1   r1   r2   set_guess_button_callbacki   s    z$GuessFrame.set_guess_button_callbackc                 C   s    | j jdd | jjdd d S Ndisabled)state)rQ   r[   rV   rY   r1   r1   r2   disable_buttonsl   s    zGuessFrame.disable_buttons)r>   r?   r@   rA   rO   rN   rP   rS   rB   rM   rR   r   rZ   r]   ra   rb   rf   rC   r1   r1   r/   r2   rD   F   s   rD   c                       s   e Zd ZdZed ZdZdZdZdd Z	dd	 Z
d3 fdd	Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd4d1d2Z  ZS )5
TilesFramez1Frame displaying all the word segments in a grid.r	   r   rF   z#DACCE6c                 C   s   || j  || j  fS N	GRID_COLSr+   r6   r1   r1   r2   Z__calc_tile_coordsz   s    zTilesFrame.__calc_tile_coordsc                 C   s   || j  | S rh   ri   )r+   r   r   r1   r1   r2   Z__calc_button_index}   s    zTilesFrame.__calc_button_index      c                    s  t  | | _| _tt j j  _d  _ j	t
t jddd  jt
t jddd g  _i  _t jD ]} |\}}tj | d|  j j jdddd}|j|f fd	d
	d |j||tjddd  j| d  j|< qd S )Nr   r   )r   Zuniformr   ,rI   rm   )r   r   r   r   rJ   rK   padyc                    s
     | S rh   )_TilesFrame__on_tile_clicked)brY   r1   r2   <lambda>       z%TilesFrame.__init__.<locals>.<lambda>r_   )r   r   r   padxro   )r   r   
TILE_COUNTrj   intmathZceilZ	GRID_ROWS"_TilesFrame__tile_clicked_callbackZgrid_rowconfiguretupler%   Zgrid_columnconfigure_TilesFrame__tile_buttons_TilesFrame__tile_data_TilesFrame__calc_tile_coordsr   rL   	TILE_FONTTILE_BG_COLORTILE_FG_COLORr[   r    rU   r*   )r+   r,   Z
tile_countcols_per_rowr-   rcbuttonr/   rY   r2   r      s     *zTilesFrame.__init__c                 C   s   d|  kot | jk S   S )Nr   )r)   rz   rk   r1   r1   r2   Z__valid_index   s    zTilesFrame.__valid_indexc                 C   s.   | j r*|  || j| | j|| | d S rh   )rx   r{   rz   r6    _TilesFrame__get_button_selectedr+   r   r1   r1   r2   __on_tile_clicked   s    zTilesFrame.__on_tile_clickedc                 C   s
   || _ d S rh   )rx   )r+   functionr1   r1   r2   set_tile_callback   s    zTilesFrame.set_tile_callbackc                 C   s   |j |d d S r<   )r[   )r+   r   r   r1   r1   r2   Z__set_button_text   s    zTilesFrame.__set_button_textc                 C   s   || j |< d S rh   r{   )r+   r   datar1   r1   r2   Z__set_button_data   s    zTilesFrame.__set_button_datac                 C   s
   | j | S rh   r   r   r1   r1   r2   Z__get_button_data   s    zTilesFrame.__get_button_datac                 C   s   | ddkS )Nre   rd   )rX   r   r1   r1   r2   Z__get_button_selected   s    z TilesFrame.__get_button_selectedc                 C   s.   |r|j d| jdd n|j d| jdd d S )NrI   rd   )rK   r   re   Znormal)r4   TILE_SELECTED_COLORr~   )r+   r   selectedr1   r1   r2   Z__set_button_selected   s    z TilesFrame.__set_button_selectedc                 C   s   t | S rh   )boolZwinfo_ismappedr   r1   r1   r2   Z__get_button_visible   s    zTilesFrame.__get_button_visiblec                 C   s   |r|   n|  d S rh   )r    grid_remove)r+   r   visibler1   r1   r2   Z__set_button_visible   s    
zTilesFrame.__set_button_visiblec                 C   s    |  |r| | j| | d S rh   )_TilesFrame__valid_index_TilesFrame__set_button_textrz   r:   r1   r1   r2   set_tile_text   s    
zTilesFrame.set_tile_textc                 C   s    |  |r| | j| | d S rh   )r   _TilesFrame__set_button_datarz   )r+   r6   r   r1   r1   r2   set_tile_data   s    
zTilesFrame.set_tile_datac                 C   s   |  |r| | j| S d S rh   )r   _TilesFrame__get_button_datarz   rk   r1   r1   r2   get_tile_data   s    
zTilesFrame.get_tile_datac                 C   s   |  |r| | j| S dS NF)r   r   rz   rk   r1   r1   r2   get_tile_selected   s    
zTilesFrame.get_tile_selectedc                 C   s    |  |r| | j| | d S rh   )r    _TilesFrame__set_button_selectedrz   )r+   r6   r   r1   r1   r2   set_tile_selected   s    
zTilesFrame.set_tile_selectedc                 C   s   |  |r| | j| S dS r   )r   _TilesFrame__get_button_visiblerz   rk   r1   r1   r2   get_tile_visible   s    
zTilesFrame.get_tile_visiblec                 C   s    |  |r| | j| | d S rh   )r   _TilesFrame__set_button_visiblerz   )r+   r6   r   r1   r1   r2   set_tile_visible   s    
zTilesFrame.set_tile_visibleTc                 C   sZ   t | j t| jD ]>\}}| |\}}| |}|j||d |r|s|  qd S )N)r   r   )randomZshufflerz   	enumerater|   r   r    r   )r+   Z
keep_stater-   rq   r   r   r   r1   r1   r2   shuffle_tiles   s    
zTilesFrame.shuffle_tiles)rl   rm   )T)r>   r?   r@   rA   rB   r}   r   r~   r   r|   Z_TilesFrame__calc_button_indexr   r   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rC   r1   r1   r/   r2   rg   q   s4   rg   c                       sT   e Zd ZdZdZdZdZed Z fddZ	dd	 Z
d
d Zdd Zdd Z  ZS )
HintsFramez,Frame for displaying hints and hint buttons.rE   rF   rG   r	   c                    s   t  | | jddd tj| td| _| jjddtjdd tj	| d| j
| j| j| jd| _| jjddtjdd tj	| d	| j
| j| j| jd| _| jjd
dtjd d S )Nr   r   r   r3   rm   )r   r   r   rt   HintsrH   ZShuffler   r   )r   r   r   r   r   rB   _HintsFrame__hint_labelr    rU   rL   rM   rN   rO   PRESSED_COLOR_HintsFrame__hint_buttonr"   _HintsFrame__shuffle_buttonrW   r/   r1   r2   r      s      zHintsFrame.__init__c                 C   s   | j j|d d S r<   )r   r[   r\   r1   r1   r2   set_hint_text  s    zHintsFrame.set_hint_textc                 C   s   | j j|d d S r^   )r   r[   r`   r1   r1   r2   set_hint_button_callback  s    z#HintsFrame.set_hint_button_callbackc                 C   s   | j j|d d S r^   )r   r[   r`   r1   r1   r2   set_shuffle_button_callback  s    z&HintsFrame.set_shuffle_button_callbackc                 C   s    | j jdd | jjdd d S rc   )r   r[   r   rY   r1   r1   r2   rf   
  s    zHintsFrame.disable_buttons)r>   r?   r@   rA   rO   rN   r   rB   rM   r   r   r   r   rf   rC   r1   r1   r/   r2   r      s   r   c                       sr   e Zd ZdZd fdd	Zedd Zedd Zed	d
 Zedd Z	dd Z
dd Zdd Zdd Z  ZS )SevenWordsViewz*Main view for the Seven Little Words game.rm   c                    s   t  | t| || _| jjtjddd t| | _| jjtjddd t	| ||| _
| j
jtjdddd t| | _| jjtjddd d S )Nrm   )fillro   rt   Tr   )r   expandro   rt   )r   r   r   _SevenWordsView__clues_framepackr   XrD   _SevenWordsView__answer_framerg   _SevenWordsView__tiles_frameBOTHr   _SevenWordsView__hints_frame)r+   r,   num_of_cluesnum_of_slicesr   r/   r1   r2   r     s    

zSevenWordsView.__init__c                 C   s   | j S rh   )r   rY   r1   r1   r2   clues!  s    zSevenWordsView.cluesc                 C   s   | j S rh   )r   rY   r1   r1   r2   answer%  s    zSevenWordsView.answerc                 C   s   | j S rh   )r   rY   r1   r1   r2   tiles)  s    zSevenWordsView.tilesc                 C   s   | j S rh   )r   rY   r1   r1   r2   hints-  s    zSevenWordsView.hintsc                 C   s@   | j |d | j || | jd | jd |   d S )NT )r   r7   r=   r   r]   r   r   hide_selected_tiles)r+   r6   Zsolutionr1   r1   r2   
solve_clue1  s
    zSevenWordsView.solve_cluec                 C   s0   t | jjD ]}| j|r| j|d qd S r   )r%   r   ru   r   r   )r+   r-   r1   r1   r2   r   9  s    z"SevenWordsView.hide_selected_tilesc                 C   s$   | j d | jd |   d S )NzCongratulations! You win!r   )r   r]   r   r   disable_all_buttonsrY   r1   r1   r2   display_win_message>  s    z"SevenWordsView.display_win_messagec                 C   s   | j   | j  d S rh   )r   rf   r   rY   r1   r1   r2   r   C  s    
z"SevenWordsView.disable_all_buttons)rm   )r>   r?   r@   rA   r   propertyr   r   r   r   r   r   r   r   rC   r1   r1   r/   r2   r     s   



r   c                       s>   e Zd Zdddg f fdd	Zdd Zdd Zd	d
 Z  ZS )PickerDialogNr   c                    s$   d| _ || _|| _t || d S )N)_PickerDialog__selected_index_PickerDialog__message_PickerDialog__optionsr   r   )r+   r,   titlemessageoptionsr/   r1   r2   r   I  s    zPickerDialog.__init__c              	   C   s   t j|| jdjdt jddd t }|jdddd tj|d	dt	t
| jt	d
d d| _| j| jd< | jd | jjdt jddd d S )Nr9   r   rm   )r   r   rt   ro   zCustom.TComboboxrF   r   )Z
backgroundZ
foregroundreadonly)keyr   )re   stylewidthvaluesr      )r   r   r   r    r!   r   ZStyler[   ZComboboxr)   maxr   _PickerDialog__pickercurrent)r+   framer   r1   r1   r2   bodyP  s     &zPickerDialog.bodyc                 C   s   | j  | _d S rh   )r   r   r   rY   r1   r1   r2   applyZ  s    zPickerDialog.applyc                 C   s   | j S rh   )r   rY   r1   r1   r2   
get_result]  s    zPickerDialog.get_result)r>   r?   r@   r   r   r   r   rC   r1   r1   r/   r2   r   H  s   
r   c                   @   s`   e Zd ZdZeedddZdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd ZdS )SevenWordsControllerz:Controller connecting the GameInfo and the SevenWordsView.)	game_infoviewc                 C   s<   || _ || _g | _|   |   |   | jjd d S r   ) _SevenWordsController__game_info_SevenWordsController__view"_SevenWordsController__clue_solved!_SevenWordsController__init_clues!_SevenWordsController__init_tiles%_SevenWordsController__init_callbacksr   r   )r+   r   r   r1   r1   r2   r   d  s    zSevenWordsController.__init__c                 C   sZ   t | j D ]F\}}| jj||  | jj|t|	  d | j
d qd S )Nz lettersF)r   r   get_word_cluesr   r   r;   get_cluer=   r)   get_wordr   r*   )r+   r-   r.   r1   r1   r2   Z__init_clueso  s    z!SevenWordsController.__init_cluesc                 C   s@   t | j D ],\}}| jj|t| | jj|| qd S rh   )r   r   
get_slicesr   r   r   strr   r+   r-   slicer1   r1   r2   Z__init_tilesu  s    z!SevenWordsController.__init_tilesc                 C   sT   | j j| j | j j| j | j j| j | j j	
| j | j j	| j d S rh   )r   r   r   &_SevenWordsController__on_tile_clickedr   ra   '_SevenWordsController__on_reset_clickedrb   '_SevenWordsController__on_guess_clickedr   r   &_SevenWordsController__on_hint_clickedr   )_SevenWordsController__on_shuffle_clickedrY   r1   r1   r2   Z__init_callbacksz  s
    z%SevenWordsController.__init_callbacksc                 C   sR   |rN| j j| j j t|  |  | j j|t| | j j|d d S )NT)	r   r   r]   rZ   r   Zuser   r   r   )r+   r   r   r6   r   r1   r1   r2   r     s
    z&SevenWordsController.__on_tile_clickedc                 C   st   | j jd td| j jjD ]P}| j j|r| j j|}|r|  | j j	|t
| | j j|d qd S )Nr   r   F)r   r   r]   r%   r   ru   r   r   resetr   r   r   r   r1   r1   r2   Z__on_reset_clicked  s    z'SevenWordsController.__on_reset_clickedc                 C   sx   t | jj d}t| j D ]J\}}||kr | j|| 	  d| j
|< t| j
rd| j   d S q |   d S )Nr   T)r   r   r   rZ   r   r   r   r   r   upperr   allr   r   )r+   Zguessr-   r.   r1   r1   r2   Z__on_guess_clicked  s    


z'SevenWordsController.__on_guess_clickedc                    s    fddt  j D }t jdddd |D  }|dkr|| \}}t jd|d  d|  d	d
ddg }|dkr|d  d}|dkr|d|  7 }n4|dkr|d| j	 7 }n|dkr|d|
  7 } jj| d S )Nc                    s"   g | ]\}} j | s||fqS r1   )r   .0r-   xrY   r1   r2   
<listcomp>  s     
 z:SevenWordsController.__on_hint_clicked.<locals>.<listcomp>r   zShow a hint for:c                 S   s&   g | ]\}}|d   d|   qS )r   r8   )r   r   r1   r1   r2   r     s     r   r   r8   :zFirst Letterz
First TilezEntire SolutionzFirst Letter: zFirst Tile: r   z
Solution: )r   r   r   r   r   r   r   Zget_first_letter_hintZget_first_slice_hintr   Zget_whole_word_hintr   r   )r+   Z
clues_leftZ
clue_indexZnumr.   Z
hint_indexZ	hint_textr1   rY   r2   Z__on_hint_clicked  s    .z&SevenWordsController.__on_hint_clickedc                 C   s   | j j  d S rh   )r   r   r   rY   r1   r1   r2   Z__on_shuffle_clicked  s    z)SevenWordsController.__on_shuffle_clickedN)r>   r?   r@   rA   r   r   r   r   r   r   r   r   r   r   r   r1   r1   r1   r2   r   a  s   r   c                       s0   e Zd Zed fddZedddZ  ZS )	GameBoard)infoc                    sv   t    t| }t| }t| ||| _t|| j| _| jj	t
jdd | d |   | d|   d S )NT)r   r   z00000111 Little Wordsi^  )r   r   r)   r   r   r   Z_GameBoard__viewr   Z_GameBoard__controllerr   r   r   r   updateZminsizeZwinfo_height)r+   r   r   r   r/   r1   r2   r     s    

zGameBoard.__init__)r   c                 C   s   |r|    n|   d S rh   )ZmainloopZdestroy)r+   r   r1   r1   r2   set_visible  s    
zGameBoard.set_visible)r>   r?   r@   r   r   r   r   rC   r1   r1   r/   r2   r     s   r   darwinr   rG   ) rA   Ztkinterr   r   r   rw   r   platformr   r   Z	word_cluer   ZFONT_FAMILYZ	FONT_SIZErB   ZFramer   rD   rg   r   r   ZDialogr   objectr   ZTkr   systemlowerZplatrN   rS   r1   r1   r1   r2   <module>   s.   1+y%9W
