diff --git a/src/Database.h b/src/Database.h index 0942847..08ca952 100644 --- a/src/Database.h +++ b/src/Database.h @@ -119,6 +119,7 @@ public: virtual QPixmap& icon(int index)=0; virtual int numIcons()=0; virtual void addIcon(const QPixmap& icon)=0; + virtual void removeIcon(int Id)=0; Q_UINT32 CryptoAlgorithmus; Q_UINT32 KeyEncRounds; diff --git a/src/PwManager.cpp b/src/PwManager.cpp index 106c3c0..d774bcc 100755 --- a/src/PwManager.cpp +++ b/src/PwManager.cpp @@ -252,10 +252,11 @@ return false; //unknown MetaStreams } bool PwDatabase::parseCustomIconsMetaStream(const QByteArray& dta){ -Q_UINT32 NumIcons,NumEntries,offset; +Q_UINT32 NumIcons,NumEntries,NumGroups,offset; memcpyFromLEnd32(&NumIcons,dta.data()); memcpyFromLEnd32(&NumEntries,dta.data()+4); -offset=8; +memcpyFromLEnd32(&NumGroups,dta.data()+8); +offset=12; CustomIcons.clear(); for(int i=0;iUserName="SYSTEM"; e->Additional="KPX_CUSTOM_ICONS"; e->URL="$"; e->ImageID=0; -int Size=8; -Q_UINT32 NumEntries=0; -for(int i=0;i= BUILTIN_ICONS){ Size+=8; NumEntries++;} -} +int Size=12; +Q_UINT32 NumEntries=Entries.size(); +Q_UINT32 NumGroups=Groups.size(); +Size+=8*(NumEntries+NumGroups); Size+=CustomIcons.size()*1000; // 1KB e->BinaryData.reserve(Size); -e->BinaryData.resize(8); +e->BinaryData.resize(12); Q_UINT32 NumIcons=CustomIcons.size(); memcpyToLEnd32(e->BinaryData.data(),&NumIcons); memcpyToLEnd32(e->BinaryData.data()+4,&NumEntries); +memcpyToLEnd32(e->BinaryData.data()+8,&NumGroups); for(int i=0;iBinaryData.append(png); } for(Q_UINT32 i=0;i= BUILTIN_ICONS){ char Bin[8]; memcpyToLEnd32(Bin,&i); - Q_UINT32 id=Entries[i].ImageID-BUILTIN_ICONS; + Q_UINT32 id=Entries[i].ImageID; + memcpyToLEnd32(Bin+4,&id); + e->BinaryData.append(QByteArray::fromRawData(Bin,8)); +} +for(Q_UINT32 i=0;iBinaryData.append(QByteArray::fromRawData(Bin,8)); - } } - - } @@ -346,6 +358,24 @@ CustomIcons << icon; emit modified(); } +void PwDatabase::removeIcon(int id){ +id-=BUILTIN_ICONS; +if(id < 0 ) return; +if(id >= CustomIcons.size()) return; +CustomIcons.removeAt(id); // .isNull()==true +for(int i=0;iid+BUILTIN_ICONS) + Entries[i].ImageID--; +} +for(int i=0;iid+BUILTIN_ICONS) + Groups[i].ImageID--; +} +} void PwDatabase::transformKey(Q_UINT8* src,Q_UINT8* dst,Q_UINT8* KeySeed,int rounds){ Q_UINT8* tmp=new Q_UINT8[32]; @@ -818,7 +848,9 @@ for(int i=0; i < Groups.size(); i++){ FieldType = 0x0007; FieldSize = 4; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; memcpyToLEnd32(buffer+pos, &FieldSize); pos += 4; - memcpyToLEnd32(buffer+pos, &Groups[i].ImageID); pos += 4; + Q_UINT32 ImgID=Groups[i].ImageID; + if(ImgID>=BUILTIN_ICONS)ImgID=0; + memcpyToLEnd32(buffer+pos, &ImgID); pos += 4; FieldType = 0x0008; FieldSize = 2; memcpyToLEnd16(buffer+pos, &FieldType); pos += 2; diff --git a/src/PwManager.h b/src/PwManager.h index 1bb3684..a8ee4d7 100755 --- a/src/PwManager.h +++ b/src/PwManager.h @@ -83,6 +83,7 @@ public: QPixmap& icon(int index); int numIcons(); void addIcon(const QPixmap& icon); + void removeIcon(int Id); QListGroups; QListEntries; diff --git a/src/dialogs/EditEntryDlg.cpp b/src/dialogs/EditEntryDlg.cpp index 5877b5d..8715d8a 100755 --- a/src/dialogs/EditEntryDlg.cpp +++ b/src/dialogs/EditEntryDlg.cpp @@ -146,7 +146,7 @@ int i; for(i=0;i!=db->numGroups();i++){ tmp=""; for(int j=0;jgroup(i).Level;j++)tmp+=" "; -Combo_Group->insertItem(EntryIcons[db->group(i).ImageID], +Combo_Group->insertItem(db->icon(db->group(i).ImageID), tmp+db->group(i).Name,i); } Combo_Group->setCurrentItem(db->getGroupIndex(entry->GroupID)); diff --git a/src/dialogs/EditGroupDlg.cpp b/src/dialogs/EditGroupDlg.cpp index 1559c0e..58effb8 100755 --- a/src/dialogs/EditGroupDlg.cpp +++ b/src/dialogs/EditGroupDlg.cpp @@ -66,7 +66,7 @@ done(0); void CEditGroupDialog::OnIconDlg(){ -CSelectIconDlg dlg(db,this); +CSelectIconDlg dlg(db,IconID,this); int r=dlg.exec(); if(r!=-1){ ComboIconPicker->clear(); diff --git a/src/dialogs/SelectIconDlg.cpp b/src/dialogs/SelectIconDlg.cpp index b450608..f189250 100644 --- a/src/dialogs/SelectIconDlg.cpp +++ b/src/dialogs/SelectIconDlg.cpp @@ -28,16 +28,19 @@ -CSelectIconDlg::CSelectIconDlg(Database* database,QWidget* parent,const char* name, bool modal, Qt::WFlags fl):QDialog(parent,name,modal,fl){ +CSelectIconDlg::CSelectIconDlg(Database* database,int CurrentID,QWidget* parent,const char* name, bool modal, Qt::WFlags fl):QDialog(parent,name,modal,fl){ setupUi(this); db=database; -connect(Button_AddIcon, SIGNAL(clicked()), this, SLOT(OnAddIcon())); -connect(Button_PickIcon, SIGNAL(clicked()), this, SLOT(OnPickIcon())); -connect(Button_Cancel, SIGNAL(clicked()), this, SLOT(OnCancel())); CtxMenu=new QMenu(this); DeleteAction=CtxMenu->addAction(*Icon_EditDelete,tr("Delete")); CustomIconsModified=false; +connect(Button_AddIcon, SIGNAL(clicked()), this, SLOT(OnAddIcon())); +connect(Button_PickIcon, SIGNAL(clicked()), this, SLOT(OnPickIcon())); +connect(Button_Cancel, SIGNAL(clicked()), this, SLOT(OnCancel())); +connect(DeleteAction,SIGNAL(triggered()),this,SLOT(OnDelete())); +connect(List,SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),this,SLOT(OnSelectionChanged(QListWidgetItem*,QListWidgetItem*))); updateView(); +List->setCurrentItem(List->item(CurrentID)); } void CSelectIconDlg::updateView(){ @@ -47,14 +50,16 @@ for(int i=0; inumIcons(); i++){ if(iaddItem(item=new QListWidgetItem(QIcon(db->icon(i)),QString::number(i))); else - List->addItem(item=new QListWidgetItem(QIcon(db->icon(i)),"["+QString::number(i)+"]")); + if(!db->icon(i).isNull()) + List->addItem(item=new QListWidgetItem(QIcon(db->icon(i)),"["+QString::number(i)+"]")); item->setData(32,i); } } void CSelectIconDlg::OnAddIcon(){ -QStringList filenames=QFileDialog::getOpenFileNames(this,tr("Add Icons..."),QDir::homePath()); +QStringList filenames=QFileDialog::getOpenFileNames(this,tr("Add Icons..."),QDir::homePath(),tr("Images (%1)") + .arg("*.png *.jpeg *.jpg *.bmp *.gif *.bpm *.pgm *.ppm *.xbm *xpm")); QStringList errors; for(int i=0;isetCurrentItem(List->item(List->count()-1)); } void CSelectIconDlg::contextMenuEvent(QContextMenuEvent *event){ @@ -82,10 +88,23 @@ event->accept(); CtxMenu->popup(event->globalPos()); } +void CSelectIconDlg::OnDelete(){ +db->removeIcon(List->currentItem()->data(32).toInt()); +updateView(); +} + void CSelectIconDlg::OnPickIcon(){ done(List->currentItem()->data(32).toInt()); } void CSelectIconDlg::OnCancel(){ done(-1); +} + + +void CSelectIconDlg::OnSelectionChanged(QListWidgetItem* cur,QListWidgetItem* prev){ +Button_PickIcon->setEnabled(cur); + + + } \ No newline at end of file diff --git a/src/dialogs/SelectIconDlg.h b/src/dialogs/SelectIconDlg.h index ada7199..e1c0914 100644 --- a/src/dialogs/SelectIconDlg.h +++ b/src/dialogs/SelectIconDlg.h @@ -31,14 +31,15 @@ class CSelectIconDlg:public QDialog, public Ui_SelectIconDlg{ Q_OBJECT public: - CSelectIconDlg(Database* db,QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WFlags fl = 0); + CSelectIconDlg(Database* db,int,QWidget* parent = 0, const char* name = 0, bool modal = false, Qt::WFlags fl = 0); bool CustomIconsModified; public slots: void OnAddIcon(); void OnPickIcon(); void OnCancel(); - + void OnDelete(); + void OnSelectionChanged(QListWidgetItem*,QListWidgetItem*); private: Database* db; diff --git a/src/forms/EditGroupDlg.ui b/src/forms/EditGroupDlg.ui index 8fac5e2..db4086a 100644 --- a/src/forms/EditGroupDlg.ui +++ b/src/forms/EditGroupDlg.ui @@ -63,30 +63,36 @@ Icon: - + - 70 - 40 - 50 - 21 + 227 + 77 + 70 + 24 + + &Cancel + + + Alt+C + - + - 227 + 147 77 70 24 - &Cancel + O&K - Alt+C + Alt+K @@ -108,21 +114,15 @@ Qt::Horizontal - + - 147 - 77 - 70 - 24 + 70 + 40 + 50 + 21 - - O&K - - - Alt+K - @@ -130,7 +130,7 @@ 123 39 21 - 24 + 23 diff --git a/src/forms/SelectIconDlg.ui b/src/forms/SelectIconDlg.ui index a8e978f..4e1701d 100644 --- a/src/forms/SelectIconDlg.ui +++ b/src/forms/SelectIconDlg.ui @@ -21,7 +21,7 @@ - Dialog + Icon Selection @@ -90,7 +90,7 @@ true - QListView::Adjust + QListView::Fixed