From 65e5da464934711f209a6465f5582731e0128f9a Mon Sep 17 00:00:00 2001 From: tarek_saidi Date: Thu, 16 Aug 2007 20:43:48 +0000 Subject: [PATCH] Bookmarks git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@146 b624d157-de02-0410-bad0-e51aec6abb33 --- share/keepass/icons/bookmark.png | Bin 0 -> 6161 bytes share/keepass/icons/bookmark_add.png | Bin 0 -> 2404 bytes share/keepass/icons/bookmark_edit.png | Bin 0 -> 2617 bytes share/keepass/icons/bookmark_folder.png | Bin 0 -> 2353 bytes share/keepass/icons/document.png | Bin 0 -> 1443 bytes share/keepass/icons/down.png | Bin 0 -> 1748 bytes share/keepass/icons/up.png | Bin 0 -> 1849 bytes src/Kdb3Database.cpp | 5 +- src/KpxConfig.h | 4 +- src/crypto/arcfour.cpp | 1 - src/dialogs/AboutDlg.cpp | 11 +- src/dialogs/AddBookmarkDlg.cpp | 58 +++ src/dialogs/AddBookmarkDlg.h | 41 ++ src/dialogs/EditEntryDlg.cpp | 17 +- src/dialogs/ManageBookmarksDlg.cpp | 117 ++++++ src/dialogs/ManageBookmarksDlg.h | 44 ++ src/dialogs/PasswordDlg.cpp | 85 +++- src/dialogs/PasswordDlg.h | 9 +- src/dialogs/SettingsDlg.cpp | 7 +- src/forms/AboutDlg.ui | 113 +++-- src/forms/AddBookmarkDlg.ui | 58 +++ src/forms/MainWindow.ui | 21 + src/forms/ManageBookmarksDlg.ui | 69 +++ src/forms/PasswordDlg.ui | 538 +++++++++++++----------- src/forms/SettingsDlg.ui | 2 +- src/lib/EntryView.cpp | 1 - src/lib/bookmarks.cpp | 127 ++++++ src/lib/bookmarks.h | 49 +++ src/main.cpp | 2 + src/mainwindow.cpp | 96 +++-- src/mainwindow.h | 2 + src/src.pro | 27 +- 32 files changed, 1157 insertions(+), 347 deletions(-) create mode 100644 share/keepass/icons/bookmark.png create mode 100644 share/keepass/icons/bookmark_add.png create mode 100644 share/keepass/icons/bookmark_edit.png create mode 100644 share/keepass/icons/bookmark_folder.png create mode 100644 share/keepass/icons/document.png create mode 100644 share/keepass/icons/down.png create mode 100644 share/keepass/icons/up.png create mode 100644 src/dialogs/AddBookmarkDlg.cpp create mode 100644 src/dialogs/AddBookmarkDlg.h create mode 100644 src/dialogs/ManageBookmarksDlg.cpp create mode 100644 src/dialogs/ManageBookmarksDlg.h create mode 100644 src/forms/AddBookmarkDlg.ui create mode 100644 src/forms/ManageBookmarksDlg.ui create mode 100644 src/lib/bookmarks.cpp create mode 100644 src/lib/bookmarks.h diff --git a/share/keepass/icons/bookmark.png b/share/keepass/icons/bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc8656b373edd545a9d8cf0527b1032a2e02359 GIT binary patch literal 6161 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 literal 0 HcmV?d00001 diff --git a/share/keepass/icons/bookmark_add.png b/share/keepass/icons/bookmark_add.png new file mode 100644 index 0000000000000000000000000000000000000000..3521387f16d2f74f300e880f9ed569ca7d58701a GIT binary patch literal 2404 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 W?=r~0hT0zh0000fB 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 literal 0 HcmV?d00001 diff --git a/src/Kdb3Database.cpp b/src/Kdb3Database.cpp index 9af0f06..2062af4 100644 --- a/src/Kdb3Database.cpp +++ b/src/Kdb3Database.cpp @@ -103,7 +103,7 @@ int Kdb3Database::numIcons(){ bool Kdb3Database::parseMetaStream(const StdEntry& entry){ - qDebug("%s",entry.Comment.toUtf8().data()); + qDebug("Found Metastream: %s",entry.Comment.toUtf8().data()); if(entry.Comment=="KPX_GROUP_TREE_STATE"){ parseGroupTreeStateMetaStream(entry.Binary); @@ -843,8 +843,7 @@ QList Kdb3Database::entries(IGroupHandle* group){ handles.append(&EntryHandles[i]); } qSort(handles.begin(),handles.end(),EntryHandleLessThan); - foreach(IEntryHandle* h,handles){qDebug("+ %s (%i)",h->title().toUtf8().data(),(int)h->isValid());} - + return handles; } diff --git a/src/KpxConfig.h b/src/KpxConfig.h index ce7df09..1632057 100644 --- a/src/KpxConfig.h +++ b/src/KpxConfig.h @@ -56,7 +56,6 @@ public: QBitArray columns(){return stringToBitArray(settings.value("UI/Columns","11111000000").toString(),11);} QList columnOrder(){return stringToIntArray(settings.value("UI/ColumnOrder","100,100,100,100,100,100,100,100,100,100,100").toString(),11);} QList columnSizes(){return stringToIntArray(settings.value("UI/ColumnSizes","15,10,10,10,10,10,10,10,10,10,10").toString(),11);} - bool enableBookmarkMenu(){return settings.value("Options/EnableBookmarkMenu",true).toBool();} QStringList fileDlgHistory(unsigned index){return settings.value(QString("FileDlgHistory/ENTRY%1").arg(index)).toStringList();} GrpTreeState groupTreeState(){return stringToGrpTreeState(settings.value("Options/GroupTreeState").toString());} bool hidePasswords(){return settings.value("UI/HidePasswords",true).toBool();} @@ -90,6 +89,7 @@ public: bool askBeforeDelete(){return settings.value("Options/AskBeforeDelete",true).toBool();} int autoTypePreGap(){return settings.value("Options/AutoTypePreGap",500).toInt();} int autoTypeKeyStrokeDelay(){return settings.value("Options/AutoTypeKeyStrokeDelay",0).toInt();} + bool featureBookmarks(){return settings.value("Features/Bookmarks",true).toBool();} void setAlternatingRowColors(bool value){settings.setValue("Options/AlternatingRowColors",value);} void setBannerColor1(const QColor& value){settings.setValue("Options/BannerColor1",colorToString(value));} @@ -99,7 +99,6 @@ public: void setColumns(const QBitArray& value){settings.setValue("UI/Columns",bitArrayToString(value));} void setColumnOrder(const QList& value){settings.setValue("UI/ColumnOrder",intArrayToString(value));} void setColumnSizes(const QList& value){settings.setValue("UI/ColumnSizes",intArrayToString(value));} - void setEnableBookmarkMenu(bool value){settings.setValue("Options/EnableBookmarkMenu",value);} void setFileDlgHistory(unsigned index,const QStringList& value){settings.setValue(QString("FileDlgHistory/ENTRY%1").arg(index), value);} void setGroupTreeState(GrpTreeState value){settings.setValue("Options/GroupTreeState",grpTreeStateToString(value));} void setHidePasswords(bool value){settings.setValue("UI/HidePasswords",value);} @@ -133,6 +132,7 @@ public: void setAskBeforeDelete(bool value){settings.setValue("Options/AskBeforeDelete",value);} void setAutoTypePreGap(int value){settings.setValue("Options/AutoTypePreGap",value);} void setAutoTypeKeyStrokeDelay(int value){settings.setValue("Options/AutoTypeKeyStrokeDelay",value);} + void setFeatureBookmarks(bool value){settings.setValue("Features/Bookmarks",value);} unsigned fileDlgHistorySize(); void clearFileDlgHistory(){settings.remove("FileDlgHistory");}; diff --git a/src/crypto/arcfour.cpp b/src/crypto/arcfour.cpp index 3d0c923..0df7980 100644 --- a/src/crypto/arcfour.cpp +++ b/src/crypto/arcfour.cpp @@ -58,7 +58,6 @@ void CArcFour::prepareKey(){ } void CArcFour::encrypt(const byte* src, byte* dst,int length){ -//qDebug("Key:%s",RawKey.data()); prepareKey(); unsigned char x; unsigned char y; diff --git a/src/dialogs/AboutDlg.cpp b/src/dialogs/AboutDlg.cpp index cd182ae..95be523 100755 --- a/src/dialogs/AboutDlg.cpp +++ b/src/dialogs/AboutDlg.cpp @@ -1,11 +1,10 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2007 by Tarek Saidi * * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; version 2 of the License. * - * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * @@ -48,18 +47,18 @@ AboutDialog::AboutDialog(QWidget* parent):QDialog(parent) QString str; str+=""+tr("Team")+"
"; str+="
"; - str+=""+tr("Tarek Saidi")+"
"+tr("Developer, Project Admin")+"
"+tr("tariq@users.berlios.de")+"
"; + str+=""+tr("Tarek Saidi")+"
"+tr("Developer, Project Admin")+"
"+tr("tarek_saidi@users.sf.net")+"
"; + str+="
"; + str+=""+tr("Eugen Gorschenin")+"
"+tr("Web Designer")+"
"+tr("geugen@users.sf.de")+"
"; str+="
"; - str+=""+tr("Eugen Gorschenin")+"
"+tr("Web Designer")+"
"+tr("geugen@users.berlios.de")+"
"; + str+=""+tr("Jota Jota")+"
"+tr("Developer")+"
"+tr("myxself@users.sf.de")+"
"; str+="

"; str+=""+tr("Thanks To")+""; str+="
"; str+=""+tr("Matthias Miller")+"
"+tr("Patches for better MacOS X support")+"
"+tr("www.outofhanwell.com")+"
"; str+="
"; - str+="
"; str+=""+tr("James Nicholls")+"
"+tr("Main Application Icon")/*+"
"+tr("mailto:???")*/+"
"; str+="
"; - str+="
"; str+=""+tr("Constantin Makshin")+"
"+tr("Various fixes and improvements")+"
"+tr("dinosaur-rus@users.sourceforge.net")+"
"; Edit_Thanks->setHtml(str); } diff --git a/src/dialogs/AddBookmarkDlg.cpp b/src/dialogs/AddBookmarkDlg.cpp new file mode 100644 index 0000000..3238e55 --- /dev/null +++ b/src/dialogs/AddBookmarkDlg.cpp @@ -0,0 +1,58 @@ +/*************************************************************************** + * Copyright (C) 2007 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include "AddBookmarkDlg.h" +#include "lib/FileDialogs.h" +#include "lib/bookmarks.h" + +AddBookmarkDlg::AddBookmarkDlg(QWidget* parent, QString DefaultFilename, int _ItemID):QDialog(parent) +{ + setupUi(this); + ItemID=_ItemID; + connect(Button_Browse,SIGNAL(clicked()),this,SLOT(OnButtonBrowse())); + connect(buttonBox->button(QDialogButtonBox::Ok),SIGNAL(clicked()),this,SLOT(OnButtonOk())); + connect(buttonBox->button(QDialogButtonBox::Cancel),SIGNAL(clicked()),this,SLOT(reject())); + if(ItemID==-1){ + if(DefaultFilename==QString()) + OnButtonBrowse(); + else + Edit_Filename->setText(DefaultFilename); + } + else { + Edit_Title->setText(KpxBookmarks::title(ItemID)); + Edit_Filename->setText(KpxBookmarks::path(ItemID)); + setWindowTitle(tr("Edit Bookmark")); + } +} + +void AddBookmarkDlg::OnButtonBrowse(){ + QString path=KpxFileDialogs::openExistingFile(this,"AddBookmarkDlg", tr("Add Bookmark"), + QStringList() << tr("KeePass Databases (*.kdb)") << tr("All Files (*)")); + if(path!=QString()) + Edit_Filename->setText(path); +} + +void AddBookmarkDlg::OnButtonOk(){ + if(ItemID==-1) + ItemID=KpxBookmarks::add(Edit_Title->text(),Edit_Filename->text()); + else + KpxBookmarks::edit(Edit_Title->text(),Edit_Filename->text(),ItemID); + accept(); +} \ No newline at end of file diff --git a/src/dialogs/AddBookmarkDlg.h b/src/dialogs/AddBookmarkDlg.h new file mode 100644 index 0000000..363ace2 --- /dev/null +++ b/src/dialogs/AddBookmarkDlg.h @@ -0,0 +1,41 @@ +/*************************************************************************** + * Copyright (C) 2007 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef _ADDBOOKMARKDLG_H_ +#define _ADDBOOKMARKDLG_H_ + +#include +#include "ui_AddBookmarkDlg.h" + +class AddBookmarkDlg : public QDialog, private Ui::AddBookmarkDlg +{ + Q_OBJECT + + public: + AddBookmarkDlg (QWidget* parent=0, QString DefaultFilename=QString(), int ItemID=-1); + int ItemID; + + private slots: + void OnButtonOk(); + void OnButtonBrowse(); + +}; + +#endif + diff --git a/src/dialogs/EditEntryDlg.cpp b/src/dialogs/EditEntryDlg.cpp index 06448c8..75aefc3 100755 --- a/src/dialogs/EditEntryDlg.cpp +++ b/src/dialogs/EditEntryDlg.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include "SelectIconDlg.h" #include "PasswordGenDlg.h" @@ -348,27 +349,27 @@ void CEditEntryDlg::OnNewAttachment() int prec; if (entry->binarySize() < 1024) { - unit = "Bytes"; + unit = tr("Bytes"); faktor = 1; prec = 0; } else { - if (entry->binarySize() < 1048576) + if (entry->binarySize() < pow(2,20)) { - unit = "kB"; + unit = tr("kiB"); faktor = 1024; } else - if (entry->binarySize() < 1073741824) + if (entry->binarySize() < pow(2,30)) { - unit = "MB"; - faktor = 1048576; + unit = tr("MiB"); + faktor = pow(2,20); } else { - unit = "GB"; - faktor = 1073741824; + unit = tr("GiB"); + faktor = pow(2,30); } prec = 1; } diff --git a/src/dialogs/ManageBookmarksDlg.cpp b/src/dialogs/ManageBookmarksDlg.cpp new file mode 100644 index 0000000..c1045b0 --- /dev/null +++ b/src/dialogs/ManageBookmarksDlg.cpp @@ -0,0 +1,117 @@ +/*************************************************************************** + * Copyright (C) 2007 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include "main.h" +#include "ManageBookmarksDlg.h" +#include "lib/bookmarks.h" +#include "dialogs/AddBookmarkDlg.h" + +ManageBookmarksDlg::ManageBookmarksDlg(QWidget* parent):QDialog(parent) +{ + setupUi(this); + for(int i=0;isetData(Qt::UserRole,i); + item->setText(KpxBookmarks::title(i)); + } + connect(Button_Up,SIGNAL(clicked()),this,SLOT(OnButtonUp())); + connect(Button_Down,SIGNAL(clicked()),this,SLOT(OnButtonDown())); + connect(Button_Delete,SIGNAL(clicked()),this,SLOT(OnButtonDelete())); + connect(Button_Add,SIGNAL(clicked()),this,SLOT(OnButtonAdd())); + connect(Button_Edit,SIGNAL(clicked()),this,SLOT(OnButtonEdit())); + connect(ListWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(edit(QListWidgetItem*))); + connect(buttonBox->button(QDialogButtonBox::Close),SIGNAL(clicked()),this,SLOT(close())); + + Button_Up->setIcon(getIcon("up")); + Button_Down->setIcon(getIcon("down")); + Button_Delete->setIcon(getIcon("delete")); + Button_Edit->setIcon(getIcon("bookmark_edit")); + Button_Add->setIcon(getIcon("bookmark_add")); +} + + +void ManageBookmarksDlg::OnButtonUp(){ + int row=ListWidget->currentRow(); + QListWidgetItem* item=ListWidget->currentItem(); + if(row==-1 || !item || row==0)return; + ListWidget->takeItem(row); + row--; + ListWidget->insertItem(row,item); + ListWidget->setCurrentRow(row); +} + +void ManageBookmarksDlg::OnButtonDown(){ + int row=ListWidget->currentRow(); + QListWidgetItem* item=ListWidget->currentItem(); + if(row==-1 || !item || row==ListWidget->count()-1)return; + ListWidget->takeItem(row); + row++; + ListWidget->insertItem(row,item); + ListWidget->setCurrentRow(row); +} + +void ManageBookmarksDlg::OnButtonDelete(){ + QListWidgetItem* item=ListWidget->currentItem(); + if(!item)return; + int index=item->data(Qt::UserRole).toInt(); + KpxBookmarks::remove(index); + delete item; + for(int i=0;icount();i++){ + int itemindex=ListWidget->item(i)->data(Qt::UserRole).toInt(); + if(itemindex>index) + ListWidget->item(i)->setData(Qt::UserRole,itemindex-1); + } +} + +void ManageBookmarksDlg::OnButtonEdit(){ + QListWidgetItem* item=ListWidget->currentItem(); + if(!item)return; + edit(item); +} + +void ManageBookmarksDlg::edit(QListWidgetItem* item){ + int i=item->data(Qt::UserRole).toInt(); + AddBookmarkDlg dlg(this,QString(),i); + dlg.exec(); + item->setText(KpxBookmarks::title(i)); +} + + +void ManageBookmarksDlg::OnButtonAdd(){ + AddBookmarkDlg dlg(this); + if(dlg.exec()){ + int i=dlg.ItemID; + QListWidgetItem* item=new QListWidgetItem(ListWidget); + item->setData(Qt::UserRole,i); + item->setText(KpxBookmarks::title(i)); + } + return; +} + +void ManageBookmarksDlg::closeEvent(QCloseEvent * event){ + QList Order; + // Creating a list with the new indices + // Order[OldIndex]==NewIndex + for(int i=0;iitem(i)->data(Qt::UserRole).toInt(); + } + KpxBookmarks::resort(Order); + event->accept(); +} \ No newline at end of file diff --git a/src/dialogs/ManageBookmarksDlg.h b/src/dialogs/ManageBookmarksDlg.h new file mode 100644 index 0000000..4501a5c --- /dev/null +++ b/src/dialogs/ManageBookmarksDlg.h @@ -0,0 +1,44 @@ +/*************************************************************************** + * Copyright (C) 2007 by Tarek Saidi * + * tarek.saidi@arcor.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; version 2 of the License. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef MANAGEBOOKMARKSDLG_H +#define MANAGEBOOKMARKSDLG_H + +#include +#include +#include "ui_ManageBookmarksDlg.h" + +class ManageBookmarksDlg : public QDialog, private Ui::ManageBookmarksDlg +{ + Q_OBJECT + public: + ManageBookmarksDlg(QWidget* parent=0); + private: + virtual void closeEvent(QCloseEvent* event); + private slots: + void OnButtonUp(); + void OnButtonDown(); + void OnButtonDelete(); + void OnButtonAdd(); + void OnButtonEdit(); + void edit(QListWidgetItem*); +}; + +#endif + diff --git a/src/dialogs/PasswordDlg.cpp b/src/dialogs/PasswordDlg.cpp index ee9d0e2..143f3f3 100755 --- a/src/dialogs/PasswordDlg.cpp +++ b/src/dialogs/PasswordDlg.cpp @@ -1,11 +1,10 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2007 by Tarek Saidi * * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; version 2 of the License. * - * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * @@ -27,26 +26,31 @@ #include #include #include +#include +#include +#include #include "main.h" #include "KpxConfig.h" #include "PasswordDlg.h" #include "lib/FileDialogs.h" +#include "lib/bookmarks.h" -CPasswordDialog::CPasswordDialog(QWidget* parent,IDatabase* DB,bool ShowExitButton,bool ChangeKeyMode) +CPasswordDialog::CPasswordDialog(QWidget* parent,QString filename,IDatabase* DB,bool IsAuto,bool ChangeKeyMode) : QDialog(parent) { setupUi(this); - createBanner(Banner,getPixmap("key"),tr("Database Key")); + createBanner(&BannerPixmap,getPixmap("key"),tr("Database Key"),width()); + Button_Bookmarks->setIcon(getIcon("bookmark")); db=DB; + LastFile=filename; + setWindowTitle(LastFile); QString mountDir=config->mountDir(); QDir media(mountDir); if(media.exists()){ QStringList Paths; - Paths=media.entryList(QStringList()<<"*",QDir::Dirs); - Paths.erase(Paths.begin()); // delete "." - Paths.erase(Paths.begin()); // delete ".." + Paths=media.entryList(QStringList()<<"*",QDir::Dirs | QDir::NoDotAndDotDot); for(int i=0;iaddItem(mountDir+Paths[i]); } @@ -66,17 +70,47 @@ CPasswordDialog::CPasswordDialog(QWidget* parent,IDatabase* DB,bool ShowExitButt } // if(LastKeyType==Password){... is not required because it is already the default state. } - - connect( Combo_Dirs, SIGNAL( editTextChanged(const QString&) ),this, SLOT( OnComboTextChanged(const QString&))); - connect( ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); - connect( Edit_Password, SIGNAL( textChanged(const QString&) ), this, SLOT( OnPasswordChanged(const QString&) ) ); - connect( CheckBox_Both, SIGNAL( stateChanged(int) ), this, SLOT( OnCheckBox_BothChanged(int) ) ); - connect( ButtonChangeEchoMode, SIGNAL( clicked() ), this, SLOT( ChangeEchoModeDatabaseKey() ) ); - connect( Edit_Password, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); - connect( Edit_PasswordRep, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); - connect( ButtonExit, SIGNAL( clicked()),this,SLOT(OnButtonExit())); - - ButtonExit->setVisible(ShowExitButton); + + // Bookmarks // + QPalette palette=Button_Bookmarks->palette(); + palette.setColor(QPalette::Active,QPalette::Button,config->bannerColor1()); + palette.setColor(QPalette::Active,QPalette::Window,config->bannerColor2()); + Button_Bookmarks->setPalette(palette); + palette=Label_Bookmark->palette(); + palette.setColor(QPalette::Active,QPalette::WindowText,config->bannerTextColor()); + Label_Bookmark->setPalette(palette); + + QMenu* BookmarkMenu=new QMenu(this); + QAction* action=new QAction(this); + action->setData(QString()); + action->setText(tr("Last File")); + action->setIcon(getIcon("document")); + BookmarkMenu->addAction(action); + BookmarkMenu->addSeparator(); + for(int i=0;isetData(KpxBookmarks::path(i)); + action->setText(KpxBookmarks::title(i)); + action->setIcon(getIcon("document")); + BookmarkMenu->addAction(action); + } + Button_Bookmarks->setMenu(BookmarkMenu); + if(!IsAuto || !config->featureBookmarks()){ + Button_Bookmarks->hide(); + Label_Bookmark->hide(); + } + + connect(Combo_Dirs, SIGNAL( editTextChanged(const QString&) ),this, SLOT( OnComboTextChanged(const QString&))); + connect(ButtonCancel, SIGNAL( clicked() ), this, SLOT( OnCancel() ) ); + connect(Edit_Password, SIGNAL( textChanged(const QString&) ), this, SLOT( OnPasswordChanged(const QString&) ) ); + connect(CheckBox_Both, SIGNAL( stateChanged(int) ), this, SLOT( OnCheckBox_BothChanged(int) ) ); + connect(ButtonChangeEchoMode, SIGNAL( clicked() ), this, SLOT( ChangeEchoModeDatabaseKey() ) ); + connect(Edit_Password, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); + connect(Edit_PasswordRep, SIGNAL( returnPressed() ), this, SLOT( OnOK() ) ); + connect(ButtonExit, SIGNAL( clicked()),this,SLOT(OnButtonExit())); + connect(BookmarkMenu,SIGNAL(triggered(QAction*)),this,SLOT(OnBookmarkTriggered(QAction*))); + + ButtonExit->setVisible(IsAuto); Mode_Set=ChangeKeyMode; if(!ChangeKeyMode){ Edit_PasswordRep->hide(); @@ -342,3 +376,18 @@ void CPasswordDialog::OnButtonExit(){ done(2); } +void CPasswordDialog::paintEvent(QPaintEvent* event){ + QDialog::paintEvent(event); + QPainter painter(this); + painter.setClipRegion(event->region()); + painter.drawPixmap(QPoint(0,0),BannerPixmap); +} + +void CPasswordDialog::OnBookmarkTriggered(QAction* action){ + BookmarkFilename=action->data().toString(); + if(action->data().toString()==QString()) + setWindowTitle(LastFile); + else + setWindowTitle(action->data().toString()); + Label_Bookmark->setText(action->text()); +} diff --git a/src/dialogs/PasswordDlg.h b/src/dialogs/PasswordDlg.h index fef9f8f..d3e723a 100755 --- a/src/dialogs/PasswordDlg.h +++ b/src/dialogs/PasswordDlg.h @@ -23,6 +23,8 @@ #include "main.h" #include "lib/UrlLabel.h" #include "Database.h" +#include +#include class CPasswordDialog : public QDialog, public Ui_PasswordDlg @@ -32,17 +34,21 @@ class CPasswordDialog : public QDialog, public Ui_PasswordDlg private: bool Mode_Set; //true = Set, false = Get IDatabase* db; + QPixmap BannerPixmap; void setStatePasswordOnly(); void setStateKeyFileOnly(); void setStateBoth(); bool doAuth(); + virtual void paintEvent(QPaintEvent*); + QString LastFile; public: QString keyfile; QString password; + QString BookmarkFilename; tKeyType KeyType; bool OverwriteKeyFile; - CPasswordDialog(QWidget* parent,IDatabase* DB,bool ShowExitButton = false, bool KeyMode_Set=false); + CPasswordDialog(QWidget* parent,QString filename,IDatabase* DB,bool ShowExitButton = false, bool KeyMode_Set=false); public slots: void OnOK(); @@ -55,6 +61,7 @@ class CPasswordDialog : public QDialog, public Ui_PasswordDlg void OnCheckBox_BothChanged(int state); void ChangeEchoModeDatabaseKey(); void OnComboTextChanged(const QString&); + void OnBookmarkTriggered(QAction* action); }; #endif diff --git a/src/dialogs/SettingsDlg.cpp b/src/dialogs/SettingsDlg.cpp index fe30da4..376e4e4 100755 --- a/src/dialogs/SettingsDlg.cpp +++ b/src/dialogs/SettingsDlg.cpp @@ -103,6 +103,9 @@ CSettingsDlg::CSettingsDlg(QWidget* parent):QDialog(parent,Qt::Dialog) SpinBox_ClipboardTime->setValue(config->clipboardTimeOut()); CheckBox_ShowPasswords->setChecked(config->showPasswords()); CheckBox_ShowPasswords_PasswordDlg->setChecked(config->showPasswordsPasswordDlg()); + + //Features + CheckBox_FeatureBookmarks->setChecked(config->featureBookmarks()); //Desktop Integration @@ -186,7 +189,6 @@ void CSettingsDlg::apply(){ config->setShowSysTrayIcon(checkBox_ShowSysTrayIcon->isChecked()); config->setMinimizeToTray(checkBox_MinimizeToTray->isChecked()); config->setSaveFileDlgHistory(checkBox_SaveFileDlgHistory->isChecked()); - config->setEnableBookmarkMenu(checkBox_EnableBookmarkMenu->isChecked()); if(Radio_GroupTreeRestore->isChecked())config->setGroupTreeState(KpxConfig::RestoreLast); else if(Radio_GroupTreeExpand->isChecked())config->setGroupTreeState(KpxConfig::ExpandAll); else config->setGroupTreeState(KpxConfig::DoNothing); @@ -204,6 +206,9 @@ void CSettingsDlg::apply(){ config->setClipboardTimeOut(SpinBox_ClipboardTime->value()); config->setShowPasswords(CheckBox_ShowPasswords->isChecked()); config->setShowPasswordsPasswordDlg(CheckBox_ShowPasswords_PasswordDlg->isChecked()); + + //Features + config->setFeatureBookmarks(CheckBox_FeatureBookmarks->isChecked()); //Desktop Integration PluginsModified=Label_IntPlugin_Info->isVisible(); diff --git a/src/forms/AboutDlg.ui b/src/forms/AboutDlg.ui index 2ce6d81..2883a64 100644 --- a/src/forms/AboutDlg.ui +++ b/src/forms/AboutDlg.ui @@ -10,9 +10,7 @@ - - 0 - 0 + 0 0 @@ -33,12 +31,21 @@ About - - 9 - 6 + + 9 + + + 9 + + + 9 + + + 9 + @@ -65,12 +72,21 @@ About - - 9 - 6 + + 9 + + + 9 + + + 9 + + + 9 + @@ -80,12 +96,21 @@ - - 0 - 6 + + 0 + + + 0 + + + 0 + + + 0 + @@ -104,12 +129,21 @@ - - 0 - 12 + + 0 + + + 0 + + + 0 + + + 0 + @@ -130,9 +164,9 @@ - Copyright (C) 2005 - 2006 Tarek Saidi + Copyright (C) 2005 - 2007 KeePassX Team KeePassX is distributed under the terms of the -General Public License (GPL) version 2 or later. +General Public License (GPL) version 2. @@ -147,12 +181,21 @@ General Public License (GPL) version 2 or later. Credits - - 9 - 6 + + 9 + + + 9 + + + 9 + + + 9 + @@ -167,12 +210,21 @@ General Public License (GPL) version 2 or later. Translation - - 9 - 6 + + 9 + + + 9 + + + 9 + + + 9 + @@ -187,12 +239,21 @@ General Public License (GPL) version 2 or later. License - - 9 - 6 + + 9 + + + 9 + + + 9 + + + 9 + diff --git a/src/forms/AddBookmarkDlg.ui b/src/forms/AddBookmarkDlg.ui new file mode 100644 index 0000000..e2897f6 --- /dev/null +++ b/src/forms/AddBookmarkDlg.ui @@ -0,0 +1,58 @@ + + AddBookmarkDlg + + + + 0 + 0 + 497 + 148 + + + + Add Bookmark + + + + + + + + Title: + + + + + + + + + + File: + + + + + + + + + + Browse... + + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + + + + + + + + diff --git a/src/forms/MainWindow.ui b/src/forms/MainWindow.ui index 4d30a94..9871057 100644 --- a/src/forms/MainWindow.ui +++ b/src/forms/MainWindow.ui @@ -143,9 +143,15 @@ &Import from... + + + + Bookmarks + + @@ -237,6 +243,11 @@ + + + Manage Bookmarks... + + &Open Database... @@ -544,6 +555,16 @@ Recycle Bin... + + + Add Bookmark... + + + + + Bookmark this Database... + + diff --git a/src/forms/ManageBookmarksDlg.ui b/src/forms/ManageBookmarksDlg.ui new file mode 100644 index 0000000..fa81c67 --- /dev/null +++ b/src/forms/ManageBookmarksDlg.ui @@ -0,0 +1,69 @@ + + ManageBookmarksDlg + + + + 0 + 0 + 452 + 360 + + + + Manage Bookmarks + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 161 + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + diff --git a/src/forms/PasswordDlg.ui b/src/forms/PasswordDlg.ui index 97ed2b1..a8f6dc8 100644 --- a/src/forms/PasswordDlg.ui +++ b/src/forms/PasswordDlg.ui @@ -1,7 +1,4 @@ - - - PasswordDlg @@ -13,9 +10,7 @@ - - 0 - 0 + 0 0 @@ -41,293 +36,342 @@ true - - - - 0 - 0 - 578 - 50 - - - - - 5 - 5 - 0 - 0 - - - - TextLabel - - - - - - 10 - 240 - 561 - 31 - - - - - 0 - - - 6 - - - - - Qt::Horizontal - - - - 351 - 20 - - - - - - - - OK - - - - - - - Cancel - - - - - - - Exit - - - - - - - - - 10 - 80 - 561 - 151 - - - - - 7 - 7 - 0 - 0 - - - - Key - - - - - 10 - 20 - 541 - 123 - - - - - 0 - - - 6 - + + + - - - 0 + + + Qt::Vertical - - 6 + + QSizePolicy::Fixed + + + + 20 + 50 + + + + + + + + Qt::Horizontal - - + + + 40 + 20 + + + + + + + + - Password Repet.: + Last File - - - - - - - - 5 - 5 - 0 - 0 - + + + + QToolButton::InstantPopup - - Password: + + Qt::NoArrow - - - - ... - - - - - - - - - - 0 - + + + + + + + 0 + 0 + + + + Enter a Password and/or choose a key file. + + + + + + + + 0 + 0 + + + + Key + + + + + 10 + 20 + 541 + 124 + + + 6 + + 0 + + + 0 + + + 0 + + + 0 + - - - - 5 - 5 - 0 - 0 - + + + 0 - - Key file or directory: + + 0 - - - - - - - 7 - 0 - 0 - 0 - + + 0 - - true + + 0 - + + 6 + + + 6 + + + + + Password Repet.: + + + + + + + + + + + 0 + 0 + + + + Password: + + + + + + + ... + + + + + + + - - - - 5 - 0 - 0 - 0 - + + + 6 - - &Browse... + + 0 - - Alt+B + + 0 - - - - - - - - 0 - - - 6 - - - - - - 0 - 0 - 0 - 0 - + + 0 - - Use Password AND Key File + + 0 - + + + + + 0 + 0 + + + + Key file or directory: + + + + + + + + 0 + 0 + + + + true + + + + + + + + 0 + 0 + + + + &Browse... + + + Alt+B + + + + - - - Qt::Horizontal + + + 6 + + + 0 + + + 0 - - - 40 - 20 - + + 0 - + + 0 + + + + + + 0 + 0 + + + + Use Password AND Key File + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 351 + 20 + + + + + + + + OK + + + + + + + Cancel + + + + + + + Exit + + - - - - - - 10 - 60 - 459 - 16 - - - - - 7 - 4 - 0 - 0 - - - - Enter a Password and/or choose a key file. - - + + - Edit_Password Edit_PasswordRep Combo_Dirs - CheckBox_Both - ButtonChangeEchoMode ButtonBrowse + CheckBox_Both ButtonOK ButtonCancel ButtonExit + Button_Bookmarks + ButtonChangeEchoMode diff --git a/src/forms/SettingsDlg.ui b/src/forms/SettingsDlg.ui index b0dba08..7e39081 100644 --- a/src/forms/SettingsDlg.ui +++ b/src/forms/SettingsDlg.ui @@ -846,7 +846,7 @@ - + Bookmarks diff --git a/src/lib/EntryView.cpp b/src/lib/EntryView.cpp index 2e6daf2..8c267ac 100644 --- a/src/lib/EntryView.cpp +++ b/src/lib/EntryView.cpp @@ -462,7 +462,6 @@ void KeepassEntryView::OnColumnMoved(int LogIndex,int OldVisIndex,int NewVisInde } int KeepassEntryView::logicalColIndex(int LstIndex){ - qDebug("%i",LstIndex); int c=-1; for(int i=0;i +#include "bookmarks.h" +#include "main.h" +#define CSTR(x)(x.toUtf8().data()) + +QList KpxBookmarks::Bookmarks; +QString KpxBookmarks::filename; + +bool KpxBookmarks::load(const QString& _filename){ + /* + Fileformat: + "Title1" "Path1"\n + "Title2" "Path2"\n + ... + */ + + filename=_filename; + QFile file(filename); + if(!file.exists()){ + return true; + } + if(!file.open(QIODevice::ReadOnly)){ + qWarning("Reading bookmarks failed: %s",CSTR(decodeFileError(file.error()))); + return false; + } + QString content=QString::fromUtf8(file.readAll()); + file.close(); + content.replace("\r",""); + QStringList lines=content.split("\n"); + for(int i=0;i order){ + QList NewList; + for(int i=0;i +#include + +class KpxBookmarks { + public: + static bool load(const QString& file); + static int add(const QString& Title,const QString& Path); + static void remove(int id); + static void edit(const QString& Title,const QString& Path, int Index); + static int count(); + static void resort(QList order); + static QString title(int Index); + static QString path(int Index); + private: + static bool save(); + class BookmarkEntry { + public: + QString Title; + QString Path; + int Index; + }; + static QList Bookmarks; + static QString filename; + +}; + + +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e6b714a..3be4dcd 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,6 +43,7 @@ #include "main.h" #include "lib/FileDialogs.h" +#include "lib/bookmarks.h" #include "KpxConfig.h" #include "Kdb3Database.h" #include "mainwindow.h" @@ -216,6 +217,7 @@ int main(int argc, char **_argv) else loadDefaultDetailViewTemplate(); loadImages(); + KpxBookmarks::load(QDir::homePath()+"/.keepassx/bookmarks"); initYarrow(); //init random number generator SecString::generateSessionKey(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 9e6f303..4e299e6 100755 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -42,6 +42,7 @@ #include "lib/random.h" #include "lib/AutoType.h" #include "lib/FileDialogs.h" +#include "lib/bookmarks.h" #include "import/Import_PwManager.h" #include "import/Import_KWalletXml.h" #include "import/Import_KeePassX_Xml.h" @@ -59,13 +60,11 @@ #include "dialogs/CustomizeDetailViewDlg.h" #include "dialogs/ExpiredEntriesDlg.h" #include "dialogs/TrashCanDlg.h" +#include "dialogs/AddBookmarkDlg.h" +#include "dialogs/ManageBookmarksDlg.h" -//#include #include -//QDBusServer* dbusServer; -//QDBusConnection* dbusCon; - Import_KeePassX_Xml import_KeePassX_Xml; Import_PwManager import_PwManager; Import_KWalletXml import_KWalletXml; @@ -116,21 +115,8 @@ KeepassMainWindow::KeepassMainWindow(const QString& ArgFile,QWidget *parent, Qt: } HelpBrowser = new QAssistantClient(QString(),this); HelpBrowser->setArguments(QStringList()<< "-profile" << "/home/tarek/Documents/KeePassX/share/keepass/doc/keepassx.adp"); - - // DBus Server of Qt 4.2 does not work - 4.3 snapshot seems to work fine - /* - //dbusServer=new QDBusServer("unix:path=/tmp/KpxBus",this); - //qDebug("DBUS: %s",dbusServer->lastError().message().toAscii().data()); - //QDBusConnection::connectToBus("unix:path=/tmp/KpxBus","MyKpxConnection"); - //qDebug("DBUS: %s",dbusCon->lastError().message().toAscii().data()); - - KpxFirefox* fox=new KpxFirefox(NULL); - new KpxFirefoxAdaptor(fox); - QDBusConnection::sessionBus().registerService("org.keepassx.firefoxservice"); - QDBusConnection::sessionBus().registerObject("/KpxFirefox",fox); - qDebug("DBUS: %s",QDBusConnection::sessionBus().lastError().message().toAscii().data()); - */ - + + createBookmarkActions(); } void KeepassMainWindow::setupConnections(){ @@ -145,6 +131,7 @@ void KeepassMainWindow::setupConnections(){ connect(FileUnLockWorkspaceAction,SIGNAL(triggered()), this, SLOT(OnUnLockWorkspace())); connect(menuImport,SIGNAL(triggered(QAction*)),this,SLOT(OnImport(QAction*))); connect(menuExport,SIGNAL(triggered(QAction*)),this,SLOT(OnExport(QAction*))); + connect(menuBookmarks,SIGNAL(triggered(QAction*)),this,SLOT(OnBookmarkTriggered(QAction*))); connect(EditNewGroupAction, SIGNAL(triggered()), GroupView, SLOT(OnNewGroup())); connect(EditEditGroupAction, SIGNAL(triggered()), GroupView, SLOT(OnEditGroup())); @@ -252,6 +239,10 @@ void KeepassMainWindow::setupIcons(){ EditAutoTypeAction->setIcon(getIcon("autotype")); HelpHandbookAction->setIcon(getIcon("manual")); HelpAboutAction->setIcon(getIcon("help")); + menuBookmarks->menuAction()->setIcon(getIcon("bookmark_folder")); + AddThisAsBookmarkAction->setIcon(getIcon("bookmark")); + AddBookmarkAction->setIcon(getIcon("bookmark_add")); + ManageBookmarksAction->setIcon(getIcon("bookmark_edit")); SysTray->setIcon(getIcon("keepassx_large")); if(config->showSysTrayIcon()) SysTray->show(); @@ -350,6 +341,7 @@ void KeepassMainWindow::setupMenus(){ #endif ExtrasTrashCanAction->setVisible(false); //For KP 2.x only + menuBookmarks->menuAction()->setVisible(config->featureBookmarks()); } void KeepassMainWindow::setupDatabaseConnections(IDatabase* DB){ @@ -367,12 +359,14 @@ void KeepassMainWindow::openDatabase(QString filename,bool IsAuto){ config->setLastKeyLocation(QString()); config->setLastKeyType(PASSWORD);} db=dynamic_cast(new Kdb3Database()); - CPasswordDialog PasswordDlg(this,db,IsAuto,false); - PasswordDlg.setWindowTitle(filename); + CPasswordDialog PasswordDlg(this,filename,db,IsAuto,false); switch(PasswordDlg.exec()){ case 0: return; case 2: Start=false; return; } + if(PasswordDlg.BookmarkFilename!=QString()) + filename=PasswordDlg.BookmarkFilename; + GroupView->db=db; EntryView->db=db; setupDatabaseConnections(db); @@ -432,7 +426,7 @@ bool KeepassMainWindow::closeDatabase(){ void KeepassMainWindow::OnFileNewKdb(){ IDatabase* db_new=dynamic_cast(new Kdb3Database()); db_new->create(); - CPasswordDialog dlg(this,db_new,false,true); + CPasswordDialog dlg(this,QString(),db_new,false,true); dlg.setWindowTitle(tr("New Database")); if(dlg.exec()==1){ if(FileOpen) @@ -495,6 +489,7 @@ EntryView->setEnabled(IsOpen); DetailView->setEnabled(IsOpen); QuickSearchEdit->setEnabled(IsOpen); ExtrasShowExpiredEntriesAction->setEnabled(IsOpen); +AddThisAsBookmarkAction->setEnabled(IsOpen); if(!IsOpen){ EditNewGroupAction->setEnabled(false); @@ -756,7 +751,7 @@ if(dlg.exec())setStateFileModified(true); } void KeepassMainWindow::OnFileChangeKey(){ - CPasswordDialog dlg(this,db,false,true); + CPasswordDialog dlg(this,QString(),db,false,true); if(dlg.exec()) setStateFileModified(true); } @@ -777,7 +772,7 @@ void KeepassMainWindow::OnImport(QAction* action){ IDatabase* tmpdb=dynamic_cast(new Kdb3Database()); tmpdb->create(); if(dynamic_cast(action->data().value())->importDatabase(this,tmpdb)){ - CPasswordDialog dlg(this,tmpdb,false,true); + CPasswordDialog dlg(this,QString(),tmpdb,false,true); dlg.setWindowTitle(tr("Set Master Key")); if(!dlg.exec()){ delete tmpdb; @@ -890,6 +885,7 @@ void KeepassMainWindow::OnExtrasSettings(){ if(dlg.exec()==QDialog::Accepted){ EntryView->setAlternatingRowColors(config->alternatingRowColors()); SysTray->setVisible(config->showSysTrayIcon()); + menuBookmarks->menuAction()->setVisible(config->featureBookmarks()); } } @@ -1029,3 +1025,55 @@ void KeepassMainWindow::OnUnLockWorkspace(){ IsLocked=true; } } + +void KeepassMainWindow::OnBookmarkTriggered(QAction* action){ + if(action==AddBookmarkAction){ + AddBookmarkDlg dlg(this); + if(dlg.exec()){ + int id=dlg.ItemID; + QAction* action=new QAction(this); + action->setData(id); + action->setText(KpxBookmarks::title(id)); + action->setIcon(getIcon("document")); + menuBookmarks->addAction(action); + } + return; + } + + if(action==ManageBookmarksAction){ + ManageBookmarksDlg dlg(this); + dlg.exec(); + menuBookmarks->clear(); + createBookmarkActions(); + return; + } + + if(action==AddThisAsBookmarkAction){ + AddBookmarkDlg dlg(this,db->file()->fileName()); + if(dlg.exec()){ + int id=dlg.ItemID; + QAction* action=new QAction(this); + action->setData(id); + action->setText(KpxBookmarks::title(id)); + action->setIcon(getIcon("document")); + menuBookmarks->addAction(action); + } + return; + } + openDatabase(KpxBookmarks::path(action->data().toInt())); + +} + +void KeepassMainWindow::createBookmarkActions(){ + menuBookmarks->addAction(AddBookmarkAction); + menuBookmarks->addAction(AddThisAsBookmarkAction); + menuBookmarks->addAction(ManageBookmarksAction); + menuBookmarks->addSeparator(); + for(int i=0;isetData(i); + action->setText(KpxBookmarks::title(i)); + action->setIcon(getIcon("document")); + menuBookmarks->addAction(action); + } +} diff --git a/src/mainwindow.h b/src/mainwindow.h index 8666ffb..9c687da 100755 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -69,6 +69,7 @@ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ void OnFileSettings(); void OnFileChangeKey(); void OnFileExit(); + void OnBookmarkTriggered(QAction* action); void OnSearch(); void OnGroupSearch(); void OnViewShowToolbar(bool); @@ -120,6 +121,7 @@ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ void updateDetailView(); void exportDatabase(IExport* exporter,QStringList filters); void saveLastFilename(const QString& filename); + void createBookmarkActions(); QLineEdit* QuickSearchEdit; QLabel* StatusBarGeneral; QLabel* StatusBarSelection; diff --git a/src/src.pro b/src/src.pro index 27ccdac..8f70b6b 100755 --- a/src/src.pro +++ b/src/src.pro @@ -14,20 +14,24 @@ INSTALLS += target data data.files += ../share/keepass/* TARGET = ../bin/keepassx -unix: !macx{ +isEmpty(PREFIX){ + PREFIX = /usr +} + +unix : !macx { target.path = $${PREFIX}/bin data.path = $${PREFIX}/share/keepass LIBS += -lXtst -lQtDBus SOURCES += lib/AutoType_X11.cpp } -macx{ +macx { target.path = /Applications data.path = /Applications/keepass.app/Contents/share/keepass SOURCES += lib/AutoType_X11.cpp } -win32{ +win32 { SOURCES += lib/AutoType_Win.cpp TARGET = ../$$TARGET QMAKE_LINK_OBJECT_SCRIPT = ../build/$$QMAKE_LINK_OBJECT_SCRIPT @@ -50,7 +54,9 @@ FORMS += forms/EditGroupDlg.ui \ forms/CalendarDlg.ui \ forms/TrashCanDlg.ui \ forms/ExpiredEntriesDlg.ui \ - forms/WorkspaceLockedWidget.ui + forms/WorkspaceLockedWidget.ui \ + forms/AddBookmarkDlg.ui \ + forms/ManageBookmarksDlg.ui TRANSLATIONS += translations/keepass-de_DE.ts \ translations/keepass-ru_RU.ts \ translations/keepass-es_ES.ts \ @@ -113,7 +119,10 @@ HEADERS += lib/IniReader.h \ plugins/interfaces/IGnomeInit.h \ plugins/interfaces/IIconTheme.h \ KpxConfig.h \ - KpxFirefox.h + KpxFirefox.h \ + dialogs/AddBookmarkDlg.h \ + lib/bookmarks.h \ + dialogs/ManageBookmarksDlg.h SOURCES += lib/UrlLabel.cpp \ main.cpp \ mainwindow.cpp \ @@ -161,7 +170,10 @@ SOURCES += lib/UrlLabel.cpp \ crypto/yarrow.cpp \ lib/WaitAnimationWidget.cpp \ KpxConfig.cpp \ - KpxFirefox.cpp + KpxFirefox.cpp \ + dialogs/AddBookmarkDlg.cpp \ + lib/bookmarks.cpp \ +dialogs/ManageBookmarksDlg.cpp RESOURCES += res/resources.qrc MOC_DIR = ../build/moc UI_DIR = ../build/ui @@ -171,9 +183,8 @@ CONFIG += debug \ qt \ thread \ warn_off \ -dbus \ assistant -QT += dbus xml +QT += xml TEMPLATE = app INCLUDEPATH += . \ lib \