diff --git a/client/connectdb_widget.cpp b/client/connectdb_widget.cpp index 8a6eee6..804cf64 100644 --- a/client/connectdb_widget.cpp +++ b/client/connectdb_widget.cpp @@ -1,14 +1,28 @@ #include "connectdb_widget.h" #include "ui_connectdb_widget.h" -ConnectDbWidget::ConnectDbWidget(QWidget *parent) : +ConnectDbWidget::ConnectDbWidget(const QString& message, QWidget *parent) : QWidget(parent), ui(new Ui::ConnectDbWidget) { ui->setupUi(this); + ui->mMessageLabel->setText(message); + connect(ui->mButtonBox, SIGNAL(accepted()), this, SLOT(onOk())); + connect(ui->mButtonBox, SIGNAL(rejected()), this, SLOT(onCancel())); + connect(ui->mPasswordEdit, SIGNAL(returnPressed()), this, SLOT(onOk())); } ConnectDbWidget::~ConnectDbWidget() { delete ui; } + +void ConnectDbWidget::onOk() +{ + emit passwordEntered(ui->mPasswordEdit->text()); +} + +void ConnectDbWidget::onCancel() +{ + emit cancelled(); +} diff --git a/client/connectdb_widget.h b/client/connectdb_widget.h index a1f5e1b..d244078 100644 --- a/client/connectdb_widget.h +++ b/client/connectdb_widget.h @@ -12,11 +12,19 @@ class ConnectDbWidget : public QWidget Q_OBJECT public: - explicit ConnectDbWidget(QWidget *parent = nullptr); + explicit ConnectDbWidget(const QString& msg = QString(), QWidget *parent = nullptr); ~ConnectDbWidget(); private: Ui::ConnectDbWidget *ui; + +public slots: + void onOk(); + void onCancel(); + +signals: + void passwordEntered(const QString& password); + void cancelled(); }; #endif // CONNECTDB_WIDGET_H diff --git a/client/connectdb_widget.ui b/client/connectdb_widget.ui index f52aea9..55fa31f 100644 --- a/client/connectdb_widget.ui +++ b/client/connectdb_widget.ui @@ -10,10 +10,35 @@ 114 + + + 200 + 100 + + + + + 400 + 150 + + Form + + + + + + + Qt::PlainText + + + Qt::AlignCenter + + + @@ -25,7 +50,14 @@ - + + + QLineEdit::Password + + + Qt::AlignCenter + + diff --git a/client/mainwindow.cpp b/client/mainwindow.cpp index 7e085bc..98410e3 100644 --- a/client/mainwindow.cpp +++ b/client/mainwindow.cpp @@ -26,13 +26,17 @@ #include "finddialog.h" #include "startworkdialog.h" #include "stopworkdialog.h" +#include "connectdb_widget.h" +#include "openorcreatedb_widget.h" + #include +#include #define SETTINGS mSettings->data() MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), - ui(new Ui::MainWindow), mPasswordFailed(false), mFindInTasksDlg(this), mDockRecentMenu(nullptr) + mPasswordFailed(false), mFindInTasksDlg(this), mDockRecentMenu(nullptr) { mSettings = QSharedPointer(new Settings()); @@ -47,21 +51,30 @@ MainWindow::MainWindow(QWidget *parent) : mCurrentIntervalLabel = nullptr; mTrayIcon = nullptr; - ui->setupUi(this); - - // Hide Find line edit for now - ui->mFindFrame->setVisible(false); - helper::EscapeKeyEventFilter* eventFilter = new helper::EscapeKeyEventFilter(ui->mFindEdit); - connect(eventFilter, SIGNAL(escapePressed(QObject*)), this, SLOT(findRejected(QObject*))); - ui->mFindEdit->installEventFilter(eventFilter); - QCoreApplication::setApplicationName(APPNAME); - //QCoreApplication::setOrganizationName(COMPANY); - // Set this to your own appcast URL, of course - FvUpdater::sharedUpdater()->SetFeedURL("http://satorilight.com/LittAppCast.xml"); - initClient(); - QApplication::postEvent(this, new AttachDatabaseEvent()); + loadGeometry(); + + // Now check if database is already configured + QWidget* centralWidget = new QWidget(this); + setCentralWidget(centralWidget); + centralWidget->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + + // Check if database file exists + QString path = helper::path::pathToDatabase(); + + if (mSettings->data()[KEY_DB_FILENAME_SPECIFIED].toBool()) + path = mSettings->data()[KEY_DB_FILENAME].toString(); + + QString folder = QFileInfo(path).absoluteDir().path(); + Storage::instance().setPath(path); + + if (!QFile::exists(path)) + askNewDbPassword(); + else + askDbPassword(QString()); + + this->setUpdatesEnabled(true); } MainWindow::~MainWindow() @@ -75,12 +88,14 @@ void MainWindow::attachDatabase() { // Open database QString path = helper::path::pathToDatabase(); + if (mSettings->data()[KEY_DB_FILENAME_SPECIFIED].toBool()) path = mSettings->data()[KEY_DB_FILENAME].toString(); QString folder = QFileInfo(path).absoluteDir().path(); Storage::instance().setPath(path); + /* if (!QFile::exists(path)) { QDir().mkpath(folder); @@ -93,7 +108,6 @@ void MainWindow::attachDatabase() else { // See if there is stored password - QString password; if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool() && mSettings->data()[KEY_PASSWORD].toString() != NOPASSWORDSTRING) password = mSettings->data()[KEY_PASSWORD].toString(); else @@ -102,26 +116,10 @@ void MainWindow::attachDatabase() connect(mPasswordDlg, SIGNAL(finished(int)), this, SLOT(passwordDialogFinished(int))); mPasswordDlg->show(); } - } + }*/ this->setUpdatesEnabled(true); } -void MainWindow::openDatabase(const QString &password) -{ - Storage::instance().setKey(password); - if (!Storage::instance().open()) - { - mPasswordFailed = true; - alertBox(tr("Error"), tr("Failed to open database"), AlertType_CannotOpen); - } - else - if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool()) - { - mSettings->data()[KEY_PASSWORD] = password; - mSettings->save(); - } -} - void MainWindow::connectUiToDatabase() { ui->mTaskTree->setModel(mTaskTreeModel = new TaskTreeModel(false)); @@ -172,10 +170,6 @@ void MainWindow::alertBox(const QString &title, const QString &text, AlertType a connect(mAlertBox, SIGNAL(finished(int)), this, SLOT(criticalAlertFinished(int))); break; - case AlertType_CannotOpen: - connect(mAlertBox, SIGNAL(finished(int)), this, SLOT(openAlertFinished(int))); - break; - case AlertType_Warning: connect(mAlertBox, SIGNAL(finished(int)), this, SLOT(warningAlertFinished(int))); break; @@ -293,7 +287,7 @@ void MainWindow::save() QSharedPointer MainWindow::getUndoStack() const { - QTextDocument* doc = ui->mNoteEdit->document(); + //QTextDocument* doc = ui->mNoteEdit->document(); return QSharedPointer(new QByteArray()); } @@ -356,7 +350,7 @@ void MainWindow::loadGeometry() } // Set splitter position - if (settings.contains(KEY_SPLITTEROFFSET1) && settings.contains(KEY_SPLITTEROFFSET2)) + if (settings.contains(KEY_SPLITTEROFFSET1) && settings.contains(KEY_SPLITTEROFFSET2) && ui) { QList sizes = ui->mSplitter->sizes(); sizes[0] = settings.value(KEY_SPLITTEROFFSET1).toInt(); @@ -364,7 +358,7 @@ void MainWindow::loadGeometry() ui->mSplitter->setSizes(sizes); } - if (settings.contains(KEY_TIMESPLITTER_OFFSET1) && settings.contains(KEY_TIMESPLITTER_OFFSET2)) + if (settings.contains(KEY_TIMESPLITTER_OFFSET1) && settings.contains(KEY_TIMESPLITTER_OFFSET2) && ui) { QList sizes = ui->mTimeSplitter->sizes(); sizes[0] = settings.value(KEY_TIMESPLITTER_OFFSET1).toInt(); @@ -380,22 +374,24 @@ void MainWindow::sync() void MainWindow::closeEvent(QCloseEvent * ev) { - // Update DB if document was modified - if (ui->mNoteEdit->document()->isModified()) + if (ui) { - // See if there is active selection - QModelIndex index = ui->mTaskTree->currentIndex(); - if (index.isValid()) + // Update DB if document was modified + if (ui->mNoteEdit->document()->isModified()) { - PTask task = mTaskTreeModel->getTask(index); - task->setHtml(ui->mNoteEdit->document()->toPlainText()); - task->save(); + // See if there is active selection + QModelIndex index = ui->mTaskTree->currentIndex(); + if (index.isValid()) + { + PTask task = mTaskTreeModel->getTask(index); + task->setHtml(ui->mNoteEdit->document()->toPlainText()); + task->save(); + } } + + if (!mPasswordFailed) + save(); } - - if (!mPasswordFailed) - save(); - ev->accept(); } @@ -804,6 +800,56 @@ void MainWindow::updateAttachmentsLabel(PTask t) mAttachmentsLabel->setText(text); } +void MainWindow::setupMainUi() +{ + // Detach old widget + setCentralWidget(nullptr); + + // Construct main UI + ui = new Ui::MainWindow(); + ui->setupUi(this); + + // Hide Find line edit for now + ui->mFindFrame->setVisible(false); + helper::EscapeKeyEventFilter* eventFilter = new helper::EscapeKeyEventFilter(ui->mFindEdit); + connect(eventFilter, SIGNAL(escapePressed(QObject*)), this, SLOT(findRejected(QObject*))); + ui->mFindEdit->installEventFilter(eventFilter); + + //QCoreApplication::setOrganizationName(COMPANY); + // Set this to your own appcast URL, of course + FvUpdater::sharedUpdater()->SetFeedURL("http://satorilight.com/LittAppCast.xml"); + + initClient(); + QApplication::postEvent(this, new AttachDatabaseEvent()); +} + +// Ask password +void MainWindow::askDbPassword(const QString& message) +{ + setCentralWidget(nullptr); setCentralWidget(new QWidget(this)); + auto cdw = new ConnectDbWidget(message, centralWidget()); + connect(cdw, SIGNAL(passwordEntered(QString)), this, SLOT(onDbPasswordEntered(QString))); + connect(cdw, SIGNAL(cancelled()), this, SLOT(onDbPasswordCancelled())); + + QVBoxLayout* l = new QVBoxLayout(centralWidget()); + l->addWidget(cdw); + l->setAlignment(Qt::AlignCenter); + centralWidget()->setLayout(l); +} + +void MainWindow::askNewDbPassword() +{ + setCentralWidget(nullptr); setCentralWidget(new QWidget(this)); + auto w = new OpenOrCreateDbWidget(centralWidget()); + connect(w, &OpenOrCreateDbWidget::databaseChanged, [this](const QString& path) { onDatabaseChanged(path); }); + connect(w, &OpenOrCreateDbWidget::passwordEntered, [this](const QString& password) { onNewDbPasswordEntered(password); }); + + auto l = new QVBoxLayout(centralWidget()); + l->addWidget(w); + l->setAlignment(Qt::AlignCenter); + centralWidget()->setLayout(l); +} + void MainWindow::startOrStopTracking() { if (!mCurrentTask) @@ -1351,61 +1397,12 @@ void MainWindow::showTimeReport() trz.exec(); } -void MainWindow::newPasswordDialogFinished(int status) -{ - if (status == QDialog::Accepted) - { - Storage::instance().setKey(mNewPasswordDlg->password()); - if (!Storage::instance().create()) - { - // Quit application - mPasswordFailed = true; - alertBox(tr("Error"), tr("Failed to initialize database"), AlertType_Critical); - } - - // Remember password if it is specified in settings - if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool()) - mSettings->data()[KEY_PASSWORD] = mNewPasswordDlg->password(); - else - mSettings->data()[KEY_PASSWORD] = NOPASSWORDSTRING; - - // Flush settings - mSettings->save(); - - connectUiToDatabase(); - } - else - close(); -} - -void MainWindow::passwordDialogFinished(int status) -{ - QString password; - if (status == QDialog::Accepted) - { - password = mPasswordDlg->password(); - openDatabase(password); - connectUiToDatabase(); - } - else - { - mPasswordFailed = false; - QApplication::postEvent(this, new ClientCloseEvent()); - } -} void MainWindow::criticalAlertFinished(int /*status*/) { QApplication::postEvent(this, new ClientCloseEvent()); } -void MainWindow::openAlertFinished(int /*status*/) -{ - mPasswordDlg = new PasswordDlg(this); - connect(mPasswordDlg, SIGNAL(finished(int)), this, SLOT(passwordDialogFinished(int))); - mPasswordDlg->show(); -} - void MainWindow::warningAlertFinished(int /*status*/) { } @@ -1618,3 +1615,72 @@ void MainWindow::trayWindowDestroyed(QObject *object) { mTrayWindow = nullptr; } + +void MainWindow::onDbPasswordEntered(const QString& password) +{ + if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool()) + { + mSettings->data()[KEY_PASSWORD] = password; + mSettings->save(); + } + + Storage::instance().setKey(password); + if (!Storage::instance().open()) + { + askDbPassword(tr("Invalid password, please try again.")); + } + else + { + setupMainUi(); + connectUiToDatabase(); + loadGeometry(); + } +} + +void MainWindow::onDbPasswordCancelled() +{ + askNewDbPassword(); +} + +void MainWindow::onNewDbPasswordEntered(const QString& password) +{ + if (mSettings->data()[KEY_AUTOSAVE_PASSWORD].toBool()) + { + mSettings->data()[KEY_PASSWORD] = password; + mSettings->save(); + } + + Storage::instance().setKey(password); + + // Remove old database + ::remove(Storage::instance().path().toStdString().c_str()); + + // Try to create new one + if (!Storage::instance().create()) + { + showFatal(tr("Failed to create new database. Exiting.")); + } + else + { + setupMainUi(); + connectUiToDatabase(); + loadGeometry(); + } +} + +void MainWindow::onDatabaseChanged(const QString& path) +{ + // Bind to specific database + mSettings->data()[KEY_DB_FILENAME_SPECIFIED] = true; + mSettings->data()[KEY_DB_FILENAME] = path; + mSettings->save(); + Storage::instance().setPath(path); + + askDbPassword(); +} + +void MainWindow::showFatal(const QString& message) +{ + std::cerr << message.toStdString() << std::endl; + exit(EXIT_FAILURE); +} diff --git a/client/mainwindow.h b/client/mainwindow.h index 952c27a..7bbc36e 100644 --- a/client/mainwindow.h +++ b/client/mainwindow.h @@ -28,185 +28,201 @@ class MainWindow; class MainWindow : public QMainWindow { - Q_OBJECT + Q_OBJECT public: - explicit MainWindow(QWidget *parent = 0); - ~MainWindow(); + explicit MainWindow(QWidget *parent = nullptr); + ~MainWindow(); protected: - void closeEvent(QCloseEvent *); - void customEvent(QEvent *); + void closeEvent(QCloseEvent *); + void customEvent(QEvent *); private: - enum TrackingStopReason - { - TSR_None, // Used to init only - TSR_Manual, - TSR_Automatic - }; + enum TrackingStopReason + { + TSR_None, // Used to init only + TSR_Manual, + TSR_Automatic + }; - QSharedPointer mLogger; - QSharedPointer mActivityTracker; - TrackingStopReason mStopReason; + QSharedPointer mLogger; + QSharedPointer mActivityTracker; + TrackingStopReason mStopReason; - Ui::MainWindow *ui; - TaskTreeModel* mTaskTreeModel; - PTask mCurrentTask, mAutomaticTask; - QTimer* mUpdateTimer; - QLabel* mModifiedLabel; - QLabel* mCurrentIntervalLabel; - QLabel* mDuplicationSignalLabel; - QSystemTrayIcon *mTrayIcon; - QSharedPointer mSettings; - bool mPasswordFailed; - PasswordDlg* mPasswordDlg; - NewPasswordDlg* mNewPasswordDlg; - QMessageBox* mAlertBox; + Ui::MainWindow *ui = nullptr; + TaskTreeModel* mTaskTreeModel; + PTask mCurrentTask, mAutomaticTask; + QTimer* mUpdateTimer; + QLabel* mModifiedLabel; + QLabel* mCurrentIntervalLabel; + QLabel* mDuplicationSignalLabel; + QSystemTrayIcon *mTrayIcon; + QSharedPointer mSettings; + bool mPasswordFailed; + PasswordDlg* mPasswordDlg; + NewPasswordDlg* mNewPasswordDlg; + QMessageBox* mAlertBox; - // Time when current note was saved to DB last time - QDateTime mLastTimelineFlush; + // Time when current note was saved to DB last time + QDateTime mLastTimelineFlush; - // Attachments action - QAction* mAttachmentsAction; + // Attachments action + QAction* mAttachmentsAction; - // Attachments label - QLabel* mAttachmentsLabel; + // Attachments label + QLabel* mAttachmentsLabel; - // Delegate to draw task items in custom way - TaskItemDelegate mTaskItemDelegate; + // Delegate to draw task items in custom way + TaskItemDelegate mTaskItemDelegate; - // Find text in document start index - int mFindStartIndex; - QString mFindPattern; - FindInTasksDialog mFindInTasksDlg; + // Find text in document start index + int mFindStartIndex; + QString mFindPattern; + FindInTasksDialog mFindInTasksDlg; #ifdef TARGET_OSX - SleepTracker mSleepTracker; + SleepTracker mSleepTracker; #endif - QSharedPointer getUndoStack() const; - int mTimeFrameHeight; + QSharedPointer getUndoStack() const; + int mTimeFrameHeight; - QDateTime mTextModificationTime; - std::deque mRecentTrackingTasks; - QMenu* mDockRecentMenu; - QDialog* mTrayWindow = nullptr; + QDateTime mTextModificationTime; + std::deque mRecentTrackingTasks; + QMenu* mDockRecentMenu; + QDialog* mTrayWindow = nullptr; + QString mPassword = NOPASSWORDSTRING; - void saveGeometry(); - void loadGeometry(); - void applyTextFormat(const QTextCharFormat& fmt); - void initClient(); - // Checks if database exists, requests passwords etc. - void attachDatabase(); + void saveGeometry(); + void loadGeometry(); + void applyTextFormat(const QTextCharFormat& fmt); + void initClient(); - // Just open database via Storage::instance() - void openDatabase(const QString& password); + // Checks if database exists, requests passwords etc. + void attachDatabase(); - // Creates task tree model, adjusts UI - void connectUiToDatabase(); + // Just open database via Storage::instance() + void openDatabase(const QString& password); - // Shows window with alert text and button OK - enum AlertType - { - AlertType_Warning, - AlertType_Critical, - AlertType_CannotOpen - }; + // Creates task tree model, adjusts UI + void connectUiToDatabase(); - void alertBox(const QString& title, const QString& text, AlertType alertType); + // Shows window with alert text and button OK + enum AlertType + { + AlertType_Warning, + AlertType_Critical, + AlertType_CannotOpen + }; - void showTimeForSelectedTask(); - void showTimeForTrackingTask(); - void initTrayIcon(); - void removeTrayIcon(); + void alertBox(const QString& title, const QString& text, AlertType alertType); - enum TrayShowMessage - { - Tray_ShowMessage = 0, - Tray_SkipMessage = 1 - }; - void updateTrayIcon(TrayShowMessage flag); - void handleTrackableState(PTask task); - void trayContextualMenu(); - int showTrayWindow(QDialog* dlg); - void installDockMenu(); - void startTracking(PTask t); - void prepareRecentTasksMenu(QMenu* submenu); - void updateAttachmentsLabel(PTask t); + void showTimeForSelectedTask(); + void showTimeForTrackingTask(); + void initTrayIcon(); + void removeTrayIcon(); + + enum TrayShowMessage + { + Tray_ShowMessage = 0, + Tray_SkipMessage = 1 + }; + void updateTrayIcon(TrayShowMessage flag); + void handleTrackableState(PTask task); + void trayContextualMenu(); + int showTrayWindow(QDialog* dlg); + void installDockMenu(); + void startTracking(PTask t); + void prepareRecentTasksMenu(QMenu* submenu); + void updateAttachmentsLabel(PTask t); + + // Builds main UI layut + void setupMainUi(); + + // Show UI to ask password for existing DB + void askDbPassword(const QString& message = QString("")); + + // Show UI to ask password for new database (or select existing database file) + void askNewDbPassword(); + + // Show UI about fatal alert & button to quit app + void showFatal(const QString& message); signals: - void onTimeFormatChanged(); - void onTimeChanged(); + void onTimeFormatChanged(); + void onTimeChanged(); public slots: - void save(); - void sync(); - void about(); - void preferences(); - void print(); - void quit(); - void newRootTask(); - void newTask(); - void newSibling(); - void moveUp(); - void moveDown(); - void renameTask(); - void deleteTask(); - void taskTreeContextualMenu(const QPoint& point); - void taskIndexChanged(const QModelIndex&, const QModelIndex&); - void idleDetected(); - void activityDetected(); - void startOrStopTracking(); - void startTracking(); - void startTrackingRecent(); + void save(); + void sync(); + void about(); + void preferences(); + void print(); + void quit(); + void newRootTask(); + void newTask(); + void newSibling(); + void moveUp(); + void moveDown(); + void renameTask(); + void deleteTask(); + void taskTreeContextualMenu(const QPoint& point); + void taskIndexChanged(const QModelIndex&, const QModelIndex&); + void idleDetected(); + void activityDetected(); + void startOrStopTracking(); + void startTracking(); + void startTrackingRecent(); - void stopTracking(TrackingStopReason reason, time_t current_utc = time(nullptr)); - void updateData(); - void add10Mins(); + void stopTracking(TrackingStopReason reason, time_t current_utc = time(nullptr)); + void updateData(); + void add10Mins(); - void editSelectionChanged(); - void editPositionChanged(); - void editFormatChanged(const QTextCharFormat& fmt); + void editSelectionChanged(); + void editPositionChanged(); + void editFormatChanged(const QTextCharFormat& fmt); - void editUndo(); - void editRedo(); - void editCut(); - void editCopy(); - void editPaste(); - void editDelete(); - void editSelectAll(); + void editUndo(); + void editRedo(); + void editCut(); + void editCopy(); + void editPaste(); + void editDelete(); + void editSelectAll(); - void iconActivated(QSystemTrayIcon::ActivationReason reason); - void timeFormatChanged(); - void showTimeline(); - void showTimeReport(); + void iconActivated(QSystemTrayIcon::ActivationReason reason); + void timeFormatChanged(); + void showTimeline(); + void showTimeReport(); - void newPasswordDialogFinished(int status); - void passwordDialogFinished(int status); - void criticalAlertFinished(int status); - void openAlertFinished(int status); - void warningAlertFinished(int status); - void toolbarVisibilityChanged(bool visible); - void showHideToolbar(); - void showAttachments(); - void checkForUpdates(); - void systemSleep(); - void systemResume(); - void changeTimeTrackableFlag(bool trackable); - void find(); - void findInTasks(); - void findRequested(); - void findRejected(QObject* obj); - void taskTextChanged(); - void taskMoved(PTask task); - void focusTaskTree(); - void focusTaskText(); - void showMainWindow(); - void continueOnIdle(); - void breakOnIdle(const QDateTime& stopTime); - void startOnActivity(); - void stopOnActivity(); - void trayWindowDestroyed(QObject* object); + void criticalAlertFinished(int status); + void warningAlertFinished(int status); + void toolbarVisibilityChanged(bool visible); + void showHideToolbar(); + void showAttachments(); + void checkForUpdates(); + void systemSleep(); + void systemResume(); + void changeTimeTrackableFlag(bool trackable); + void find(); + void findInTasks(); + void findRequested(); + void findRejected(QObject* obj); + void taskTextChanged(); + void taskMoved(PTask task); + void focusTaskTree(); + void focusTaskText(); + void showMainWindow(); + void continueOnIdle(); + void breakOnIdle(const QDateTime& stopTime); + void startOnActivity(); + void stopOnActivity(); + void trayWindowDestroyed(QObject* object); + + void onDbPasswordEntered(const QString& password); + void onDbPasswordCancelled(); + void onNewDbPasswordEntered(const QString& password); + void onDatabaseChanged(const QString& path); }; #endif // MAINWINDOW_H diff --git a/client/openorcreatedb_widget.cpp b/client/openorcreatedb_widget.cpp index 73efccd..1e077ae 100644 --- a/client/openorcreatedb_widget.cpp +++ b/client/openorcreatedb_widget.cpp @@ -1,14 +1,55 @@ #include "openorcreatedb_widget.h" #include "ui_openorcreatedb_widget.h" +#include + OpenOrCreateDbWidget::OpenOrCreateDbWidget(QWidget *parent) : QWidget(parent), ui(new Ui::OpenOrCreateDbWidget) { ui->setupUi(this); + + connect(ui->mNewPasswordEdit1, &QLineEdit::returnPressed, [this]() { ui->mNewPasswordEdit2->setFocus(); }); + connect(ui->mNewPasswordEdit2, &QLineEdit::returnPressed, [this]() { handleEnteredPasswords(); }); + connect(ui->mSelectDatabaseButton, &QPushButton::clicked, [this]() { askForDatabase(); }); + connect(ui->mDialogButtonBox, &QDialogButtonBox::accepted, [this]() + { + if (mDbPath.isEmpty()) + handleEnteredPasswords(); + else + emit databaseChanged(ui->mSelectedDbLabel->text()); + }); } OpenOrCreateDbWidget::~OpenOrCreateDbWidget() { delete ui; } + +void OpenOrCreateDbWidget::handleEnteredPasswords() +{ + if (ui->mNewPasswordEdit1->text().isEmpty() && ui->mNewPasswordEdit2->text().isEmpty()) + { + ui->mMessageLabel->setText("Password can't be empty. Please try again!"); + } + if (ui->mNewPasswordEdit1->text() == ui->mNewPasswordEdit2->text()) + emit passwordEntered(ui->mNewPasswordEdit1->text()); + else + { + ui->mNewPasswordEdit1->setText(""); + ui->mNewPasswordEdit2->setText(""); + ui->mNewPasswordEdit1->setFocus(); + ui->mMessageLabel->setText("Passwords are not the same. Please try again!"); + } +} + +void OpenOrCreateDbWidget::askForDatabase() +{ + QString path = QFileDialog::getOpenFileName(this, "Please select existing database", QString(), "*.litt"); + if (path.size()) + { + mDbPath = path; + ui->mSelectedDbLabel->setText(path); + } +} + diff --git a/client/openorcreatedb_widget.h b/client/openorcreatedb_widget.h index f343bb2..f9113bf 100644 --- a/client/openorcreatedb_widget.h +++ b/client/openorcreatedb_widget.h @@ -17,6 +17,14 @@ public: private: Ui::OpenOrCreateDbWidget *ui; + + QString mDbPath; + void handleEnteredPasswords(); + void askForDatabase(); + +signals: + void databaseChanged(const QString& path); + void passwordEntered(const QString& password); }; #endif // OPENORCREATEDB_WIDGET_H diff --git a/client/openorcreatedb_widget.ui b/client/openorcreatedb_widget.ui index 16852ca..a0f2ad3 100644 --- a/client/openorcreatedb_widget.ui +++ b/client/openorcreatedb_widget.ui @@ -6,10 +6,22 @@ 0 0 - 549 - 384 + 400 + 300 + + + 400 + 300 + + + + + 400 + 400 + + Form @@ -59,6 +71,16 @@ + + + + + + + Qt::AlignCenter + + + @@ -106,7 +128,7 @@ Qt::Horizontal - QDialogButtonBox::Ok + QDialogButtonBox::Ok|QDialogButtonBox::Reset true