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:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(){
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user