diff --git a/yomichan/reader.py b/yomichan/reader.py index d20a1eb..cdae094 100644 --- a/yomichan/reader.py +++ b/yomichan/reader.py @@ -36,6 +36,7 @@ class MainWindowReader(QtGui.QMainWindow): self.searchPosition = 0 self.searchText = unicode() self.scanPosition = 0 + self.archiveIndex = None def __init__(self, parent=None, languages=None, filename=None, preferences=None, anki=None, closed=None, updated=None): @@ -349,12 +350,17 @@ class MainWindowReader(QtGui.QMainWindow): self.setStatus(u'Loaded file {0}'.format(filename)) self.setWindowTitle(u'Yomichan - {0} ({1})'.format(os.path.split(filename)[1], encoding)) - + def openFileByExtension(self, filename): + self.clearArchiveFiles() if tarfile.is_tarfile(filename): # opening an empty tar file raises ReadError with tarfile.open(filename, 'r:*') as tp: files = [f for f in tp.getnames() if tp.getmember(f).isfile()] + names = [f.decode('utf-8') for f in files] + + self.updateArchiveFiles(filename, names) + if len(files) == 0: content = unicode() elif len(files) == 1: @@ -363,33 +369,48 @@ class MainWindowReader(QtGui.QMainWindow): fp.close() else: # Using index because of encoding difficulties - (index, ok) = self.selectItem([f.decode('utf-8') for f in files]) + (index, ok) = self.selectFileName(names) if ok: - fp = tp.extractfile(files[index - 1]) + fp = tp.extractfile(files[index]) content = fp.read() fp.close() + self.state.archiveIndex = index else: content = unicode() else: + self.state.archiveIndex = None with open(filename, 'rb') as fp: content = fp.read() return content - - def selectItem(self, list): - items = [self.formatQString(i, x) for i, x in enumerate(list)] + + + def selectFileName(self, names): + if self.state.archiveIndex is not None: + return (self.state.archiveIndex, True) + (item, ok) = QtGui.QInputDialog.getItem( - self, - 'Yomichan', - 'Select file to open:', - items, + self, + 'Yomichan', + 'Select file to open:', + self.formatQStringList(names), current = 0, editable=False) - (index, success) = item.split('.').first().toInt() - return (index, ok and success) + (index, success) = self.getItemIndex(item) + return (index - 1, ok and success) + + + def getItemIndex(self, item): + return item.split('.').first().toInt() + + def formatQStringList(self, list): + return [self.formatQString(i, x) for i, x in enumerate(list)] + + def formatQString(self, index, item): return QtCore.QString(str(index + 1) + '. ').append(QtCore.QString(item)) + def closeFile(self): self.setWindowTitle('Yomichan') self.textContent.setPlainText(unicode()) @@ -502,6 +523,28 @@ class MainWindowReader(QtGui.QMainWindow): cursor.setPosition(samplePosStart, QtGui.QTextCursor.MoveAnchor) cursor.setPosition(samplePosStart + lengthSelect, QtGui.QTextCursor.KeepAnchor) self.textContent.setTextCursor(cursor) + + + def clearArchiveFiles(self): + self.menuOpenArchive.clear() + self.menuOpenArchive.setEnabled(False) + + + def updateArchiveFiles(self, filename, names): + self.menuOpenArchive.setEnabled(True) + for name in self.formatQStringList(names): + (index, ok) = self.getItemIndex(name) + if ok: + index = index - 1 + self.menuOpenArchive.addAction(name, (lambda fn=filename, idx=index: self.openFileInArchive(fn, idx))) + else: + self.menuOpenArchive.addAction(name, (lambda fn=filename: self.openFile(fn))) + + + def openFileInArchive(self, filename, index): + self.state.scanPosition = 0 + self.state.archiveIndex = index + self.openFile(filename) def clearRecentFiles(self): diff --git a/yomichan/ui/reader.ui b/yomichan/ui/reader.ui index 42335ee..a9b23ec 100644 --- a/yomichan/ui/reader.ui +++ b/yomichan/ui/reader.ui @@ -47,12 +47,21 @@ &File + + + false + + + Open from &archive + + Open &recent +