2008-08-19 00:53:25 +02:00
#!/usr/bin/env python
2009-08-09 22:26:24 +02:00
# -*- coding: utf-8 -*-
2008-08-19 00:53:25 +02:00
""" Hud.py
Create and manage the hud overlays .
"""
2009-03-05 02:04:23 +01:00
# Copyright 2008, 2009 Ray E. Barker
2008-08-19 00:53:25 +02:00
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
########################################################################
# Standard Library modules
2008-09-15 22:31:55 +02:00
import os
2008-10-24 21:44:53 +02:00
import sys
2008-08-19 00:53:25 +02:00
# pyGTK modules
import pygtk
import gtk
import pango
import gobject
2008-09-15 22:31:55 +02:00
# win32 modules -- only imported on windows systems
if os . name == ' nt ' :
import win32gui
import win32con
2008-10-26 10:34:36 +01:00
import win32api
2008-09-15 22:31:55 +02:00
2008-08-19 00:53:25 +02:00
# FreePokerTools modules
import Tables # needed for testing only
import Configuration
import Stats
import Mucked
import Database
2009-06-15 05:14:53 +02:00
#import HUD_main
2008-08-19 00:53:25 +02:00
2009-03-05 02:04:23 +01:00
def importName ( module_name , name ) :
""" Import a named object ' name ' from module ' module_name ' . """
# Recipe 16.3 in the Python Cookbook, 2nd ed. Thanks!!!!
2009-03-14 03:06:47 +01:00
2009-03-05 02:04:23 +01:00
try :
module = __import__ ( module_name , globals ( ) , locals ( ) , [ name ] )
except :
return None
return ( getattr ( module , name ) )
2008-08-19 00:53:25 +02:00
class Hud :
2009-02-22 00:19:49 +01:00
def __init__ ( self , parent , table , max , poker_game , config , db_connection ) :
2009-02-27 18:42:49 +01:00
# __init__ is (now) intended to be called from the stdin thread, so it
# cannot touch the gui
2009-08-06 05:57:26 +02:00
if parent == None : # running from cli ..
self . parent = self
2009-02-22 00:19:49 +01:00
self . parent = parent
2008-08-19 00:53:25 +02:00
self . table = table
self . config = config
self . poker_game = poker_game
self . max = max
2008-12-17 19:24:37 +01:00
self . db_connection = db_connection
2008-09-15 22:31:55 +02:00
self . deleted = False
2008-10-22 03:46:30 +02:00
self . stacked = True
2008-12-08 20:10:45 +01:00
self . site = table . site
2009-02-27 18:42:49 +01:00
self . mw_created = False
2008-08-19 00:53:25 +02:00
2009-02-27 18:42:49 +01:00
self . stat_windows = { }
2008-09-15 22:31:55 +02:00
self . popup_windows = { }
2009-02-27 18:42:49 +01:00
self . aux_windows = [ ]
2009-01-06 11:18:45 +01:00
2008-12-18 03:57:05 +01:00
( font , font_size ) = config . get_default_font ( self . table . site )
2009-02-27 18:42:49 +01:00
self . colors = config . get_default_colors ( self . table . site )
2009-09-03 16:35:59 +02:00
self . backgroundcolor = gtk . gdk . color_parse ( self . colors [ ' hudbgcolor ' ] )
self . foregroundcolor = gtk . gdk . color_parse ( self . colors [ ' hudfgcolor ' ] )
2009-02-27 18:42:49 +01:00
2009-01-06 11:18:45 +01:00
if font == None :
font = " Sans "
if font_size == None :
font_size = " 8 "
2009-03-24 10:19:20 +01:00
self . font = pango . FontDescription ( " %s %s " % ( font , font_size ) )
2008-12-21 12:49:34 +01:00
# do we need to add some sort of condition here for dealing with a request for a font that doesn't exist?
2008-10-29 15:35:47 +01:00
2009-03-05 02:04:23 +01:00
game_params = config . get_game_parameters ( self . poker_game )
2009-03-06 00:43:00 +01:00
if not game_params [ ' aux ' ] == [ " " ] :
2009-03-05 02:04:23 +01:00
for aux in game_params [ ' aux ' ] :
aux_params = config . get_aux_parameters ( aux )
my_import = importName ( aux_params [ ' module ' ] , aux_params [ ' class ' ] )
if my_import == None :
continue
self . aux_windows . append ( my_import ( self , config , aux_params ) )
2009-08-09 22:26:24 +02:00
self . creation_attrs = None
2009-03-05 02:04:23 +01:00
2009-02-27 18:42:49 +01:00
def create_mw ( self ) :
2008-10-29 15:35:47 +01:00
# Set up a main window for this this instance of the HUD
2009-09-03 16:35:59 +02:00
win = gtk . Window ( )
win . set_gravity ( gtk . gdk . GRAVITY_STATIC )
win . set_title ( " %s FPDBHUD " % ( self . table . name ) )
2009-09-04 21:14:38 +02:00
win . set_skip_taskbar_hint ( True )
2009-09-03 16:35:59 +02:00
win . set_decorated ( False )
win . set_opacity ( self . colors [ " hudopacity " ] )
2008-10-27 11:29:39 +01:00
2009-09-03 16:35:59 +02:00
eventbox = gtk . EventBox ( )
label = gtk . Label ( " FPDB Menu - Right click \n Left-Drag to Move " )
2008-12-21 12:49:34 +01:00
2009-09-03 16:35:59 +02:00
win . add ( eventbox )
eventbox . add ( label )
label . modify_bg ( gtk . STATE_NORMAL , self . backgroundcolor )
label . modify_fg ( gtk . STATE_NORMAL , self . foregroundcolor )
2008-10-27 11:29:39 +01:00
2009-09-03 16:35:59 +02:00
eventbox . modify_bg ( gtk . STATE_NORMAL , self . backgroundcolor )
eventbox . modify_fg ( gtk . STATE_NORMAL , self . foregroundcolor )
2008-10-27 11:29:39 +01:00
2009-09-03 16:35:59 +02:00
self . main_window = win
2008-09-15 22:31:55 +02:00
self . main_window . move ( self . table . x , self . table . y )
2009-01-06 02:26:39 +01:00
# A popup menu for the main window
2009-09-03 16:35:59 +02:00
menu = gtk . Menu ( )
2008-12-03 09:25:49 +01:00
2009-09-03 16:35:59 +02:00
killitem = gtk . MenuItem ( ' Kill This HUD ' )
menu . append ( killitem )
if self . parent != None :
killitem . connect ( " activate " , self . parent . kill_hud , self . table_name )
2008-12-03 09:25:49 +01:00
2009-09-03 16:35:59 +02:00
saveitem = gtk . MenuItem ( ' Save HUD Layout ' )
menu . append ( saveitem )
saveitem . connect ( " activate " , self . save_layout )
2008-12-03 09:25:49 +01:00
2009-09-03 16:35:59 +02:00
repositem = gtk . MenuItem ( ' Reposition StatWindows ' )
menu . append ( repositem )
repositem . connect ( " activate " , self . reposition_windows )
2008-12-03 09:25:49 +01:00
2009-09-03 16:35:59 +02:00
debugitem = gtk . MenuItem ( ' Debug StatWindows ' )
menu . append ( debugitem )
debugitem . connect ( " activate " , self . debug_stat_windows )
item5 = gtk . MenuItem ( ' Set max seats ' )
menu . append ( item5 )
maxSeatsMenu = gtk . Menu ( )
item5 . set_submenu ( maxSeatsMenu )
2009-08-09 22:26:24 +02:00
for i in range ( 2 , 11 , 1 ) :
item = gtk . MenuItem ( ' %d -max ' % i )
item . ms = i
2009-09-03 16:35:59 +02:00
maxSeatsMenu . append ( item )
2009-08-09 22:26:24 +02:00
item . connect ( " activate " , self . change_max_seats )
setattr ( self , ' maxSeatsMenuItem %d ' % ( i - 1 ) , item )
2009-09-03 16:35:59 +02:00
eventbox . connect_object ( " button-press-event " , self . on_button_press , menu )
2008-09-15 22:31:55 +02:00
2009-02-27 18:42:49 +01:00
self . mw_created = True
2009-09-03 16:35:59 +02:00
self . label = label
menu . show_all ( )
self . main_window . show_all ( )
self . topify_window ( self . main_window )
2009-08-09 22:26:24 +02:00
def change_max_seats ( self , widget ) :
if self . max != widget . ms :
print ' change_max_seats ' , widget . ms
self . max = widget . ms
try :
self . kill ( )
self . create ( * self . creation_attrs )
self . update ( self . hand , self . config )
except Exception , e :
print " Expcetion: " , str ( e )
pass
2008-12-09 13:51:41 +01:00
def update_table_position ( self ) :
2008-12-15 08:04:35 +01:00
if os . name == ' nt ' :
if not win32gui . IsWindow ( self . table . number ) :
2009-03-01 00:46:54 +01:00
self . parent . kill_hud ( self , self . table . name )
2008-12-15 08:04:35 +01:00
return False
2008-12-21 12:49:34 +01:00
# anyone know how to do this in unix, or better yet, trap the X11 error that is triggered when executing the get_origin() for a closed window?
2009-09-03 16:35:59 +02:00
if self . table . gdkhandle is not None :
( x , y ) = self . table . gdkhandle . get_origin ( )
if self . table . x != x or self . table . y != y :
self . table . x = x
self . table . y = y
self . main_window . move ( x , y )
adj = self . adj_seats ( self . hand , self . config )
loc = self . config . get_locations ( self . table . site , self . max )
# TODO: is stat_windows getting converted somewhere from a list to a dict, for no good reason?
for i , w in enumerate ( self . stat_windows . itervalues ( ) ) :
( x , y ) = loc [ adj [ i + 1 ] ]
w . relocate ( x , y )
2009-08-15 09:44:04 +02:00
# While we're at it, fix the positions of mucked cards too
for aux in self . aux_windows :
aux . update_card_positions ( )
2008-12-10 19:35:15 +01:00
return True
2008-10-26 10:34:36 +01:00
2008-09-15 22:31:55 +02:00
def on_button_press ( self , widget , event ) :
2008-11-11 10:36:44 +01:00
if event . button == 1 :
self . main_window . begin_move_drag ( event . button , int ( event . x_root ) , int ( event . y_root ) , event . time )
return True
2008-09-15 22:31:55 +02:00
if event . button == 3 :
widget . popup ( None , None , None , event . button , event . time )
return True
return False
2009-02-28 01:47:52 +01:00
def kill ( self , * args ) :
# kill all stat_windows, popups and aux_windows in this HUD
# heap dead, burnt bodies, blood 'n guts, veins between my teeth
for s in self . stat_windows . itervalues ( ) :
2009-03-06 03:27:12 +01:00
s . kill_popups ( )
2009-03-08 21:28:09 +01:00
s . window . destroy ( )
self . stat_windows = { }
2009-01-26 20:31:08 +01:00
# also kill any aux windows
2009-03-30 17:59:07 +02:00
for aux in self . aux_windows :
aux . destroy ( )
2009-02-28 01:47:52 +01:00
self . aux_windows = [ ]
2008-09-15 22:31:55 +02:00
2008-11-10 11:58:55 +01:00
def reposition_windows ( self , * args ) :
2009-08-15 13:27:20 +02:00
self . update_table_position ( )
2009-03-30 17:49:20 +02:00
for w in self . stat_windows . itervalues ( ) :
2009-03-30 21:53:10 +02:00
if type ( w ) == int :
2009-04-06 17:03:51 +02:00
# print "in reposition, w =", w
2009-03-30 21:53:10 +02:00
continue
2009-04-06 17:03:51 +02:00
# print "in reposition, w =", w, w.x, w.y
2009-03-30 17:49:20 +02:00
w . window . move ( w . x , w . y )
2008-12-10 19:35:15 +01:00
return True
2008-12-03 09:25:49 +01:00
def debug_stat_windows ( self , * args ) :
2009-04-06 17:03:51 +02:00
# print self.table, "\n", self.main_window.window.get_transient_for()
2008-12-03 09:25:49 +01:00
for w in self . stat_windows :
print self . stat_windows [ w ] . window . window . get_transient_for ( )
2008-09-15 22:31:55 +02:00
def save_layout ( self , * args ) :
2008-11-12 16:28:48 +01:00
new_layout = [ ( 0 , 0 ) ] * self . max
2008-09-15 22:31:55 +02:00
for sw in self . stat_windows :
loc = self . stat_windows [ sw ] . window . get_position ( )
new_loc = ( loc [ 0 ] - self . table . x , loc [ 1 ] - self . table . y )
2008-11-12 16:28:48 +01:00
new_layout [ self . stat_windows [ sw ] . adj - 1 ] = new_loc
2008-10-04 22:43:50 +02:00
self . config . edit_layout ( self . table . site , self . max , locations = new_layout )
2009-03-15 20:27:47 +01:00
# ask each aux to save its layout back to the config object
2009-03-24 10:55:07 +01:00
( aux . save_layout ( ) for aux in self . aux_windows )
2009-03-15 20:27:47 +01:00
# save the config object back to the file
print " saving new xml file "
2008-09-15 22:31:55 +02:00
self . config . save ( )
2008-10-10 02:50:12 +02:00
def adj_seats ( self , hand , config ) :
2009-03-12 22:51:29 +01:00
# Need range here, not xrange -> need the actual list
adj = range ( 0 , self . max + 1 ) # default seat adjustments = no adjustment
2008-10-10 02:50:12 +02:00
# does the user have a fav_seat?
2009-08-06 05:57:26 +02:00
if self . table . site != None and int ( config . supported_sites [ self . table . site ] . layout [ self . max ] . fav_seat ) > 0 :
2009-03-24 10:55:07 +01:00
try :
2008-10-10 02:50:12 +02:00
fav_seat = config . supported_sites [ self . table . site ] . layout [ self . max ] . fav_seat
2009-02-24 03:33:23 +01:00
actual_seat = self . get_actual_seat ( config . supported_sites [ self . table . site ] . screen_name )
2009-03-08 20:39:55 +01:00
for i in xrange ( 0 , self . max + 1 ) :
2008-10-10 02:50:12 +02:00
j = actual_seat + i
2009-03-24 10:55:07 +01:00
if j > self . max :
j = j - self . max
2008-10-10 02:50:12 +02:00
adj [ j ] = fav_seat + i
2009-03-24 10:55:07 +01:00
if adj [ j ] > self . max :
adj [ j ] = adj [ j ] - self . max
except Exception , inst :
sys . stderr . write ( " exception in adj!!! \n \n " )
sys . stderr . write ( " error is %s " % inst ) # __str__ allows args to printed directly
2008-10-10 02:50:12 +02:00
return adj
2009-02-24 03:33:23 +01:00
def get_actual_seat ( self , name ) :
2009-03-08 21:28:09 +01:00
for key in self . stat_dict :
2009-02-24 03:33:23 +01:00
if self . stat_dict [ key ] [ ' screen_name ' ] == name :
return self . stat_dict [ key ] [ ' seat ' ]
sys . stderr . write ( " Error finding actual seat. \n " )
2009-02-26 05:35:15 +01:00
def create ( self , hand , config , stat_dict , cards ) :
2008-08-19 00:53:25 +02:00
# update this hud, to the stats and players as of "hand"
# hand is the hand id of the most recent hand played at this table
#
# this method also manages the creating and destruction of stat
# windows via calls to the Stat_Window class
2009-08-09 22:26:24 +02:00
self . creation_attrs = hand , config , stat_dict , cards
2009-03-11 00:23:28 +01:00
self . hand = hand
2009-02-27 18:42:49 +01:00
if not self . mw_created :
self . create_mw ( )
2009-02-24 03:33:23 +01:00
self . stat_dict = stat_dict
2009-02-26 05:35:15 +01:00
self . cards = cards
2009-02-24 03:33:23 +01:00
sys . stderr . write ( " ------------------------------------------------------------ \n Creating hud from hand %s \n " % hand )
2008-10-10 02:50:12 +02:00
adj = self . adj_seats ( hand , config )
2008-10-30 03:37:05 +01:00
loc = self . config . get_locations ( self . table . site , self . max )
2008-10-10 02:50:12 +02:00
# create the stat windows
2009-03-08 20:39:55 +01:00
for i in xrange ( 1 , self . max + 1 ) :
2008-10-30 03:37:05 +01:00
( x , y ) = loc [ adj [ i ] ]
2009-01-06 11:18:45 +01:00
if i in self . stat_windows :
2008-11-04 11:02:41 +01:00
self . stat_windows [ i ] . relocate ( x , y )
else :
self . stat_windows [ i ] = Stat_Window ( game = config . supported_games [ self . poker_game ] ,
2008-09-15 22:31:55 +02:00
parent = self ,
2008-08-19 00:53:25 +02:00
table = self . table ,
x = x ,
y = y ,
seat = i ,
2008-11-12 16:28:48 +01:00
adj = adj [ i ] ,
2008-08-19 00:53:25 +02:00
player_id = ' fake ' ,
font = self . font )
2008-08-20 21:29:08 +02:00
self . stats = [ ]
2009-03-24 10:19:20 +01:00
game = config . supported_games [ self . poker_game ]
for i in xrange ( 0 , game . rows + 1 ) :
row_list = [ ' ' ] * game . cols
2008-08-20 21:29:08 +02:00
self . stats . append ( row_list )
2009-03-24 10:19:20 +01:00
for stat in game . stats :
2008-08-19 00:53:25 +02:00
self . stats [ config . supported_games [ self . poker_game ] . stats [ stat ] . row ] \
[ config . supported_games [ self . poker_game ] . stats [ stat ] . col ] = \
config . supported_games [ self . poker_game ] . stats [ stat ] . stat_name
2008-12-09 14:21:50 +01:00
2008-12-16 04:38:04 +01:00
if os . name == " nt " :
gobject . timeout_add ( 500 , self . update_table_position )
2008-08-19 00:53:25 +02:00
2009-02-26 05:35:15 +01:00
def update ( self , hand , config ) :
2008-09-15 22:31:55 +02:00
self . hand = hand # this is the last hand, so it is available later
2009-02-28 01:47:52 +01:00
if os . name == ' nt ' :
self . update_table_position ( )
2009-01-07 18:46:19 +01:00
2009-02-26 05:35:15 +01:00
for s in self . stat_dict :
2009-03-24 10:55:07 +01:00
statd = self . stat_dict [ s ]
2008-11-04 11:02:41 +01:00
try :
2009-02-26 05:35:15 +01:00
self . stat_windows [ self . stat_dict [ s ] [ ' seat ' ] ] . player_id = self . stat_dict [ s ] [ ' player_id ' ]
2008-11-04 11:02:41 +01:00
except : # omg, we have more seats than stat windows .. damn poker sites with incorrect max seating info .. let's force 10 here
self . max = 10
2009-02-26 05:35:15 +01:00
self . create ( hand , config , self . stat_dict , self . cards )
2009-03-24 10:55:07 +01:00
self . stat_windows [ statd [ ' seat ' ] ] . player_id = statd [ ' player_id ' ]
2008-11-04 11:02:41 +01:00
2009-03-08 20:39:55 +01:00
for r in xrange ( 0 , config . supported_games [ self . poker_game ] . rows ) :
for c in xrange ( 0 , config . supported_games [ self . poker_game ] . cols ) :
2008-10-31 19:34:41 +01:00
this_stat = config . supported_games [ self . poker_game ] . stats [ self . stats [ r ] [ c ] ]
2009-03-24 10:55:07 +01:00
number = Stats . do_stat ( self . stat_dict , player = statd [ ' player_id ' ] , stat = self . stats [ r ] [ c ] )
2009-03-24 10:19:20 +01:00
statstring = " %s %s %s " % ( this_stat . hudprefix , str ( number [ 1 ] ) , this_stat . hudsuffix )
2009-03-24 10:55:07 +01:00
window = self . stat_windows [ statd [ ' seat ' ] ]
2008-11-25 12:47:58 +01:00
if this_stat . hudcolor != " " :
self . label . modify_fg ( gtk . STATE_NORMAL , gtk . gdk . color_parse ( self . colors [ ' hudfgcolor ' ] ) )
2009-03-24 10:55:07 +01:00
window . label [ r ] [ c ] . modify_fg ( gtk . STATE_NORMAL , gtk . gdk . color_parse ( this_stat . hudcolor ) )
window . label [ r ] [ c ] . set_text ( statstring )
2008-12-21 23:14:57 +01:00
if statstring != " xxx " : # is there a way to tell if this particular stat window is visible already, or no?
2009-03-24 10:55:07 +01:00
window . window . show_all ( )
tip = " %s \n %s \n %s , %s " % ( statd [ ' screen_name ' ] , number [ 5 ] , number [ 3 ] , number [ 4 ] )
Stats . do_tip ( window . e_box [ r ] [ c ] , tip )
2008-09-15 22:31:55 +02:00
def topify_window ( self , window ) :
2009-09-03 16:35:59 +02:00
window . set_focus_on_map ( False )
window . set_accept_focus ( False )
if not self . table . gdkhandle :
self . table . gdkhandle = gtk . gdk . window_foreign_new ( int ( self . table . number ) ) # gtk handle to poker window
2009-09-04 21:14:38 +02:00
window . window . set_transient_for ( self . table . gdkhandle )
2008-09-15 22:31:55 +02:00
2008-08-19 00:53:25 +02:00
class Stat_Window :
def button_press_cb ( self , widget , event , * args ) :
# This handles all callbacks from button presses on the event boxes in
# the stat windows. There is a bit of an ugly kludge to separate single-
# and double-clicks.
2008-11-10 11:58:55 +01:00
if event . button == 3 : # right button event
2009-08-27 14:41:43 +02:00
newpopup = Popup_window ( self . window , self )
#print "added popup", newpopup
# TODO: how should we go about making sure it doesn't open a dozen popups if you click?
self . popups . append ( newpopup )
2009-08-19 12:59:44 +02:00
return True
2008-08-19 00:53:25 +02:00
if event . button == 2 : # middle button event
2008-11-25 14:52:59 +01:00
self . window . hide ( )
2009-08-19 12:59:44 +02:00
return True
2008-11-10 11:58:55 +01:00
if event . button == 1 : # left button event
2008-12-09 07:43:13 +01:00
# TODO: make position saving save sizes as well?
2009-09-03 16:35:59 +02:00
self . window . show_all ( )
2008-11-10 11:58:55 +01:00
if event . state & gtk . gdk . SHIFT_MASK :
self . window . begin_resize_drag ( gtk . gdk . WINDOW_EDGE_SOUTH_EAST , event . button , int ( event . x_root ) , int ( event . y_root ) , event . time )
else :
self . window . begin_move_drag ( event . button , int ( event . x_root ) , int ( event . y_root ) , event . time )
2009-08-19 12:59:44 +02:00
return True
return False
2009-08-27 11:28:59 +02:00
def noop ( self , arga = None , argb = None ) : # i'm going to try to connect the focus-in and focus-out events here, to see if that fixes any of the focus problems.
2009-08-19 12:59:44 +02:00
return True
2009-02-28 01:47:52 +01:00
def kill_popup ( self , popup ) :
2009-08-27 14:41:43 +02:00
print " remove popup " , popup
self . popups . remove ( popup )
2009-02-28 01:47:52 +01:00
popup . window . destroy ( )
2009-03-06 03:27:12 +01:00
def kill_popups ( self ) :
2009-03-08 21:28:09 +01:00
map ( lambda x : x . window . destroy ( ) , self . popups )
2009-03-06 03:27:12 +01:00
self . popups = { }
2009-02-28 01:47:52 +01:00
2008-11-04 11:02:41 +01:00
def relocate ( self , x , y ) :
self . x = x + self . table . x
self . y = y + self . table . y
self . window . move ( self . x , self . y )
2008-08-19 00:53:25 +02:00
2008-11-12 16:28:48 +01:00
def __init__ ( self , parent , game , table , seat , adj , x , y , player_id , font ) :
2008-09-15 22:31:55 +02:00
self . parent = parent # Hud object that this stat window belongs to
self . game = game # Configuration object for the curren
self . table = table # Table object where this is going
2008-11-12 16:28:48 +01:00
self . seat = seat # seat number of his player
self . adj = adj # the adjusted seat number for this player
2008-09-15 22:31:55 +02:00
self . x = x + table . x # table.x and y are the location of the table
self . y = y + table . y # x and y are the location relative to table.x & y
self . player_id = player_id # looks like this isn't used ;)
self . sb_click = 0 # used to figure out button clicks
2009-02-28 01:47:52 +01:00
self . popups = [ ] # list of open popups for this stat window
2009-02-25 21:25:58 +01:00
self . useframes = parent . config . get_frames ( parent . site )
2008-08-19 00:53:25 +02:00
self . window = gtk . Window ( )
self . window . set_decorated ( 0 )
self . window . set_gravity ( gtk . gdk . GRAVITY_STATIC )
2008-10-28 12:30:22 +01:00
2008-08-19 00:53:25 +02:00
self . window . set_title ( " %s " % seat )
2008-08-22 22:10:32 +02:00
self . window . set_property ( " skip-taskbar-hint " , True )
2009-03-24 11:04:00 +01:00
self . window . set_focus_on_map ( False )
2008-08-19 00:53:25 +02:00
2009-03-26 00:33:01 +01:00
grid = gtk . Table ( rows = game . rows , columns = game . cols , homogeneous = False )
self . grid = grid
self . window . add ( grid )
2009-01-27 00:31:04 +01:00
self . window . modify_bg ( gtk . STATE_NORMAL , parent . backgroundcolor )
2008-08-19 00:53:25 +02:00
self . e_box = [ ]
self . frame = [ ]
self . label = [ ]
2009-03-08 21:28:09 +01:00
usegtkframes = self . useframes
e_box = self . e_box
label = self . label
2009-03-24 10:19:20 +01:00
for r in xrange ( game . rows ) :
2009-03-08 21:28:09 +01:00
if usegtkframes :
2009-02-25 21:25:58 +01:00
self . frame . append ( [ ] )
2009-03-08 21:28:09 +01:00
e_box . append ( [ ] )
label . append ( [ ] )
2009-03-24 10:19:20 +01:00
for c in xrange ( game . cols ) :
2009-03-08 21:28:09 +01:00
if usegtkframes :
2009-02-25 21:25:58 +01:00
self . frame [ r ] . append ( gtk . Frame ( ) )
2009-03-08 21:28:09 +01:00
e_box [ r ] . append ( gtk . EventBox ( ) )
2008-10-27 11:29:39 +01:00
2009-03-08 21:28:09 +01:00
e_box [ r ] [ c ] . modify_bg ( gtk . STATE_NORMAL , parent . backgroundcolor )
e_box [ r ] [ c ] . modify_fg ( gtk . STATE_NORMAL , parent . foregroundcolor )
2008-10-27 11:29:39 +01:00
2009-03-08 21:28:09 +01:00
Stats . do_tip ( e_box [ r ] [ c ] , ' stuff ' )
if usegtkframes :
2009-06-20 16:01:52 +02:00
grid . attach ( self . frame [ r ] [ c ] , c , c + 1 , r , r + 1 , xpadding = game . xpad , ypadding = game . ypad )
2009-03-08 21:28:09 +01:00
self . frame [ r ] [ c ] . add ( e_box [ r ] [ c ] )
2009-02-25 21:25:58 +01:00
else :
2009-06-20 16:01:52 +02:00
grid . attach ( e_box [ r ] [ c ] , c , c + 1 , r , r + 1 , xpadding = game . xpad , ypadding = game . ypad )
2009-03-08 21:28:09 +01:00
label [ r ] . append ( gtk . Label ( ' xxx ' ) )
2008-10-27 11:29:39 +01:00
2009-03-08 21:28:09 +01:00
if usegtkframes :
2009-02-25 21:25:58 +01:00
self . frame [ r ] [ c ] . modify_bg ( gtk . STATE_NORMAL , parent . backgroundcolor )
2009-03-08 21:28:09 +01:00
label [ r ] [ c ] . modify_bg ( gtk . STATE_NORMAL , parent . backgroundcolor )
label [ r ] [ c ] . modify_fg ( gtk . STATE_NORMAL , parent . foregroundcolor )
2008-10-27 11:29:39 +01:00
2009-03-08 21:28:09 +01:00
e_box [ r ] [ c ] . add ( self . label [ r ] [ c ] )
e_box [ r ] [ c ] . connect ( " button_press_event " , self . button_press_cb )
2009-08-19 12:59:44 +02:00
e_box [ r ] [ c ] . connect ( " focus-in-event " , self . noop )
e_box [ r ] [ c ] . connect ( " focus " , self . noop )
e_box [ r ] [ c ] . connect ( " focus-out-event " , self . noop )
2009-03-08 21:28:09 +01:00
label [ r ] [ c ] . modify_font ( font )
2008-10-31 19:34:41 +01:00
2008-11-10 11:58:55 +01:00
self . window . set_opacity ( parent . colors [ ' hudopacity ' ] )
2009-08-19 12:59:44 +02:00
self . window . connect ( " focus " , self . noop )
self . window . connect ( " focus-in-event " , self . noop )
self . window . connect ( " focus-out-event " , self . noop )
self . window . connect ( " button_press_event " , self . button_press_cb )
2009-09-03 16:35:59 +02:00
self . window . set_focus_on_map ( False )
self . window . set_accept_focus ( False )
2008-11-10 11:58:55 +01:00
2008-08-19 00:53:25 +02:00
self . window . move ( self . x , self . y )
2009-09-04 21:14:38 +02:00
self . window . realize ( ) # window must be realized before it has a gdkwindow so we can attach it to the table window..
2009-09-03 16:35:59 +02:00
self . topify_window ( self . window )
2008-12-03 19:35:19 +01:00
2008-11-25 13:03:33 +01:00
self . window . hide ( )
2009-09-03 16:35:59 +02:00
def topify_window ( self , window ) :
window . set_focus_on_map ( False )
window . set_accept_focus ( False )
if not self . table . gdkhandle :
self . table . gdkhandle = gtk . gdk . window_foreign_new ( int ( self . table . number ) ) # gtk handle to poker window
# window.window.reparent(self.table.gdkhandle, 0, 0)
window . window . set_transient_for ( self . table . gdkhandle )
# window.present()
2008-09-15 22:31:55 +02:00
2008-08-19 00:53:25 +02:00
def destroy ( * args ) : # call back for terminating the main eventloop
gtk . main_quit ( )
2008-09-15 22:31:55 +02:00
class Popup_window :
def __init__ ( self , parent , stat_window ) :
self . sb_click = 0
2009-02-28 01:47:52 +01:00
self . stat_window = stat_window
2009-05-30 18:02:31 +02:00
self . parent = parent
2008-09-15 22:31:55 +02:00
# create the popup window
self . window = gtk . Window ( )
self . window . set_decorated ( 0 )
self . window . set_gravity ( gtk . gdk . GRAVITY_STATIC )
self . window . set_title ( " popup " )
self . window . set_property ( " skip-taskbar-hint " , True )
2009-09-03 16:35:59 +02:00
self . window . set_focus_on_map ( False )
self . window . set_accept_focus ( False )
2008-09-15 22:31:55 +02:00
self . window . set_transient_for ( parent . get_toplevel ( ) )
2008-10-24 21:44:53 +02:00
2008-09-15 22:31:55 +02:00
self . window . set_position ( gtk . WIN_POS_CENTER_ON_PARENT )
2008-08-19 00:53:25 +02:00
2008-09-15 22:31:55 +02:00
self . ebox = gtk . EventBox ( )
self . ebox . connect ( " button_press_event " , self . button_press_cb )
self . lab = gtk . Label ( " stuff \n stuff \n stuff " )
# need an event box so we can respond to clicks
self . window . add ( self . ebox )
self . ebox . add ( self . lab )
2008-11-06 12:58:28 +01:00
2008-12-21 12:49:34 +01:00
self . ebox . modify_bg ( gtk . STATE_NORMAL , stat_window . parent . backgroundcolor )
self . ebox . modify_fg ( gtk . STATE_NORMAL , stat_window . parent . foregroundcolor )
self . window . modify_bg ( gtk . STATE_NORMAL , stat_window . parent . backgroundcolor )
self . window . modify_fg ( gtk . STATE_NORMAL , stat_window . parent . foregroundcolor )
self . lab . modify_bg ( gtk . STATE_NORMAL , stat_window . parent . backgroundcolor )
self . lab . modify_fg ( gtk . STATE_NORMAL , stat_window . parent . foregroundcolor )
2008-11-06 12:58:28 +01:00
2008-09-15 22:31:55 +02:00
# figure out the row, col address of the click that activated the popup
row = 0
col = 0
2009-03-08 20:39:55 +01:00
for r in xrange ( 0 , stat_window . game . rows ) :
for c in xrange ( 0 , stat_window . game . cols ) :
2008-09-15 22:31:55 +02:00
if stat_window . e_box [ r ] [ c ] == parent :
row = r
col = c
break
# figure out what popup format we're using
popup_format = " default "
2009-01-06 11:18:45 +01:00
for stat in stat_window . game . stats :
2008-09-15 22:31:55 +02:00
if stat_window . game . stats [ stat ] . row == row and stat_window . game . stats [ stat ] . col == col :
popup_format = stat_window . game . stats [ stat ] . popup
break
# get the list of stats to be presented from the config
stat_list = [ ]
2009-01-06 11:18:45 +01:00
for w in stat_window . parent . config . popup_windows :
2008-09-15 22:31:55 +02:00
if w == popup_format :
stat_list = stat_window . parent . config . popup_windows [ w ] . pu_stats
break
# get a database connection
2008-12-17 19:24:37 +01:00
# db_connection = Database.Database(stat_window.parent.config, stat_window.parent.db_name, 'temp')
2008-09-15 22:31:55 +02:00
# calculate the stat_dict and then create the text for the pu
# stat_dict = db_connection.get_stats_from_hand(stat_window.parent.hand, stat_window.player_id)
2009-01-06 02:26:39 +01:00
# stat_dict = self.db_connection.get_stats_from_hand(stat_window.parent.hand)
2008-12-17 19:24:37 +01:00
# db_connection.close_connection()
2009-01-06 02:26:39 +01:00
stat_dict = stat_window . parent . stat_dict
2008-09-15 22:31:55 +02:00
pu_text = " "
2009-04-02 11:02:24 +02:00
mo_text = " "
2008-09-15 22:31:55 +02:00
for s in stat_list :
number = Stats . do_stat ( stat_dict , player = int ( stat_window . player_id ) , stat = s )
2009-04-02 11:02:24 +02:00
mo_text + = number [ 5 ] + " " + number [ 4 ] + " \n "
2008-09-15 22:31:55 +02:00
pu_text + = number [ 3 ] + " \n "
2009-04-02 11:02:24 +02:00
2008-09-15 22:31:55 +02:00
2009-04-02 11:02:24 +02:00
self . lab . set_text ( pu_text )
Stats . do_tip ( self . lab , mo_text )
2008-09-15 22:31:55 +02:00
self . window . show_all ( )
2008-11-06 12:58:28 +01:00
2008-11-10 11:58:55 +01:00
self . window . set_transient_for ( stat_window . window )
2008-11-06 12:58:28 +01:00
2008-09-15 22:31:55 +02:00
def button_press_cb ( self , widget , event , * args ) :
# This handles all callbacks from button presses on the event boxes in
# the popup windows. There is a bit of an ugly kludge to separate single-
# and double-clicks. This is the same code as in the Stat_window class
if event . button == 1 : # left button event
2009-01-06 02:26:39 +01:00
pass
2008-09-15 22:31:55 +02:00
if event . button == 2 : # middle button event
pass
if event . button == 3 : # right button event
2009-02-28 01:47:52 +01:00
self . stat_window . kill_popup ( self )
2009-08-19 12:59:44 +02:00
return True
2009-02-28 01:47:52 +01:00
# self.window.destroy()
2009-08-19 12:59:44 +02:00
return False
2008-09-15 22:31:55 +02:00
def toggle_decorated ( self , widget ) :
top = widget . get_toplevel ( )
( x , y ) = top . get_position ( )
if top . get_decorated ( ) :
top . set_decorated ( 0 )
top . move ( x , y )
else :
top . set_decorated ( 1 )
top . move ( x , y )
def topify_window ( self , window ) :
2009-09-03 16:35:59 +02:00
window . set_focus_on_map ( False )
window . set_accept_focus ( False )
if not self . table . gdkhandle :
self . table . gdkhandle = gtk . gdk . window_foreign_new ( int ( self . table . number ) ) # gtk handle to poker window
# window.window.reparent(self.table.gdkhandle, 0, 0)
window . window . set_transient_for ( self . table . gdkhandle )
# window.present()
2008-09-15 22:31:55 +02:00
2008-08-19 00:53:25 +02:00
if __name__ == " __main__ " :
main_window = gtk . Window ( )
main_window . connect ( " destroy " , destroy )
label = gtk . Label ( ' Fake main window, blah blah, blah \n blah, blah ' )
main_window . add ( label )
main_window . show_all ( )
c = Configuration . Config ( )
2008-10-24 21:44:53 +02:00
#tables = Tables.discover(c)
2009-09-04 21:14:38 +02:00
t = Tables . discover_table_by_name ( c , " Corona " )
2008-10-24 21:44:53 +02:00
if t is None :
print " Table not found. "
2008-08-22 22:10:32 +02:00
db = Database . Database ( c , ' fpdb ' , ' holdem ' )
2009-08-06 05:57:26 +02:00
stat_dict = db . get_stats_from_hand ( 1 )
2008-08-22 22:10:32 +02:00
2008-10-24 21:44:53 +02:00
# for t in tables:
2009-08-06 05:57:26 +02:00
win = Hud ( None , t , 10 , ' holdem ' , c , db ) # parent, table, max, poker_game, config, db_connection
win . create ( 1 , c , stat_dict , None ) # hand, config, stat_dict, cards):
2008-08-19 00:53:25 +02:00
# t.get_details()
2009-08-06 05:57:26 +02:00
win . update ( 8300 , c ) # self, hand, config):
2008-08-19 00:53:25 +02:00
gtk . main ( )