diff --git a/trunk/dlgpreferences.cpp b/trunk/dlgpreferences.cpp index 05ad703..085c310 100644 --- a/trunk/dlgpreferences.cpp +++ b/trunk/dlgpreferences.cpp @@ -1,122 +1,200 @@ #include "dlgpreferences.h" #include "ui_dlgpreferences.h" #include #include #include #include +#include +#include #include +/******************************************************************************* + * Public + ******************************************************************************/ + DlgPreferences::DlgPreferences(Settings *p_sets, QWidget *p_parent) : QDialog(p_parent), ui(new Ui::DlgPreferences) { ui->setupUi(this); this->p_settings=p_sets; // Load current values this->LoadPreferences(); } DlgPreferences::~DlgPreferences() { delete ui; } +/******************************************************************************* + * Private slots + ******************************************************************************/ + void DlgPreferences::on_BtnCancel_clicked() { this->reject(); } void DlgPreferences::on_ListReportLocations_clicked(const QModelIndex &index) { if(!index.isValid()) { // No valid row selected, disable some buttons this->ui->BtnEditReportLoc->setEnabled(false); this->ui->BtnRemoveReportLoc->setEnabled(false); this->ui->BtnMoveReportLocUp->setEnabled(false); this->ui->BtnMoveReportLocDown->setEnabled(false); return; } if(this->ui->ListReportLocations->count()==1) { // Only one item left, disable up/down buttons this->ui->BtnEditReportLoc->setEnabled(true); this->ui->BtnRemoveReportLoc->setEnabled(true); this->ui->BtnMoveReportLocUp->setEnabled(false); this->ui->BtnMoveReportLocDown->setEnabled(false); return; } if(index.row()==0) { // First row selected, disable up button this->ui->BtnEditReportLoc->setEnabled(true); this->ui->BtnRemoveReportLoc->setEnabled(true); this->ui->BtnMoveReportLocUp->setEnabled(false); this->ui->BtnMoveReportLocDown->setEnabled(true); return; } if(index.row()==(this->ui->ListReportLocations->count()-1)) { // Last row selected, disable down button this->ui->BtnEditReportLoc->setEnabled(true); this->ui->BtnRemoveReportLoc->setEnabled(true); this->ui->BtnMoveReportLocUp->setEnabled(true); this->ui->BtnMoveReportLocDown->setEnabled(false); return; } // Any other valid row selected, enable up/down buttons this->ui->BtnEditReportLoc->setEnabled(true); this->ui->BtnRemoveReportLoc->setEnabled(true); this->ui->BtnMoveReportLocUp->setEnabled(true); this->ui->BtnMoveReportLocDown->setEnabled(true); } -void DlgPreferences::LoadPreferences() { - - // Populate report location list - QStringList report_dirs=this->p_settings->GetReportTemplateDirs(); - QListIterator it_report_dirs(report_dirs); - if(!report_dirs.isEmpty()) { - while(it_report_dirs.hasNext()) { - this->ui->ListReportLocations->addItem(it_report_dirs.next()); - } - this->ui->ListReportLocations->setCurrentRow(0); - this->ui->BtnEditReportLoc->setEnabled(true); - this->ui->BtnRemoveReportLoc->setEnabled(true); - this->ui->BtnMoveReportLocDown->setEnabled(true); - } -} - void DlgPreferences::on_BtnAddReportLoc_clicked() { - // TODO + QString new_loc=QFileDialog::getExistingDirectory(this, + tr("Select new report " + "directory")); + if(!new_loc.isEmpty()) { + this->ui->ListReportLocations->addItem(new_loc); + } } void DlgPreferences::on_BtnEditReportLoc_clicked() { - // TODO + QModelIndex cur_item=this->ui->ListReportLocations->currentIndex(); + if(!cur_item.isValid()) return; + + // Get selected item + QListWidgetItem *p_item=this->ui->ListReportLocations->item(cur_item.row()); + + // Let user select new directory + QString new_loc=QFileDialog::getExistingDirectory(this, + tr("Edit report directory"), + p_item->text()); + if(!new_loc.isEmpty()) { + p_item->setText(new_loc); + } } void DlgPreferences::on_BtnRemoveReportLoc_clicked() { QModelIndex cur_item=this->ui->ListReportLocations->currentIndex(); if(!cur_item.isValid()) return; QListWidgetItem *p_item= this->ui->ListReportLocations->takeItem(cur_item.row()); delete p_item; // Update buttons this->on_ListReportLocations_clicked( this->ui->ListReportLocations->currentIndex()); } void DlgPreferences::on_BtnMoveReportLocUp_clicked() { QModelIndex cur_item=this->ui->ListReportLocations->currentIndex(); if(!cur_item.isValid() || cur_item.row()==0) return; - // TODO: takeItem/insertItem + + // Move selected item up + QListWidgetItem *p_item= + this->ui->ListReportLocations->takeItem(cur_item.row()); + this->ui->ListReportLocations->insertItem(cur_item.row()-1,p_item); + + // Reselect moved item and update buttons + this->ui->ListReportLocations->setCurrentItem(p_item); + this->on_ListReportLocations_clicked( + this->ui->ListReportLocations->currentIndex()); } void DlgPreferences::on_BtnMoveReportLocDown_clicked() { - // TODO: takeItem/insertItem + QModelIndex cur_item=this->ui->ListReportLocations->currentIndex(); + if(!cur_item.isValid() || + cur_item.row()==(this->ui->ListReportLocations->count()-1)) + { + return; + } + + // Move selected item up + QListWidgetItem *p_item= + this->ui->ListReportLocations->takeItem(cur_item.row()); + this->ui->ListReportLocations->insertItem(cur_item.row()+1,p_item); + + // Reselect moved item and update buttons + this->ui->ListReportLocations->setCurrentItem(p_item); + this->on_ListReportLocations_clicked( + this->ui->ListReportLocations->currentIndex()); } void DlgPreferences::on_BtnReset_clicked() { - // TODO + if(QMessageBox::warning(this, + tr("Reset default settings"), + tr("Are you sure to reset all settings to their defaults?"), + QMessageBox::No, + QMessageBox::Yes)==QMessageBox::Yes) + { + this->p_settings->Reset(); + } +} + +void DlgPreferences::on_BtnOk_clicked() { + this->SavePreferences(); + this->accept(); +} + +/******************************************************************************* + * Private + ******************************************************************************/ + +void DlgPreferences::LoadPreferences() { + + // Populate report location list + this->ui->ListReportLocations->clear(); + QStringList report_dirs=this->p_settings->GetReportTemplateDirs(); + QListIterator it_report_dirs(report_dirs); + if(!report_dirs.isEmpty()) { + while(it_report_dirs.hasNext()) { + this->ui->ListReportLocations->addItem(it_report_dirs.next()); + } + this->ui->ListReportLocations->setCurrentRow(0); + this->ui->BtnEditReportLoc->setEnabled(true); + this->ui->BtnRemoveReportLoc->setEnabled(true); + this->ui->BtnMoveReportLocDown->setEnabled(true); + } +} + +void DlgPreferences::SavePreferences() { + + // Save report location list + QStringList report_dirs; + for(int i=0;iui->ListReportLocations->count();i++) { + report_dirs.append(this->ui->ListReportLocations->item(i)->text()); + } + this->p_settings->SetReportTemplateDirs(report_dirs); } diff --git a/trunk/dlgpreferences.h b/trunk/dlgpreferences.h index 93c5199..60c52eb 100644 --- a/trunk/dlgpreferences.h +++ b/trunk/dlgpreferences.h @@ -1,37 +1,40 @@ #ifndef DLGPREFERENCES_H #define DLGPREFERENCES_H #include #include #include "settings.h" namespace Ui { class DlgPreferences; } class DlgPreferences : public QDialog { Q_OBJECT public: explicit DlgPreferences(Settings *p_sets, QWidget *p_parent=0); ~DlgPreferences(); private slots: void on_BtnCancel_clicked(); void on_ListReportLocations_clicked(const QModelIndex &index); void on_BtnAddReportLoc_clicked(); void on_BtnEditReportLoc_clicked(); void on_BtnRemoveReportLoc_clicked(); void on_BtnMoveReportLocUp_clicked(); void on_BtnMoveReportLocDown_clicked(); void on_BtnReset_clicked(); + void on_BtnOk_clicked(); + private: Ui::DlgPreferences *ui; Settings *p_settings; void LoadPreferences(); + void SavePreferences(); }; #endif // DLGPREFERENCES_H diff --git a/trunk/settings.cpp b/trunk/settings.cpp index 12dee0d..47245b0 100644 --- a/trunk/settings.cpp +++ b/trunk/settings.cpp @@ -1,122 +1,137 @@ /******************************************************************************* * fred Copyright (c) 2011-2013 by Gillen Daniel * * * * Forensic Registry EDitor (fred) is a cross-platform M$ registry hive editor * * with special feautures useful during forensic analysis. * * * * This program is free software: you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the Free * * Software Foundation, either version 3 of the License, or (at your option) * * any later version. * * * * This program is distributed in the hope that it will be useful, but WITHOUT * * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * * more details. * * * * You should have received a copy of the GNU General Public License along with * * this program. If not, see . * *******************************************************************************/ #include "settings.h" #include #ifndef FRED_REPORT_TEMPLATE_DIR #ifndef __MINGW32__ #define SYSTEM_REPORT_TEMPLATE_DIR "/usr/share/fred/report_templates" #else #define SYSTEM_REPORT_TEMPLATE_DIR ".\\report_templates\\" #endif #endif #define APP_ORGANIZATION "pinguin.lu" #define APP_NAME "fred" +/******************************************************************************* + * Public + ******************************************************************************/ + Settings::Settings(QObject *p_parent) : QObject(p_parent) { // Init vars this->p_settings=NULL; this->initialized=false; this->user_settings_dir=QDir::homePath() .append(QDir::separator()).append(".fred"); this->user_report_template_dir=QString(this->user_settings_dir) .append(QDir::separator()) .append("report_templates"); // Make sure config dirs exist if(!QDir(this->user_settings_dir).exists()) { // User config dir does not exists, try to create it if(!QDir().mkpath(this->user_settings_dir)) { // TODO: Maybe warn user return; } } if(!QDir(this->user_report_template_dir).exists()) { // Create config dir sub folder for report templates if(!QDir().mkpath(this->user_report_template_dir)) { // TODO: Maybe warn user return; } } // Create / open settings #ifndef __MINGW32__ // On any Unix-like OS, settings should be saved in the .fred folder this->p_settings=new QSettings(QString(this->user_settings_dir) .append(QDir::separator()) .append("fred.conf"), QSettings::NativeFormat, this); #else // On Windows, it can be stored inside registry this->p_settings=new QSettings(QSettings::NativeFormat, QSettings::UserScope, APP_ORGANIZATION, APP_NAME, this); #endif if(this->p_settings->status()!=QSettings::NoError || !this->p_settings->isWritable()) { return; } this->initialized=true; } +void Settings::Reset() { + +} + +void Settings::SetReportTemplateDirs(QStringList &dirs) { + this->p_settings->setValue("ReportTemplateDirs",dirs); +} + QStringList Settings::GetReportTemplateDirs() { - return QStringList()<user_report_template_dir; + if(!this->initialized) return QStringList(); + return this->p_settings->value("ReportTemplateDirs", + QStringList()<user_report_template_dir + ).toStringList(); } void Settings::SaveWindowGeometry(QString window_name, QByteArray geometry) { if(!this->initialized) return; this->p_settings->setValue(QString("WindowGeometry_%1").arg(window_name), geometry); } QByteArray Settings::GetWindowGeometry(QString window_name) { if(!this->initialized) return QByteArray(); return this->p_settings->value(QString("WindowGeometry_%1") .arg(window_name)).toByteArray(); } void Settings::AddRecentFile(QString file) { // Get recent files QStringList recent_files=this->GetRecentFiles(); if(recent_files.contains(file)) { // File already exists in recent list. Simply move it to top recent_files.move(recent_files.indexOf(file),0); } else { // We only save 5 files at max if(recent_files.count()==5) recent_files.removeLast(); recent_files.prepend(file); } this->p_settings->setValue("RecentFiles",recent_files); } QStringList Settings::GetRecentFiles() { return this->p_settings->value("RecentFiles").toStringList(); } diff --git a/trunk/settings.h b/trunk/settings.h index 732e88c..4d65a7a 100644 --- a/trunk/settings.h +++ b/trunk/settings.h @@ -1,54 +1,57 @@ /******************************************************************************* * fred Copyright (c) 2011-2013 by Gillen Daniel * * * * Forensic Registry EDitor (fred) is a cross-platform M$ registry hive editor * * with special feautures useful during forensic analysis. * * * * This program is free software: you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the Free * * Software Foundation, either version 3 of the License, or (at your option) * * any later version. * * * * This program is distributed in the hope that it will be useful, but WITHOUT * * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * * more details. * * * * You should have received a copy of the GNU General Public License along with * * this program. If not, see . * *******************************************************************************/ #ifndef SETTINGS_H #define SETTINGS_H #include #include #include #include #include class Settings : public QObject { Q_OBJECT public: explicit Settings(QObject *p_parent=0); + void Reset(); + + void SetReportTemplateDirs(QStringList &dirs); QStringList GetReportTemplateDirs(); void SetSaveWindowGeometryStatus(bool save); bool GetSaveWindowGeometryStatus(); void SaveWindowGeometry(QString window_name, QByteArray geometry); QByteArray GetWindowGeometry(QString window_name); void SetRecentFileDepth(int depth); int GetRecentFileDepth(); void AddRecentFile(QString file); QStringList GetRecentFiles(); private: QSettings *p_settings; bool initialized; QString user_settings_dir; QString user_report_template_dir; }; #endif // SETTINGS_H