completed tree state restore function,

visual order of entries will now affect their saving order,
changed the behavior of the entry view header.

git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@124 b624d157-de02-0410-bad0-e51aec6abb33
This commit is contained in:
tarek_saidi
2007-03-12 21:05:45 +00:00
parent ee97e3c197
commit 28ba242090
23 changed files with 657 additions and 356 deletions

View File

@@ -47,9 +47,11 @@ KeepassEntryView::KeepassEntryView(QWidget* parent):QTreeWidget(parent){
updateColumns();
header()->setResizeMode(QHeaderView::Interactive);
header()->setStretchLastSection(false);
header()->setClickable(true);
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()));
connect(header(),SIGNAL(sectionClicked(int)),this,SLOT(OnHeaderSectionClicked(int)));
Clipboard=QApplication::clipboard();
ContextMenu=new QMenu(this);
setAlternatingRowColors(config.AlternatingRowColors);
@@ -82,6 +84,22 @@ void KeepassEntryView::OnItemsChanged(){
}
}
void KeepassEntryView::OnHeaderSectionClicked(int index){
if(header()->isSortIndicatorShown() && header()->sortIndicatorSection()==index){
header()->setSortIndicator(index,header()->sortIndicatorOrder() ? Qt::DescendingOrder : Qt::AscendingOrder);
sortItems(index,header()->sortIndicatorOrder());
}
else{
header()->setSortIndicator(index,Qt::AscendingOrder);
header()->setSortIndicatorShown(true);
sortItems(index,Qt::AscendingOrder);
}
for(int i=0;i<Items.size();i++){
Items[i]->EntryHandle->setVisualIndexDirectly(indexOfTopLevelItem(Items[i]));
}
}
void KeepassEntryView::OnSaveAttachment(){
Q_ASSERT(selectedItems().size()==1);
CEditEntryDlg::saveAttachment(((EntryViewItem*)selectedItems()[0])->EntryHandle,this);
@@ -268,7 +286,8 @@ void KeepassEntryView::showGroup(IGroupHandle* group){
createItems(entries);
}
void KeepassEntryView::createItems(QList<IEntryHandle*>& entries){
void KeepassEntryView::createItems(QList<IEntryHandle*>& entries){
header()->setSortIndicatorShown(false);
for(int i=0;i<entries.size();i++){
if(!entries[i]->isValid())continue;
EntryViewItem* item=new EntryViewItem(this);
@@ -304,6 +323,7 @@ void KeepassEntryView::createItems(QList<IEntryHandle*>& entries){
if(config.Columns[9]){
item->setText(j++,entries[i]->binaryDesc());}
Items.back()->setIcon(0,db->icon(entries[i]->image()));
qDebug("%s : %i",entries[i]->title().toUtf8().data(),entries[i]->visualIndex());
}
}

View File

@@ -70,6 +70,7 @@ class KeepassEntryView:public QTreeWidget{
virtual void mouseMoveEvent(QMouseEvent *event);
public slots:
void OnColumnResized(int index,int OldSize, int NewSize);
void OnHeaderSectionClicked(int index);
void OnGroupChanged(IGroupHandle* group);
void OnShowSearchResults();
void OnEntryActivated(QTreeWidgetItem*,int);

View File

@@ -1,5 +1,5 @@
/***************************************************************************
* 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 *
@@ -18,11 +18,15 @@
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "FileDialogs.h"
#include <QDir>
#include <QSettings>
#include "main.h"
#include "FileDialogs.h"
IFileDialog* KpxFileDialogs::iFileDialog=NULL;
QtStandardFileDialogs DefaultQtDlgs;
FileDlgHistory fileDlgHistory;
void KpxFileDialogs::setPlugin(IFileDialog* plugin){
iFileDialog=plugin;
@@ -30,26 +34,37 @@ void KpxFileDialogs::setPlugin(IFileDialog* plugin){
QString KpxFileDialogs::openExistingFile(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,const QString& Dir)
{
QString dir;
if(iFileDialog==NULL)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
//Load History here!
return iFileDialog->openExistingFileDialog(Parent,Title,QDir::homePath(),Filters);
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());
}
return result;
}
QStringList KpxFileDialogs::openExistingFiles(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,const QString& Dir)
{
if(iFileDialog==NULL)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
//Load History here!
return iFileDialog->openExistingFilesDialog(Parent,Title,QString(),Filters);
QStringList results=iFileDialog->openExistingFilesDialog(Parent,Title,QString(),Filters);
if(results.size()){
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)
{
if(iFileDialog==NULL)iFileDialog=dynamic_cast<IFileDialog*>(&DefaultQtDlgs);
//Load History here!
return iFileDialog->saveFileDialog(Parent,Title,QString(),Filters,OverWriteWarn);
QString result = iFileDialog->saveFileDialog(Parent,Title,QString(),Filters,OverWriteWarn);
if(result!=QString()){
fileDlgHistory.set(Name,result.left(result.lastIndexOf("/")+1),iFileDialog->getLastFilter());
}
return result;
}
QString QtStandardFileDialogs::openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters){
@@ -58,6 +73,7 @@ QString QtStandardFileDialogs::openExistingFileDialog(QWidget* parent,QString ti
FileDlg.setFileMode(QFileDialog::ExistingFile);
if(!FileDlg.exec())return QString();
if(!FileDlg.selectedFiles().size())return QString();
LastFilter=FileDlg.filters().indexOf(FileDlg.selectedFilter());
return FileDlg.selectedFiles()[0];
}
@@ -66,6 +82,7 @@ QStringList QtStandardFileDialogs::openExistingFilesDialog(QWidget* parent,QStri
FileDlg.setFilters(Filters);
FileDlg.setFileMode(QFileDialog::ExistingFiles);
if(!FileDlg.exec())return QStringList();
LastFilter=FileDlg.filters().indexOf(FileDlg.selectedFilter());
return FileDlg.selectedFiles();
}
@@ -76,7 +93,65 @@ QString QtStandardFileDialogs::saveFileDialog(QWidget* parent,QString title,QStr
FileDlg.setAcceptMode(QFileDialog::AcceptSave);
FileDlg.setConfirmOverwrite(ShowOverwriteWarning);
if(!FileDlg.exec())return QString();
LastFilter=FileDlg.filters().indexOf(FileDlg.selectedFilter());
return FileDlg.selectedFiles()[0];
}
int QtStandardFileDialogs::getLastFilter(){
return LastFilter;
}
QString FileDlgHistory::getDir(const QString& name){
Entry e=History.value(name);
if(e.isNull())
return QDir::homePath();
else
return e.Dir;
}
int FileDlgHistory::getFilter(const QString& name){
Entry e=History.value(name);
if(e.isNull())
return 0;
else
return e.Filter;
}
void FileDlgHistory::set(const QString& name,const QString& dir, int filter){
History[name]=Entry();
History[name].Dir=dir;
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++){
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));
}
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++){
Entry entry;
QStringList value=settings->value(QString("ENTRY%1").arg(i)).toStringList();
entry.Dir=value[1];
entry.Filter=value[2].toInt();
History[value[0]]=entry;
}
settings->endGroup();
}
else{
settings->remove("FileDlgHistory");
}
}

View File

@@ -1,5 +1,5 @@
/***************************************************************************
* 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 *
@@ -23,27 +23,31 @@
#include <QObject>
#include <QFileDialog>
#include <QList>
#include <QHash>
#include "plugins/interfaces/IFileDialog.h"
/*
class FileDlgHistory{
class HistoryEntry{
public:
QString DlgId;
QString Dir;
int Filter;
QString toString();
void fromString(const QString& str);
};
public:
void set(const QString& DlgId,const QString& Dir,int Filter);
int getFilter(const QString& DlgId);
QString getDir(const QString& DlgId);
void clear();
QString getDir(const QString& name);
int getFilter(const QString& name);
void set(const QString& name,const QString& dir,int filter);
void save();
void load();
private:
QList
class Entry{
public:
Entry(){Filter=-1;}
QString Dir;
int Filter;
bool isNull(){if(Filter==-1)return true;
else return false;}
};
QHash<QString,Entry>History;
};
*/
class KpxFileDialogs{
public:
@@ -71,14 +75,17 @@ 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);
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);
int getLastFilter();
private:
int LastFilter;
};
extern FileDlgHistory fileDlgHistory;
#endif

View File

@@ -1,5 +1,5 @@
/***************************************************************************
* Copyright (C) 2005 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 *
@@ -46,8 +46,8 @@ KeepassGroupView::KeepassGroupView(QWidget* parent):QTreeWidget(parent){
ContextMenu=new QMenu(this);
ContextMenuSearchGroup=new QMenu(this);
connect(this,SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),this,SLOT(OnCurrentGroupChanged(QTreeWidgetItem*,QTreeWidgetItem*)));
// connect(this,SIGNAL(itemExpanded(QTreeWidgetItem*)),this,SLOT(OnItemExpanded(QTreeWidgetItem*)));
// connect(this,SIGNAL(itemCollapsed(QTreeWidgetItem*)),this,SLOT(OnItemCollapsed(QTreeWidgetItem*)));
connect(this,SIGNAL(itemExpanded(QTreeWidgetItem*)),this,SLOT(OnItemExpanded(QTreeWidgetItem*)));
connect(this,SIGNAL(itemCollapsed(QTreeWidgetItem*)),this,SLOT(OnItemCollapsed(QTreeWidgetItem*)));
}
@@ -59,12 +59,13 @@ void KeepassGroupView::createItems(){
if(groups[i]->parent()==NULL){
Items.append(new GroupViewItem(this));
Items.back()->setText(0,groups[i]->title());
Items.back()->GroupHandle=groups[i];
Items.back()->GroupHandle=groups[i];
addChilds(Items.back());
}
}
for(int i=0;i<Items.size();i++){
Items[i]->setIcon(0,db->icon(Items[i]->GroupHandle->image()));
Items[i]->setExpanded(Items[i]->GroupHandle->expanded());
}
SearchResultItem=new GroupViewItem();
SearchResultItem->setText(0,tr("Search Results"));
@@ -398,6 +399,14 @@ void KeepassGroupView::mouseMoveEvent(QMouseEvent *event){
Qt::DropAction dropAction = drag->start(Qt::MoveAction);
}
void KeepassGroupView::OnItemExpanded(QTreeWidgetItem* item){
dynamic_cast<GroupViewItem*>(item)->GroupHandle->setExpanded(true);
}
void KeepassGroupView::OnItemCollapsed(QTreeWidgetItem* item){
dynamic_cast<GroupViewItem*>(item)->GroupHandle->setExpanded(false);
}
GroupViewItem::GroupViewItem():QTreeWidgetItem(){

View File

@@ -62,8 +62,8 @@ class KeepassGroupView:public QTreeWidget{
void OnEditGroup();
void updateIcons();
void OnHideSearchResults();
// void OnItemExpanded(QTreeWidgetItem*);
// void OnItemCollapsed(QTreeWidgetItem*);
void OnItemExpanded(QTreeWidgetItem*);
void OnItemCollapsed(QTreeWidgetItem*);
signals:
void groupChanged(IGroupHandle* NewGroup);