#!/usr/bin/env python #-*- coding: UTF-8 -*- # Filename: otherSettingQt4.py # Author: Xu Jia (Sanfanling) E-mail:xujia19@sohu.com # Lisence: GPL-2.0 from PyQt4.QtGui import * from PyQt4.QtCore import * import sys,os class otherSettingQt4(QDialog): def __init__(self,*args): apply(QDialog.__init__,(self,) + args) self.setWindowTitle(_(u'参数设置')) mainWindowLayout=QVBoxLayout(None) layout1=QHBoxLayout(None) self.settingPage=QStackedWidget(self) self.normalPage=normalPage(self) self.settingPage.addWidget(self.normalPage) self.behaviorPage=behaviorPage(self) self.settingPage.addWidget(self.behaviorPage) self.lrcPathPage=lrcPathPage(self) self.settingPage.addWidget(self.lrcPathPage) self.limitPage=limitPage(self) self.settingPage.addWidget(self.limitPage) self.shortcutPage=shortcutPage(self) self.settingPage.addWidget(self.shortcutPage) self.itemBox=QListWidget(self) self.itemBox.setFixedWidth(100) itemList=[_(u'常规'),_(u'窗口'),_(u'歌词路径'),_(u'歌词过滤'),_(u'快捷键')] for i in itemList: self.itemBox.addItem(i) layout1.addWidget(self.itemBox) layout1.addWidget(self.settingPage) layout2=QHBoxLayout(None) layout2.addStretch(0) layout2.SizeConstraint(QLayout.SetFixedSize) layout2.setSpacing(20) layout2.setContentsMargins(230,10,10,10) self.okButtong=QPushButton(_(u'确定'),self) self.cancelButton=QPushButton(_(u'取消'),self) layout2.addWidget(self.okButtong) layout2.addWidget(self.cancelButton) mainWindowLayout.addLayout(layout1) mainWindowLayout.addLayout(layout2) self.setLayout(mainWindowLayout) self.connect(self.okButtong,SIGNAL("clicked()"),self,SLOT("accept()")) self.connect(self.cancelButton,SIGNAL("clicked()"),self,SLOT("reject()")) self.connect(self.itemBox,SIGNAL("currentRowChanged(int)"),self.settingPage,SLOT("setCurrentIndex(int)")) ############### page: 1 ############ class normalPage(QWidget): def __init__(self,*args): apply(QWidget.__init__,(self,) + args) mainLayout=QVBoxLayout(None) mainLayout.setContentsMargins(0,0,0,80) self.autoInsert=QCheckBox(_(u'自动插入歌词至Amarok侧边栏'),self) self.completeTagSearch=QCheckBox(_(u'仅标签完整时搜索歌词'),self) self.asTrackName=QCheckBox(_(u'以音频文件名搜索本地歌词和命名歌词文件'),self) self.lrcInMedia=QCheckBox(_(u'优先使用内嵌歌词'),self) layout3=QHBoxLayout(None) layout3.setContentsMargins(0,20,100,0) self.embedLable=QLabel(_(u'写入、删除内嵌歌词的标签类型:'),self) self.comboBoxType=QComboBox(self) self.strTagList=['id3v2-uslt','apetag','lyrics3v2','lyrics3v1','id3v2-sylt'] tagTypeList=QStringList() for i in self.strTagList: tagTypeList.append(i) self.comboBoxType.addItems(tagTypeList) layout3.addWidget(self.embedLable) layout3.addWidget(self.comboBoxType) layout1=QHBoxLayout(None) layout1.setContentsMargins(0,20,100,0) self.saveEncoderLabel=QLabel(_(u'设置保存编码:'),self) self.comboBox=QComboBox(self) self.strList=['latin1','big5','big5-hkscs','eucjp','shift-jis','iso 2022-jp-1','euc-jisx0213','euckr','gb2312','gbk','gb18030','utf8','utf16','koi8-r','koi8-u','iso 8859-1','iso 8859-2','iso 8859-3','iso 8859-4','iso 8859-5','iso 8859-6','iso 8859-7','iso 8859-8','iso 8859-9','iso 8859-10','iso 8859-13','iso 8859-14','iso 8859-15','ibm850','ibm866','cp874','cp1250','cp1251','cp1252','cp1253','cp1254','cp1255','cp1256','cp1257','cp1258','tis-620','mac roman'] codecList=QStringList() for i in self.strList: codecList.append(i) self.comboBox.addItems(codecList) layout1.addWidget(self.saveEncoderLabel) layout1.addWidget(self.comboBox) layout2=QHBoxLayout(None) layout2.setContentsMargins(0,20,0,0) self.proxyLabel=QLabel(_(u'设置网络代理:'),self) self.proxy=QLineEdit(self) layout2.addWidget(self.proxyLabel) layout2.addWidget(self.proxy) self.commentLabel=QLabel(_(u'(留空表示不使用代理,代理形式为:http://xxx.yyy.xxx:ww)'),self) mainLayout.addWidget(self.completeTagSearch) mainLayout.addWidget(self.autoInsert) mainLayout.addWidget(self.asTrackName) mainLayout.addWidget(self.lrcInMedia) mainLayout.addLayout(layout3) mainLayout.addLayout(layout1) mainLayout.addLayout(layout2) mainLayout.addWidget(self.commentLabel) self.setLayout(mainLayout) self.connect(self.autoInsert,SIGNAL("clicked(bool)"),self.autoInsertWarning) def autoInsertWarning(self,checked): if(checked): QMessageBox.warning(self,_(u'提示'),_(u'开启此功能,强烈建议您关闭其它Amarok歌词类脚本')) ################### page: 2 ################## class behaviorPage(QWidget): def __init__(self,*args): apply(QWidget.__init__,(self,) + args) mainLayout=QVBoxLayout(None) mainLayout.setContentsMargins(0,0,0,80) self.autoTitleBar=QCheckBox(_(u'标题栏显示音轨信息'),self) self.rememberLastShowMode=QCheckBox(_(u'记住退出时的显示模式'),self) self.switchHorizontal=QCheckBox(_(u'显示行数为1时,切换至横向歌词(需重启)'),self) layout1=QHBoxLayout(None) self.minLabel=QLabel(_(u'最小宽度:'),self) self.minWidth=QSpinBox(self) self.minWidth.setMaximum(QApplication.desktop().width()) self.minWidth.setMinimum(100) layout1.addWidget(self.minLabel) layout1.addWidget(self.minWidth) self.groupHide=groupHide(_(u'当音轨没有歌词时,窗口:'),self) mainLayout.addWidget(self.autoTitleBar) mainLayout.addWidget(self.rememberLastShowMode) mainLayout.addWidget(self.switchHorizontal) mainLayout.addLayout(layout1) mainLayout.addWidget(self.groupHide) self.setLayout(mainLayout) self.connect(self.groupHide.normal,SIGNAL("toggled(bool)"),self.normalChecked) def normalChecked(self,checked): if(checked): self.groupHide.includeCheckBox.setEnabled(False) else: self.groupHide.includeCheckBox.setEnabled(True) class groupHide(QGroupBox): def __init__(self,*args): apply(QGroupBox.__init__,(self,) + args) mainLayout=QVBoxLayout(None) self.normal=QRadioButton(_(u'无变化'),self) self.hide=QRadioButton(_(u'自动隐藏'),self) self.mini=QRadioButton(_(u'自动最小化'),self) self.includeCheckBox=QCheckBox(self) self.includeCheckBox.setText(_(u'包括撤销歌词')) mainLayout.addWidget(self.normal) mainLayout.addWidget(self.hide) mainLayout.addWidget(self.mini) mainLayout.addWidget(self.includeCheckBox) self.setLayout(mainLayout) #################Page: 3 ######################## class lrcPathPage(QWidget): def __init__(self,*args): apply(QWidget.__init__,(self,) + args) layout5=QVBoxLayout(None) layout2=QHBoxLayout(None) self.table=QTableWidget(0,1,self) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setSelectionMode(QAbstractItemView.SingleSelection) self.table.setMinimumWidth(260) title=QStringList()<<_(u'搜索路径') self.table.setHorizontalHeaderLabels(title) self.table.setColumnWidth(0,240) self.rowNumber=0 layout1=QVBoxLayout(None) self.add=QPushButton(_(u'添加...'),self) self.remove=QPushButton(_(u'移除'),self) self.remove.setEnabled(False) self.up=QPushButton(_(u'上移'),self) self.up.setEnabled(False) self.down=QPushButton(_(u'下移'),self) self.down.setEnabled(False) layout1.addWidget(self.add) layout1.addWidget(self.remove) layout1.addWidget(self.up) layout1.addWidget(self.down) layout2.addWidget(self.table) layout2.addLayout(layout1) layout4=QHBoxLayout(None) layout4.setContentsMargins(0,15,0,15) self.savePath=QLineEdit(self) self.savePath.setReadOnly(True) self.addSavePath=QPushButton(self) self.addSavePath.setText(_(u'保存目录...')) layout4.addWidget(self.savePath) layout4.addWidget(self.addSavePath) self.saveToMediaPath=QCheckBox(_(u'保存至音频文件所在目录'),self) self.searchMediaPath=QCheckBox(_(u'额外在音频文件所在目录搜索'),self) layout5.addLayout(layout2) layout5.addLayout(layout4) layout5.addWidget(self.saveToMediaPath) layout5.addWidget(self.searchMediaPath) self.setLayout(layout5) self.connect(self.saveToMediaPath,SIGNAL("clicked(bool)"),self.cautionAction) self.connect(self.add,SIGNAL("clicked()"),self.addPath) self.connect(self.remove,SIGNAL("clicked()"),self.removePath) self.connect(self.up,SIGNAL("clicked()"),self.upAction) self.connect(self.down,SIGNAL("clicked()"),self.downAction) self.connect(self.table,SIGNAL("cellClicked(int,int)"),self.enableButton) self.connect(self.addSavePath,SIGNAL("clicked()"),self.addSavePathAction) def cautionAction(self,bool): if(bool): self.addSavePath.setEnabled(False) self.savePath.setEnabled(False) QMessageBox.information(self,_(u'提示'),_(u'建议不开启此功能:\n1.可能导致Amarok不断更新收藏\n2.目录可能没有写权限而导致下载失败')) else: self.addSavePath.setEnabled(True) self.savePath.setEnabled(True) def addPath(self): path=QFileDialog.getExistingDirectory(self,_(u'请选择lrc歌词搜索目录'),os.getenv("HOME")) if(path<>u''): flag=False for i in range(0,self.rowNumber): if(self.table.item(i,0).text()==path): flag=True if(flag==False): self.insertItem(QTableWidgetItem(path,0)) self.updownButton(self.table.currentRow()) else: QMessageBox.information(self,_(u'提示'),_(u'该目录已被添加')) def insertItem(self,item): self.rowNumber+=1 self.table.setRowCount(self.rowNumber) self.table.setItem(self.rowNumber-1,0,item) def removePath(self): self.table.removeRow(self.table.currentRow()) self.rowNumber-=1 self.updownButton(self.table.currentRow()) def enableButton(self,row,column): self.remove.setEnabled(True) self.updownButton(row) def upAction(self): row=self.table.currentRow() item_column0=self.table.takeItem(row,0) tmp_row=row-1 tmp_column0=self.table.takeItem(tmp_row,0) self.table.setItem(row,0,tmp_column0) self.table.setItem(tmp_row,0,item_column0) self.table.selectRow(tmp_row) self.updownButton(tmp_row) def downAction(self): row=self.table.currentRow() item_column0=self.table.takeItem(row,0) tmp_row=row+1 tmp_column0=self.table.takeItem(tmp_row,0) self.table.setItem(row,0,tmp_column0) self.table.setItem(tmp_row,0,item_column0) self.table.selectRow(tmp_row) self.updownButton(tmp_row) def addSavePathAction(self): path=QFileDialog.getExistingDirectory(self,_(u'请选择保存歌词目录'),os.getenv("HOME")) if(path<>u''): if(os.access(str(path.toLocal8Bit()),os.W_OK)): self.savePath.setText(path) else: QMessageBox.information(self,_(u'提示'),_(u'该目录不具备写权限')) def updownButton(self,row): if(row==0): self.up.setEnabled(False) else: self.up.setEnabled(True) if(row==self.rowNumber-1): self.down.setEnabled(False) else: self.down.setEnabled(True) if(row<0): self.up.setEnabled(False) self.down.setEnabled(False) self.remove.setEnabled(False) #################Page: 4 ######################## class limitPage(QWidget): def __init__(self,*args): apply(QWidget.__init__,(self,) + args) mainLayout=QVBoxLayout(None) mainLayout.setContentsMargins(0,0,0,200) self.filterCheckBox=QCheckBox(_(u'启用歌词过滤'),self) self.filterCheckBox.setChecked(True) self.nullLine=QCheckBox(_(u'被过滤歌词显示为空行'),self) self.filterCap=QCheckBox(_(u'忽略英文关键词大小写'),self) self.comment=QLabel(_(u'(过滤关键词之间以\"|\"隔开;支持正则表达式)'),self) self.filterKeyWold=QLineEdit(self) mainLayout.addWidget(self.filterCheckBox) mainLayout.addWidget(self.nullLine) mainLayout.addWidget(self.filterCap) mainLayout.addWidget(self.comment) mainLayout.addWidget(self.filterKeyWold) self.setLayout(mainLayout) self.connect(self.filterCheckBox,SIGNAL("toggled(bool)"),self.filterChecked) def filterChecked(self,checked): if(checked): self.nullLine.setEnabled(True) self.comment.setEnabled(True) self.filterKeyWold.setEnabled(True) self.filterCap.setEnabled(True) else: self.nullLine.setEnabled(False) self.comment.setEnabled(False) self.filterKeyWold.setEnabled(False) self.filterCap.setEnabled(False) #################Page: 5 ######################## class shortcutPage(QWidget): def __init__(self,*args): apply(QWidget.__init__,(self,) + args) mainLayout=QVBoxLayout(None) layout1=QHBoxLayout(None) self.setShortcut=QPushButton(_(u'修改快捷键...'),self) self.setShortcut.setEnabled(False) self.setDefault=QPushButton(_(u'返回默认'),self) layout1.addWidget(self.setShortcut) layout1.addWidget(self.setDefault) shortcutDescribe=[_(u'全屏模式'),_(u'OSD模式'),_(u'普通模式'),_(u'歌词编辑器:插入时间标签'),_(u'歌词编辑器:撤销操作'),_(u'歌词编辑器'),_(u'保存偏移量'),_(u'歌词滞后0.2秒'),_(u'歌词提前0.2秒'),_(u'快速设置栏')] import readConfig #p=readConfig.readConfig('../../scripts-data/lrcShow-II.conf') p=readConfig.readConfig('lrcShow-II.conf') self.shortcutValue=p.parseShortcut() self.table=QTableWidget(10,2,self) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setSelectionMode(QAbstractItemView.SingleSelection) self.table.setColumnWidth(0,220) self.table.setColumnWidth(1,80) title=QStringList()<<_(u'描述')<<_(u'快捷键') self.table.setHorizontalHeaderLabels(title) for i in range(10): self.table.setItem(i,0,QTableWidgetItem(shortcutDescribe[i],0)) self.table.setItem(i,1,QTableWidgetItem(self.shortcutValue[i],0)) mainLayout.addWidget(self.table) mainLayout.addLayout(layout1) self.setLayout(mainLayout) self.connect(self.table,SIGNAL("cellClicked(int,int)"),self.activeSet) self.connect(self.setShortcut,SIGNAL("clicked()"),self.changeShortcut) self.connect(self.table,SIGNAL("cellDoubleClicked(int,int)"),self.changeShortcut) self.connect(self.setDefault,SIGNAL("clicked()"),self.defaultAction) def defaultAction(self): self.shortcutValue=['F','O','Esc','F5','F6','E','S','-','+','I'] for i in range(10): self.table.setItem(i,1,QTableWidgetItem(self.shortcutValue[i],0)) def activeSet(self,row,col): if(not self.setShortcut.isEnabled()): self.setShortcut.setEnabled(True) def changeShortcut(self): row=self.table.currentRow() editorBox=shortcutBox() editorBox.editorBox.setText(self.table.item(row,1).text()) result=editorBox.exec_() if(result==QDialog.Accepted): tmpList=[] for i in range(10): if(i==row): pass else: tmpList.append(self.table.item(i,1).text()) if(editorBox.editorBox.text() in tmpList): QMessageBox.information(self,_(u'快捷键冲突'),_(u'先前操作未完成')) else: self.table.setItem(row,1,QTableWidgetItem(editorBox.editorBox.text(),0)) for i in range(10): self.shortcutValue[i]=str(self.table.item(i,1).text()) class shortcutBox(QDialog): def __init__(self,*args): apply(QDialog.__init__,(self,) + args) self.setWindowTitle(_(u'捕捉快捷键')) mainLayout=QVBoxLayout(None) layout1=QHBoxLayout(None) self.ok=QPushButton(_(u'确定'),self) self.cancel=QPushButton(_(u'取消'),self) self.clear=QPushButton(_(u'清空'),self) layout1.addWidget(self.ok) layout1.addWidget(self.clear) layout1.addWidget(self.cancel) self.comment=QLabel(_(u'仅允许单键快捷键'),self) self.editorBox=QLineEdit(self) self.editorBox.setReadOnly(True) self.editorBox.setFocus() mainLayout.addWidget(self.comment) mainLayout.addWidget(self.editorBox) mainLayout.addLayout(layout1) self.setLayout(mainLayout) self.connect(self.ok,SIGNAL("clicked()"),self,SLOT("accept()")) self.connect(self.cancel,SIGNAL("clicked()"),self,SLOT("reject()")) self.connect(self.clear,SIGNAL("clicked()"),self.editorBox,SLOT("clear()")) def keyPressEvent(self,ev): self.editorBox.setText(QKeySequence(ev.key()).toString()) def main(args): app=QApplication(args) win=otherSettingQt4() win.show() sys.exit(app.exec_()) if(__name__=="__main__"): main(sys.argv)