mirror of
https://github.com/QRouland/UTPass.git
synced 2024-12-22 18:02:40 +00:00
Various improvement :)
This commit is contained in:
parent
a017136f6a
commit
bd2fa6922e
20
README.md
20
README.md
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
A password management app for Ubuntu Touch aiming to be compatible with [ZX2C4’s pass command line application](https://www.passwordstore.org/) the standard unix password manager.
|
A password management app for Ubuntu Touch aiming to be compatible with [ZX2C4’s pass command line application](https://www.passwordstore.org/) the standard unix password manager.
|
||||||
|
|
||||||
|
|
||||||
# Building
|
# Building
|
||||||
|
|
||||||
* Install [clickable](https://github.com/bhdouglass/clickable).
|
* Install [clickable](https://github.com/bhdouglass/clickable).
|
||||||
@ -11,6 +10,13 @@ A password management app for Ubuntu Touch aiming to be compatible with [ZX2C4
|
|||||||
|
|
||||||
For more options/details see the [clickable documentation](http://clickable.bhdouglass.com/en/latest/index.html)
|
For more options/details see the [clickable documentation](http://clickable.bhdouglass.com/en/latest/index.html)
|
||||||
|
|
||||||
|
## Custom clickable command
|
||||||
|
* ```clickable c ``` : clean third directory and run ```clickable clean```
|
||||||
|
* ```clickable crun ``` : clean third directory and run ```clickable```
|
||||||
|
* ```clickable run``` : run ```clickable --dirty```
|
||||||
|
* ```clickable crund ``` : clean third directory and run ```clickable desktop```
|
||||||
|
* ```clickable rund ``` : run ```clickable desktop --dirty ```
|
||||||
|
|
||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
Any contributions are welcome using the github issue & pull request system.
|
Any contributions are welcome using the github issue & pull request system.
|
||||||
@ -110,8 +116,10 @@ List passwords that match pass-names
|
|||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
# Acknowledge
|
# Useful Links
|
||||||
* Ubports
|
|
||||||
* pass
|
Some useful links related to UTpass development :
|
||||||
* clikable
|
* [Ubports](https://ubports.com/) : Ubuntu Touch Community
|
||||||
* gpgmepp & gpgme & gpg
|
* [ZX2C4’s pass command line application](https://www.passwordstore.org/) : the standard unix password manager.
|
||||||
|
* [Clickable](https://github.com/bhdouglass/clickable) : Compile, build, and deploy Ubuntu Touch click packages
|
||||||
|
* [Gpgme](https://www.gnupg.org/software/gpgme/index.html) : GnuPG Made Easy (GPGME) is a library designed to make access to GnuPG easier for applications
|
||||||
|
@ -2,7 +2,11 @@
|
|||||||
"template": "cmake",
|
"template": "cmake",
|
||||||
"kill": "UTPass",
|
"kill": "UTPass",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"clean_third": "third/clean.sh"
|
"c": "third/clean.sh && clickable clean",
|
||||||
|
"crun": "third/clean.sh && clickable",
|
||||||
|
"run": "clickable --dirty",
|
||||||
|
"crund": "third/clean.sh && clickable desktop",
|
||||||
|
"rund": "clickable desktop --dirty"
|
||||||
},
|
},
|
||||||
"dependencies_build": [
|
"dependencies_build": [
|
||||||
"texinfo",
|
"texinfo",
|
||||||
|
3
main.cpp
3
main.cpp
@ -3,10 +3,11 @@
|
|||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QQuickView>
|
#include <QQuickView>
|
||||||
#include "gpgme++/global.h"
|
#include <QtQml>
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
|
||||||
new QGuiApplication(argc, argv);
|
new QGuiApplication(argc, argv);
|
||||||
QGuiApplication::setApplicationName("utpass.qrouland");
|
QGuiApplication::setApplicationName("utpass.qrouland");
|
||||||
|
|
||||||
|
0
password-store/dir/pass.gpg
Normal file
0
password-store/dir/pass.gpg
Normal file
0
password-store/pass.gpg
Normal file
0
password-store/pass.gpg
Normal file
@ -1,20 +1,59 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QDir>
|
#include <QFile>
|
||||||
#include <QString>
|
|
||||||
#include "pass.h"
|
#include "pass.h"
|
||||||
|
#include "gpgme++/global.h"
|
||||||
|
#include "qgpgme/protocol.h"
|
||||||
|
#include "qgpgme/encryptjob.h"
|
||||||
|
#include "qgpgme/decryptjob.h"
|
||||||
|
#include "qgpgme/keylistjob.h"
|
||||||
|
|
||||||
|
|
||||||
Pass::Pass() {
|
Pass::Pass() {
|
||||||
|
GpgME::initializeLibrary();
|
||||||
|
this->gpgHome = qgetenv("GNUPGHOME");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Pass::cmd_show(const QString path) {
|
QString Pass::decrypt(const QByteArray cipherText) {
|
||||||
QDir dir = QDir(path);
|
/*auto decJob = QGpgME::openpgp()->decryptJob();
|
||||||
if (!dir.exists()) {
|
auto ctx = QGpgME::Job::context(decJob);
|
||||||
qWarning("Path to show not found");
|
|
||||||
return;
|
TestPassphraseProvider provider;
|
||||||
|
ctx->setPassphraseProvider(&provider);
|
||||||
|
ctx->setPinentryMode(Context::PinentryLoopback);
|
||||||
|
|
||||||
|
QByteArray plainText;
|
||||||
|
decJob->exec(cipherText, plainText);
|
||||||
|
|
||||||
|
return QString::fromUtf8(plainText);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Pass::decrypt_file(const QString path) {
|
||||||
|
/*QFile file(path);
|
||||||
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
|
qErrnoWarning("Can't open the File");
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
QByteArray plainText = file.readAll();
|
||||||
|
return Pass::decrypt(plainText);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void Pass::cmd_version() {
|
QByteArray Pass::encrypt(const QString str) {
|
||||||
|
/*auto listjob = QGpgME::openpgp()->keyListJob(false, false, false);
|
||||||
|
std::vector<GpgME::Key> keys;
|
||||||
|
auto keylistresult = listjob->exec(QStringList() << QStringLiteral("alfa@example.net"),
|
||||||
|
false, keys);
|
||||||
|
auto job = QGpgME::openpgp()->encryptJob(/*ASCII Armor *//*true, /* Textmode *//* true);
|
||||||
|
QByteArray cipherText;
|
||||||
|
auto result = job->exec(keys, QStringLiteral("Hello World").toUtf8(), GpgME::Context::AlwaysTrust, cipherText);
|
||||||
|
return cipherText;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Pass::encrypt_file(const QString str, const QString path) {
|
||||||
|
/*QFile file(path);
|
||||||
|
if (!file.open(QIODevice::WriteOnly)) {
|
||||||
|
qErrnoWarning("Can't open the File");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
file.write(Pass::encrypt(str));
|
||||||
|
return true;*/
|
||||||
}
|
}
|
@ -5,13 +5,16 @@
|
|||||||
|
|
||||||
class Pass: public QObject {
|
class Pass: public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
QString gpgHome;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Pass();
|
Pass();
|
||||||
~Pass() override = default;
|
~Pass() override = default;
|
||||||
|
|
||||||
Q_INVOKABLE void cmd_show(QString path) ;
|
Q_INVOKABLE QString decrypt(QByteArray plainText);
|
||||||
Q_INVOKABLE void cmd_version() ;
|
Q_INVOKABLE QString decrypt_file(QString path);
|
||||||
|
Q_INVOKABLE QByteArray encrypt(QString str);
|
||||||
|
Q_INVOKABLE bool encrypt_file(QString str, QString path);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,7 +8,7 @@ class PassPlugin : public QQmlExtensionPlugin {
|
|||||||
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
|
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void registerTypes(const char *uri);
|
void registerTypes(const char *uri) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: utpass.qrouland\n"
|
"Project-Id-Version: utpass.qrouland\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2019-03-13 20:28+0000\n"
|
"POT-Creation-Date: 2019-03-15 16:52+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@ -17,6 +17,31 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=CHARSET\n"
|
"Content-Type: text/plain; charset=CHARSET\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
#: ../qml/Main.qml:26 UTPass.desktop.in.h:1
|
#: ../qml/pages/Settings.qml:8 ../qml/pages/headers/MainHeader.qml:19
|
||||||
|
msgid "Settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../qml/pages/PasswordList.qml:17
|
||||||
|
msgid "Back"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../qml/pages/PasswordList.qml:39
|
||||||
|
msgid "No password found in the current folder"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../qml/pages/Info.qml:9 ../qml/pages/headers/MainHeader.qml:26
|
||||||
|
msgid "Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../qml/pages/Info.qml:43 ../qml/pages/headers/MainHeader.qml:8
|
||||||
|
#: ../qml/pages/headers/StackHeader.qml:7 UTPass.desktop.in.h:1
|
||||||
msgid "UTPass"
|
msgid "UTPass"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../qml/pages/Info.qml:53
|
||||||
|
msgid "Suggest improvements or report a bug"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../qml/pages/headers/MainHeader.qml:15
|
||||||
|
msgid "Search"
|
||||||
|
msgstr ""
|
||||||
|
66
qml/Main.qml
66
qml/Main.qml
@ -1,78 +1,22 @@
|
|||||||
import QtQuick 2.4
|
import QtQuick 2.4
|
||||||
import QtQuick.Layouts 1.1
|
import QtQuick.Layouts 1.1
|
||||||
import Qt.labs.folderlistmodel 2.1
|
|
||||||
import Ubuntu.Components 1.3
|
import Ubuntu.Components 1.3
|
||||||
|
|
||||||
import Pass 1.0
|
import "components"
|
||||||
import "components" as MyComponents
|
|
||||||
|
|
||||||
MainView {
|
MainView {
|
||||||
id: root
|
id: root
|
||||||
objectName: "mainView"
|
objectName: "mainView"
|
||||||
applicationName: "utpass.qrouland"
|
applicationName: "utpass.qrouland"
|
||||||
|
|
||||||
automaticOrientation: true
|
automaticOrientation: true
|
||||||
|
|
||||||
width: units.gu(45)
|
width: units.gu(45)
|
||||||
height: units.gu(75)
|
height: units.gu(75)
|
||||||
|
PageStack {
|
||||||
Page {
|
id: pageStack
|
||||||
id: page
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
header: PageHeader {
|
Component.onCompleted: push(pageStack.push(Qt.resolvedUrl("pages/PasswordList.qml")))
|
||||||
id: header
|
|
||||||
width: parent.width
|
|
||||||
height: units.gu(6)
|
|
||||||
title: i18n.tr("UTPass")
|
|
||||||
flickable: navigation
|
|
||||||
leadingActionBar.height: units.gu(4)
|
|
||||||
leadingActionBar.actions: [
|
|
||||||
Action {
|
|
||||||
id: backAction
|
|
||||||
iconName: "back"
|
|
||||||
text: "Back"
|
|
||||||
visible:false
|
|
||||||
onTriggered: {
|
|
||||||
folderModel.folder = folderModel.parentFolder;
|
|
||||||
if(folderModel.rootFolder === folderModel.folder) {
|
|
||||||
backAction.visible = false;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
Flickable {
|
|
||||||
id: navigation
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: page.width
|
|
||||||
visible: folderModel.count == 0
|
|
||||||
height: units.gu(5)
|
|
||||||
Text {
|
|
||||||
text: "No password found in the current folder"
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ListView {
|
|
||||||
id : listViewDirs
|
|
||||||
anchors.fill: parent
|
|
||||||
spacing: 1
|
|
||||||
model: FolderListModel {
|
|
||||||
id: folderModel
|
|
||||||
nameFilters: ["*.gpg"]
|
|
||||||
rootFolder: "file:password-store"
|
|
||||||
folder: "file:password-store"
|
|
||||||
}
|
|
||||||
delegate: MyComponents.ViewFileDir {
|
|
||||||
id: fileDelegate
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
//Component.onCompleted: Pass.speak()
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import QtQuick 2.4
|
import QtQuick 2.4
|
||||||
import Ubuntu.Components 1.3
|
import Ubuntu.Components 1.3
|
||||||
|
import "../styles"
|
||||||
|
|
||||||
Component {
|
Component {
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: page.width
|
width: parent.width
|
||||||
height: units.gu(5)
|
height: units.gu(5)
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
@ -19,7 +20,7 @@ Component {
|
|||||||
width: units.gu(4)
|
width: units.gu(4)
|
||||||
height: units.gu(4)
|
height: units.gu(4)
|
||||||
name: fileIsDir ? "go-next" : "lock"
|
name: fileIsDir ? "go-next" : "lock"
|
||||||
color: UbuntuColors.orange
|
color: Theme.raisin_black
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
55
qml/components/Link.qml
Normal file
55
qml/components/Link.qml
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import QtQuick 2.4
|
||||||
|
import Ubuntu.Components 1.3
|
||||||
|
import "../styles"
|
||||||
|
|
||||||
|
Item {
|
||||||
|
property string url
|
||||||
|
property string text
|
||||||
|
|
||||||
|
property bool commonBorder : true
|
||||||
|
property int lBorderwidth : 0
|
||||||
|
property int rBorderwidth : 0
|
||||||
|
property int tBorderwidth : 0
|
||||||
|
property int bBorderwidth : 0
|
||||||
|
property int commonBorderWidth : 0
|
||||||
|
property string borderColor : UbuntuColors.warmGrey
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
height: units.gu(6)
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
width: parent.width
|
||||||
|
height: parent.height
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: parent.parent.text
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: units.gu(1)
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
Icon {
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
width: units.gu(4)
|
||||||
|
height: units.gu(4)
|
||||||
|
name: "go-next"
|
||||||
|
color: Theme.raisin_black
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: { Qt.openUrlExternally(parent.parent.url); }
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomBorder {
|
||||||
|
id : cb
|
||||||
|
commonBorder: parent.parent.commonBorder
|
||||||
|
lBorderwidth: parent.parent.lBorderwidth
|
||||||
|
rBorderwidth: parent.parent.rBorderwidth
|
||||||
|
tBorderwidth: parent.parent.tBorderwidth
|
||||||
|
bBorderwidth: parent.parent.bBorderwidth
|
||||||
|
borderColor: parent.parent.borderColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
2
qml/components/qmldir
Normal file
2
qml/components/qmldir
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
FileDir 1.0 FileDir.qml
|
||||||
|
Link 1.0 Link.qml
|
6
qml/models/Manifest.qml
Normal file
6
qml/models/Manifest.qml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
pragma Singleton
|
||||||
|
import QtQuick 2.4
|
||||||
|
|
||||||
|
Item {
|
||||||
|
|
||||||
|
}
|
0
qml/models/Passstore.qml
Normal file
0
qml/models/Passstore.qml
Normal file
2
qml/models/qmldir
Normal file
2
qml/models/qmldir
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
singleton Passtore 1.0 Passtore.qml
|
||||||
|
singleton Manifest 1.0 Manifest.qml
|
59
qml/pages/Info.qml
Normal file
59
qml/pages/Info.qml
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import QtQuick 2.4
|
||||||
|
import Ubuntu.Components 1.3
|
||||||
|
import "headers"
|
||||||
|
import "../components"
|
||||||
|
|
||||||
|
Page {
|
||||||
|
header: StackHeader {
|
||||||
|
id : infoHeader
|
||||||
|
title: i18n.tr('Info')
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.top: infoHeader.bottom
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
width: parent.width
|
||||||
|
color: "#FFF"
|
||||||
|
|
||||||
|
Flow {
|
||||||
|
spacing: 2
|
||||||
|
anchors.fill: parent
|
||||||
|
Rectangle {
|
||||||
|
width: parent.width
|
||||||
|
height: units.gu(4)
|
||||||
|
}
|
||||||
|
Rectangle {
|
||||||
|
width: parent.width
|
||||||
|
height: units.gu(12)
|
||||||
|
Image {
|
||||||
|
source: "../../assets/logo.svg"
|
||||||
|
width: units.gu(12)
|
||||||
|
height: units.gu(12)
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Rectangle {
|
||||||
|
width: parent.width
|
||||||
|
height: units.gu(4)
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
width: parent.width
|
||||||
|
height: units.gu(6)
|
||||||
|
text: i18n.tr('UTPass')
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
width: parent.width
|
||||||
|
height: units.gu(6)
|
||||||
|
text: "Version" //i18n.tr("Version %1").arg(Manifest.get("version"))
|
||||||
|
}
|
||||||
|
Link {
|
||||||
|
url: "https://github.com/QRouland/UTPass/issues"
|
||||||
|
text: i18n.tr('Suggest improvements or report a bug')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
59
qml/pages/PasswordList.qml
Normal file
59
qml/pages/PasswordList.qml
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import QtQuick 2.4
|
||||||
|
import Ubuntu.Components 1.3
|
||||||
|
import Qt.labs.folderlistmodel 2.1
|
||||||
|
import "../components"
|
||||||
|
import "headers"
|
||||||
|
|
||||||
|
|
||||||
|
Page {
|
||||||
|
header : MainHeader {
|
||||||
|
flickable : nav
|
||||||
|
|
||||||
|
leadingActionBar.height: units.gu(4)
|
||||||
|
leadingActionBar.actions: [
|
||||||
|
Action {
|
||||||
|
id: backAction
|
||||||
|
iconName: "back"
|
||||||
|
text: i18n.tr("Back")
|
||||||
|
visible:false
|
||||||
|
onTriggered: {
|
||||||
|
folderModel.folder = folderModel.parentFolder;
|
||||||
|
if(folderModel.rootFolder === folderModel.folder) {
|
||||||
|
backAction.visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
Flickable {
|
||||||
|
id: nav
|
||||||
|
height: parent.height
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
width: parent.width
|
||||||
|
visible: folderModel.count == 0
|
||||||
|
height: units.gu(5)
|
||||||
|
Text {
|
||||||
|
text: i18n.tr("No password found in the current folder")
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
anchors.fill: parent
|
||||||
|
spacing: 1
|
||||||
|
model: FolderListModel {
|
||||||
|
id: folderModel
|
||||||
|
nameFilters: ["*.gpg"]
|
||||||
|
rootFolder: "file:password-store"
|
||||||
|
folder: "file:password-store"
|
||||||
|
}
|
||||||
|
delegate: FileDir {
|
||||||
|
id: fileDelegate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
30
qml/pages/Settings.qml
Normal file
30
qml/pages/Settings.qml
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import QtQuick 2.4
|
||||||
|
import Ubuntu.Components 1.3
|
||||||
|
import "headers"
|
||||||
|
|
||||||
|
Page {
|
||||||
|
header: StackHeader {
|
||||||
|
id:settingsHeader
|
||||||
|
title: i18n.tr('Settings')
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.top: settingsHeader.bottom
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
width: parent.width
|
||||||
|
color: "#FFF"
|
||||||
|
|
||||||
|
Flow {
|
||||||
|
spacing: 1
|
||||||
|
anchors.fill: parent
|
||||||
|
Text {
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
width: parent.width
|
||||||
|
height: units.gu(6)
|
||||||
|
text: "Settings"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
32
qml/pages/headers/MainHeader.qml
Normal file
32
qml/pages/headers/MainHeader.qml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import QtQuick 2.4
|
||||||
|
import Ubuntu.Components 1.3
|
||||||
|
|
||||||
|
PageHeader {
|
||||||
|
id: mainHeader
|
||||||
|
width: parent.width
|
||||||
|
height: units.gu(6)
|
||||||
|
title: i18n.tr("UTPass")
|
||||||
|
|
||||||
|
trailingActionBar.height: units.gu(4)
|
||||||
|
trailingActionBar.numberOfSlots: 2
|
||||||
|
trailingActionBar.actions: [
|
||||||
|
Action {
|
||||||
|
iconName: "search"
|
||||||
|
text: i18n.tr("Search")
|
||||||
|
},
|
||||||
|
Action {
|
||||||
|
iconName: "settings"
|
||||||
|
text: i18n.tr("Settings")
|
||||||
|
onTriggered: {
|
||||||
|
pageStack.push(Qt.resolvedUrl("../Settings.qml"))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Action {
|
||||||
|
iconName: "info"
|
||||||
|
text: i18n.tr("Info")
|
||||||
|
onTriggered: {
|
||||||
|
pageStack.push(Qt.resolvedUrl("../Info.qml"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
20
qml/pages/headers/StackHeader.qml
Normal file
20
qml/pages/headers/StackHeader.qml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import QtQuick 2.4
|
||||||
|
import Ubuntu.Components 1.3
|
||||||
|
|
||||||
|
PageHeader {
|
||||||
|
width: parent.width
|
||||||
|
height: units.gu(6)
|
||||||
|
title: i18n.tr("UTPass")
|
||||||
|
|
||||||
|
leadingActionBar.height: units.gu(4)
|
||||||
|
leadingActionBar.actions: [
|
||||||
|
Action {
|
||||||
|
id: backAction
|
||||||
|
iconName: "back"
|
||||||
|
text: "Back"
|
||||||
|
onTriggered: {
|
||||||
|
pageStack.pop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
2
qml/pages/headers/qmldir
Normal file
2
qml/pages/headers/qmldir
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
MainHeader 1.0 MainHeader.qml
|
||||||
|
StackHeader 1.0 StackHeader.qml
|
4
qml/pages/qmldir
Normal file
4
qml/pages/qmldir
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Info 1.0 Info.qml
|
||||||
|
PassordList 1.0 Password.qml
|
||||||
|
Settings 1.0 Settings.qml
|
||||||
|
UTPassPage 1.0 UTPassPage.qml
|
10
qml/styles/Theme.qml
Normal file
10
qml/styles/Theme.qml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
pragma Singleton
|
||||||
|
import QtQuick 2.4
|
||||||
|
|
||||||
|
Item {
|
||||||
|
readonly property color claret : "#77172A"
|
||||||
|
readonly property color raisin_black : "#AE2B25"
|
||||||
|
readonly property color steel_blue : "#462C98"
|
||||||
|
readonly property color twilight_lavender : "#754888"
|
||||||
|
readonly property color eerie_black : "#191716"
|
||||||
|
}
|
2
qml/styles/qmldir
Normal file
2
qml/styles/qmldir
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
CustomBorder 1.0 CustomBorder.qml
|
||||||
|
singleton Theme 1.0 Theme.qml
|
Loading…
Reference in New Issue
Block a user