new config system

git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@133 b624d157-de02-0410-bad0-e51aec6abb33
This commit is contained in:
tarek_saidi
2007-06-27 16:30:45 +00:00
parent 9b25cc235d
commit 9dc8f878b5
28 changed files with 1357 additions and 1063 deletions

View File

@@ -29,46 +29,29 @@
#include <QApplication>
#include <QPainter>
#include <QPair>
#include <QMessageBox>
#include "main.h"
#include "PwmConfig.h"
#include "KpxConfig.h"
#include "EntryView.h"
#include "dialogs/EditEntryDlg.h"
#include "lib/AutoType.h"
// just for the lessThan funtion
QList<EntryViewItem*>* pItems;
KeepassEntryView* pEntryView;
KeepassEntryView::KeepassEntryView(QWidget* parent):QTreeWidget(parent){
AutoResizeColumns=true;
AutoResizeColumns=true;
header()->setResizeMode(QHeaderView::Interactive);
header()->setStretchLastSection(false);
header()->setClickable(true);
header()->setCascadingSectionResizes(true);
ColumnSizes.resize(NUM_COLUMNS);
QStringList ColumnSizeConfig=settings->value("Ui/ColumnSizes",QStringList()<<"1"<<"1"<<"1"<<"1"<<"1"<<"1"<<"1"<<"1"<<"1"<<"1"<<"1").toStringList();
for(int i=0;i<NUM_COLUMNS;i++)
ColumnSizes[i]=(float)ColumnSizeConfig[i].toInt();
QStringList DefaultColumnConfig=QStringList()<<"1"<<"1"<<"1"<<"1"<<"1"<<"0"<<"0"<<"0"<<"0"<<"0"<<"1";
QStringList ColumnConfig=settings->value("Ui/ShowColumns",DefaultColumnConfig).toStringList();
Columns.resize(NUM_COLUMNS);
if(ColumnConfig.size()<NUM_COLUMNS)ColumnConfig=DefaultColumnConfig;
for(int i=0;i<ColumnConfig.size();i++){
Columns[i]=(bool)ColumnConfig[i].toInt();
}
ColumnOrder.resize(NUM_COLUMNS);
QStringList ColumnOrderConfig=settings->value("Ui/ColumnOrder",QStringList()<<"100"<<"100"<<"100"<<"100"<<"100"<<"100"<<"100"<<"100"<<"100"<<"100"<<"100").toStringList();
for(int i=0;i<NUM_COLUMNS;i++){
if(i<ColumnOrderConfig.size()){
ColumnOrder[i]=ColumnOrderConfig[i].toInt();
}
else
ColumnOrder[i]=100;
}
ColumnSizes=config->columnSizes();
Columns=config->columns();
ColumnOrder=config->columnOrder();
updateColumns();
connect(header(),SIGNAL(sectionResized(int,int,int)),this,SLOT(OnColumnResized(int,int,int)));
connect(this,SIGNAL(itemSelectionChanged()),this,SLOT(OnItemsChanged()));
connect(&ClipboardTimer, SIGNAL(timeout()), this, SLOT(OnClipboardTimeOut()));
@@ -76,31 +59,16 @@ KeepassEntryView::KeepassEntryView(QWidget* parent):QTreeWidget(parent){
connect(header(),SIGNAL(sectionMoved(int,int,int)),this,SLOT(OnColumnMoved(int,int,int)));
Clipboard=QApplication::clipboard();
ContextMenu=new QMenu(this);
setAlternatingRowColors(config.AlternatingRowColors);
setAlternatingRowColors(config->alternatingRowColors());
pItems=&Items;
pEntryView=this;
}
KeepassEntryView::~KeepassEntryView(){
QStringList ColumnSizesConfig;
for(int i=0;i<ColumnSizes.size();i++){
ColumnSizesConfig<<QString::number((int)(ColumnSizes[i]));
}
settings->setValue("Ui/ColumnSizes",ColumnSizesConfig);
QStringList ColumnConfig;
for(int i=0;i<Columns.size();i++){
if(Columns[i])
ColumnConfig<<"1";
else
ColumnConfig<<"0";
}
settings->setValue("Ui/ShowColumns",ColumnConfig);
QStringList ColumnOrderConfig;
for(int i=0;i<NUM_COLUMNS;i++){
ColumnOrderConfig << QString::number(ColumnOrder[i]);
}
settings->setValue("Ui/ColumnOrder",ColumnOrderConfig);
config->setColumnSizes(ColumnSizes);
config->setColumns(Columns);
config->setColumnOrder(ColumnOrder);
}
void KeepassEntryView::OnGroupChanged(IGroupHandle* group){
@@ -110,7 +78,7 @@ void KeepassEntryView::OnGroupChanged(IGroupHandle* group){
void KeepassEntryView::OnShowSearchResults(){
CurrentGroup=NULL;
showSearchResults();
showSearchResults();
}
@@ -119,7 +87,7 @@ void KeepassEntryView::OnItemsChanged(){
case 0: emit selectionChanged(NONE);
break;
case 1: emit selectionChanged(SINGLE);
break;
break;
default:emit selectionChanged(MULTIPLE);
}
}
@@ -128,10 +96,10 @@ bool sortSearchResultsLessThan(const IEntryHandle* a, const IEntryHandle* b){
int indexA=0;
int indexB=0;
for(indexA;indexA<pItems->size();indexA++){
if((*pItems)[indexA]->EntryHandle==a)break;
if((*pItems)[indexA]->EntryHandle==a)break;
}
for(indexB;indexB<pItems->size();indexB++){
if((*pItems)[indexB]->EntryHandle==b)break;
if((*pItems)[indexB]->EntryHandle==b)break;
}
return pEntryView->indexOfTopLevelItem((*pItems)[indexA])<pEntryView->indexOfTopLevelItem((*pItems)[indexB]);
}
@@ -145,12 +113,12 @@ void KeepassEntryView::OnHeaderSectionClicked(int index){
else{
header()->setSortIndicator(index,Qt::AscendingOrder);
header()->setSortIndicatorShown(true);
sortItems(index,Qt::AscendingOrder);
sortItems(index,Qt::AscendingOrder);
}
if(ViewMode==Normal){
for(int i=0;i<Items.size();i++){
Items[i]->EntryHandle->setVisualIndexDirectly(indexOfTopLevelItem(Items[i]));
Items[i]->EntryHandle->setVisualIndexDirectly(indexOfTopLevelItem(Items[i]));
}
}
else if(ViewMode==ShowSearchResults){
@@ -158,16 +126,16 @@ void KeepassEntryView::OnHeaderSectionClicked(int index){
qSort(SearchResults.begin(),SearchResults.end(),sortSearchResultsLessThan);
else
qSort(SearchResults.end(),SearchResults.begin(),sortSearchResultsLessThan);
}
}
void KeepassEntryView::OnSaveAttachment(){
Q_ASSERT(selectedItems().size()==1);
CEditEntryDlg::saveAttachment(((EntryViewItem*)selectedItems()[0])->EntryHandle,this);
CEditEntryDlg::saveAttachment(((EntryViewItem*)selectedItems().first())->EntryHandle,this);
}
void KeepassEntryView::OnCloneEntry(){
void KeepassEntryView::OnCloneEntry(){
QList<QTreeWidgetItem*> entries=selectedItems();
for(int i=0; i<entries.size();i++){
Items.append(new EntryViewItem(this));
@@ -180,6 +148,17 @@ void KeepassEntryView::OnCloneEntry(){
void KeepassEntryView::OnDeleteEntry(){
QList<QTreeWidgetItem*> entries=selectedItems();
if(config->askBeforeDelete()){
QString text;
if(entries.size()==1)
text=tr("Are you sure you want delete this entry?");
else
text=tr("Are you sure you want delete these %1 entries?").arg(entries.size());
if(QMessageBox::question(this,tr("Delete?"),text,QMessageBox::Yes | QMessageBox::No,QMessageBox::No)==QMessageBox::No)
return;
}
for(int i=0; i<entries.size();i++){
db->deleteEntry(((EntryViewItem*)entries[i])->EntryHandle);
Items.removeAt(Items.indexOf((EntryViewItem*)entries[i]));
@@ -193,18 +172,18 @@ void KeepassEntryView::OnDeleteEntry(){
void KeepassEntryView::updateEntry(EntryViewItem* item){
IEntryHandle* entry = item->EntryHandle;
int j=0;
if(Columns[0]){
if(Columns.at(0)){
item->setText(j++,entry->title());
item->setIcon(0,db->icon(entry->image()));
}
if(Columns[1]){
if(config.ListView_HideUsernames)
if (Columns.at(1)){
if(config->hideUsernames())
item->setText(j++,"******");
else
item->setText(j++,entry->username());}
if(Columns[2]){item->setText(j++,entry->url());}
if(Columns[3]){
if(config.ListView_HidePasswords)
if (Columns.at(2)){item->setText(j++,entry->url());}
if (Columns.at(3)){
if(config->hidePasswords())
item->setText(j++,"******");
else{
SecString password=entry->password();
@@ -212,21 +191,21 @@ void KeepassEntryView::updateEntry(EntryViewItem* item){
item->setText(j++,password.string());
}
}
if(Columns[4]){
item->setText(j++,entry->comment().section('\n',0,0));}
if(Columns[5]){
if (Columns.at(4)){
item->setText(j++,entry->comment().section('\n',0,0));}
if (Columns.at(5)){
item->setText(j++,entry->expire().dateToString(Qt::LocalDate));}
if(Columns[6]){
if (Columns.at(6)){
item->setText(j++,entry->creation().dateToString(Qt::LocalDate));}
if(Columns[7]){
if (Columns.at(7)){
item->setText(j++,entry->lastMod().dateToString(Qt::LocalDate));}
if(Columns[8]){
if (Columns.at(8)){
item->setText(j++,entry->lastAccess().dateToString(Qt::LocalDate));}
if(Columns[9]){
if (Columns.at(9)){
item->setText(j++,entry->binaryDesc());}
if(Columns[10] && ViewMode==ShowSearchResults){
if(Columns.at(10) && ViewMode==ShowSearchResults){
item->setText(j,entry->group()->title());
item->setIcon(j++,db->icon(entry->group()->image()));}
item->setIcon(j++,db->icon(entry->group()->image()));}
}
void KeepassEntryView::editEntry(EntryViewItem* item){
@@ -238,13 +217,13 @@ void KeepassEntryView::editEntry(EntryViewItem* item){
updateEntry(item);
emit fileModified();
break;
case 2: //entry moved to another group
case 2: //entry moved to another group
delete item;
Items.removeAt(Items.indexOf(item));
Items.removeAt(Items.indexOf(item));
emit fileModified();
break;
}
}
@@ -260,7 +239,7 @@ void KeepassEntryView::OnNewEntry(){
updateEntry(Items.back());
emit fileModified();
}
}
void KeepassEntryView::OnEntryActivated(QTreeWidgetItem* item,int Column){
@@ -274,49 +253,58 @@ void KeepassEntryView::OnEntryActivated(QTreeWidgetItem* item,int Column){
case 3: OnPasswordToClipboard();
break;
}
}
void KeepassEntryView::OnEditEntry(){
Q_ASSERT(selectedItems().size()==1);
editEntry((EntryViewItem*)selectedItems()[0]);
editEntry((EntryViewItem*)selectedItems().first());
}
void KeepassEntryView::OnEditOpenUrl(){
Q_ASSERT(selectedItems().size()==1);
openBrowser(((EntryViewItem*)selectedItems()[0])->text(logicalColIndex(2)));
openBrowser(((EntryViewItem*)selectedItems().first())->text(logicalColIndex(2)));
}
void KeepassEntryView::OnUsernameToClipboard(){
Clipboard->setText(((EntryViewItem*)selectedItems()[0])->EntryHandle->username(), QClipboard::Clipboard);
Clipboard->setText(((EntryViewItem*)selectedItems().first())->EntryHandle->username(), QClipboard::Clipboard);
if(Clipboard->supportsSelection()){
Clipboard->setText(((EntryViewItem*)selectedItems().first())->EntryHandle->username(),QClipboard::Selection);
}
ClipboardTimer.setSingleShot(true);
ClipboardTimer.start(config.ClipboardTimeOut*1000);
ClipboardTimer.start(config->clipboardTimeOut()*1000);
}
void KeepassEntryView::OnPasswordToClipboard(){
SecString password;
password=((EntryViewItem*)selectedItems()[0])->EntryHandle->password();
password=((EntryViewItem*)selectedItems().first())->EntryHandle->password();
password.unlock();
Clipboard->setText(password.string(),QClipboard::Clipboard);
if(Clipboard->supportsSelection()){
Clipboard->setText(password.string(),QClipboard::Selection);
}
ClipboardTimer.setSingleShot(true);
ClipboardTimer.start(config.ClipboardTimeOut*1000);
ClipboardTimer.start(config->clipboardTimeOut()*1000);
}
void KeepassEntryView::OnClipboardTimeOut(){
Clipboard->clear(QClipboard::Clipboard);
if(Clipboard->supportsSelection()){
Clipboard->clear(QClipboard::Selection);
}
}
void KeepassEntryView::contextMenuEvent(QContextMenuEvent* e){
if(itemAt(e->pos())){
EntryViewItem* item=(EntryViewItem*)itemAt(e->pos());
if(selectedItems().size()==0){
if(!selectedItems().size()){
setItemSelected(item,true);
}
else{
if(!isItemSelected(item)){
while(selectedItems().size()){
setItemSelected(selectedItems()[0],false);
setItemSelected(selectedItems().first(),false);
}
setItemSelected(item,true);
}
@@ -324,7 +312,7 @@ void KeepassEntryView::contextMenuEvent(QContextMenuEvent* e){
}
else
{while(selectedItems().size()){
setItemSelected(selectedItems()[0],false);}
setItemSelected(selectedItems().first(),false);}
}
e->accept();
ContextMenu->popup(e->globalPos());
@@ -339,7 +327,7 @@ void KeepassEntryView::resizeEvent(QResizeEvent* e){
void KeepassEntryView::showSearchResults(){
if(ViewMode==Normal){
ViewMode=ShowSearchResults;
if(Columns[10])ColumnOrder[10]--;
if(Columns.at(10))ColumnOrder[10]--;
updateColumns();
}
clear();
@@ -357,7 +345,7 @@ void KeepassEntryView::showGroup(IGroupHandle* group){
Items.clear();
if(group==NULL)return;
QList<IEntryHandle*>entries=db->entries(group);
createItems(entries);
createItems(entries);
}
void KeepassEntryView::createItems(QList<IEntryHandle*>& entries){
@@ -368,17 +356,17 @@ void KeepassEntryView::createItems(QList<IEntryHandle*>& entries){
Items.push_back(item);
Items.back()->EntryHandle=entries[i];
int j=0;
if(Columns[0]){
if (Columns.at(0)){
item->setText(j++,entries[i]->title());
item->setIcon(0,db->icon(entries[i]->image()));}
if(Columns[1]){
if(config.ListView_HideUsernames)
if (Columns.at(1)){
if(config->hideUsernames())
item->setText(j++,"******");
else
item->setText(j++,entries[i]->username());}
if(Columns[2]){item->setText(j++,entries[i]->url());}
if(Columns[3]){
if(config.ListView_HidePasswords)
if (Columns.at(2)){item->setText(j++,entries[i]->url());}
if (Columns.at(3)){
if(config->hidePasswords())
item->setText(j++,"******");
else{
SecString password=entries[i]->password();
@@ -386,19 +374,19 @@ void KeepassEntryView::createItems(QList<IEntryHandle*>& entries){
item->setText(j++,password.string());
}
}
if(Columns[4]){
if (Columns.at(4)){
item->setText(j++,entries[i]->comment().section('\n',0,0));}
if(Columns[5]){
if (Columns.at(5)){
item->setText(j++,entries[i]->expire().dateToString(Qt::LocalDate));}
if(Columns[6]){
if (Columns.at(6)){
item->setText(j++,entries[i]->creation().dateToString(Qt::LocalDate));}
if(Columns[7]){
if (Columns.at(7)){
item->setText(j++,entries[i]->lastMod().dateToString(Qt::LocalDate));}
if(Columns[8]){
if (Columns.at(8)){
item->setText(j++,entries[i]->lastAccess().dateToString(Qt::LocalDate));}
if(Columns[9]){
if (Columns.at(9)){
item->setText(j++,entries[i]->binaryDesc());}
if(Columns[10] && ViewMode==ShowSearchResults){
if(Columns.at(10) && ViewMode==ShowSearchResults){
item->setText(j,entries[i]->group()->title());
item->setIcon(j++,db->icon(entries[i]->group()->image()));}
}
@@ -406,8 +394,8 @@ void KeepassEntryView::createItems(QList<IEntryHandle*>& entries){
void KeepassEntryView::updateIcons(){
for(int i=0;i<Items.size();i++){
Items[i]->setIcon(0,db->icon(Items[i]->EntryHandle->image()));
}
Items[i]->setIcon(0,db->icon(Items[i]->EntryHandle->image()));
}
}
@@ -418,44 +406,45 @@ void KeepassEntryView::setEntry(IEntryHandle* entry){
void KeepassEntryView::updateColumns(){
setColumnCount(0);
QStringList cols;
if(Columns[0]){
cols << tr("Title");}
if(Columns[1]){
cols << tr("Username");}
if(Columns[2]){
cols << tr("URL");}
if(Columns[3]){
cols << tr("Password");}
if(Columns[4]){
cols << tr("Comments");}
if(Columns[5]){
cols << tr("Expires");}
if(Columns[6]){
cols << tr("Creation");}
if(Columns[7]){
cols << tr("Last Change");}
if(Columns[8]){
cols << tr("Last Access");}
if(Columns[9]){
cols << tr("Attachment");}
if(Columns[10] && ViewMode==ShowSearchResults){
cols << tr("Group");}
if (Columns.at(0)){
cols << tr("Title");}
if (Columns.at(1)){
cols << tr("Username");}
if (Columns.at(2)){
cols << tr("URL");}
if (Columns.at(3)){
cols << tr("Password");}
if (Columns.at(4)){
cols << tr("Comments");}
if (Columns.at(5)){
cols << tr("Expires");}
if (Columns.at(6)){
cols << tr("Creation");}
if (Columns.at(7)){
cols << tr("Last Change");}
if (Columns.at(8)){
cols << tr("Last Access");}
if (Columns.at(9)){
cols << tr("Attachment");}
if(Columns.at(10) && ViewMode==ShowSearchResults){
cols << tr("Group");}
setHeaderLabels(cols);
for(int i=0;i<NUM_COLUMNS;i++){
if(!Columns[i])ColumnOrder[i]=100;
if(!Columns.at(i))
ColumnOrder[i]=100;
}
QMap<int,int> Order;
for(int i=NUM_COLUMNS-1;i>=0;i--)
Order.insertMulti(ColumnOrder[i],i);
Order.insertMulti(ColumnOrder.at(i),i);
QMapIterator<int, int> i(Order);
while (i.hasNext()) {
i.next();
int index=i.value();
if(!Columns[index])continue;
header()->moveSection(header()->visualIndex(logicalColIndex(index)),header()->count()-1);
if(!Columns.at(index))continue;
header()->moveSection(header()->visualIndex(logicalColIndex(index)),header()->count()-1);
}
resizeColumns();
@@ -469,61 +458,63 @@ void KeepassEntryView::refreshItems(){
void KeepassEntryView::OnColumnMoved(int LogIndex,int OldVisIndex,int NewVisIndex){
for(int i=0;i<header()->count();i++){
ColumnOrder[columnListIndex(header()->logicalIndex(i))]=i;
}
}
}
int KeepassEntryView::logicalColIndex(int LstIndex){
qDebug("%i",LstIndex);
int c=-1;
for(int i=0;i<NUM_COLUMNS;i++){
if(Columns[i])c++;
if(i==10 && Columns[10] && ViewMode!=ShowSearchResults)c--;
if(i==LstIndex)return c;
if(Columns.at(i))c++;
if(i==10 && Columns.at(10) && ViewMode!=ShowSearchResults)c--;
if(i==LstIndex)return c;
}
Q_ASSERT(false);
Q_ASSERT(false);
}
void KeepassEntryView::resizeColumns(){
void KeepassEntryView::resizeColumns(){
AutoResizeColumns=false;
int w=viewport()->width();
int sum=0;
for(int i=0;i<NUM_COLUMNS;i++){
// if(i==10) continue; //skip "Group" column
if(!Columns[i])ColumnSizes[i]=0;
if(Columns[i] && ColumnSizes[i]==0)ColumnSizes[i]=0.1f*(float)w;
if(!Columns.at(i))
ColumnSizes[i]=0;
if(Columns.at(i) && !ColumnSizes.at(i))
ColumnSizes[i]=w/10;
}
for(int i=0;i<header()->count();i++){
sum+=ColumnSizes[columnListIndex(i)];
sum+=ColumnSizes.at(columnListIndex(i));
}
float stretch=((float)w)/((float)sum);
sum=0;
for(int i=0;i<header()->count();i++){
int lstIndex=columnListIndex(header()->logicalIndex(i));
int NewSize=qRound(stretch*(float)ColumnSizes[lstIndex]);
int NewSize=qRound(stretch*(float)ColumnSizes.at(lstIndex));
sum+=NewSize;
if(i==header()->count()-1){
NewSize+=(w-sum); // add rounding difference to the last column
}
header()->resizeSection(header()->logicalIndex(i),NewSize);
ColumnSizes[lstIndex]=NewSize;
}
}
AutoResizeColumns=true;
}
int KeepassEntryView::columnListIndex(int LogicalIndex){
int c=-1; int i=0;
for(i;i<NUM_COLUMNS;i++){
if(Columns[i])c++;
if(i==10 && Columns[10] && ViewMode!=ShowSearchResults)c--;
if(Columns.at(i))c++;
if(i==10 && Columns.at(10) && ViewMode!=ShowSearchResults)c--;
if(c==LogicalIndex)break;
}
return i;
}
void KeepassEntryView::OnColumnResized(int lindex,int Old, int New){
void KeepassEntryView::OnColumnResized(int lindex,int Old, int New){
if(!AutoResizeColumns)return;
for(int i=0;i<header()->count();i++){
ColumnSizes[columnListIndex(i)]=header()->sectionSize(i);
@@ -534,7 +525,7 @@ void KeepassEntryView::OnColumnResized(int lindex,int Old, int New){
void KeepassEntryView::mousePressEvent(QMouseEvent *event){
//save event position - maybe this is the start of a drag
if (event->button() == Qt::LeftButton)
DragStartPos = event->pos();
DragStartPos = event->pos();
QTreeWidget::mousePressEvent(event);
}
@@ -543,15 +534,15 @@ void KeepassEntryView::mouseMoveEvent(QMouseEvent *event){
return;
if ((event->pos() - DragStartPos).manhattanLength() < QApplication::startDragDistance())
return;
DragItems.clear();
EntryViewItem* DragStartItem=(EntryViewItem*)itemAt(DragStartPos);
if(!DragStartItem){
while(selectedItems().size()){
setItemSelected(selectedItems()[0],false);}
setItemSelected(selectedItems().first(),false);}
return;
}
if(selectedItems().size()==0){
if(selectedItems().isEmpty()){
setItemSelected(DragStartItem,true);}
else{
bool AlreadySelected=false;
@@ -560,17 +551,17 @@ void KeepassEntryView::mouseMoveEvent(QMouseEvent *event){
}
if(!AlreadySelected){
while(selectedItems().size()){
setItemSelected(selectedItems()[0],false);
setItemSelected(selectedItems().first(),false);
}
setItemSelected(DragStartItem,true);
}
}
DragItems=selectedItems();
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
void* pDragItems=&DragItems;
mimeData->setData("text/plain;charset=UTF-8",DragItems[0]->text(0).toUtf8());
mimeData->setData("text/plain;charset=UTF-8",DragItems.first()->text(0).toUtf8());
mimeData->setData("application/x-keepassx-entry",QByteArray((char*)&pDragItems,sizeof(void*)));
drag->setMimeData(mimeData);
drag->setPixmap(DragPixmap);
@@ -584,16 +575,16 @@ void KeepassEntryView::removeDragItems(){
if(Items[j]==DragItems[i]){
Items.removeAt(j);
j--;
delete DragItems[i];
}
}
}
delete DragItems[i];
}
}
}
}
void KeepassEntryView::OnAutoType(){
Q_ASSERT(selectedItems().size()==1);
QString error;
AutoType::perform(((EntryViewItem*)selectedItems()[0])->EntryHandle,error);
AutoType::perform(((EntryViewItem*)selectedItems().first())->EntryHandle,error);
}
void KeepassEntryView::paintEvent(QPaintEvent * event){
@@ -624,13 +615,13 @@ bool EntryViewItem::operator<(const QTreeWidgetItem& other)const{
if(ListIndex < 5 || ListIndex==9 || ListIndex==10){ //columns with string values (Title, Username, Password, URL, Comment, Group)
if(QString::localeAwareCompare(text(SortCol),other.text(SortCol)) < 0)
return true;
else
else
return false;
}
KpxDateTime DateThis;
KpxDateTime DateOther;
switch(SortCol){
case 5: DateThis=EntryHandle->expire();
DateOther=((EntryViewItem&)other).EntryHandle->expire();
@@ -654,7 +645,7 @@ void KeepassEntryView::setCurrentEntry(IEntryHandle* entry){
bool found=false;
int i=0;
for(i;i<Items.size();i++)
if(Items[i]->EntryHandle==entry){found=true; break;}
if(Items.at(i)->EntryHandle==entry){found=true; break;}
if(!found)return;
setCurrentItem(Items[i]);
setCurrentItem(Items.at(i));
}

View File

@@ -27,8 +27,9 @@
#include <QHeaderView>
#include <QTimer>
#include <QClipboard>
#include <QVarLengthArray>
#include "../StandardDatabase.h"
#include <QBitArray>
#include <QList>
#include "../Kdb3Database.h"
#define NUM_COLUMNS 11
@@ -49,17 +50,17 @@ class KeepassEntryView:public QTreeWidget{
QList<EntryViewItem*>Items;
QList<IEntryHandle*> SearchResults;
QMenu *ContextMenu;
QVarLengthArray<bool>Columns;
void setCurrentEntry(IEntryHandle* entry);
QBitArray Columns;
void setCurrentEntry(IEntryHandle* entry);
private:
void setEntry(IEntryHandle* entry);
void updateEntry(EntryViewItem*);
void editEntry(EntryViewItem*);
void createItems(QList<IEntryHandle*>& entries);
int logicalColIndex(int ListIndex);
QClipboard* Clipboard;
QTimer ClipboardTimer;
QTimer ClipboardTimer;
void resizeColumns();
bool AutoResizeColumns;
QPoint DragStartPos;
@@ -68,10 +69,10 @@ class KeepassEntryView:public QTreeWidget{
IGroupHandle* CurrentGroup;
enum EntryViewMode {Normal, ShowSearchResults};
EntryViewMode ViewMode;
QVarLengthArray<float>ColumnSizes;
QVarLengthArray<int>ColumnOrder;
QList<int> ColumnSizes;
QList<int> ColumnOrder;
float GroupColumnSize;
virtual void contextMenuEvent(QContextMenuEvent *event);
virtual void paintEvent(QPaintEvent* event);
virtual void resizeEvent(QResizeEvent* event);

View File

@@ -19,8 +19,8 @@
***************************************************************************/
#include <QDir>
#include <QSettings>
#include "main.h"
#include "KpxConfig.h"
#include "FileDialogs.h"
@@ -29,55 +29,65 @@ QtStandardFileDialogs DefaultQtDlgs;
FileDlgHistory fileDlgHistory;
void KpxFileDialogs::setPlugin(IFileDialog* plugin){
iFileDialog=plugin;
iFileDialog=plugin;
}
QString KpxFileDialogs::openExistingFile(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,const QString& Dir)
QString KpxFileDialogs::openExistingFile(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,QString Dir,int SelectedFilter)
{
QString dir;
if(iFileDialog==NULL)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
if(Dir==QString()) dir=fileDlgHistory.getDir(Name);
else dir=Dir;
QString result = iFileDialog->openExistingFileDialog(Parent,Title,dir,Filters);
if(result!=QString()){
fileDlgHistory.set(Name,result.left(result.lastIndexOf("/")+1),iFileDialog->getLastFilter());
if(!iFileDialog)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
if(Dir==QString())
Dir=fileDlgHistory.getDir(Name);
if(SelectedFilter==-1)
SelectedFilter=fileDlgHistory.getFilter(Name);
QString result = iFileDialog->openExistingFileDialog(Parent,Title,Dir,Filters,SelectedFilter);
if(!result.isEmpty()){
fileDlgHistory.set(Name,result.left(result.lastIndexOf("/")+1),iFileDialog->getLastFilter());
}
return result;
return result;
}
QStringList KpxFileDialogs::openExistingFiles(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,const QString& Dir)
QStringList KpxFileDialogs::openExistingFiles(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,QString Dir,int SelectedFilter)
{
if(iFileDialog==NULL)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
//Load History here!
QStringList results=iFileDialog->openExistingFilesDialog(Parent,Title,QString(),Filters);
if(results.size()){
fileDlgHistory.set(Name,results[0].left(results[0].lastIndexOf("/")+1),iFileDialog->getLastFilter());
if(!iFileDialog)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
if(Dir==QString())
Dir=fileDlgHistory.getDir(Name);
if(SelectedFilter==-1)
SelectedFilter=fileDlgHistory.getFilter(Name);
QStringList results=iFileDialog->openExistingFilesDialog(Parent,Title,QString(),Filters,SelectedFilter);
if(!results.isEmpty()){
fileDlgHistory.set(Name,results[0].left(results[0].lastIndexOf("/")+1),iFileDialog->getLastFilter());
}
return results;
}
QString KpxFileDialogs::saveFile(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,bool OverWriteWarn, const QString& Dir)
QString KpxFileDialogs::saveFile(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,bool OverWriteWarn,QString Dir,int SelectedFilter)
{
if(iFileDialog==NULL)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
//Load History here!
QString result = iFileDialog->saveFileDialog(Parent,Title,QString(),Filters,OverWriteWarn);
if(result!=QString()){
fileDlgHistory.set(Name,result.left(result.lastIndexOf("/")+1),iFileDialog->getLastFilter());
if(!iFileDialog)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
if(Dir==QString())
Dir=fileDlgHistory.getDir(Name);
if(SelectedFilter==-1)
SelectedFilter=fileDlgHistory.getFilter(Name);
QString result = iFileDialog->saveFileDialog(Parent,Title,QString(),Filters,SelectedFilter,OverWriteWarn);
if(!result.isEmpty()){
fileDlgHistory.set(Name,result.left(result.lastIndexOf("/")+1),iFileDialog->getLastFilter());
}
return result;
return result;
}
QString QtStandardFileDialogs::openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters){
QString QtStandardFileDialogs::openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter){
if(SelectedFilter >= Filters.size())
SelectedFilter=0;
QFileDialog FileDlg(parent,title,dir);
FileDlg.setFilters(Filters);
FileDlg.setFileMode(QFileDialog::ExistingFile);
FileDlg.selectFilter(Filters[SelectedFilter]);
if(!FileDlg.exec())return QString();
if(!FileDlg.selectedFiles().size())return QString();
LastFilter=FileDlg.filters().indexOf(FileDlg.selectedFilter());
return FileDlg.selectedFiles()[0];
return FileDlg.selectedFiles()[0];
}
QStringList QtStandardFileDialogs::openExistingFilesDialog(QWidget* parent,QString title,QString dir,QStringList Filters){
QStringList QtStandardFileDialogs::openExistingFilesDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter){
QFileDialog FileDlg(parent,title,dir);
FileDlg.setFilters(Filters);
FileDlg.setFileMode(QFileDialog::ExistingFiles);
@@ -86,7 +96,7 @@ QStringList QtStandardFileDialogs::openExistingFilesDialog(QWidget* parent,QStri
return FileDlg.selectedFiles();
}
QString QtStandardFileDialogs::saveFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,bool ShowOverwriteWarning){
QString QtStandardFileDialogs::saveFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter, bool ShowOverwriteWarning){
QFileDialog FileDlg(parent,title,dir);
FileDlg.setFilters(Filters);
FileDlg.setFileMode(QFileDialog::AnyFile);
@@ -94,11 +104,11 @@ QString QtStandardFileDialogs::saveFileDialog(QWidget* parent,QString title,QStr
FileDlg.setConfirmOverwrite(ShowOverwriteWarning);
if(!FileDlg.exec())return QString();
LastFilter=FileDlg.filters().indexOf(FileDlg.selectedFilter());
return FileDlg.selectedFiles()[0];
return FileDlg.selectedFiles().first();
}
int QtStandardFileDialogs::getLastFilter(){
return LastFilter;
return LastFilter;
}
@@ -121,37 +131,40 @@ int FileDlgHistory::getFilter(const QString& name){
void FileDlgHistory::set(const QString& name,const QString& dir, int filter){
History[name]=Entry();
History[name].Dir=dir;
History[name].Filter=filter;
History[name].Filter=filter;
}
void FileDlgHistory::save(){
if(settings->value("General/SaveFileDlgHistory",QVariant(true)).toBool()){
settings->beginGroup("FileDlgHistory");
for(int i=0;i<History.size();i++){
if(config->saveFileDlgHistory()){
//settings->beginGroup("FileDlgHistory");
for(unsigned i=0;i<static_cast<unsigned>(History.size());i++){
QStringList entry;
entry << History.keys()[i]
<< History.values()[i].Dir
<< QString::number(History.values()[i].Filter);
settings->setValue(QString("ENTRY%1").arg(i),QVariant(entry));
entry << History.keys().at(i)
<< History.values().at(i).Dir
<< QString::number(History.values().at(i).Filter);
//settings->setValue(QString("ENTRY%1").arg(i),QVariant(entry));
config->setFileDlgHistory(i,entry);
}
settings->endGroup();
//settings->endGroup();
}
}
void FileDlgHistory::load(){
if(settings->value("General/SaveFileDlgHistory",QVariant(true)).toBool()){
settings->beginGroup("FileDlgHistory");
QStringList keys=settings->childKeys();
for(int i=0;i<keys.size();i++){
if(config->saveFileDlgHistory()){
//settings->beginGroup("FileDlgHistory");
//QStringList keys=settings->childKeys();
unsigned count=config->fileDlgHistorySize();
for(unsigned i=0;i</*keys.size()*/count;i++){
Entry entry;
QStringList value=settings->value(QString("ENTRY%1").arg(i)).toStringList();
QStringList value=config->fileDlgHistory(i);//settings->value(QString("ENTRY%1").arg(i)).toStringList();
entry.Dir=value[1];
entry.Filter=value[2].toInt();
History[value[0]]=entry;
History[value[0]]=entry;
}
settings->endGroup();
//settings->endGroup();
}
else{
settings->remove("FileDlgHistory");
config->clearFileDlgHistory();
//settings->remove("FileDlgHistory");
}
}

View File

@@ -55,17 +55,19 @@ class KpxFileDialogs{
static QString openExistingFile(QWidget* parent, const QString& Name,
const QString& Title,
const QStringList& Filters,
const QString& Dir=QString());
QString Dir=QString(),
int SelectedFilter=-1);
static QStringList openExistingFiles(QWidget* parent, const QString& Name,
const QString& Title,
const QStringList& Filters,
const QString& Dir=QString());
const QString Dir=QString(),
int SelectedFilter=-1);
static QString saveFile(QWidget* parent, const QString& Name,
const QString& Title,
const QStringList& Filters,
bool ShowOverwriteWarning=true,
const QString& Dir=QString()
);
QString Dir=QString(),
int SelectedFilter=-1);
private:
static IFileDialog* iFileDialog;
@@ -77,9 +79,9 @@ class KpxFileDialogs{
class QtStandardFileDialogs:public QObject,public IFileDialog{
Q_OBJECT
public:
QString openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters);
QStringList openExistingFilesDialog(QWidget* parent,QString title,QString dir,QStringList Filters);
QString saveFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,bool ShowOverwriteWarning);
QString openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter);
QStringList openExistingFilesDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter);
QString saveFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,int SelectedFilter,bool ShowOverwriteWarning);
int getLastFilter();
private:
int LastFilter;

View File

@@ -33,6 +33,8 @@
#include <QPen>
#include <QBrush>
#include <QMenu>
#include <QMessageBox>
#include "KpxConfig.h"
#include "main.h"
#include "EntryView.h"
#include "GroupView.h"
@@ -99,6 +101,12 @@ void KeepassGroupView::addChilds(GroupViewItem* item){
}
void KeepassGroupView::OnDeleteGroup(){
if(config->askBeforeDelete()){
if(QMessageBox::question(this,tr("Delete?"),
tr("Are you sure you want to delete this group, all it's child groups and all their entries?"),
QMessageBox::Yes | QMessageBox::No,QMessageBox::No) == QMessageBox::No)
return;
}
GroupViewItem* item=(GroupViewItem*)currentItem();
if(item){
db->deleteGroup(item->GroupHandle);
@@ -204,6 +212,7 @@ void KeepassGroupView::dragEnterEvent ( QDragEnterEvent * event ){
void KeepassGroupView::dragLeaveEvent ( QDragLeaveEvent * event ){
if(LastHoverItem){
LastHoverItem->setBackgroundColor(0,QApplication::palette().color(QPalette::Base));
LastHoverItem->setForeground(0,QBrush(QApplication::palette().color(QPalette::Text)));
}
if(InsLinePos!=-1){
int RemoveLine=InsLinePos;
@@ -345,6 +354,15 @@ void KeepassGroupView::entryDragMoveEvent( QDragMoveEvent * event ){
event->ignore();
return;
}
if(Item==SearchResultItem){
if(LastHoverItem){
LastHoverItem->setBackgroundColor(0,QApplication::palette().color(QPalette::Base));
LastHoverItem->setForeground(0,QBrush(QApplication::palette().color(QPalette::Text)));
LastHoverItem=NULL;
}
event->ignore();
return;
}
if(LastHoverItem != Item){
if(LastHoverItem){
LastHoverItem->setBackgroundColor(0,QApplication::palette().color(QPalette::Base));
@@ -354,7 +372,6 @@ void KeepassGroupView::entryDragMoveEvent( QDragMoveEvent * event ){
Item->setForeground(0,QBrush(QApplication::palette().color(QPalette::HighlightedText)));
LastHoverItem=Item;
}
event->accept();
return;

View File

@@ -23,7 +23,7 @@
#include <QTreeWidget>
#include <QLine>
#include <QContextMenuEvent>
#include "../StandardDatabase.h"
#include "../Kdb3Database.h"
class GroupViewItem;

View File

@@ -21,7 +21,6 @@
#include <math.h>
#include <QPainter>
#include <QRectF>
#include "PwmConfig.h"
#include "main.h"
#include "WaitAnimationWidget.h"
@@ -36,17 +35,17 @@ WaitAnimationWidget::WaitAnimationWidget(QWidget* parent):QWidget(parent){
diff=1.0f-diff;
if(diff<-0.5f)
diff=1.0f+diff;
CircSizes[i]=1.0+exp(-14.0f*diff*diff);
CircSizes[i]=1.0+exp(-14.0f*diff*diff);
}
connect(&timer,SIGNAL(timeout()),this,SLOT(refreshAnimation()));
connect(&timer,SIGNAL(timeout()),this,SLOT(refreshAnimation()));
}
WaitAnimationWidget::~WaitAnimationWidget(){
timer.stop();
timer.stop();
}
void WaitAnimationWidget::start(){
timer.start();
timer.start();
}
void WaitAnimationWidget::stop(){
@@ -68,22 +67,22 @@ void WaitAnimationWidget::refreshAnimation(){
diff=1.0f-diff;
if(diff<-0.5f)
diff=1.0f+diff;
CircSizes[i]=1.0+exp(-14.0f*diff*diff);
CircSizes[i]=1.0+exp(-14.0f*diff*diff);
}
repaint();
repaint();
}
void WaitAnimationWidget::paintEvent(QPaintEvent* event){
if(timer.isActive()){
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing,true);
painter.setBrush(Qt::black);
painter.setBrush(Qt::black);
painter.setPen(Qt::black);
for(int i=0;i<6;i++){
float d=CircSizes[i]*5.0;
QRectF rect(CircPositions[i].x()-d/2,CircPositions[i].y()-d/2,d,d);
painter.drawEllipse(rect);
}
painter.drawEllipse(rect);
}
}
}
@@ -95,7 +94,7 @@ void WaitAnimationWidget::resizeEvent(QResizeEvent* event){
r=width()/2;
for(int i=0;i<6;i++){
CircPositions[i].setX((r-10)*cos(-2.0*3.14159265*(0.16666667*i))+r);
CircPositions[i].setY((r-10)*sin(-2.0*3.14159265*(0.16666667*i))+r);
CircPositions[i].setY((r-10)*sin(-2.0*3.14159265*(0.16666667*i))+r);
}
}