add ability to customize separator when importing, fix tab order

This commit is contained in:
Damien Elmes 2009-06-26 07:12:57 +09:00
parent f6066c7ffd
commit edcad222d0
2 changed files with 112 additions and 57 deletions

View file

@ -6,6 +6,7 @@ from PyQt4.QtGui import *
from PyQt4.QtCore import * from PyQt4.QtCore import *
import anki import anki
import anki.importing as importing import anki.importing as importing
from ankiqt.ui.utils import getOnlyText
from anki.errors import * from anki.errors import *
import ankiqt.forms import ankiqt.forms
from ankiqt import ui from ankiqt import ui
@ -59,6 +60,8 @@ class ImportDialog(QDialog):
self.tags = ui.tagedit.TagEdit(parent) self.tags = ui.tagedit.TagEdit(parent)
self.tags.setDeck(parent.deck) self.tags.setDeck(parent.deck)
self.dialog.topGrid.addWidget(self.tags,0,1,1,1) self.dialog.topGrid.addWidget(self.tags,0,1,1,1)
self.setTabOrder(self.tags, self.dialog.tagDuplicates)
self.setTabOrder(self.dialog.tagDuplicates, self.dialog.autoDetect)
self.setupMappingFrame() self.setupMappingFrame()
self.setupOptions() self.setupOptions()
self.getFile() self.getFile()
@ -66,6 +69,9 @@ class ImportDialog(QDialog):
return return
self.dialog.groupBox.setTitle(os.path.basename(self.file)) self.dialog.groupBox.setTitle(os.path.basename(self.file))
self.maybePreview() self.maybePreview()
self.connect(self.dialog.autoDetect, SIGNAL("clicked()"),
self.onDelimiter)
self.updateDelimiterButtonText()
self.exec_() self.exec_()
def setupOptions(self): def setupOptions(self):
@ -101,6 +107,7 @@ class ImportDialog(QDialog):
else: else:
self.modelChooser.hide() self.modelChooser.hide()
self.dialog.tagDuplicates.hide() self.dialog.tagDuplicates.hide()
self.dialog.autoDetect.setShown(self.importerFunc.needDelimiter)
def maybePreview(self): def maybePreview(self):
if self.file and self.model: if self.file and self.model:
@ -113,6 +120,43 @@ class ImportDialog(QDialog):
self.model = model self.model = model
self.maybePreview() self.maybePreview()
def onDelimiter(self):
str = getOnlyText(_("""\
By default, Anki will detect the character between fields, such as
a tab, comma, and so on. If Anki is detecting the character incorrectly,
you can enter it here. Use \\t to represent tab."""),
self, help="FileImport")
str = str.replace("\\t", "\t")
str = str.encode("ascii")
self.hideMapping()
def updateDelim():
self.importer.delimiter = str
self.showMapping(hook=updateDelim)
self.updateDelimiterButtonText()
def updateDelimiterButtonText(self):
if self.importer.delimiter:
d = self.importer.delimiter
else:
d = self.importer.dialect.delimiter
if d == "\t":
d = "Tab"
elif d == ",":
d = "Comma"
elif d == " ":
d = "Space"
elif d == ";":
d = "Semicolon"
elif d == ":":
d = "Colon"
else:
d = `d`
if self.importer.delimiter:
txt = _("Manual &delimiter: %s") % d
else:
txt = _("Auto-detected &delimiter: %s") % d
self.dialog.autoDetect.setText(txt)
def doImport(self): def doImport(self):
self.dialog.status.setText(_("Importing...")) self.dialog.status.setText(_("Importing..."))
t = time.time() t = time.time()
@ -163,10 +207,12 @@ class ImportDialog(QDialog):
def hideMapping(self): def hideMapping(self):
self.dialog.mappingGroup.hide() self.dialog.mappingGroup.hide()
def showMapping(self, keepMapping=False): def showMapping(self, keepMapping=False, hook=None):
# first, check that we can read the file # first, check that we can read the file
try: try:
self.importer = self.importerFunc(self.parent.deck, self.file) self.importer = self.importerFunc(self.parent.deck, self.file)
if hook:
hook()
if not keepMapping: if not keepMapping:
self.mapping = self.importer.mapping self.mapping = self.importer.mapping
except ImportFormatError, e: except ImportFormatError, e:
@ -209,6 +255,7 @@ class ImportDialog(QDialog):
self.grid.addWidget(button, num, 2) self.grid.addWidget(button, num, 2)
self.connect(button, SIGNAL("clicked()"), self.connect(button, SIGNAL("clicked()"),
lambda s=self,n=num: s.changeMappingNum(n)) lambda s=self,n=num: s.changeMappingNum(n))
self.tags.setFocus()
def changeMappingNum(self, n): def changeMappingNum(self, n):
f = ChangeMap(self.parent, self.model, self.mapping[n]).getField() f = ChangeMap(self.parent, self.model, self.mapping[n]).getField()
@ -222,6 +269,5 @@ class ImportDialog(QDialog):
self.showMapping(keepMapping=True) self.showMapping(keepMapping=True)
def reject(self): def reject(self):
print "deinit"
self.modelChooser.deinit() self.modelChooser.deinit()
QDialog.reject(self) QDialog.reject(self)

View file

@ -1,105 +1,113 @@
<ui version="4.0" > <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ImportDialog</class> <class>ImportDialog</class>
<widget class="QDialog" name="ImportDialog" > <widget class="QDialog" name="ImportDialog">
<property name="geometry" > <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>477</width> <width>440</width>
<height>484</height> <height>513</height>
</rect> </rect>
</property> </property>
<property name="windowTitle" > <property name="windowTitle">
<string>Import</string> <string>Import</string>
</property> </property>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<item> <item>
<widget class="QGroupBox" name="groupBox" > <widget class="QGroupBox" name="groupBox">
<property name="title" > <property name="title">
<string>Import options</string> <string>Import options</string>
</property> </property>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="margin" > <property name="margin">
<number>9</number> <number>9</number>
</property> </property>
<item> <item>
<layout class="QGridLayout" name="topGrid" > <layout class="QGridLayout" name="topGrid">
<property name="margin" > <property name="margin">
<number>0</number> <number>0</number>
</property> </property>
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<item row="0" column="0" > <item row="0" column="0">
<widget class="QLabel" name="label_4" > <widget class="QLabel" name="label_4">
<property name="text" > <property name="text">
<string>&lt;b>Tags to append&lt;/b>:</string> <string>&lt;b&gt;Tags to append&lt;/b&gt;:</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="tagDuplicates" > <widget class="QCheckBox" name="tagDuplicates">
<property name="text" > <property name="text">
<string>Tag facts with duplicate fields instead of deleting</string> <string>Tag facts with duplicate fields instead of deleting</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QWidget" native="1" name="modelArea" /> <widget class="QPushButton" name="autoDetect">
<property name="text">
<string>Auto-detect file format</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="modelArea" native="true"/>
</item> </item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="mappingGroup" > <widget class="QGroupBox" name="mappingGroup">
<property name="sizePolicy" > <property name="sizePolicy">
<sizepolicy vsizetype="Preferred" hsizetype="Expanding" > <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="title" > <property name="title">
<string>Field mapping</string> <string>Field mapping</string>
</property> </property>
<layout class="QHBoxLayout" > <layout class="QHBoxLayout">
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="margin" > <property name="margin">
<number>9</number> <number>9</number>
</property> </property>
<item> <item>
<layout class="QGridLayout" > <layout class="QGridLayout">
<property name="margin" > <property name="margin">
<number>0</number> <number>0</number>
</property> </property>
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<item row="0" column="2" > <item row="0" column="2">
<widget class="QPushButton" name="importButton" > <widget class="QPushButton" name="importButton">
<property name="text" > <property name="text">
<string>&amp;Import</string> <string>&amp;Import</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0" > <item row="0" column="0">
<widget class="QFrame" name="mappingArea" > <widget class="QFrame" name="mappingArea">
<property name="sizePolicy" > <property name="sizePolicy">
<sizepolicy vsizetype="Preferred" hsizetype="Expanding" > <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="frameShape" > <property name="frameShape">
<enum>QFrame::StyledPanel</enum> <enum>QFrame::StyledPanel</enum>
</property> </property>
<property name="frameShadow" > <property name="frameShadow">
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
</widget> </widget>
@ -110,20 +118,20 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_2" > <widget class="QGroupBox" name="groupBox_2">
<property name="title" > <property name="title">
<string>Status</string> <string>Status</string>
</property> </property>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<property name="spacing" > <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<property name="margin" > <property name="margin">
<number>9</number> <number>9</number>
</property> </property>
<item> <item>
<widget class="QTextEdit" name="status" > <widget class="QTextEdit" name="status">
<property name="readOnly" > <property name="readOnly">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
@ -132,11 +140,11 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QDialogButtonBox" name="buttonBox" > <widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation" > <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="standardButtons" > <property name="standardButtons">
<set>QDialogButtonBox::Close</set> <set>QDialogButtonBox::Close</set>
</property> </property>
</widget> </widget>
@ -145,6 +153,7 @@
</widget> </widget>
<tabstops> <tabstops>
<tabstop>tagDuplicates</tabstop> <tabstop>tagDuplicates</tabstop>
<tabstop>autoDetect</tabstop>
<tabstop>importButton</tabstop> <tabstop>importButton</tabstop>
<tabstop>status</tabstop> <tabstop>status</tabstop>
<tabstop>buttonBox</tabstop> <tabstop>buttonBox</tabstop>
@ -157,11 +166,11 @@
<receiver>ImportDialog</receiver> <receiver>ImportDialog</receiver>
<slot>accept()</slot> <slot>accept()</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel">
<x>248</x> <x>248</x>
<y>254</y> <y>254</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel">
<x>157</x> <x>157</x>
<y>274</y> <y>274</y>
</hint> </hint>
@ -173,11 +182,11 @@
<receiver>ImportDialog</receiver> <receiver>ImportDialog</receiver>
<slot>reject()</slot> <slot>reject()</slot>
<hints> <hints>
<hint type="sourcelabel" > <hint type="sourcelabel">
<x>316</x> <x>316</x>
<y>260</y> <y>260</y>
</hint> </hint>
<hint type="destinationlabel" > <hint type="destinationlabel">
<x>286</x> <x>286</x>
<y>274</y> <y>274</y>
</hint> </hint>