Commit efacc12d authored by Philip Rinn's avatar Philip Rinn

Imported Upstream version 1.1.0

parent 40847c7a
......@@ -11,6 +11,7 @@ after_build:
- iscc qtpass.iss
artifacts:
- path: Output\qtpass-*.exe
- path: release\qtpass.exe
deploy:
provider: GitHub
auth_token:
......
......@@ -44,6 +44,10 @@ fi
link `/usr/bin/pinentry` to your pinentry application of choice
eg: `ln -s /usr/bin/pinentry-qt5 /usr/bin/pinentry`
### Git doesn't work on Windows
git for Windows comes with an `ssh-askpass` compatible command, git `gui--askpass` (located in `/mingw64/libexec/git-core/git-gui--askpass` on PortableGit version, presumably some place similar for the installed version).
### Where can I ask for help?
* Create an [issue](https://github.com/IJHack/qtpass/) issues on github.
......@@ -54,6 +58,18 @@ fi
* Yes, check [passwordstore.org/#migration](http://www.passwordstore.org/#migration)
for more info.
### I don't see icons on the buttons
You do not have the Qt SVG library installed.
Please install using your favorite package manager.
### I get icons that do not fit my (X11) default
On some WindowManagers (Cinnamon for example) Qt doesn't know what icon set to use, a trick
```
export DESKTOP_SESSION=gnome
```
### I don't like the design, what gives?
* It's all on github, clone, change and send a pull request.
......
......@@ -22,11 +22,24 @@ Logo based on [Heart-padlock by AnonMoos](https://commons.wikimedia.org/wiki/Fil
Installation
------------
On most systems all you need is:
`qmake && make && make install`
### Dependencies
* QtPass requires Qt 4.8 or later, preferably Qt5.
* The Linguist package is required to compile the translations.
* For use of the fallback icons the SVG library is required.
On most *nix systems all you need is:
```
qmake && make && make install
```
On Mac OS X:
`qmake && make && macdeployqt QtPass.app`
```
brew install qt5
brew link --force qt5
xcode-select --install
qmake && make && macdeployqt QtPass.app
```
Currently seems to only work with MacGPG2
Security considerations
......
<?xml version="1.0" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="500" height="646" viewBox="-1250 -1050 2500 3230">
<title>Padlocked heart.</title>
<defs>
<linearGradient id="linG1" gradientUnits="userSpaceOnUse" x1="-810" x2="-450">
<stop offset="5%" stop-color="#808080"/>
<stop offset="40%" stop-color="#c0c0c0"/>
<stop offset="60%" stop-color="#c0c0c0"/>
<stop offset="95%" stop-color="#808080"/>
</linearGradient>
<linearGradient id="linG2" gradientUnits="userSpaceOnUse" x1="450" x2="810">
<stop offset="5%" stop-color="#808080"/>
<stop offset="40%" stop-color="#c0c0c0"/>
<stop offset="60%" stop-color="#c0c0c0"/>
<stop offset="95%" stop-color="#808080"/>
</linearGradient>
<radialGradient id="crcGg" gradientUnits="userSpaceOnUse" cx="0" cy="1320" fx="0" fy="1320" r="360" spreadMethod="repeat">
<stop offset="0%" stop-color="#a5a5a5"/>
<stop offset="20%" stop-color="#808080"/>
<stop offset="30%" stop-color="#808080"/>
<stop offset="65%" stop-color="#c0c0c0"/>
<stop offset="85%" stop-color="#c0c0c0"/>
<stop offset="100%" stop-color="#a5a5a5"/>
</radialGradient>
<radialGradient id="crcGr" gradientUnits="userSpaceOnUse" cx="0" cy="150" fx="0" fy="150" r="1200" spreadMethod="reflect">
<stop offset="10%" stop-color="#19528a"/>
<stop offset="80%" stop-color="#0b243d"/>
</radialGradient>
</defs>
<g transform="translate(0,1136) scale(1,-1)">
<g stroke-width="360" fill="none">
<path stroke="#808080" d="M-630,0V1320A630,630 0 0,0 630,1320V0"/>
<path stroke="#A0A0A0" stroke-width="180" d="M-630,0V1320A630,630 0 0,0 630,1320V0"/>
<path stroke="url(#linG1)" d="M-630,0V1320"/><path stroke="url(#linG2)" d="M630,1320V0"/>
<path stroke="url(#crcGg)" d="M-630,1320A630,630 0 0,0 630,1320"/></g>
<path fill="url(#crcGr)" d="M0,-1000L-1000,0A635.6743,635.6743 0 1,0 0,767.327
A635.6743,635.6743 0 1,0 1000,0Z"/>
<circle cy="296.5" r="209"/><path d="M-76,220.5L-218.5,-416H218.5L76,220.5H-76Z"/></g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="646" viewBox="-1250 -1050 2500 3230"><title>Padlocked heart.</title><defs><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="-810" x2="-450"><stop offset="5%" stop-color="gray"/><stop offset="40%" stop-color="silver"/><stop offset="60%" stop-color="silver"/><stop offset="95%" stop-color="gray"/></linearGradient><linearGradient id="b" gradientUnits="userSpaceOnUse" x1="450" x2="810"><stop offset="5%" stop-color="gray"/><stop offset="40%" stop-color="silver"/><stop offset="60%" stop-color="silver"/><stop offset="95%" stop-color="gray"/></linearGradient><radialGradient id="c" gradientUnits="userSpaceOnUse" cx="0" cy="1320" fx="0" fy="1320" r="360" spreadMethod="repeat"><stop offset="0%" stop-color="#a5a5a5"/><stop offset="20%" stop-color="gray"/><stop offset="30%" stop-color="gray"/><stop offset="65%" stop-color="silver"/><stop offset="85%" stop-color="silver"/><stop offset="100%" stop-color="#a5a5a5"/></radialGradient><radialGradient id="d" gradientUnits="userSpaceOnUse" cx="0" cy="150" fx="0" fy="150" r="1200" spreadMethod="reflect"><stop offset="10%" stop-color="#19528a"/><stop offset="80%" stop-color="#0b243d"/></radialGradient></defs><g transform="matrix(1 0 0 -1 0 1136)"><g stroke-width="360" fill="none"><path stroke="gray" d="M-630 0v1320a630 630 0 0 0 1260 0V0"/><path stroke="#A0A0A0" stroke-width="180" d="M-630 0v1320a630 630 0 0 0 1260 0V0"/><path stroke="url(#a)" d="M-630 0v1320"/><path stroke="url(#b)" d="M630 1320V0"/><path stroke="url(#c)" d="M-630 1320a630 630 0 0 0 1260 0"/></g><path fill="url(#d)" d="M0-1000L-1000 0A635.674 635.674 0 1 0 0 767.327 635.674 635.674 0 1 0 1000 0z"/><circle cy="296.5" r="209"/><path d="M-76 220.5L-218.5-416h437L76 220.5H-76z"/></g></svg>
\ No newline at end of file
This diff is collapsed.
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>Star 1</title><path d="M5.902 16L8 14.25 10.098 16a8.22 8.22 0 0 0 2.076-.86l.246-2.72 2.72-.246a8.22 8.22 0 0 0 .86-2.076L14.25 8 16 5.902a8.22 8.22 0 0 0-.86-2.076l-2.72-.246-.246-2.72A8.22 8.22 0 0 0 10.098 0L8 1.75 5.902 0a8.22 8.22 0 0 0-2.076.86L3.58 3.58l-2.72.246A8.22 8.22 0 0 0 0 5.902L1.75 8 0 10.098a8.22 8.22 0 0 0 .86 2.076l2.72.246.246 2.72a8.22 8.22 0 0 0 2.076.86zm2.288-4.072a3.88 3.88 0 1 0 0-7.76 3.88 3.88 0 0 0 0 7.76z" fill="#9A9A9A" fill-rule="evenodd"/></svg>
\ No newline at end of file
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>Rectangle 5 Copy 3</title><path d="M10 6V0H6v6H0v4h6v6h4v-6h6V6h-6z" fill="#77A6DD" fill-rule="evenodd"/></svg>
\ No newline at end of file
<svg width="14" height="19" viewBox="0 0 14 19" xmlns="http://www.w3.org/2000/svg"><title>Edit</title><path d="M12.665 4.322l1-1.732-4.33-2.5-1 1.732 4.33 2.5zm-.5.866l-6.5 11.258-4.33-2.5 6.5-11.258 4.33 2.5zM1.5 18.66l3.665-1.348-4.33-2.5.665 3.848z" fill="#9A9A9A" fill-rule="evenodd"/></svg>
\ No newline at end of file
<svg width="19" height="11" viewBox="0 0 19 11" xmlns="http://www.w3.org/2000/svg"><title>Clear</title><path d="M6.824 0h10.283C18.152 0 19 .938 19 2.07v6.86c0 1.144-.86 2.07-1.893 2.07H5.588L0 5.5 5.588 0h1.236zm6.94 5.294l2.118-2.118-1.41-1.41-2.12 2.116-2.117-2.117-1.41 1.41 2.116 2.12L8.825 7.41l1.41 1.412 2.12-2.118 2.117 2.118 1.412-1.412-2.117-2.118z" fill="#9A9A9A" fill-rule="evenodd"/></svg>
\ No newline at end of file
<svg width="13" height="15" viewBox="0 0 13 15" xmlns="http://www.w3.org/2000/svg"><title>Copy Icon</title><path d="M10 2V0H0v12h2V2h8zM3 3h10v12H3V3zm2 5h6v1H5V8zm0 2h6v1H5v-1zm0 2h6v1H5v-1zm0-6h6v1H5V6z" fill="#9A9A9A" fill-rule="evenodd"/></svg>
\ No newline at end of file
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>Rectangle 5 Copy 3</title><path d="M10.828 8l4.243-4.243L12.244.93 8 5.17 3.757.93.93 3.756 5.17 8 .93 12.243l2.827 2.828L8 10.83l4.243 4.243 2.828-2.827L10.83 8z" fill="#C35151" fill-rule="evenodd"/></svg>
\ No newline at end of file
<svg width="16" height="14" viewBox="0 0 16 14" xmlns="http://www.w3.org/2000/svg"><title>Push</title><path d="M4 0h8v6.222h4L8 14 0 6.222h4V0z" fill="#9A9A9A" fill-rule="evenodd"/></svg>
\ No newline at end of file
<svg width="16" height="14" viewBox="0 0 16 14" xmlns="http://www.w3.org/2000/svg"><title>Arrow Down</title><path d="M4 14h8V7.778h4L8 0 0 7.778h4V14z" fill="#9A9A9A" fill-rule="evenodd"/></svg>
\ No newline at end of file
<svg width="14" height="18" viewBox="0 0 14 18" xmlns="http://www.w3.org/2000/svg"><title>User</title><path d="M7 8a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm4 10H3.003 3v-4.497A.507.507 0 0 0 2.5 13c-.268 0-.5.225-.5.503v4.325a3.003 3.003 0 0 1-2-2.825v-3.006A3 3 0 0 1 3.003 9h7.994A3.004 3.004 0 0 1 14 11.997v3.006a2.997 2.997 0 0 1-2 2.826v-4.327a.507.507 0 0 0-.5-.503c-.268 0-.5.225-.5.503V18z" fill="#9A9A9A" fill-rule="evenodd"/></svg>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -51,6 +51,18 @@ MainWindow::MainWindow(QWidget *parent)
setClippedPassword("");
QtPass = NULL;
QTimer::singleShot(10, this, SLOT(focusInput()));
// Add a Actions to the Add-Button
QIcon addFileIcon = QIcon::fromTheme("file_new");
QIcon addFolderIcon = QIcon::fromTheme("folder_new");
actionAddPassword = new QAction(addFileIcon, tr("Add Password"), this);
actionAddFolder = new QAction(addFolderIcon, tr("Add Folder"), this);
ui->addButton->addAction(actionAddPassword);
ui->addButton->addAction(actionAddFolder);
connect(actionAddPassword, SIGNAL(triggered()), this, SLOT(on_addButton_clicked()));
connect(actionAddFolder, SIGNAL(triggered()), this, SLOT(addFolder()));
qsrand(QDateTime::currentDateTime().toTime_t());
}
......@@ -360,9 +372,11 @@ bool MainWindow::checkConfig() {
if (!useGit || (gitExecutable.isEmpty() && passExecutable.isEmpty())) {
ui->pushButton->hide();
ui->updateButton->hide();
ui->horizontalSpacer->changeSize(0, 20, QSizePolicy::Maximum, QSizePolicy::Minimum);
} else {
ui->pushButton->show();
ui->updateButton->show();
ui->horizontalSpacer->changeSize(24, 24, QSizePolicy::Minimum, QSizePolicy::Minimum);
}
startupPhase = false;
......@@ -523,11 +537,13 @@ void MainWindow::config() {
config();
updateEnv();
if (!useGit || (gitExecutable.isEmpty() && passExecutable.isEmpty())) {
ui->pushButton->hide();
ui->updateButton->hide();
ui->pushButton->hide();
ui->updateButton->hide();
ui->horizontalSpacer->changeSize(0, 20, QSizePolicy::Maximum, QSizePolicy::Minimum);
} else {
ui->pushButton->show();
ui->updateButton->show();
ui->pushButton->show();
ui->updateButton->show();
ui->horizontalSpacer->changeSize(24, 24, QSizePolicy::Minimum, QSizePolicy::Minimum);
}
if (useTrayIcon && tray == NULL)
initTrayIcon();
......@@ -611,6 +627,30 @@ void MainWindow::on_treeView_clicked(const QModelIndex &index) {
}
}
/**
* @brief When doubleclicked on TreeViewItem, open the edit Window
* @param index
*/
void MainWindow::on_treeView_doubleClicked(const QModelIndex &index) {
// TODO: do nothing when clicked on folder
QFileInfo fileOrFolder =
model.fileInfo(proxyModel.mapToSource(ui->treeView->currentIndex()));
QString file = "";
if (fileOrFolder.isFile()) {
QString file = getFile(index, usePass);
if (file.isEmpty()) {
QMessageBox::critical(
this, tr("Can not edit"),
tr("Selected password file does not exist, not able to edit"));
return;
}
setPassword(file, true, false);
}
}
/**
* @brief MainWindow::executePass
* @param args
......@@ -911,7 +951,7 @@ QString MainWindow::getGpgExecutable() { return gpgExecutable; }
void MainWindow::on_configButton_clicked() { config(); }
/**
* @brief MainWindow::on_lineEdit_textChanged
* @brief Executes when the string in the search box changes, collapses the TreeView
* @param arg1
*/
void MainWindow::on_lineEdit_textChanged(const QString &arg1) {
......@@ -926,6 +966,7 @@ void MainWindow::on_lineEdit_textChanged(const QString &arg1) {
selectFirstFile();
}
/**
* @brief MainWindow::on_lineEdit_returnPressed
*/
......@@ -1079,12 +1120,27 @@ void MainWindow::setPassword(QString file, bool overwrite, bool isNew = false) {
* @brief MainWindow::on_addButton_clicked
*/
void MainWindow::on_addButton_clicked() {
// Check for active and selected encryption key
// QList<UserInfo> users=listKeys();
// UserInfo testuser;
// bool noUserEnabled = false;
// // Check if at least one active user is selected
// for (int i = 0; i< users.length();i++) {
// testuser = users[i];
// noUserEnabled = users[i].enabled | noUserEnabled;
// }
// // Error if no user is enabled, so a password doesn't get saved
// if (noUserEnabled==false) {
// QMessageBox::critical(this, tr("Can not get key list"),
// tr("No Key for encryption selected! \nPlease select a valid key pair in the users dialouge"));
// return;
// }
bool ok;
QString dir = getDir(ui->treeView->currentIndex(), usePass);
QString file = QInputDialog::getText(
this, tr("New file"),
tr("New password file, will be placed in folder %1:")
.arg(QDir::separator() + getDir(ui->treeView->currentIndex(), true)),
tr("New password file: \n(Will be placed in %1 )")
.arg(passStore + getDir(ui->treeView->currentIndex(), true)),
QLineEdit::Normal, "", &ok);
if (!ok || file.isEmpty())
return;
......@@ -1095,6 +1151,7 @@ void MainWindow::on_addButton_clicked() {
setPassword(file, false, true);
}
/**
* @brief MainWindow::on_deleteButton_clicked
*/
......@@ -1132,18 +1189,14 @@ void MainWindow::on_deleteButton_clicked() {
}
} else {
file = getDir(ui->treeView->currentIndex(), usePass);
// TODO: message box should accept enter key
if (QMessageBox::question(
this, tr("Delete folder?"),
tr("Are you sure you want to delete %1?")
.arg(QDir::separator() +
getDir(ui->treeView->currentIndex(), true)),
QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes)
.arg(QDir::separator() +
getDir(ui->treeView->currentIndex(), true)),
QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) {
return;
if (usePass) {
currentAction = DELETE;
executePass("rm -r \"" + file + '"');
if (useGit && autoPush)
on_pushButton_clicked();
} else {
if (useGit) {
executeWrapper(gitExecutable, "rm -rf \"" + file + '"');
......@@ -1158,7 +1211,7 @@ void MainWindow::on_deleteButton_clicked() {
QDir dir(file);
dir.removeRecursively();
#else
removeDir(file);
removeDir(passStore + file);
#endif
}
}
......@@ -1528,6 +1581,21 @@ void MainWindow::closeEvent(QCloseEvent *event) {
}
}
void MainWindow::keyPressEvent(QKeyEvent * event) {
switch (event->key()) {
case Qt::Key_Delete:
on_deleteButton_clicked();
break;
case Qt::Key_Return:
case Qt::Key_Enter:
on_editButton_clicked();
break;
default:
break;
}
}
void MainWindow::on_copyPasswordButton_clicked() { copyPasswordToClipboard(); }
/**
......@@ -1610,8 +1678,8 @@ void MainWindow::addFolder() {
QString dir = getDir(ui->treeView->currentIndex(), false);
QString newdir = QInputDialog::getText(
this, tr("New file"),
tr("New folder, will be placed in folder %1:")
.arg(QDir::separator() + getDir(ui->treeView->currentIndex(), true)),
tr("New Folder: \n(Will be placed in %1 )")
.arg(passStore + getDir(ui->treeView->currentIndex(), true)),
QLineEdit::Normal, "", &ok);
if (!ok || newdir.isEmpty())
return;
......
......@@ -58,11 +58,14 @@ class MainWindow : public QMainWindow {
protected:
void closeEvent(QCloseEvent *event);
void keyPressEvent(QKeyEvent * event);
private slots:
void on_updateButton_clicked();
void on_pushButton_clicked();
void on_treeView_clicked(const QModelIndex &index);
void on_treeView_doubleClicked(const QModelIndex &index);
void on_configButton_clicked();
void readyRead(bool finished);
void processFinished(int, QProcess::ExitStatus);
......@@ -87,6 +90,9 @@ class MainWindow : public QMainWindow {
void copyPasswordToClipboard();
private:
QAction *actionAddPassword;
QAction *actionAddFolder;
QApplication *QtPass;
QScopedPointer<QSettings> settings;
QScopedPointer<Ui::MainWindow> ui;
......
This diff is collapsed.
......@@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "QtPass"
#define MyAppVersion "1.0.6"
#define MyAppVersion "1.1.0"
#define MyAppPublisher "IJhack"
#define MyAppURL "https://qtpass.org/"
#define MyAppExeName "qtpass.exe"
......@@ -65,6 +65,7 @@ Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{
Source: "{#QtDir}\bin\Qt5Gui.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#QtDir}\bin\Qt5Network.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#QtDir}\bin\Qt5Widgets.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#QtDir}\bin\Qt5Svg.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#QtDir}\bin\icudt54.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#QtDir}\bin\icuin54.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#QtDir}\bin\icuuc54.dll"; DestDir: "{app}"; Flags: ignoreversion
......
......@@ -7,7 +7,7 @@
# #
#----------------------------------------------------------
VERSION = 1.0.6
VERSION = 1.1.0
TEMPLATE = app
QT += core gui
......@@ -16,6 +16,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
macx {
TARGET = QtPass
QMAKE_MAC_SDK = macosx
QT += svg
} else {
TARGET = qtpass
}
......@@ -68,7 +69,9 @@ TRANSLATIONS += localization/localization_nl_NL.ts \
localization/localization_ru_RU.ts \
localization/localization_he_IL.ts \
localization/localization_zh_CN.ts \
localization/localization_ar_MA.ts
localization/localization_ar_MA.ts \
localization/localization_fr_FR.ts \
localization/localization_fr_BE.ts
CODECFORSRC = UTF-8
CODECFORTR = UTF-8
......@@ -114,6 +117,7 @@ win32 {
} else:macx {
ICON = artwork/icon.icns
QMAKE_INFO_PLIST = qtpass.plist
#QMAKE_POST_LINK = cp -r $$PWD/icons $$OUT_PWD/QtPass.app/Contents/MacOS
} else:bsd {
LIBS += -L/usr/local/lib
}
......
......@@ -8,13 +8,16 @@
Name: qtpass
Version: 1.0.5.1
Release: 1%{?dist}
Release: 2%{?dist}
Summary: QtPass is a multi-platform GUI for pass, the standard unix password manager.
License: GPLv3
URL: https://qtpass.org/
Source0: %{name}-%{version}.tar.gz
BuildRequires: qt5-qtbase-devel
BuildRequires: qt5-qtbase-devel
BuildRequires: qt5-linguist
BuildRequires: desktop-file-utils
BuildRequires: xdg-utils
Requires: pass
Requires: qt5-qtbase
......@@ -36,12 +39,32 @@ make %{?_smp_mflags}
%install
%make_install
install -Dm 0644 artwork/icon.png %{buildroot}%{_datadir}/icons/hicolor/64x64/apps/qtpass-icon.png
desktop-file-install --dir=%{buildroot}%{_datadir}/applications qtpass.desktop
%files
%doc
%{_bindir}/*
%{_datadir}/applications/qtpass.desktop
%{_datadir}/icons/hicolor/64x64/apps/qtpass-icon.png
%post
/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
%postun
if [ $1 -eq 0 ] ; then
/bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null
/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
fi
%posttrans
/usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
%changelog
* Wed Dec 30 2015 Andrew DeMaria <lostonamountain@gmail.com> 1.0.5.1-2
- Added desktop/icon resources
- Added required build deps for a clean build
* Tue Dec 01 2015 serstring=Bram Vandoren <bram.vandoren@ster.kuleuven.be> - 1.0.5-1
- Initial RPM spec
......@@ -16,4 +16,15 @@
<file>localization/localization_zh_CN.qm</file>
<file>localization/localization_he_IL.qm</file>
</qresource>
<qresource prefix="/icons">
<file alias="document-new.svg">icons/document-new.svg</file>
<file alias="document-properties.svg">icons/document-properties.svg</file>
<file alias="edit-delete.svg">icons/edit-delete.svg</file>
<file alias="go-bottom.svg">icons/go-bottom.svg</file>
<file alias="x-office-address-book.svg">icons/x-office-address-book.svg</file>
<file alias="go-top.svg">icons/go-top.svg</file>
<file alias="applications-system.svg">icons/applications-system.svg</file>
<file alias="edit-copy.svg">icons/edit-copy.svg</file>
<file alias="edit-clear.svg">icons/edit-clear.svg</file>
</qresource>
</RCC>
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment