src: split indexing dialog to multiple classes

This commit is contained in:
mlangkabel
2019-10-22 17:38:38 +02:00
parent c5d94fbd08
commit ed1d4b7d33
26 changed files with 1274 additions and 923 deletions
+14
View File
@@ -295,22 +295,36 @@ add_files(
qt/window/QtEulaWindow.h
qt/window/QtIndexingDialog.cpp
qt/window/QtIndexingDialog.h
qt/window/QtIndexingProgressDialog.cpp
qt/window/QtIndexingProgressDialog.h
qt/window/QtIndexingReportDialog.cpp
qt/window/QtIndexingReportDialog.h
qt/window/QtIndexingStartDialog.cpp
qt/window/QtIndexingStartDialog.h
qt/window/QtKeyboardShortcuts.cpp
qt/window/QtKeyboardShortcuts.h
qt/window/QtKnownProgressDialog.cpp
qt/window/QtKnownProgressDialog.h
qt/window/QtMainWindow.cpp
qt/window/QtMainWindow.h
qt/window/QtPathListDialog.cpp
qt/window/QtPathListDialog.h
qt/window/QtPreferencesWindow.cpp
qt/window/QtPreferencesWindow.h
qt/window/QtProgressBarDialog.cpp
qt/window/QtProgressBarDialog.h
qt/window/QtSelectPathsDialog.cpp
qt/window/QtSelectPathsDialog.h
qt/window/QtStartScreen.cpp
qt/window/QtStartScreen.h
qt/window/QtTextEditDialog.cpp
qt/window/QtTextEditDialog.h
qt/window/QtUnknownProgressDialog.cpp
qt/window/QtUnknownProgressDialog.h
qt/window/QtWindow.cpp
qt/window/QtWindow.h
qt/window/QtWindowBase.cpp
qt/window/QtWindowBase.h
qt/window/QtWindowStack.cpp
qt/window/QtWindowStack.h
+4 -4
View File
@@ -31,11 +31,11 @@ public slots:
void commentToggled();
protected:
virtual void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE;
virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE;
virtual void resizeEvent(QResizeEvent* event) override;
virtual void showEvent(QShowEvent* event) override;
virtual void enterEvent(QEvent *event) Q_DECL_OVERRIDE;
virtual void leaveEvent(QEvent *event) Q_DECL_OVERRIDE;
virtual void enterEvent(QEvent *event) override;
virtual void leaveEvent(QEvent *event) override;
private slots:
void activateClicked();
+9 -9
View File
@@ -35,10 +35,10 @@ public:
QtLineNumberArea(QtCodeArea* codeArea);
virtual ~QtLineNumberArea();
QSize sizeHint() const Q_DECL_OVERRIDE;
QSize sizeHint() const override;
protected:
virtual void paintEvent(QPaintEvent* event) Q_DECL_OVERRIDE;
virtual void paintEvent(QPaintEvent* event) override;
private:
QtCodeArea* m_codeArea;
@@ -62,7 +62,7 @@ public:
);
virtual ~QtCodeArea();
virtual QSize sizeHint() const Q_DECL_OVERRIDE;
virtual QSize sizeHint() const override;
void lineNumberAreaPaintEvent(QPaintEvent* event);
int lineNumberDigits() const;
@@ -93,13 +93,13 @@ public:
void ensureLocationIdVisible(Id locationId, int parentWidth, bool animated);
protected:
virtual void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE;
virtual void mouseReleaseEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
virtual void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
virtual void mouseMoveEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
virtual void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
virtual void resizeEvent(QResizeEvent* event) override;
virtual void mouseReleaseEvent(QMouseEvent* event) override;
virtual void mousePressEvent(QMouseEvent* event) override;
virtual void mouseMoveEvent(QMouseEvent* event) override;
virtual void wheelEvent(QWheelEvent *event) override;
virtual void contextMenuEvent(QContextMenuEvent* event) Q_DECL_OVERRIDE;
virtual void contextMenuEvent(QContextMenuEvent* event) override;
virtual void focusTokenIds(const std::vector<Id>& tokenIds) override;
virtual void defocusTokenIds(const std::vector<Id>& tokenIds) override;
+7 -7
View File
@@ -30,7 +30,7 @@ public:
~QtCodeField();
virtual QSize sizeHint() const Q_DECL_OVERRIDE;
virtual QSize sizeHint() const override;
size_t getStartLineNumber() const;
size_t getEndLineNumber() const;
@@ -44,14 +44,14 @@ public:
void annotateText();
protected:
virtual void paintEvent(QPaintEvent* event) Q_DECL_OVERRIDE;
virtual void enterEvent(QEvent* event) Q_DECL_OVERRIDE;
virtual void leaveEvent(QEvent* event) Q_DECL_OVERRIDE;
virtual void paintEvent(QPaintEvent* event) override;
virtual void enterEvent(QEvent* event) override;
virtual void leaveEvent(QEvent* event) override;
virtual void mouseMoveEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
virtual void mouseReleaseEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
virtual void mouseMoveEvent(QMouseEvent* event) override;
virtual void mouseReleaseEvent(QMouseEvent* event) override;
virtual void contextMenuEvent(QContextMenuEvent* event) Q_DECL_OVERRIDE;
virtual void contextMenuEvent(QContextMenuEvent* event) override;
virtual void focusTokenIds(const std::vector<Id>& tokenIds);
virtual void defocusTokenIds(const std::vector<Id>& tokenIds);
+40 -67
View File
@@ -9,6 +9,11 @@
#include "StorageAccess.h"
#include "QtIndexingDialog.h"
#include "QtIndexingProgressDialog.h"
#include "QtIndexingReportDialog.h"
#include "QtIndexingStartDialog.h"
#include "QtKnownProgressDialog.h"
#include "QtUnknownProgressDialog.h"
#include "QtMainWindow.h"
#include "QtWindow.h"
#include "MessageIndexingStatus.h"
@@ -83,13 +88,11 @@ void QtDialogView::showProgressDialog(const std::wstring& title, const std::wstr
[=]()
{
bool sendStatusMessage = true;
QtIndexingDialog* window = dynamic_cast<QtIndexingDialog*>(m_windowStack.getTopWindow());
if (!window || window->getType() != QtIndexingDialog::DIALOG_PROGRESS)
QtKnownProgressDialog* window = dynamic_cast<QtKnownProgressDialog*>(m_windowStack.getTopWindow());
if (!window)
{
m_windowStack.clearWindows();
window = createWindow();
window->setupProgress(m_dialogsHideable);
window = createWindow<QtKnownProgressDialog>(m_dialogsHideable);
}
else
{
@@ -119,8 +122,8 @@ void QtDialogView::hideProgressDialog()
m_onQtThread(
[=]()
{
QtIndexingDialog* window = dynamic_cast<QtIndexingDialog*>(m_windowStack.getTopWindow());
if (window && window->getType() == QtIndexingDialog::DIALOG_PROGRESS)
QtKnownProgressDialog* window = dynamic_cast<QtKnownProgressDialog*>(m_windowStack.getTopWindow());
if (window)
{
m_windowStack.popWindow();
}
@@ -146,9 +149,9 @@ void QtDialogView::startIndexingDialog(
m_dialogsVisible = true;
m_windowStack.clearWindows();
QtIndexingDialog* window = createWindow();
QtIndexingStartDialog* window = createWindow<QtIndexingStartDialog>(enabledModes, initialMode);
connect(window, &QtIndexingDialog::setMode,
std::function<void(RefreshMode)> onRefreshModeChanged = (
[=](RefreshMode refreshMode)
{
auto it = m_refreshInfos.find(refreshMode);
@@ -191,7 +194,9 @@ void QtDialogView::startIndexingDialog(
}
);
connect(window, &QtIndexingDialog::startIndexing,
connect(window, &QtIndexingStartDialog::setMode, onRefreshModeChanged);
connect(window, &QtIndexingStartDialog::startIndexing,
[=](RefreshMode refreshMode)
{
RefreshInfo info = m_refreshInfos.find(refreshMode)->second;
@@ -206,7 +211,7 @@ void QtDialogView::startIndexingDialog(
}
);
connect(window, &QtWindow::canceled,
connect(window, &QtIndexingDialog::canceled,
[=]()
{
Task::dispatch(TabId::app(), std::make_shared<TaskLambda>(
@@ -220,7 +225,8 @@ void QtDialogView::startIndexingDialog(
}
);
window->setupStart(enabledModes, initialMode);
onRefreshModeChanged(initialMode);
window->hide();
setUIBlocked(true);
}
@@ -245,20 +251,17 @@ void QtDialogView::updateIndexingDialog(
MessageStatus(stati, false, false, m_dialogsVisible).dispatch();
}
QtIndexingDialog* window = dynamic_cast<QtIndexingDialog*>(m_windowStack.getTopWindow());
QtIndexingProgressDialog* window = dynamic_cast<QtIndexingProgressDialog*>(m_windowStack.getTopWindow());
if (!window)
{
m_windowStack.clearWindows();
window = createWindow();
window->setupIndexing(m_dialogsHideable);
window = createWindow<QtIndexingProgressDialog>(m_dialogsHideable);
}
if (window && window->getType() == QtIndexingDialog::DIALOG_INDEXING)
{
window->updateIndexingProgress(
finishedFileCount, totalFileCount, sourcePaths.empty() ? FilePath() : sourcePaths.back());
}
window->updateIndexingProgress(
finishedFileCount, totalFileCount, sourcePaths.empty() ? FilePath() : sourcePaths.back());
m_mainWindow->setWindowsTaskbarProgress(float(finishedFileCount) / totalFileCount);
setUIBlocked(m_dialogsVisible);
@@ -274,8 +277,8 @@ void QtDialogView::updateCustomIndexingDialog(
m_onQtThread(
[=]()
{
QtIndexingDialog* window = dynamic_cast<QtIndexingDialog*>(m_windowStack.getTopWindow());
if (window && window->getType() == QtIndexingDialog::DIALOG_INDEXING)
QtIndexingProgressDialog* window = dynamic_cast<QtIndexingProgressDialog*>(m_windowStack.getTopWindow());
if (window)
{
window->updateTitle("Executing Commands");
}
@@ -296,10 +299,9 @@ DatabasePolicy QtDialogView::finishedIndexingDialog(
m_dialogsVisible = true;
m_windowStack.clearWindows();
QtIndexingDialog* window = createWindow();
window->setupReport(indexedFileCount, totalIndexedFileCount, completedFileCount, totalFileCount, time, interrupted);
QtIndexingReportDialog* window = createWindow<QtIndexingReportDialog>(indexedFileCount, totalIndexedFileCount, completedFileCount, totalFileCount, time, interrupted);
window->updateErrorCount(errorInfo.total, errorInfo.fatal);
connect(window, &QtWindow::finished,
connect(window, &QtIndexingDialog::finished,
[this, &policy]()
{
setUIBlocked(false);
@@ -307,7 +309,7 @@ DatabasePolicy QtDialogView::finishedIndexingDialog(
m_resultReady = true;
}
);
connect(window, &QtWindow::canceled,
connect(window, &QtIndexingDialog::canceled,
[this, &policy]()
{
setUIBlocked(false);
@@ -380,13 +382,13 @@ void QtDialogView::setParentWindow(QtWindow* window)
void QtDialogView::showUnknownProgress(const std::wstring& title, const std::wstring& message, bool stacked)
{
QtIndexingDialog* window = nullptr;
QtUnknownProgressDialog* window = nullptr;
if (!stacked)
{
window = dynamic_cast<QtIndexingDialog*>(m_windowStack.getTopWindow());
window = dynamic_cast<QtUnknownProgressDialog*>(m_windowStack.getTopWindow());
if (window && window->getType() != QtIndexingDialog::DIALOG_UNKNOWN_PROGRESS)
if (!window)
{
m_windowStack.clearWindows();
window = nullptr;
@@ -395,8 +397,7 @@ void QtDialogView::showUnknownProgress(const std::wstring& title, const std::wst
if (!window)
{
window = createWindow();
window->setupUnknownProgress(m_dialogsHideable);
window = createWindow<QtUnknownProgressDialog>(m_dialogsHideable);
}
window->updateTitle(QString::fromStdWString(title));
@@ -407,8 +408,8 @@ void QtDialogView::showUnknownProgress(const std::wstring& title, const std::wst
void QtDialogView::hideUnknownProgress()
{
QtIndexingDialog* window = dynamic_cast<QtIndexingDialog*>(m_windowStack.getTopWindow());
if (window && window->getType() == QtIndexingDialog::DIALOG_UNKNOWN_PROGRESS)
QtUnknownProgressDialog* window = dynamic_cast<QtUnknownProgressDialog*>(m_windowStack.getTopWindow());
if (window)
{
m_windowStack.popWindow();
}
@@ -494,40 +495,12 @@ void QtDialogView::handleMessage(MessageWindowClosed* message)
void QtDialogView::updateErrorCount(size_t errorCount, size_t fatalCount)
{
if (QtIndexingDialog* window = dynamic_cast<QtIndexingDialog*>(m_windowStack.getTopWindow()))
if (QtIndexingProgressDialog* progressWindow = dynamic_cast<QtIndexingProgressDialog*>(m_windowStack.getTopWindow()))
{
window->updateErrorCount(errorCount, fatalCount);
progressWindow->updateErrorCount(errorCount, fatalCount);
}
else if (QtIndexingReportDialog* reportWindow = dynamic_cast<QtIndexingReportDialog*>(m_windowStack.getTopWindow()))
{
reportWindow->updateErrorCount(errorCount, fatalCount);
}
}
QtIndexingDialog* QtDialogView::createWindow()
{
QtIndexingDialog* window = nullptr;
if (m_parentWindow)
{
window = new QtIndexingDialog(m_parentWindow);
}
else
{
window = new QtIndexingDialog(m_mainWindow);
}
connect(window, &QtWindow::canceled, &m_windowStack, &QtWindowStack::popWindow);
connect(window, &QtWindow::finished, &m_windowStack, &QtWindowStack::clearWindows);
connect(window, &QtIndexingDialog::visibleChanged, this, &QtDialogView::dialogVisibilityChanged);
if (m_mainWindow)
{
connect(m_mainWindow, &QtMainWindow::hideIndexingDialog, window, &QtWindow::handleClosePress);
}
m_windowStack.pushWindow(window);
if (!m_dialogsVisible)
{
window->hide();
}
return window;
}
+34 -2
View File
@@ -11,7 +11,6 @@
#include "MessageIndexingShowDialog.h"
#include "MessageWindowClosed.h"
class QtIndexingDialog;
class QtMainWindow;
class QtWindow;
@@ -66,7 +65,40 @@ private:
void updateErrorCount(size_t errorCount, size_t fatalCount);
QtIndexingDialog* createWindow();
template <typename DialogType, typename... ParamTypes>
DialogType* createWindow(ParamTypes... params)
{
DialogType* window = nullptr;
if (m_parentWindow)
{
window = new DialogType(params..., m_parentWindow);
}
else
{
window = new DialogType(params..., m_mainWindow);
}
connect(window, &QtIndexingDialog::canceled, &m_windowStack, &QtWindowStack::popWindow);
connect(window, &QtIndexingDialog::finished, &m_windowStack, &QtWindowStack::clearWindows);
connect(window, &QtIndexingDialog::visibleChanged, this, &QtDialogView::dialogVisibilityChanged);
if (m_mainWindow)
{
connect(
m_mainWindow, &QtMainWindow::hideIndexingDialog,
std::bind(&QtDialogView::dialogVisibilityChanged, this, true)
);
}
m_windowStack.pushWindow(window);
if (!m_dialogsVisible)
{
window->hide();
}
return window;
}
QtMainWindow* m_mainWindow;
QtWindow* m_parentWindow;
+1 -1
View File
@@ -25,7 +25,7 @@ public:
void setBookmarks(const std::vector<std::shared_ptr<Bookmark>>& bookmarks);
protected:
virtual void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE;
virtual void resizeEvent(QResizeEvent* event) override;
virtual void handleClose() override;
virtual void handleNext() override;
+74 -551
View File
@@ -1,507 +1,26 @@
#include "QtIndexingDialog.h"
#include <QCheckBox>
#include <QLabel>
#include <QRadioButton>
#include <QPushButton>
#include "MessageErrorsHelpMessage.h"
#include "MessageIndexingInterrupted.h"
#include "QtDeviceScaledPixmap.h"
#include "QtHelpButton.h"
#include "QtProgressBar.h"
#include "ResourcePaths.h"
#include "TimeStamp.h"
#include "utilityQt.h"
QtIndexingDialog::QtIndexingDialog(QWidget* parent)
: QtWindow(true, parent)
, m_type(DIALOG_MESSAGE)
, m_top(nullptr)
, m_topRatio(0)
, m_progressBar(nullptr)
, m_percentLabel(nullptr)
, m_messageLabel(nullptr)
, m_filePathLabel(nullptr)
, m_errorWidget(nullptr)
, m_sizeHint(QSize(450, 450))
QLabel* QtIndexingDialog::createTitleLabel(QString title, QBoxLayout* layout)
{
setSizeGripStyle(false);
}
QLabel* label = new QLabel(title);
label->setObjectName("title");
label->setAlignment(Qt::AlignRight | Qt::AlignBottom);
QSize QtIndexingDialog::sizeHint() const
{
return m_sizeHint;
}
QtIndexingDialog::DialogType QtIndexingDialog::getType() const
{
return m_type;
}
void QtIndexingDialog::setupStart(const std::vector<RefreshMode>& enabledModes, const RefreshMode initialMode)
{
setType(DIALOG_START_INDEXING);
QBoxLayout* layout = createLayout();
addTitle("Start Indexing", layout);
layout->addSpacing(5);
m_clearLabel = createMessageLabel(layout);
m_indexLabel = createMessageLabel(layout);
m_clearLabel->setVisible(false);
m_indexLabel->setVisible(false);
layout->addStretch();
QHBoxLayout* subLayout = new QHBoxLayout();
subLayout->addStretch();
QVBoxLayout* modeLayout = new QVBoxLayout();
modeLayout->setSpacing(7);
QHBoxLayout* modeTitleLayout = new QHBoxLayout();
modeTitleLayout->setSpacing(7);
QLabel* modeLabel = createMessageLabel(modeTitleLayout);
modeLabel->setText("Mode:");
modeLabel->setAlignment(Qt::AlignLeft);
QtHelpButton* helpButton = new QtHelpButton(
"Indexing Modes",
"<b>Updated files:</b> Reindexes all files that were modified since the last indexing, all files depending "
"on those and new files.<br /><br />"
"<b>Incomplete & updated files:</b> Reindexes all files that had errors during last indexing, all files "
"depending on those and all updated files.<br /><br />"
"<b>All files:</b> Deletes the previous index and reindexes all files.<br /><br />"
);
helpButton->setColor(Qt::white);
modeTitleLayout->addWidget(helpButton);
modeTitleLayout->addStretch();
modeLayout->addLayout(modeTitleLayout);
modeLayout->addSpacing(5);
m_refreshModeButtons.emplace(REFRESH_UPDATED_FILES, new QRadioButton("Updated files"));
m_refreshModeButtons.emplace(REFRESH_UPDATED_AND_INCOMPLETE_FILES, new QRadioButton("Incomplete && updated files"));
m_refreshModeButtons.emplace(REFRESH_ALL_FILES, new QRadioButton("All files"));
std::function<void(bool)> func =
[=](bool checked)
{
if (!checked)
{
return;
}
for (auto p : m_refreshModeButtons)
{
if (p.second->isChecked())
{
emit setMode(p.first);
return;
}
}
};
for (auto p : m_refreshModeButtons)
if (layout)
{
QRadioButton* button = p.second;
button->setObjectName("option");
button->setEnabled(false);
if (p.first == initialMode)
{
button->setChecked(true);
}
modeLayout->addWidget(button);
connect(button, &QRadioButton::toggled, func);
layout->addWidget(label, 0, Qt::AlignRight);
}
for (RefreshMode mode : enabledModes)
{
m_refreshModeButtons[mode]->setEnabled(true);
}
subLayout->addLayout(modeLayout);
layout->addLayout(subLayout);
layout->addSpacing(20);
addButtons(layout);
updateNextButton("Start");
updateCloseButton("Cancel");
m_sizeHint = QSize(350, 310);
finishSetup();
emit setMode(initialMode);
}
void QtIndexingDialog::updateRefreshInfo(const RefreshInfo& info)
{
QRadioButton* button = m_refreshModeButtons.find(info.mode)->second;
if (!button->isChecked())
{
button->setChecked(true);
}
size_t clearCount = info.filesToClear.size();
size_t indexCount = info.filesToIndex.size();
m_clearLabel->setText("Files to clear: " + QString::number(clearCount));
m_indexLabel->setText("Source files to index: " + QString::number(indexCount));
m_clearLabel->setVisible(clearCount && info.mode != REFRESH_ALL_FILES);
m_indexLabel->setVisible(true);
}
void QtIndexingDialog::setupIndexing(bool hideable)
{
setType(DIALOG_INDEXING);
QBoxLayout* layout = createLayout();
addTopAndProgressBar(0.38);
addTitle("Indexing Files", layout);
addPercentLabel(layout);
addMessageLabel(layout);
addFilePathLabel(layout);
layout->addSpacing(12);
addErrorWidget(layout);
layout->addStretch();
addButtons(layout);
updateNextButton("Hide");
setNextVisible(hideable);
updateCloseButton("Stop");
m_sizeHint = QSize(350, 350);
finishSetup();
}
void QtIndexingDialog::setupReport(
size_t indexedFileCount, size_t totalIndexedFileCount, size_t completedFileCount, size_t totalFileCount,
float time, bool interrupted)
{
setType(DIALOG_REPORT);
QBoxLayout* layout = createLayout();
addTitle("Finished Indexing", layout);
layout->addSpacing(5);
createMessageLabel(layout)->setText(
"Source files indexed: " + QString::number(indexedFileCount) + "/" + QString::number(totalIndexedFileCount)
);
createMessageLabel(layout)->setText(
"Total files completed: " + QString::number(completedFileCount) + "/" + QString::number(totalFileCount)
);
layout->addSpacing(12);
createMessageLabel(layout)->setText("Time: " + QString::fromStdString(TimeStamp::secondsToString(time)));
layout->addSpacing(12);
addErrorWidget(layout);
layout->addStretch();
addButtons(layout);
if (interrupted)
{
updateNextButton("Keep");
updateCloseButton("Discard");
}
else
{
updateNextButton("OK");
setCloseVisible(false);
}
m_sizeHint = QSize(interrupted ? 400 : 430, 280);
if (interrupted)
{
updateTitle("Interrupted Indexing");
}
else
{
addFlag();
}
finishSetup();
}
void QtIndexingDialog::setupUnknownProgress(bool hideable)
{
setType(DIALOG_UNKNOWN_PROGRESS);
QBoxLayout* layout = createLayout();
addTopAndProgressBar(0.5);
addTitle("Status", layout);
addMessageLabel(layout);
layout->addStretch();
if (hideable)
{
addButtons(layout);
updateNextButton("Hide");
setCloseVisible(false);
}
m_sizeHint = QSize(350, 280);
m_progressBar->showUnknownProgressAnimated();
setCancelAble(false);
finishSetup();
}
void QtIndexingDialog::setupProgress(bool hideable)
{
setType(DIALOG_PROGRESS);
QBoxLayout* layout = createLayout();
addTopAndProgressBar(0.5);
addTitle("Progress", layout);
addPercentLabel(layout);
addMessageLabel(layout);
layout->addStretch();
if (hideable)
{
addButtons(layout);
updateNextButton("Hide");
setCloseVisible(false);
}
m_sizeHint = QSize(350, 280);
setCancelAble(false);
finishSetup();
}
void QtIndexingDialog::updateTitle(const QString& title)
{
if (m_title)
{
m_title->setText(title);
}
}
void QtIndexingDialog::updateMessage(const QString& message)
{
if (m_messageLabel)
{
m_messageLabel->setText(message);
}
}
std::wstring QtIndexingDialog::getMessage() const
{
if (m_messageLabel)
{
return m_messageLabel->text().toStdWString();
}
return L"";
}
void QtIndexingDialog::updateProgress(size_t progress)
{
size_t percent = std::min<size_t>(std::max<size_t>(progress, 0), 100);
m_progressBar->showProgress(percent);
m_percentLabel->setText(QString::number(percent) + "% Progress");
setGeometries();
}
size_t QtIndexingDialog::getProgress() const
{
return m_progressBar->getProgress();
}
void QtIndexingDialog::updateIndexingProgress(size_t fileCount, size_t totalFileCount, const FilePath& sourcePath)
{
updateMessage(QString::number(fileCount) + "/" + QString::number(totalFileCount) + " File" + (totalFileCount > 1 ? "s" : ""));
int progress = 0;
if (totalFileCount > 0)
{
progress = fileCount * 100 / totalFileCount;
}
if (!sourcePath.empty())
{
m_sourcePath = QString::fromStdWString(sourcePath.wstr());
}
updateProgress(progress);
}
void QtIndexingDialog::updateErrorCount(size_t errorCount, size_t fatalCount)
{
if (m_errorWidget && errorCount)
{
QString str = QString::number(errorCount) + " Error";
if (errorCount > 1)
{
str += "s";
}
if (fatalCount)
{
str += " (" + QString::number(fatalCount) + " Fatal)";
}
QPushButton* errorCount = m_errorWidget->findChild<QPushButton*>("errorCount");
errorCount->setText(str);
m_errorWidget->show();
}
}
void QtIndexingDialog::resizeEvent(QResizeEvent* event)
{
QtWindow::resizeEvent(event);
setGeometries();
}
void QtIndexingDialog::handleNext()
{
if (m_type == DIALOG_START_INDEXING)
{
for (auto p : m_refreshModeButtons)
{
if (p.second->isChecked())
{
emit startIndexing(p.first);
return;
}
}
}
if (m_type == DIALOG_INDEXING || m_type == DIALOG_PROGRESS || m_type == DIALOG_UNKNOWN_PROGRESS)
{
emit visibleChanged(false);
return;
}
if (m_type == DIALOG_REPORT)
{
MessageErrorsHelpMessage().dispatch();
}
QtWindow::handleNext();
}
void QtIndexingDialog::handleClose()
{
if (m_type == DIALOG_INDEXING || m_type == DIALOG_PROGRESS || m_type == DIALOG_UNKNOWN_PROGRESS)
{
emit visibleChanged(false);
return;
}
QtWindow::handleClose();
}
void QtIndexingDialog::handleCancelPress()
{
if (m_type == DIALOG_INDEXING)
{
if (isVisible())
{
MessageIndexingInterrupted().dispatch();
}
return;
}
QtWindow::handleClose();
}
void QtIndexingDialog::setType(DialogType type)
{
m_type = type;
}
QBoxLayout* QtIndexingDialog::createLayout()
{
m_window->setStyleSheet(
m_window->styleSheet() +
"#window { "
"background: #2E3C86;"
"border: none;"
"}"
);
setStyleSheet((
utility::getStyleSheet(ResourcePaths::getGuiPath().concatenate(L"window/window.css")) +
utility::getStyleSheet(ResourcePaths::getGuiPath().concatenate(L"indexing_dialog/indexing_dialog.css"))
).c_str());
QVBoxLayout* layout = new QVBoxLayout(this);
layout->setContentsMargins(20, 20, 20, 0);
layout->setSpacing(3);
m_content->setLayout(layout);
return layout;
}
void QtIndexingDialog::addTopAndProgressBar(float topRatio)
{
m_topRatio = topRatio;
m_top = new QWidget(m_window);
m_top->setObjectName("topHalf");
m_top->setGeometry(0, 0, 0, 0);
m_top->show();
m_top->lower();
m_progressBar = new QtProgressBar(m_window);
m_progressBar->setGeometry(0, 0, 0, 0);
}
void QtIndexingDialog::addTitle(QString title, QBoxLayout* layout)
{
m_title = new QLabel(title, this);
m_title->setObjectName("title");
m_title->setAlignment(Qt::AlignRight | Qt::AlignBottom);
if (m_top)
{
m_title->show();
}
else if (layout)
{
layout->addWidget(m_title, 0, Qt::AlignRight);
}
}
void QtIndexingDialog::addPercentLabel(QBoxLayout* layout)
{
m_percentLabel = new QLabel("0% Progress");
m_percentLabel->setObjectName("percent");
layout->addWidget(m_percentLabel, 0, Qt::AlignRight);
}
void QtIndexingDialog::addMessageLabel(QBoxLayout* layout)
{
m_messageLabel = createMessageLabel(layout);
return label;
}
QLabel* QtIndexingDialog::createMessageLabel(QBoxLayout* layout)
@@ -514,18 +33,10 @@ QLabel* QtIndexingDialog::createMessageLabel(QBoxLayout* layout)
return label;
}
void QtIndexingDialog::addFilePathLabel(QBoxLayout* layout)
QWidget* QtIndexingDialog::createErrorWidget(QBoxLayout* layout)
{
m_filePathLabel = new QLabel();
m_filePathLabel->setObjectName("filePath");
m_filePathLabel->setAlignment(Qt::AlignRight);
layout->addWidget(m_filePathLabel);
}
void QtIndexingDialog::addErrorWidget(QBoxLayout* layout)
{
m_errorWidget = new QWidget();
QHBoxLayout* errorLayout = new QHBoxLayout(m_errorWidget);
QWidget* errorWidget = new QWidget();
QHBoxLayout* errorLayout = new QHBoxLayout(errorWidget);
errorLayout->setContentsMargins(0, 0, 0, 0);
errorLayout->setSpacing(5);
@@ -550,76 +61,88 @@ void QtIndexingDialog::addErrorWidget(QBoxLayout* layout)
errorLayout->addWidget(helpButton);
layout->addWidget(m_errorWidget, 0, Qt::AlignRight);
m_errorWidget->hide();
layout->addWidget(errorWidget, 0, Qt::AlignRight);
errorWidget->hide();
return errorWidget;
}
void QtIndexingDialog::addButtons(QBoxLayout* layout)
{
m_nextButton = new QPushButton("Next");
m_nextButton->setObjectName("windowButton");
connect(m_nextButton, &QPushButton::clicked, this, &QtIndexingDialog::handleNextPress);
m_closeButton = new QPushButton("Cancel");
m_closeButton->setObjectName("windowButton");
connect(m_closeButton, &QPushButton::clicked, this, &QtIndexingDialog::handleCancelPress);
QHBoxLayout* buttons = new QHBoxLayout();
buttons->addWidget(m_closeButton);
buttons->addStretch();
buttons->addWidget(m_nextButton);
layout->addLayout(buttons);
setNextDefault(true);
}
void QtIndexingDialog::addFlag()
QLabel* QtIndexingDialog::createFlagLabel(QWidget* parent)
{
QtDeviceScaledPixmap flag(QString::fromStdWString(
ResourcePaths::getGuiPath().concatenate(L"indexing_dialog/flag.png").wstr()));
flag.scaleToWidth(120);
QLabel* flagLabel = new QLabel(this);
QLabel* flagLabel = new QLabel(parent);
flagLabel->setPixmap(flag.pixmap());
flagLabel->resize(flag.width(), flag.height());
flagLabel->move(15, 75);
flagLabel->show();
return flagLabel;
}
void QtIndexingDialog::setGeometries()
QtIndexingDialog::QtIndexingDialog(bool isSubWindow, QWidget* parent)
: QtWindowBase(isSubWindow, parent)
{
if (m_top)
{
QMargins margins = m_content->layout()->contentsMargins();
margins.setTop(m_window->size().height() * m_topRatio + 10);
m_content->layout()->setContentsMargins(margins);
m_window->setStyleSheet(
m_window->styleSheet() +
"#window { "
"background: #2E3C86;"
"border: none;"
"}"
);
m_top->setGeometry(0, 0, m_window->size().width(), m_window->size().height() * m_topRatio);
setStyleSheet((
utility::getStyleSheet(ResourcePaths::getGuiPath().concatenate(L"window/window.css")) +
utility::getStyleSheet(ResourcePaths::getGuiPath().concatenate(L"indexing_dialog/indexing_dialog.css"))
).c_str());
m_title->setGeometry(
45,
m_window->size().height() * m_topRatio - 50,
m_window->size().width() - 60,
40
);
}
m_layout = new QVBoxLayout(this);
m_layout->setContentsMargins(20, 20, 20, 0);
m_layout->setSpacing(3);
if (m_progressBar)
{
m_progressBar->setGeometry(0, m_window->size().height() * m_topRatio - 5, m_window->size().width(), 10);
}
if (m_filePathLabel)
{
m_filePathLabel->setText(m_filePathLabel->fontMetrics().elidedText(
m_sourcePath, Qt::ElideLeft, m_filePathLabel->width()));
}
m_content->setLayout(m_layout);
}
void QtIndexingDialog::finishSetup()
void QtIndexingDialog::resizeEvent(QResizeEvent* event)
{
setupDone();
QSize size = event->size();
setGeometries();
if (size.width() < 300)
{
size.setWidth(300);
resize(size);
return;
}
if (size.height() < 200)
{
size.setHeight(200);
resize(size);
return;
}
if (!m_isSubWindow)
{
m_window->resize(size);
return;
}
const QSize windowSize = size - QSize(30, 30);
m_window->resize(windowSize);
m_window->move(15, 15);
}
void QtIndexingDialog::setupDone()
{
QSize actualSize = m_window->sizeHint() + QSize(50, 50);
QSize preferredSize = sizeHint();
QSize size(qMax(actualSize.width(), preferredSize.width()), qMax(actualSize.height(), preferredSize.height()));
resize(size);
moveToCenter();
}
+24 -86
View File
@@ -1,107 +1,45 @@
#ifndef QT_INDEXING_DIALOG_H
#define QT_INDEXING_DIALOG_H
#include <functional>
#include <QHBoxLayout>
#include <QResizeEvent>
#include <QSizeGrip>
#include <QWidget>
#include "RefreshInfo.h"
#include "QtWindow.h"
#include "QtWindowStack.h"
#include "QtWindowBase.h"
class QCheckBox;
class QLabel;
class QRadioButton;
class QtProgressBar;
class QPushButton;
class QVBoxLayout;
class QtIndexingDialog
: public QtWindow
: public QtWindowBase
{
Q_OBJECT
signals:
void setMode(RefreshMode mode);
void startIndexing(RefreshMode mode);
void visibleChanged(bool visible);
protected:
static QBoxLayout* createLayout(QWidget* parent);
static QLabel* createTitleLabel(QString title, QBoxLayout* layout);
static QLabel* createMessageLabel(QBoxLayout* layout);
static QWidget* createErrorWidget(QBoxLayout* layout);
static QLabel* QtIndexingDialog::createFlagLabel(QWidget* parent);
public:
enum DialogType
{
DIALOG_MESSAGE,
DIALOG_UNKNOWN_PROGRESS,
DIALOG_PROGRESS,
DIALOG_START_INDEXING,
DIALOG_INDEXING,
DIALOG_REPORT
};
QtIndexingDialog(bool isSubWindow, QWidget* parent = nullptr);
virtual QSize sizeHint() const = 0;
QtIndexingDialog(QWidget* parent = 0);
QSize sizeHint() const override;
DialogType getType() const;
void setupStart(const std::vector<RefreshMode>& enabledModes, const RefreshMode initialMode);
void updateRefreshInfo(const RefreshInfo& info);
void setupIndexing(bool hideable);
void setupReport(
size_t indexedFileCount, size_t totalIndexedFileCount, size_t completedFileCount, size_t totalFileCount,
float time, bool interrupted);
void setupUnknownProgress(bool hideable);
void setupProgress(bool hideable);
void updateTitle(const QString& title);
void updateMessage(const QString& message);
std::wstring getMessage() const;
void updateProgress(size_t progress);
size_t getProgress() const;
void updateIndexingProgress(size_t fileCount, size_t totalFileCount, const FilePath& sourcePath);
void updateErrorCount(size_t errorCount, size_t fatalCount);
signals:
void finished();
void canceled();
void visibleChanged(bool visible);
protected:
void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE;
void resizeEvent(QResizeEvent* event) override;
virtual void handleNext() override;
virtual void handleClose() override;
void setupDone();
private slots:
void handleCancelPress();
private:
void setType(DialogType type);
QBoxLayout* createLayout();
void addTopAndProgressBar(float topRatio);
void addTitle(QString title, QBoxLayout* layout);
void addPercentLabel(QBoxLayout* layout);
void addMessageLabel(QBoxLayout* layout);
QLabel* createMessageLabel(QBoxLayout* layout);
void addFilePathLabel(QBoxLayout* layout);
void addErrorWidget(QBoxLayout* layout);
void addButtons(QBoxLayout* layout);
void addFlag();
void setGeometries();
void finishSetup();
DialogType m_type;
QWidget* m_top;
float m_topRatio;
QtProgressBar* m_progressBar;
QLabel* m_percentLabel;
QLabel* m_messageLabel;
QLabel* m_filePathLabel;
QWidget* m_errorWidget;
// start indexing
QLabel* m_clearLabel;
QLabel* m_indexLabel;
std::map<RefreshMode, QRadioButton*> m_refreshModeButtons;
QSize m_sizeHint;
QString m_sourcePath;
QVBoxLayout* m_layout;
};
#endif // QT_INDEXING_DIALOG_H
@@ -0,0 +1,122 @@
#include "QtIndexingProgressDialog.h"
#include <QLabel>
#include <QPushButton>
#include "MessageIndexingInterrupted.h"
QtIndexingProgressDialog::QtIndexingProgressDialog(bool hideable, QWidget* parent)
: QtProgressBarDialog(0.38, true, parent)
, m_filePathLabel(nullptr)
, m_errorWidget(nullptr)
{
setSizeGripStyle(false);
updateTitle("Indexing Files");
m_filePathLabel = new QLabel();
m_filePathLabel->setObjectName("filePath");
m_filePathLabel->setAlignment(Qt::AlignRight);
m_layout->addWidget(m_filePathLabel);
m_layout->addSpacing(12);
m_errorWidget = QtIndexingDialog::createErrorWidget(m_layout);
m_layout->addStretch();
{
QHBoxLayout* buttons = new QHBoxLayout();
QPushButton* stopButton = new QPushButton("Stop");
stopButton->setObjectName("windowButton");
connect(stopButton, &QPushButton::clicked, this, &QtIndexingProgressDialog::onStopPressed);
buttons->addWidget(stopButton);
buttons->addStretch();
QPushButton* hideButton = new QPushButton("Hide");
hideButton->setObjectName("windowButton");
hideButton->setDefault(true);
connect(hideButton, &QPushButton::clicked, this, &QtIndexingProgressDialog::onHidePressed);
buttons->addWidget(hideButton);
m_layout->addLayout(buttons);
}
setupDone();
setGeometries();
}
QSize QtIndexingProgressDialog::sizeHint() const
{
return QSize(350, 350);
}
void QtIndexingProgressDialog::updateIndexingProgress(size_t fileCount, size_t totalFileCount, const FilePath& sourcePath)
{
updateMessage(QString::number(fileCount) + "/" + QString::number(totalFileCount) + " File" + (totalFileCount > 1 ? "s" : ""));
int progress = 0;
if (totalFileCount > 0)
{
progress = fileCount * 100 / totalFileCount;
}
if (!sourcePath.empty())
{
m_sourcePath = QString::fromStdWString(sourcePath.wstr());
}
updateProgress(progress);
}
void QtIndexingProgressDialog::updateErrorCount(size_t errorCount, size_t fatalCount)
{
if (m_errorWidget && errorCount)
{
QString str = QString::number(errorCount) + " Error";
if (errorCount > 1)
{
str += "s";
}
if (fatalCount)
{
str += " (" + QString::number(fatalCount) + " Fatal)";
}
QPushButton* errorCount = m_errorWidget->findChild<QPushButton*>("errorCount");
errorCount->setText(str);
m_errorWidget->show();
}
}
void QtIndexingProgressDialog::onHidePressed()
{
emit visibleChanged(false);
}
void QtIndexingProgressDialog::onStopPressed()
{
if (isVisible())
{
MessageIndexingInterrupted().dispatch();
}
}
void QtIndexingProgressDialog::closeEvent(QCloseEvent* event)
{
emit visibleChanged(false);
}
void QtIndexingProgressDialog::setGeometries()
{
QtProgressBarDialog::setGeometries();
if (m_filePathLabel)
{
m_filePathLabel->setText(m_filePathLabel->fontMetrics().elidedText(
m_sourcePath, Qt::ElideLeft, m_filePathLabel->width()));
}
}
@@ -0,0 +1,33 @@
#ifndef QT_INDEXING_PROGRESS_DIALOG_H
#define QT_INDEXING_PROGRESS_DIALOG_H
#include "QtProgressBarDialog.h"
class QLabel;
class QtIndexingProgressDialog
: public QtProgressBarDialog
{
Q_OBJECT
public:
QtIndexingProgressDialog(bool hideable, QWidget* parent = 0);
QSize sizeHint() const override;
void updateIndexingProgress(size_t fileCount, size_t totalFileCount, const FilePath& sourcePath);
void updateErrorCount(size_t errorCount, size_t fatalCount);
protected:
void closeEvent(QCloseEvent* event) override;
void setGeometries() override;
private:
void onHidePressed();
void onStopPressed();
QLabel* m_filePathLabel;
QWidget* m_errorWidget;
QString m_sourcePath;
};
#endif // QT_INDEXING_PROGRESS_DIALOG_H
@@ -0,0 +1,130 @@
#include "QtIndexingReportDialog.h"
#include <QLabel>
#include <QPushButton>
#include "MessageErrorsHelpMessage.h"
#include "TimeStamp.h"
QtIndexingReportDialog::QtIndexingReportDialog(
size_t indexedFileCount, size_t totalIndexedFileCount, size_t completedFileCount, size_t totalFileCount, float time, bool interrupted, QWidget* parent)
: QtIndexingDialog(true, parent)
, m_interrupted(interrupted)
{
setSizeGripStyle(false);
if (interrupted)
{
QtIndexingDialog::createTitleLabel("Interrupted Indexing", m_layout);
}
else
{
QtIndexingDialog::createTitleLabel("Finished Indexing", m_layout);
}
m_layout->addSpacing(5);
QtIndexingDialog::createMessageLabel(m_layout)->setText(
"Source files indexed: " + QString::number(indexedFileCount) + "/" + QString::number(totalIndexedFileCount)
);
QtIndexingDialog::createMessageLabel(m_layout)->setText(
"Total files completed: " + QString::number(completedFileCount) + "/" + QString::number(totalFileCount)
);
m_layout->addSpacing(12);
QtIndexingDialog::createMessageLabel(m_layout)->setText("Time: " + QString::fromStdString(TimeStamp::secondsToString(time)));
m_layout->addSpacing(12);
m_errorWidget = QtIndexingDialog::createErrorWidget(m_layout);
m_layout->addStretch();
{
QHBoxLayout* buttons = new QHBoxLayout();
if (interrupted)
{
QPushButton* discardButton = new QPushButton("Discard");
discardButton->setObjectName("windowButton");
connect(discardButton, &QPushButton::clicked, this, &QtIndexingReportDialog::onDiscardPressed);
buttons->addWidget(discardButton);
}
buttons->addStretch();
QPushButton* confirmButton = new QPushButton(interrupted ? "Keep" : "OK");
confirmButton->setObjectName("windowButton");
confirmButton->setDefault(true);
connect(confirmButton, &QPushButton::clicked, this, &QtIndexingReportDialog::onConfirmPressed);
buttons->addWidget(confirmButton);
m_layout->addLayout(buttons);
}
if (!interrupted)
{
QtIndexingDialog::createFlagLabel(this);
}
setupDone();
}
QSize QtIndexingReportDialog::sizeHint() const
{
return QSize(m_interrupted ? 400 : 430, 280);
}
void QtIndexingReportDialog::updateErrorCount(size_t errorCount, size_t fatalCount)
{
if (m_errorWidget && errorCount)
{
QString str = QString::number(errorCount) + " Error";
if (errorCount > 1)
{
str += "s";
}
if (fatalCount)
{
str += " (" + QString::number(fatalCount) + " Fatal)";
}
QPushButton* errorCount = m_errorWidget->findChild<QPushButton*>("errorCount");
errorCount->setText(str);
m_errorWidget->show();
}
}
void QtIndexingReportDialog::closeEvent(QCloseEvent* event)
{
emit QtIndexingDialog::canceled();
}
void QtIndexingReportDialog::keyPressEvent(QKeyEvent* event)
{
if (!m_interrupted) // in this case we only show one button, so it is clear what to do
{
switch (event->key())
{
case Qt::Key_Escape:
case Qt::Key_Return:
onConfirmPressed();
break;
}
}
QWidget::keyPressEvent(event);
}
void QtIndexingReportDialog::onConfirmPressed()
{
MessageErrorsHelpMessage().dispatch();
emit QtIndexingDialog::finished();
}
void QtIndexingReportDialog::onDiscardPressed()
{
emit QtIndexingDialog::canceled();
}
@@ -0,0 +1,29 @@
#ifndef QT_INDEXING_REPORT_DIALOG_H
#define QT_INDEXING_REPORT_DIALOG_H
#include "QtIndexingDialog.h"
class QtIndexingReportDialog
: public QtIndexingDialog
{
Q_OBJECT
public:
QtIndexingReportDialog(size_t indexedFileCount, size_t totalIndexedFileCount, size_t completedFileCount, size_t totalFileCount, float time, bool interrupted, QWidget* parent = 0);
QSize sizeHint() const override;
void updateErrorCount(size_t errorCount, size_t fatalCount);
protected:
void closeEvent(QCloseEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;
private:
void onConfirmPressed();
void onDiscardPressed();
QWidget* m_errorWidget;
bool m_interrupted;
};
#endif // QT_INDEXING_REPORT_DIALOG_H
@@ -0,0 +1,184 @@
#include "QtIndexingStartDialog.h"
#include <QLabel>
#include <QRadioButton>
#include <QPushButton>
#include "QtHelpButton.h"
QtIndexingStartDialog::QtIndexingStartDialog(const std::vector<RefreshMode>& enabledModes, const RefreshMode initialMode, QWidget* parent)
: QtIndexingDialog(true, parent)
{
setSizeGripStyle(false);
QtIndexingDialog::createTitleLabel("Start Indexing", m_layout);
m_layout->addSpacing(5);
m_clearLabel = QtIndexingDialog::createMessageLabel(m_layout);
m_indexLabel = QtIndexingDialog::createMessageLabel(m_layout);
m_clearLabel->setVisible(false);
m_indexLabel->setVisible(false);
m_layout->addStretch();
QHBoxLayout* subLayout = new QHBoxLayout();
subLayout->addStretch();
QVBoxLayout* modeLayout = new QVBoxLayout();
modeLayout->setSpacing(7);
QHBoxLayout* modeTitleLayout = new QHBoxLayout();
modeTitleLayout->setSpacing(7);
QLabel* modeLabel = QtIndexingDialog::createMessageLabel(modeTitleLayout);
modeLabel->setText("Mode:");
modeLabel->setAlignment(Qt::AlignLeft);
QtHelpButton* helpButton = new QtHelpButton(
"Indexing Modes",
"<b>Updated files:</b> Reindexes all files that were modified since the last indexing, all files depending "
"on those and new files.<br /><br />"
"<b>Incomplete & updated files:</b> Reindexes all files that had errors during last indexing, all files "
"depending on those and all updated files.<br /><br />"
"<b>All files:</b> Deletes the previous index and reindexes all files.<br /><br />"
);
helpButton->setColor(Qt::white);
modeTitleLayout->addWidget(helpButton);
modeTitleLayout->addStretch();
modeLayout->addLayout(modeTitleLayout);
modeLayout->addSpacing(5);
m_refreshModeButtons.emplace(REFRESH_UPDATED_FILES, new QRadioButton("Updated files"));
m_refreshModeButtons.emplace(REFRESH_UPDATED_AND_INCOMPLETE_FILES, new QRadioButton("Incomplete && updated files"));
m_refreshModeButtons.emplace(REFRESH_ALL_FILES, new QRadioButton("All files"));
std::function<void(bool)> func =
[=](bool checked)
{
if (!checked)
{
return;
}
for (auto p : m_refreshModeButtons)
{
if (p.second->isChecked())
{
emit setMode(p.first);
return;
}
}
};
for (auto p : m_refreshModeButtons)
{
QRadioButton* button = p.second;
button->setObjectName("option");
button->setEnabled(false);
if (p.first == initialMode)
{
button->setChecked(true);
}
modeLayout->addWidget(button);
connect(button, &QRadioButton::toggled, func);
}
for (RefreshMode mode : enabledModes)
{
m_refreshModeButtons[mode]->setEnabled(true);
}
subLayout->addLayout(modeLayout);
m_layout->addLayout(subLayout);
m_layout->addSpacing(20);
{
QHBoxLayout* buttons = new QHBoxLayout();
QPushButton* cancelButton = new QPushButton("Cancel");
cancelButton->setObjectName("windowButton");
connect(cancelButton, &QPushButton::clicked, this, &QtIndexingStartDialog::onCancelPressed);
buttons->addWidget(cancelButton);
buttons->addStretch();
QPushButton* startButton = new QPushButton("Start");
startButton->setObjectName("windowButton");
startButton->setDefault(true);
connect(startButton, &QPushButton::clicked, this, &QtIndexingStartDialog::onStartPressed);
buttons->addWidget(startButton);
m_layout->addLayout(buttons);
}
setupDone();
}
QSize QtIndexingStartDialog::sizeHint() const
{
return QSize(350, 310);
}
void QtIndexingStartDialog::updateRefreshInfo(const RefreshInfo& info)
{
QRadioButton* button = m_refreshModeButtons.find(info.mode)->second;
if (!button->isChecked())
{
button->setChecked(true);
}
size_t clearCount = info.filesToClear.size();
size_t indexCount = info.filesToIndex.size();
m_clearLabel->setText("Files to clear: " + QString::number(clearCount));
m_indexLabel->setText("Source files to index: " + QString::number(indexCount));
m_clearLabel->setVisible(clearCount && info.mode != REFRESH_ALL_FILES);
m_indexLabel->setVisible(true);
}
void QtIndexingStartDialog::resizeEvent(QResizeEvent* event)
{
QtIndexingDialog::resizeEvent(event);
}
void QtIndexingStartDialog::closeEvent(QCloseEvent* event)
{
emit QtIndexingDialog::canceled();
}
void QtIndexingStartDialog::keyPressEvent(QKeyEvent* event)
{
switch (event->key())
{
case Qt::Key_Escape:
onCancelPressed();
break;
case Qt::Key_Return:
onStartPressed();
break;
}
QWidget::keyPressEvent(event);
}
void QtIndexingStartDialog::onStartPressed()
{
for (auto p : m_refreshModeButtons)
{
if (p.second->isChecked())
{
emit startIndexing(p.first);
return;
}
}
emit finished();
}
void QtIndexingStartDialog::onCancelPressed()
{
emit canceled();
}
@@ -0,0 +1,39 @@
#ifndef QT_INDEXING_START_DIALOG_H
#define QT_INDEXING_START_DIALOG_H
#include "RefreshInfo.h"
#include "QtIndexingDialog.h"
class QLabel;
class QRadioButton;
class QtIndexingStartDialog
: public QtIndexingDialog
{
Q_OBJECT
signals:
void setMode(RefreshMode mode);
void startIndexing(RefreshMode mode);
public:
QtIndexingStartDialog(const std::vector<RefreshMode>& enabledModes, const RefreshMode initialMode, QWidget* parent = 0);
QSize sizeHint() const override;
void updateRefreshInfo(const RefreshInfo& info);
protected:
void closeEvent(QCloseEvent* event) override;
void resizeEvent(QResizeEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;
private:
void onStartPressed();
void onCancelPressed();
QLabel* m_clearLabel;
QLabel* m_indexLabel;
std::map<RefreshMode, QRadioButton*> m_refreshModeButtons;
};
#endif // QT_INDEXING_START_DIALOG_H
+1 -1
View File
@@ -15,7 +15,7 @@ public:
void updateSize();
protected:
virtual void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
virtual void wheelEvent(QWheelEvent *event) override;
};
class QtKeyboardShortcuts
@@ -0,0 +1,45 @@
#include "QtKnownProgressDialog.h"
#include <QPushButton>
QtKnownProgressDialog::QtKnownProgressDialog(bool hideable, QWidget* parent)
: QtProgressBarDialog(0.5, true, parent)
{
setSizeGripStyle(false);
updateTitle("Progress");
m_layout->addStretch();
if (hideable)
{
QHBoxLayout* buttons = new QHBoxLayout();
buttons->addStretch();
QPushButton* hideButton = new QPushButton("Hide");
hideButton->setObjectName("windowButton");
hideButton->setDefault(true);
connect(hideButton, &QPushButton::clicked, this, &QtKnownProgressDialog::onHidePressed);
buttons->addWidget(hideButton);
m_layout->addLayout(buttons);
}
setupDone();
setGeometries();
}
QSize QtKnownProgressDialog::sizeHint() const
{
return QSize(350, 280);
}
void QtKnownProgressDialog::closeEvent(QCloseEvent* event)
{
emit visibleChanged(false);
}
void QtKnownProgressDialog::onHidePressed()
{
emit visibleChanged(false);
}
@@ -0,0 +1,22 @@
#ifndef QT_KNOWN_PROGRESS_DIALOG_H
#define QT_KNOWN_PROGRESS_DIALOG_H
#include "QtProgressBarDialog.h"
class QtKnownProgressDialog
: public QtProgressBarDialog
{
Q_OBJECT
public:
QtKnownProgressDialog(bool hideable, QWidget* parent = 0);
QSize sizeHint() const override;
protected:
void closeEvent(QCloseEvent* event) override;
private:
void onHidePressed();
};
#endif // QT_KNOWN_PROGRESS_DIALOG_H
@@ -0,0 +1,116 @@
#include "QtProgressBarDialog.h"
#include <QLabel>
#include "QtProgressBar.h"
QtProgressBarDialog::QtProgressBarDialog(float topRatio, bool hideable, QWidget* parent)
: QtIndexingDialog(true, parent)
, m_title(nullptr)
, m_topRatio(topRatio)
{
m_top = new QWidget(m_window);
m_top->setObjectName("topHalf");
m_top->setGeometry(0, 0, 0, 0);
m_top->show();
m_top->lower();
m_progressBar = new QtProgressBar(m_window);
m_progressBar->setGeometry(0, 0, 0, 0);
m_title = new QLabel("", this);
m_title->setObjectName("title");
m_title->setAlignment(Qt::AlignRight | Qt::AlignBottom);
m_title->show();
m_percentLabel = new QLabel("0% Progress");
m_percentLabel->setObjectName("percent");
m_layout->addWidget(m_percentLabel, 0, Qt::AlignRight);
m_messageLabel = QtIndexingDialog::createMessageLabel(m_layout);
}
void QtProgressBarDialog::updateTitle(const QString& title)
{
if (m_title)
{
m_title->setText(title);
}
}
std::wstring QtProgressBarDialog::getTitle() const
{
if (m_title)
{
return m_title->text().toStdWString();
}
return L"";
}
void QtProgressBarDialog::updateMessage(const QString& message)
{
if (m_messageLabel)
{
m_messageLabel->setText(message);
}
}
std::wstring QtProgressBarDialog::getMessage() const
{
if (m_messageLabel)
{
return m_messageLabel->text().toStdWString();
}
return L"";
}
void QtProgressBarDialog::setUnknownProgress()
{
m_progressBar->showUnknownProgressAnimated();
m_percentLabel->hide();
}
void QtProgressBarDialog::updateProgress(size_t progress)
{
size_t percent = std::min<size_t>(std::max<size_t>(progress, 0), 100);
m_progressBar->showProgress(percent);
m_percentLabel->setText(QString::number(percent) + "% Progress");
m_percentLabel->show();
setGeometries();
}
size_t QtProgressBarDialog::getProgress() const
{
return m_progressBar->getProgress();
}
void QtProgressBarDialog::resizeEvent(QResizeEvent* event)
{
QtIndexingDialog::resizeEvent(event);
setGeometries();
}
void QtProgressBarDialog::setGeometries()
{
if (m_top)
{
QMargins margins = m_content->layout()->contentsMargins();
margins.setTop(m_window->size().height() * m_topRatio + 10);
m_content->layout()->setContentsMargins(margins);
m_top->setGeometry(0, 0, m_window->size().width(), m_window->size().height() * m_topRatio);
m_title->setGeometry(
45,
m_window->size().height() * m_topRatio - 50,
m_window->size().width() - 60,
40
);
}
if (m_progressBar)
{
m_progressBar->setGeometry(0, m_window->size().height() * m_topRatio - 5, m_window->size().width(), 10);
}
}
@@ -0,0 +1,42 @@
#ifndef QT_PROGRESS_BAR_DIALOG_H
#define QT_PROGRESS_BAR_DIALOG_H
#include <functional>
#include "RefreshInfo.h"
#include "QtIndexingDialog.h"
class QCheckBox;
class QLabel;
class QRadioButton;
class QtProgressBar;
class QtProgressBarDialog
: public QtIndexingDialog
{
Q_OBJECT
public:
QtProgressBarDialog(float topRatio, bool hideable, QWidget* parent = 0);
void updateTitle(const QString& title);
std::wstring getTitle() const;
void updateMessage(const QString& message);
std::wstring getMessage() const;
void setUnknownProgress();
void updateProgress(size_t progress);
size_t getProgress() const;
protected:
void resizeEvent(QResizeEvent* event) override;
virtual void setGeometries();
private:
QLabel* m_title;
QWidget* m_top;
float m_topRatio;
QtProgressBar* m_progressBar;
QLabel* m_percentLabel;
QLabel* m_messageLabel;
};
#endif // QT_PROGRESS_BAR_DIALOG_H
@@ -0,0 +1,48 @@
#include "QtUnknownProgressDialog.h"
#include <QPushButton>
QtUnknownProgressDialog::QtUnknownProgressDialog(bool hideable, QWidget* parent)
: QtProgressBarDialog(0.5, true, parent)
{
setSizeGripStyle(false);
updateTitle("Status");
m_layout->addStretch();
if (hideable)
{
QHBoxLayout* buttons = new QHBoxLayout();
buttons->addStretch();
QPushButton* hideButton = new QPushButton("Hide");
hideButton->setObjectName("windowButton");
hideButton->setDefault(true);
connect(hideButton, &QPushButton::clicked, this, &QtUnknownProgressDialog::onHidePressed);
buttons->addWidget(hideButton);
m_layout->addLayout(buttons);
}
setUnknownProgress();
setupDone();
setGeometries();
}
QSize QtUnknownProgressDialog::sizeHint() const
{
return QSize(350, 280);
}
void QtUnknownProgressDialog::closeEvent(QCloseEvent* event)
{
emit visibleChanged(false);
}
void QtUnknownProgressDialog::onHidePressed()
{
emit visibleChanged(false);
}
@@ -0,0 +1,22 @@
#ifndef QT_UNKNOWN_PROGRESS_DIALOG_H
#define QT_UNKNOWN_PROGRESS_DIALOG_H
#include "QtProgressBarDialog.h"
class QtUnknownProgressDialog
: public QtProgressBarDialog
{
Q_OBJECT
public:
QtUnknownProgressDialog(bool hideable, QWidget* parent = 0);
QSize sizeHint() const override;
protected:
void closeEvent(QCloseEvent* event) override;
private:
void onHidePressed();
};
#endif // QT_UNKNOWN_PROGRESS_DIALOG_H
+1 -166
View File
@@ -1,6 +1,5 @@
#include "QtWindow.h"
#include <QGraphicsDropShadowEffect>
#include <QLabel>
#include <QPushButton>
#include <QScrollArea>
@@ -11,9 +10,7 @@
#include "ResourcePaths.h"
QtWindow::QtWindow(bool isSubWindow, QWidget* parent)
: QtWindowStackElement(parent)
, m_isSubWindow(isSubWindow)
, m_window(nullptr)
: QtWindowBase(isSubWindow, parent)
, m_title(nullptr)
, m_subTitle(nullptr)
, m_nextButton(nullptr)
@@ -22,68 +19,7 @@ QtWindow::QtWindow(bool isSubWindow, QWidget* parent)
, m_cancelAble(true)
, m_scrollAble(false)
, m_hasLogo(false)
, m_mousePressedInWindow(false)
, m_sizeGrip(nullptr)
{
if (isSubWindow)
{
setWindowFlags(Qt::SubWindow | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground, true);
setFocusPolicy(Qt::StrongFocus);
setFocus();
}
else
{
setWindowFlags(Qt::Window);
}
m_window = new QWidget(this);
m_window->setObjectName("window");
QVBoxLayout* layout = new QVBoxLayout(m_window);
layout->setSpacing(0);
m_content = new QWidget();
layout->addWidget(m_content);
if (isSubWindow)
{
std::string frameStyle =
"#window {"
" border: 1px solid lightgray;"
" border-radius: 15px;"
" background: white;"
"}";
m_window->setStyleSheet(frameStyle.c_str());
QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
effect->setBlurRadius(15);
effect->setXOffset(0);
effect->setYOffset(5);
effect->setColor(Qt::darkGray);
m_window->setGraphicsEffect(effect);
QHBoxLayout* gripLayout = new QHBoxLayout();
m_sizeGrip = new QSizeGrip(m_window);
setSizeGripStyle(true);
gripLayout->addWidget(new QWidget());
gripLayout->addWidget(m_sizeGrip);
layout->addLayout(gripLayout);
}
resize(sizeHint());
moveToCenter();
this->raise();
}
QSize QtWindow::sizeHint() const
{
return QSize(
ApplicationSettings::getInstance()->getWindowBaseWidth(),
ApplicationSettings::getInstance()->getWindowBaseHeight()
);
}
void QtWindow::setup()
@@ -143,24 +79,6 @@ void QtWindow::setup()
setupDone();
}
void QtWindow::setSizeGripStyle(bool isBlack)
{
if (!m_sizeGrip)
{
return;
}
const std::wstring path = isBlack ? L"size_grip_black.png" : L"size_grip_white.png";
m_sizeGrip->setStyleSheet(QString::fromStdWString(
L"QSizeGrip {"
" max-height: 16px;"
" max-width: 16px;"
" border-image: url(" + ResourcePaths::getGuiPath().wstr() + L"window/" + path + L");"
"}"
));
}
void QtWindow::setCancelAble(bool cancelable)
{
setCloseEnabled(cancelable);
@@ -178,32 +96,6 @@ bool QtWindow::isScrollAble() const
return m_scrollAble;
}
bool QtWindow::isSubWindow() const
{
return m_isSubWindow;
}
void QtWindow::moveToCenter()
{
if (parentWidget())
{
if (m_isSubWindow)
{
move(
parentWidget()->width() / 2 - sizeHint().width() / 2,
parentWidget()->height() / 2 - sizeHint().height() / 2
);
}
else
{
move(
parentWidget()->pos().x() + parentWidget()->width() / 2 - sizeHint().width() / 2,
parentWidget()->pos().y() + parentWidget()->height() / 2 - sizeHint().height() / 2
);
}
}
}
void QtWindow::updateTitle(const QString& title)
{
if (m_title)
@@ -325,16 +217,6 @@ void QtWindow::setCloseDefault(bool isDefault)
}
}
void QtWindow::showWindow()
{
show();
}
void QtWindow::hideWindow()
{
hide();
}
void QtWindow::closeEvent(QCloseEvent* event)
{
handleClose();
@@ -423,53 +305,6 @@ void QtWindow::keyPressEvent(QKeyEvent* event)
QWidget::keyPressEvent(event);
}
void QtWindow::mouseMoveEvent(QMouseEvent* event)
{
if (event->buttons() & Qt::LeftButton && m_mousePressedInWindow)
{
if (m_isSubWindow)
{
QPoint pos = event->globalPos() - m_dragPosition;
QRect parentRect = parentWidget()->rect();
if (pos.x() < parentRect.left())
{
pos.setX(parentRect.left());
}
pos.setX(qBound(parentRect.left(), parentRect.right() - width(), pos.x()));
pos.setY(qBound(parentRect.top(), parentRect.bottom() - height(), pos.y()));
move(pos);
event->accept();
}
else
{
move(event->globalPos() - m_dragPosition);
event->accept();
}
}
}
void QtWindow::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
event->accept();
m_mousePressedInWindow = true;
}
}
void QtWindow::mouseReleaseEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
event->accept();
m_mousePressedInWindow = false;
}
}
void QtWindow::populateWindow(QWidget* widget)
{
}
+5 -29
View File
@@ -7,32 +7,26 @@
#include <QWidget>
#include "QtWindowStack.h"
#include "QtWindowBase.h"
class QLabel;
class QPushButton;
class QVBoxLayout;
class QtWindow
: public QtWindowStackElement
: public QtWindowBase
{
Q_OBJECT
public:
QtWindow(bool isSubWindow, QWidget* parent = nullptr);
QSize sizeHint() const override;
void setup();
void setSizeGripStyle(bool isBlack);
void setCancelAble(bool cancelAble);
void setScrollAble(bool scrollAble);
bool isScrollAble() const;
bool isSubWindow() const;
void moveToCenter();
void updateTitle(const QString& title);
std::wstring getTitle() const;
@@ -54,11 +48,6 @@ public:
void setPreviousDefault(bool isDefault);
void setCloseDefault(bool isDefault);
// QtWindowStackElement implementation
virtual void showWindow() override;
virtual void hideWindow() override;
signals:
void finished();
void canceled();
@@ -67,12 +56,9 @@ signals:
void previous();
protected:
void closeEvent(QCloseEvent* event) Q_DECL_OVERRIDE;
void resizeEvent(QResizeEvent* event) Q_DECL_OVERRIDE;
void keyPressEvent(QKeyEvent* event) Q_DECL_OVERRIDE;
void mouseMoveEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
void closeEvent(QCloseEvent* event) override;
void resizeEvent(QResizeEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;
virtual void populateWindow(QWidget* widget);
virtual void windowReady();
@@ -85,11 +71,6 @@ protected:
void addLogo();
QHBoxLayout* createButtons();
bool m_isSubWindow;
QWidget* m_window;
QWidget* m_content;
QLabel* m_title;
QLabel* m_subTitle;
@@ -107,11 +88,6 @@ private:
bool m_scrollAble;
bool m_hasLogo;
QPoint m_dragPosition;
bool m_mousePressedInWindow;
QSizeGrip* m_sizeGrip;
};
#endif // QT_WINDOW_H
+178
View File
@@ -0,0 +1,178 @@
#include "QtWindowBase.h"
#include <QGraphicsDropShadowEffect>
#include <QMouseEvent>
#include <QVBoxLayout>
#include "ApplicationSettings.h"
#include "ResourcePaths.h"
QtWindowBase::QtWindowBase(bool isSubWindow, QWidget* parent)
: QtWindowStackElement(parent)
, m_isSubWindow(isSubWindow)
, m_window(nullptr)
, m_content(nullptr)
, m_sizeGrip(nullptr)
, m_mousePressedInWindow(false)
{
if (isSubWindow)
{
setWindowFlags(Qt::SubWindow | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground, true);
setFocusPolicy(Qt::StrongFocus);
setFocus();
}
else
{
setWindowFlags(Qt::Window);
}
m_window = new QWidget(this);
m_window->setObjectName("window");
QVBoxLayout* layout = new QVBoxLayout(m_window);
layout->setSpacing(0);
m_content = new QWidget();
layout->addWidget(m_content);
if (isSubWindow)
{
std::string frameStyle =
"#window {"
" border: 1px solid lightgray;"
" border-radius: 15px;"
" background: white;"
"}";
m_window->setStyleSheet(frameStyle.c_str());
QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
effect->setBlurRadius(15);
effect->setXOffset(0);
effect->setYOffset(5);
effect->setColor(Qt::darkGray);
m_window->setGraphicsEffect(effect);
QHBoxLayout* gripLayout = new QHBoxLayout();
m_sizeGrip = new QSizeGrip(m_window);
setSizeGripStyle(true);
gripLayout->addWidget(new QWidget());
gripLayout->addWidget(m_sizeGrip);
layout->addLayout(gripLayout);
}
resize(sizeHint());
moveToCenter();
this->raise();
}
QSize QtWindowBase::sizeHint() const
{
return QSize(
ApplicationSettings::getInstance()->getWindowBaseWidth(),
ApplicationSettings::getInstance()->getWindowBaseHeight()
);
}
void QtWindowBase::setSizeGripStyle(bool isBlack)
{
if (!m_sizeGrip)
{
return;
}
const std::wstring path = isBlack ? L"size_grip_black.png" : L"size_grip_white.png";
m_sizeGrip->setStyleSheet(QString::fromStdWString(
L"QSizeGrip {"
" max-height: 16px;"
" max-width: 16px;"
" border-image: url(" + ResourcePaths::getGuiPath().wstr() + L"window/" + path + L");"
"}"
));
}
bool QtWindowBase::isSubWindow() const
{
return m_isSubWindow;
}
void QtWindowBase::moveToCenter()
{
if (parentWidget())
{
if (m_isSubWindow)
{
move(
parentWidget()->width() / 2 - sizeHint().width() / 2,
parentWidget()->height() / 2 - sizeHint().height() / 2
);
}
else
{
move(
parentWidget()->pos().x() + parentWidget()->width() / 2 - sizeHint().width() / 2,
parentWidget()->pos().y() + parentWidget()->height() / 2 - sizeHint().height() / 2
);
}
}
}
void QtWindowBase::showWindow()
{
show();
}
void QtWindowBase::hideWindow()
{
hide();
}
void QtWindowBase::mouseMoveEvent(QMouseEvent* event)
{
if (event->buttons() & Qt::LeftButton && m_mousePressedInWindow)
{
if (m_isSubWindow)
{
QPoint pos = event->globalPos() - m_dragPosition;
QRect parentRect = parentWidget()->rect();
if (pos.x() < parentRect.left())
{
pos.setX(parentRect.left());
}
pos.setX(qBound(parentRect.left(), parentRect.right() - width(), pos.x()));
pos.setY(qBound(parentRect.top(), parentRect.bottom() - height(), pos.y()));
move(pos);
event->accept();
}
else
{
move(event->globalPos() - m_dragPosition);
event->accept();
}
}
}
void QtWindowBase::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
event->accept();
m_mousePressedInWindow = true;
}
}
void QtWindowBase::mouseReleaseEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
event->accept();
m_mousePressedInWindow = false;
}
}
+50
View File
@@ -0,0 +1,50 @@
#ifndef QT_WINDOW_BASE_H
#define QT_WINDOW_BASE_H
#include <QSizeGrip>
#include <QWidget>
#include "QtWindowStack.h"
class QLabel;
class QPushButton;
class QVBoxLayout;
class QMouseEvent;
class QtWindowBase
: public QtWindowStackElement
{
Q_OBJECT
public:
QtWindowBase(bool isSubWindow, QWidget* parent);
QSize sizeHint() const override;
void setSizeGripStyle(bool isBlack);
bool isSubWindow() const;
void moveToCenter();
// QtWindowStackElement implementation
virtual void showWindow() override;
virtual void hideWindow() override;
protected:
void mouseMoveEvent(QMouseEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
bool m_isSubWindow;
QWidget* m_window;
QWidget* m_content;
QPoint m_dragPosition;
bool m_mousePressedInWindow;
QSizeGrip* m_sizeGrip;
};
#endif // QT_WINDOW_BASE_H