def handleDetails(self): elem = self.GetFocusedElement() index = elem.getConfirmationManagerIndex() confs = self.fileOperator.GetConfirmationManager() confirmElem = confs.GetAt(index) e = confirmElem.GetElement() from_path = e.path dest_path = e.destpath from_stat = os.stat(from_path) dest_stat = os.stat(dest_path) info = [ (_("名前"), os.path.basename(from_path), "", ""), (_("サイズ"), misc.ConvertBytesTo( dest_stat.st_size, misc.UNIT_AUTO, True), "→", misc.ConvertBytesTo( from_stat.st_size, misc.UNIT_AUTO, True)), (_("更新日時"), datetime.datetime.fromtimestamp( dest_stat.st_mtime), "→", datetime.datetime.fromtimestamp( from_stat.st_mtime))] d = views.OperationSelecter.Dialog( _("上書きしますか?"), info, views.OperationSelecter.GetMethod("ALREADY_EXISTS"), False) d.Initialize() d.Show() val = d.GetValue() if val['all'] is True: # 「以降も同様に処理」がオン confs.RespondAll(confirmElem, val['response']) else: # この1件だけ confirmElem.Respond(d.GetValue()['response']) # 渓谷に対して、文字列でレスポンスする # end これ以降全てかこれだけか self.fileOperator.UpdateConfirmation() # これで繁栄する self.listObject.Update(confs) self.Update(self.listObject) self.fileOperator.Execute() # これでコピーを再実行
def GetListTuple(self): """ 表示に必要なタプルを返す。 変更した場合はNetworkResourceの方にも反映すること! """ return (self.basename, self.letter, misc.ConvertBytesTo(self.free, misc.UNIT_AUTO, True), misc.ConvertBytesTo(self.total, misc.UNIT_AUTO, True), self.typeString)
def ShowDetail(self, elem): dic = {} dic[_("名前")] = elem.basename dic[_("パス")] = elem.fullpath if elem.__class__ == browsableObjects.File or elem.__class__ == browsableObjects.Stream: dic[_("サイズ")] = misc.ConvertBytesTo(elem.size, misc.UNIT_AUTO, True) dic[_("サイズ(バイト)")] = elem.size elif elem.__class__ == browsableObjects.Folder: if elem.size >= 0: dic[_("サイズ")] = misc.ConvertBytesTo(elem.size, misc.UNIT_AUTO, True) dic[_("サイズ(バイト)")] = elem.size else: size = misc.GetDirectorySize(elem.fullpath) if size >= 0: dic[_("サイズ")] = misc.ConvertBytesTo( size, misc.UNIT_AUTO, True) dic[_("サイズ(バイト)")] = size else: dic[_("サイズ")] = _("不明") dic[_("サイズ(バイト)")] = _("不明") if isinstance(elem, browsableObjects.File): dic[_("作成日時")] = elem.creationDate.strftime( "%Y/%m/%d(%a) %H:%M:%S") dic[_("更新日時")] = elem.modDate.strftime("%Y/%m/%d(%a) %H:%M:%S") dic[_("属性")] = elem.longAttributesString dic[_("種類")] = elem.typeString if not elem.shortName == "": dic[_("短い名前")] = elem.shortName else: dic[_("短い名前")] = _("なし") if elem.__class__ == browsableObjects.Drive: if elem.free >= 0: dic[_("フォーマット")] = fileSystemManager.GetFileSystemObject( elem.letter) dic[_("空き容量")] = misc.ConvertBytesTo(elem.free, misc.UNIT_AUTO, True) else: dic[_("フォーマット")] = _("未挿入") if elem.total > 0: dic[_("空き容量")] += " (" + str( elem.free * 100 // elem.total) + "%)" if elem.free >= 0: dic[_("総容量")] = misc.ConvertBytesTo(elem.total, misc.UNIT_AUTO, True) dic[_("種類")] = elem.typeString if elem.__class__ == browsableObjects.NetworkResource: dic[_("IPアドレス")] = elem.address d = views.objectDetail.Dialog() d.Initialize(dic) d.Show() d.Destroy() return
def GetListTuple(self): """表示に必要なタプルを返す。""" return (self.basename, misc.ConvertBytesTo(self.size, misc.UNIT_AUTO, True), self.relpath, misc.PTime2string(self.modDate), self.attributesString, self.typeString)
def GetListTuple(self): """表示に必要なタプルを返す。フォルダなのでサイズ不明(-1)の場合があり、この場合は <dir> にする。""" if self.size < 0: return (self.basename, "<dir>", misc.PTime2string(self.modDate), self.attributesString, self.typeString) else: return (self.basename, misc.ConvertBytesTo(self.size, misc.UNIT_AUTO, True), misc.PTime2string(self.modDate), self.attributesString, self.typeString)
def GetListTuple(self): """表示に必要なタプルを返す。フォルダなのでサイズ不明(-1)の場合があり、この場合は <dir> にする。""" if self.size == constants.DIR_SIZE_CALCURATING: sizeString = "<計算中>" elif self.size == constants.DIR_SIZE_CHECK_FAILED: sizeString = "<取得失敗>" elif self.size < 0: sizeString = "<dir>" else: sizeString = misc.ConvertBytesTo(self.size, misc.UNIT_AUTO, True) return (self.basename, sizeString, misc.PTime2string(self.modDate), self.attributesString, self.typeString)
def _dirCalc_receive(self, results, taskState): """DirCalc の結果を受ける。""" for elem in results: self.listObject.GetElement(elem[0]).size = elem[1] if elem[1] >= 0: self.hListCtrl.SetItem(index=elem[0], column=1, label=misc.ConvertBytesTo( elem[1], misc.UNIT_AUTO, True)) else: self.hListCtrl.SetItem(index=elem[0], column=1, label="<取得失敗>") #end for self.background_tasks.remove(taskState)
def setDirCalcResult(self, results, taskState): result = results[0][1] # 2つ以上来ることはなく、パス文字列は不要 if result[0] >= 0: self.calcuratingFields[0].SetValue( misc.ConvertBytesTo(result[0], misc.UNIT_AUTO, True)) self.calcuratingFields[1].SetValue(str(result[0])) self.calcuratingFields[2].SetValue( _("ファイル数: %d サブディレクトリ数: %d") % (result[1], result[2])) else: self.calcuratingFields[0].SetValue(_("不明")) self.calcuratingFields[1].SetValue(_("不明")) self.calcuratingFields[2].SetValue(_("不明")) self.task = None
def PastOperation(self, target, dest, op=clipboard.COPY): op_str = _("複写") if op == clipboard.COPY else _("移動") # 重複を排除 # target=set(target) # 自身のサブフォルダへの貼り付けはできない errors = [] for it in target: i = it[0] if i in dest or os.path.dirname(i) == dest: errors.append(i) # end サブディレクトリ、あるいは、同じディレクトリへのコピー/貼り付け # end 事前チェック if errors: all = "" for i in errors: target.remove((i, i)) if all == "SKIP": continue # end 「以降も同様に処理」で全てスキップ if all == "RENAME": nn = self.getNewNameForPast(os.path.dirname(i), os.path.basename(i)) if nn == "": continue # end 名前が入力されなかったらスキップ扱い target.append((i, os.path.join(dest, nn))) continue # 「以降も同様に処理」ででリネーム info = [ (_("項目"), _("パス")), (_("%s先") % op_str, dest), (os.path.basename(i), i) ] d = views.OperationSelecter.Dialog( _("自身のサブディレクトリへの%sはできません。") % op_str, info, views.OperationSelecter.GetMethod("OWN_SUB_DIR"), False) d.Initialize() d.Show() ret = d.GetValue() if ret["all"]: all = ret["response"] # end 「以降も同様に処理」が指定されていたら、そのレスポンスを覚える if ret["response"] == "SKIP": continue elif ret["response"] == "RENAME": nn = self.getNewNameForPast(os.path.dirname(i), os.path.basename(i)) if nn == "": continue # end 名前が入力されなかったらスキップ扱い target.append((i, os.path.join(dest, nn))) # end rename # エラーの問い合わせ # end エラーがある場合 # この時点でtargetが0ならおわり if len(target) == 0: return # ユーザに確認表示 if len(target) == 1: msg = _("%(file)s\nこのファイルを、 %(dest)s に%(op)sしますか?") % { 'file': target[0][0], 'dest': target[0][1], 'op': op_str} else: msg = _("%(num)d 項目を、 %(dest)s に%(op)sしますか?") % {'num': len( target), 'dest': self.listObject.rootDirectory, 'op': op_str} # end メッセージどっちにするか dlg = wx.MessageDialog(None, msg, _("%(op)sの確認") % {'op': op_str}, wx.YES_NO | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_NO: return # fileOperatorに処理依頼 inst = { "operation": "past", "target": target, "to": dest, "copy_move_flag": op} op = fileOperator.FileOperator(inst) ret = op.Execute() # 今はテストで、常にダイアログを表示して処理刷る nav = {"action": "past", "operator": op} globalVars.app.hMainView.Navigate(nav, as_new_tab=True) return # このあとのことは新しいタブに任せる # ここから先は今はリーチしない # 0.5秒待つ time.sleep(0.5) # 状況確認 # TODO:タブに分ける処理 self.log.debug("Start checking confirmation") confs = op.GetConfirmationManager() while(True): confs_list = list(confs.IterateNotResponded()) self.log.debug("%d confirmations." % len(confs_list)) if len(confs_list) == 0: break elem = confs_list[0] e = elem.GetElement() from_path = e.path dest_path = e.destpath from_stat = os.stat(from_path) dest_stat = os.stat(dest_path) info = [ (_("名前"), "test.txt", "", ""), (_("サイズ"), misc.ConvertBytesTo( dest_stat.st_size, misc.UNIT_AUTO, True), "→", misc.ConvertBytesTo( from_stat.st_size, misc.UNIT_AUTO, True)), (_("更新日時"), datetime.datetime.fromtimestamp( dest_stat.st_mtime), "→", datetime.datetime.fromtimestamp( from_stat.st_mtime))] d = views.OperationSelecter.Dialog( _("上書きしますか?"), info, views.OperationSelecter.GetMethod("ALREADY_EXISTS"), False) d.Initialize() d.Show() val = d.GetValue() if val['all'] is True: # 「以降も同様に処理」がオン confs.RespondAll(elem, val['response']) else: # この1件だけ elem.SetResponse(d.GetValue()) # 渓谷に対して、文字列でレスポンスする # end これ以降全てかこれだけか # end while self.log.debug("End checking confirmation.") op.UpdateConfirmation() # これで繁栄する op.Execute() # これでコピーを再実行 if op.CheckSucceeded() == 0 and ret == 0: dialog(_("エラー"), _("%(op)sに失敗しました。" % {'op': op_str})) # end failure self.UpdateFilelist(silence=True)
def PastOperation(self, target, dest, op=clipboard.COPY): op_str = _("複写") if op == clipboard.COPY else _("移動") #重複を排除 #target=set(target) #自身のサブフォルダへの貼り付けはできない errors = [] for i in target: if i in dest: errors.append(i) if errors: info = [(_("項目"), _("パス")), (_("%s先") % op_str, dest)] for i in errors: target.remove(i) info.append((os.path.basename(i), i)) d = views.OperationSelecter.Dialog( _("自身のサブディレクトリへの%sはできません。") % op_str, info, views.OperationSelecter.GetMethod("OWN_SUB_DIR"), False) d.Initialize() d.Show() ret = d.GetValue()["response"] if ret == "CANCEL": return #TODO:同一ディレクトリなら別名を決めさせる #この時点でtargetが0ならおわり if len(target) == 0: return #ユーザに確認表示 if len(target) == 1: msg = _("%(file)s\nこのファイルを、 %(dest)s に%(op)sしますか?") % { 'file': target[0], 'dest': dest, 'op': op_str } else: msg = _("%(num)d 項目を、 %(dest)s に%(op)sしますか?") % { 'num': len(target), 'dest': self.listObject.rootDirectory, 'op': op_str } #end メッセージどっちにするか dlg = wx.MessageDialog(None, msg, _("%(op)sの確認") % {'op': op_str}, wx.YES_NO | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_NO: return #fileOperatorに処理依頼 inst = { "operation": "past", "target": target, "to": dest, 'copy_move_flag': op } op = fileOperator.FileOperator(inst) ret = op.Execute() #0.5秒待つ time.sleep(0.5) #状況確認 #TODO:タブに分ける処理 self.log.debug("Start checking confirmation") confs = op.GetConfirmationManager() while (True): confs_list = list(confs.IterateNotResponded()) self.log.debug("%d confirmations." % len(confs_list)) if len(confs_list) == 0: break elem = confs_list[0] e = elem.GetElement() from_path = e.path dest_path = e.destpath from_stat = os.stat(from_path) dest_stat = os.stat(dest_path) info = [(_("名前"), "test.txt", "", ""), (_("サイズ"), misc.ConvertBytesTo(dest_stat.st_size, misc.UNIT_AUTO, True), "→", misc.ConvertBytesTo(from_stat.st_size, misc.UNIT_AUTO, True)), (_("更新日時"), datetime.datetime.fromtimestamp(dest_stat.st_mtime), "→", datetime.datetime.fromtimestamp(from_stat.st_mtime))] d = views.OperationSelecter.Dialog( _("上書きしますか?"), info, views.OperationSelecter.GetMethod("ALREADY_EXISTS"), False) d.Initialize() d.Show() val = d.GetValue() if val['all'] is True: #「以降も同様に処理」がオン confs.RespondAll(elem, val['response']) else: #この1件だけ elem.SetResponse(d.GetValue()) #渓谷に対して、文字列でレスポンスする #end これ以降全てかこれだけか #end while self.log.debug("End checking confirmation.") op.UpdateConfirmation() #これで繁栄する op.Execute() #これでコピーを再実行 if op.CheckSucceeded() == 0 and ret == 0: dialog(_("エラー"), _("%(op)sに失敗しました。" % {'op': op_str})) #end failure self.UpdateFilelist(silence=True)
def ShowDetail(self, elem): d = views.objectDetail.Dialog() d.Initialize() d.add(_("名前"), elem.basename) d.add(_("パス"), elem.fullpath) if isinstance(elem, browsableObjects.File) or isinstance(elem, browsableObjects.Stream): if elem.size >= 0: d.add(_("サイズ"), misc.ConvertBytesTo(elem.size, misc.UNIT_AUTO, True)) d.add(_("サイズ(バイト)"), elem.size) if isinstance(elem, browsableObjects.Folder): d.add(_("内容"), _("ファイル数: %d サブディレクトリ数: %d") % (elem.fileCount, elem.dirCount)) elif isinstance(elem, browsableObjects.Folder): d.add(_("サイズ"), d.CALCURATING) d.add(_("サイズ(バイト)"), d.CALCURATING) d.add(_("内容"), d.CALCURATING) param = {'lst': [(0, elem.fullpath)], 'callback': d.setDirCalcResult} d.setTask(workerThreads.RegisterTask(workerThreadTasks.DirCalc, param)) if isinstance(elem, browsableObjects.File): d.add(_("作成日時"), elem.creationDate.strftime("%Y/%m/%d(%a) %H:%M:%S")) d.add(_("更新日時"), elem.modDate.strftime("%Y/%m/%d(%a) %H:%M:%S")) d.add(_("属性"), elem.longAttributesString) d.add(_("種類"), elem.typeString) if not elem.shortName == "": d.add(_("短い名前"), elem.shortName) else: d.add(_("短い名前"), _("なし")) h = win32file.CreateFile( elem.fullpath, 0, win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE, None, win32file.OPEN_EXISTING, win32file.FILE_FLAG_BACKUP_SEMANTICS, # これがないとディレクトリを開けない 0) info = win32file.GetFileInformationByHandleEx(h, win32file.FileStandardInfo) if info: d.add(_("消費ディスク領域"), misc.ConvertBytesTo(info["AllocationSize"], misc.UNIT_AUTO, True) + " (" + str(info["AllocationSize"]) + " bytes)") tmp = "" if info["DeletePending"]: tmp += _("削除予約済 ") if info["NumberOfLinks"] > 1: tmp += _("ハードリンクにより他の %d 箇所から参照" % (info["NumberOfLinks"] - 1)) if tmp == "": tmp = _("なし") d.add(_("追加情報"), tmp) if isinstance(elem, browsableObjects.Drive): if elem.free >= 0: d.add(_("フォーマット"), fileSystemManager.GetFileSystemObject(elem.letter)) if elem.total > 0: d.add(_("空き容量"), "%s (%s%%)" % (misc.ConvertBytesTo(elem.free, misc.UNIT_AUTO, True), elem.free * 100 // elem.total)) else: d.add(_("空き容量"), misc.ConvertBytesTo(elem.free, misc.UNIT_AUTO, True)) d.add(_("総容量"), misc.ConvertBytesTo(elem.total, misc.UNIT_AUTO, True)) else: d.add(_("フォーマット"), _("未挿入")) d.add(_("種類"), elem.typeString) if isinstance(elem, browsableObjects.NetworkResource) and elem.address != "": d.add(_("IPアドレス"), elem.address) d.Show() return
def GetListTuple(self): """表示に必要なタプルを返す。""" return (self.basename, misc.ConvertBytesTo(self.size, misc.UNIT_AUTO, True))