Merge branch 'eric'

This commit is contained in:
Steffen Schaumburg 2011-03-16 12:26:24 +01:00
commit 60d17b0231
2 changed files with 177 additions and 160 deletions

View File

@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Routines for detecting and handling poker client windows for MS Windows. """Routines for detecting and handling poker client windows for MS Windows.
""" """
# Copyright 2008 - 2011, Ray E. Barker # Copyright 2008 - 2010, Ray E. Barker
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -62,9 +62,11 @@ class Table(Table_Window):
if re.search(self.search_string, titles[hwnd], re.I): if re.search(self.search_string, titles[hwnd], re.I):
if self.check_bad_words(titles[hwnd]): if self.check_bad_words(titles[hwnd]):
continue continue
if not win32gui.IsWindowVisible(hwnd): # if window not visible, probably not a table # if window not visible, probably not a table
if not win32gui.IsWindowVisible(hwnd):
continue continue
if win32gui.GetParent(hwnd) != 0: # if window is a child of another window, probably not a table # if window is a child of another window, probably not a table
if win32gui.GetParent(hwnd) != 0:
continue continue
HasNoOwner = win32gui.GetWindow(hwnd, win32con.GW_OWNER) == 0 HasNoOwner = win32gui.GetWindow(hwnd, win32con.GW_OWNER) == 0
WindowStyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) WindowStyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
@ -78,7 +80,7 @@ class Table(Table_Window):
try: try:
if self.window == None: if self.window == None:
log.error(_("Window %s not found. Skipping.") % self.search_string) log.error(_("Window %s not found. Skipping." % self.search_string))
return None return None
except AttributeError: except AttributeError:
log.error(_("self.window doesn't exist? why?")) log.error(_("self.window doesn't exist? why?"))

259
pyfpdb/fpdb.pyw Executable file → Normal file
View File

@ -28,7 +28,7 @@ if os.name == 'nt' and sys.version[0:3] not in ('2.5', '2.6', '2.7') and '-r' no
#print "old path =", os.environ['PATH'] #print "old path =", os.environ['PATH']
dirs = re.split(os.pathsep, os.environ['PATH']) dirs = re.split(os.pathsep, os.environ['PATH'])
# remove any trailing / or \ chars from dirs: # remove any trailing / or \ chars from dirs:
dirs = [re.sub('[\\/]$','',p) for p in dirs] dirs = [re.sub('[\\/]$', '', p) for p in dirs]
# remove any dirs containing 'python' apart from those ending in 'python25', 'python26' or 'python': # remove any dirs containing 'python' apart from those ending in 'python25', 'python26' or 'python':
dirs = [p for p in dirs if not re.search('python', p, re.I) or re.search('python25$', p, re.I) or re.search('python26$', p, re.I) or re.search('python27$', p, re.I)] dirs = [p for p in dirs if not re.search('python', p, re.I) or re.search('python25$', p, re.I) or re.search('python26$', p, re.I) or re.search('python27$', p, re.I)]
tmppath = ";".join(dirs) tmppath = ";".join(dirs)
@ -37,10 +37,10 @@ if os.name == 'nt' and sys.version[0:3] not in ('2.5', '2.6', '2.7') and '-r' no
os.environ['PATH'] = tmppath os.environ['PATH'] = tmppath
print "Python " + sys.version[0:3] + _(' - press return to continue\n') print "Python " + sys.version[0:3] + _(' - press return to continue\n')
sys.stdin.readline() sys.stdin.readline()
if os.name=='nt': if os.name == 'nt':
os.execvpe('pythonw.exe', ('pythonw.exe', 'fpdb.pyw', '-r'), os.environ) # first arg is ignored (name of program being run) os.execvpe('pythonw.exe', ('pythonw.exe', 'fpdb.pyw', '-r'), os.environ)
else: else:
os.execvpe('python', ('python', 'fpdb.pyw', '-r'), os.environ) # first arg is ignored (name of program being run) os.execvpe('python', ('python', 'fpdb.pyw', '-r'), os.environ)
else: else:
print _("\npython 2.5-2.7 not found, please install python 2.5, 2.6 or 2.7 for fpdb\n") print _("\npython 2.5-2.7 not found, please install python 2.5, 2.6 or 2.7 for fpdb\n")
raw_input(_("Press ENTER to continue.")) raw_input(_("Press ENTER to continue."))
@ -67,7 +67,8 @@ import string
cl_options = string.join(sys.argv[1:]) cl_options = string.join(sys.argv[1:])
(options, argv) = Options.fpdb_options() (options, argv) = Options.fpdb_options()
import logging, logging.config import logging
import logging.config
log = logging.getLogger("fpdb") log = logging.getLogger("fpdb")
try: try:
@ -141,9 +142,9 @@ class fpdb:
def add_tab(self, new_page, new_tab_name): def add_tab(self, new_page, new_tab_name):
"""adds a tab, namely creates the button and displays it and appends all the relevant arrays""" """adds a tab, namely creates the button and displays it and appends all the relevant arrays"""
for name in self.nb_tab_names: #todo: check this is valid for name in self.nb_tab_names: # todo: check this is valid
if name == new_tab_name: if name == new_tab_name:
return # if tab already exists, just go to it return # if tab already exists, just go to it
used_before = False used_before = False
for i, name in enumerate(self.tab_names): for i, name in enumerate(self.tab_names):
@ -221,9 +222,9 @@ class fpdb:
image = gtk.Image() image = gtk.Image()
image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_SMALL_TOOLBAR) image.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_SMALL_TOOLBAR)
gtk.Button.set_relief(button, gtk.RELIEF_NONE) gtk.Button.set_relief(button, gtk.RELIEF_NONE)
settings = gtk.Widget.get_settings(button); settings = gtk.Widget.get_settings(button)
(w,h) = gtk.icon_size_lookup_for_settings(settings, gtk.ICON_SIZE_SMALL_TOOLBAR); (w, h) = gtk.icon_size_lookup_for_settings(settings, gtk.ICON_SIZE_SMALL_TOOLBAR)
gtk.Widget.set_size_request(button, w + 4, h + 4); gtk.Widget.set_size_request(button, w + 4, h + 4)
image.show() image.show()
iconBox.pack_start(image, True, False, 0) iconBox.pack_start(image, True, False, 0)
button.add(iconBox) button.add(iconBox)
@ -269,19 +270,19 @@ class fpdb:
db_version = "" db_version = ""
#if self.db is not None: #if self.db is not None:
# db_version = self.db.get_version() # db_version = self.db.get_version()
nums = [ (_('Operating System'), os.name) nums = [(_('Operating System'), os.name),
, ('Python', sys.version[0:3]) ('Python', sys.version[0:3]),
, ('GTK+', '.'.join([str(x) for x in gtk.gtk_version])) ('GTK+', '.'.join([str(x) for x in gtk.gtk_version])),
, ('PyGTK', '.'.join([str(x) for x in gtk.pygtk_version])) ('PyGTK', '.'.join([str(x) for x in gtk.pygtk_version])),
, ('matplotlib', matplotlib_version) ('matplotlib', matplotlib_version),
, ('numpy', numpy_version) ('numpy', numpy_version),
, ('sqlite', sqlite_version) ('sqlite', sqlite_version),
, ('fpdb version', VERSION) ('fpdb version', VERSION),
, ('database used', self.settings['db-server']) ('database used', self.settings['db-server'])
] ]
versions = gtk.TextBuffer() versions = gtk.TextBuffer()
w = 20 # width used for module names and version numbers w = 20 # width used for module names and version numbers
versions.set_text( '\n'.join( [x[0].rjust(w)+' '+ x[1].ljust(w) for x in nums] ) ) versions.set_text('\n'.join([x[0].rjust(w) + ' ' + x[1].ljust(w) for x in nums]))
view = gtk.TextView(versions) view = gtk.TextView(versions)
view.set_editable(False) view.set_editable(False)
view.set_justification(gtk.JUSTIFY_CENTER) view.set_justification(gtk.JUSTIFY_CENTER)
@ -289,7 +290,7 @@ class fpdb:
view.show() view.show()
dia.vbox.pack_end(view, True, True, 2) dia.vbox.pack_end(view, True, True, 2)
l = gtk.Label(_("Your config file is: ")+self.config.file) l = gtk.Label(_("Your config file is: ") + self.config.file)
l.set_alignment(0.5, 0.5) l.set_alignment(0.5, 0.5)
l.show() l.show()
dia.vbox.pack_end(l, True, True, 2) dia.vbox.pack_end(l, True, True, 2)
@ -348,10 +349,10 @@ class fpdb:
# save updated config # save updated config
self.config.save() self.config.save()
self.load_profile() self.load_profile()
for name in self.config.supported_databases: #db_ip/db_user/db_pass/db_server for name in self.config.supported_databases: # db_ip/db_user/db_pass/db_server
log.info('fpdb: name,desc='+name+','+self.config.supported_databases[name].db_desc) log.info('fpdb: name,desc=' + name + ',' + self.config.supported_databases[name].db_desc)
else: else:
log.info(_('guidb response was ')+str(response)) log.info(_('guidb response was ') + str(response))
self.release_global_lock() self.release_global_lock()
@ -360,17 +361,17 @@ class fpdb:
self.warning_box(_("Cannot open Database Maintenance window because other windows have been opened. Re-start fpdb to use this option.")) self.warning_box(_("Cannot open Database Maintenance window because other windows have been opened. Re-start fpdb to use this option."))
def dia_database_stats(self, widget, data=None): def dia_database_stats(self, widget, data=None):
self.warning_box(str=_("Number of Hands: ")+str(self.db.getHandCount())+ self.warning_box(str=_("Number of Hands: ") + str(self.db.getHandCount()) +
_("\nNumber of Tourneys: ")+str(self.db.getTourneyCount())+ _("\nNumber of Tourneys: ") + str(self.db.getTourneyCount()) +
_("\nNumber of TourneyTypes: ")+str(self.db.getTourneyTypeCount()), _("\nNumber of TourneyTypes: ") + str(self.db.getTourneyTypeCount()),
diatitle=_("Database Statistics")) diatitle=_("Database Statistics"))
#end def dia_database_stats #end def dia_database_stats
def diaHudConfigurator(self, widget, data=None): def diaHudConfigurator(self, widget, data=None):
"""Opens dialog to set parameters (game category, row count, column count for HUD stat configurator""" """Opens dialog to set parameters (game category, row count, column count for HUD stat configurator"""
self.hudConfiguratorRows=None self.hudConfiguratorRows = None
self.hudConfiguratorColumns=None self.hudConfiguratorColumns = None
self.hudConfiguratorGame=None self.hudConfiguratorGame = None
diaSelections = gtk.Dialog(_("HUD Configurator - choose category"), diaSelections = gtk.Dialog(_("HUD Configurator - choose category"),
self.window, self.window,
@ -378,16 +379,14 @@ class fpdb:
(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT,
gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
label=gtk.Label(_("Note that this dialogue will overwrite an existing config if one has been made already. ") + label = gtk.Label(_("Please select the game category for which you want to configure HUD stats:"))
_("Abort now if you don't want that.") + "\n" +
_("Please select the game category for which you want to configure HUD stats and the number of rows and columns:"))
diaSelections.vbox.add(label) diaSelections.vbox.add(label)
label.show() label.show()
comboGame = gtk.combo_box_new_text() comboGame = gtk.combo_box_new_text()
comboGame.connect("changed", self.hudConfiguratorComboSelection) comboGame.connect("changed", self.hudConfiguratorComboSelection)
diaSelections.vbox.add(comboGame) diaSelections.vbox.add(comboGame)
games=self.config.get_supported_games() games = self.config.get_supported_games()
for game in games: for game in games:
comboGame.append_text(game) comboGame.append_text(game)
comboGame.set_active(0) comboGame.set_active(0)
@ -396,36 +395,39 @@ class fpdb:
comboRows = gtk.combo_box_new_text() comboRows = gtk.combo_box_new_text()
comboRows.connect("changed", self.hudConfiguratorComboSelection) comboRows.connect("changed", self.hudConfiguratorComboSelection)
diaSelections.vbox.add(comboRows) diaSelections.vbox.add(comboRows)
for i in range(1,8): for i in range(1, 8):
comboRows.append_text(_("%d rows") % i) comboRows.append_text(str(i) + " rows")
comboRows.set_active(0) comboRows.set_active(0)
comboRows.show() comboRows.show()
comboColumns = gtk.combo_box_new_text() comboColumns = gtk.combo_box_new_text()
comboColumns.connect("changed", self.hudConfiguratorComboSelection) comboColumns.connect("changed", self.hudConfiguratorComboSelection)
diaSelections.vbox.add(comboColumns) diaSelections.vbox.add(comboColumns)
for i in range(1,8): for i in range(1, 8):
comboColumns.append_text("%d columns" % i) comboColumns.append_text(str(i) + " columns")
comboColumns.set_active(0) comboColumns.set_active(0)
comboColumns.show() comboColumns.show()
response=diaSelections.run() response = diaSelections.run()
diaSelections.destroy() diaSelections.destroy()
if response == gtk.RESPONSE_ACCEPT and self.hudConfiguratorRows!=None and self.hudConfiguratorColumns!=None and self.hudConfiguratorGame!=None: if (response == gtk.RESPONSE_ACCEPT and
self.hudConfiguratorRows != None and
self.hudConfiguratorColumns != None and
self.hudConfiguratorGame != None):
#print "clicked ok and selected:", self.hudConfiguratorGame,"with", str(self.hudConfiguratorRows), "rows and", str(self.hudConfiguratorColumns), "columns" #print "clicked ok and selected:", self.hudConfiguratorGame,"with", str(self.hudConfiguratorRows), "rows and", str(self.hudConfiguratorColumns), "columns"
self.diaHudConfiguratorTable() self.diaHudConfiguratorTable()
#end def diaHudConfigurator #end def diaHudConfigurator
def hudConfiguratorComboSelection(self, widget): def hudConfiguratorComboSelection(self, widget):
#TODO: remove this and handle it directly in diaHudConfigurator #TODO: remove this and handle it directly in diaHudConfigurator
result=widget.get_active_text() result = widget.get_active_text()
if result.endswith(" rows"): if result.endswith(" rows"):
self.hudConfiguratorRows=int(result[0]) self.hudConfiguratorRows = int(result[0])
elif result.endswith(" columns"): elif result.endswith(" columns"):
self.hudConfiguratorColumns=int(result[0]) self.hudConfiguratorColumns = int(result[0])
else: else:
self.hudConfiguratorGame=result self.hudConfiguratorGame = result
#end def hudConfiguratorComboSelection #end def hudConfiguratorComboSelection
def diaHudConfiguratorTable(self): def diaHudConfiguratorTable(self):
@ -438,47 +440,55 @@ class fpdb:
(gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT, (gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT,
gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
label=gtk.Label(_("Please choose the stats you wish to use in the below table.")) label = gtk.Label(_("Please choose the stats you wish to use in the below table."))
diaHudTable.vbox.add(label) diaHudTable.vbox.add(label)
label.show() label.show()
label=gtk.Label(_("Note that you may not select any stat more than once or it will crash.")) label = gtk.Label(_("Note that you may not select any stat more than once or it will crash."))
diaHudTable.vbox.add(label) diaHudTable.vbox.add(label)
label.show() label.show()
label=gtk.Label(_("It is not currently possible to select \"empty\" or anything else to that end.")) label = gtk.Label(_("It is not currently possible to select \"empty\" or anything else to that end."))
diaHudTable.vbox.add(label) diaHudTable.vbox.add(label)
label.show() label.show()
label=gtk.Label(_("To configure things like colouring you will still have to use the Preferences dialogue or manually edit your HUD_config.xml.")) label = gtk.Label(_("To configure things like colouring you will still have to use the Preferences dialogue or manually edit your HUD_config.xml."))
diaHudTable.vbox.add(label) diaHudTable.vbox.add(label)
label.show() label.show()
self.hudConfiguratorTableContents=[] self.hudConfiguratorTableContents = []
table= gtk.Table(rows=self.hudConfiguratorRows+1, columns=self.hudConfiguratorColumns+1, homogeneous=True) table = gtk.Table(rows=self.hudConfiguratorRows + 1, columns=self.hudConfiguratorColumns + 1, homogeneous=True)
statDir=dir(Stats) statDir = dir(Stats)
statDict={} statDict = {}
for attr in statDir: for attr in statDir:
if attr.startswith('__'): continue if attr.startswith('__'):
continue
if attr in ("Charset", "Configuration", "Database", "GInitiallyUnowned", "gtk", "pygtk", if attr in ("Charset", "Configuration", "Database", "GInitiallyUnowned", "gtk", "pygtk",
"player", "c", "db_connection", "do_stat", "do_tip", "stat_dict", "player", "c", "db_connection", "do_stat", "do_tip", "stat_dict",
"h", "re", "re_Percent", "re_Places", "L10n", "log", "encoder", "codecs", "_", "sys", "logging"): continue "h", "re", "re_Percent", "re_Places", ):
statDict[attr]=eval("Stats.%s.__doc__" % (attr)) continue
statDict[attr] = eval("Stats.%s.__doc__" % (attr))
for rowNumber in range(self.hudConfiguratorRows+1): for rowNumber in range(self.hudConfiguratorRows + 1):
newRow=[] newRow = []
for columnNumber in range(self.hudConfiguratorColumns+1): for columnNumber in range(self.hudConfiguratorColumns + 1):
if rowNumber==0: if rowNumber == 0:
if columnNumber==0: if columnNumber == 0:
pass pass
else: else:
label=gtk.Label(_("column %d") % columnNumber) label = gtk.Label("column " + str(columnNumber))
table.attach(child=label, left_attach=columnNumber, right_attach=columnNumber+1, top_attach=rowNumber, bottom_attach=rowNumber+1) table.attach(child=label, left_attach=columnNumber,
right_attach=columnNumber + 1,
top_attach=rowNumber,
bottom_attach=rowNumber + 1)
label.show() label.show()
elif columnNumber==0: elif columnNumber == 0:
label=gtk.Label(_("row %d") % rowNumber) label = gtk.Label("row " + str(rowNumber))
table.attach(child=label, left_attach=columnNumber, right_attach=columnNumber+1, top_attach=rowNumber, bottom_attach=rowNumber+1) table.attach(child=label, left_attach=columnNumber,
right_attach=columnNumber + 1,
top_attach=rowNumber,
bottom_attach=rowNumber + 1)
label.show() label.show()
else: else:
comboBox = gtk.combo_box_new_text() comboBox = gtk.combo_box_new_text()
@ -488,15 +498,18 @@ class fpdb:
comboBox.set_active(0) comboBox.set_active(0)
newRow.append(comboBox) newRow.append(comboBox)
table.attach(child=comboBox, left_attach=columnNumber, right_attach=columnNumber+1, top_attach=rowNumber, bottom_attach=rowNumber+1) table.attach(child=comboBox, left_attach=columnNumber,
right_attach=columnNumber + 1,
top_attach=rowNumber,
bottom_attach=rowNumber + 1)
comboBox.show() comboBox.show()
if rowNumber!=0: if rowNumber != 0:
self.hudConfiguratorTableContents.append(newRow) self.hudConfiguratorTableContents.append(newRow)
diaHudTable.vbox.add(table) diaHudTable.vbox.add(table)
table.show() table.show()
response=diaHudTable.run() response = diaHudTable.run()
diaHudTable.destroy() diaHudTable.destroy()
if response == gtk.RESPONSE_ACCEPT: if response == gtk.RESPONSE_ACCEPT:
@ -506,16 +519,16 @@ class fpdb:
def storeNewHudStatConfig(self): def storeNewHudStatConfig(self):
"""stores selections made in diaHudConfiguratorTable""" """stores selections made in diaHudConfiguratorTable"""
self.obtain_global_lock("diaHudConfiguratorTable") self.obtain_global_lock("diaHudConfiguratorTable")
statTable=[] statTable = []
for row in self.hudConfiguratorTableContents: for row in self.hudConfiguratorTableContents:
newRow=[] newRow = []
for column in row: for column in row:
newField = column.get_active_text() newField = column.get_active_text()
newRow.append(newField) newRow.append(newField)
statTable.append(newRow) statTable.append(newRow)
self.config.editStats(self.hudConfiguratorGame,statTable) self.config.editStats(self.hudConfiguratorGame, statTable)
self.config.save() #TODO: make it not store in horrible formatting self.config.save() # TODO: make it not store in horrible formatting
self.release_global_lock() self.release_global_lock()
#end def storeNewHudStatConfig #end def storeNewHudStatConfig
@ -561,7 +574,7 @@ class fpdb:
diastring = _("Please confirm that you want to (re-)create the tables.") \ diastring = _("Please confirm that you want to (re-)create the tables.") \
+ (_(" If there already are tables in the database %s on %s they will be deleted and you will have to re-import your histories.\n") % (self.db.database, self.db.host)) \ + (_(" If there already are tables in the database %s on %s they will be deleted and you will have to re-import your histories.\n") % (self.db.database, self.db.host)) \
+ _("This may take a while.") + _("This may take a while.")
dia_confirm.format_secondary_text(diastring)#todo: make above string with bold for db, host and deleted dia_confirm.format_secondary_text(diastring) # todo: make above string with bold for db, host and deleted
# disable windowclose, do not want the the underlying processing interrupted mid-process # disable windowclose, do not want the the underlying processing interrupted mid-process
dia_confirm.set_deletable(False) dia_confirm.set_deletable(False)
@ -591,7 +604,7 @@ class fpdb:
def dia_recreate_hudcache(self, widget, data=None): def dia_recreate_hudcache(self, widget, data=None):
if self.obtain_global_lock("dia_recreate_hudcache"): if self.obtain_global_lock("dia_recreate_hudcache"):
self.dia_confirm = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, type=gtk.MESSAGE_WARNING, buttons=(gtk.BUTTONS_YES_NO), message_format=_("Confirm recreating HUD cache")) self.dia_confirm = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, type=gtk.MESSAGE_WARNING, buttons=(gtk.BUTTONS_YES_NO), message_format="Confirm recreating HUD cache")
diastring = _("Please confirm that you want to re-create the HUD cache.") diastring = _("Please confirm that you want to re-create the HUD cache.")
self.dia_confirm.format_secondary_text(diastring) self.dia_confirm.format_secondary_text(diastring)
# disable windowclose, do not want the the underlying processing interrupted mid-process # disable windowclose, do not want the the underlying processing interrupted mid-process
@ -599,7 +612,7 @@ class fpdb:
hb1 = gtk.HBox(True, 1) hb1 = gtk.HBox(True, 1)
self.h_start_date = gtk.Entry(max=12) self.h_start_date = gtk.Entry(max=12)
self.h_start_date.set_text( self.db.get_hero_hudcache_start() ) self.h_start_date.set_text(self.db.get_hero_hudcache_start())
lbl = gtk.Label(_(" Hero's cache starts: ")) lbl = gtk.Label(_(" Hero's cache starts: "))
btn = gtk.Button() btn = gtk.Button()
btn.set_image(gtk.image_new_from_stock(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)) btn.set_image(gtk.image_new_from_stock(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON))
@ -613,7 +626,7 @@ class fpdb:
hb2 = gtk.HBox(True, 1) hb2 = gtk.HBox(True, 1)
self.start_date = gtk.Entry(max=12) self.start_date = gtk.Entry(max=12)
self.start_date.set_text( self.db.get_hero_hudcache_start() ) self.start_date.set_text(self.db.get_hero_hudcache_start())
lbl = gtk.Label(_(" Villains' cache starts: ")) lbl = gtk.Label(_(" Villains' cache starts: "))
btn = gtk.Button() btn = gtk.Button()
btn.set_image(gtk.image_new_from_stock(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)) btn.set_image(gtk.image_new_from_stock(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON))
@ -633,7 +646,7 @@ class fpdb:
while gtk.events_pending(): while gtk.events_pending():
gtk.main_iteration_do(False) gtk.main_iteration_do(False)
self.db.rebuild_hudcache( self.h_start_date.get_text(), self.start_date.get_text() ) self.db.rebuild_hudcache(self.h_start_date.get_text(), self.start_date.get_text())
elif response == gtk.RESPONSE_NO: elif response == gtk.RESPONSE_NO:
print _('User cancelled rebuilding hud cache') print _('User cancelled rebuilding hud cache')
@ -643,11 +656,11 @@ class fpdb:
def dia_rebuild_indexes(self, widget, data=None): def dia_rebuild_indexes(self, widget, data=None):
if self.obtain_global_lock("dia_rebuild_indexes"): if self.obtain_global_lock("dia_rebuild_indexes"):
self.dia_confirm = gtk.MessageDialog(parent=self.window self.dia_confirm = gtk.MessageDialog(parent=self.window,
,flags=gtk.DIALOG_DESTROY_WITH_PARENT flags=gtk.DIALOG_DESTROY_WITH_PARENT,
,type=gtk.MESSAGE_WARNING type=gtk.MESSAGE_WARNING,
,buttons=(gtk.BUTTONS_YES_NO) buttons=(gtk.BUTTONS_YES_NO),
,message_format=_("Confirm rebuilding database indexes")) message_format=_("Confirm rebuilding database indexes"))
diastring = _("Please confirm that you want to rebuild the database indexes.") diastring = _("Please confirm that you want to rebuild the database indexes.")
self.dia_confirm.format_secondary_text(diastring) self.dia_confirm.format_secondary_text(diastring)
# disable windowclose, do not want the the underlying processing interrupted mid-process # disable windowclose, do not want the the underlying processing interrupted mid-process
@ -711,7 +724,6 @@ class fpdb:
self.logbuffer.insert(end_iter, text) self.logbuffer.insert(end_iter, text)
self.logview.scroll_to_mark(self.logbuffer.get_insert(), 0) self.logview.scroll_to_mark(self.logbuffer.get_insert(), 0)
def process_close_messages(self): def process_close_messages(self):
# check for close messages # check for close messages
try: try:
@ -866,28 +878,26 @@ class fpdb:
return menubar return menubar
#end def get_menu #end def get_menu
def load_profile(self, create_db=False):
def load_profile(self, create_db = False):
"""Loads profile from the provided path name.""" """Loads profile from the provided path name."""
self.config = Configuration.Config(file=options.config, dbname=options.dbname) self.config = Configuration.Config(file=options.config, dbname=options.dbname)
if self.config.file_error: if self.config.file_error:
self.warning_box(_("There is an error in your config file\n") + self.config.file self.warning_box(_("There is an error in your config file\n") + self.config.file
+ _("\n\nError is: ") + str(self.config.file_error) + _("\n\nError is: ") + str(self.config.file_error),
, diatitle=_("CONFIG FILE ERROR")) diatitle=_("CONFIG FILE ERROR"))
sys.exit() sys.exit()
log = Configuration.get_logger("logging.conf", "fpdb", log_dir=self.config.dir_log) log = Configuration.get_logger("logging.conf", "fpdb", log_dir=self.config.dir_log)
print (_("Logfile is %s\n") % os.path.join(self.config.dir_log, self.config.log_file)) print (_("Logfile is %s\n") % os.path.join(self.config.dir_log, self.config.log_file))
if self.config.example_copy: if self.config.example_copy:
self.info_box(_("Config file") self.info_box(_("Config file has been created at:\n%s.\n") % self.config.file
, _("has been created at:\n%s.\n") % self.config.file
+ _("Edit your screen_name and hand history path in the supported_sites section of the Preferences window (Main menu) before trying to import hands.")) + _("Edit your screen_name and hand history path in the supported_sites section of the Preferences window (Main menu) before trying to import hands."))
self.settings = {} self.settings = {}
self.settings['global_lock'] = self.lock self.settings['global_lock'] = self.lock
if (os.sep=="/"): if (os.sep == "/"):
self.settings['os']="linuxmac" self.settings['os'] = "linuxmac"
else: else:
self.settings['os']="windows" self.settings['os'] = "windows"
self.settings.update({'cl_options': cl_options}) self.settings.update({'cl_options': cl_options})
self.settings.update(self.config.get_db_parameters()) self.settings.update(self.config.get_db_parameters())
@ -897,10 +907,10 @@ class fpdb:
if self.db is not None and self.db.is_connected(): if self.db is not None and self.db.is_connected():
self.db.disconnect() self.db.disconnect()
self.sql = SQL.Sql(db_server = self.settings['db-server']) self.sql = SQL.Sql(db_server=self.settings['db-server'])
err_msg = None err_msg = None
try: try:
self.db = Database.Database(self.config, sql = self.sql) self.db = Database.Database(self.config, sql=self.sql)
if self.db.get_backend_name() == 'SQLite': if self.db.get_backend_name() == 'SQLite':
# tell sqlite users where the db file is # tell sqlite users where the db file is
print (_("Connected to SQLite: %s") % self.db.db_path) print (_("Connected to SQLite: %s") % self.db.db_path)
@ -937,7 +947,8 @@ class fpdb:
# sys.stderr.write("Failed to connect to %s database with username %s." % (self.settings['db-server'], self.settings['db-user'])) # sys.stderr.write("Failed to connect to %s database with username %s." % (self.settings['db-server'], self.settings['db-user']))
if self.db is not None and self.db.wrongDbVersion: if self.db is not None and self.db.wrongDbVersion:
diaDbVersionWarning = gtk.Dialog(title=_("Strong Warning - Invalid database version"), parent=None, flags=0, buttons=(gtk.STOCK_OK,gtk.RESPONSE_OK)) diaDbVersionWarning = gtk.Dialog(title=_("Strong Warning - Invalid database version"),
parent=None, flags=0, buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK))
label = gtk.Label(_("An invalid DB version or missing tables have been detected.")) label = gtk.Label(_("An invalid DB version or missing tables have been detected."))
diaDbVersionWarning.vbox.add(label) diaDbVersionWarning.vbox.add(label)
@ -962,14 +973,14 @@ class fpdb:
if self.db is not None and self.db.is_connected(): if self.db is not None and self.db.is_connected():
self.status_bar.set_text(_("Status: Connected to %s database named %s on host %s") self.status_bar.set_text(_("Status: Connected to %s database named %s on host %s")
% (self.db.get_backend_name(),self.db.database, self.db.host)) % (self.db.get_backend_name(), self.db.database, self.db.host))
# rollback to make sure any locks are cleared: # rollback to make sure any locks are cleared:
self.db.rollback() self.db.rollback()
self.validate_config() self.validate_config()
def obtain_global_lock(self, source): def obtain_global_lock(self, source):
ret = self.lock.acquire(source=source) # will return false if lock is already held ret = self.lock.acquire(source=source) # will return false if lock is already held
if ret: if ret:
print (_("\nGlobal lock taken by %s") % source) print (_("\nGlobal lock taken by %s") % source)
self.lockTakenBy=source self.lockTakenBy=source
@ -994,7 +1005,7 @@ class fpdb:
import _mysql_exceptions import _mysql_exceptions
if self.db is not None and self.db.is_connected(): if self.db is not None and self.db.is_connected():
self.db.disconnect() self.db.disconnect()
except _mysql_exceptions.OperationalError: # oh, damn, we're already disconnected except _mysql_exceptions.OperationalError: # oh, damn, we're already disconnected
pass pass
else: else:
if self.db is not None and self.db.is_connected(): if self.db is not None and self.db.is_connected():
@ -1003,12 +1014,12 @@ class fpdb:
pass pass
self.statusIcon.set_visible(False) self.statusIcon.set_visible(False)
self.window.destroy() # explicitly destroy to allow child windows to close cleanly self.window.destroy() # explicitly destroy to allow child windows to close cleanly
gtk.main_quit() gtk.main_quit()
def release_global_lock(self): def release_global_lock(self):
self.lock.release() self.lock.release()
self.lockTakenBy=None self.lockTakenBy = None
print _("Global lock released.\n") print _("Global lock released.\n")
def tab_auto_import(self, widget, data=None): def tab_auto_import(self, widget, data=None):
@ -1137,7 +1148,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
options.xloc = 0 options.xloc = 0
if options.yloc is None: if options.yloc is None:
options.yloc = 0 options.yloc = 0
self.window.move(options.xloc,options.yloc) self.window.move(options.xloc, options.yloc)
# connect to required events # connect to required events
self.window.connect("delete_event", self.delete_event) self.window.connect("delete_event", self.delete_event)
@ -1147,8 +1158,10 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
self.window.set_border_width(1) self.window.set_border_width(1)
defx, defy = 900, 720 defx, defy = 900, 720
sx, sy = gtk.gdk.screen_width(), gtk.gdk.screen_height() sx, sy = gtk.gdk.screen_width(), gtk.gdk.screen_height()
if sx < defx: defx = sx if sx < defx:
if sy < defy: defy = sy defx = sx
if sy < defy:
defy = sy
self.window.set_default_size(defx, defy) self.window.set_default_size(defx, defy)
self.window.set_resizable(True) self.window.set_resizable(True)
@ -1186,7 +1199,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
self.window.show() self.window.show()
self.visible = True # Flip on self.visible = True # Flip on
self.load_profile(create_db = True) self.load_profile(create_db=True)
# setup error logging # setup error logging
if not options.errorsToConsole: if not options.errorsToConsole:
@ -1199,7 +1212,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
# set up tray-icon and menu # set up tray-icon and menu
self.statusIcon = gtk.StatusIcon() self.statusIcon = gtk.StatusIcon()
# use getcwd() here instead of sys.path[0] so that py2exe works: # use getcwd() here instead of sys.path[0] so that py2exe works:
cards = os.path.join(os.getcwd(), '..','gfx','fpdb-cards.png') cards = os.path.join(os.getcwd(), '..', 'gfx', 'fpdb-cards.png')
if os.path.exists(cards): if os.path.exists(cards):
self.statusIcon.set_from_file(cards) self.statusIcon.set_from_file(cards)
self.window.set_icon_from_file(cards) self.window.set_icon_from_file(cards)
@ -1273,7 +1286,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
# Tell GTK not to propagate this signal any further # Tell GTK not to propagate this signal any further
return True return True
def statusicon_menu(self, widget, button, time, data = None): def statusicon_menu(self, widget, button, time, data=None):
# we don't need to pass data here, since we do keep track of most all # we don't need to pass data here, since we do keep track of most all
# our variables .. the example code that i looked at for this # our variables .. the example code that i looked at for this
# didn't use any long scope variables.. which might be an alright # didn't use any long scope variables.. which might be an alright
@ -1284,7 +1297,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
data.popup(None, None, None, 3, time) data.popup(None, None, None, 3, time)
pass pass
def statusicon_activate(self, widget, data = None): def statusicon_activate(self, widget, data=None):
# Let's allow the tray icon to toggle window visibility, the way # Let's allow the tray icon to toggle window visibility, the way
# most other apps work # most other apps work
if self.visible: if self.visible:
@ -1293,15 +1306,17 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
self.window.present() self.window.present()
def info_box(self, str1, str2): def info_box(self, str1, str2):
diapath = gtk.MessageDialog( parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, type=gtk.MESSAGE_INFO diapath = gtk.MessageDialog(parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, type=gtk.MESSAGE_INFO,
, buttons=(gtk.BUTTONS_OK), message_format=str1 ) buttons=(gtk.BUTTONS_OK), message_format=str1)
diapath.format_secondary_text(str2) diapath.format_secondary_text(str2)
response = diapath.run() response = diapath.run()
diapath.destroy() diapath.destroy()
return response return response
def warning_box(self, str, diatitle=_("FPDB WARNING")): def warning_box(self, str, diatitle=_("FPDB WARNING")):
diaWarning = gtk.Dialog(title=diatitle, parent=self.window, flags=gtk.DIALOG_DESTROY_WITH_PARENT, buttons=(gtk.STOCK_OK,gtk.RESPONSE_OK)) diaWarning = gtk.Dialog(title=diatitle, parent=self.window,
flags=gtk.DIALOG_DESTROY_WITH_PARENT,
buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK))
label = gtk.Label(str) label = gtk.Label(str)
diaWarning.vbox.add(label) diaWarning.vbox.add(label)
@ -1314,10 +1329,10 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
def validate_config(self): def validate_config(self):
# can this be removed now? # can this be removed now?
if self.config.get_import_parameters().get('saveStarsHH'): if self.config.get_import_parameters().get('saveStarsHH'):
hhbase = self.config.get_import_parameters().get("hhArchiveBase") hhbase = self.config.get_import_parameters().get("hhArchiveBase")
hhbase = os.path.expanduser(hhbase) hhbase = os.path.expanduser(hhbase)
#hhdir = os.path.join(hhbase,site) #hhdir = os.path.join(hhbase,site)
hhdir = hhbase hhdir = hhbase
if not os.path.isdir(hhdir): if not os.path.isdir(hhdir):
diapath = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=(gtk.BUTTONS_YES_NO), message_format="Setup hh dir") diapath = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=(gtk.BUTTONS_YES_NO), message_format="Setup hh dir")
diastring = _("WARNING: Unable to find output hand history directory %s\n\n Press YES to create this directory, or NO to select a new one.") % hhdir diastring = _("WARNING: Unable to find output hand history directory %s\n\n Press YES to create this directory, or NO to select a new one.") % hhdir
@ -1336,7 +1351,7 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
for site in self.config.get_supported_sites(True): # get site names from config file for site in self.config.get_supported_sites(True): # get site names from config file
try: try:
self.config.get_site_id(site) # and check against list from db self.config.get_site_id(site) # and check against list from db
except KeyError , exc: except KeyError, exc:
log.warning("site %s missing from db" % site) log.warning("site %s missing from db" % site)
dia = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=(gtk.BUTTONS_YES_NO), message_format="Unknown Site") dia = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=(gtk.BUTTONS_YES_NO), message_format="Unknown Site")
diastring = _("WARNING: Unable to find site '%s'\n\nPress YES to add this site to the database.") % site diastring = _("WARNING: Unable to find site '%s'\n\nPress YES to add this site to the database.") % site
@ -1347,15 +1362,15 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
self.add_site(site) self.add_site(site)
def add_site(self, site): def add_site(self, site):
dia = gtk.Dialog( title="Add Site", parent=self.window dia = gtk.Dialog(title="Add Site", parent=self.window,
, flags=gtk.DIALOG_DESTROY_WITH_PARENT flags=gtk.DIALOG_DESTROY_WITH_PARENT,
, buttons=(gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT buttons=(gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT,
,gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT) gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)
) )
h = gtk.HBox() h = gtk.HBox()
dia.vbox.pack_start(h, padding=5) # sets horizontal padding dia.vbox.pack_start(h, padding=5) # sets horizontal padding
label = gtk.Label( _("\nEnter short code for %s\n(up to 3 characters):\n") % site ) label = gtk.Label(_("\nEnter short code for %s\n(up to 3 characters):\n") % site)
h.pack_start(label, padding=20) # sets horizontal padding h.pack_start(label, padding=20) # sets horizontal padding
#label.set_alignment(1.0, 0.5) #label.set_alignment(1.0, 0.5)
@ -1365,8 +1380,8 @@ You can find the full license texts in agpl-3.0.txt, gpl-2.0.txt, gpl-3.0.txt an
e_code.set_width_chars(5) e_code.set_width_chars(5)
h.pack_start(e_code, True, False, padding=5) h.pack_start(e_code, True, False, padding=5)
label = gtk.Label( "" ) label = gtk.Label("")
dia.vbox.add(label) # create space below entry, maybe padding arg above makes this redundant? dia.vbox.add(label) # create space below entry, maybe padding arg above makes this redundant?
dia.show_all() dia.show_all()
response = dia.run() response = dia.run()