diff --git a/data/glade-translations b/data/glade-translations index 020d0e77..0d636dd9 100644 --- a/data/glade-translations +++ b/data/glade-translations @@ -69,3 +69,8 @@ gchar *s = N_("Change..."); gchar *s = N_("Change..."); gchar *s = N_("Change..."); gchar *s = N_("Change..."); +gchar *s = N_("Sound settings"); +gchar *s = N_("Sound enabled"); +gchar *s = N_("Sample volume:"); +gchar *s = N_("Music volume:"); +gchar *s = N_("Enable samles"); diff --git a/data/pysolfc.glade b/data/pysolfc.glade index cd69eb3d..39103dba 100644 --- a/data/pysolfc.glade +++ b/data/pysolfc.glade @@ -1850,7 +1850,7 @@ 1 GTK_UPDATE_CONTINUOUS False - 1 0.2 10 0.1 1 1 + 1 0.2 10 0.1 1 0 @@ -1872,7 +1872,7 @@ 1 GTK_UPDATE_CONTINUOUS False - 1 0.2 10 0.1 1 1 + 1 0.2 10 0.1 1 0 @@ -1894,7 +1894,7 @@ 1 GTK_UPDATE_CONTINUOUS False - 1 0.2 10 0.1 1 1 + 1 0.2 10 0.1 1 0 @@ -1916,7 +1916,7 @@ 1 GTK_UPDATE_CONTINUOUS False - 1 0.2 10 0.1 1 1 + 1 0.2 10 0.1 1 0 @@ -1938,7 +1938,7 @@ 1 GTK_UPDATE_CONTINUOUS False - 1 0.2 10 0.1 1 1 + 1 0.2 10 0.1 1 0 @@ -1960,7 +1960,7 @@ 1 GTK_UPDATE_CONTINUOUS False - 1 0.2 10 0.1 1 1 + 1 0.2 10 0.1 1 0 @@ -4121,4 +4121,305 @@ + + Sound settings + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_CENTER_ON_PARENT + True + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + True + True + True + gtk-apply + True + GTK_RELIEF_NORMAL + True + -10 + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + 4 + 3 + False + 0 + 0 + + + + 4 + True + True + Sound enabled + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 0 + 3 + 0 + 1 + fill + + + + + + + True + Sample volume: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 4 + 4 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + Music volume: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 4 + 4 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + True + 1 + 0 + True + GTK_UPDATE_ALWAYS + False + False + 1 0 128 1 10 10 + + + + 2 + 3 + 1 + 2 + fill + + + + + + + 120 + True + True + False + GTK_POS_TOP + 0 + GTK_UPDATE_CONTINUOUS + False + 0 0 128 1 10 0 + + + + 1 + 2 + 2 + 3 + 4 + fill + + + + + + 120 + True + True + False + GTK_POS_TOP + 0 + GTK_UPDATE_CONTINUOUS + False + 0 0 128 1 10 0 + + + + 1 + 2 + 1 + 2 + 4 + fill + + + + + + True + True + 1 + 0 + True + GTK_UPDATE_ALWAYS + False + False + 1 0 128 1 10 10 + + + + 2 + 3 + 2 + 3 + fill + + + + + + + 4 + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + True + 10 + 2 + False + 0 + 0 + + + + + + True + Enable samles + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + label_item + + + + + 0 + 3 + 3 + 4 + fill + + + + + 0 + True + True + + + + + + diff --git a/pysollib/actions.py b/pysollib/actions.py index a91fa60d..2fd02925 100644 --- a/pysollib/actions.py +++ b/pysollib/actions.py @@ -58,7 +58,6 @@ from pysoltk import MfxMessageDialog, MfxSimpleEntry from pysoltk import MfxExceptionDialog from pysoltk import MfxRadioMenuItem, MfxCheckMenuItem, StringVar from pysoltk import PlayerOptionsDialog -from pysoltk import SoundOptionsDialog #from pysoltk import HintOptionsDialog from pysoltk import TimeoutsDialog from pysoltk import ColorsDialog @@ -805,15 +804,20 @@ class PysolMenubarActions: self.game.updateStatus(player=self.app.opt.player) self.game.updateStatus(stats=self.app.stats.getStats(self.app.opt.player, self.game.id)) - def mOptSoundDialog(self, *args): - if self._cancelDrag(break_pause=False): return - d = SoundOptionsDialog(self.top, _("Sound settings"), self.app) - self.tkopt.sound.set(self.app.opt.sound) - ## def mOptIrregularPiles(self, *args): ## if self._cancelDrag(): return ## self.app.opt.irregular_piles = self.tkopt.irregular_piles.get() + def _mOptTableTile(self, i): + if self.app.setTile(i): + self.tkopt.tabletile.set(i) + + def _mOptTableColor(self, color): + tile = self.app.tabletile_manager.get(0) + tile.color = color + if self.app.setTile(0): + self.tkopt.tabletile.set(0) + def mOptColors(self, *args): if self._cancelDrag(break_pause=False): return d = ColorsDialog(self.top, _("Set colors"), self.app) diff --git a/pysollib/pysolgtk/menubar.py b/pysollib/pysolgtk/menubar.py index 26f817af..f833c920 100644 --- a/pysollib/pysolgtk/menubar.py +++ b/pysollib/pysolgtk/menubar.py @@ -44,6 +44,7 @@ from pysollib.settings import PACKAGE # toolkit imports from tkutil import setTransient from tkutil import color_tk2gtk, color_gtk2tk +from soundoptionsdialog import SoundOptionsDialog from selectcardset import SelectCardsetDialogWithPreview from selecttile import SelectTileDialogWithPreview @@ -190,12 +191,15 @@ class PysolMenubar(PysolMenubarActions): ('playeroptions', None, ltk2gtk('&Player options...'), None, None,self.mOptPlayerOptions), - ('tabletile', None, - ltk2gtk('Table t&ile...'), None, - None,self.mOptTableTile), + ('sound', None, + ltk2gtk('&Sound...'), None, + None, self.mOptSoundDialog), ('cardset', None, ltk2gtk('Cards&et...'), 'E', None, self.mSelectCardsetDialog), + ('tabletile', None, + ltk2gtk('Table t&ile...'), None, + None, self.mOptTableTile), ('fonts', None, ltk2gtk('&Fonts...'), None, None, self.mOptFonts), @@ -360,8 +364,9 @@ class PysolMenubar(PysolMenubarActions): - + + @@ -431,6 +436,10 @@ class PysolMenubar(PysolMenubarActions): menu = ui_manager.get_widget('/menubar/select').get_submenu() self._createSelectMenu(games, menu) + if self.app.audio.audiodev is None: + item = ui_manager.get_widget('/menubar/options/sound') + item.set_sensitive(False) + menubar = ui_manager.get_widget('/menubar') return menubar @@ -751,6 +760,11 @@ class PysolMenubar(PysolMenubarActions): self.game.quitGame(d.gameid, random=d.random) + def mOptSoundDialog(self, *args): + if self._cancelDrag(break_pause=False): return + d = SoundOptionsDialog(self.top, _('Sound settings'), self.app) + + def mOptTableTile(self, *args): if self._cancelDrag(break_pause=False): return key = self.app.tabletile_index @@ -762,11 +776,15 @@ class PysolMenubar(PysolMenubarActions): key=key) if d.status == 0 and d.button in (0, 1): if type(d.key) is str: - tile = self.app.tabletile_manager.get(0) - tile.color = color - self.app.setTile(0) + self._mOptTableColor(d.key) elif d.key > 0 and d.key != self.app.tabletile_index: - self.app.setTile(i) + self._mOptTableTile(d.key) +## if type(d.key) is str: +## tile = self.app.tabletile_manager.get(0) +## tile.color = d.color +## self.app.setTile(0) +## elif d.key > 0 and d.key != self.app.tabletile_index: +## self.app.setTile(i) def mSelectCardsetDialog(self, *event): diff --git a/pysollib/pysolgtk/pysoltree.py b/pysollib/pysolgtk/pysoltree.py index eea69282..430eb945 100644 --- a/pysollib/pysolgtk/pysoltree.py +++ b/pysollib/pysolgtk/pysoltree.py @@ -83,11 +83,11 @@ class PysolTreeView: selection = self.treeview.get_selection() ##selection.select_path(self._selected_row) ##selection.unselect_all() - gtk.idle_add(selection.select_path, self._selected_row) + gobject.idle_add(selection.select_path, self._selected_row) if self._vadjustment_position is not None: ##self.sw_vadjustment.set_value(self._vadjustment_position) - gtk.idle_add(self.sw_vadjustment.set_value, - self._vadjustment_position) + gobject.idle_add(self.sw_vadjustment.set_value, + self._vadjustment_position) def _saveExpandedRows(self): diff --git a/pysollib/pysolgtk/selecttile.py b/pysollib/pysolgtk/selecttile.py index 08c52d6b..4c6fa3f9 100644 --- a/pysollib/pysolgtk/selecttile.py +++ b/pysollib/pysolgtk/selecttile.py @@ -146,18 +146,17 @@ class SelectTileDialogWithPreview(MfxDialog): ##canvas.deleteAllItems() if type(key) is str: # solid color + canvas.setTile(self.app, 0, force=True) canvas.config(bg=key) - canvas.setBackgroundImage(None) - canvas.setTextColor(None) + ##canvas.setTextColor(None) self.preview_key = key - self.colors['table'] = key + self.table_color = key else: # image - tile = self.manager.get(key) - if tile: - if self.preview.setTile(self.app, key): - return - self.preview_key = -1 + if self.preview.setTile(self.app, key): + self.preview_key = key + else: + self.preview_key = -1 def initKw(self, kw): @@ -206,7 +205,7 @@ class SelectTileDialogWithPreview(MfxDialog): self.key = self.preview_key self.status = 0 self.button = b - self.hide() + ##self.hide() self.quit() diff --git a/pysollib/pysolgtk/soundoptionsdialog.py b/pysollib/pysolgtk/soundoptionsdialog.py index 572b6a20..619b428f 100644 --- a/pysollib/pysolgtk/soundoptionsdialog.py +++ b/pysollib/pysolgtk/soundoptionsdialog.py @@ -1,13 +1,7 @@ -## vim:ts=4:et:nowrap -## ##---------------------------------------------------------------------------## ## ## PySol -- a Python Solitaire game ## -## Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer -## Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer -## Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer -## ## 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 @@ -23,28 +17,139 @@ ## If not, write to the Free Software Foundation, Inc., ## 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## -## Markus F.X.J. Oberhumer -## -## http://wildsau.idv.uni-linz.ac.at/mfx/pysol.html -## ##---------------------------------------------------------------------------## # imports import os, sys import gtk +from gtk import glade # PySol imports # Toolkit imports from tkwidget import MfxDialog +gettext = _ + # /*********************************************************************** # // # ************************************************************************/ -class SoundOptionsDialog(MfxDialog): +class SoundOptionsDialog: def __init__(self, parent, title, app, **kw): - pass + saved_opt = app.opt.copy() + + glade_file = app.dataloader.findFile('pysolfc.glade') + self.widgets_tree = gtk.glade.XML(glade_file) + + keys = [ + ('areyousure', _('Are You Sure')), + + ('deal', _('Deal')), + ('dealwaste', _('Deal waste')), + + ('turnwaste', _('Turn waste')), + ('startdrag', _('Start drag')), + + ('drop', _('Drop')), + ('droppair', _('Drop pair')), + ('autodrop', _('Auto drop')), + + ('flip', _('Flip')), + ('autoflip', _('Auto flip')), + ('move', _('Move')), + ('nomove', _('No move')), + + ('undo', _('Undo')), + ('redo', _('Redo')), + + ('autopilotlost', _('Autopilot lost')), + ('autopilotwon', _('Autopilot won')), + + ('gamefinished', _('Game finished')), + ('gamelost', _('Game lost')), + ('gamewon', _('Game won')), + ('gameperfect', _('Perfect game')), + ] + + table = self.widgets_tree.get_widget('samples_table') + samples_checkbuttons = {} + row = 0 + col = 0 + for n, t in keys: + check = gtk.CheckButton(t) + check.show() + check.set_active(app.opt.sound_samples[n]) + samples_checkbuttons[n] = check + table.attach(check, + col, col+1, row, row+1, + gtk.FILL|gtk.EXPAND, gtk.FILL, + 4, 4) + if col == 1: + col = 0 + row += 1 + else: + col = 1 + + w = self.widgets_tree.get_widget('enable_checkbutton') + w.set_active(app.opt.sound) + dic = {} + for n in 'sample', 'music': + def callback(w, n=n): + sp = self.widgets_tree.get_widget(n+'_spinbutton') + sc = self.widgets_tree.get_widget(n+'_scale') + sp.set_value(sc.get_value()) + dic[n+'_scale_value_changed'] = callback + def callback(w, n=n): + sp = self.widgets_tree.get_widget(n+'_spinbutton') + sc = self.widgets_tree.get_widget(n+'_scale') + sc.set_value(sp.get_value()) + dic[n+'_spinbutton_value_changed'] = callback + self.widgets_tree.signal_autoconnect(dic) + w = self.widgets_tree.get_widget('sample_spinbutton') + w.set_value(app.opt.sound_sample_volume) + w = self.widgets_tree.get_widget('music_spinbutton') + w.set_value(app.opt.sound_music_volume) + + self._translateLabels() + + dialog = self.widgets_tree.get_widget('sounds_dialog') + dialog.set_title(title) + dialog.set_transient_for(parent) + + while True: # for `apply' + response = dialog.run() + if response in (gtk.RESPONSE_OK, gtk.RESPONSE_APPLY): + w = self.widgets_tree.get_widget('enable_checkbutton') + app.opt.sound = w.get_active() + w = self.widgets_tree.get_widget('sample_spinbutton') + app.opt.soun_sample_volume = w.get_value() + w = self.widgets_tree.get_widget('music_spinbutton') + app.opt.sound_music_volume = w.get_value() + for n, t in keys: + w = samples_checkbuttons[n] + app.opt.sound_samples[n] = w.get_active() + else: + app.opt = saved_opt + if app.audio: + app.audio.updateSettings() + if response == gtk.RESPONSE_APPLY: + app.audio.playSample('drop', priority=1000) + if response != gtk.RESPONSE_APPLY: + dialog.destroy() + break + + + def _translateLabels(self): + for n in ( + 'label76', + 'label77', + 'label78', + ): + w = self.widgets_tree.get_widget(n) + w.set_text(gettext(w.get_text())) + w = self.widgets_tree.get_widget('enable_checkbutton') + w.set_label(gettext(w.get_label())) diff --git a/pysollib/pysolgtk/tkcanvas.py b/pysollib/pysolgtk/tkcanvas.py index 0769fdfc..da2dd8ff 100644 --- a/pysollib/pysolgtk/tkcanvas.py +++ b/pysollib/pysolgtk/tkcanvas.py @@ -302,7 +302,9 @@ class MfxCanvas(gnome.canvas.Canvas): self._text_color = '#000000' # gnome.canvas.Canvas.__init__(self) - self.top_bg = top.style.bg[gtk.STATE_NORMAL] + c = top.style.bg[gtk.STATE_NORMAL] + c = '#%02x%02x%02x' % (c.red/256, c.green/256, c.blue/256) + self.top_bg = c if bg is not None: self.modify_bg(gtk.STATE_NORMAL, gdk.color_parse(bg)) @@ -419,8 +421,8 @@ class MfxCanvas(gnome.canvas.Canvas): # PySol extension - set a tiled background image def setTile(self, app, i, force=False): + ##print 'setTile:', i tile = app.tabletile_manager.get(i) - ##print 'setTile', i, tile if tile is None or tile.error: return False if i == 0: @@ -439,9 +441,7 @@ class MfxCanvas(gnome.canvas.Canvas): # self._tile = tile if i == 0: - if self.__tileimage: - self.__tileimage.destroy() - self.__tileimage = None + self.setBackgroundImage(None) self.configure(bg=tile.color) ##app.top.config(bg=tile.color) color = None @@ -473,7 +473,7 @@ class MfxCanvas(gnome.canvas.Canvas): self.realize() ##return False - gtk.idle_add(self.setBackgroundImage, filename, stretch) + gobject.idle_add(self.setBackgroundImage, filename, stretch) def setBackgroundImage(self, filename, stretch=False): diff --git a/pysollib/pysolgtk/tkutil.py b/pysollib/pysolgtk/tkutil.py index 489f7a8a..c695c833 100644 --- a/pysollib/pysolgtk/tkutil.py +++ b/pysollib/pysolgtk/tkutil.py @@ -266,7 +266,7 @@ def unbind_destroy(widget): # ************************************************************************/ def after(widget, ms, func, *args): - timer = gtk.timeout_add(ms, func, *args) + timer = gobject.timeout_add(ms, func, *args) return timer def after_idle(widget, func, *args): @@ -275,7 +275,7 @@ def after_idle(widget, func, *args): def after_cancel(t): if t is not None: - gtk.timeout_remove(t) + gobject.source_remove(t) # /*********************************************************************** diff --git a/pysollib/tk/menubar.py b/pysollib/tk/menubar.py index 55b906d0..6b49aa47 100644 --- a/pysollib/tk/menubar.py +++ b/pysollib/tk/menubar.py @@ -37,7 +37,7 @@ __all__ = ['PysolMenubar'] # imports -import math, os, re, types +import math, os, re import Tkinter, tkColorChooser, tkFileDialog # PySol imports @@ -53,8 +53,8 @@ from pysollib.pysolaudio import pysolsoundserver from tkconst import EVENT_HANDLED, EVENT_PROPAGATE, CURSOR_WATCH, COMPOUNDS from tkutil import bind, after_idle from selectgame import SelectGameDialog, SelectGameDialogWithPreview +from soundoptionsdialog import SoundOptionsDialog from selectcardset import SelectCardsetDialogWithPreview -from selectcardset import SelectCardsetByTypeDialogWithPreview from selecttile import SelectTileDialogWithPreview #from toolbar import TOOLBAR_BUTTONS @@ -895,6 +895,11 @@ class PysolMenubar(PysolMenubarActions): self.game.saveGame(filename) self.updateMenus() + def mOptSoundDialog(self, *args): + if self._cancelDrag(break_pause=False): return + d = SoundOptionsDialog(self.top, _("Sound settings"), self.app) + self.tkopt.sound.set(self.app.opt.sound) + def mOptAutoFaceUp(self, *args): if self._cancelDrag(): return self.app.opt.autofaceup = self.tkopt.autofaceup.get() @@ -1036,19 +1041,9 @@ class PysolMenubar(PysolMenubarActions): def mOptChangeCardback(self, *event): self._mOptCardback(self.app.cardset.backindex + 1) - def _mOptTableTile(self, i): - if self.app.setTile(i): - self.tkopt.tabletile.set(i) - - def _mOptTableColor(self, color): - tile = self.app.tabletile_manager.get(0) - tile.color = color - if self.app.setTile(0): - self.tkopt.tabletile.set(0) - - def mOptTableTile(self, *event): - if self._cancelDrag(break_pause=False): return - self._mOptTableTile(self.tkopt.tabletile.get()) +## def mOptTableTile(self, *event): +## if self._cancelDrag(break_pause=False): return +## self._mOptTableTile(self.tkopt.tabletile.get()) def mOptChangeTableTile(self, *event): if self._cancelDrag(break_pause=False): return @@ -1067,7 +1062,7 @@ class PysolMenubar(PysolMenubarActions): manager=self.app.tabletile_manager, key=key) if d.status == 0 and d.button in (0, 1): - if type(d.key) is types.StringType: + if type(d.key) is str: self._mOptTableColor(d.key) elif d.key > 0 and d.key != self.app.tabletile_index: self._mOptTableTile(d.key) diff --git a/pysollib/tk/selecttile.py b/pysollib/tk/selecttile.py index e2982604..1ebfde57 100644 --- a/pysollib/tk/selecttile.py +++ b/pysollib/tk/selecttile.py @@ -190,7 +190,7 @@ class SelectTileDialogWithPreview(MfxDialog): return canvas = self.preview.canvas canvas.deleteAllItems() - if type(key) in types.StringTypes: + if type(key) in str: # solid color canvas.config(bg=key) canvas.setTile(None)