📄 mainwindow.cpp
字号:
QMessageBox::warning(this,tr("Error"),tr("Could not create key file. The following error occured:\n%1").arg(db->getError()),tr("OK"),"","",0,0); delete db; db=NULL; return; } } if(dlg.password!="" && dlg.keyfile=="") db->CalcMasterKeyByPassword(dlg.password); if(dlg.password=="" && dlg.keyfile!="") db->CalcMasterKeyByFile(dlg.keyfile); if(dlg.password!="" && dlg.keyfile!="") db->CalcMasterKeyByFileAndPw(dlg.keyfile,dlg.password); setWindowTitle(tr("KeePassX - %1").arg(tr("[new]"))); GroupView->db=db; EntryView->db=db; GroupView->updateItems(); EntryView->updateItems(0); setStateFileOpen(true); setStateFileModified(true); FileOpen=true; setupDatabaseConnections(db);}}void KeepassMainWindow::OnFileOpen(){QString filename=QFileDialog::getOpenFileName(this,tr("Open Database..."),QDir::homePath(),"*.kdb");if(filename!=QString()){ if(FileOpen) if(!closeDatabase())return; openDatabase(filename);}}void KeepassMainWindow::OnFileClose(){closeDatabase();}void KeepassMainWindow::setStateFileOpen(bool IsOpen){FileOpen=IsOpen;FileSaveAction->setEnabled(IsOpen);FileSaveAsAction->setEnabled(IsOpen);FileCloseAction->setEnabled(IsOpen);FileSettingsAction->setEnabled(IsOpen);FileChangeKeyAction->setEnabled(IsOpen);FileExpPlainTextAction->setEnabled(IsOpen);EditSearchAction->setEnabled(IsOpen);GroupView->setEnabled(IsOpen);EntryView->setEnabled(IsOpen);DetailView->setEnabled(IsOpen);QuickSearchEdit->setEnabled(IsOpen);if(!IsOpen){ EditNewGroupAction->setEnabled(false); EditEditGroupAction->setEnabled(false); EditDeleteGroupAction->setEnabled(false); EditPasswordToClipboardAction->setEnabled(false); EditUsernameToClipboardAction->setEnabled(false); EditOpenUrlAction->setEnabled(false); EditSaveAttachmentAction->setEnabled(false); EditNewEntryAction->setEnabled(false); EditEditEntryAction->setEnabled(false); EditCloneEntryAction->setEnabled(false); EditDeleteEntryAction->setEnabled(false); EditGroupSearchAction->setEnabled(false); EditAutoTypeAction->setEnabled(false);}else{ OnGroupSelectionChanged(); OnEntrySelectionChanged();}}void KeepassMainWindow::editEntry(CEntry* pEntry){CEditEntryDlg dlg(db,pEntry,this,true);switch(dlg.exec()){ case 0: //canceled or no changes break; case 1: //modifications but same group EntryView->refreshItems(); setStateFileModified(true); break; case 2: //entry moved to another group emit entryChanged(); //a direct call of updateItems() would cause a SegFault because of the TreeView base class slots setStateFileModified(true); break;}}void KeepassMainWindow::setStateFileModified(bool mod){if(!FileOpen)return;ModFlag=mod;FileSaveAction->setEnabled(mod);}void KeepassMainWindow::setStateGroupSelected(SelectionState s){GroupSelection=s;switch(GroupSelection){ case NONE: EditNewGroupAction->setEnabled(true); EditEditGroupAction->setEnabled(false); EditDeleteGroupAction->setEnabled(false); EditGroupSearchAction->setEnabled(false); EditNewEntryAction->setEnabled(false); break; case SINGLE: EditNewGroupAction->setEnabled(true); EditEditGroupAction->setEnabled(true); EditDeleteGroupAction->setEnabled(true); EditGroupSearchAction->setEnabled(true); EditNewEntryAction->setEnabled(true); break; case SEARCHGROUP: EditNewGroupAction->setEnabled(false); EditEditGroupAction->setEnabled(false); EditDeleteGroupAction->setEnabled(false); EditGroupSearchAction->setEnabled(false); EditNewEntryAction->setEnabled(false); break; default: Q_ASSERT(false);}}void KeepassMainWindow::updateDetailView(){if(EntryView->selectedItems().size()!=1){ DetailView->setPlainText(""); return;}CEntry& entry=*((EntryViewItem*)(EntryView->selectedItems()[0]))->pEntry;QString str=tr("<B>Group: </B>%1 <B>Title: </B>%2 <B>Username: </B>%3 <B>URL: </B><a href=%4>%4</a> <B>Password: </B>%5 <B>Creation: </B>%6 <B>Last Change: </B>%7 <B>LastAccess: </B>%8 <B>Expires: </B>%9");//todo: a "CGroup* PwDatabase::getGroup(CEntry*)" method would be a good ideastr=str.arg(db->group(db->getGroupIndex(entry.GroupID)).Name).arg(entry.Title);if(!config.ListView_HideUsernames) str=str.arg(entry.UserName);else str=str.arg("****");str=str.arg(entry.URL);entry.Password.unlock();if(!config.ListView_HidePasswords) str=str.arg(entry.Password.string());else str=str.arg("****");entry.Password.lock();str=str.arg(entry.Creation.toString(Qt::LocalDate)) .arg(entry.LastMod.toString(Qt::LocalDate)) .arg(entry.LastAccess.toString(Qt::LocalDate)) .arg(entry.Expire.toString(Qt::LocalDate));DetailView->setHtml(str);}void KeepassMainWindow::setStateEntrySelected(SelectionState s){EntrySelection=s;if(GroupSelection == NONE || GroupSelection == SINGLE)switch(EntrySelection){ case NONE: EditPasswordToClipboardAction->setEnabled(false); EditUsernameToClipboardAction->setEnabled(false); EditOpenUrlAction->setEnabled(false); EditSaveAttachmentAction->setEnabled(false); EditEditEntryAction->setEnabled(false); EditCloneEntryAction->setEnabled(false); EditCloneEntryAction->setText(tr("Clone Entry")); EditDeleteEntryAction->setEnabled(false); EditDeleteEntryAction->setText(tr("Delete Entry")); EditAutoTypeAction->setEnabled(false); break; case SINGLE: EditPasswordToClipboardAction->setEnabled(true); EditUsernameToClipboardAction->setEnabled(true); EditOpenUrlAction->setEnabled(true); EditSaveAttachmentAction->setEnabled(true); EditEditEntryAction->setEnabled(true); EditCloneEntryAction->setEnabled(true); EditCloneEntryAction->setText(tr("Clone Entry")); EditDeleteEntryAction->setEnabled(true); EditDeleteEntryAction->setText(tr("Delete Entry")); EditAutoTypeAction->setEnabled(true); break; case MULTIPLE: EditPasswordToClipboardAction->setEnabled(false); EditUsernameToClipboardAction->setEnabled(false); EditOpenUrlAction->setEnabled(false); EditSaveAttachmentAction->setEnabled(false); EditEditEntryAction->setEnabled(false); EditCloneEntryAction->setEnabled(true); EditCloneEntryAction->setText(tr("Clone Entries")); EditDeleteEntryAction->setEnabled(true); EditDeleteEntryAction->setText(tr("Delete Entries")); EditAutoTypeAction->setEnabled(false); break; default: Q_ASSERT(false);}else if(GroupSelection == SEARCHGROUP)switch(EntrySelection){ case NONE: EditPasswordToClipboardAction->setEnabled(false); EditUsernameToClipboardAction->setEnabled(false); EditOpenUrlAction->setEnabled(false); EditSaveAttachmentAction->setEnabled(false); EditEditEntryAction->setEnabled(false); EditCloneEntryAction->setEnabled(false); EditCloneEntryAction->setText(tr("Clone Entry")); EditDeleteEntryAction->setEnabled(false); EditDeleteEntryAction->setText(tr("Delete Entry")); EditAutoTypeAction->setEnabled(false); break; case SINGLE: EditPasswordToClipboardAction->setEnabled(true); EditUsernameToClipboardAction->setEnabled(true); EditOpenUrlAction->setEnabled(true); EditSaveAttachmentAction->setEnabled(true); EditEditEntryAction->setEnabled(true); EditCloneEntryAction->setEnabled(false); EditCloneEntryAction->setText(tr("Clone Entry")); EditDeleteEntryAction->setEnabled(true); EditDeleteEntryAction->setText(tr("Delete Entry")); EditAutoTypeAction->setEnabled(true); break; case MULTIPLE: EditPasswordToClipboardAction->setEnabled(false); EditUsernameToClipboardAction->setEnabled(false); EditOpenUrlAction->setEnabled(false); EditSaveAttachmentAction->setEnabled(false); EditEditEntryAction->setEnabled(false); EditCloneEntryAction->setEnabled(false); EditCloneEntryAction->setText(tr("Clone Entries")); EditDeleteEntryAction->setEnabled(true); EditDeleteEntryAction->setText(tr("Delete Entries")); EditAutoTypeAction->setEnabled(false); break; default: Q_ASSERT(false);}else Q_ASSERT(false);}bool KeepassMainWindow::OnFileSave(){if(db->file->fileName()==QString()) return OnFileSaveAs();config.LastFile=db->file->fileName();if(db->saveDatabase()) setStateFileModified(false);else{ showErrMsg(tr("File could not be saved.\n%1").arg(db->getError())); return false; }return true;}bool KeepassMainWindow::OnFileSaveAs(){QString filename=QFileDialog::getSaveFileName(this,tr("Save Database As..."),QDir::homePath(),"*.kdb"); if(filename==QString()) return false;Q_ASSERT(db->file);if(db->file->isOpen()) db->file->close();db->file->setFileName(filename);setWindowTitle(tr("KeePassX - %1").arg(filename));return OnFileSave();}void KeepassMainWindow::OnFileSettings(){CDbSettingsDlg dlg(this,db);if(dlg.exec())setStateFileModified(true);}void KeepassMainWindow::OnFileChangeKey(){CPasswordDialog dlg(this,true,false,true);dlg.setWindowTitle(db->file->fileName());if(dlg.exec()==1){ if(dlg.KeyType==BOTH || dlg.KeyType==KEYFILE){ if(!db->createKeyFile(dlg.keyfile)){ QMessageBox::warning(this,tr("Error"),tr("Could not create key file. The following error occured:\n%1").arg(db->getError()),tr("OK"),"","",0,0); return; } } if(dlg.password!="" && dlg.keyfile=="") db->CalcMasterKeyByPassword(dlg.password); if(dlg.password=="" && dlg.keyfile!="") db->CalcMasterKeyByFile(dlg.keyfile); if(dlg.password!="" && dlg.keyfile!="") db->CalcMasterKeyByFileAndPw(dlg.keyfile,dlg.password); setStateFileModified(true);}}void KeepassMainWindow::OnFileExit(){close();}void KeepassMainWindow::OnExportToTxt(){QString filename=QFileDialog::getSaveFileName(this,tr("Export To..."),QDir::homePath(),"*.txt");if(filename==QString())return;Export_Txt exp;QString err;exp.exportFile(filename,db,err);}void KeepassMainWindow::OnImportFromPwm(){if(FileOpen) if(!closeDatabase())return;QString filename=QFileDialog::getOpenFileName(this,tr("Open Database..."),QDir::homePath(),"*.pwm");if(filename!=QString::null){ Q_ASSERT(!FileOpen); db = new PwDatabase(); db->newDatabase(); CSimplePasswordDialog dlg(this,true); if(!dlg.exec()){ delete db; db=NULL; StatusBarGeneral->setText(tr("Ready")); } GroupView->db=db; EntryView->db=db; QString err; StatusBarGeneral->setText(tr("Loading Database...")); Import_PwManager import; if(import.importFile(filename,dlg.password,db,err)==true){ //SUCCESS setWindowTitle(tr("KeePassX [new]")); GroupView->updateItems(); EntryView->updateItems(0); setStateFileOpen(true); setStateFileModified(true); } else{ //ERROR delete db; StatusBarGeneral->setText(tr("Loading Failed")); if(err=="")err=tr("Unknown error in Import_PwManager::importFile()()"); QMessageBox::critical(this,tr("Error") ,tr("The following error occured while opening the database:\n%1") .arg(err),tr("OK")); } StatusBarGeneral->setText(tr("Ready")); }}void KeepassMainWindow::OnImportFromKWalletXml(){if(FileOpen) if(!closeDatabase())return;QString filename=QFileDialog::getOpenFileName(this,tr("Open Database..."),QDir::homePath(),"*.pwm");if(filename!=QString::null){ Q_ASSERT(!FileOpen); db = new PwDatabase(); db->newDatabase(); GroupView->db=db; EntryView->db=db; QString err; StatusBarGeneral->setText(tr("Loading Database..."));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -