def getTagger(_isAlertIfNotExist=False, _isReloadAgain=False): global loaddedTagger try: if not _isReloadAgain and loaddedTagger is not None: return loaddedTagger preferedTaggerModule = uni.MySettings["preferedTaggerModule"] taggerModule = __import__("Taggers." + preferedTaggerModule, globals(), locals(), ["isAvailable", "Tagger", preferedTaggerModule], 0) if taggerModule.isAvailable: loaddedTagger = taggerModule.Tagger() return loaddedTagger taggersNames = uni.getTaggersMachineNames() for tagger in taggersNames: taggerModule = __import__("Taggers." + tagger, globals(), locals(), ["isAvailable", "Tagger", tagger], 0) if taggerModule.isAvailable: uni.setMySetting("preferedTaggerModule", tagger) loaddedTagger = taggerModule.Tagger() return loaddedTagger if _isAlertIfNotExist: Dialogs.show(translate("Taggers", "You Have Not Any Tagger"), translate("Taggers", "Not found any tagger in your system. " "Please install a tagger module. " "Now supporting only eyeD3 module (python-eyed3).")) return None except: ReportBug.ReportBug()
def readMusicFile(_filePath, _isAlertWhenNotAvailable=True): _directoryPath = fu.getDirName(_filePath) isCanNoncompatible = False if fu.isReadableFileOrDir(_filePath): tagger = Taggers.getTagger() try: tagger.loadFile(_filePath) except: Dialogs.showError(translate("FileUtils/Musics", "Incorrect Tag"), str(translate("FileUtils/Musics", "\"%s\" : this file has the incorrect tag so can't read tags.") ) % Organizer.getLink(_filePath)) if tagger.isAvailableFile() is False: isCanNoncompatible = True content = {} content["path"] = _filePath content["baseNameOfDirectory"] = fu.getBaseName(_directoryPath) content["baseName"] = fu.getBaseName(_filePath) content["artist"] = tagger.getArtist() content["title"] = tagger.getTitle() content["album"] = tagger.getAlbum() content["albumArtist"] = tagger.getAlbumArtist() content["trackNum"] = tagger.getTrackNum() content["year"] = tagger.getYear() content["genre"] = tagger.getGenre() content["firstComment"] = tagger.getFirstComment() content["firstLyrics"] = tagger.getFirstLyrics() content["images"] = tagger.getImages() if isCanNoncompatible and _isAlertWhenNotAvailable: Dialogs.show(translate("FileUtils/Musics", "Possible ID3 Mismatch"), translate("FileUtils/Musics", "Some of the files presented in the table may not support ID3 technology.<br>Please check the files and make sure they support ID3 information before proceeding.")) return content
def uninstallPlugin(self, _pluginName, _isQuiet=False): isUninstalled = False pluginModule = __import__("MyPlugins." + _pluginName, globals(), locals(), ["pluginName", "pluginFiles", "pluginDirectory", "uninstallThisPlugin", "setupDirectory", "pluginVersion"], 0) if pluginModule.uninstallThisPlugin is None: if pluginModule.pluginDirectory == "": for pluginFile in pluginModule.pluginFiles: if fu.isFile(fu.joinPath(pluginModule.setupDirectory, pluginFile)): fu.removeFileOrDir(fu.joinPath(pluginModule.setupDirectory, pluginFile)) isUninstalled = True else: if fu.isDir(fu.joinPath(pluginModule.setupDirectory, pluginModule.pluginDirectory)): fu.removeFileOrDir(fu.joinPath(pluginModule.setupDirectory, pluginModule.pluginDirectory)) isUninstalled = True else: isUninstalled = pluginModule.uninstallThisPlugin() if isUninstalled: Settings.setUniversalSetting(str(pluginModule.pluginName), str("")) if _isQuiet is False: Dialogs.show(translate("MyPlugins", "Plug-in Uninstallation Is Complete"), str(translate("MyPlugins", "\"%s\" is uninstalled on your system.")) % ( pluginModule.pluginName)) elif isUninstalled == "AlreadyUninstalled": if _isQuiet is False: Dialogs.show(translate("MyPlugins", "Plug-in Already Uninstalled"), str(translate("MyPlugins", "\"%s\" already uninstalled on your system.")) % ( pluginModule.pluginName)) else: if _isQuiet is False: Dialogs.showError(translate("MyPlugins", "Plug-in Uninstallation Failed"), str(translate("MyPlugins", "\"%s\" failed to uninstall on your system.")) % ( pluginModule.pluginName))
def hash(self): sourceFile = str(self.lePathOfPackage.text()) sourceFile = fu.checkSource(sourceFile, "file") if sourceFile is not None: hashType = str(self.cbHash.currentText()) if hashType is not None: hashDigestContent = fu.getHashDigest(sourceFile, hashType) if hashDigestContent is not False: self.teHashDigest.setText(str(hashDigestContent)) if self.cbHashOutput.currentIndex() == 1: if fu.createHashDigestFile(sourceFile, str(self.leHashDigestFile.text()), hashType, False, hashDigestContent): Dialogs.show(translate("Hasher", "Hash Digest File Created"), str(translate("Hasher", "Hash digest writed into %s")) % str( self.leHashDigestFile.text())) else: Dialogs.showError(translate("Hasher", "Hash Digest File Is Not Created"), translate("Hasher", "Hash digest file not cteated.")) elif self.cbHashOutput.currentIndex() == 2: MApplication.clipboard().setText(str(hashDigestContent)) Dialogs.show(translate("Hasher", "Hash Digest Copied To Clipboard"), str(translate("Hasher", "Hash digest copied to clipboard.Hash digest is : <br>%s")) % hashDigestContent) else: Dialogs.showError(translate("Hasher", "Hash Digest Is Not Created"), translate("Hasher", "Hash digest not cteated."))
def createReadOnlyEmbeddedDB(_isNoAlertIfSuccessfully=True): stopReadOnlyEmbeddedDB() if fu.isDir(fu.pathOfSettingsDirectory + "/Amarok"): fu.removeFileOrDir(fu.pathOfSettingsDirectory + "/Amarok") fu.makeDirs(fu.pathOfSettingsDirectory + "/Amarok/mysqle") fu.copyFileOrDir( fu.HamsiManagerDirectory + "/Amarok/EmbeddedDBFiles/mysql", fu.pathOfSettingsDirectory + "/Amarok/mysqle/mysql", ) fu.copyFileOrDir( fu.HamsiManagerDirectory + "/Amarok/EmbeddedDBFiles/my-readOnly.cnf", fu.pathOfSettingsDirectory + "/Amarok/my.cnf") MyConfigure.reConfigureFile(fu.pathOfSettingsDirectory + "/Amarok/my.cnf") fu.makeDirs(fu.pathOfSettingsDirectory + "/Amarok/mysqle/amarok") fu.copyFileOrDir( uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/ib_logfile0", fu.pathOfSettingsDirectory + "/Amarok/mysqle/ib_logfile0") fu.copyFileOrDir( uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/ib_logfile1", fu.pathOfSettingsDirectory + "/Amarok/mysqle/ib_logfile1") fu.copyFileOrDir( uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/ibdata1", fu.pathOfSettingsDirectory + "/Amarok/mysqle/ibdata1") generateReadOnlyEmbeddedD() if _isNoAlertIfSuccessfully is False: Dialogs.show( translate("EmbeddedDBCore", "Created Embedded Server"), translate( "EmbeddedDBCore", "Embedded Amarok database server created and generated.")) return True
def emendDirectoryWithContents(self): try: _path = self.checkSource(str(QuickMakeParameters[1]), "directory") if _path is not None: if uni.getBoolValue("isShowQuickMakeWindow"): newEmendedName = str(self.leNewValue.text()) else: newEmendedName = Organizer.emend(_path, fu.getObjectType(_path)) fu.activateSmartCheckIcon() oldFileName = _path newDirName = fu.moveOrChange(oldFileName, newEmendedName, "directory") if newDirName != oldFileName: fileAndDirectoryNames = fu.readDirectory(newDirName, "fileAndDirectory") for fileAndDirs in fileAndDirectoryNames: objectType = fu.getObjectType(fu.joinPath(newDirName, fileAndDirs)) fu.moveOrChange(fu.joinPath(newDirName, fileAndDirs), fu.joinPath(newDirName, Organizer.emend(fileAndDirs, objectType)), objectType) if uni.isActiveDirectoryCover and uni.getBoolValue( "isActiveAutoMakeIconToDirectory") and uni.getBoolValue( "isAutoMakeIconToDirectoryWhenFileMove"): fu.checkIcon(newDirName) if fu.isDir(newDirName): fu.completeSmartCheckIcon() Dialogs.show(translate("QuickMake", "Directory And Contents Emended"), str(translate("QuickMake", "\"%s\" is emended based on the criteria you set.This directory is \"%s\" now.")) % (Organizer.getLink(_path), Organizer.getLink(newDirName))) self.close() except: ReportBug.ReportBug()
def search(self, _searchValue=""): try: import re if self.setSourceToSearch(False): if self.cckbIsRegExp.checkState() == Mt.Checked: searchValueList = [str(self.leSearch.text())] else: searchValueList = self.getSearchValueList() if len(searchValueList) != 0: searchValueListForToolTip = "" resultOfSearch = "" arrayOfSource = str(self.sourceToSearch).split("\n\r") if len(arrayOfSource) == 1: arrayOfSource = str(self.sourceToSearch).split("\n") if len(arrayOfSource) == 1: arrayOfSource = str(self.sourceToSearch).split("<br>") if len(arrayOfSource) == 1: arrayOfSource = str(self.sourceToSearch).split("<br/>") if len(arrayOfSource) == 1: arrayOfSource = str(self.sourceToSearch).split("<br >") if len(arrayOfSource) == 1: arrayOfSource = str(self.sourceToSearch).split("<br />") for row in arrayOfSource: for searchVal in searchValueList: if self.cckbIsRegExp.checkState() == Mt.Checked: try: if self.cckbIsCaseInsensitive.checkState() == Mt.Checked: pattern = re.compile(uni.trUnicode(searchVal), re.I | re.U) if re.search(pattern, uni.trUnicode(row)) is not None: resultOfSearch += row + "\n" break else: pattern = re.compile(uni.trUnicode(searchVal), re.U) if re.search(pattern, uni.trUnicode(row)) is not None: resultOfSearch += row + "\n" break except: Dialogs.show(translate("Searcher", "Incorrect Syntax"), translate("Searcher", "Search value is not correct for Regular Expression (RegExp). Please check it and try again.")) return False else: if row.find(searchVal) != -1: resultOfSearch += row + "\n" break if self.cckbIsCaseInsensitive.checkState() == Mt.Checked: pattern = re.compile(re.escape(uni.trUnicode(searchVal)), re.I | re.U) if re.search(pattern, uni.trUnicode(row)) is not None: resultOfSearch += row + "\n" break else: pattern = re.compile(re.escape(uni.trUnicode(searchVal)), re.U) if re.search(pattern, uni.trUnicode(row)) is not None: resultOfSearch += row + "\n" break for searchVal in searchValueList: searchValueListForToolTip += "'" + searchVal + "', " self.lblSearchListValues.setText(str(searchValueListForToolTip[0:-2])) else: resultOfSearch = str(self.sourceToSearch) self.lblSearchListValues.setText(str("")) self.teSearchResult.setText(str(resultOfSearch)) except: ReportBug.ReportBug()
def backup(self): backupEmbeddedDB() Dialogs.show( translate("EmbeddedDBConfigurator", "Backup Completed"), translate( "EmbeddedDBConfigurator", "Backup successfully completed.<br> You can restore when you want." )) self.pbtnRestore.setEnabled(isHasEmbeddedDBBackup())
def whatDoesSpecialCommandDo(_actionCommand, _isShowAlert=False, _isReturnDetails=False): splitterIndex = _actionCommand.index("~||~") leftKeys = _actionCommand[:splitterIndex] rightKeys = _actionCommand[splitterIndex + 1:] if len(leftKeys) > 0 and len(rightKeys) > 0: details = "" leftNames = "" rightNames = "" for objectNameAndPoint in leftKeys: objectNameAndPointList = objectNameAndPoint.split("~|~") objectName = objectNameAndPointList[0] point = "" if len(objectNameAndPointList) > 1: point = objectNameAndPointList[1] if objectName.find("Concatenate") == -1: leftNames += getMainTable().getColumnNameFromKey(objectName) else: leftNames += translate("Organizer", "Concatenate") if point != "": if objectName.find("Concatenate") == -1: leftNames += " " + (str(translate("Organizer", "(can be separated by \"%s\")")) % (point)) else: leftNames += " " + (str(translate("Organizer", "(can be concatenated by \"%s\")")) % (point)) if leftKeys[-1] != objectNameAndPoint: leftNames += " ," for objectNameAndPoint in rightKeys: objectNameAndPointList = objectNameAndPoint.split("~|~") objectName = objectNameAndPointList[0] point = "" if len(objectNameAndPointList) > 1: point = objectNameAndPointList[1] if objectName.find("Concatenate") == -1: rightNames += getMainTable().getColumnNameFromKey(objectName) else: rightNames += translate("Organizer", "Concatenate") if point != "": if objectName.find("Concatenate") == -1: rightNames += " " + (str(translate("Organizer", "(can be separated by \"%s\")")) % (point)) else: rightNames += " " + (str(translate("Organizer", "(can be concatenated by \"%s\")")) % (point)) if rightKeys[-1] != objectNameAndPoint: rightNames += " ," details = str(translate("Organizer", "\"%s\" will be concatenated and/or separated then it will be set as \"%s\" respectively.")) % ( leftNames, rightNames) if _isShowAlert: Dialogs.show(translate("Organizer", "What Does This Command Do?"), str(details)) if _isReturnDetails is False: return True else: return details else: Dialogs.showError(translate("Organizer", "Missing Command"), translate("Organizer", "You have to add at least a \"Column\"!..")) return False
def copyPath(self): try: _path = self.checkSource(str(QuickMakeParameters[1]), "fileAndDirectory", False) if _path is not None: MApplication.clipboard().setText(str(_path)) Dialogs.show(translate("QuickMake", "Copied To Clipboard"), str(translate("QuickMake", "\"%s\" copied to clipboard.")) % Organizer.getLink(_path)) self.close() except: ReportBug.ReportBug()
def generateReadOnlyEmbeddedD(_isNoAlertIfSuccessfully=True): stopReadOnlyEmbeddedDB() if fu.isExist(fu.pathOfSettingsDirectory + "/Amarok/mysqle/amarok"): fu.removeFileOrDir(fu.pathOfSettingsDirectory + "/Amarok/mysqle/amarok") fu.copyFileOrDir(uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/amarok", fu.pathOfSettingsDirectory + "/Amarok/mysqle/amarok") if _isNoAlertIfSuccessfully is False: Dialogs.show(translate("EmbeddedDBCore", "Generated Embedded Server"), translate("EmbeddedDBCore", "Embedded Amarok database server generated.")) return True
def uninstallPlugin(self, _pluginName, _isQuiet=False): isUninstalled = False pluginModule = __import__( "MyPlugins." + _pluginName, globals(), locals(), [ "pluginName", "pluginFiles", "pluginDirectory", "uninstallThisPlugin", "setupDirectory", "pluginVersion" ], 0) if pluginModule.uninstallThisPlugin is None: if pluginModule.pluginDirectory == "": for pluginFile in pluginModule.pluginFiles: if fu.isFile( fu.joinPath(pluginModule.setupDirectory, pluginFile)): fu.removeFileOrDir( fu.joinPath(pluginModule.setupDirectory, pluginFile)) isUninstalled = True else: if fu.isDir( fu.joinPath(pluginModule.setupDirectory, pluginModule.pluginDirectory)): fu.removeFileOrDir( fu.joinPath(pluginModule.setupDirectory, pluginModule.pluginDirectory)) isUninstalled = True else: isUninstalled = pluginModule.uninstallThisPlugin() if isUninstalled: Settings.setUniversalSetting(str(pluginModule.pluginName), str("")) if _isQuiet is False: Dialogs.show( translate("MyPlugins", "Plug-in Uninstallation Is Complete"), str( translate("MyPlugins", "\"%s\" is uninstalled on your system.")) % (pluginModule.pluginName)) elif isUninstalled == "AlreadyUninstalled": if _isQuiet is False: Dialogs.show( translate("MyPlugins", "Plug-in Already Uninstalled"), str( translate( "MyPlugins", "\"%s\" already uninstalled on your system.")) % (pluginModule.pluginName)) else: if _isQuiet is False: Dialogs.showError( translate("MyPlugins", "Plug-in Uninstallation Failed"), str( translate( "MyPlugins", "\"%s\" failed to uninstall on your system.")) % (pluginModule.pluginName))
def checkReadOnlyColumn(self, _columnKey, _isAlert=True): if _columnKey in self.tableReadOnlyColumnsKey: if _isAlert: Dialogs.show( translate("Tables", "Read Only Column"), str( translate("Tables", "%s is read only so you can't change it.")) % self.tableColumns[self.tableColumnsKey.index(_columnKey)]) return False return True
def clearIgnoreds(self): try: _path = self.checkSource(str(QuickMakeParameters[1]), "directory") if _path is not None: fu.clearIgnoreds(_path) Dialogs.show(translate("QuickMake", "Directory Cleaned"), str(translate("QuickMake", "\"%s\" is cleaned based on the criteria you set.")) % Organizer.getLink( _path)) self.close() except: ReportBug.ReportBug()
def checkIcon(self): try: _path = self.checkSource(str(QuickMakeParameters[1]), "directory") if _path is not None: fu.checkIcon(_path) Dialogs.show(translate("QuickMake", "Directory Icon Checked"), str(translate("QuickMake", "\"%s\"`s icon checked.<br>The default action based on the data is executed.")) % Organizer.getLink( _path)) self.close() except: ReportBug.ReportBug()
def configureEmbeddedDB(_isNoAlertIfSuccessfully=True): stopEmbeddedDB() backupEmbeddedDB() fu.copyDirContent(fu.HamsiManagerDirectory + "/Amarok/EmbeddedDBFiles/mysql", uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/mysql") fu.copyFileOrDir(fu.HamsiManagerDirectory + "/Amarok/EmbeddedDBFiles/my.cnf", uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/my.cnf") MyConfigure.reConfigureFile(uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/my.cnf") if _isNoAlertIfSuccessfully is False: Dialogs.show(translate("EmbeddedDBCore", "Created Embedded Server"), translate("EmbeddedDBCore", "Embedded Amarok database server created and generated.")) return True
def restore(self): answer = Dialogs.ask(translate("Amarok", "Restore Amarok Database"), translate("Amarok", "Are you want to restore backup database?")) if answer == Dialogs.Yes: if isRunning(): self.stopEmbeddedDB(True) Dialogs.show(translate("EmbeddedDBConfigurator", "Close Amarok"), translate("EmbeddedDBConfigurator", "Please close Amarok if it is running.")) restoreEmbeddedDB() Dialogs.show(translate("EmbeddedDBConfigurator", "Restore Completed"), translate("EmbeddedDBConfigurator", "Restore successfully completed.<br> You can run Amarok now if you want.")) self.checkRunState()
def stopReadOnlyEmbeddedDB(_isNoAlertIfSuccessfully=True): global isReadOnlyStarted if isReadOnlyStarted is False: return True isReadOnlyStarted = False mysqldPID = getReadOnlyPID() if mysqldPID is not None: Execute.execute(["kill", "-TERM", str(mysqldPID)]) Dialogs.sleep(translate("EmbeddedDBCore", "Stopping Embedded Server..."), 3) if _isNoAlertIfSuccessfully is False: Dialogs.show(translate("EmbeddedDBCore", "Stopped Embedded Server"), translate("EmbeddedDBCore", "Embedded Amarok database server stopped.")) return True
def generateReadOnlyEmbeddedD(_isNoAlertIfSuccessfully=True): stopReadOnlyEmbeddedDB() if fu.isExist(fu.pathOfSettingsDirectory + "/Amarok/mysqle/amarok"): fu.removeFileOrDir(fu.pathOfSettingsDirectory + "/Amarok/mysqle/amarok") fu.copyFileOrDir( uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/amarok", fu.pathOfSettingsDirectory + "/Amarok/mysqle/amarok") if _isNoAlertIfSuccessfully is False: Dialogs.show( translate("EmbeddedDBCore", "Generated Embedded Server"), translate("EmbeddedDBCore", "Embedded Amarok database server generated.")) return True
def isReadOnlyRunning(self): try: if isReadOnlyRunning(): self.pbtnStopEmbeddedDB.setEnabled(True) self.pbtnStartEmbeddedDB.setEnabled(False) Dialogs.show(translate("EmbeddedDBConfigurator", "Running Embedded Server"), translate("EmbeddedDBConfigurator", "Embedded Amarok database server is running.")) else: self.pbtnStopEmbeddedDB.setEnabled(False) self.pbtnStartEmbeddedDB.setEnabled(True) Dialogs.show(translate("EmbeddedDBConfigurator", "Not Running Embedded Server"), translate("EmbeddedDBConfigurator", "Embedded Amarok database server is not running.")) except: ReportBug.ReportBug()
def install(self, _fileName): if self.isNotInstall is False and uni.isBuilt(): self.setWindowTitle(translate("UpdateControl", "Installing The Latest Release")) self.lblInfo.setText(translate("UpdateControl", "Latest release downloaded, initializing installation.")) from Core.Execute import openWith openWith([str(_fileName)]) self.close() self.parent().close() else: Dialogs.show(translate("UpdateControl", "The New Version Downloaded"), translate("UpdateControl", "New version of Hamsi Manager downloaded, you can install it manually.")) self.close()
def startEmbeddedDB(_isNoAlertIfSuccessfully=True): global isStarted if isStarted: return True if uni.checkMysqldSafe(): Execute.executeWithThread([uni.MySettings["pathOfMysqldSafe"], "--defaults-file=" + uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/my.cnf"]) Dialogs.sleep(translate("EmbeddedDBCore", "Starting Embedded Server..."), 3) if _isNoAlertIfSuccessfully is False: Dialogs.show(translate("EmbeddedDBCore", "Started Embedded Server"), translate("EmbeddedDBCore", "Embedded Amarok database server started.")) isStarted = True return True isStarted = False return False
def startReadOnlyEmbeddedDB(_isNoAlertIfSuccessfully=True): global isReadOnlyStarted if isReadOnlyStarted: return True if uni.checkMysqldSafe(): Execute.executeWithThread( [uni.MySettings["pathOfMysqldSafe"], "--defaults-file=" + fu.pathOfSettingsDirectory + "/Amarok/my.cnf"]) Dialogs.sleep(translate("EmbeddedDBCore", "Starting Embedded Server..."), 3) if _isNoAlertIfSuccessfully is False: Dialogs.show(translate("EmbeddedDBCore", "Started Embedded Server"), translate("EmbeddedDBCore", "Embedded Amarok database server started.")) isReadOnlyStarted = True return True isReadOnlyStarted = False return False
def stopReadOnlyEmbeddedDB(_isNoAlertIfSuccessfully=True): global isReadOnlyStarted if isReadOnlyStarted is False: return True isReadOnlyStarted = False mysqldPID = getReadOnlyPID() if mysqldPID is not None: Execute.execute(["kill", "-TERM", str(mysqldPID)]) Dialogs.sleep( translate("EmbeddedDBCore", "Stopping Embedded Server..."), 3) if _isNoAlertIfSuccessfully is False: Dialogs.show( translate("EmbeddedDBCore", "Stopped Embedded Server"), translate("EmbeddedDBCore", "Embedded Amarok database server stopped.")) return True
def clearEmptyDirectories(self): try: _path = self.checkSource(str(QuickMakeParameters[1]), "directory") if _path is not None: if fu.isWritableFileOrDir(_path): fu.activateSmartCheckIcon() fu.checkEmptyDirectories(_path, True, True, True, True) if fu.isDir(_path): fu.completeSmartCheckIcon() Dialogs.show(translate("QuickMake", "Directory Cleaned"), str(translate("QuickMake", "\"%s\" is cleaned based on the criteria you set.")) % Organizer.getLink( _path)) self.close() except: ReportBug.ReportBug()
def continueSave(self, _returned=None): try: if _returned: from Core import Records if uni.tableType in ["0", "1", "2", "3", "4", "9"]: if uni.getBoolValue("isClearEmptyDirectoriesWhenSave"): fu.checkEmptyDirectories( self.currentDirectoryPath, True, True, uni.getBoolValue("isAutoCleanSubFolderWhenSave")) fu.completeSmartCheckEmptyDirectories(True, True) isDirStillExist = fu.isDir(self.currentDirectoryPath) if uni.tableType in ["0", "1", "2", "3", "9"]: if (uni.isActiveDirectoryCover and uni.getBoolValue("isActiveAutoMakeIconToDirectory") and uni.getBoolValue( "isAutoMakeIconToDirectoryWhenSave")): if isDirStillExist: fu.checkIcon(self.currentDirectoryPath) if self.currentDirectoryPath != self.newDirectoryPath: fu.checkIcon(self.newDirectoryPath) fu.completeSmartCheckIcon() Records.saveAllRecords() if self.changedValueNumber == 0: Dialogs.show( translate("Tables", "Did Not Change Any Things"), translate( "Tables", "Did not change any things in this table.Please check the criteria you select." )) else: if uni.getBoolValue("isShowTransactionDetails"): Dialogs.show( translate("Tables", "Transaction Details"), str(translate("Tables", "%s value(s) changed.")) % self.changedValueNumber) if not isDirStillExist and self.currentDirectoryPath == self.newDirectoryPath: getMainWindow().FileManager.goUp() elif not isDirStillExist and self.currentDirectoryPath != self.newDirectoryPath: getMainWindow().FileManager.makeRefresh( self.newDirectoryPath) else: getMainWindow().FileManager.makeRefresh("") if uni.tableType in ["5", "6", "7", "8"]: self.refresh(self.newDirectoryPath) except: ReportBug.ReportBug()
def emendDirectory(self): try: _path = self.checkSource(str(QuickMakeParameters[1]), "directory") if _path is not None: if uni.getBoolValue("isShowQuickMakeWindow"): newEmendedName = str(self.leNewValue.text()) else: newEmendedName = Organizer.emend(_path, fu.getObjectType(_path)) oldFileName = _path newDirName = fu.moveOrChange(oldFileName, newEmendedName, "directory") if newDirName != oldFileName: Dialogs.show(translate("QuickMake", "Directory Emended"), str(translate("QuickMake", "\"%s\" is emended based on the criteria you set.This directory is \"%s\" now.")) % (Organizer.getLink(_path), Organizer.getLink(newDirName))) self.close() except: ReportBug.ReportBug()
def configureEmbeddedDB(_isNoAlertIfSuccessfully=True): stopEmbeddedDB() backupEmbeddedDB() fu.copyDirContent( fu.HamsiManagerDirectory + "/Amarok/EmbeddedDBFiles/mysql", uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/mysql") fu.copyFileOrDir( fu.HamsiManagerDirectory + "/Amarok/EmbeddedDBFiles/my.cnf", uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/my.cnf") MyConfigure.reConfigureFile(uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/my.cnf") if _isNoAlertIfSuccessfully is False: Dialogs.show( translate("EmbeddedDBCore", "Created Embedded Server"), translate( "EmbeddedDBCore", "Embedded Amarok database server created and generated.")) return True
def Clear(self): try: uni.isCanBeShowOnMainWindow = False answer = Dialogs.ask(translate("Cleaner", "Your Files Will Be Removed"), str(translate("Cleaner", "The files in the \"%s\" folder will be cleared according to the criteria you set.<br>" + "This action will delete the files completely, without any chance to recover.<br>" + "Are you sure you want to perform the action?")) % Organizer.getLink( Organizer.getLink(str(self.lePathOfProject.text())))) if answer == Dialogs.Yes: if fu.isWritableFileOrDir(str(self.lePathOfProject.text())): if fu.clearCleaningDirectory(str(self.lePathOfProject.text()), True, True): Dialogs.show(translate("Cleaner", "Directory Is Cleared"), str(translate("Cleaner", "This directory is cleared : \"%s\"")) % Organizer.getLink( str(self.lePathOfProject.text()))) uni.isCanBeShowOnMainWindow = True except: ReportBug.ReportBug()
def restore(self): answer = Dialogs.ask( translate("Amarok", "Restore Amarok Database"), translate("Amarok", "Are you want to restore backup database?")) if answer == Dialogs.Yes: if isRunning(): self.stopEmbeddedDB(True) Dialogs.show( translate("EmbeddedDBConfigurator", "Close Amarok"), translate("EmbeddedDBConfigurator", "Please close Amarok if it is running.")) restoreEmbeddedDB() Dialogs.show( translate("EmbeddedDBConfigurator", "Restore Completed"), translate( "EmbeddedDBConfigurator", "Restore successfully completed.<br> You can run Amarok now if you want." )) self.checkRunState()
def removeOnlySubFiles(self): try: _path = self.checkSource(str(QuickMakeParameters[1]), "directory") if _path is not None: answer = Dialogs.ask(translate("QuickMake", "All Files Will Be Removed"), str(translate("QuickMake", "Are you sure you want to remove only all files in \"%s\"?<br>Note:Do not will remove directory and subfolders.")) % Organizer.getLink( _path)) if answer == Dialogs.Yes: getMainWindow().setEnabled(False) fu.removeOnlySubFiles(_path) getMainWindow().setEnabled(True) Dialogs.show(translate("QuickMake", "Removed Only All Files"), str(translate("QuickMake", "Removed only all files in \"%s\".<br>Note:Do not removed directory and subfolders.")) % Organizer.getLink( _path)) self.close() except: ReportBug.ReportBug()
def startReadOnlyEmbeddedDB(_isNoAlertIfSuccessfully=True): global isReadOnlyStarted if isReadOnlyStarted: return True if uni.checkMysqldSafe(): Execute.executeWithThread([ uni.MySettings["pathOfMysqldSafe"], "--defaults-file=" + fu.pathOfSettingsDirectory + "/Amarok/my.cnf" ]) Dialogs.sleep( translate("EmbeddedDBCore", "Starting Embedded Server..."), 3) if _isNoAlertIfSuccessfully is False: Dialogs.show( translate("EmbeddedDBCore", "Started Embedded Server"), translate("EmbeddedDBCore", "Embedded Amarok database server started.")) isReadOnlyStarted = True return True isReadOnlyStarted = False return False
def startEmbeddedDB(_isNoAlertIfSuccessfully=True): global isStarted if isStarted: return True if uni.checkMysqldSafe(): Execute.executeWithThread([ uni.MySettings["pathOfMysqldSafe"], "--defaults-file=" + uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/my.cnf" ]) Dialogs.sleep( translate("EmbeddedDBCore", "Starting Embedded Server..."), 3) if _isNoAlertIfSuccessfully is False: Dialogs.show( translate("EmbeddedDBCore", "Started Embedded Server"), translate("EmbeddedDBCore", "Embedded Amarok database server started.")) isStarted = True return True isStarted = False return False
def hash(self): sourceFile = str(self.lePathOfPackage.text()) sourceFile = fu.checkSource(sourceFile, "file") if sourceFile is not None: hashType = str(self.cbHash.currentText()) if hashType is not None: hashDigestContent = fu.getHashDigest(sourceFile, hashType) if hashDigestContent is not False: self.teHashDigest.setText(str(hashDigestContent)) if self.cbHashOutput.currentIndex() == 1: if fu.createHashDigestFile( sourceFile, str(self.leHashDigestFile.text()), hashType, False, hashDigestContent): Dialogs.show( translate("Hasher", "Hash Digest File Created"), str( translate("Hasher", "Hash digest writed into %s")) % str(self.leHashDigestFile.text())) else: Dialogs.showError( translate("Hasher", "Hash Digest File Is Not Created"), translate("Hasher", "Hash digest file not cteated.")) elif self.cbHashOutput.currentIndex() == 2: MApplication.clipboard().setText( str(hashDigestContent)) Dialogs.show( translate("Hasher", "Hash Digest Copied To Clipboard"), str( translate( "Hasher", "Hash digest copied to clipboard.Hash digest is : <br>%s" )) % hashDigestContent) else: Dialogs.showError( translate("Hasher", "Hash Digest Is Not Created"), translate("Hasher", "Hash digest not cteated."))
def install(self, _fileName): if self.isNotInstall is False and uni.isBuilt(): self.setWindowTitle( translate("UpdateControl", "Installing The Latest Release")) self.lblInfo.setText( translate( "UpdateControl", "Latest release downloaded, initializing installation.")) from Core.Execute import openWith openWith([str(_fileName)]) self.close() self.parent().close() else: Dialogs.show( translate("UpdateControl", "The New Version Downloaded"), translate( "UpdateControl", "New version of Hamsi Manager downloaded, you can install it manually." )) self.close()
def isReadOnlyRunning(self): try: if isReadOnlyRunning(): self.pbtnStopEmbeddedDB.setEnabled(True) self.pbtnStartEmbeddedDB.setEnabled(False) Dialogs.show( translate("EmbeddedDBConfigurator", "Running Embedded Server"), translate("EmbeddedDBConfigurator", "Embedded Amarok database server is running.")) else: self.pbtnStopEmbeddedDB.setEnabled(False) self.pbtnStartEmbeddedDB.setEnabled(True) Dialogs.show( translate("EmbeddedDBConfigurator", "Not Running Embedded Server"), translate( "EmbeddedDBConfigurator", "Embedded Amarok database server is not running.")) except: ReportBug.ReportBug()
def installPlugin(self, _pluginName, _isQuiet=False): isInstalled = False pluginModule = __import__("MyPlugins." + _pluginName, globals(), locals(), ["pluginName", "pluginFiles", "pluginDirectory", "installThisPlugin", "setupDirectory", "pluginVersion"], 0) if pluginModule.installThisPlugin is None: if pluginModule.pluginDirectory == "": try: fu.makeDirs(pluginModule.setupDirectory) except: pass for pluginFile in pluginModule.pluginFiles: fu.copyOrChange(fu.joinPath(fu.HamsiManagerDirectory, "MyPlugins", _pluginName, pluginFile), fu.joinPath(pluginModule.setupDirectory, pluginFile), "file", "only", True) MyConfigure.reConfigureFile(fu.joinPath(pluginModule.setupDirectory, pluginFile)) isInstalled = True else: oldFilePath = fu.joinPath(fu.HamsiManagerDirectory, "MyPlugins", _pluginName, pluginModule.pluginDirectory) newFilePath = fu.copyOrChange(oldFilePath, fu.joinPath(pluginModule.setupDirectory, pluginModule.pluginDirectory), "directory", "only", True) if newFilePath != oldFilePath: isInstalled = True else: isInstalled = pluginModule.installThisPlugin() if isInstalled: Settings.setUniversalSetting(str(pluginModule.pluginName), str(pluginModule.pluginVersion)) if _isQuiet is False: Dialogs.show(translate("MyPlugins", "Plug-in Installation Is Complete"), str(translate("MyPlugins", "\"%s\" is installed on your system.")) % ( pluginModule.pluginName)) elif isInstalled == "AlreadyInstalled": if _isQuiet is False: Dialogs.show(translate("MyPlugins", "Plug-in Already Installed"), str(translate("MyPlugins", "\"%s\" already installed on your system.")) % ( pluginModule.pluginName)) else: if _isQuiet is False: Dialogs.showError(translate("MyPlugins", "Plug-in Installation Failed"), str(translate("MyPlugins", "\"%s\" failed to install on your system.")) % ( pluginModule.pluginName))
def sendFinished(self, _nrpBack): try: Dialogs.showState(translate("SuggestIdea", "Sending Your Idea"), 100, 100) if _nrpBack.error() == MNetworkReply.NoError: Dialogs.show( translate("SuggestIdea", "Suggestion Received Successfully"), translate( "SuggestIdea", "Thank you for sending us your idea. You have contributed a lot to make the next release even better." )) self.close() elif _nrpBack.error() == MNetworkReply.OperationCanceledError: Dialogs.show( translate("SuggestIdea", "Suggestion Canceled"), translate("SuggestIdea", "Suggestion canceled successfully.")) else: Dialogs.show( translate("SuggestIdea", "An Error Has Occurred."), translate( "SuggestIdea", "An unknown error has occurred. Please try again.")) uni.isCanBeShowOnMainWindow = True self.namMain = None self.nrqPost = None self.nrpBack = None except: ReportBug.ReportBug()
def triggered(self, _action): try: if _action.objectName() == "You Have Not Any Search Engine": Dialogs.show( translate("SearchEngines", "You Have Not Any Search Engine"), translate( "SearchEngines", "Not found any search engine in your system. Please install a search engine module. Now supporting only musicbrainz module (python-musicbrainz2)." )) else: if self.parent().rowCount() != 0: if str(_action.objectName()).find("-MusicBrainz-") != -1: selectedSearchDepth = 3 info = _action.objectName().split("-") engine = self.searchEnginesNames[int(info[0])] selectedSearchDepth = info[2] sEngineModule = __import__("SearchEngines." + engine, globals(), locals(), ["Search"], 0) sEngineModule.Search(self.parent(), self.isCheckSingleFile, selectedSearchDepth) else: engine = self.searchEnginesNames[int( _action.objectName())] sEngineModule = __import__("SearchEngines." + engine, globals(), locals(), ["Search"], 0) sEngineModule.Search(self.parent(), self.isCheckSingleFile) else: Dialogs.show( translate("SearchEngines", "Table Is Empty"), translate( "SearchEngines", "Nothing to be done because the table is empty.")) except: ReportBug.ReportBug()
def createReadOnlyEmbeddedDB(_isNoAlertIfSuccessfully=True): stopReadOnlyEmbeddedDB() if fu.isDir(fu.pathOfSettingsDirectory + "/Amarok"): fu.removeFileOrDir(fu.pathOfSettingsDirectory + "/Amarok") fu.makeDirs(fu.pathOfSettingsDirectory + "/Amarok/mysqle") fu.copyFileOrDir(fu.HamsiManagerDirectory + "/Amarok/EmbeddedDBFiles/mysql", fu.pathOfSettingsDirectory + "/Amarok/mysqle/mysql", ) fu.copyFileOrDir(fu.HamsiManagerDirectory + "/Amarok/EmbeddedDBFiles/my-readOnly.cnf", fu.pathOfSettingsDirectory + "/Amarok/my.cnf") MyConfigure.reConfigureFile(fu.pathOfSettingsDirectory + "/Amarok/my.cnf") fu.makeDirs(fu.pathOfSettingsDirectory + "/Amarok/mysqle/amarok") fu.copyFileOrDir(uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/ib_logfile0", fu.pathOfSettingsDirectory + "/Amarok/mysqle/ib_logfile0") fu.copyFileOrDir(uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/ib_logfile1", fu.pathOfSettingsDirectory + "/Amarok/mysqle/ib_logfile1") fu.copyFileOrDir(uni.getKDE4HomePath() + "/share/apps/amarok/mysqle/ibdata1", fu.pathOfSettingsDirectory + "/Amarok/mysqle/ibdata1") generateReadOnlyEmbeddedD() if _isNoAlertIfSuccessfully is False: Dialogs.show(translate("EmbeddedDBCore", "Created Embedded Server"), translate("EmbeddedDBCore", "Embedded Amarok database server created and generated.")) return True
def runScript(_content, _isShowAlertIsSuccessfully=True): try: try: if _content is not None: exec(_content) if _isShowAlertIsSuccessfully: Dialogs.show( translate("ScriptManager", "Script Has Run Successfully"), translate( "ScriptManager", "Script which you selected has run successfully.")) return True else: Dialogs.showError( translate("ScriptManager", "Script Is Not Available"), translate( "ScriptManager", "Script content is not available or Script file couldn`t read." )) except Exception as error: import traceback cla, error, trbk = sys.exc_info() errorName = cla.__name__ try: excArgs = error.__dict__["args"] except KeyError: excArgs = "<no args>" errorDetail = traceback.format_tb(trbk, 5) errorDetails = str(errorName) + "\n" + str(error) + "\n" + str( excArgs) + "\n" + str(errorDetail[0]) Dialogs.showError( translate("ScriptManager", "Error: Failed To Run The Query"), str(translate("ScriptManager", "Error details: <br> \"%s\"")) % (errorDetails)) return False except: ReportBug.ReportBug()
def build(self): try: uni.isCanBeShowOnMainWindow = False outputTarget = "file" outputType = "html" contentType = "fileTree" if self.cbOutputTarget.currentIndex() == 1: outputTarget = "dialog" elif self.cbOutputTarget.currentIndex() == 2: outputTarget = "clipboard" if self.cbOutputType.currentIndex() == 1: outputType = "plainText" if self.cbContentType.currentIndex() == 1: contentType = "fileList" fu.getFileTree(str(self.lePath.text()), self.cbSubDirectoryDeep.currentText(), outputTarget, outputType, contentType, "title") if self.cbOutputTarget.currentIndex() == 2: Dialogs.show(translate("FileTreeBuilder", "Builded File Tree"), translate("FileTreeBuilder", "File tree copied to clipboard.")) uni.isCanBeShowOnMainWindow = True except: ReportBug.ReportBug()
def sendFinished(self, _nrpBack): Dialogs.showState(translate("ReportBug", "Sending Your Report"), 100, 100) if _nrpBack.error() == MNetworkReply.NoError: Dialogs.show(translate("ReportBug", "Report Received Successfully"), translate("ReportBug", "Thank you for sending us your report. You have contributed a lot to make the next release even better.")) self.close() elif _nrpBack.error() == MNetworkReply.OperationCanceledError: Dialogs.show(translate("ReportBug", "Report Sending Canceled"), translate("ReportBug", "Report sending canceled successfully.")) else: Dialogs.show(translate("ReportBug", "An Error Has Occurred."), translate("ReportBug", "An unknown error has occurred. Please try again.")) uni.isCanBeShowOnMainWindow = True self.namMain = None self.nrqPost = None self.nrpBack = None
def checkAndGetDB(_isNoAlertIfSuccessfully=True, _isReCheck=False): global isCheckAgain if _isReCheck: isCheckAgain = True if checkAmarok(): try: db = connectAndGetDB() if db is not None: if isCheckAgain: db.query("SELECT version FROM admin WHERE component='DB_VERSION'") rows = db.store_result().fetch_row(1) dbVersion = int(rows[0][0]) if dbVersion not in availableDBVersions: answer = Dialogs.ask(translate("Amarok", "Your Amarok DB Version Is Not Tested"), str(translate("Amarok", "Your Amarok DB version is not tested. We don`t suggest but you can use at your own risk. Are you sure you want to use?" "<br>Your Amarok DB Version:%s" "<br>Tested Amarok DB Versions:%s")) % (str(dbVersion), str( availableDBVersions))) if answer is not Dialogs.Yes: return None if _isNoAlertIfSuccessfully is False: Dialogs.show(translate("Amarok", "Connected To Database"), str(translate("Amarok", "Connected successfully to \"%s\"")) % uni.MySettings[ "amarokDBDB"]) isCheckAgain = False return db else: Dialogs.showError(translate("Amarok", "Amarok Database Is Not Usable"), translate("Amarok", "Amarok database is not accessible.")) return None except: cla, currentError, trbk = sys.exc_info() if str(currentError).find("Unknown MySQL server host") != -1: Dialogs.showError(translate("Amarok", "Not Connected To Database"), str( translate("Amarok", "Unknown MySQL server host \"%s\" <br><b>Details</b> : %s")) % ( uni.MySettings["amarokDBHost"], str(currentError))) elif str(currentError).find("Access denied for user") != -1: Dialogs.showError(translate("Amarok", "Not Connected To Database"), str(translate("Amarok", "Access denied for user \"%s\" <br><b>Details</b> : %s")) % ( uni.MySettings["amarokDBUser"], str(currentError))) elif str(currentError).find("Unknown database") != -1: Dialogs.showError(translate("Amarok", "Not Connected To Database"), str(translate("Amarok", "Unknown database \"%s\" <br><b>Details</b> : %s")) % ( uni.MySettings["amarokDBDB"], str(currentError))) elif str(currentError).find("Can't connect to local MySQL server through socket") != -1: Dialogs.showError(translate("Amarok", "Not Connected To Database"), str(translate("Amarok", "Can't connect to local MySQL server through socket \"%s\" <br><b>Details</b> : %s")) % ( str(currentError).replace( "(2002, \"Can't connect to local MySQL server through socket '", "").replace("' (2)\")", ""), str(currentError))) else: ReportBug.ReportBug() return None else: if isLoadedMysql is False: Dialogs.showError(translate("Amarok", "Amarok Module Is Not Usable"), translate("Amarok", "\"python-mysql\" (MySQLdb / _mysql) named module is not installed on your system. Please install this module and try again.")) elif uni.isAvailableKDE4() is False: Dialogs.showError(translate("Amarok", "Amarok Module Is Not Usable"), translate("Amarok", "Please open user session with KDE4 once.")) else: Dialogs.showError(translate("Amarok", "Amarok Module Is Not Usable"), translate("Amarok", "Please run Amarok once.")) return None
def exportValues(self, _actionType="return", _formatType="html", _extInfo="no"): info = "" if _formatType == "html": if _extInfo == "no": pass elif _extInfo == "title": info += " \n<h3>%s : </h3>" % (str( translate("Tables", "Table Contents"))) info += " \n<table border=1> \n<tr> \n<td>*</td> \n" for columnNo in range(self.columnCount()): if self.isColumnHidden(columnNo) is False: info += "<td><b>" info += str(self.tableColumns[columnNo]) info += "</b></td> \n" info += "</tr> \n" for rowNo in range(self.rowCount()): if self.isRowHidden(rowNo) is False: info += " \n<tr> \n<td>" + str(rowNo + 1) + "</td> \n" for columnNo in range(self.columnCount()): if self.isColumnHidden(columnNo) is False: info += "<td>" info += str(str(self.item(rowNo, columnNo).text())) info += "</td> \n" info += "</tr> \n" info += "</table> \n" elif _formatType == "plainText": if _extInfo == "no": pass elif _extInfo == "title": info += " %s : \n" % (str(translate("Tables", "Table Contents"))) info += "*\t" for columnNo in range(self.columnCount()): if self.isColumnHidden(columnNo) is False: info += str(self.tableColumns[columnNo]) info += "\t" info += "\n" for rowNo in range(self.rowCount()): info += str(rowNo + 1) + "\t" if self.isRowHidden(rowNo) is False: for columnNo in range(self.columnCount()): if self.isColumnHidden(columnNo) is False: info += str(str(self.item(rowNo, columnNo).text())) info += "\t" info += "\n" if _actionType == "return": return info elif _actionType == "file": fileExt = None formatTypeName = None if _formatType == "html": if _extInfo != "no": strHeader = ( "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \n" + "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"> \n" + "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"tr\" lang=\"tr\" dir=\"ltr\"> \n" + "<head> \n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> \n</head> \n<body> \n" ) strFooter = " \n</body> \n</html>" info = strHeader + info + strFooter formatTypeName = translate("Tables", "HTML") fileExt = "html" elif _formatType == "plainText": formatTypeName = translate("Tables", "Plain Text") fileExt = "txt" filePath = Dialogs.getSaveFileName( translate("Tables", "Save As"), fu.joinPath( fu.userDirectoryPath, fu.getBaseName(self.currentDirectoryPath) + "." + fileExt), formatTypeName + " (*." + fileExt + ")", 2) if filePath is not None: if _formatType == "html" and filePath[-5:] != ".html": filePath += ".html" elif _formatType == "plainText" and filePath[-4:] != ".txt": filePath += ".txt" fu.writeToFile(filePath, info) Dialogs.show( translate("Tables", "Table Exported"), str( translate( "Tables", "Table contents are exported to file: \"%s\".")) % Organizer.getLink(filePath)) elif _actionType == "dialog": dDialog = MDialog(getMainWindow()) if isActivePyKDE4: dDialog.setButtons(MDialog.NoDefault) dDialog.setWindowTitle(translate("Tables", "Table Contents")) mainPanel = MWidget(dDialog) vblMain = MVBoxLayout(mainPanel) if _formatType == "html": QtWebKit = getMyObject("QtWebKit") wvWeb = QtWebKit.QWebView() wvWeb.setHtml(str(info)) vblMain.addWidget(wvWeb) elif _formatType == "plainText": teContent = MTextEdit() teContent.setPlainText(str(info)) vblMain.addWidget(teContent) pbtnClose = MPushButton(translate("Tables", "OK")) MObject.connect(pbtnClose, SIGNAL("clicked()"), dDialog.close) vblMain.addWidget(pbtnClose) if isActivePyKDE4: dDialog.setMainWidget(mainPanel) else: dDialog.setLayout(vblMain) dDialog.setMinimumWidth(600) dDialog.setMinimumHeight(400) dDialog.show() elif _actionType == "clipboard": MApplication.clipboard().setText(str(info))
def backup(self): backupEmbeddedDB() Dialogs.show(translate("EmbeddedDBConfigurator", "Backup Completed"), translate("EmbeddedDBConfigurator", "Backup successfully completed.<br> You can restore when you want.")) self.pbtnRestore.setEnabled(isHasEmbeddedDBBackup())
def clickedAnAction(_action): try: actionName = _action.objectName() if actionName == "Open State": f = Dialogs.getOpenFileName(translate("MenuBar", "Open State Of Hamsi Manager"), fu.userDirectoryPath, translate("MenuBar", "Application Runner") + " (*.desktop)") if f is not None: Settings.openStateOfSettings(f) elif actionName == "Save State": f = Dialogs.getSaveFileName(translate("MenuBar", "Save State Of Hamsi Manager"), fu.joinPath(fu.userDirectoryPath, "HamsiManager.desktop"), translate("MenuBar", "Application Runner") + " (*.desktop)") if f is not None: Settings.saveStateOfSettings(f) Dialogs.show(translate("MenuBar", "Current State Saved"), translate("MenuBar", "Current state saved with preferences.<br>You can continue where you left off.")) elif actionName == "With This Profile (My Settings)": if Execute.executeAsRootWithThread(["--sDirectoryPath", fu.pathOfSettingsDirectory], "HamsiManager"): getMainWindow().close() else: Dialogs.showError(translate("MenuBar", "Can Not Run As Root"), translate("MenuBar", "Hamsi Manager can not run as root.")) elif actionName == "With Root Profile (Own Settings)": if Execute.executeAsRootWithThread([], "HamsiManager"): getMainWindow().close() else: Dialogs.showError(translate("MenuBar", "Can Not Run As Root"), translate("MenuBar", "Hamsi Manager can not run as root.")) elif actionName == "Quit": getMainWindow().close() elif actionName == "HTML Format": if _action.parent().objectName() == "Export To File": getMainTable().exportValues("file", "html", "title") elif _action.parent().objectName() == "Show In New Window": getMainTable().exportValues("dialog", "html", "title") elif _action.parent().objectName() == "Copy To Clipboard": getMainTable().exportValues("clipboard", "html", "title") elif actionName == "Text Format": if _action.parent().objectName() == "Export To File": getMainTable().exportValues("file", "plainText", "title") elif _action.parent().objectName() == "Show In New Window": getMainTable().exportValues("dialog", "plainText", "title") elif _action.parent().objectName() == "Copy To Clipboard": getMainTable().exportValues("clipboard", "plainText", "title") elif actionName == "HTML Format (File Tree)": if _action.parent().objectName() == "Export To File": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "file", "html", "fileTree", "title") elif _action.parent().objectName() == "Show In New Window": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "dialog", "html", "fileTree", "title") elif _action.parent().objectName() == "Copy To Clipboard": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "clipboard", "html", "fileTree", "title") elif actionName == "Text Format (File Tree)": if _action.parent().objectName() == "Export To File": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "file", "plainText", "fileTree", "title") elif _action.parent().objectName() == "Show In New Window": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "dialog", "plainText", "fileTree", "title") elif _action.parent().objectName() == "Copy To Clipboard": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "clipboard", "plainText", "fileTree", "title") elif actionName == "About QT": if isActivePyKDE4: QMessageBox.aboutQt(getMainWindow(), translate("MenuBar", "About QT")) else: MMessageBox.aboutQt(getMainWindow(), translate("MenuBar", "About QT")) elif actionName == "Options": from Options import OptionsForm OptionsForm.OptionsForm(getMainWindow()) elif actionName == "My Plugins": import MyPlugins MyPlugins.MyPlugins() elif actionName == "Reconfigure": from Tools import Configurator Configurator.Configurator("configurePage") elif actionName == "My Plugins (System)": Execute.execute(["--qm", "--plugins", "--runAsRoot"], "HamsiManager") elif actionName == "Reconfigure (System)": Execute.execute(["--qm", "--configurator", "--runAsRoot"], "HamsiManager") elif actionName == "Update": from Core import UpdateControl UpdateControl.UpdateControl(getMainWindow()) elif actionName == "Report Bug": ReportBug.ReportBug(True) elif actionName == "Suggest Idea": from Core import SuggestIdea SuggestIdea.SuggestIdea() elif actionName == "About Hamsi Manager": if isActivePyKDE4 is False: MMessageBox.about(getMainWindow(), translate("MenuBar", "About Hamsi Manager"), uni.aboutOfHamsiManager) elif actionName == translate("ToolsBar", "Check Icon"): getMainWindow().setEnabled(False) fu.checkIcon(getMainWindow().FileManager.getCurrentDirectoryPath()) Dialogs.show(translate("ToolsBar", "Directory Icon Checked"), translate("ToolsBar", "Current directory icon checked.<br>The default action based on the data is executed.")) getMainWindow().setEnabled(True) elif actionName == "Clear Empty Directories": if getMainTable().checkUnSavedValues() is False: _action.setChecked(False) return False answer = Dialogs.ask(translate("ToolsBar", "Empty Directories Will Be Removed"), str(translate("ToolsBar", "Are you sure you want to remove empty directories based on the criteria you set in \"%s\"?")) % Organizer.getLink( getMainWindow().FileManager.getCurrentDirectoryPath())) if answer == Dialogs.Yes: getMainWindow().setEnabled(False) currentDirPath = getMainWindow().FileManager.getCurrentDirectoryPath() if fu.isWritableFileOrDir(currentDirPath): fu.checkEmptyDirectories(currentDirPath, True, True, True, True) Dialogs.show(translate("ToolsBar", "Directory Cleaned"), translate("ToolsBar", "The current directory is cleaned based on the criteria you set.")) getMainWindow().setEnabled(True) getMainWindow().FileManager.makeRefresh() elif actionName == "Pack": from Tools import Packager Packager.Packager(getMainWindow().FileManager.getCurrentDirectoryPath()) elif actionName == "Hash": from Tools import Hasher Hasher.Hasher(getMainWindow().FileManager.getCurrentDirectoryPath()) elif actionName == "Clear": from Tools import Cleaner Cleaner.Cleaner(getMainWindow().FileManager.getCurrentDirectoryPath()) elif actionName == "Text Corrector": from Tools import TextCorrector TextCorrector.TextCorrector(getMainWindow().FileManager.getCurrentDirectoryPath()) elif actionName == "File Tree": from Tools import FileTreeBuilder FileTreeBuilder.FileTreeBuilder(getMainWindow().FileManager.getCurrentDirectoryPath()) elif actionName == "Search": from Tools import Searcher Searcher.Searcher([getMainWindow().FileManager.getCurrentDirectoryPath()]) elif actionName == "Script Manager": from Tools import ScriptManager if ScriptManager.ScriptManager.checkScriptManager(): ScriptManager.ScriptManager(getMainWindow()) elif actionName == "Show Last Actions": from Core import RecordsForm RecordsForm.RecordsForm(getMainWindow()) elif actionName == "Remove Sub Files": answer = Dialogs.ask(translate("ToolsBar", "All Files Will Be Removed"), str(translate("ToolsBar", "Are you sure you want to remove only all files in \"%s\"?<br>Note:Do not will remove directory and subfolders.")) % Organizer.getLink( getMainWindow().FileManager.getCurrentDirectoryPath())) if answer == Dialogs.Yes: getMainWindow().setEnabled(False) fu.removeOnlySubFiles(getMainWindow().FileManager.getCurrentDirectoryPath()) getMainWindow().setEnabled(True) Dialogs.show(translate("ToolsBar", "Removed Only All Files"), str(translate("ToolsBar", "Removed only all files in \"%s\".<br>Note:Do not removed directory and subfolders.")) % Organizer.getLink( getMainWindow().FileManager.getCurrentDirectoryPath())) elif actionName == "Amarok Embedded Database Configurator": import Amarok if Amarok.checkAmarok(): Amarok.openEmbeddedDBConfigurator() elif _action.parent().objectName() == "Table Types": changeTableType(_action) elif _action.parent().objectName() == "File Renamer Types": changeReNamerType(_action) elif _action.parent().objectName() == "Scripts": from Core import Scripts Scripts.runScriptFile(fu.joinPath(Scripts.pathOfScripsDirectory, actionName)) Records.saveAllRecords() except: ReportBug.ReportBug()
def clickedAnAction(_action): try: actionName = _action.objectName() if actionName == "Open State": f = Dialogs.getOpenFileName( translate("MenuBar", "Open State Of Hamsi Manager"), fu.userDirectoryPath, translate("MenuBar", "Application Runner") + " (*.desktop)") if f is not None: Settings.openStateOfSettings(f) elif actionName == "Save State": f = Dialogs.getSaveFileName( translate("MenuBar", "Save State Of Hamsi Manager"), fu.joinPath(fu.userDirectoryPath, "HamsiManager.desktop"), translate("MenuBar", "Application Runner") + " (*.desktop)") if f is not None: Settings.saveStateOfSettings(f) Dialogs.show( translate("MenuBar", "Current State Saved"), translate( "MenuBar", "Current state saved with preferences.<br>You can continue where you left off." )) elif actionName == "With This Profile (My Settings)": if Execute.executeAsRootWithThread( ["--sDirectoryPath", fu.pathOfSettingsDirectory], "HamsiManager"): getMainWindow().close() else: Dialogs.showError( translate("MenuBar", "Can Not Run As Root"), translate("MenuBar", "Hamsi Manager can not run as root.")) elif actionName == "With Root Profile (Own Settings)": if Execute.executeAsRootWithThread([], "HamsiManager"): getMainWindow().close() else: Dialogs.showError( translate("MenuBar", "Can Not Run As Root"), translate("MenuBar", "Hamsi Manager can not run as root.")) elif actionName == "Quit": getMainWindow().close() elif actionName == "HTML Format": if _action.parent().objectName() == "Export To File": getMainTable().exportValues("file", "html", "title") elif _action.parent().objectName() == "Show In New Window": getMainTable().exportValues("dialog", "html", "title") elif _action.parent().objectName() == "Copy To Clipboard": getMainTable().exportValues("clipboard", "html", "title") elif actionName == "Text Format": if _action.parent().objectName() == "Export To File": getMainTable().exportValues("file", "plainText", "title") elif _action.parent().objectName() == "Show In New Window": getMainTable().exportValues("dialog", "plainText", "title") elif _action.parent().objectName() == "Copy To Clipboard": getMainTable().exportValues("clipboard", "plainText", "title") elif actionName == "HTML Format (File Tree)": if _action.parent().objectName() == "Export To File": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "file", "html", "fileTree", "title") elif _action.parent().objectName() == "Show In New Window": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "dialog", "html", "fileTree", "title") elif _action.parent().objectName() == "Copy To Clipboard": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "clipboard", "html", "fileTree", "title") elif actionName == "Text Format (File Tree)": if _action.parent().objectName() == "Export To File": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "file", "plainText", "fileTree", "title") elif _action.parent().objectName() == "Show In New Window": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "dialog", "plainText", "fileTree", "title") elif _action.parent().objectName() == "Copy To Clipboard": fu.getFileTree((getMainWindow().FileManager.currentDirectory), 0, "clipboard", "plainText", "fileTree", "title") elif actionName == "About QT": if isActivePyKDE4: QMessageBox.aboutQt(getMainWindow(), translate("MenuBar", "About QT")) else: MMessageBox.aboutQt(getMainWindow(), translate("MenuBar", "About QT")) elif actionName == "Options": from Options import OptionsForm OptionsForm.OptionsForm(getMainWindow()) elif actionName == "My Plugins": import MyPlugins MyPlugins.MyPlugins() elif actionName == "Reconfigure": from Tools import Configurator Configurator.Configurator("configurePage") elif actionName == "My Plugins (System)": Execute.execute(["--qm", "--plugins", "--runAsRoot"], "HamsiManager") elif actionName == "Reconfigure (System)": Execute.execute(["--qm", "--configurator", "--runAsRoot"], "HamsiManager") elif actionName == "Update": from Core import UpdateControl UpdateControl.UpdateControl(getMainWindow()) elif actionName == "Report Bug": ReportBug.ReportBug(True) elif actionName == "Suggest Idea": from Core import SuggestIdea SuggestIdea.SuggestIdea() elif actionName == "About Hamsi Manager": if isActivePyKDE4 is False: MMessageBox.about(getMainWindow(), translate("MenuBar", "About Hamsi Manager"), uni.aboutOfHamsiManager) elif actionName == translate("ToolsBar", "Check Icon"): getMainWindow().setEnabled(False) fu.checkIcon(getMainWindow().FileManager.getCurrentDirectoryPath()) Dialogs.show( translate("ToolsBar", "Directory Icon Checked"), translate( "ToolsBar", "Current directory icon checked.<br>The default action based on the data is executed." )) getMainWindow().setEnabled(True) elif actionName == "Clear Empty Directories": if getMainTable().checkUnSavedValues() is False: _action.setChecked(False) return False answer = Dialogs.ask( translate("ToolsBar", "Empty Directories Will Be Removed"), str( translate( "ToolsBar", "Are you sure you want to remove empty directories based on the criteria you set in \"%s\"?" )) % Organizer.getLink( getMainWindow().FileManager.getCurrentDirectoryPath())) if answer == Dialogs.Yes: getMainWindow().setEnabled(False) currentDirPath = getMainWindow( ).FileManager.getCurrentDirectoryPath() if fu.isWritableFileOrDir(currentDirPath): fu.checkEmptyDirectories(currentDirPath, True, True, True, True) Dialogs.show( translate("ToolsBar", "Directory Cleaned"), translate( "ToolsBar", "The current directory is cleaned based on the criteria you set." )) getMainWindow().setEnabled(True) getMainWindow().FileManager.makeRefresh() elif actionName == "Pack": from Tools import Packager Packager.Packager( getMainWindow().FileManager.getCurrentDirectoryPath()) elif actionName == "Hash": from Tools import Hasher Hasher.Hasher( getMainWindow().FileManager.getCurrentDirectoryPath()) elif actionName == "Clear": from Tools import Cleaner Cleaner.Cleaner( getMainWindow().FileManager.getCurrentDirectoryPath()) elif actionName == "Text Corrector": from Tools import TextCorrector TextCorrector.TextCorrector( getMainWindow().FileManager.getCurrentDirectoryPath()) elif actionName == "File Tree": from Tools import FileTreeBuilder FileTreeBuilder.FileTreeBuilder( getMainWindow().FileManager.getCurrentDirectoryPath()) elif actionName == "Search": from Tools import Searcher Searcher.Searcher( [getMainWindow().FileManager.getCurrentDirectoryPath()]) elif actionName == "Script Manager": from Tools import ScriptManager if ScriptManager.ScriptManager.checkScriptManager(): ScriptManager.ScriptManager(getMainWindow()) elif actionName == "Show Last Actions": from Core import RecordsForm RecordsForm.RecordsForm(getMainWindow()) elif actionName == "Remove Sub Files": answer = Dialogs.ask( translate("ToolsBar", "All Files Will Be Removed"), str( translate( "ToolsBar", "Are you sure you want to remove only all files in \"%s\"?<br>Note:Do not will remove directory and subfolders." )) % Organizer.getLink( getMainWindow().FileManager.getCurrentDirectoryPath())) if answer == Dialogs.Yes: getMainWindow().setEnabled(False) fu.removeOnlySubFiles( getMainWindow().FileManager.getCurrentDirectoryPath()) getMainWindow().setEnabled(True) Dialogs.show( translate("ToolsBar", "Removed Only All Files"), str( translate( "ToolsBar", "Removed only all files in \"%s\".<br>Note:Do not removed directory and subfolders." )) % Organizer.getLink( getMainWindow().FileManager.getCurrentDirectoryPath())) elif actionName == "Amarok Embedded Database Configurator": import Amarok if Amarok.checkAmarok(): Amarok.openEmbeddedDBConfigurator() elif _action.parent().objectName() == "Table Types": changeTableType(_action) elif _action.parent().objectName() == "File Renamer Types": changeReNamerType(_action) elif _action.parent().objectName() == "Scripts": from Core import Scripts Scripts.runScriptFile( fu.joinPath(Scripts.pathOfScripsDirectory, actionName)) Records.saveAllRecords() except: ReportBug.ReportBug()
def changeFile(self, _filePath, _readFrom="tag"): self.musicFile = _filePath self.musicValues = None self.isPlayNow = MToolButton() self.isPlayNow.setToolTip( translate("MusicDetails", "Play Suddenly Music When Open")) self.isPlayNow.setText(translate("MusicDetails", "Play When Open")) self.isPlayNow.setCheckable(True) self.isPlayNow.setChecked(uni.getBoolValue("isPlayNow")) self.isGetFromAmarok = MToolButton() self.isGetFromAmarok.setToolTip( translate("MusicDetails", "Get Values From Amarok")) self.isGetFromAmarok.setText( translate("MusicDetails", "Get From Amarok")) self.isGetFromAmarok.setCheckable(True) if _readFrom.count("Amarok") > 0: import Amarok uni.startThreadAction() Dialogs.showState( translate("MusicDetails", "Getting Values From Amarok"), 0, 1) if Amarok.checkAmarok(): isContinueThreadAction = uni.isContinueThreadAction() if isContinueThreadAction: from Amarok import Operations musicFileRows = Operations.getAllMusicFileValuesWithNames( "filename:\"" + _filePath + "\"") Dialogs.showState( translate("MusicDetails", "Values Are Being Processed"), 1, 1) if len(musicFileRows) > 0: musicFileRow = musicFileRows[0] content = {} content["path"] = musicFileRow["filePath"] content["baseNameOfDirectory"] = fu.getBaseName( fu.getDirName(musicFileRow["filePath"])) content["baseName"] = fu.getBaseName( musicFileRow["filePath"]) content["artist"] = musicFileRow["artist"] content["title"] = musicFileRow["title"] content["album"] = musicFileRow["album"] content["albumArtist"] = musicFileRow["albumArtist"] content["trackNum"] = musicFileRow["trackNumber"] content["year"] = musicFileRow["year"] content["genre"] = musicFileRow["genre"] content["firstComment"] = musicFileRow["comment"] content["firstLyrics"] = musicFileRow["lyrics"] content["images"] = [] if _readFrom == "Amarok (Smart)": tagger = Taggers.getTagger() try: tagger.loadFile(musicFileRow["filePath"]) except: pass else: if content["artist"].strip() == "": content["artist"] = tagger.getArtist() if content["title"].strip() == "": content["title"] = tagger.getTitle() if content["album"].strip() == "": content["album"] = tagger.getAlbum() if content["albumArtist"].strip() == "": content[ "albumArtist"] = tagger.getAlbumArtist( ) if str(content["trackNum"]).strip() == "": content["trackNum"] = tagger.getTrackNum() if str(content["year"]).strip() == "": content["year"] = tagger.getYear() if content["genre"].strip() == "": content["genre"] = tagger.getGenre() if content["firstComment"].strip() == "": content[ "firstComment"] = tagger.getFirstComment( ) if content["firstLyrics"].strip() == "": content[ "firstLyrics"] = tagger.getFirstLyrics( ) content["images"] = tagger.getImages() self.isGetFromAmarok.setChecked(True) self.musicValues = content else: Dialogs.show( translate("MusicDetails", "Not Exist In Amarok"), translate( "MusicDetails", "This music file not exist in Amarok DB.")) uni.finishThreadAction() if self.musicValues is None: self.isGetFromAmarok.setChecked(False) self.musicValues = Musics.readMusicFile(self.musicFile) self.setWindowTitle(str(fu.getBaseName(self.musicFile))) if self.pnlClearable is not None: clearAllChildren(self.pnlClearable, True) self.pnlClearable = MWidget() self.vblMain.insertWidget(0, self.pnlClearable, 20) vblClearable = MVBoxLayout(self.pnlClearable) self.player = MusicPlayer.MusicPlayer(self, "dialog", _filePath) self.infoLabels["baseNameOfDirectory"] = MLabel(self.labels[0]) self.infoLabels["baseName"] = MLabel(self.labels[1]) self.infoLabels["artist"] = MLabel(self.labels[2]) self.infoLabels["title"] = MLabel(self.labels[3]) self.infoLabels["album"] = MLabel(self.labels[4]) self.infoLabels["albumArtist"] = MLabel(self.labels[5]) self.infoLabels["trackNum"] = MLabel(self.labels[6]) self.infoLabels["year"] = MLabel(self.labels[7]) self.infoLabels["genre"] = MLabel(self.labels[8]) self.infoValues["baseNameOfDirectory"] = MLineEdit( str( Organizer.emend(self.musicValues["baseNameOfDirectory"], "directory", False))) self.infoValues["baseName"] = MLineEdit( str(Organizer.emend(self.musicValues["baseName"], "file"))) self.infoValues["artist"] = MLineEdit( str(Organizer.emend(self.musicValues["artist"]))) self.infoValues["title"] = MLineEdit( str(Organizer.emend(self.musicValues["title"]))) self.infoValues["album"] = MLineEdit( str(Organizer.emend(self.musicValues["album"]))) self.infoValues["albumArtist"] = MLineEdit( str(Organizer.emend(self.musicValues["albumArtist"]))) self.infoValues["trackNum"] = MLineEdit( str(Organizer.emend(self.musicValues["trackNum"]))) self.infoValues["year"] = MLineEdit( str(Organizer.emend(self.musicValues["year"]))) self.infoValues["genre"] = MLineEdit( str(Organizer.emend(self.musicValues["genre"]))) self.infoValues["firstComment"] = MPlainTextEdit( str(Organizer.emend(self.musicValues["firstComment"]))) self.infoValues["firstLyrics"] = MPlainTextEdit( str(Organizer.emend(self.musicValues["firstLyrics"]))) self.infoValues["firstComment"].setLineWrapMode(MPlainTextEdit.NoWrap) self.infoValues["firstLyrics"].setLineWrapMode(MPlainTextEdit.NoWrap) if Taggers.getTagger().isSupportImages: self.isOpenImageDetailsOnNewWindow = MCheckBox( translate("MusicDetails", "Show Images In New Window")) self.pbtnAddImage = MPushButton(translate("MusicDetails", "Append")) self.pbtnDeleteImage = MPushButton( translate("MusicDetails", "Delete")) self.pbtnSaveAsImage = MPushButton( translate("MusicDetails", "Save As ...")) self.pbtnCancelAddImage = MPushButton( translate("MusicDetails", "Cancel")) self.pbtnSelectImage = MPushButton( translate("MusicDetails", "Choose Image")) MObject.connect(self.pbtnAddImage, SIGNAL("clicked()"), self.addImage) MObject.connect(self.pbtnDeleteImage, SIGNAL("clicked()"), self.deleteImage) MObject.connect(self.pbtnSaveAsImage, SIGNAL("clicked()"), self.saveAsImage) MObject.connect(self.pbtnCancelAddImage, SIGNAL("clicked()"), self.cancelAddImage) MObject.connect(self.pbtnSelectImage, SIGNAL("clicked()"), self.selectImage) self.leImagePath = MLineEdit("") self.lblImagePath = MLabel( translate("MusicDetails", "Image Path: ")) self.cbImageType = MComboBox() self.cbImageType.addItems(Taggers.getTagger().getImageTypes()) self.lblImageType = MLabel( translate("MusicDetails", "Image Type: ")) self.lstwImages = MListWidget() self.lstwImages.setGridSize(MSize(350, 100)) self.lstwImages.setIconSize(MSize(98, 98)) MObject.connect(self.lstwImages, SIGNAL("doubleClicked(QModelIndex)"), self.openImageDetails) MObject.connect(self.isGetFromAmarok, SIGNAL("toggled(bool)"), self.isGetFromAmarokTiggered) self.lstwImages.clear() for image in self.musicValues["images"]: if len(image) == 5: pixmImage = MPixmap() pixmImage.loadFromData(image[3]) icnImage = QIcon(pixmImage) icnImage.actualSize(MSize(98, 98)) item = MListWidgetItem(icnImage, image[1] + "\n(" + image[2] + ")") item.setSizeHint(MSize(1, 100)) self.lstwImages.addItem(item) HBOXs = [] HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["baseNameOfDirectory"]) HBOXs[-1].addWidget(self.infoValues["baseNameOfDirectory"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["baseName"]) HBOXs[-1].addWidget(self.infoValues["baseName"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["artist"]) HBOXs[-1].addWidget(self.infoValues["artist"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["title"]) HBOXs[-1].addWidget(self.infoValues["title"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["album"]) HBOXs[-1].addWidget(self.infoValues["album"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["albumArtist"]) HBOXs[-1].addWidget(self.infoValues["albumArtist"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["trackNum"]) HBOXs[-1].addWidget(self.infoValues["trackNum"]) HBOXs[-1].addWidget(self.infoLabels["year"]) HBOXs[-1].addWidget(self.infoValues["year"]) HBOXs[-1].addWidget(self.infoLabels["genre"]) HBOXs[-1].addWidget(self.infoValues["genre"]) vblInfos = MVBoxLayout() for hbox in HBOXs: vblInfos.addLayout(hbox) if Taggers.getTagger().isSupportImages: imageBoxs = [] imageBoxs.append(MHBoxLayout()) imageBoxs[0].addWidget(self.leImagePath) imageBoxs[0].addWidget(self.pbtnSelectImage) imageBoxs.append(MHBoxLayout()) imageBoxs[1].addWidget(self.lblImageType) imageBoxs[1].addWidget(self.cbImageType) imageBoxs.append(MHBoxLayout()) imageBoxs[2].addWidget(self.pbtnAddImage) imageBoxs[2].addWidget(self.pbtnDeleteImage) imageBoxs[2].addWidget(self.pbtnSaveAsImage) imageBoxs[2].addWidget(self.pbtnCancelAddImage) vblImages = MVBoxLayout() vblImages.addWidget(self.lstwImages) vblImages.addWidget(self.isOpenImageDetailsOnNewWindow) vblImages.addWidget(self.lblImagePath) vblImages.addLayout(imageBoxs[0]) vblImages.addLayout(imageBoxs[1]) vblImages.addLayout(imageBoxs[2]) vblComments = MVBoxLayout() vblComments.addWidget(self.infoValues["firstComment"]) vblLyrics = MVBoxLayout() vblLyrics.addWidget(self.infoValues["firstLyrics"]) self.tabwTabs = MTabWidget(self.pnlMain) self.pnlComments = MWidget(self.tabwTabs) self.pnlComments.setLayout(vblComments) self.tabwTabs.addTab(self.pnlComments, translate("MusicDetails", "Comments")) self.pnlLyrics = MWidget(self.tabwTabs) self.pnlLyrics.setLayout(vblLyrics) self.tabwTabs.addTab(self.pnlLyrics, translate("MusicDetails", "Lyrics")) if Taggers.getTagger().isSupportImages: self.pnlImages = MWidget(self.tabwTabs) self.pnlImages.setLayout(vblImages) self.tabwTabs.addTab(self.pnlImages, translate("MusicDetails", "Images")) self.pbtnSelectImage.hide() self.leImagePath.hide() self.lblImagePath.hide() self.lblImageType.hide() self.cbImageType.hide() self.pbtnCancelAddImage.hide() hblPlayer = MHBoxLayout() vblExtraButtons = MVBoxLayout() hblPlayer.addWidget(self.player) vblExtraButtons.addWidget(self.isPlayNow) vblExtraButtons.addWidget(self.isGetFromAmarok) hblPlayer.addLayout(vblExtraButtons) vblClearable.addLayout(hblPlayer) vblClearable.addLayout(vblInfos) vblClearable.addWidget(self.tabwTabs)
def changeFile(self, _filePath, _readFrom="tag"): self.musicFile = _filePath self.musicValues = None self.isPlayNow = MToolButton() self.isPlayNow.setToolTip(translate("MusicDetails", "Play Suddenly Music When Open")) self.isPlayNow.setText(translate("MusicDetails", "Play When Open")) self.isPlayNow.setCheckable(True) self.isPlayNow.setChecked(uni.getBoolValue("isPlayNow")) self.isGetFromAmarok = MToolButton() self.isGetFromAmarok.setToolTip(translate("MusicDetails", "Get Values From Amarok")) self.isGetFromAmarok.setText(translate("MusicDetails", "Get From Amarok")) self.isGetFromAmarok.setCheckable(True) if _readFrom.count("Amarok") > 0: import Amarok uni.startThreadAction() Dialogs.showState(translate("MusicDetails", "Getting Values From Amarok"), 0, 1) if Amarok.checkAmarok(): isContinueThreadAction = uni.isContinueThreadAction() if isContinueThreadAction: from Amarok import Operations musicFileRows = Operations.getAllMusicFileValuesWithNames("filename:\"" + _filePath + "\"") Dialogs.showState(translate("MusicDetails", "Values Are Being Processed"), 1, 1) if len(musicFileRows)>0: musicFileRow = musicFileRows[0] content = {} content["path"] = musicFileRow["filePath"] content["baseNameOfDirectory"] = fu.getBaseName( fu.getDirName(musicFileRow["filePath"])) content["baseName"] = fu.getBaseName(musicFileRow["filePath"]) content["artist"] = musicFileRow["artist"] content["title"] = musicFileRow["title"] content["album"] = musicFileRow["album"] content["albumArtist"] = musicFileRow["albumArtist"] content["trackNum"] = musicFileRow["trackNumber"] content["year"] = musicFileRow["year"] content["genre"] = musicFileRow["genre"] content["firstComment"] = musicFileRow["comment"] content["firstLyrics"] = musicFileRow["lyrics"] content["images"] = [] if _readFrom == "Amarok (Smart)": tagger = Taggers.getTagger() try: tagger.loadFile(musicFileRow["filePath"]) except: pass else: if content["artist"].strip() == "": content["artist"] = tagger.getArtist() if content["title"].strip() == "": content["title"] = tagger.getTitle() if content["album"].strip() == "": content["album"] = tagger.getAlbum() if content["albumArtist"].strip() == "": content["albumArtist"] = tagger.getAlbumArtist() if str(content["trackNum"]).strip() == "": content["trackNum"] = tagger.getTrackNum() if str(content["year"]).strip() == "": content["year"] = tagger.getYear() if content["genre"].strip() == "": content["genre"] = tagger.getGenre() if content["firstComment"].strip() == "": content["firstComment"] = tagger.getFirstComment() if content["firstLyrics"].strip() == "": content["firstLyrics"] = tagger.getFirstLyrics() content["images"] = tagger.getImages() self.isGetFromAmarok.setChecked(True) self.musicValues = content else: Dialogs.show(translate("MusicDetails", "Not Exist In Amarok"), translate("MusicDetails", "This music file not exist in Amarok DB.")) uni.finishThreadAction() if self.musicValues is None: self.isGetFromAmarok.setChecked(False) self.musicValues = Musics.readMusicFile(self.musicFile) self.setWindowTitle(str(fu.getBaseName(self.musicFile))) if self.pnlClearable is not None: clearAllChildren(self.pnlClearable, True) self.pnlClearable = MWidget() self.vblMain.insertWidget(0, self.pnlClearable, 20) vblClearable = MVBoxLayout(self.pnlClearable) self.player = MusicPlayer.MusicPlayer(self, "dialog", _filePath) self.infoLabels["baseNameOfDirectory"] = MLabel(self.labels[0]) self.infoLabels["baseName"] = MLabel(self.labels[1]) self.infoLabels["artist"] = MLabel(self.labels[2]) self.infoLabels["title"] = MLabel(self.labels[3]) self.infoLabels["album"] = MLabel(self.labels[4]) self.infoLabels["albumArtist"] = MLabel(self.labels[5]) self.infoLabels["trackNum"] = MLabel(self.labels[6]) self.infoLabels["year"] = MLabel(self.labels[7]) self.infoLabels["genre"] = MLabel(self.labels[8]) self.infoValues["baseNameOfDirectory"] = MLineEdit( str(Organizer.emend(self.musicValues["baseNameOfDirectory"], "directory", False))) self.infoValues["baseName"] = MLineEdit(str(Organizer.emend(self.musicValues["baseName"], "file"))) self.infoValues["artist"] = MLineEdit(str(Organizer.emend(self.musicValues["artist"]))) self.infoValues["title"] = MLineEdit(str(Organizer.emend(self.musicValues["title"]))) self.infoValues["album"] = MLineEdit(str(Organizer.emend(self.musicValues["album"]))) self.infoValues["albumArtist"] = MLineEdit(str(Organizer.emend(self.musicValues["albumArtist"]))) self.infoValues["trackNum"] = MLineEdit(str(Organizer.emend(self.musicValues["trackNum"]))) self.infoValues["year"] = MLineEdit(str(Organizer.emend(self.musicValues["year"]))) self.infoValues["genre"] = MLineEdit(str(Organizer.emend(self.musicValues["genre"]))) self.infoValues["firstComment"] = MPlainTextEdit(str(Organizer.emend(self.musicValues["firstComment"]))) self.infoValues["firstLyrics"] = MPlainTextEdit(str(Organizer.emend(self.musicValues["firstLyrics"]))) self.infoValues["firstComment"].setLineWrapMode(MPlainTextEdit.NoWrap) self.infoValues["firstLyrics"].setLineWrapMode(MPlainTextEdit.NoWrap) if Taggers.getTagger().isSupportImages: self.isOpenImageDetailsOnNewWindow = MCheckBox(translate("MusicDetails", "Show Images In New Window")) self.pbtnAddImage = MPushButton(translate("MusicDetails", "Append")) self.pbtnDeleteImage = MPushButton(translate("MusicDetails", "Delete")) self.pbtnSaveAsImage = MPushButton(translate("MusicDetails", "Save As ...")) self.pbtnCancelAddImage = MPushButton(translate("MusicDetails", "Cancel")) self.pbtnSelectImage = MPushButton(translate("MusicDetails", "Choose Image")) MObject.connect(self.pbtnAddImage, SIGNAL("clicked()"), self.addImage) MObject.connect(self.pbtnDeleteImage, SIGNAL("clicked()"), self.deleteImage) MObject.connect(self.pbtnSaveAsImage, SIGNAL("clicked()"), self.saveAsImage) MObject.connect(self.pbtnCancelAddImage, SIGNAL("clicked()"), self.cancelAddImage) MObject.connect(self.pbtnSelectImage, SIGNAL("clicked()"), self.selectImage) self.leImagePath = MLineEdit("") self.lblImagePath = MLabel(translate("MusicDetails", "Image Path: ")) self.cbImageType = MComboBox() self.cbImageType.addItems(Taggers.getTagger().getImageTypes()) self.lblImageType = MLabel(translate("MusicDetails", "Image Type: ")) self.lstwImages = MListWidget() self.lstwImages.setGridSize(MSize(350, 100)) self.lstwImages.setIconSize(MSize(98, 98)) MObject.connect(self.lstwImages, SIGNAL("doubleClicked(QModelIndex)"), self.openImageDetails) MObject.connect(self.isGetFromAmarok, SIGNAL("toggled(bool)"), self.isGetFromAmarokTiggered) self.lstwImages.clear() for image in self.musicValues["images"]: if len(image) == 5: pixmImage = MPixmap() pixmImage.loadFromData(image[3]) icnImage = QIcon(pixmImage) icnImage.actualSize(MSize(98, 98)) item = MListWidgetItem(icnImage, image[1] + "\n(" + image[2] + ")") item.setSizeHint(MSize(1, 100)) self.lstwImages.addItem(item) HBOXs = [] HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["baseNameOfDirectory"]) HBOXs[-1].addWidget(self.infoValues["baseNameOfDirectory"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["baseName"]) HBOXs[-1].addWidget(self.infoValues["baseName"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["artist"]) HBOXs[-1].addWidget(self.infoValues["artist"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["title"]) HBOXs[-1].addWidget(self.infoValues["title"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["album"]) HBOXs[-1].addWidget(self.infoValues["album"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["albumArtist"]) HBOXs[-1].addWidget(self.infoValues["albumArtist"]) HBOXs.append(MHBoxLayout()) HBOXs[-1].addWidget(self.infoLabels["trackNum"]) HBOXs[-1].addWidget(self.infoValues["trackNum"]) HBOXs[-1].addWidget(self.infoLabels["year"]) HBOXs[-1].addWidget(self.infoValues["year"]) HBOXs[-1].addWidget(self.infoLabels["genre"]) HBOXs[-1].addWidget(self.infoValues["genre"]) vblInfos = MVBoxLayout() for hbox in HBOXs: vblInfos.addLayout(hbox) if Taggers.getTagger().isSupportImages: imageBoxs = [] imageBoxs.append(MHBoxLayout()) imageBoxs[0].addWidget(self.leImagePath) imageBoxs[0].addWidget(self.pbtnSelectImage) imageBoxs.append(MHBoxLayout()) imageBoxs[1].addWidget(self.lblImageType) imageBoxs[1].addWidget(self.cbImageType) imageBoxs.append(MHBoxLayout()) imageBoxs[2].addWidget(self.pbtnAddImage) imageBoxs[2].addWidget(self.pbtnDeleteImage) imageBoxs[2].addWidget(self.pbtnSaveAsImage) imageBoxs[2].addWidget(self.pbtnCancelAddImage) vblImages = MVBoxLayout() vblImages.addWidget(self.lstwImages) vblImages.addWidget(self.isOpenImageDetailsOnNewWindow) vblImages.addWidget(self.lblImagePath) vblImages.addLayout(imageBoxs[0]) vblImages.addLayout(imageBoxs[1]) vblImages.addLayout(imageBoxs[2]) vblComments = MVBoxLayout() vblComments.addWidget(self.infoValues["firstComment"]) vblLyrics = MVBoxLayout() vblLyrics.addWidget(self.infoValues["firstLyrics"]) self.tabwTabs = MTabWidget(self.pnlMain) self.pnlComments = MWidget(self.tabwTabs) self.pnlComments.setLayout(vblComments) self.tabwTabs.addTab(self.pnlComments, translate("MusicDetails", "Comments")) self.pnlLyrics = MWidget(self.tabwTabs) self.pnlLyrics.setLayout(vblLyrics) self.tabwTabs.addTab(self.pnlLyrics, translate("MusicDetails", "Lyrics")) if Taggers.getTagger().isSupportImages: self.pnlImages = MWidget(self.tabwTabs) self.pnlImages.setLayout(vblImages) self.tabwTabs.addTab(self.pnlImages, translate("MusicDetails", "Images")) self.pbtnSelectImage.hide() self.leImagePath.hide() self.lblImagePath.hide() self.lblImageType.hide() self.cbImageType.hide() self.pbtnCancelAddImage.hide() hblPlayer = MHBoxLayout() vblExtraButtons = MVBoxLayout() hblPlayer.addWidget(self.player) vblExtraButtons.addWidget(self.isPlayNow) vblExtraButtons.addWidget(self.isGetFromAmarok) hblPlayer.addLayout(vblExtraButtons) vblClearable.addLayout(hblPlayer) vblClearable.addLayout(vblInfos) vblClearable.addWidget(self.tabwTabs)