diff --git a/src/gui/.gitignore b/src/gui/.gitignore
new file mode 100644
index 0000000..a01ee28
--- /dev/null
+++ b/src/gui/.gitignore
@@ -0,0 +1 @@
+.*.swp
diff --git a/src/gui/HACKING.txt b/src/gui/HACKING.txt
new file mode 100644
index 0000000..ca87184
--- /dev/null
+++ b/src/gui/HACKING.txt
@@ -0,0 +1,12 @@
+### Code organization:
+* tomblib: a library that wraps on tomb. Meant to be used by various scripts, and every UI
+* qt / wx / whatever: directory for different gui implementations
+
+### QT project:
+
+status: only create wizard
+the graphical part is done through create.ui, which can be edited by designer
+
+The UI should be (if possible) completely autocontained in this .ui file, and no code (or very few) should be added to make it work.
+* ATM, some code has been added for the "password don't match" part.
+* Some code need to be added to make the filedialog work
diff --git a/src/gui/qt/create.py b/src/gui/qt/create.py
new file mode 100755
index 0000000..a3f1265
--- /dev/null
+++ b/src/gui/qt/create.py
@@ -0,0 +1,29 @@
+import sys, os
+from PyQt4.QtGui import QApplication, QWizard
+from PyQt4 import QtCore
+from ui_create import Ui_Wizard
+
+parentdir = sys.path[0].split(os.sep)[:-1]
+sys.path.append(os.sep.join(parentdir))
+from tomblib import wrapper
+
+app = QApplication(sys.argv)
+window = QWizard()
+ui = Ui_Wizard()
+ui.setupUi(window)
+
+def create_tomb(*args, **kwargs):
+ print 'creating'
+ wrapper.Tomb.create(1,2,3)
+ print 'created!'
+
+try:
+ _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+ _fromUtf8 = lambda s: s
+QtCore.QObject.connect(window, QtCore.SIGNAL(_fromUtf8('finished(int)')), create_tomb)
+
+window.show()
+sys.exit(app.exec_())
+
+
diff --git a/src/gui/qt/create.ui b/src/gui/qt/create.ui
new file mode 100755
index 0000000..418a68d
--- /dev/null
+++ b/src/gui/qt/create.ui
@@ -0,0 +1,481 @@
+
+
It will be fun!", None, QtGui.QApplication.UnicodeUTF8))
+ self.label.setTextFormat(QtCore.Qt.RichText)
+ self.label.setWordWrap(True)
+ self.label.setObjectName(_fromUtf8("label"))
+ self.verticalLayout.addWidget(self.label)
+ Wizard.addPage(self.wizardPage_intro)
+ self.wizardPage_tomb_size = QtGui.QWizardPage()
+ self.wizardPage_tomb_size.setObjectName(_fromUtf8("wizardPage_tomb_size"))
+ self.verticalLayout_2 = QtGui.QVBoxLayout(self.wizardPage_tomb_size)
+ self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
+ self.label_2 = QtGui.QLabel(self.wizardPage_tomb_size)
+ self.label_2.setText(QtGui.QApplication.translate("Wizard", "Please enter tomb size. Digging the tomb will require some time: usually, one minute per GB, but your mileage may vary.
Keep in mind that resizing it in the future is still NOT implemented", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_2.setWordWrap(True)
+ self.label_2.setObjectName(_fromUtf8("label_2"))
+ self.verticalLayout_2.addWidget(self.label_2)
+ self.horizontalLayout = QtGui.QHBoxLayout()
+ self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
+ self.label_3 = QtGui.QLabel(self.wizardPage_tomb_size)
+ self.label_3.setText(QtGui.QApplication.translate("Wizard", "Enter tomb size, in MB. 1GB=1000MB)", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_3.setObjectName(_fromUtf8("label_3"))
+ self.horizontalLayout.addWidget(self.label_3)
+ self.spinBox = QtGui.QSpinBox(self.wizardPage_tomb_size)
+ self.spinBox.setMaximum(100000)
+ self.spinBox.setProperty("value", 100)
+ self.spinBox.setObjectName(_fromUtf8("spinBox"))
+ self.horizontalLayout.addWidget(self.spinBox)
+ self.verticalLayout_2.addLayout(self.horizontalLayout)
+ Wizard.addPage(self.wizardPage_tomb_size)
+ self.wizardPage_tomb_location = QtGui.QWizardPage()
+ self.wizardPage_tomb_location.setObjectName(_fromUtf8("wizardPage_tomb_location"))
+ self.verticalLayout_3 = QtGui.QVBoxLayout(self.wizardPage_tomb_location)
+ self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
+ self.label_4 = QtGui.QLabel(self.wizardPage_tomb_location)
+ self.label_4.setText(QtGui.QApplication.translate("Wizard", "Where do you want your tomb to be digged?", None, QtGui.QApplication.UnicodeUTF8))
+ self.label_4.setWordWrap(True)
+ self.label_4.setObjectName(_fromUtf8("label_4"))
+ self.verticalLayout_3.addWidget(self.label_4)
+ self.horizontalLayout_2 = QtGui.QHBoxLayout()
+ self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
+ self.lineEdit = QtGui.QLineEdit(self.wizardPage_tomb_location)
+ self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
+ self.horizontalLayout_2.addWidget(self.lineEdit)
+ self.pushButton = QtGui.QPushButton(self.wizardPage_tomb_location)
+ self.pushButton.setText(QtGui.QApplication.translate("Wizard", "Open file", None, QtGui.QApplication.UnicodeUTF8))
+ self.pushButton.setObjectName(_fromUtf8("pushButton"))
+ self.horizontalLayout_2.addWidget(self.pushButton)
+ self.verticalLayout_3.addLayout(self.horizontalLayout_2)
+ Wizard.addPage(self.wizardPage_tomb_location)
+ self.wizardPage_key_location = QtGui.QWizardPage()
+ self.wizardPage_key_location.setTitle(QtGui.QApplication.translate("Wizard", "Key creation", None, QtGui.QApplication.UnicodeUTF8))
+ self.wizardPage_key_location.setSubTitle(QtGui.QApplication.translate("Wizard", "Choose the location for your key", None, QtGui.QApplication.UnicodeUTF8))
+ self.wizardPage_key_location.setObjectName(_fromUtf8("wizardPage_key_location"))
+ self.verticalLayout_6 = QtGui.QVBoxLayout(self.wizardPage_key_location)
+ self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6"))
+ self.label_5 = QtGui.QLabel(self.wizardPage_key_location)
+ self.label_5.setText(QtGui.QApplication.translate("Wizard", "\n"
+"
Now, you have to decide where to put the key for your tomb
You should not leave your key at the door, as this will lower security A LOT
Also, the keyfile is very small (less than a KB), so disk space is not an issue
", None, QtGui.QApplication.UnicodeUTF8)) + self.label_5.setTextFormat(QtCore.Qt.RichText) + self.label_5.setWordWrap(True) + self.label_5.setObjectName(_fromUtf8("label_5")) + self.verticalLayout_6.addWidget(self.label_5) + self.verticalLayout_5 = QtGui.QVBoxLayout() + self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) + self.verticalLayout_4 = QtGui.QVBoxLayout() + self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) + self.radioButton = QtGui.QRadioButton(self.wizardPage_key_location) + self.radioButton.setText(QtGui.QApplication.translate("Wizard", "On a USB pen (best security)", None, QtGui.QApplication.UnicodeUTF8)) + self.radioButton.setChecked(True) + self.radioButton.setObjectName(_fromUtf8("radioButton")) + self.verticalLayout_4.addWidget(self.radioButton) + self.horizontalLayout_4 = QtGui.QHBoxLayout() + self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) + spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_4.addItem(spacerItem) + self.label_6 = QtGui.QLabel(self.wizardPage_key_location) + self.label_6.setText(QtGui.QApplication.translate("Wizard", "If you choose to do so, do not insert it NOW. Do it when you are asked to do so", None, QtGui.QApplication.UnicodeUTF8)) + self.label_6.setObjectName(_fromUtf8("label_6")) + self.horizontalLayout_4.addWidget(self.label_6) + self.verticalLayout_4.addLayout(self.horizontalLayout_4) + self.verticalLayout_5.addLayout(self.verticalLayout_4) + self.radioButton_2 = QtGui.QRadioButton(self.wizardPage_key_location) + self.radioButton_2.setToolTip(QtGui.QApplication.translate("Wizard", "\n" +"\n" +"It will be created as a regular file in the same directory of your tomb.
\n" +"It is much easier to use, but also much more insecure: all your security will be guaranteed by your password. If you really want to do this, choose a strong password (lot of random/non-dictionary words, spaces, numbers, odd characters)
", None, QtGui.QApplication.UnicodeUTF8)) + self.radioButton_2.setText(QtGui.QApplication.translate("Wizard", "Near to the tomb itself (this is BAD)", None, QtGui.QApplication.UnicodeUTF8)) + self.radioButton_2.setObjectName(_fromUtf8("radioButton_2")) + self.verticalLayout_5.addWidget(self.radioButton_2) + self.radioButton_3 = QtGui.QRadioButton(self.wizardPage_key_location) + self.radioButton_3.setText(QtGui.QApplication.translate("Wizard", "Specify location", None, QtGui.QApplication.UnicodeUTF8)) + self.radioButton_3.setObjectName(_fromUtf8("radioButton_3")) + self.verticalLayout_5.addWidget(self.radioButton_3) + self.verticalLayout_6.addLayout(self.verticalLayout_5) + self.horizontalLayout_3 = QtGui.QHBoxLayout() + self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) + spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem1) + self.lineEdit_2 = QtGui.QLineEdit(self.wizardPage_key_location) + self.lineEdit_2.setEnabled(False) + self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2")) + self.horizontalLayout_3.addWidget(self.lineEdit_2) + self.pushButton_2 = QtGui.QPushButton(self.wizardPage_key_location) + self.pushButton_2.setEnabled(False) + self.pushButton_2.setText(QtGui.QApplication.translate("Wizard", "Choose location", None, QtGui.QApplication.UnicodeUTF8)) + self.pushButton_2.setObjectName(_fromUtf8("pushButton_2")) + self.horizontalLayout_3.addWidget(self.pushButton_2) + self.verticalLayout_6.addLayout(self.horizontalLayout_3) + self.label_11 = QtGui.QLabel(self.wizardPage_key_location) + self.label_11.setText(QtGui.QApplication.translate("Wizard", "\n" +"\n" +"Help: the key file is very small, so disk usage is not an issue
", None, QtGui.QApplication.UnicodeUTF8)) + self.label_11.setWordWrap(True) + self.label_11.setObjectName(_fromUtf8("label_11")) + self.verticalLayout_6.addWidget(self.label_11) + Wizard.addPage(self.wizardPage_key_location) + self.wizardPage_pass = WizardPage_pass() + self.wizardPage_pass.setAutoFillBackground(False) + self.wizardPage_pass.setTitle(QtGui.QApplication.translate("Wizard", "Key", None, QtGui.QApplication.UnicodeUTF8)) + self.wizardPage_pass.setSubTitle(QtGui.QApplication.translate("Wizard", "Password", None, QtGui.QApplication.UnicodeUTF8)) + self.wizardPage_pass.setObjectName(_fromUtf8("wizardPage_pass")) + self.verticalLayout_7 = QtGui.QVBoxLayout(self.wizardPage_pass) + self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7")) + self.label_7 = QtGui.QLabel(self.wizardPage_pass) + self.label_7.setText(QtGui.QApplication.translate("Wizard", "Choose a strong password now", None, QtGui.QApplication.UnicodeUTF8)) + self.label_7.setObjectName(_fromUtf8("label_7")) + self.verticalLayout_7.addWidget(self.label_7) + self.formLayout = QtGui.QFormLayout() + self.formLayout.setObjectName(_fromUtf8("formLayout")) + self.label_8 = QtGui.QLabel(self.wizardPage_pass) + self.label_8.setText(QtGui.QApplication.translate("Wizard", "Password", None, QtGui.QApplication.UnicodeUTF8)) + self.label_8.setObjectName(_fromUtf8("label_8")) + self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label_8) + self.lineEdit_pass = QtGui.QLineEdit(self.wizardPage_pass) + self.lineEdit_pass.setEchoMode(QtGui.QLineEdit.Password) + self.lineEdit_pass.setObjectName(_fromUtf8("lineEdit_pass")) + self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.lineEdit_pass) + self.label_9 = QtGui.QLabel(self.wizardPage_pass) + self.label_9.setText(QtGui.QApplication.translate("Wizard", "Password (again, for confirmation)", None, QtGui.QApplication.UnicodeUTF8)) + self.label_9.setObjectName(_fromUtf8("label_9")) + self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.label_9) + self.lineEdit_pass_again = QtGui.QLineEdit(self.wizardPage_pass) + self.lineEdit_pass_again.setEchoMode(QtGui.QLineEdit.Password) + self.lineEdit_pass_again.setObjectName(_fromUtf8("lineEdit_pass_again")) + self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.lineEdit_pass_again) + self.verticalLayout_7.addLayout(self.formLayout) + self.label_pwd_match = QtGui.QLabel(self.wizardPage_pass) + self.label_pwd_match.setText(QtGui.QApplication.translate("Wizard", "\n" +"\n" +"Warning: password doesn\'t match
", None, QtGui.QApplication.UnicodeUTF8)) + self.label_pwd_match.setObjectName(_fromUtf8("label_pwd_match")) + self.verticalLayout_7.addWidget(self.label_pwd_match) + Wizard.addPage(self.wizardPage_pass) + self.wizardPage_end = QtGui.QWizardPage() + self.wizardPage_end.setObjectName(_fromUtf8("wizardPage_end")) + self.verticalLayout_8 = QtGui.QVBoxLayout(self.wizardPage_end) + self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8")) + self.label_10 = QtGui.QLabel(self.wizardPage_end) + self.label_10.setText(QtGui.QApplication.translate("Wizard", "You successfully created the tomb!", None, QtGui.QApplication.UnicodeUTF8)) + self.label_10.setObjectName(_fromUtf8("label_10")) + self.verticalLayout_8.addWidget(self.label_10) + self.checkBox = QtGui.QCheckBox(self.wizardPage_end) + self.checkBox.setText(QtGui.QApplication.translate("Wizard", "Open the just-created tomb NOW!", None, QtGui.QApplication.UnicodeUTF8)) + self.checkBox.setChecked(True) + self.checkBox.setTristate(False) + self.checkBox.setObjectName(_fromUtf8("checkBox")) + self.verticalLayout_8.addWidget(self.checkBox) + Wizard.addPage(self.wizardPage_end) + self.label_3.setBuddy(self.spinBox) + self.label_4.setBuddy(self.lineEdit) + self.label_8.setBuddy(self.lineEdit_pass) + self.label_9.setBuddy(self.lineEdit_pass_again) + + self.retranslateUi(Wizard) + QtCore.QObject.connect(self.radioButton_3, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.lineEdit_2.setEnabled) + QtCore.QObject.connect(self.radioButton_3, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.pushButton_2.setEnabled) + QtCore.QObject.connect(Wizard, QtCore.SIGNAL(_fromUtf8("currentIdChanged(int)")), self.label_11.hide) + QtCore.QObject.connect(Wizard, QtCore.SIGNAL(_fromUtf8("helpRequested()")), self.label_11.show) + QtCore.QObject.connect(self.lineEdit_pass, QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.wizardPage_pass.check_password_match) + QtCore.QObject.connect(self.wizardPage_pass, QtCore.SIGNAL(_fromUtf8("password_match(bool)")), self.label_pwd_match.setVisible) + QtCore.QObject.connect(self.lineEdit_pass_again, QtCore.SIGNAL(_fromUtf8("textChanged(QString)")), self.wizardPage_pass.check_password_match) + QtCore.QMetaObject.connectSlotsByName(Wizard) + + def retranslateUi(self, Wizard): + pass + +from wizardpage_pass import WizardPage_pass diff --git a/src/gui/qt/wizardpage_pass.py b/src/gui/qt/wizardpage_pass.py new file mode 100755 index 0000000..f7153f5 --- /dev/null +++ b/src/gui/qt/wizardpage_pass.py @@ -0,0 +1,31 @@ +''' +This module provide some methods to enhance the password page +of the wizard. It could have been avoided, but this way make +it easier to do things from the designer. + +Indeed, it's possible to use password_match(bool) signal +and check_password_match(slot) from the designer. +''' + +from PyQt4.QtGui import QWizardPage +from PyQt4 import QtCore, QtGui +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + _fromUtf8 = lambda s: s +class WizardPage_pass(QWizardPage): + password_match = QtCore.pyqtSignal(bool) + def __init__(self, *args, **kwargs): + QWizardPage.__init__(self, *args, **kwargs) + def _password_match(self): + pass1 = self.findChild(QtGui.QLineEdit, _fromUtf8('lineEdit_pass')).text() + pass2 = self.findChild(QtGui.QLineEdit, _fromUtf8('lineEdit_pass_again')).text() + return pass1 == pass2 + def check_password_match(self): + self.password_match.emit(not self._password_match()) + self.completeChanged.emit() + def isComplete(self): #this will make the "Next" button disabled if password doesn't match + return self._password_match() + + + diff --git a/src/gui/tomblib/.wrapper.py.swp b/src/gui/tomblib/.wrapper.py.swp new file mode 100755 index 0000000..59d5d6d Binary files /dev/null and b/src/gui/tomblib/.wrapper.py.swp differ diff --git a/src/gui/tomblib/__init__.py b/src/gui/tomblib/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/src/gui/tomblib/wrapper.py b/src/gui/tomblib/wrapper.py new file mode 100755 index 0000000..b38bdea --- /dev/null +++ b/src/gui/tomblib/wrapper.py @@ -0,0 +1,5 @@ +class Tomb(object): + @staticmethod + def create(tombpath, size, keypath): + print 'I am not implemented' + raise NotImplementedError