- enhancement: todo view
This commit is contained in:
parent
67850cfe48
commit
08d1006ae0
1
NEWS.md
1
NEWS.md
|
@ -4,6 +4,7 @@ Version 0.6.0
|
|||
- fix: can't save code snippets modifications
|
||||
- fix: errors in code snippet processing
|
||||
- change: auto open a new editor at start
|
||||
- enhancement: todo view
|
||||
|
||||
Version 0.5.0
|
||||
- enhancement: support C++ using type alias;
|
||||
|
|
|
@ -60,6 +60,7 @@ SOURCES += \
|
|||
settingsdialog/projectprecompilewidget.cpp \
|
||||
settingsdialog/projectversioninfowidget.cpp \
|
||||
symbolusagemanager.cpp \
|
||||
todoparser.cpp \
|
||||
widgets/classbrowser.cpp \
|
||||
widgets/codecompletionlistview.cpp \
|
||||
widgets/codecompletionpopup.cpp \
|
||||
|
@ -161,6 +162,7 @@ HEADERS += \
|
|||
settingsdialog/projectprecompilewidget.h \
|
||||
settingsdialog/projectversioninfowidget.h \
|
||||
symbolusagemanager.h \
|
||||
todoparser.h \
|
||||
widgets/classbrowser.h \
|
||||
widgets/codecompletionlistview.h \
|
||||
widgets/codecompletionpopup.h \
|
||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -182,6 +182,7 @@ void Editor::loadFile(const QString& filename) {
|
|||
if (pSettings->editor().syntaxCheckWhenLineChanged()) {
|
||||
checkSyntaxInBack();
|
||||
}
|
||||
reparseTodo();
|
||||
}
|
||||
mLastIdCharPressed = 0;
|
||||
}
|
||||
|
@ -192,6 +193,7 @@ void Editor::saveFile(const QString &filename) {
|
|||
pMainWindow->updateForEncodingInfo();
|
||||
if (pSettings->editor().syntaxCheckWhenSave())
|
||||
checkSyntaxInBack();
|
||||
reparseTodo();
|
||||
}
|
||||
|
||||
void Editor::convertToEncoding(const QByteArray &encoding)
|
||||
|
@ -1279,6 +1281,7 @@ void Editor::onStatusChanged(SynStatusChanges changes)
|
|||
reparse();
|
||||
if (pSettings->editor().syntaxCheckWhenLineChanged())
|
||||
checkSyntaxInBack();
|
||||
reparseTodo();
|
||||
}
|
||||
mLineCount = lines()->count();
|
||||
if (changes.testFlag(scModified)) {
|
||||
|
@ -1899,6 +1902,11 @@ void Editor::reparse()
|
|||
parseFile(mParser,mFilename,mInProject);
|
||||
}
|
||||
|
||||
void Editor::reparseTodo()
|
||||
{
|
||||
pMainWindow->todoParser()->parseFile(mFilename);
|
||||
}
|
||||
|
||||
void Editor::insertString(const QString &value, bool moveCursor)
|
||||
{
|
||||
beginUpdate();
|
||||
|
@ -3150,6 +3158,7 @@ void Editor::reformat()
|
|||
setSelText(QString::fromUtf8(newContent));
|
||||
reparse();
|
||||
checkSyntaxInBack();
|
||||
reparseTodo();
|
||||
pMainWindow->updateEditorActions();
|
||||
}
|
||||
|
||||
|
|
|
@ -155,6 +155,7 @@ public:
|
|||
void gotoDeclaration(const BufferCoord& pos);
|
||||
void gotoDefinition(const BufferCoord& pos);
|
||||
void reparse();
|
||||
void reparseTodo();
|
||||
void insertString(const QString& value, bool moveCursor);
|
||||
void insertCodeSnippet(const QString& code);
|
||||
|
||||
|
|
|
@ -130,6 +130,7 @@ MainWindow::MainWindow(QWidget *parent)
|
|||
connect(ui->cbMemoryAddress->lineEdit(), &QLineEdit::returnPressed,
|
||||
this, &MainWindow::onDebugMemoryAddressInput);
|
||||
|
||||
mTodoParser = std::make_shared<TodoParser>();
|
||||
mSymbolUsageManager = std::make_shared<SymbolUsageManager>();
|
||||
mSymbolUsageManager->load();
|
||||
mCodeSnippetManager = std::make_shared<CodeSnippetsManager>();
|
||||
|
@ -140,6 +141,7 @@ MainWindow::MainWindow(QWidget *parent)
|
|||
ui->cbSearchHistory->setModel(mSearchResultListModel.get());
|
||||
ui->searchView->setModel(mSearchResultTreeModel.get());
|
||||
ui->searchView->setItemDelegate(mSearchViewDelegate.get());
|
||||
ui->tableTODO->setModel(&mTodoModel);
|
||||
connect(mSearchResultTreeModel.get() , &QAbstractItemModel::modelReset,
|
||||
ui->searchView,&QTreeView::expandAll);
|
||||
ui->replacePanel->setVisible(false);
|
||||
|
@ -2276,6 +2278,21 @@ void MainWindow::enableDebugActions()
|
|||
ui->cbMemoryAddress->setEnabled(true);
|
||||
}
|
||||
|
||||
void MainWindow::onTodoParseStarted()
|
||||
{
|
||||
mTodoModel.clear();
|
||||
}
|
||||
|
||||
void MainWindow::onTodoParsing(const QString &filename, int lineNo, int ch, const QString &line)
|
||||
{
|
||||
mTodoModel.addItem(filename,lineNo,ch,line);
|
||||
}
|
||||
|
||||
void MainWindow::onTodoParseFinished()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::prepareProjectForCompile()
|
||||
{
|
||||
if (!mProject)
|
||||
|
@ -3875,6 +3892,11 @@ void MainWindow::on_classBrowser_doubleClicked(const QModelIndex &index)
|
|||
}
|
||||
}
|
||||
|
||||
const PTodoParser &MainWindow::todoParser() const
|
||||
{
|
||||
return mTodoParser;
|
||||
}
|
||||
|
||||
PCodeSnippetManager &MainWindow::codeSnippetManager()
|
||||
{
|
||||
return mCodeSnippetManager;
|
||||
|
@ -3884,3 +3906,34 @@ PSymbolUsageManager &MainWindow::symbolUsageManager()
|
|||
{
|
||||
return mSymbolUsageManager;
|
||||
}
|
||||
|
||||
void MainWindow::on_EditorTabsLeft_currentChanged(int index)
|
||||
{
|
||||
Editor * editor = mEditorList->getEditor();
|
||||
if (editor) {
|
||||
editor->reparseTodo();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_EditorTabsRight_currentChanged(int index)
|
||||
{
|
||||
Editor * editor = mEditorList->getEditor();
|
||||
if (editor) {
|
||||
editor->reparseTodo();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_tableTODO_doubleClicked(const QModelIndex &index)
|
||||
{
|
||||
PTodoItem item = mTodoModel.getItem(index);
|
||||
if (item) {
|
||||
Editor * editor = mEditorList->getOpenedEditorByFilename(item->filename);
|
||||
if (editor) {
|
||||
editor->setCaretPositionAndActivate(item->lineNo,item->ch+1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "caretlist.h"
|
||||
#include "symbolusagemanager.h"
|
||||
#include "codesnippetsmanager.h"
|
||||
#include "todoparser.h"
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui { class MainWindow; }
|
||||
|
@ -121,6 +122,8 @@ public:
|
|||
|
||||
PCodeSnippetManager &codeSnippetManager();
|
||||
|
||||
const PTodoParser &todoParser() const;
|
||||
|
||||
public slots:
|
||||
void onCompileLog(const QString& msg);
|
||||
void onCompileIssue(PCompileIssue issue);
|
||||
|
@ -143,6 +146,9 @@ public slots:
|
|||
void onEditorTabContextMenu(const QPoint& pos);
|
||||
void disableDebugActions();
|
||||
void enableDebugActions();
|
||||
void onTodoParseStarted();
|
||||
void onTodoParsing(const QString& filename, int lineNo, int ch, const QString& line);
|
||||
void onTodoParseFinished();
|
||||
|
||||
private:
|
||||
void prepareProjectForCompile();
|
||||
|
@ -357,6 +363,12 @@ private slots:
|
|||
|
||||
void on_classBrowser_doubleClicked(const QModelIndex &index);
|
||||
|
||||
void on_EditorTabsLeft_currentChanged(int index);
|
||||
|
||||
void on_EditorTabsRight_currentChanged(int index);
|
||||
|
||||
void on_tableTODO_doubleClicked(const QModelIndex &index);
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
EditorList *mEditorList;
|
||||
|
@ -385,6 +397,7 @@ private:
|
|||
std::shared_ptr<HeaderCompletionPopup> mHeaderCompletionPopup;
|
||||
std::shared_ptr<FunctionTooltipWidget> mFunctionTip;
|
||||
|
||||
TodoModel mTodoModel;
|
||||
SearchResultModel mSearchResultModel;
|
||||
PSearchResultListModel mSearchResultListModel;
|
||||
PSearchResultTreeModel mSearchResultTreeModel;
|
||||
|
@ -393,6 +406,7 @@ private:
|
|||
std::shared_ptr<QHash<StatementKind, QColor>> mStatementColors;
|
||||
PSymbolUsageManager mSymbolUsageManager;
|
||||
PCodeSnippetManager mCodeSnippetManager;
|
||||
PTodoParser mTodoParser;
|
||||
|
||||
bool mCheckSyntaxInBack;
|
||||
bool mOpenClosingBottomPanel;
|
||||
|
|
|
@ -806,13 +806,17 @@
|
|||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabTodo">
|
||||
<widget class="QWidget" name="tabTODO">
|
||||
<attribute name="title">
|
||||
<string>TODO</string>
|
||||
</attribute>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||
<item>
|
||||
<widget class="QTableView" name="tblTodo"/>
|
||||
<widget class="QTableView" name="tableTODO">
|
||||
<attribute name="horizontalHeaderStretchLastSection">
|
||||
<bool>true</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
|
|
|
@ -118,6 +118,7 @@ public:
|
|||
virtual bool isWordBreakChar(const QChar& ch);
|
||||
bool enabled() const;
|
||||
void setEnabled(bool value);
|
||||
virtual PSynHighlighterAttribute getAttribute(const QString& name) const;
|
||||
|
||||
protected:
|
||||
PSynHighlighterAttribute mCommentAttribute;
|
||||
|
@ -131,8 +132,6 @@ protected:
|
|||
void clearAttributes();
|
||||
virtual int attributesCount() const;
|
||||
|
||||
virtual PSynHighlighterAttribute getAttribute(const QString& name) const;
|
||||
|
||||
private:
|
||||
QMap<QString,PSynHighlighterAttribute> mAttributes;
|
||||
bool mEnabled;
|
||||
|
|
|
@ -0,0 +1,159 @@
|
|||
#include "todoparser.h"
|
||||
#include "mainwindow.h"
|
||||
#include "editor.h"
|
||||
#include "editorlist.h"
|
||||
#include "HighlighterManager.h"
|
||||
#include "qsynedit/Constants.h"
|
||||
|
||||
TodoParser::TodoParser(QObject *parent) : QObject(parent)
|
||||
{
|
||||
mThread = nullptr;
|
||||
}
|
||||
|
||||
void TodoParser::parseFile(const QString &filename)
|
||||
{
|
||||
QMutexLocker locker(&mMutex);
|
||||
if (mThread) {
|
||||
return;
|
||||
}
|
||||
mThread = new TodoThread(filename);
|
||||
connect(mThread,&QThread::finished,
|
||||
[this] {
|
||||
QMutexLocker locker(&mMutex);
|
||||
if (mThread) {
|
||||
mThread->deleteLater();
|
||||
mThread = nullptr;
|
||||
}
|
||||
});
|
||||
connect(mThread, &TodoThread::parseStarted,
|
||||
pMainWindow, &MainWindow::onTodoParseStarted);
|
||||
connect(mThread, &TodoThread::todoFound,
|
||||
pMainWindow, &MainWindow::onTodoParsing);
|
||||
connect(mThread, &TodoThread::parseFinished,
|
||||
pMainWindow, &MainWindow::onTodoParseFinished);
|
||||
mThread->start();
|
||||
}
|
||||
|
||||
bool TodoParser::parsing() const
|
||||
{
|
||||
return (mThread!=nullptr);
|
||||
}
|
||||
|
||||
TodoThread::TodoThread(const QString& filename, QObject *parent): QThread(parent)
|
||||
{
|
||||
mFilename = filename;
|
||||
}
|
||||
|
||||
void TodoThread::run()
|
||||
{
|
||||
PSynHighlighter highlighter = highlighterManager.getCppHighlighter();
|
||||
emit parseStarted();
|
||||
auto action = finally([this]{
|
||||
emit parseFinished();
|
||||
});
|
||||
QStringList lines;
|
||||
if (!pMainWindow->editorList()->getContentFromOpenedEditor(mFilename,lines)) {
|
||||
return;
|
||||
}
|
||||
PSynHighlighterAttribute commentAttr = highlighter->getAttribute(SYNS_AttrComment);
|
||||
|
||||
highlighter->resetState();
|
||||
for (int i =0;i<lines.count();i++) {
|
||||
highlighter->setLine(lines[i],i);
|
||||
while (!highlighter->eol()) {
|
||||
PSynHighlighterAttribute attr;
|
||||
attr = highlighter->getTokenAttribute();
|
||||
if (attr == commentAttr) {
|
||||
QString token = highlighter->getToken();
|
||||
int pos = token.indexOf("TODO:",Qt::CaseInsensitive);
|
||||
if (pos>=0) {
|
||||
emit todoFound(
|
||||
mFilename,
|
||||
i+1,
|
||||
pos+highlighter->getTokenPos(),
|
||||
lines[i].trimmed()
|
||||
);
|
||||
}
|
||||
}
|
||||
highlighter->next();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TodoModel::TodoModel(QObject *parent) : QAbstractListModel(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void TodoModel::addItem(const QString &filename, int lineNo, int ch, const QString &line)
|
||||
{
|
||||
beginInsertRows(QModelIndex(),mItems.count(),mItems.count());
|
||||
PTodoItem item = std::make_shared<TodoItem>();
|
||||
item->filename = filename;
|
||||
item->lineNo = lineNo;
|
||||
item->ch = ch;
|
||||
item->line = line;
|
||||
mItems.append(item);
|
||||
endInsertRows();
|
||||
}
|
||||
|
||||
void TodoModel::clear()
|
||||
{
|
||||
beginResetModel();
|
||||
mItems.clear();
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
PTodoItem TodoModel::getItem(const QModelIndex &index)
|
||||
{
|
||||
if (!index.isValid())
|
||||
return PTodoItem();
|
||||
return mItems[index.row()];
|
||||
}
|
||||
|
||||
int TodoModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
return mItems.count();
|
||||
}
|
||||
|
||||
QVariant TodoModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QVariant();
|
||||
if (role==Qt::DisplayRole) {
|
||||
PTodoItem item = mItems[index.row()];
|
||||
switch(index.column()) {
|
||||
case 0:
|
||||
return item->filename;
|
||||
case 1:
|
||||
return item->lineNo;
|
||||
case 2:
|
||||
return item->ch;
|
||||
case 3:
|
||||
return item->line;
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QVariant TodoModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
|
||||
switch(section) {
|
||||
case 0:
|
||||
return tr("Filename");
|
||||
case 1:
|
||||
return tr("Line");
|
||||
case 2:
|
||||
return tr("Column");
|
||||
case 3:
|
||||
return tr("Content");
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
int TodoModel::columnCount(const QModelIndex &parent) const
|
||||
{
|
||||
return 4;
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
#ifndef TODOPARSER_H
|
||||
#define TODOPARSER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QThread>
|
||||
#include <QMutex>
|
||||
#include <QAbstractListModel>
|
||||
|
||||
struct TodoItem {
|
||||
QString filename;
|
||||
int lineNo;
|
||||
int ch;
|
||||
QString line;
|
||||
};
|
||||
|
||||
using PTodoItem = std::shared_ptr<TodoItem>;
|
||||
|
||||
class TodoModel : public QAbstractListModel {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit TodoModel(QObject* parent=nullptr);
|
||||
void addItem(const QString& filename, int lineNo,
|
||||
int ch, const QString& line);
|
||||
void clear();
|
||||
PTodoItem getItem(const QModelIndex& index);
|
||||
private:
|
||||
QList<PTodoItem> mItems;
|
||||
|
||||
// QAbstractItemModel interface
|
||||
public:
|
||||
int rowCount(const QModelIndex &parent) const override;
|
||||
QVariant data(const QModelIndex &index, int role) const override;
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
||||
|
||||
// QAbstractItemModel interface
|
||||
public:
|
||||
int columnCount(const QModelIndex &parent) const override;
|
||||
};
|
||||
|
||||
class TodoThread: public QThread
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit TodoThread(const QString& filename, QObject* parent = nullptr);
|
||||
signals:
|
||||
void parseStarted();
|
||||
void todoFound(const QString& filename, int lineNo, int ch, const QString& line);
|
||||
void parseFinished();
|
||||
private:
|
||||
QString mFilename;
|
||||
|
||||
// QThread interface
|
||||
protected:
|
||||
void run() override;
|
||||
};
|
||||
|
||||
using PTodoThread = std::shared_ptr<TodoThread>;
|
||||
|
||||
class TodoParser : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit TodoParser(QObject *parent = nullptr);
|
||||
void parseFile(const QString& filename);
|
||||
bool parsing() const;
|
||||
|
||||
signals:
|
||||
private:
|
||||
TodoThread* mThread;
|
||||
QRecursiveMutex mMutex;
|
||||
};
|
||||
|
||||
using PTodoParser = std::shared_ptr<TodoParser>;
|
||||
|
||||
#endif // TODOPARSER_H
|
Loading…
Reference in New Issue