#!/usr/bin/python # -*- coding: UTF-8 -*- ########################################################################### # wineconfig.py - description # # ------------------------------ # # begin : Fri Mar 26 2004 # # copyright : (C) 2006 by Yuriy Kozlov # # email : yuriy.kozlov@gmail.com # # # ########################################################################### # # # 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. # # # ########################################################################### from qt import * from tdecore import * from tdeui import * from kfile import * from kio import * #import string #import math import os import shutil #import select import sys #import struct #import csv #import time import signal #import shutil import wineread import winewrite import drivedetect import wineconfig programname = "Wine Configuration" version = "0.7.1" default_winepath = os.environ['HOME'] + "/.wine" # Are we running as a separate standalone application or in KControl? standalone = __name__=='__main__' # Editing application specific settings? For which application? application = None # Running as the root user or not? Doesn't matter for wine isroot = os.getuid()==0 ############################################################################ if standalone: programbase = KDialogBase else: programbase = KCModule ############################################################################ class WineConfigApp(programbase): ######################################################################## def __init__(self,parent=None,name=None): global standalone,kapp,default_winepath,application KGlobal.locale().insertCatalogue("guidance") if standalone: KDialogBase.__init__(self,KJanusWidget.Tabbed,"Wine Configuration",\ KDialogBase.Apply|KDialogBase.User1|KDialogBase.User2|KDialogBase.Close, KDialogBase.Close) self.setButtonText(KDialogBase.User1,i18n("Reset")) self.setButtonText(KDialogBase.User2,i18n("About")) args = KCmdLineArgs.parsedArgs() if args.count() > 0: application = args.arg(0) else: KCModule.__init__(self,parent,name) self.setButtons(KCModule.Apply|KCModule.Reset) self.aboutdata = MakeAboutData() # Create a configuration object. self.config = KConfig("wineconfigrc") # Compact mode means that we have to make the GUI # much smaller to fit on low resolution screens. self.compact_mode = kapp.desktop().height()<=600 KGlobal.iconLoader().addAppDir("guidance") self.wineconfigchanged = False self.updatingGUI = True if not wineread.GetWineBuildPath(): install = KMessageBox.questionYesNo(self, \ i18n("It appears that you do not have Wine installed. Wine " + \ "can be used to run some programs designed for Windows. " + \ "Would you " + \ "like to install it?\n" + \ "You will need administrative privileges, and the " + \ "community-maintained (universe) repository will be enabled."), \ i18n("Windows Applications")) if install == KMessageBox.Yes: self.InstallWine() wineread.SetWineBuildPath(wineread.GetWineBuildPath()) if wineread.GetWineBuildPath(): # wine doesn't set the WINEPREFIX globally, but just in case... wineprefix = os.environ.get('WINEPREFIX',default_winepath) newrc = not self.config.hasKey("ColorScheme") firstrun = not wineread.VerifyWineDrive(wineprefix) if firstrun: KMessageBox.information(self, \ i18n("It appears that you do not yet have a Windows drive set up. " + \ "A fake Windows installation will be created for you in " + \ wineprefix + "\nThis may take up to a minute."), \ i18n("Setting up your Windows drive")) self.CreateWindowsInstall() self._buildGUI() if firstrun and newrc: self.appearancepage.slotColorSchemeActivated(1) else: self._buildGUI_noWine() self.aboutus = KAboutApplication(self) if standalone: self.enableButton(KDialogBase.User1,False) # Reset button self.enableButtonApply(False) # Apply button self.updatingGUI = False def _buildGUI(self): global standalone,application if not standalone: toplayout = QVBoxLayout( self, 0, KDialog.spacingHint() ) tabcontrol = QTabWidget(self) toplayout.addWidget(tabcontrol) toplayout.setStretchFactor(tabcontrol,1) #--- General tab --- tabname = i18n("General") if standalone: general1page = self.addGridPage(1,QGrid.Horizontal,tabname) general1page.setSpacing(0) self.generalpage = GeneralPage(general1page,self.compact_mode) else: self.generalpage = GeneralPage(tabcontrol,self.compact_mode) self.generalpage.setMargin(KDialog.marginHint()) # Connect all PYSIGNALs from GeneralPage Widget to appropriate actions. self.connect(self.generalpage,PYSIGNAL("changedSignal()"),self._sendChangedSignal) if not standalone: tabcontrol.addTab(self.generalpage,tabname) #--- Drives tab --- if not application: tabname = i18n("Drives && Directories") if standalone: drives1page = self.addGridPage(1,QGrid.Horizontal,tabname) drives1page.setSpacing(0) self.drivespage = DrivesPage(drives1page,self.compact_mode) else: self.drivespage = DrivesPage(tabcontrol,self.compact_mode) self.drivespage.setMargin(KDialog.marginHint()) # Connect all PYSIGNALs from DrivesPage Widget to appropriate actions. self.connect(self.drivespage,PYSIGNAL("changedSignal()"),self._sendChangedSignal) if not standalone: tabcontrol.addTab(self.drivespage,tabname) #--- Audio tab --- tabname = i18n("Audio") if standalone: audio1page = self.addGridPage(1,QGrid.Horizontal,tabname) self.audiopage = AudioPage(audio1page) else: self.audiopage = AudioPage(tabcontrol) self.audiopage.setMargin(KDialog.marginHint()) # Connect all PYSIGNALs from AudioPage Widget to appropriate actions. self.connect(self.audiopage,PYSIGNAL("changedSignal()"),self._sendChangedSignal) if not standalone: tabcontrol.addTab(self.audiopage,tabname) #--- Graphics tab --- tabname = i18n("Graphics") if standalone: graphics1page = self.addGridPage(1,QGrid.Horizontal,tabname) self.graphicspage = GraphicsPage(graphics1page) else: self.graphicspage = GraphicsPage(tabcontrol) self.graphicspage.setMargin(KDialog.marginHint()) # Connect all PYSIGNALs from GraphicsPage Widget to appropriate actions. self.connect(self.graphicspage,PYSIGNAL("changedSignal()"),self._sendChangedSignal) if not standalone: tabcontrol.addTab(self.graphicspage,tabname) #--- Appearance tab --- if not application: tabname = i18n("Appearance") if standalone: appearance1page = self.addGridPage(1,QGrid.Horizontal,tabname) self.appearancepage = AppearancePage(appearance1page) else: self.appearancepage = AppearancePage(tabcontrol) self.appearancepage.setMargin(KDialog.marginHint()) # Connect all PYSIGNALs from DesktopPage Widget to appropriate actions. self.connect(self.appearancepage,PYSIGNAL("changedSignal()"),self._sendChangedSignal) self.graphicspage.connect(self.graphicspage.allowwmcheckbox, SIGNAL("toggled(bool)"), self.appearancepage.slotFillItemCombo) self.connect(self.graphicspage.emudesktopcheckbox, SIGNAL("toggled(bool)"), self.appearancepage.slotFillItemComboDesktop) self.appearancepage.slotFillItemComboDesktop(\ self.graphicspage.currentemudesktop) if not standalone: tabcontrol.addTab(self.appearancepage,tabname) #--- Applications tab --- if not application: tabname = i18n("Applications") if standalone: apps1page = self.addGridPage(1,QGrid.Horizontal,tabname) self.appspage = ApplicationsPage(apps1page) else: self.appspage = ApplicationsPage(tabcontrol) self.appspage.setMargin(KDialog.marginHint()) # Connect all PYSIGNALs from ApplicationsPage Widget to appropriate actions. self.connect(self.appspage,PYSIGNAL("changedSignal()"),self._sendChangedSignal) if not standalone: tabcontrol.addTab(self.appspage,tabname) #--- Libraries tab --- tabname = i18n("Libraries") if standalone: libs1page = self.addGridPage(1,QGrid.Horizontal,tabname) self.libspage = LibrariesPage(libs1page) else: self.libspage = LibrariesPage(tabcontrol) self.libspage.setMargin(KDialog.marginHint()) # Connect all PYSIGNALs from LibrariesPage Widget to appropriate actions. self.connect(self.libspage,PYSIGNAL("changedSignal()"),self._sendChangedSignal) if not standalone: tabcontrol.addTab(self.libspage,tabname) def _buildGUI_noWine(self): """ Displays an error that wine is not installed """ global standalone if not standalone: toplayout = QVBoxLayout( self, 0, KDialog.spacingHint() ) if not standalone: nowinewarning = QLabel(self,"nowinewarning") toplayout.addWidget(nowinewarning) else: vbox = self.addVBoxPage ("Wine Not Installed") nowinewarning = QLabel(vbox,"nowinewarning") nowinewarning.setText(i18n("It appears that you do not have wine " +\ "installed.\nwine " + \ "can be used to run some programs designed for " + \ "Windows.\nPlease " +\ "install the wine package to get this functionality.")) nowinewarning.setFrameStyle( QFrame.Box | QFrame.Raised ) def InstallWine(self): """ Allows the user to enable the proper repositories and install wine. Currently Kubuntu specific, requires tdesudo, adept_batch and software-properties-kde """ if not isroot: if os.system("tdesudo \"software-properties-kde --enable-component universe\""): KMessageBox.error(self, i18n("There was a problem running " + \ "software-properties-kde. Make sure " + \ "software-properties-kde is installed.")) elif os.system("tdesudo \"adept_batch install wine\""): KMessageBox.error(self, i18n("There was a problem running " + \ "adept_batch. Make sure " + \ "Adept is installed.")) else: if os.system("software-properties-kde --enable-component=universe" + \ " && adept_batch install wine"): KMessageBox.error(self, i18n("There was a problem running " + \ "software-properties-kde and adept_batch. Make sure " + \ "Adept and software-properties-kde are installed.")) def CreateWindowsInstall(self,winepath = None): if not winepath: winepath = default_winepath winewrite.CreateWineDrive(winepath) wineread.SetWinePath(winepath) drives = wineread.LoadDrives() autodrives = drivedetect.autodetect(drives) autoshelllinks = drivedetect.autodetectshelllinks() if autodrives[0] == 1: KMessageBox.sorry(self, \ i18n("There were not enough letters to add all the autodetected drives.")) drives = autodrives[1] drives[26:] = autoshelllinks winewrite.SetDriveMappings(drives) winewrite.SetAudioDriver('alsa') dsoundsettings = {"HardwareAcceleration":"Full", "DefaultSampleRate":"44100", "DefaultBitsPerSample":"8", "EmulDriver":"N"} winewrite.SetDSoundSettings(dsoundsettings) windowsettings = {"DXGrab":"N", "DesktopDoubleBuffered":"Y", "Managed":"Y", "Desktop":""} winewrite.SetWindowSettings(windowsettings) d3dsettings = {"VertexShaderMode":"hardware", "PixelShaderMode":"Y", "UseGLSL":"enabled"} winewrite.SetD3DSettings(d3dsettings) winewrite.SetWinVersion(wineread.winversions[1]) # Removed pending a patch to winebrowser #winewrite.SetFirstBrowser("kfmclient exec") #winewrite.SetFirstMailer("kfmclient exec") def exec_loop(self,appname): global application, programbase if appname: application = appname KDialogBase.exec_loop(self) else: programbase.exec_loop(self) def save(self): # KCModule # Find out what's changed generalchanged = self.generalpage.isChanged() driveschanged = not application and self.drivespage.isChanged() audiochanged = self.audiopage.isChanged() graphicschanged = self.graphicspage.isChanged() appearancechanged = not application and self.appearancepage.isChanged() applicationschanged = not application and self.appspage.isChanged() libschanged = self.libspage.isChanged() # Apply changes for each tab if generalchanged: self.generalpage.applyChanges() if driveschanged: self.drivespage.applyChanges() if audiochanged: self.audiopage.applyChanges() if graphicschanged: self.graphicspage.applyChanges() if appearancechanged: self.appearancepage.applyChanges() if applicationschanged: self.appspage.applyChanges() if libschanged: self.libspage.applyChanges() self._sendChangedSignal() def slotApply(self): # KDialogBase self.save() def slotClose(self): # KDialogBase KDialogBase.slotClose(self) def load(self): # KCModule self.__reset() self._sendChangedSignal() def slotUser1(self): # Reset button, KDialogBase self.load() def slotUser2(self): # About button, KDialogBase self.aboutus.show() def __reset(self): # Reset each configuration page if not application: self.drivespage.reset() self.audiopage.reset() self.graphicspage.reset() self.appearancepage.reset() if not application: self.appspage.reset() self.libspage.reset() # Kcontrol expects updates about whether the contents have changed. # Also we fake the Apply and Reset buttons here when running outside kcontrol. def _sendChangedSignal(self): global standalone changed = False changed = changed or (not application and self.drivespage.isChanged()) or \ self.audiopage.isChanged() \ or self.generalpage.isChanged() or \ (not application and self.appspage.isChanged()) or \ self.libspage.isChanged() or \ (not application and self.appearancepage.isChanged()) graphicschanged = self.graphicspage.isChanged() changed = changed or graphicschanged if standalone: self.enableButton(KDialogBase.User1,changed) # Reset button self.enableButtonApply(changed) # Apply button else: self.emit(SIGNAL("changed(bool)"), (changed,) ) ############################################################################ ''' Not used. class ErrorPage(QWidget): """ Displayed when there is no fake Windows drive """ def __init__(self,parent = None, name = None, parentapp = None, modal = 0,fl=0): QWidget.__init__(self,parent) if not name: self.setName("ErrorPage") self.parent = parentapp self.top_layout = QVBoxLayout(self,0,0,"ErrorPageLayout") vbox = QVBox(self) vbox.setSpacing(KDialog.spacingHint()) self.top_layout.addWidget(vbox) errortext = QLabel(vbox,"errortext") errortext.setText(i18n("You need to set up a " +\ "fake Windows drive\n before you can edit settings or run " +\ "Windows applications.")) self.createbutton = KPushButton(i18n("Create Fake Windows Drive"),vbox) self.connect(self.createbutton,SIGNAL("clicked()"),self.slotCreateClicked) bottomspacer = QSpacerItem(51,160,QSizePolicy.Minimum,QSizePolicy.Expanding) self.top_layout.addItem(bottomspacer) self.clearWState(Qt.WState_Polished) def slotCreateClicked(self): self.parent.CreateWindowsInstall() self.parent._buildGUI() def setMargin(self,margin): self.top_layout.setMargin(margin) def setSpacing(self,spacing): self.top_layout.setSpacing(spacing) ''' ############################################################################## class DrivesPage(QWidget): """ A TabPage with configuration for drive mappings """ types = ( (0,i18n("Autodetect"),"auto"), (1,i18n("Local Hard Disk"),"hd"), (2,i18n("Network Share"),"network"), (3,i18n("Floppy Disk"),"floppy"), (4,i18n("CD-ROM"),"cdrom")) typesdic = { 'auto':0, 'hd':1, 'network':2, 'floppy':3, 'cdrom':4} def __init__(self,parent = None,name = None,modal = 0,fl = 0): QWidget.__init__(self,parent) self.updatingGUI = True self.selecteddriveid = None if not name: self.setName("DrivesTab") self.drives = wineread.LoadDrives() self.drives[26:] = wineread.GetShellLinks() drives_tab_layout = QVBoxLayout(self,0,0,"DrivesTabLayout") self.top_layout = drives_tab_layout vbox = QVBox(self) vbox.setSpacing(KDialog.spacingHint()) drives_tab_layout.addWidget(vbox) # -- Drive mappings group self.mappings_group_box = QHGroupBox(vbox) self.mappings_group_box.setTitle(i18n("Drive and Directory Mappings")) self.mappings_group_box.setInsideSpacing(KDialog.spacingHint()) self.mappings_group_box.setInsideMargin(KDialog.marginHint()) vbox2 = QVBox(self.mappings_group_box) vbox2.setSpacing(KDialog.spacingHint()) spacer = QWidget(vbox2) vbox2.setStretchFactor(spacer,1) self.driveslist = KListView(vbox2) self.driveslist.addColumn(i18n("Directory")) self.driveslist.addColumn(i18n("Links to")) self.driveslist.setAllColumnsShowFocus(True) self.driveslist.setSelectionMode(QListView.Single) self.driveslist.setSorting(-1,True) self.connect(self.driveslist, SIGNAL("selectionChanged(QListViewItem *)"), self.slotListClicked) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) self.addbutton = KPushButton(i18n("Add Drive..."),hbox) self.connect(self.addbutton,SIGNAL("clicked()"),self.slotAddClicked) self.removebutton = KPushButton(i18n("Remove Drive"),hbox) self.connect(self.removebutton,SIGNAL("clicked()"),self.slotRemoveClicked) spacer = QWidget(hbox) hbox.setStretchFactor(spacer,1) self.autobutton = KPushButton(i18n("Autodetect"),hbox) self.connect(self.autobutton,SIGNAL("clicked()"),self.slotAutoClicked) hbox2 = QHBox(vbox2) hbox2.setSpacing(KDialog.spacingHint()) pathtext = QLabel(hbox2,"pathtext") pathtext.setText(i18n("Path:")) self.fsfolderedit = KLineEdit("/",hbox2) self.urlcompletion = KURLCompletion(KURLCompletion.DirCompletion) self.fsfolderedit.setCompletionObject(self.urlcompletion) self.fsfolderedit.setCompletionMode(KGlobalSettings.CompletionPopup) self.connect(self.fsfolderedit,SIGNAL("textChanged(const QString &)"),self.slotFolderEdited) self.browsebutton = KPushButton(i18n("Browse"),hbox2) self.connect(self.browsebutton,SIGNAL("clicked()"),self.slotBrowseClicked) hbox2 = QHBox(vbox2) hbox2.setSpacing(KDialog.spacingHint()) self.typetext = QLabel(hbox2,"typetext") self.typetext.setText(i18n("Type:")) self.typecombo = KComboBox(0,hbox2,"typecombo") self.fillTypeCombo(self.typecombo) self.connect(self.typecombo,SIGNAL("activated(int)"),self.slotTypeActivated) spacer = QWidget(hbox2) hbox2.setStretchFactor(spacer,1) hbox2 = QHBox(vbox2) hbox2.setSpacing(KDialog.spacingHint()) self.infotext1 = QLabel(hbox2,"infotext1") hbox2 = QHBox(vbox2) hbox2.setSpacing(KDialog.spacingHint()) self.infotext2 = QLabel(hbox2,"infotext2") bottomspacer = QSpacerItem(51,160,QSizePolicy.Minimum,QSizePolicy.Expanding) drives_tab_layout.addItem(bottomspacer) self.changed = False self.clearWState(Qt.WState_Polished) self.updatingGUI=False self.updateDrivesList() def reset(self): self.drives = wineread.LoadDrives() self.drives[26:] = wineread.GetShellLinks() self.updatingGUI=True self.updateDrivesList() self.updatingGUI=False self.changed = False def isChanged(self): """ Check if something has changed since startup or last apply(). """ return self.changed def applyChanges(self): """ Apply the changes """ winewrite.SetDriveMappings(self.drives) self.reset() def updateChanges(self): """ Update the GUI and send the signal that changes were made """ self.updatingGUI=True self.updateDrivesList() self.updatingGUI=False self.changed = True self.emit(PYSIGNAL("changedSignal()"), ()) def slotListClicked(self,item): """ Show the drive information and settings for the newly selected drive """ if self.updatingGUI==False: for driveid in self.drivesToListItems: if self.drivesToListItems[driveid]==item: self.updatingGUI = True self.__selectDrive(driveid) self.updatingGUI = False return def slotFolderChanged(self,folder): """ Change the directory mapping when a new one is entered in the URL box """ self.drives[self.selecteddriveid][2] = unicode(folder) self.updateChanges() def slotFolderEdited(self,folder): """ Change the directory mapping when a new one is entered manually in the URL box """ if not self.updatingGUI: self.urlcompletion.makeCompletion("") # Doesn't seem like this should be required. self.slotFolderChanged(folder) def slotBrowseClicked(self): """ Bring up a browse window to choose a ndew mapping directory """ mapping = KFileDialog.getExistingDirectory(wineread.winepath,self,i18n("Drive Mapping")) if mapping: mapping = unicode(mapping) self.drives[self.selecteddriveid][2] = mapping self.updateChanges() def slotAddClicked(self): """ Let the user choose a directory to map a new drive to. Uses the next available drive letter. """ # TODO: Maybe the user should choose the drive letter? for drive in self.drives[2:26]: if drive[2]: continue else: mapping = KFileDialog.getExistingDirectory(wineread.winepath,self,i18n("Drive Mapping")) if mapping: mapping = unicode(mapping) drive[2] = mapping else: return self.selecteddriveid = drive[0] break else: KMessageBox.sorry(self, \ i18n("Can't add another drive. There can only be 26, for letters A-Z")) return self.updateChanges() def slotRemoveClicked(self): """ Removes the currently selected drive """ if self.selecteddriveid == 2: # Drive C: if KMessageBox.warningContinueCancel(self, \ i18n("Are you sure you want to delete drive C:?\n\n"\ "Most Windows applications expect drive C: to exist, "\ "and will die messily if it doesn't. If you proceed "\ "remember to recreate it!"),\ i18n("Warning")) != KMessageBox.Continue: return self.drives[self.selecteddriveid][2:4] = ("","") self.selecteddriveid -= 1 # Not quite correct, should select previous drive. self.updateChanges() def slotAutoClicked(self): """ Autodetects a default set of drives from /etc/fstab Allows the user to start with a fresh list of drives or append to the current one """ automethod = KMessageBox.questionYesNoCancel(self, \ i18n("Would you like to remove the current set of drives?"),\ i18n("Drive Autodetection")) if automethod == KMessageBox.Yes: autodrives = drivedetect.autodetect() autoshelllinks = drivedetect.autodetectshelllinks() elif automethod == KMessageBox.No: autodrives = drivedetect.autodetect(self.drives[:26]) autoshelllinks = drivedetect.autodetectshelllinks(self.drives[26:]) else: return if autodrives[0] == 1: KMessageBox.sorry(self, \ i18n("There were not enough letters to add all the autodetected drives.")) self.drives[0:26] = autodrives[1] self.drives[26:] = autoshelllinks self.updateChanges() def slotTypeActivated(self,index): self.__selectType(self.types[index][2]) self.updateChanges() def fillTypeCombo(self,combo): """ Fill the combobox with the values from our list """ for drivetype in self.types: combo.insertItem(drivetype[1]) def __selectType(self,typename): if typename: typeid = self.typesdic[typename] else: typeid = self.typesdic['auto'] self.drives[self.selecteddriveid][3] = typename self.typecombo.setCurrentItem(typeid) def updateDrivesList(self): """ Updates the displayed list of drives """ self.driveslist.clear() self.drivesToListItems = {} firstselecteddriveid = None lastdriveid = None for driveid, driveletter, mapping, drivetype, drivelabel, serial in reversed(self.drives): if mapping or drivelabel: lvi = QListViewItem(self.driveslist,driveletter,mapping) self.drivesToListItems[driveid] = lvi if self.selecteddriveid==driveid: firstselecteddriveid = driveid lastdriveid = driveid else: continue if firstselecteddriveid==None: firstselecteddriveid = lastdriveid self.selecteddriveid = firstselecteddriveid self.__selectDrive(self.selecteddriveid) self.driveslist.ensureItemVisible(self.driveslist.currentItem()) def __selectDrive(self,driveid): """ Updates the GUI for a newly selected drive """ self.selecteddriveid = driveid lvi = self.drivesToListItems[driveid] self.driveslist.setSelected(lvi,True) self.driveslist.setCurrentItem(lvi) self.fsfolderedit.setText(self.drives[driveid][2]) if self.drives[driveid][3] == 'shellfolder': self.typecombo.insertItem(i18n("Shell Folder")) self.typecombo.setCurrentItem(5) self.typecombo.setEnabled(False) self.removebutton.setEnabled(False) self.infotext1.setText(unicode(i18n("Windows path: ")) + self.drives[driveid][4]) # It seems some old versions of wine didn't store the shell folders in the same place if self.drives[driveid][5] != self.drives[driveid][4]: changeregistryshell = KMessageBox.warningYesNo(self, \ i18n("The " + self.drives[driveid][1] + " folder is currently located in\n" + \ self.drives[driveid][5] + "\nIt is recommended that it is put in the default " + \ "location in\n" + wineread.defaultwinfolderspath + "\nWould you like to move it there?"),\ i18n("Shell Folder Mapping")) changeregistryshell = changeregistryshell == KMessageBox.Yes if changeregistryshell: self.drives[driveid][5] = self.drives[driveid][4] self.changed = True self.emit(PYSIGNAL("changedSignal()"), ()) if self.drives[driveid][2] == wineread.profilesdirectory + self.drives[driveid][1]: realfolderwarning = KMessageBox.information(self, \ i18n(self.drives[driveid][1] + " is an actual folder and is not linked elsewhere." + \ " Remapping it will create a backup of the directory in " + \ wineread.profilesdirectory),\ i18n("Shell Folder Mapping")) else: if self.typecombo.count() > 5: self.typecombo.removeItem(5) self.typecombo.setEnabled(True) self.__selectType(self.drives[driveid][3]) self.removebutton.setEnabled(True) if self.drives[driveid][4]: self.infotext1.setText(unicode(i18n("Label: ")) + self.drives[driveid][4]) else: self.infotext1.setText("") if self.drives[driveid][5]: self.infotext2.setText(unicode(i18n("Serial: ")) + self.drives[driveid][5]) else: self.infotext2.setText("") def setMargin(self,margin): self.top_layout.setMargin(margin) def setSpacing(self,spacing): self.top_layout.setSpacing(spacing) ############################################################################ class AudioPage(QWidget): driversdic = { "":i18n("None - Disable Sound"), "alsa":"ALSA", "arts":"aRts", "esd":"EsounD", "oss":"OSS", "jack":"JACK", "nas":"NAS", "coreaudio":"CoreAudio"} drivers = ("","alsa","arts","esd","oss","jack","nas","coreaudio") accel = ( (0,i18n("Full")), (1,i18n("Standard")), (2,i18n("Basic")), (3,i18n("Emulation"))) samplerates = ( (0,"48000",48000), (1,"44100",44100), (2,"22050",22050), (3,"16000",16000), (4,"11025",11025), (5,"8000",8000)) bitspersample = ( (0,"8",8), (1,"16",16)) def __init__(self,parent = None,name = None,modal = 0,fl = 0): global application QWidget.__init__(self,parent) if not name: self.setName("AudioTab") audio_tab_layout = QVBoxLayout(self,0,0,"AudioTabLayout") self.top_layout = audio_tab_layout vbox = QVBox(self) vbox.setSpacing(KDialog.spacingHint()) audio_tab_layout.addWidget(vbox) if application: appwarning = QLabel(vbox,"appwarning") appwarning.setText(i18n("Application specific settings for " +\ application + "
Changing a setting here will permanently " +\ "make that setting independent of settings for all other " +\ "applications.
")) appwarning.setFrameStyle( QFrame.Box | QFrame.Raised ) # -- Drivers group self.driver_group_box = QHGroupBox(vbox) self.driver_group_box.setTitle(i18n("Driver Selection")) self.driver_group_box.setInsideSpacing(KDialog.spacingHint()) self.driver_group_box.setInsideMargin(KDialog.marginHint()) vbox2 = QVBox(self.driver_group_box) vbox2.setSpacing(KDialog.spacingHint()) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) drivertext = QLabel(hbox,"drivertext") drivertext.setText(i18n("Audio Driver:")) self.drivercombo = KComboBox(0,hbox,"drivercombo") self.fillDriverCombo(self.drivercombo) self.connect(self.drivercombo,SIGNAL("activated(int)"),self.slotDriverActivated) QToolTip.add(hbox, i18n("Choose an audio driver. Not all audio " +\ "drivers are available.")) spacer = QWidget(hbox) hbox.setStretchFactor(spacer,1) if application: self.driver_group_box.hide() # -- DirectSound Settings group self.dsound_group_box = QHGroupBox(vbox) self.dsound_group_box.setTitle(i18n("DirectSound")) self.dsound_group_box.setInsideSpacing(KDialog.spacingHint()) self.dsound_group_box.setInsideMargin(KDialog.marginHint()) vbox2 = QVBox(self.dsound_group_box) vbox2.setSpacing(KDialog.spacingHint()) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) acceltext = QLabel(hbox,"acceltext") acceltext.setText(i18n("Hardware Acceleration:")) self.accelcombo = KComboBox(0,hbox,"accelcombo") self.fillAccelCombo(self.accelcombo) self.connect(self.accelcombo,SIGNAL("activated(int)"),self.slotAccelActivated) spacer = QWidget(hbox) hbox.setStretchFactor(spacer,1) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) self.overridecheckbox = QCheckBox(i18n("Override KDE Sample Rate"),hbox) hbox.setStretchFactor(self.overridecheckbox,0) self.connect(self.overridecheckbox,SIGNAL("toggled(bool)"),self.slotOverrideKDESoundToggled) self.overridecheckbox.hide() self.sampleratehbox = QHBox(vbox2) self.sampleratehbox.setSpacing(KDialog.spacingHint()) sampletext = QLabel(self.sampleratehbox,"sampletext") sampletext.setText(i18n("Default Sample Rate:")) self.samplecombo = KComboBox(0,self.sampleratehbox,"samplecombo") self.fillSampleCombo(self.samplecombo) self.connect(self.samplecombo,SIGNAL("activated(int)"),self.slotSampleActivated) bitstext = QLabel(self.sampleratehbox,"bitstext") bitstext.setText(i18n("Default Bits Per Sample:")) self.bitscombo = KComboBox(0,self.sampleratehbox,"bitscombo") self.fillBitsCombo(self.bitscombo) self.connect(self.bitscombo,SIGNAL("activated(int)"),self.slotBitsActivated) spacer = QWidget(self.sampleratehbox) self.sampleratehbox.setStretchFactor(spacer,1) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) self.drvemucheckbox = QCheckBox(i18n("Driver Emulation"),hbox) hbox.setStretchFactor(self.drvemucheckbox,0) self.connect(self.drvemucheckbox,SIGNAL("toggled(bool)"), self.slotDriverEmulToggled) bottomspacer = QSpacerItem(51,160,QSizePolicy.Minimum,QSizePolicy.Expanding) audio_tab_layout.addItem(bottomspacer) self.reset() self.clearWState(Qt.WState_Polished) def fillDriverCombo(self,combo): """ Fill the combobox with the values from our list """ for driver in self.drivers: combo.insertItem(self.driversdic[driver]) def fillAccelCombo(self,combo): """ Fill the combobox with the values from our list """ for accel in self.accel: combo.insertItem(accel[1]) def fillSampleCombo(self,combo): """ Fill the combobox with the values from our list """ for rate in self.samplerates: combo.insertItem(rate[1]) def fillBitsCombo(self,combo): """ Fill the combobox with the values from our list """ for bits in self.bitspersample: combo.insertItem(bits[1]) def isChanged(self): changed = False changed = changed or (not application and self.currentdriver != self.originaldriver) changed = changed or self.currentaccel != self.originalaccel changed = changed or self.currentsamplerate != self.originalsamplerate changed = changed or self.currentbitspersample != self.originalbitspersample changed = changed or self.currentemuldriver != self.originalemuldriver return changed def reset(self): if not application: self.currentdriver = wineread.GetAudioDriver() self.originaldriver = self.currentdriver self.__selectDriver(self.currentdriver) dsoundsettings = wineread.GetDSoundSettings(application) globaldsoundsettings = wineread.GetDSoundSettings() self.currentaccel = dsoundsettings.get("HardwareAcceleration",\ globaldsoundsettings.get("HardwareAcceleration", "Full")) self.originalaccel = self.currentaccel self.__selectAccel(self.currentaccel) self.currentsamplerate = dsoundsettings.get("DefaultSampleRate",\ globaldsoundsettings.get("DefaultSampleRate", "44100")) self.originalsamplerate = self.currentsamplerate self.__selectSampleRate(self.currentsamplerate) self.currentbitspersample = dsoundsettings.get("DefaultBitsPerSample",\ globaldsoundsettings.get("DefaultBitsPerSample","16")) self.originalbitspersample = self.currentbitspersample self.__selectBitsPerSample(self.currentbitspersample) self.currentemuldriver = dsoundsettings.get("EmulDriver",\ globaldsoundsettings.get("EmulDriver", "N")) self.originalemuldriver = self.currentemuldriver self.__setDriverEmul(self.currentemuldriver) self.currentkdeoverride = True self.originalkdeoverride = self.currentkdeoverride self.__setOverrideKDESound(self.currentkdeoverride) def applyChanges(self): if not application: winewrite.SetAudioDriver(self.currentdriver) dsoundsettings = {"HardwareAcceleration":self.currentaccel, "DefaultSampleRate":self.currentsamplerate, "DefaultBitsPerSample":self.currentbitspersample, "EmulDriver":self.currentemuldriver} winewrite.SetDSoundSettings(dsoundsettings, application) self.reset() def slotDriverActivated(self,driverid): self.currentdriver = self.drivers[driverid] self.emit(PYSIGNAL("changedSignal()"), ()) def slotAccelActivated(self,accelid): self.currentaccel = self.accel[accelid][1] self.emit(PYSIGNAL("changedSignal()"), ()) def slotSampleActivated(self,sampleid): self.currentsamplerate = self.samplerates[sampleid][1] self.emit(PYSIGNAL("changedSignal()"), ()) def slotBitsActivated(self,bitsid): self.currentbitspersample = self.bitspersample[bitsid][1] self.emit(PYSIGNAL("changedSignal()"), ()) def slotDriverEmulToggled(self,driveremul): if driveremul: self.currentemuldriver = 'Y' else: self.currentemuldriver = 'N' self.emit(PYSIGNAL("changedSignal()"), ()) def slotOverrideKDESoundToggled(self,override): self.__setOverrideKDESound(override) self.emit(PYSIGNAL("changedSignal()"), ()) def __selectDriver(self,drivername): """ Sets the current driver and selects it in the combo box Assumes drivername is a valid driver """ driverid = 0 for driver in self.drivers: if driver == drivername: break else: driverid += 1 self.currentdriver = drivername self.drivercombo.setCurrentItem(driverid) def __selectAccel(self,accelmode): """ Sets the current acceleration mode and selects it in the combo box Assumes accelmode i sa valid acceleration mode """ accelid = 0 for accelmode1 in self.accel: if accelmode1[1] == accelmode: break else: accelid += 1 self.currentaccel = accelmode self.accelcombo.setCurrentItem(accelid) def __selectSampleRate(self,samplerate): """ Sets the current acceleration mode and selects it in the combo box Assumes samplerate is a valid sample rate """ sampleid = 0 for samplerate1 in self.samplerates: if samplerate1[1] == samplerate: break else: sampleid += 1 self.currentsamplerate = samplerate self.samplecombo.setCurrentItem(sampleid) def __selectBitsPerSample(self,bits): """ Sets the current acceleration mode and selects it in the combo box Assumes bits is a valid value for bits per sample """ bitsid = 0 for bits1 in self.bitspersample: if bits1[1] == bits: break else: bitsid += 1 self.currentbitspersample = bits self.bitscombo.setCurrentItem(bitsid) def __setDriverEmul(self,driveremul): """ Enables/disables the driver emulation mode """ self.currentdriveremul = driveremul driveremul = driveremul != 'N' self.drvemucheckbox.setChecked(driveremul) def __setOverrideKDESound(self,override): """ Enables/disables use of KDE's (aRts) sample rate settings """ self.currentkdeoverride = override self.sampleratehbox.setEnabled(override) self.overridecheckbox.setChecked(override) def setMargin(self,margin): self.top_layout.setMargin(margin) def setSpacing(self,spacing): self.top_layout.setSpacing(spacing) ############################################################################ class GraphicsPage(QWidget): # Mapping values in seconds to human-readable labels. vertexshadersupport = ( (0,i18n("Hardware")), (1,i18n("None")), (2,i18n("Emulation"))) vertexshadersupportdic = { "hardware":0, "none":1, "emulation":2} def __init__(self,parent = None,name = None,modal = 0,fl = 0): global currentallowwm QWidget.__init__(self,parent) if not name: self.setName("GraphicsTab") graphics_tab_layout = QVBoxLayout(self,0,0,"GraphicsTabLayout") self.top_layout = graphics_tab_layout vbox = QVBox(self) vbox.setSpacing(KDialog.spacingHint()) graphics_tab_layout.addWidget(vbox) if application: appwarning = QLabel(vbox,"appwarning") appwarning.setText(i18n("Application specific settings for " +\ application + "Changing a setting here will permanently " +\ "make that setting independent of settings for all other " +\ "applications.
")) appwarning.setFrameStyle( QFrame.Box | QFrame.Raised ) # -- Window settings group self.windows_group_box = QHGroupBox(vbox) self.windows_group_box.setTitle(i18n("Window Settings")) self.windows_group_box.setInsideSpacing(KDialog.spacingHint()) self.windows_group_box.setInsideMargin(KDialog.marginHint()) vbox2 = QVBox(self.windows_group_box) vbox2.setSpacing(KDialog.spacingHint()) self.allowcursorcheckbox = QCheckBox(i18n("Allow DirectX applications to stop the mouse leaving their window"),vbox2) self.connect(self.allowcursorcheckbox,SIGNAL("toggled(bool)"), self.slotAllowCursorToggled) self.dubbuffercheckbox = QCheckBox(i18n("Enable desktop double buffering"),vbox2) self.connect(self.dubbuffercheckbox,SIGNAL("toggled(bool)"), self.slotDubBufferToggled) self.allowwmcheckbox = QCheckBox(i18n("Allow the window manager to control the windows"),vbox2) self.connect(self.allowwmcheckbox,SIGNAL("toggled(bool)"), self.slotAllowWMToggled) QToolTip.add(self.allowwmcheckbox, \ i18n("If windows are managed by your window manager, then they" +\ " will have the standard borders, they will respect your virtual" +\ " desktop and appear in your window list.\n
" +\ "If the windows are unmanaged, they will be disconnected from your" +\ " window manager. This will mean the windows do not integrate as" +\ " closely with your desktop, but the emulation will be more" +\ " accurate so it can help some programs work better.
")) self.showdragcheckbox = QCheckBox(i18n("Display window contents while dragging"),vbox2) self.connect(self.showdragcheckbox,SIGNAL("toggled(bool)"), self.slotShowDragToggled) self.emudesktopcheckbox = QCheckBox(i18n("Emulate a virtual desktop"),vbox2) self.connect(self.emudesktopcheckbox,SIGNAL("toggled(bool)"), self.slotEmuDesktopToggled) self.desksizehbox = QHBox(vbox2) self.desksizehbox.setSpacing(KDialog.spacingHint()) desksizetext = QLabel(self.desksizehbox,"desksizetext") desksizetext.setText(i18n("Desktop size:")) self.xsizeedit = KLineEdit("640",self.desksizehbox) self.xsizeedit.setValidator(QIntValidator(self.xsizeedit)) self.connect(self.xsizeedit,SIGNAL("textChanged(const QString &)"),self.slotDesktopSizeChanged) bytext = QLabel(self.desksizehbox,"bytext") bytext.setText(i18n("x")) self.ysizeedit = KLineEdit("480",self.desksizehbox) self.ysizeedit.setValidator(QIntValidator(self.ysizeedit)) self.connect(self.ysizeedit,SIGNAL("textChanged(const QString &)"),self.slotDesktopSizeChanged) spacer = QWidget(self.desksizehbox) self.desksizehbox.setStretchFactor(spacer,1) QToolTip.add(self.emudesktopcheckbox, i18n("You can choose to emulate a Windows desktop, where all" +\ " the windows are confined to one 'virtual screen', or you" +\ " can have the windows placed on your standard desktop.
")) QToolTip.add(self.desksizehbox, QToolTip.textFor(self.emudesktopcheckbox)) if application: self.emudesktopcheckbox.hide() self.desksizehbox.hide() self.showdragcheckbox.hide() # -- Direct3D settings group self.d3d_group_box = QHGroupBox(vbox) self.d3d_group_box.setTitle(i18n("Direct3D")) self.d3d_group_box.setInsideSpacing(KDialog.spacingHint()) self.d3d_group_box.setInsideMargin(KDialog.marginHint()) vbox2 = QVBox(self.d3d_group_box) vbox2.setSpacing(KDialog.spacingHint()) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) vertexshadertext = QLabel(hbox,"vertexshadertext") vertexshadertext.setText(i18n("Vertex Shader Support:")) self.accelcombo = KComboBox(0,hbox,"accelcombo") self.fillCombo(self.accelcombo) self.connect(self.accelcombo,SIGNAL("activated(int)"),self.slotVertexShaderModeActivated) spacer = QWidget(hbox) hbox.setStretchFactor(spacer,1) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) self.pixelshadercheckbox = QCheckBox(i18n("Allow Pixel Shader (if supported by hardware)"),hbox) self.connect(self.pixelshadercheckbox,SIGNAL("toggled(bool)"), self.slotPixelShaderModeToggled) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) self.glslcheckbox = QCheckBox(i18n("Use GL Shader Language"),hbox) self.connect(self.glslcheckbox,SIGNAL("toggled(bool)"), self.slotGLSLToggled) QToolTip.add(hbox, i18n("This enables the use of GL Shading Language for vertex" +\ " and pixel shaders, as long as the hardware supports it." +\ " This is experimental.
")) bottomspacer = QSpacerItem(51,160,QSizePolicy.Minimum,QSizePolicy.Expanding) graphics_tab_layout.addItem(bottomspacer) self.reset() self.clearWState(Qt.WState_Polished) def fillCombo(self,combo): """ Fill the combobox with the values from our list """ for accel in self.vertexshadersupport: combo.insertItem(accel[1]) def isChanged(self): changed = False changed = changed or self.originalallowcursor != self.currentallowcursor changed = changed or self.originaldubbuffer != self.currentdubbuffer changed = changed or self.originalallowwm != currentallowwm changed = changed or (not application and \ self.originalemudesktop != self.currentemudesktop) changed = changed or self.originalvertexshadermode != self.currentvertexshadermode changed = changed or self.originalpixelshadermode != self.currentpixelshadermode changed = changed or self.originalglsl != self.currentglsl changed = changed or (not application and \ self.originalshowdrag != self.currentshowdrag) return changed def reset(self): """ Resets the settings to ones read from the registry """ global currentallowwm settings = wineread.GetWindowSettings(application) globalsettings = wineread.GetWindowSettings() self.currentallowcursor = settings.get("DXGrab",\ globalsettings.get("DXGrab",'N')) self.originalallowcursor = self.currentallowcursor self.__setAllowCursor(self.currentallowcursor) self.currentdubbuffer = settings.get("DesktopDoubleBuffered",\ globalsettings.get("DesktopDoubleBuffered",'Y')) self.originaldubbuffer = self.currentdubbuffer self.__setDubBuffer(self.currentdubbuffer) currentallowwm = settings.get("Managed",\ globalsettings.get("Managed",'Y')) self.originalallowwm = currentallowwm if not application: self.currentemudesktop = settings.get("Desktop","") self.originalemudesktop = self.currentemudesktop self.__setEmuDesktop(self.currentemudesktop) self.__setAllowWM(currentallowwm) d3dsettings = wineread.GetD3DSettings(application) globald3dsettings = wineread.GetD3DSettings() self.currentvertexshadermode = d3dsettings.get("VertexShaderMode",\ globald3dsettings.get("VertexShaderMode","hardware")) self.originalvertexshadermode = self.currentvertexshadermode self.__selectVertexShaderMode(self.currentvertexshadermode) self.currentpixelshadermode = d3dsettings.get("PixelShaderMode",\ globald3dsettings.get("PixelShaderMode","enabled")) self.originalpixelshadermode = self.currentpixelshadermode self.__setPixelShaderMode(self.currentpixelshadermode) self.currentglsl = d3dsettings.get("UseGLSL",\ globald3dsettings.get("UseGLSL","disabled")) self.originalglsl = self.currentglsl self.__setGLSL(self.currentglsl) if not application: cpdesktopsettings = wineread.GetDesktopSettings() self.currentshowdrag = cpdesktopsettings.get("DragFullWindows","0") self.originalshowdrag = self.currentshowdrag self.__setShowDrag(self.currentshowdrag) def applyChanges(self): """ Applies the changes to wine's configuration """ settings = {"DXGrab":self.currentallowcursor, "DesktopDoubleBuffered":self.currentdubbuffer, "Managed":currentallowwm} if not application: settings["Desktop"] = self.currentemudesktop winewrite.SetWindowSettings(settings, application) d3dsettings = {"VertexShaderMode":self.currentvertexshadermode, "PixelShaderMode":self.currentpixelshadermode, "UseGLSL":self.currentglsl} winewrite.SetD3DSettings(d3dsettings, application) if not application: cpdesktopsettings = {"DragFullWindows":self.currentshowdrag} winewrite.SetDesktopSettings(cpdesktopsettings) self.reset() def slotAllowCursorToggled(self,allow): if allow: self.currentallowcursor = 'Y' else: self.currentallowcursor = 'N' self.emit(PYSIGNAL("changedSignal()"), ()) def slotDubBufferToggled(self,dub): if dub: self.currentdubbuffer = 'Y' else: self.currentdubbuffer = 'N' self.emit(PYSIGNAL("changedSignal()"), ()) def slotAllowWMToggled(self,allow): global currentallowwm if allow: currentallowwm = 'Y' else: currentallowwm = 'N' if not application: if allow and self.currentemudesktop == "": self.showdragcheckbox.setEnabled(False) else: self.showdragcheckbox.setEnabled(True) self.emit(PYSIGNAL("changedSignal()"), ()) def slotShowDragToggled(self,show): if show: self.currentshowdrag = '2' else: self.currentshowdrag = '0' self.emit(PYSIGNAL("changedSignal()"), ()) def slotEmuDesktopToggled(self,emudesktop): if emudesktop: self.currentemudesktop = unicode(self.xsizeedit.text()) + 'x' + str(self.ysizeedit.text()) else: self.currentemudesktop = "" self.__setEmuDesktop(self.currentemudesktop) self.emit(PYSIGNAL("changedSignal()"), ()) def slotDesktopSizeChanged(self,size): self.slotEmuDesktopToggled(True) def slotVertexShaderModeActivated(self,modeid): mode = self.vertexshadersupport[modeid][1][0].lower() + self.vertexshadersupport[modeid][1][1:] self.currentvertexshadermode = mode self.emit(PYSIGNAL("changedSignal()"), ()) def slotPixelShaderModeToggled(self,mode): if mode: self.currentpixelshadermode = 'enabled' else: self.currentpixelshadermode = 'disabled' self.emit(PYSIGNAL("changedSignal()"), ()) def slotGLSLToggled(self,mode): if mode: self.currentglsl = 'enabled' else: self.currentglsl = 'disabled' self.emit(PYSIGNAL("changedSignal()"), ()) def __setAllowCursor(self, allow): self.currentallowcursor = allow allow = allow != 'N' self.allowcursorcheckbox.setChecked(allow) def __setDubBuffer(self, dub): self.currentdubbuffer = dub dub = dub != 'N' self.dubbuffercheckbox.setChecked(dub) def __setAllowWM(self, allow): global currentallowwm currentallowwm = allow allow = allow != 'N' self.allowwmcheckbox.setChecked(allow) if not application: if allow and self.currentemudesktop == "": self.showdragcheckbox.setEnabled(False) else: self.showdragcheckbox.setEnabled(True) def __setEmuDesktop(self, emudesktop): self.currentemudesktop = emudesktop emudesktopbool = emudesktop != "" self.emudesktopcheckbox.setChecked(emudesktopbool) self.desksizehbox.setEnabled(emudesktopbool) if emudesktopbool: desktopsize = emudesktop.split('x') self.xsizeedit.setText(desktopsize[0]) self.ysizeedit.setText(desktopsize[1]) self.showdragcheckbox.setEnabled(True) elif currentallowwm: self.showdragcheckbox.setEnabled(False) def __selectVertexShaderMode(self,mode): self.currentvertexshadermode = mode self.accelcombo.setCurrentItem(self.vertexshadersupportdic[mode]) def __setPixelShaderMode(self,mode): self.currentpixelshadermode = mode mode = mode == 'enabled' self.pixelshadercheckbox.setChecked(mode) def __setGLSL(self,mode): self.currentglsl = mode mode = mode == 'enabled' self.glslcheckbox.setChecked(mode) def __setShowDrag(self,show): self.currentshowdrag = show show = show != '0' self.showdragcheckbox.setChecked(show) def setMargin(self,margin): self.top_layout.setMargin(margin) def setSpacing(self,spacing): self.top_layout.setSpacing(spacing) ############################################################################ class AppearancePage(QWidget): themes = [unicode(i18n("No Theme"))] colorschemes = [unicode(i18n("Custom"))] sizes = [("NormalSize",unicode(i18n("Normal"))), ("LargeSize",unicode(i18n("Large Fonts"))), ("ExtraLargeSize",unicode(i18n("Extra Large Fonts")))] # Items for the combo box reference a tuple of dictionaries for color # and size values and translations for that item # For example, the value of BorderWidth is # customizableitems[str(i18n("Window Border"))][1]["BorderWidth"][1] customizableitems = {"Window Border": ({"ActiveBorder":[unicode(i18n("Active Color:")),QColor()], "InactiveBorder":[unicode(i18n("Inactive Color:")),QColor()]}, {"BorderWidth":[unicode(i18n("Width:")),1]}), #ActiveBorder, InactiveBorder, metrics: BorderWidth "Title Bar": ({"ActiveTitle":[unicode(i18n("Active Color:")),QColor()], "GradientActiveTitle":[unicode(i18n("Gradient:")),QColor()], "InactiveTitle":[unicode(i18n("Inactive Color:")),QColor()], "GradientInactiveTitle":[unicode(i18n("Gradient:")),QColor()], "TitleText":[unicode(i18n("Active Text:")),QColor()], "InactiveTitleText":[unicode(i18n("Inactive Text:")),QColor()]}, {}), #ActiveTitle, GradientActiveTitle, InactiveTitle, GradientInactiveTitle, TitleText, InactiveTitleText "Application Workspace": ({"AppWorkSpace":[unicode(i18n("Background Color:")),QColor()]}, {}), #AppWorkSpace "Background" "Buttons": ({"ButtonFace":[unicode(i18n("Face:")),QColor()], "ButtonHilight":[unicode(i18n("Hilight:")),QColor()], "ButtonLight":[unicode(i18n("Light:")),QColor()], "ButtonShadow":[unicode(i18n("Shadow:")),QColor()], "ButtonText":[unicode(i18n("Text Color:")),QColor()], "ButtonAlternateFace":[unicode(i18n("Alternate Face:")),QColor()], "ButtonDkShadow":[unicode(i18n("Dark Shadow:")),QColor()], "WindowFrame":[unicode(i18n("Frame:")),QColor()]}, {}), #ButtonFace, ButtonHilight, ButtonLight, ButtonShadow, ButtonText, ButtonAlternateFace, ButtonDkShadow, WindowFrame "Caption Buttons": ({}, {"CaptionHeight":[unicode(i18n("Height:")),1], "CaptionWidth":[unicode(i18n("Width:")),1]}), #Metrics: CaptionHeight, CaptionWidth "Desktop": ({"Background":[unicode(i18n("Background:")),QColor()]}, {}), #Background "Menu": ({"Menu":[unicode(i18n("Menu Background:")),QColor()], "MenuBar":[unicode(i18n("Menu Bar Color:")),QColor()], "MenuHilight":[unicode(i18n("Menu Hilight:")),QColor()], "MenuText":[unicode(i18n("Text Color:")),QColor()]}, {"MenuHeight":[unicode(i18n("Menu Bar Height:")),1]}), #Menu (Background), MenuBar, MenuHilight, MenuText, metrics: MenuHeight, MenuWidth (does nothing) "Scrollbar": ({"Scrollbar":[unicode(i18n("Color:")),QColor()]}, {"ScrollWidth":[unicode(i18n("Width:")),1]}), #Scrollbar, metrics: ScrollHeight (does nothing), ScrollWidth "Window": ({"Window":[unicode(i18n("Background:")),QColor()], "WindowText":[unicode(i18n("Text Color:")),QColor()]}, {}), #Window "Background", WindowText "Selected Items": ({"Hilight":[unicode(i18n("Hilight Color:")),QColor()], "HilightText":[unicode(i18n("Text Color:")),QColor()]}, {})} #Hilight, HilightText def __init__(self,parent = None,name = None,modal = 0,fl = 0): global imagedir QWidget.__init__(self,parent) if not name: self.setName("AppearanceTab") appearance_tab_layout = QVBoxLayout(self,0,0,"AppearanceTabLayout") self.top_layout = appearance_tab_layout vbox = QVBox(self) vbox.setSpacing(KDialog.spacingHint()) appearance_tab_layout.addWidget(vbox) # -- Appearance group self.appearance_group_box = QVGroupBox(vbox) self.appearance_group_box.setTitle(i18n("Style and Colors")) self.appearance_group_box.setInsideSpacing(KDialog.spacingHint()) self.appearance_group_box.setInsideMargin(KDialog.marginHint()) themebox = QWidget(self.appearance_group_box) theme_layout = QGridLayout(themebox,3,3) theme_layout.setSpacing(KDialog.spacingHint()) theme_layout.setColStretch(1,1) styletext = QLabel(themebox,"styletext") styletext.setText(i18n("Widget Style:")) theme_layout.addWidget(styletext,0,0) self.themes = self.themes + wineread.GetThemesList() self.themecombo = KComboBox(0,themebox,"themecombo") self.fillThemeCombo(self.themecombo) self.connect(self.themecombo,SIGNAL("activated(int)"),self.slotThemeActivated) theme_layout.addWidget(self.themecombo,0,1) self.installbutton = KPushButton(i18n("Install style..."),themebox) self.connect(self.installbutton,SIGNAL("clicked()"),self.slotInstallThemeClicked) theme_layout.addWidget(self.installbutton,0,2) fontsizetext = QLabel(themebox,"fontsizetext") fontsizetext.setText(i18n("Font Size:")) theme_layout.addWidget(fontsizetext,1,0) self.fontsizecombo = KComboBox(0,themebox,"fontsizecombo") self.fillFontSizeCombo(self.fontsizecombo) self.connect(self.fontsizecombo,SIGNAL("activated(int)"),self.slotFontSizeActivated) theme_layout.addWidget(self.fontsizecombo,1,1) colorschemetext = QLabel(themebox,"colorschemetext") colorschemetext.setText(i18n("Color Scheme:")) theme_layout.addWidget(colorschemetext,2,0) self.colorschemecombo = KComboBox(0,themebox,"colorschemecombo") self.fillColorSchemeCombo(self.colorschemecombo) self.connect(self.colorschemecombo,SIGNAL("activated(int)"),self.slotColorSchemeActivated) theme_layout.addWidget(self.colorschemecombo,2,1) self.saveschemebutton = KPushButton(i18n("Save..."),themebox) self.connect(self.saveschemebutton,SIGNAL("clicked()"),self.slotSaveSchemeClicked) theme_layout.addWidget(self.saveschemebutton,2,2) # --- Custom Colors --- hbox = QHBox(self.appearance_group_box) hbox.setSpacing(KDialog.spacingHint()) self.sizehbox = hbox self.leftspacer = QWidget(hbox) self.customcolorsvbox = QVBox(hbox) self.customcolorsvbox.setSpacing(KDialog.spacingHint()) hbox = QHBox(self.customcolorsvbox) hbox.setSpacing(KDialog.spacingHint()) itemtext = QLabel(hbox,"itemtext") itemtext.setText(i18n("Item:")) self.itemcombo = KComboBox(0,hbox,"itemcombo") self.fillItemCombo(self.itemcombo) self.connect(self.itemcombo,SIGNAL("activated(int)"),self.slotItemActivated) hbox.setStretchFactor(self.itemcombo,1) self.customcolorsgrid = QWidget(self.customcolorsvbox) self.customcolorsgrid_layout = QGridLayout(self.customcolorsgrid,4,2) self.customcolorsgrid_layout.setSpacing(KDialog.spacingHint()) # Box 1 of 8 self.colorsizehbox1 = QWidget(self.customcolorsgrid,"colorsizehbox1") self.customcolorsgrid_layout.addWidget(self.colorsizehbox1,0,0) self.colorsizehbox1_layout = QGridLayout(self.colorsizehbox1,1,2) self.colorsizehbox1_layout.setSpacing(KDialog.spacingHint()) self.colorsizetext1 = QLabel(self.colorsizehbox1,"colorsizetext1") self.colorsizetext1.setText(i18n(":")) self.colorsizehbox1_layout.addWidget(self.colorsizetext1,0,0,Qt.AlignRight) self.sizespinbox1 = QSpinBox(self.colorsizehbox1,"sizespinbox1") self.sizespinbox1.setMinValue(0) self.connect(self.sizespinbox1,SIGNAL("valueChanged(int)"),self.slotSizeActivated) self.colorcombo1 = KColorCombo(self.colorsizehbox1,"colorcombo1") self.connect(self.colorcombo1,SIGNAL("activated(const QColor &)"),self.slotColorActivated) # Box 2 of 8 self.colorsizehbox2 = QWidget(self.customcolorsgrid,"colorsizehbox2") self.customcolorsgrid_layout.addWidget(self.colorsizehbox2,0,1) self.colorsizehbox2_layout = QGridLayout(self.colorsizehbox2,1,2) self.colorsizehbox2_layout.setSpacing(KDialog.spacingHint()) self.colorsizetext2 = QLabel(self.colorsizehbox2,"colorsizetext2") self.colorsizetext2.setText(i18n(":")) self.colorsizehbox2_layout.addWidget(self.colorsizetext2,0,0,Qt.AlignRight) self.sizespinbox2 = QSpinBox(self.colorsizehbox2,"sizespinbox2") self.sizespinbox2.setMinValue(0) self.connect(self.sizespinbox2,SIGNAL("valueChanged(int)"),self.slotSizeActivated) self.colorcombo2 = KColorCombo(self.colorsizehbox2,"colorcombo2") self.connect(self.colorcombo2,SIGNAL("activated(const QColor &)"),self.slotColorActivated) # Box 3 of 8 self.colorsizehbox3 = QWidget(self.customcolorsgrid,"colorsizehbox3") self.customcolorsgrid_layout.addWidget(self.colorsizehbox3,1,0) self.colorsizehbox3_layout = QGridLayout(self.colorsizehbox3,1,2) self.colorsizehbox3_layout.setSpacing(KDialog.spacingHint()) self.colorsizetext3 = QLabel(self.colorsizehbox3,"colorsizetext3") self.colorsizetext3.setText(i18n(":")) self.colorsizehbox3_layout.addWidget(self.colorsizetext3,0,0,Qt.AlignRight) self.sizespinbox3 = QSpinBox(self.colorsizehbox3,"sizespinbox3") self.sizespinbox3.setMinValue(0) self.connect(self.sizespinbox3,SIGNAL("valueChanged(int)"),self.slotSizeActivated) self.colorcombo3 = KColorCombo(self.colorsizehbox3,"colorcombo3") self.connect(self.colorcombo3,SIGNAL("activated(const QColor &)"),self.slotColorActivated) # Box 4 of 8 self.colorsizehbox4 = QWidget(self.customcolorsgrid,"colorsizehbox4") self.customcolorsgrid_layout.addWidget(self.colorsizehbox4,1,1) self.colorsizehbox4_layout = QGridLayout(self.colorsizehbox4,1,2) self.colorsizehbox4_layout.setSpacing(KDialog.spacingHint()) self.colorsizetext4 = QLabel(self.colorsizehbox4,"colorsizetext4") self.colorsizetext4.setText(i18n(":")) self.colorsizehbox4_layout.addWidget(self.colorsizetext4,0,0,Qt.AlignRight) self.sizespinbox4 = QSpinBox(self.colorsizehbox4,"sizespinbox4") self.sizespinbox4.setMinValue(0) self.connect(self.sizespinbox4,SIGNAL("valueChanged(int)"),self.slotSizeActivated) self.colorcombo4 = KColorCombo(self.colorsizehbox4,"colorcombo4") self.connect(self.colorcombo4,SIGNAL("activated(const QColor &)"),self.slotColorActivated) # Box 5 of 8 self.colorsizehbox5 = QWidget(self.customcolorsgrid,"colorsizehbox5") self.customcolorsgrid_layout.addWidget(self.colorsizehbox5,2,0) self.colorsizehbox5_layout = QGridLayout(self.colorsizehbox5,1,2) self.colorsizehbox5_layout.setSpacing(KDialog.spacingHint()) self.colorsizetext5 = QLabel(self.colorsizehbox5,"colorsizetext5") self.colorsizetext5.setText(i18n(":")) self.colorsizehbox5_layout.addWidget(self.colorsizetext5,0,0,Qt.AlignRight) self.sizespinbox5 = QSpinBox(self.colorsizehbox5,"sizespinbox5") self.sizespinbox5.setMinValue(0) self.connect(self.sizespinbox5,SIGNAL("valueChanged(int)"),self.slotSizeActivated) self.colorcombo5 = KColorCombo(self.colorsizehbox5,"colorcombo5") self.connect(self.colorcombo5,SIGNAL("activated(const QColor &)"),self.slotColorActivated) # Box 6 of 8 self.colorsizehbox6 = QWidget(self.customcolorsgrid,"colorsizehbox6") self.customcolorsgrid_layout.addWidget(self.colorsizehbox6,2,1) self.colorsizehbox6_layout = QGridLayout(self.colorsizehbox6,1,2) self.colorsizehbox6_layout.setSpacing(KDialog.spacingHint()) self.colorsizetext6 = QLabel(self.colorsizehbox6,"colorsizetext6") self.colorsizetext6.setText(i18n(":")) self.colorsizehbox6_layout.addWidget(self.colorsizetext6,0,0,Qt.AlignRight) self.sizespinbox6 = QSpinBox(self.colorsizehbox6,"sizespinbox6") self.sizespinbox6.setMinValue(0) self.connect(self.sizespinbox6,SIGNAL("valueChanged(int)"),self.slotSizeActivated) self.colorcombo6 = KColorCombo(self.colorsizehbox6,"colorcombo6") self.connect(self.colorcombo6,SIGNAL("activated(const QColor &)"),self.slotColorActivated) # Box 7 of 8 self.colorsizehbox7 = QWidget(self.customcolorsgrid,"colorsizehbox7") self.customcolorsgrid_layout.addWidget(self.colorsizehbox7,3,0) self.colorsizehbox7_layout = QGridLayout(self.colorsizehbox7,1,2) self.colorsizehbox7_layout.setSpacing(KDialog.spacingHint()) self.colorsizetext7 = QLabel(self.colorsizehbox7,"colorsizetext7") self.colorsizetext7.setText(i18n(":")) self.colorsizehbox7_layout.addWidget(self.colorsizetext7,0,0,Qt.AlignRight) self.sizespinbox7 = QSpinBox(self.colorsizehbox7,"sizespinbox7") self.sizespinbox7.setMinValue(0) self.connect(self.sizespinbox7,SIGNAL("valueChanged(int)"),self.slotSizeActivated) self.colorcombo7 = KColorCombo(self.colorsizehbox7,"colorcombo7") self.connect(self.colorcombo7,SIGNAL("activated(const QColor &)"),self.slotColorActivated) # Box 8 of 8 self.colorsizehbox8 = QWidget(self.customcolorsgrid,"colorsizehbox8") self.customcolorsgrid_layout.addWidget(self.colorsizehbox8,3,1) self.colorsizehbox8_layout = QGridLayout(self.colorsizehbox8,1,2) self.colorsizehbox8_layout.setSpacing(KDialog.spacingHint()) self.colorsizetext8 = QLabel(self.colorsizehbox8,"colorsizetext8") self.colorsizetext8.setText(i18n(":")) self.colorsizehbox8_layout.addWidget(self.colorsizetext8,0,0,Qt.AlignRight) self.sizespinbox8 = QSpinBox(self.colorsizehbox8,"sizespinbox8") self.sizespinbox8.setMinValue(0) self.connect(self.sizespinbox8,SIGNAL("valueChanged(int)"),self.slotSizeActivated) self.colorcombo8 = KColorCombo(self.colorsizehbox8,"colorcombo8") self.connect(self.colorcombo8,SIGNAL("activated(const QColor &)"),self.slotColorActivated) spacer = QWidget(self.customcolorsvbox) self.customcolorsvbox.setStretchFactor(spacer,1) self.customcolorsvbox.setMinimumHeight(itemtext.height()*4.5) #self.customcolorsvbox.setStretchFactor(self.customcolorsgrid,1) bottomspacer = QSpacerItem(51,160,QSizePolicy.Minimum,QSizePolicy.Expanding) appearance_tab_layout.addItem(bottomspacer) self.selecteditem = None self.config = KConfig("wineconfigrc",False,False) self.reset() self.clearWState(Qt.WState_Polished) def isChanged(self): changed = False changed = changed or self.currenttheme != self.originaltheme\ or self.currentthemecolorscheme != self.originalthemecolorscheme\ or self.currentfontsize != self.originalfontsize\ or self.customizableItemsChanged() return changed def customizableItemsChanged(self): """ Returns true if any custom setting was changed """ colors = wineread.GetColorSettings() metrics = wineread.GetWindowMetrics() changed = False custom = False # For a little efficiency for item in self.customizableitems.keys(): for key in self.customizableitems[item][0].keys(): color = colors.get(key,"0 0 0") color = color.split() color = QColor(int(color[0]),int(color[1]),int(color[2])) if not custom and self.customizableitems[item][0][key][1] !=\ self.config.readColorEntry(key,QColor(0,0,0)): self.__selectColorScheme(0) custom = True if self.customizableitems[item][0][key][1] != color: if custom: return True else: changed = True for key in self.customizableitems[item][1].keys(): size = int(metrics.get(key,1)) if not custom and self.customizableitems[item][1][key][1] !=\ self.config.readNumEntry(key,1): self.__selectColorScheme(0) custom = True if self.customizableitems[item][1][key][1] != size: if custom: return True else: changed = True return changed def reset(self): self.fillItemCombo(self.itemcombo) self.config.setGroup("") self.currentcustomcolorscheme = unicode(self.config.readEntry("ColorScheme",i18n("Custom"))) self.originalcustomcolorscheme = self.currentcustomcolorscheme schemeslist = self.config.readListEntry("ColorSchemes") self.colorschemes = [unicode(i18n("Custom")), unicode(i18n("Get KDE Colors"))] + list(schemeslist) self.config.setGroup(self.currentcustomcolorscheme) for preset in self.presets: if preset[0] not in schemeslist: self.saveColorScheme(preset[0],preset[1]) self.colorschemes.append(preset[0]) self.fillColorSchemeCombo(self.colorschemecombo) theme = wineread.GetCurrentTheme() if not theme: self.currenttheme = self.themes[0] self.originaltheme = self.currenttheme self.__selectTheme(0) self.currentthemecolorscheme = "NormalColor" self.originalthemecolorscheme = self.currentthemecolorscheme self.currentfontsize = self.sizes[0][0] self.originalfontsize = self.currentfontsize for i,sizename in enumerate(self.sizes): if sizename[0] == self.currentfontsize: self.__selectFontSize(i) break else: self.currenttheme = theme[0] self.originaltheme = self.currenttheme for i,themename in enumerate(self.themes): if themename == self.currenttheme: self.__selectTheme(i) break self.currentthemecolorscheme = theme[1] self.originalthemecolorscheme = self.currentthemecolorscheme self.currentfontsize = theme[2] self.originalfontsize = self.currentfontsize for i,sizename in enumerate(self.sizes): if sizename[0] == self.currentfontsize: self.__selectFontSize(i) break colors = wineread.GetColorSettings() metrics = wineread.GetWindowMetrics() for item in self.customizableitems.keys(): for key in self.customizableitems[item][0].keys(): color = colors.get(key,"0 0 0") color = color.split() color = QColor(int(color[0]),int(color[1]),int(color[2])) if color != self.config.readColorEntry(key,QColor(0,0,0)): self.currentcustomcolorscheme = self.colorschemes[0] self.customizableitems[item][0][key][1] = color for key in self.customizableitems[item][1].keys(): size = int(metrics.get(key,1)) if size != self.config.readNumEntry(key,1): self.currentcustomcolorscheme = self.colorschemes[0] self.customizableitems[item][1][key][1] = size for i,colorname in enumerate(self.colorschemes): if colorname == self.currentcustomcolorscheme: self.__selectColorScheme(i) break self.desktopsettings = wineread.GetDesktopSettings() def applyChanges(self): """ Applies the changes to wine's configuration """ if self.currenttheme == self.themes[0]: winewrite.SetCurrentTheme(None) else: winewrite.SetCurrentTheme((self.currenttheme, self.currentthemecolorscheme, self.currentfontsize)) colorsettings = {} metricssettings = {} for item in self.customizableitems.keys(): for key in self.customizableitems[item][0].keys(): color = self.customizableitems[item][0][key][1] color = str(color.red()) + " " + str(color.green()) +\ " " + str(color.blue()) colorsettings[key] = color for key in self.customizableitems[item][1].keys(): size = self.customizableitems[item][1][key][1] metricssettings[key] = str(size) winewrite.SetColorSettings(colorsettings) winewrite.SetWindowMetrics(metricssettings) self.config.setGroup("") if self.currentcustomcolorscheme == self.colorschemes[1]: self.currentcustomcolorscheme = self.colorschemes[0] self.config.writeEntry("ColorScheme",self.currentcustomcolorscheme) self.config.sync() if self.customizableitems["Title Bar"][0]["ActiveTitle"][1]\ !=\ self.customizableitems["Title Bar"][0]["GradientActiveTitle"][1]\ or\ self.customizableitems["Title Bar"][0]["InactiveTitle"][1]\ !=\ self.customizableitems["Title Bar"][0]["GradientInactiveTitle"][1]: prefmask = self.desktopsettings["UserPreferencemask"] prefmask = prefmask[:4] + "1" + prefmask[5:] self.desktopsettings["UserPreferencemask"] = prefmask else: prefmask = self.desktopsettings["UserPreferencemask"] prefmask = prefmask[:4] + "0" + prefmask[5:] self.desktopsettings["UserPreferencemask"] = prefmask winewrite.SetDesktopSettings(self.desktopsettings) self.reset() def fillThemeCombo(self,combo): """ Fill the combo box with the list of themes """ for theme in self.themes: combo.insertItem(theme) def fillColorSchemeCombo(self,combo): """ Fill the combo box with the list of color schemes """ combo.clear() for color in self.colorschemes: combo.insertItem(color) def fillFontSizeCombo(self,combo): """ Fill the combo box with the list of font sizes """ for size in self.sizes: combo.insertItem(size[1]) def slotFillItemCombo(self,allowwm): """ Fill the combo box with the list of customizable items Called when window managing is changed """ combo = self.itemcombo combo.clear() items = self.customizableitems.keys() items.sort() for item in items: if not (allowwm and (item == "Window Border" \ or item == "Title Bar" or \ item == "Caption Buttons")): combo.insertItem(unicode(i18n(item))) def slotFillItemComboDesktop(self,desktop): """ Fill the combo box with the list of customizable items Called when virtual desktop is changed """ self.slotFillItemCombo(not desktop) def fillItemCombo(self,combo = None): """ Fill the combo box with the list of customizable items """ if not combo: combo = self.itemcombo combo.clear() items = self.customizableitems.keys() items.sort() self.currentitems = [] for item in items: if not (currentallowwm == 'Y' and (item == "Window Border" \ or item == "Title Bar" or \ item == "Caption Buttons")): combo.insertItem(unicode(i18n(item))) self.currentitems.append(item) def slotThemeActivated(self,themeid): """ Picks an already installed theme """ self.__selectTheme(themeid) self.emit(PYSIGNAL("changedSignal()"), ()) def slotInstallThemeClicked(self): """ Opens up a dialog to install a new theme """ themepath = unicode(KFileDialog.getOpenFileName(os.environ['HOME'],\ "*.msstyles|" + str(i18n("Windows Styles (*.msstyles)")),self,i18n("Install Style"))) if themepath: themename = themepath.split('/') themename = themename[-1] themename = themename.split('.') themename = themename[0] themedir = wineread.winepath +\ "/dosdevices/c:/windows/Resources/Themes/" +\ themename if not os.path.exists(themedir): os.mkdir(themedir) shutil.copy(themepath, themedir) self.themes.append(str(i18n(themename))) self.themecombo.insertItem(self.themes[-1]) self.emit(PYSIGNAL("changedSignal()"), ()) def slotSaveSchemeClicked(self): """ Lets the user save the current color scheme """ schemename = KInputDialog.getText(i18n("Save Color Scheme"),\ i18n("Name: "),\ i18n("CustomScheme"),\ self,"schemenameinput") while schemename[1] and schemename[0] == "" or \ schemename[0] == self.colorschemes[0] or \ schemename[0] == self.colorschemes[1]: KMessageBox.information(self, \ i18n("Please enter a unique name for the color scheme."), \ i18n("Save Color Scheme")) schemename = KInputDialog.getText(i18n("Save Color Scheme"),\ i18n("Name: "),\ i18n("CustomScheme"),\ self,"schemenameinput") if schemename[1]: schemename = str(schemename[0]) self.saveColorScheme(schemename) if schemename not in self.colorschemes: self.colorschemes.append(schemename) self.colorschemecombo.insertItem(schemename) for i,colorname in enumerate(self.colorschemes): if colorname == schemename: self.__selectColorScheme(i) break def saveColorScheme(self,name,schemesettings = None): """ Saves the colorscheme """ if not schemesettings: schemesettings = self.customizableitems self.config.setGroup("") if name != self.colorschemes[1]: self.config.writeEntry("ColorScheme",name) schemeslist = self.config.readListEntry("ColorSchemes") if name not in schemeslist and name != self.colorschemes[0] and \ name != self.colorschemes[1]: schemeslist.append(name) self.config.writeEntry("ColorSchemes",schemeslist) self.config.setGroup(name) for item in self.customizableitems.keys(): for key in schemesettings[item][0].keys(): self.config.writeEntry(key,schemesettings[item][0][key][1]) for key in schemesettings[item][1].keys(): self.config.writeEntry(key,schemesettings[item][1][key][1]) self.config.sync() def GetKdeColorScheme(self): """ Sets the current color scheme settings to those currently set in KDE """ # Create a configuration object. config = KConfig("kdesktoprc") config.setGroup("General") self.customizableitems["Application Workspace"][0]["AppWorkSpace"][1] =\ config.readColorEntry("background",QColor(100,100,100)) self.customizableitems["Buttons"][0]["ButtonFace"][1] =\ config.readColorEntry("background",QColor(230,230,230)) self.customizableitems["Buttons"][0]["ButtonHilight"][1] =\ config.readColorEntry("windowBackground",QColor(240,240,240)) self.customizableitems["Buttons"][0]["ButtonLight"][1] =\ config.readColorEntry("selectBackground",QColor(200,200,200)).light(135) self.customizableitems["Buttons"][0]["ButtonShadow"][1] =\ config.readColorEntry("background",QColor(100,100,100)).dark(180) self.customizableitems["Buttons"][0]["ButtonText"][1] =\ config.readColorEntry("buttonForeground",QColor(0,0,0)) self.customizableitems["Buttons"][0]["ButtonAlternateFace"][1] =\ config.readColorEntry("background",QColor(230,230,230)) self.customizableitems["Buttons"][0]["ButtonDkShadow"][1] =\ config.readColorEntry("selectBackground",QColor(0,0,0)).dark(146) self.customizableitems["Buttons"][0]["WindowFrame"][1] =\ config.readColorEntry("selectBackground",QColor(0,0,0)) self.customizableitems["Menu"][0]["Menu"][1] =\ config.readColorEntry("background",QColor(230,230,230)).light(105) self.customizableitems["Menu"][0]["MenuBar"][1] =\ config.readColorEntry("background",QColor(230,230,230)) self.customizableitems["Menu"][0]["MenuHilight"][1] =\ config.readColorEntry("selectBackground",QColor(0,0,0)) self.customizableitems["Menu"][0]["MenuText"][1] =\ config.readColorEntry("foreground",QColor(0,0,0)) self.customizableitems["Scrollbar"][0]["Scrollbar"][1] =\ config.readColorEntry("background",QColor(230,230,230)) self.customizableitems["Window"][0]["Window"][1] =\ config.readColorEntry("windowBackground",QColor(255,255,255)) self.customizableitems["Window"][0]["WindowText"][1] =\ config.readColorEntry("foreground",QColor(0,0,0)) self.customizableitems["Selected Items"][0]["Hilight"][1] =\ config.readColorEntry("selectBackground",QColor(0,0,0)) self.customizableitems["Selected Items"][0]["HilightText"][1] =\ config.readColorEntry("selectForeground",QColor(255,255,255)) config.setGroup("WM") self.customizableitems["Title Bar"][0]["ActiveTitle"][1] =\ config.readColorEntry("activeBackground",QColor(10,10,100)) self.customizableitems["Title Bar"][0]["GradientActiveTitle"][1] =\ config.readColorEntry("activeBlend",QColor(10,10,200)).light(110) self.customizableitems["Title Bar"][0]["InactiveTitle"][1] =\ config.readColorEntry("inactiveBackground",QColor(100,100,100)) self.customizableitems["Title Bar"][0]["GradientInactiveTitle"][1] =\ config.readColorEntry("inactiveBlend",QColor(100,100,200)) self.customizableitems["Title Bar"][0]["TitleText"][1] =\ config.readColorEntry("activeForeground",QColor(255,255,255)) self.customizableitems["Title Bar"][0]["InactiveTitleText"][1] =\ config.readColorEntry("inactiveForeground",QColor(250,250,250)) self.customizableitems["Window Border"][0]["ActiveBorder"][1] =\ config.readColorEntry("frame",QColor(10,10,100)) self.customizableitems["Window Border"][0]["InactiveBorder"][1] =\ config.readColorEntry("frame",QColor(100,100,200)) config.setGroup("Desktop0") self.customizableitems["Desktop"][0]["Background"][1] =\ config.readColorEntry("Color1",QColor(50,150,85)) self.saveColorScheme(self.colorschemes[1]) def slotColorSchemeActivated(self,colorid): """ Picks a color scheme """ self.__selectColorScheme(colorid) self.emit(PYSIGNAL("changedSignal()"), ()) def slotFontSizeActivated(self,fontid): """ Picks a font size """ self.__selectFontSize(fontid) self.emit(PYSIGNAL("changedSignal()"), ()) def slotItemActivated(self,itemid): """ Picks an item to customize """ items = self.customizableitems.keys() items.sort() for i,item in enumerate(self.currentitems): if i == itemid: if item != self.selecteditem: self.__selectItem(item) def slotColorActivated(self,color): """ Picks a color for the currently selected item """ key = self.sender().name() self.customizableitems[self.selecteditem][0][key][1] = color self.emit(PYSIGNAL("changedSignal()"), ()) def slotSizeActivated(self,sizevalue): """ Sets the size value from the spin box """ key = self.sender().name() self.customizableitems[self.selecteditem][1][key][1] = sizevalue self.emit(PYSIGNAL("changedSignal()"), ()) def __selectTheme(self,themeid): """ Selects the browser in the combobox """ self.currenttheme = self.themes[themeid] self.themecombo.setCurrentItem(themeid) #if themeid == 0: # self.colorfontbox.setEnabled(False) #else: # self.colorfontbox.setEnabled(True) def __selectColorScheme(self,colorid): """ Selects a color scheme in the combo box """ self.currentcustomcolorscheme = self.colorschemes[colorid] self.colorschemecombo.setCurrentItem(colorid) if colorid > 1: self.config.setGroup("") self.config.writeEntry("ColorScheme",self.colorschemes[colorid]) self.config.setGroup(self.colorschemes[colorid]) for item in self.customizableitems.keys(): for key in self.customizableitems[item][0].keys(): color = self.config.readColorEntry(key,QColor(0,0,0)) self.customizableitems[item][0][key][1] = color for key in self.customizableitems[item][1].keys(): size = self.config.readNumEntry(key,1) self.customizableitems[item][1][key][1] = size elif colorid == 1: self.GetKdeColorScheme() if not self.selecteditem: self.__selectItem("Desktop") else: self.__selectItem(self.selecteditem) def __selectColorSchemeByName(self,name): """ Finds the index of name in colorschemes and calls the above function """ for i,colorname in enumerate(self.colorschemes): if colorname == name: self.__selectColorScheme(i) break def __selectFontSize(self,sizeid): """ Selects a font size in the combo box """ self.currentfontsize = self.sizes[sizeid][0] self.fontsizecombo.setCurrentItem(sizeid) def __selectItem(self,item): """ Sets the color and size settings boxes to those for item """ self.selecteditem = item for i,item1 in enumerate(self.currentitems): if item1 == item: self.itemcombo.setCurrentItem(i) if item == "Application Workspace": key = "AppWorkSpace" self.colorsizehbox1.show() self.colorsizetext1.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox1.hide() self.colorsizehbox1_layout.remove(self.sizespinbox1) self.colorsizehbox1_layout.addWidget(self.colorcombo1,0,1) self.colorcombo1.show() self.colorcombo1.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo1.setName(key) self.colorsizehbox2.hide() self.colorsizehbox3.hide() self.colorsizehbox4.hide() self.colorsizehbox5.hide() self.colorsizehbox6.hide() self.colorsizehbox7.hide() self.colorsizehbox8.hide() elif item == "Buttons": key = "ButtonFace" self.colorsizehbox1.show() self.colorsizetext1.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox1.hide() self.colorsizehbox1_layout.remove(self.sizespinbox1) self.colorsizehbox1_layout.addWidget(self.colorcombo1,0,1) self.colorcombo1.show() self.colorcombo1.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo1.setName(key) key = "WindowFrame" self.colorsizehbox2.show() self.colorsizetext2.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox2.hide() self.colorsizehbox2_layout.remove(self.sizespinbox2) self.colorsizehbox2_layout.addWidget(self.colorcombo2,0,1) self.colorcombo2.show() self.colorcombo2.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo2.setName(key) key = "ButtonShadow" self.colorsizehbox3.show() self.colorsizetext3.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox3.hide() self.colorsizehbox3_layout.remove(self.sizespinbox3) self.colorsizehbox3_layout.addWidget(self.colorcombo3,0,1) self.colorcombo3.show() self.colorcombo3.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo3.setName(key) key = "ButtonDkShadow" self.colorsizehbox4.show() self.colorsizetext4.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox4.hide() self.colorsizehbox4_layout.remove(self.sizespinbox4) self.colorsizehbox4_layout.addWidget(self.colorcombo4,0,1) self.colorcombo4.show() self.colorcombo4.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo4.setName(key) key = "ButtonLight" self.colorsizehbox5.show() self.colorsizetext5.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox5.hide() self.colorsizehbox5_layout.remove(self.sizespinbox5) self.colorsizehbox5_layout.addWidget(self.colorcombo5,0,1) self.colorcombo5.show() self.colorcombo5.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo5.setName(key) key = "ButtonHilight" self.colorsizehbox6.show() self.colorsizetext6.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox6.hide() self.colorsizehbox6_layout.remove(self.sizespinbox6) self.colorsizehbox6_layout.addWidget(self.colorcombo6,0,1) self.colorcombo6.show() self.colorcombo6.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo6.setName(key) key = "ButtonAlternateFace" self.colorsizehbox7.show() self.colorsizetext7.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox7.hide() self.colorsizehbox7_layout.remove(self.sizespinbox7) self.colorsizehbox7_layout.addWidget(self.colorcombo7,0,1) self.colorcombo7.show() self.colorcombo7.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo7.setName(key) key = "ButtonText" self.colorsizehbox8.show() self.colorsizetext8.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox8.hide() self.colorsizehbox8_layout.remove(self.sizespinbox8) self.colorsizehbox8_layout.addWidget(self.colorcombo8,0,1) self.colorcombo8.show() self.colorcombo8.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo8.setName(key) elif item == "Caption Buttons": key = "CaptionHeight" self.colorsizehbox1.show() self.colorsizetext1.setText(\ self.customizableitems[item][1][key][0]) self.colorcombo1.hide() self.colorsizehbox1_layout.remove(self.colorcombo1) self.colorsizehbox1_layout.addWidget(self.sizespinbox1,0,1) self.sizespinbox1.show() self.sizespinbox1.setName(key) self.sizespinbox1.setValue(\ self.customizableitems[item][1][key][1]) self.sizespinbox1.setMinValue(8) self.sizespinbox1.setMaxValue(100) key = "CaptionWidth" self.colorsizehbox2.show() self.colorsizetext2.setText(\ self.customizableitems[item][1][key][0]) self.colorcombo2.hide() self.colorsizehbox2_layout.remove(self.colorcombo2) self.colorsizehbox2_layout.addWidget(self.sizespinbox2,0,1) self.sizespinbox2.show() self.sizespinbox2.setName(key) self.sizespinbox2.setValue(\ self.customizableitems[item][1][key][1]) self.sizespinbox2.setMinValue(8) self.sizespinbox2.setMaxValue(100) self.colorsizehbox3.hide() self.colorsizehbox4.hide() self.colorsizehbox5.hide() self.colorsizehbox6.hide() self.colorsizehbox7.hide() self.colorsizehbox8.hide() elif item == "Desktop": key = "Background" self.colorsizehbox1.show() self.colorsizetext1.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox1.hide() self.colorsizehbox1_layout.remove(self.sizespinbox1) self.colorsizehbox1_layout.addWidget(self.colorcombo1,0,1) self.colorcombo1.show() self.colorcombo1.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo1.setName(key) self.colorsizehbox2.hide() self.colorsizehbox3.hide() self.colorsizehbox4.hide() self.colorsizehbox5.hide() self.colorsizehbox6.hide() self.colorsizehbox7.hide() self.colorsizehbox8.hide() elif item == "Menu": key = "Menu" self.colorsizehbox1.show() self.colorsizetext1.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox1.hide() self.colorsizehbox1_layout.remove(self.sizespinbox1) self.colorsizehbox1_layout.addWidget(self.colorcombo1,0,1) self.colorcombo1.show() self.colorcombo1.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo1.setName(key) key = "MenuBar" self.colorsizehbox2.show() self.colorsizetext2.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox2.hide() self.colorsizehbox2_layout.remove(self.sizespinbox2) self.colorsizehbox2_layout.addWidget(self.colorcombo2,0,1) self.colorcombo2.show() self.colorcombo2.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo2.setName(key) key = "MenuHilight" self.colorsizehbox3.show() self.colorsizetext3.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox3.hide() self.colorsizehbox3_layout.remove(self.sizespinbox3) self.colorsizehbox3_layout.addWidget(self.colorcombo3,0,1) self.colorcombo3.show() self.colorcombo3.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo3.setName(key) key = "MenuText" self.colorsizehbox4.show() self.colorsizetext4.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox4.hide() self.colorsizehbox4_layout.remove(self.sizespinbox4) self.colorsizehbox4_layout.addWidget(self.colorcombo4,0,1) self.colorcombo4.show() self.colorcombo4.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo4.setName(key) key = "MenuHeight" self.colorsizehbox5.show() self.colorsizetext5.setText(\ self.customizableitems[item][1][key][0]) self.colorcombo5.hide() self.colorsizehbox5_layout.remove(self.colorcombo5) self.colorsizehbox5_layout.addWidget(self.sizespinbox5,0,1) self.sizespinbox5.show() self.sizespinbox5.setName(key) self.sizespinbox5.setValue(\ self.customizableitems[item][1][key][1]) self.sizespinbox5.setMinValue(15) self.sizespinbox5.setMaxValue(100) self.colorsizehbox6.hide() self.colorsizehbox7.hide() self.colorsizehbox8.hide() elif item == "Scrollbar": key = "Scrollbar" self.colorsizehbox1.show() self.colorsizetext1.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox1.hide() self.colorsizehbox1_layout.remove(self.sizespinbox1) self.colorsizehbox1_layout.addWidget(self.colorcombo1,0,1) self.colorcombo1.show() self.colorcombo1.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo1.setName(key) key = "ScrollWidth" self.colorsizehbox2.show() self.colorsizetext2.setText(\ self.customizableitems[item][1][key][0]) self.colorcombo2.hide() self.colorsizehbox2_layout.remove(self.colorcombo2) self.colorsizehbox2_layout.addWidget(self.sizespinbox2,0,1) self.sizespinbox2.show() self.sizespinbox2.setName(key) self.sizespinbox2.setValue(\ self.customizableitems[item][1][key][1]) self.sizespinbox2.setMinValue(8) self.sizespinbox2.setMaxValue(100) self.colorsizehbox3.hide() self.colorsizehbox4.hide() self.colorsizehbox5.hide() self.colorsizehbox6.hide() self.colorsizehbox7.hide() self.colorsizehbox8.hide() elif item == "Selected Items": key = "Hilight" self.colorsizehbox1.show() self.colorsizetext1.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox1.hide() self.colorsizehbox1_layout.remove(self.sizespinbox1) self.colorsizehbox1_layout.addWidget(self.colorcombo1,0,1) self.colorcombo1.show() self.colorcombo1.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo1.setName(key) key = "HilightText" self.colorsizehbox2.show() self.colorsizetext2.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox2.hide() self.colorsizehbox2_layout.remove(self.sizespinbox2) self.colorsizehbox2_layout.addWidget(self.colorcombo2,0,1) self.colorcombo2.show() self.colorcombo2.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo2.setName(key) self.colorsizehbox3.hide() self.colorsizehbox4.hide() self.colorsizehbox5.hide() self.colorsizehbox6.hide() self.colorsizehbox7.hide() self.colorsizehbox8.hide() elif item == "Title Bar": key = "ActiveTitle" self.colorsizehbox1.show() self.colorsizetext1.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox1.hide() self.colorsizehbox1_layout.remove(self.sizespinbox1) self.colorsizehbox1_layout.addWidget(self.colorcombo1,0,1) self.colorcombo1.show() self.colorcombo1.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo1.setName(key) key = "GradientActiveTitle" self.colorsizehbox2.show() self.colorsizetext2.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox2.hide() self.colorsizehbox2_layout.remove(self.sizespinbox2) self.colorsizehbox2_layout.addWidget(self.colorcombo2,0,1) self.colorcombo2.show() self.colorcombo2.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo2.setName(key) key = "InactiveTitle" self.colorsizehbox3.show() self.colorsizetext3.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox3.hide() self.colorsizehbox3_layout.remove(self.sizespinbox3) self.colorsizehbox3_layout.addWidget(self.colorcombo3,0,1) self.colorcombo3.show() self.colorcombo3.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo3.setName(key) key = "GradientInactiveTitle" self.colorsizehbox4.show() self.colorsizetext4.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox4.hide() self.colorsizehbox4_layout.remove(self.sizespinbox4) self.colorsizehbox4_layout.addWidget(self.colorcombo4,0,1) self.colorcombo4.show() self.colorcombo4.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo4.setName(key) key = "TitleText" self.colorsizehbox5.show() self.colorsizetext5.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox5.hide() self.colorsizehbox5_layout.remove(self.sizespinbox5) self.colorsizehbox5_layout.addWidget(self.colorcombo5,0,1) self.colorcombo5.show() self.colorcombo5.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo5.setName(key) key = "InactiveTitleText" self.colorsizehbox6.show() self.colorsizetext6.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox6.hide() self.colorsizehbox6_layout.remove(self.sizespinbox6) self.colorsizehbox6_layout.addWidget(self.colorcombo6,0,1) self.colorcombo6.show() self.colorcombo6.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo6.setName(key) self.colorsizehbox7.hide() self.colorsizehbox8.hide() elif item == "Window": key = "Window" self.colorsizehbox1.show() self.colorsizetext1.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox1.hide() self.colorsizehbox1_layout.remove(self.sizespinbox1) self.colorsizehbox1_layout.addWidget(self.colorcombo1,0,1) self.colorcombo1.show() self.colorcombo1.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo1.setName(key) key = "WindowText" self.colorsizehbox2.show() self.colorsizetext2.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox2.hide() self.colorsizehbox2_layout.remove(self.sizespinbox2) self.colorsizehbox2_layout.addWidget(self.colorcombo2,0,1) self.colorcombo2.show() self.colorcombo2.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo2.setName(key) self.colorsizehbox3.hide() self.colorsizehbox4.hide() self.colorsizehbox5.hide() self.colorsizehbox6.hide() self.colorsizehbox7.hide() self.colorsizehbox8.hide() elif item == "Window Border": key = "ActiveBorder" self.colorsizehbox1.show() self.colorsizetext1.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox1.hide() self.colorsizehbox1_layout.remove(self.sizespinbox1) self.colorsizehbox1_layout.addWidget(self.colorcombo1,0,1) self.colorcombo1.show() self.colorcombo1.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo1.setName(key) key = "InactiveBorder" self.colorsizehbox2.show() self.colorsizetext2.setText(\ self.customizableitems[item][0][key][0]) self.sizespinbox2.hide() self.colorsizehbox2_layout.remove(self.sizespinbox2) self.colorsizehbox2_layout.addWidget(self.colorcombo2,0,1) self.colorcombo2.show() self.colorcombo2.setColor(\ self.customizableitems[item][0][key][1]) self.colorcombo2.setName(key) key = "BorderWidth" self.colorsizehbox3.show() self.colorsizetext3.setText(\ self.customizableitems[item][1][key][0]) self.colorcombo3.hide() self.colorsizehbox3_layout.remove(self.colorcombo3) self.colorsizehbox3_layout.addWidget(self.sizespinbox3,0,1) self.sizespinbox3.show() self.sizespinbox3.setName(key) self.sizespinbox3.setValue(\ self.customizableitems[item][1][key][1]) self.sizespinbox3.setMinValue(1) self.sizespinbox3.setMaxValue(50) self.colorsizehbox4.hide() self.colorsizehbox5.hide() self.colorsizehbox6.hide() self.colorsizehbox7.hide() self.colorsizehbox8.hide() else: # Shouldn't happen. self.colorsizehbox1.hide() self.colorsizehbox2.hide() self.colorsizehbox3.hide() self.colorsizehbox4.hide() self.colorsizehbox5.hide() self.colorsizehbox6.hide() self.colorsizehbox7.hide() self.colorsizehbox8.hide() def setMargin(self,margin): self.top_layout.setMargin(margin) def setSpacing(self,spacing): self.top_layout.setSpacing(spacing) # --- Some default color schemes, with names --- preset1 = (unicode(i18n("Purple")), {"Window Border": ({"ActiveBorder":[unicode(i18n("Active Color:")),QColor(239,239,239)], "InactiveBorder":[unicode(i18n("Inactive Color:")),QColor(239,239,239)]}, {"BorderWidth":[unicode(i18n("Width:")),1]}), #ActiveBorder, InactiveBorder, metrics: BorderWidth "Title Bar": ({"ActiveTitle":[unicode(i18n("Active Color:")),QColor(91,86,168)], "GradientActiveTitle":[unicode(i18n("Gradient:")),QColor(136,118,202)], "InactiveTitle":[unicode(i18n("Inactive Color:")),QColor(223,225,230)], "GradientInactiveTitle":[unicode(i18n("Gradient:")),QColor(157,170,186)], "TitleText":[unicode(i18n("Active Text:")),QColor(255,255,255)], "InactiveTitleText":[unicode(i18n("Inactive Text:")),QColor(168,168,168)]}, {}), #ActiveTitle, GradientActiveTitle, InactiveTitle, GradientInactiveTitle, TitleText, InactiveTitleText "Application Workspace": ({"AppWorkSpace":[unicode(i18n("Background Color:")),QColor(90,90,90)]}, {}), #AppWorkSpace "Background" "Buttons": ({"ButtonFace":[unicode(i18n("Face:")),QColor(238,239,242)], "ButtonHilight":[unicode(i18n("Hilight:")),QColor(255,255,255)], "ButtonLight":[unicode(i18n("Light:")),QColor(201,199,255)], "ButtonShadow":[unicode(i18n("Shadow:")),QColor(132,132,134)], "ButtonText":[unicode(i18n("Text Color:")),QColor(0,0,0)], "ButtonAlternateFace":[unicode(i18n("Alternate Face:")),QColor(238,239,242)], "ButtonDkShadow":[unicode(i18n("Dark Shadow:")),QColor(98,96,143)], "WindowFrame":[unicode(i18n("Frame:")),QColor(144,140,209)]}, {}), #ButtonFace, ButtonHilight, ButtonLight, ButtonShadow, ButtonText, ButtonAlternateFace, ButtonDkShadow, WindowFrame "Caption Buttons": ({}, {"CaptionHeight":[unicode(i18n("Height:")),22], "CaptionWidth":[unicode(i18n("Width:")),22]}), #Metrics: CaptionHeight, CaptionWidth "Desktop": ({"Background":[unicode(i18n("Background:")),QColor(146,127,188)]}, {}), #Background "Menu": ({"Menu":[unicode(i18n("Menu Background:")),QColor(250,251,254)], "MenuBar":[unicode(i18n("Menu Bar Color:")),QColor(238,239,242)], "MenuHilight":[unicode(i18n("Menu Hilight:")),QColor(144,140,209)], "MenuText":[unicode(i18n("Text Color:")),QColor(0,0,0)]}, {"MenuHeight":[unicode(i18n("Menu Bar Height:")),22]}), #Menu (Background), MenuBar, MenuHilight, MenuText, metrics: MenuHeight, MenuWidth (does nothing) "Scrollbar": ({"Scrollbar":[unicode(i18n("Color:")),QColor(238,239,242)]}, {"ScrollWidth":[unicode(i18n("Width:")),16]}), #Scrollbar, metrics: ScrollHeight (does nothing), ScrollWidth "Window": ({"Window":[unicode(i18n("Background:")),QColor(255,255,255)], "WindowText":[unicode(i18n("Text Color:")),QColor(0,0,0)]}, {}), #Window "Background", WindowText "Selected Items": ({"Hilight":[unicode(i18n("Hilight Color:")),QColor(144,140,209)], "HilightText":[unicode(i18n("Text Color:")),QColor(255,255,255)]}, {})}) #Hilight, HilightText preset2 = (unicode(i18n("Blue")), {"Window Border": ({"ActiveBorder":[unicode(i18n("Active Color:")),QColor(239,239,239)], "InactiveBorder":[unicode(i18n("Inactive Color:")),QColor(239,239,239)]}, {"BorderWidth":[unicode(i18n("Width:")),1]}), #ActiveBorder, InactiveBorder, metrics: BorderWidth "Title Bar": ({"ActiveTitle":[unicode(i18n("Active Color:")),QColor(0,113,201)], "GradientActiveTitle":[unicode(i18n("Gradient:")),QColor(87,161,219)], "InactiveTitle":[unicode(i18n("Inactive Color:")),QColor(191,191,191)], "GradientInactiveTitle":[unicode(i18n("Gradient:")),QColor(171,171,171)], "TitleText":[unicode(i18n("Active Text:")),QColor(255,255,255)], "InactiveTitleText":[unicode(i18n("Inactive Text:")),QColor(95,95,95)]}, {}), #ActiveTitle, GradientActiveTitle, InactiveTitle, GradientInactiveTitle, TitleText, InactiveTitleText "Application Workspace": ({"AppWorkSpace":[unicode(i18n("Background Color:")),QColor(90,90,90)]}, {}), #AppWorkSpace "Background" "Buttons": ({"ButtonFace":[unicode(i18n("Face:")),QColor(239,239,239)], "ButtonHilight":[unicode(i18n("Hilight:")),QColor(246,246,246)], "ButtonLight":[unicode(i18n("Light:")),QColor(191,207,251)], "ButtonShadow":[unicode(i18n("Shadow:")),QColor(148,148,153)], "ButtonText":[unicode(i18n("Text Color:")),QColor(0,0,0)], "ButtonAlternateFace":[unicode(i18n("Alternate Face:")),QColor(238,239,242)], "ButtonDkShadow":[unicode(i18n("Dark Shadow:")),QColor(50,101,146)], "WindowFrame":[unicode(i18n("Frame:")),QColor(74,149,214)]}, {}), #ButtonFace, ButtonHilight, ButtonLight, ButtonShadow, ButtonText, ButtonAlternateFace, ButtonDkShadow, WindowFrame "Caption Buttons": ({}, {"CaptionHeight":[unicode(i18n("Height:")),22], "CaptionWidth":[unicode(i18n("Width:")),22]}), #Metrics: CaptionHeight, CaptionWidth "Desktop": ({"Background":[unicode(i18n("Background:")),QColor(44,109,189)]}, {}), #Background "Menu": ({"Menu":[unicode(i18n("Menu Background:")),QColor(249,249,249)], "MenuBar":[unicode(i18n("Menu Bar Color:")),QColor(239,239,239)], "MenuHilight":[unicode(i18n("Menu Hilight:")),QColor(74,149,214)], "MenuText":[unicode(i18n("Text Color:")),QColor(0,0,0)]}, {"MenuHeight":[unicode(i18n("Menu Bar Height:")),22]}), #Menu (Background), MenuBar, MenuHilight, MenuText, metrics: MenuHeight, MenuWidth (does nothing) "Scrollbar": ({"Scrollbar":[unicode(i18n("Color:")),QColor(230,230,230)]}, {"ScrollWidth":[unicode(i18n("Width:")),16]}), #Scrollbar, metrics: ScrollHeight (does nothing), ScrollWidth "Window": ({"Window":[unicode(i18n("Background:")),QColor(255,255,255)], "WindowText":[unicode(i18n("Text Color:")),QColor(0,0,0)]}, {}), #Window "Background", WindowText "Selected Items": ({"Hilight":[unicode(i18n("Hilight Color:")),QColor(74,149,214)], "HilightText":[unicode(i18n("Text Color:")),QColor(255,255,255)]}, {})}) #Hilight, HilightText presets = [preset1,preset2] ############################################################################ class GeneralPage(QWidget): winversions = wineread.winversions verdic = { "win2003":0, "winxp":1, "win2k":2, "winme":3, "win98":4, "win95":5, "nt40":6, "nt351":7, "win31":8, "win30":9, "win20":10} def __init__(self,parent = None,name = None,modal = 0,fl = 0): global application QWidget.__init__(self,parent) if not name: self.setName("GeneralTab") general_tab_layout = QVBoxLayout(self,0,0,"GeneralTabLayout") self.top_layout = general_tab_layout vbox = QVBox(self) vbox.setSpacing(KDialog.spacingHint()) general_tab_layout.addWidget(vbox) if application: appwarning = QLabel(vbox,"appwarning") appwarning.setText(i18n("Application specific settings for " +\ application + "Changing a setting here will permanently " +\ "make that setting independent of settings for all other " +\ "applications.
")) appwarning.setFrameStyle( QFrame.Box | QFrame.Raised ) self.winversions = self.winversions + (( "global",\ unicode(i18n("Use Global Setting")), 0, 0, 0, "", "", 0, 0, ""),) self.verdic["global"]=11 hbox = QHBox(vbox) hbox.setSpacing(KDialog.spacingHint()) versiontext = QLabel(hbox,"versiontext") versiontext.setText(i18n("Windows version:")) self.versioncombo = KComboBox(0,hbox,"versioncombo") self.fillVersionCombo(self.versioncombo) self.connect(self.versioncombo,SIGNAL("activated(int)"),self.slotVersionActivated) spacer = QWidget(hbox) hbox.setStretchFactor(spacer,1) bottomspacer = QSpacerItem(51,160,QSizePolicy.Minimum,QSizePolicy.Expanding) general_tab_layout.addItem(bottomspacer) self.reset() self.clearWState(Qt.WState_Polished) def isChanged(self): changed = False changed = changed or self.currentwinverid != self.originalwinverid return changed def reset(self): settings = wineread.GetGeneralWineSettings(application) if application: self.currentwinverid = self.verdic[settings.get("Version","global")] else: self.currentwinverid = self.verdic[settings.get("Version","winxp")] self.originalwinverid = self.currentwinverid self.__selectWinVer(self.currentwinverid) def applyChanges(self): """ Applies the changes to wine's configuration """ winewrite.SetWinVersion(self.winversions[self.currentwinverid], application) self.reset() def fillVersionCombo(self,combo): """ Fill the combobox with the values from our list """ for version in self.winversions: combo.insertItem(version[1]) def slotVersionActivated(self,verid): self.currentwinverid = verid self.emit(PYSIGNAL("changedSignal()"), ()) def __selectWinVer(self,verid): """ Sets the current Windows version and selects it in the combo box """ self.versioncombo.setCurrentItem(verid) def setMargin(self,margin): self.top_layout.setMargin(margin) def setSpacing(self,spacing): self.top_layout.setSpacing(spacing) ############################################################################ class ApplicationsPage(QWidget): applications = [] browsers = [] mailers = [] def __init__(self,parent = None,name = None,modal = 0,fl = 0): QWidget.__init__(self,parent) if not name: self.setName("ApplicationsTab") applications_tab_layout = QVBoxLayout(self,0,0,"ApplicationsTabLayout") self.top_layout = applications_tab_layout vbox = QVBox(self) vbox.setSpacing(KDialog.spacingHint()) applications_tab_layout.addWidget(vbox) # -- Application Specific Settings group -- self.perapp_group_box = QHGroupBox(vbox) self.perapp_group_box.setTitle(i18n("Application specific settings")) self.perapp_group_box.setInsideSpacing(KDialog.spacingHint()) self.perapp_group_box.setInsideMargin(KDialog.marginHint()) vbox2 = QVBox(self.perapp_group_box) vbox2.setSpacing(KDialog.spacingHint()) applicationstext = QLabel(vbox2,"applicationstext") applicationstext.setText(i18n("Change application specific settings for:")) self.appslist = KListBox(vbox2) self.connect(self.appslist, SIGNAL("selectionChanged(QListBoxItem *)"), self.slotListClicked) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) self.addbutton = KPushButton(i18n("Add Application..."),hbox) self.connect(self.addbutton,SIGNAL("clicked()"),self.slotAddClicked) self.removebutton = KPushButton(i18n("Remove..."),hbox) self.connect(self.removebutton,SIGNAL("clicked()"),self.slotRemoveClicked) spacer = QWidget(hbox) hbox.setStretchFactor(spacer,1) self.settingsbutton = KPushButton(i18n("Settings"),hbox) self.connect(self.settingsbutton,SIGNAL("clicked()"),self.slotSettingsClicked) # -- Native Applications Settings group -- # Removed pending a patch to winebrowser #self.nativeapp_group_box = QVGroupBox(vbox) #self.nativeapp_group_box.setTitle(i18n("Native applications")) #self.nativeapp_group_box.setInsideSpacing(KDialog.spacingHint()) #self.nativeapp_group_box.setInsideMargin(KDialog.marginHint()) #vbox3 = QWidget(self.nativeapp_group_box) #native_apps_layout = QGridLayout(vbox3,2,3) #native_apps_layout.setSpacing(KDialog.spacingHint()) #browsertext = QLabel(vbox3,"browsertext") #browsertext.setText(i18n("Web Browser:")) #native_apps_layout.addWidget(browsertext,0,0) #self.browsercombo = KComboBox(0,vbox3,"browsercombo") #self.browsercombo.setEditable(False) #self.connect(self.browsercombo,SIGNAL("activated(int)"),self.slotBrowserActivated) #native_apps_layout.addWidget(self.browsercombo,0,1) #native_apps_layout.setColStretch(1,1) #QToolTip.add(self.browsercombo, #i18n("Select the browser to be launched when clicking on a link" +\ #" in a Windows application.
")) #self.browserbutton = KPushButton(i18n("..."),vbox3) #self.connect(self.browserbutton,SIGNAL("clicked()"),self.slotBrowserClicked) #native_apps_layout.addWidget(self.browserbutton,0,2) #mailertext = QLabel(vbox3,"mailertext") #mailertext.setText(i18n("Mail Client:")) #native_apps_layout.addWidget(mailertext,1,0) #self.mailercombo = KComboBox(0,vbox3,"mailercombo") #self.connect(self.mailercombo,SIGNAL("activated(int)"),self.slotMailerActivated) #native_apps_layout.addWidget(self.mailercombo,1,1) #QToolTip.add(self.mailercombo, #i18n("Select the mail client to be launched when clicking on" +\ #" a mailto link in a Windows application.
")) #self.mailerbutton = KPushButton(i18n("..."),vbox3) #self.connect(self.mailerbutton,SIGNAL("clicked()"),self.slotMailerClicked) #native_apps_layout.addWidget(self.mailerbutton,1,2) bottomspacer = QSpacerItem(51,160,QSizePolicy.Minimum,QSizePolicy.Expanding) applications_tab_layout.addItem(bottomspacer) self.changed = False # Removed pending a patch to winebrowser #browsers = wineread.GetNativeBrowserList() #if "kfmclient exec" not in browsers: #browsers.append("kfmclient exec") #self.currentbrowser = wineread.GetBrowser() #self.browsers = self.createBrowserList(browsers,[self.currentbrowser]) #self.fillCombo(self.browsercombo,self.browsers) #mailers = wineread.GetNativeMailerList() #if "kfmclient exec" not in mailers: #mailers.append("kfmclient exec") #self.currentmailer = wineread.GetMailer() #self.mailers = self.createMailerList(mailers,[self.currentmailer]) #self.fillCombo(self.mailercombo,self.mailers) self.reset() self.clearWState(Qt.WState_Polished) def isChanged(self): changed = False changed = changed or self.applications != self.originalapplications #changed = changed or self.currentbrowser != self.originalbrowser #changed = changed or self.currentmailer != self.originalmailer return changed def reset(self): self.applications = wineread.GetApps() self.originalapplications = self.applications[:] self.updateAppsList() # Removed pending a patch to winebrowser #self.currentbrowser = wineread.GetBrowser() #self.__selectBrowser(self.currentbrowser) #self.originalbrowser = self.currentbrowser #self.currentmailer = wineread.GetMailer() #self.__selectMailer(self.currentmailer) #self.originalmailer = self.currentmailer def applyChanges(self): """ Applies the changes to wine's configuration """ if self.applications != self.originalapplications: winewrite.SetApps(self.applications) # Removed pending a patch to winebrowser #if self.currentbrowser != self.originalbrowser: #winewrite.SetDefaultBrowser(self.currentbrowser) #if self.currentmailer != self.originalmailer: #winewrite.SetDefaultMailer(self.currentmailer) self.reset() def createBrowserList(self,native,wine): """ Takes a list of native browsers and a list wine browsers and creates a list of the commands with descriptions """ browsers = [] for browser in native: browserwords = browser.split() if browserwords and browserwords[0] == "kfmclient": browserkfmcmd = browser.split(' ') if len(browserkfmcmd) > 2 and \ browserkfmcmd[1] == 'openProfile': browsertr = "Konqueror " + browserkfmcmd[2] +\ str(i18n(" profile (Native)")) elif len(browserkfmcmd) > 1 and \ browserkfmcmd[1] == 'exec': browsertr = str(i18n("Use KDE Default")) else: browsertr = str(i18n("Konqueror (Native)")) else: browsertr = browser.capitalize() + str(i18n(" (Native)")) browsers.append((browser,browsertr)) for browser in wine: if browser and browser[1] == ':': browser = browser.lower() browsertr = browser[browser.rfind('\\\\')+2:browser.rfind('.exe')] browsertr = browsertr.capitalize() + str(i18n(" (Windows, set by application)")) else: # winebrowser continue browsers.append((browser,browsertr)) return browsers def createMailerList(self,native,wine): """ Takes a list of native mailers and a list wine mailers and creates a list of the commands with descriptions """ mailers = [] for mailer in native: mailerwords = mailer.split() if mailerwords and mailerwords[0] == "kfmclient": mailerkfmcmd = mailer.split(' ') if len(mailerkfmcmd) > 1 and \ mailerkfmcmd[1] == 'exec': mailertr = str(i18n("Use KDE Default")) else: mailertr = str(i18n("KDE (Native)")) else: mailertr = mailer.capitalize() + unicode(i18n(" (Native)")) mailers.append((mailer,mailertr)) for mailer in wine: if mailer and mailer[1] == ':': mailer = mailer.lower() mailertr = mailer[mailer.rfind('\\\\')+2:mailer.rfind('.exe')] mailertr = mailertr.capitalize() + unicode(i18n(" (Windows, set by application)")) else: # winebrowser continue mailers.append((mailer,mailertr)) return mailers def slotListClicked(self,item): """ Called when an application in the list is clicked """ for appid,appname in enumerate(self.applications): if appname==item.text(): self.__selectApp(appid) return def slotAddClicked(self): """ Let the user choose a new application to change settings for """ app = KFileDialog.getOpenFileName(wineread.winepath + \ "/dosdevices/c:",\ "*.exe|" + unicode(i18n("Windows Executables (*.exe)")),self,i18n("Application")) if app: app = str(app).split('/') app = app[-1] self.applications.append(app) self.updateAppsList() for appid,appname in enumerate(self.applications): if appname==app: self.__selectApp(appid) self.emit(PYSIGNAL("changedSignal()"), ()) def slotRemoveClicked(self): """ Removes settings for selected application """ if KMessageBox.warningContinueCancel(self, \ i18n("This will remove all application specific settings for \n" +\ self.applications[self.selectedappid] +"\n" +\ "Do you want to proceed?"),\ i18n("Warning")) == KMessageBox.Continue: del self.applications[self.selectedappid] self.updateAppsList() self.emit(PYSIGNAL("changedSignal()"), ()) def slotSettingsClicked(self): """ Launches a new wineconfig window for the selected application """ os.system("wineconfig " + self.applications[self.selectedappid]) def slotBrowserEdited(self,browser): """ Sets the first browser to use to the one selected in the combo box """ self.currentbrowser = str(browser).strip() self.emit(PYSIGNAL("changedSignal()"), ()) def slotBrowserActivated(self,browserid): """ Sets the first browser to use to the one selected in the combo box """ self.currentbrowser = self.browsers[browserid][0] self.emit(PYSIGNAL("changedSignal()"), ()) def slotBrowserClicked(self): """ Sets the first browser to use to the one selected in the combo box """ browserdlg = KOpenWithDlg(self) browserdlg.hideNoCloseOnExit() browserdlg.hideRunInTerminal() if browserdlg.exec_loop():#i18n("Choose a Web Browser"),self.currentbrowser) self.__selectBrowser(str(browserdlg.text())) self.emit(PYSIGNAL("changedSignal()"), ()) def slotMailerEdited(self,mailer): """ Sets the first mailer to use to the one selected in the combo box """ self.currentmailer = str(mailer).strip() self.emit(PYSIGNAL("changedSignal()"), ()) def slotMailerActivated(self,mailerid): """ Sets the first browser to use to the one selected in the combo box """ self.currentmailer = self.mailers[mailerid][0] self.emit(PYSIGNAL("changedSignal()"), ()) def slotMailerClicked(self): """ Sets the first mailer to use to the one selected in the combo box """ mailerdlg = KOpenWithDlg(self) mailerdlg.hideNoCloseOnExit() mailerdlg.hideRunInTerminal() if mailerdlg.exec_loop():#i18n("Choose a Web Browser"),self.currentbrowser) self.__selectMailer(str(mailerdlg.text())) self.emit(PYSIGNAL("changedSignal()"), ()) def fillCombo(self,combo,_list): """ Fill the combobox with the values from our list Uses the second value from each tuple """ for item in _list: combo.insertItem(item[1]) def updateAppsList(self): """ Updates the displayed list of applications """ self.appslist.clear() self.applications.sort() self.appslist.insertStringList(QStringList.fromStrList(self.applications)) self.__selectApp(None) def __selectBrowser(self,browsercommand): """ Selects the browser in the combobox """ self.currentbrowser = browsercommand for i,browser in enumerate(self.browsers): if browser[0].lower() == browsercommand.lower(): self.browsercombo.setCurrentItem(i) break else: browserwords = browsercommand.split() #if len(browserwords) > 1 and browserwords[0] != "kfmclient": # browsercommand = browserwords[0] self.browsers = self.browsers +\ self.createBrowserList([browsercommand],[]) self.browsercombo.insertItem(self.browsers[-1][1]) self.__selectBrowser(browsercommand) def __selectMailer(self,mailercommand): """ Selects the mailer in the combobox """ self.currentmailer = mailercommand for i,mailer in enumerate(self.mailers): if mailer[0] == mailercommand: self.mailercombo.setCurrentItem(i) break else: mailerwords = mailercommand.split() #if len(mailerwords) > 1 and mailerwords[0] != "kfmclient": # mailercommand = mailerwords[0] self.mailers = self.mailers +\ self.createBrowserList([mailercommand],[]) self.mailercombo.insertItem(self.mailers[-1][1]) self.__selectMailer(mailercommand) def __selectApp(self,appid): """ Selects the application """ if appid or appid == 0: self.selectedappid = appid self.appslist.setCurrentItem(appid) self.removebutton.setEnabled(True) self.settingsbutton.setEnabled(True) else: self.selectedappid = None self.removebutton.setEnabled(False) self.settingsbutton.setEnabled(False) def GetKdeDefaultBrowser(self): """ Returns the default browser set in KDE """ # Create a configuration object. config = KConfig("wineconfigrc") return str(config.lookupData(KEntryKey("General","BrowserApplication")).mValue).strip('!') def setMargin(self,margin): self.top_layout.setMargin(margin) def setSpacing(self,spacing): self.top_layout.setSpacing(spacing) ############################################################################ class LibrariesPage(QWidget): dlls = [""] overriddendlls = {} orderoptions = ("builtin","native","builtin,native","native,builtin","") orderoptionstr = [ unicode(i18n("Built-in (Wine)")), unicode(i18n("Native (Windows)")), unicode(i18n("Built-in then Native")), unicode(i18n("Native then Built-in")), unicode(i18n("Disable"))] def __init__(self,parent = None,name = None,modal = 0,fl = 0): QWidget.__init__(self,parent) if not name: self.setName("LibrariesTab") libraries_tab_layout = QVBoxLayout(self,0,0,"LibrariesTabLayout") self.top_layout = libraries_tab_layout vbox = QVBox(self) vbox.setSpacing(KDialog.spacingHint()) libraries_tab_layout.addWidget(vbox) # -- DLL overrides group self.overrides_group_box = QHGroupBox(vbox) self.overrides_group_box.setTitle(i18n("DLL Overrides")) self.overrides_group_box.setInsideSpacing(KDialog.spacingHint()) self.overrides_group_box.setInsideMargin(KDialog.marginHint()) vbox2 = QVBox(self.overrides_group_box) vbox2.setSpacing(KDialog.spacingHint()) spacer = QWidget(vbox2) vbox2.setStretchFactor(spacer,1) newtext = QLabel(vbox2,"newtext") newtext.setText(i18n("New override for library:")) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) self.dllcombo = KComboBox(0,hbox,"dllcombo") self.dllcombo.setEditable(True) hbox.setStretchFactor(self.dllcombo,3) self.connect(self.dllcombo,SIGNAL("activated(int)"),self.slotDllComboActivated) QToolTip.add(self.dllcombo, i18n("Dynamic Link Libraries can be specified individually to" +\ " be either builtin (provided by Wine) or native (taken from" +\ " Windows or provided by the application).
")) self.addbutton = KPushButton(i18n("Add"),hbox) hbox.setStretchFactor(self.addbutton,1) self.connect(self.addbutton,SIGNAL("clicked()"),self.slotAddClicked) existingtext = QLabel(vbox2,"existingtext") existingtext.setText(i18n("Existing overrides:")) hbox = QHBox(vbox2) hbox.setSpacing(KDialog.spacingHint()) self.dllslist = KListView(hbox) self.dllslist.addColumn(i18n("Library")) self.dllslist.addColumn(i18n("Load Order")) self.dllslist.setAllColumnsShowFocus(True) self.dllslist.setSelectionMode(QListView.Single) self.dllslist.setSorting(-1,True) hbox.setStretchFactor(self.dllslist,3) self.connect(self.dllslist, SIGNAL("selectionChanged(QListViewItem *)"), self.slotListClicked) vbox3 = QVBox(hbox) vbox3.setSpacing(KDialog.spacingHint()) hbox.setStretchFactor(vbox3,1) self.editbutton = KPushButton(i18n("Edit"),vbox3) self.connect(self.editbutton,SIGNAL("clicked()"),self.slotEditClicked) self.editbutton.setEnabled(False) self.removebutton = KPushButton(i18n("Remove"),vbox3) self.connect(self.removebutton,SIGNAL("clicked()"),self.slotRemoveClicked) self.removebutton.setEnabled(False) spacer = QWidget(vbox3) vbox3.setStretchFactor(spacer,1) bottomspacer = QSpacerItem(51,160,QSizePolicy.Minimum,QSizePolicy.Expanding) libraries_tab_layout.addItem(bottomspacer) self.changed = False self.reset() self.clearWState(Qt.WState_Polished) def isChanged(self): changed = False changed = changed or self.overriddendlls != self.originaloverriddendlls return changed def reset(self): self.dlls = wineread.GetDllsList() self.fillCombo(self.dllcombo) self.overriddendlls = wineread.GetDllOverrides(application) self.originaloverriddendlls = self.overriddendlls.copy() self.selecteddll = None self.updateDllOverridesList() def applyChanges(self): """ Applies the changes to wine's configuration """ winewrite.SetDllOverrides(self.overriddendlls,application) self.reset() def slotListClicked(self,item): """ Called when an application in the list is clicked """ self.__selectOverriddenDll(item.text(0)) def slotAddClicked(self): """ Adds the selected library to the overrides list """ dll = self.dllcombo.currentText() if dll: self.overriddendlls[str(dll)]="native,builtin" self.updateDllOverridesList() self.__selectOverriddenDll(dll) self.emit(PYSIGNAL("changedSignal()"), ()) def slotRemoveClicked(self): """ Removes override for selected library """ del self.overriddendlls[str(self.selecteddll)] self.updateDllOverridesList() self.__selectOverriddenDll(None) self.emit(PYSIGNAL("changedSignal()"), ()) def slotEditClicked(self): """ Gives a choice for the load order for the library """ if self.selecteddll: order = KInputDialog.getItem(i18n("Edit Library Override"),\ unicode(i18n("Load order for %s:")) % (unicode(self.selecteddll),), QStringList.fromStrList(self.orderoptionstr),\ False,0,self,"editdll") if order[1]: self.overriddendlls[str(self.selecteddll)] = \ self.orderoptions[self.orderoptionstr.index(str(order[0]))] self.updateDllOverridesList() self.emit(PYSIGNAL("changedSignal()"), ()) def slotDllComboActivated(self,dllid): return def fillCombo(self,combo): """ Fill the combobox with the values from our list """ for dll in self.dlls: combo.insertItem(dll) def updateDllOverridesList(self): """ Updates the displayed list of drives """ self.dllslist.clear() self.dllsToListItems = {} firstselecteddll = None lastdll = None for dll,order in self.overriddendlls.iteritems(): lvi = QListViewItem(self.dllslist,dll,order) self.dllsToListItems[dll] = lvi if self.selecteddll and self.selecteddll==dll: firstselecteddll = dll lastdll = dll self.dllslist.setSortColumn(0) self.selecteddll = firstselecteddll self.__selectOverriddenDll(self.selecteddll) self.dllslist.ensureItemVisible(self.dllslist.currentItem()) def __selectOverriddenDll(self,dll): """ Select a dll from the overridden list """ self.selecteddll = dll if dll: self.dllslist.setSelected(self.dllsToListItems[str(dll)],True) self.editbutton.setEnabled(True) self.removebutton.setEnabled(True) else: self.editbutton.setEnabled(False) self.removebutton.setEnabled(False) def setMargin(self,margin): self.top_layout.setMargin(margin) def setSpacing(self,spacing): self.top_layout.setSpacing(spacing) ############################################################################ def create_wineconfig(parent,name): """ Factory function for KControl """ global kapp kapp = TDEApplication.kApplication() return WineConfigApp(parent, name) ############################################################################ def MakeAboutData(): aboutdata = KAboutData("guidance",programname,version, \ "Wine Configuration Tool", KAboutData.License_GPL, \ "Copyright (C) 2006-2007 Yuriy Kozlov", \ "Thanks go to Simon Edwards, Sebastian Kügler") aboutdata.addAuthor("Yuriy Kozlov","Developer","yuriy.kozlov@gmail.com", \ "http://www.yktech.us/") aboutdata.addAuthor("Simon Edwards","Developer","simon@simonzone.com", \ "http://www.simonzone.com/software/") aboutdata.addAuthor("Sebastian Kügler","Developer","sebas@kde.org", \ "http://vizZzion.org") return aboutdata if standalone: aboutdata = MakeAboutData() KCmdLineArgs.init(sys.argv,aboutdata) # Can't do i18n? options = [("+[appname]", str(i18n("Application to change settings for")))] KCmdLineArgs.addCmdLineOptions( options ) kapp = TDEApplication() wineconfigapp = WineConfigApp() wineconfigapp.exec_loop(None)