Initial cleanup of the Todo-plugin.

- Compile with QT_NO_CAST_FROM_ASCII, fix
  single character strings
- Remove special character from constants.h,
  fix constant names
- Fix tr() errors.
- Clean include directives
- struct -> class (coding style)

Change-Id: Id6108a03312bdecc6df3015b5a12653c95390647
Reviewed-by: Eike Ziller <eike.ziller@nokia.com>
This commit is contained in:
Friedemann Kleint
2012-02-24 09:43:52 +01:00
parent 085bf393a5
commit f8499fd45b
24 changed files with 114 additions and 70 deletions

View File

@@ -58,7 +58,7 @@ const char ICON_TODO[] = ":/todoplugin/images/todo.png";
const char ICON_WARNING[] = ":/projectexplorer/images/compile_warning.png"; const char ICON_WARNING[] = ":/projectexplorer/images/compile_warning.png";
const char ICON_ERROR[] = ":/projectexplorer/images/compile_error.png"; const char ICON_ERROR[] = ":/projectexplorer/images/compile_error.png";
// Public domain, Im the author // Public domain, I am the author
const char ICON_CURRENT_FILE[] = ":/todoplugin/images/current-file.png"; const char ICON_CURRENT_FILE[] = ":/todoplugin/images/current-file.png";
const char ICON_WHOLE_PROJECT[] = ":/todoplugin/images/whole-project.png"; const char ICON_WHOLE_PROJECT[] = ":/todoplugin/images/whole-project.png";
@@ -77,14 +77,14 @@ enum OutputColumnIndex {
OUTPUT_COLUMN_LAST OUTPUT_COLUMN_LAST
}; };
const char OUPTUT_COLUMN_TEXT_TITLE[] = QT_TRANSLATE_NOOP("TodoOutputPane", "Description"); const char OUTPUT_COLUMN_TEXT_TITLE[] = QT_TRANSLATE_NOOP("Todo::Internal::TodoItemsModel", "Description");
const char OUTPUT_COLUMN_FILE_TITLE[] = QT_TRANSLATE_NOOP("TodoOutputPane", "File"); const char OUTPUT_COLUMN_FILE_TITLE[] = QT_TRANSLATE_NOOP("Todo::Internal::TodoItemsModel", "File");
const char OUTPUT_COLUMN_LINE_TITLE[] = QT_TRANSLATE_NOOP("TodoOutputPane", "Line"); const char OUTPUT_COLUMN_LINE_TITLE[] = QT_TRANSLATE_NOOP("Todo::Internal::TodoItemsModel", "Line");
const int OUTPUT_TOOLBAR_SPACER_WIDHT = 25; const int OUTPUT_TOOLBAR_SPACER_WIDTH = 25;
const int OUTPUT_PANE_UPDATE_INTERVAL = 2000; const int OUTPUT_PANE_UPDATE_INTERVAL = 2000;
const char OUTPUT_PANE_TITLE[] = QT_TRANSLATE_NOOP("TodoOutputPane", "To-Do Entries"); const char OUTPUT_PANE_TITLE[] = QT_TRANSLATE_NOOP("Todo::Internal::TodoOutputPane", "To-Do Entries");
} // namespace Constants } // namespace Constants
} // namespace Todo } // namespace Todo

View File

@@ -98,7 +98,8 @@ void CppTodoItemsScanner::processDocument(CPlusPlus::Document::Ptr doc)
// Process every line of the comment // Process every line of the comment
// TODO: Do not create QStringList, just iterate through a string tracking line endings. // TODO: Do not create QStringList, just iterate through a string tracking line endings.
QStringList commentLines = QString::fromUtf8(source).split("\n", QString::SkipEmptyParts); const QStringList commentLines =
QString::fromUtf8(source).split(QLatin1Char('\n'), QString::SkipEmptyParts);
unsigned lineNumber = 0; unsigned lineNumber = 0;
translationUnit->getPosition(token.begin(), &lineNumber); translationUnit->getPosition(token.begin(), &lineNumber);
for (int j = 0; j < commentLines.count(); ++j) { for (int j = 0; j < commentLines.count(); ++j) {

View File

@@ -34,7 +34,6 @@
#ifndef KEYWORD_H #ifndef KEYWORD_H
#define KEYWORD_H #define KEYWORD_H
#include <QIcon>
#include <QColor> #include <QColor>
#include <QString> #include <QString>
#include <QList> #include <QList>

View File

@@ -32,6 +32,7 @@
**************************************************************************/ **************************************************************************/
#include "keyworddialog.h" #include "keyworddialog.h"
#include "keyword.h"
#include "ui_keyworddialog.h" #include "ui_keyworddialog.h"
#include "constants.h" #include "constants.h"
@@ -74,16 +75,22 @@ void KeywordDialog::setupListWidget(const QString &selectedIcon)
{ {
ui->listWidget->setViewMode(QListWidget::IconMode); ui->listWidget->setViewMode(QListWidget::IconMode);
QListWidgetItem *item = new QListWidgetItem(QIcon(Constants::ICON_INFO), "information"); const QString infoIconName = QLatin1String(Constants::ICON_INFO);
item->setData(Qt::UserRole, Constants::ICON_INFO); QListWidgetItem *item = new QListWidgetItem(QIcon(infoIconName),
QLatin1String("information"));
item->setData(Qt::UserRole, infoIconName);
ui->listWidget->addItem(item); ui->listWidget->addItem(item);
item = new QListWidgetItem(QIcon(Constants::ICON_WARNING), "warning"); const QString warningIconName = QLatin1String(Constants::ICON_WARNING);
item->setData(Qt::UserRole, Constants::ICON_WARNING); item = new QListWidgetItem(QIcon(warningIconName),
QLatin1String("warning"));
item->setData(Qt::UserRole, warningIconName);
ui->listWidget->addItem(item); ui->listWidget->addItem(item);
item = new QListWidgetItem(QIcon(Constants::ICON_ERROR), "error"); const QString errorIconName = QLatin1String(Constants::ICON_ERROR);
item->setData(Qt::UserRole, Constants::ICON_ERROR); item = new QListWidgetItem(QIcon(errorIconName),
QLatin1String("error"));
item->setData(Qt::UserRole, errorIconName);
ui->listWidget->addItem(item); ui->listWidget->addItem(item);
for (int i = 0; i < ui->listWidget->count(); ++i) { for (int i = 0; i < ui->listWidget->count(); ++i) {

View File

@@ -34,8 +34,6 @@
#ifndef ADDKEYWORDDIALOG_H #ifndef ADDKEYWORDDIALOG_H
#define ADDKEYWORDDIALOG_H #define ADDKEYWORDDIALOG_H
#include "keyword.h"
#include <QDialog> #include <QDialog>
namespace Todo { namespace Todo {
@@ -45,6 +43,8 @@ namespace Ui {
class AddKeywordDialog; class AddKeywordDialog;
} }
class Keyword;
class KeywordDialog : public QDialog class KeywordDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT

View File

@@ -37,10 +37,10 @@
<item> <item>
<widget class="QLineEdit" name="colorEdit"> <widget class="QLineEdit" name="colorEdit">
<property name="inputMask"> <property name="inputMask">
<string>\#HHHHHH; </string> <string notr="true">\#HHHHHH; </string>
</property> </property>
<property name="text"> <property name="text">
<string>#000000</string> <string notr="true">#000000</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@@ -66,7 +66,8 @@ LineParser::KeywordEntryCandidates LineParser::findKeywordEntryCandidates(const
for (int i = 0; i < m_keywords.count(); ++i) { for (int i = 0; i < m_keywords.count(); ++i) {
int searchFrom = -1; int searchFrom = -1;
forever { forever {
int index = line.lastIndexOf(m_keywords.at(i).name + ":", searchFrom); const int index = line.lastIndexOf(m_keywords.at(i).name
+ QLatin1Char(':'), searchFrom);
if (index == -1) if (index == -1)
break; // 'forever' loop exit condition break; // 'forever' loop exit condition
@@ -133,9 +134,8 @@ QList<TodoItem> LineParser::todoItemsFromKeywordEntries(const QList<KeywordEntry
foreach (const KeywordEntry &entry, entries) { foreach (const KeywordEntry &entry, entries) {
TodoItem item; TodoItem item;
item.text = QString("%1: %2") item.text = m_keywords.at(entry.keywordIndex).name
.arg(m_keywords.at(entry.keywordIndex).name) + QLatin1String(": ") + entry.text;
.arg(entry.text);
item.color = m_keywords.at(entry.keywordIndex).color; item.color = m_keywords.at(entry.keywordIndex).color;
item.iconResource = m_keywords.at(entry.keywordIndex).iconResource; item.iconResource = m_keywords.at(entry.keywordIndex).iconResource;
todoItems << item; todoItems << item;

View File

@@ -34,6 +34,8 @@
#include "optionsdialog.h" #include "optionsdialog.h"
#include "ui_optionsdialog.h" #include "ui_optionsdialog.h"
#include "keyworddialog.h" #include "keyworddialog.h"
#include "keyword.h"
#include "settings.h"
#include "constants.h" #include "constants.h"
namespace Todo { namespace Todo {

View File

@@ -34,9 +34,6 @@
#ifndef OPTIONSDIALOG_H #ifndef OPTIONSDIALOG_H
#define OPTIONSDIALOG_H #define OPTIONSDIALOG_H
#include "keyword.h"
#include "settings.h"
#include <QWidget> #include <QWidget>
namespace Todo { namespace Todo {
@@ -46,6 +43,9 @@ namespace Ui {
class OptionsDialog; class OptionsDialog;
} }
class Settings;
class Keyword;
class OptionsDialog : public QWidget class OptionsDialog : public QWidget
{ {
Q_OBJECT Q_OBJECT

View File

@@ -33,10 +33,12 @@
#include "optionspage.h" #include "optionspage.h"
#include "constants.h" #include "constants.h"
#include "optionsdialog.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <QList> #include <QList>
#include <QIcon>
#include <QMessageBox> #include <QMessageBox>
Todo::Internal::OptionsDialog *some = 0; Todo::Internal::OptionsDialog *some = 0;
@@ -62,7 +64,7 @@ void OptionsPage::setSettings(const Settings &settings)
QString OptionsPage::id() const QString OptionsPage::id() const
{ {
return "TodoSettings"; return QLatin1String("TodoSettings");
} }
QString OptionsPage::trName() const QString OptionsPage::trName() const
@@ -72,7 +74,7 @@ QString OptionsPage::trName() const
QString OptionsPage::category() const QString OptionsPage::category() const
{ {
return "To-Do"; return QLatin1String("To-Do");
} }
QString OptionsPage::trCategory() const QString OptionsPage::trCategory() const
@@ -92,7 +94,7 @@ QString OptionsPage::displayCategory() const
QIcon OptionsPage::categoryIcon() const QIcon OptionsPage::categoryIcon() const
{ {
return QIcon(Constants::ICON_TODO); return QIcon(QLatin1String(Constants::ICON_TODO));
} }
@@ -119,7 +121,7 @@ void OptionsPage::finish()
bool OptionsPage::matches(const QString &searchKeyWord) const bool OptionsPage::matches(const QString &searchKeyWord) const
{ {
return searchKeyWord == QString("todo"); return searchKeyWord == QLatin1String("todo");
} }
} // namespace Internal } // namespace Internal

View File

@@ -34,7 +34,6 @@
#ifndef SETTINGSPAGE_H #ifndef SETTINGSPAGE_H
#define SETTINGSPAGE_H #define SETTINGSPAGE_H
#include "optionsdialog.h"
#include "settings.h" #include "settings.h"
#include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/dialogs/ioptionspage.h>
@@ -42,6 +41,8 @@
namespace Todo { namespace Todo {
namespace Internal { namespace Internal {
class OptionsDialog;
class OptionsPage : public Core::IOptionsPage class OptionsPage : public Core::IOptionsPage
{ {
Q_OBJECT Q_OBJECT

View File

@@ -86,7 +86,7 @@ void QmlJsTodoItemsScanner::processDocument(QmlJS::Document::Ptr doc)
// Process every line // Process every line
// TODO: Do not create QStringList, just iterate through a string tracking line endings. // TODO: Do not create QStringList, just iterate through a string tracking line endings.
QStringList commentLines = source.split("\n", QString::SkipEmptyParts); QStringList commentLines = source.split(QLatin1Char('\n'), QString::SkipEmptyParts);
quint32 startLine = sourceLocation.startLine; quint32 startLine = sourceLocation.startLine;
for (int j = 0; j < commentLines.count(); ++j) { for (int j = 0; j < commentLines.count(); ++j) {
const QString &commentLine = commentLines.at(j); const QString &commentLine = commentLines.at(j);

View File

@@ -34,20 +34,27 @@
#include "settings.h" #include "settings.h"
#include "constants.h" #include "constants.h"
#include <QSettings>
namespace Todo { namespace Todo {
namespace Internal { namespace Internal {
void Settings::save(QSettings *settings) const void Settings::save(QSettings *settings) const
{ {
settings->beginGroup(Constants::SETTINGS_GROUP); settings->beginGroup(QLatin1String(Constants::SETTINGS_GROUP));
settings->setValue(Constants::SCANNING_SCOPE, scanningScope); settings->setValue(QLatin1String(Constants::SCANNING_SCOPE), scanningScope);
settings->beginWriteArray(Constants::KEYWORDS_LIST); settings->beginWriteArray(QLatin1String(Constants::KEYWORDS_LIST));
for (int i = 0; i < keywords.size(); ++i) { if (const int size = keywords.size()) {
settings->setArrayIndex(i); const QString nameKey = QLatin1String("name");
settings->setValue("name", keywords.at(i).name); const QString colorKey = QLatin1String("color");
settings->setValue("color", keywords.at(i).color); const QString iconResourceKey = QLatin1String("iconResource");
settings->setValue("iconResource", keywords.at(i).iconResource); for (int i = 0; i < size; ++i) {
settings->setArrayIndex(i);
settings->setValue(nameKey, keywords.at(i).name);
settings->setValue(colorKey, keywords.at(i).color);
settings->setValue(iconResourceKey, keywords.at(i).iconResource);
}
} }
settings->endArray(); settings->endArray();
@@ -59,20 +66,23 @@ void Settings::load(QSettings *settings)
{ {
setDefault(); setDefault();
settings->beginGroup(Constants::SETTINGS_GROUP); settings->beginGroup(QLatin1String(Constants::SETTINGS_GROUP));
scanningScope = static_cast<ScanningScope>(settings->value(Constants::SCANNING_SCOPE, scanningScope = static_cast<ScanningScope>(settings->value(QLatin1String(Constants::SCANNING_SCOPE),
scanningScope).toInt()); scanningScope).toInt());
KeywordList newKeywords; KeywordList newKeywords;
int size = settings->beginReadArray(Constants::KEYWORDS_LIST); const int size = settings->beginReadArray(QLatin1String(Constants::KEYWORDS_LIST));
if (size > 0) { if (size > 0) {
const QString nameKey = QLatin1String("name");
const QString colorKey = QLatin1String("color");
const QString iconResourceKey = QLatin1String("iconResource");
for (int i = 0; i < size; ++i) { for (int i = 0; i < size; ++i) {
settings->setArrayIndex(i); settings->setArrayIndex(i);
Keyword keyword; Keyword keyword;
keyword.name = settings->value("name").toString(); keyword.name = settings->value(nameKey).toString();
keyword.color = settings->value("color").value<QColor>(); keyword.color = settings->value(colorKey).value<QColor>();
keyword.iconResource = settings->value("iconResource").toString(); keyword.iconResource = settings->value(iconResourceKey).toString();
newKeywords << keyword; newKeywords << keyword;
} }
keywords = newKeywords; keywords = newKeywords;

View File

@@ -36,7 +36,7 @@
#include "keyword.h" #include "keyword.h"
#include <QSettings> QT_FORWARD_DECLARE_CLASS(QSettings)
namespace Todo { namespace Todo {
namespace Internal { namespace Internal {
@@ -46,7 +46,8 @@ enum ScanningScope {
ScanningScopeProject ScanningScopeProject
}; };
struct Settings { class Settings {
public:
KeywordList keywords; KeywordList keywords;
ScanningScope scanningScope; ScanningScope scanningScope;
void save(QSettings *settings) const; void save(QSettings *settings) const;

View File

@@ -4,6 +4,8 @@ TARGET = Todo
include(../../qtcreatorplugin.pri) include(../../qtcreatorplugin.pri)
include(todo_dependencies.pri) include(todo_dependencies.pri)
DEFINES += QT_NO_CAST_FROM_ASCII
HEADERS += todoplugin.h \ HEADERS += todoplugin.h \
keyword.h \ keyword.h \
constants.h \ constants.h \

View File

@@ -38,13 +38,16 @@
#include <QMetaType> #include <QMetaType>
#include <QString> #include <QString>
#include <QIcon> #include <QColor>
namespace Todo { namespace Todo {
namespace Internal { namespace Internal {
struct TodoItem class TodoItem
{ {
public:
TodoItem() : line(-1) {}
QString text; QString text;
QString file; QString file;
int line; int line;

View File

@@ -34,6 +34,8 @@
#include "todoitemsmodel.h" #include "todoitemsmodel.h"
#include "constants.h" #include "constants.h"
#include <QIcon>
namespace Todo { namespace Todo {
namespace Internal { namespace Internal {
@@ -117,7 +119,7 @@ QVariant TodoItemsModel::headerData(int section, Qt::Orientation orientation, in
switch (section) { switch (section) {
case Constants::OUTPUT_COLUMN_TEXT: case Constants::OUTPUT_COLUMN_TEXT:
return tr(Constants::OUPTUT_COLUMN_TEXT_TITLE); return tr(Constants::OUTPUT_COLUMN_TEXT_TITLE);
case Constants::OUTPUT_COLUMN_FILE: case Constants::OUTPUT_COLUMN_FILE:
return tr(Constants::OUTPUT_COLUMN_FILE_TITLE); return tr(Constants::OUTPUT_COLUMN_FILE_TITLE);

View File

@@ -35,6 +35,8 @@
#include "constants.h" #include "constants.h"
#include "cpptodoitemsscanner.h" #include "cpptodoitemsscanner.h"
#include "qmljstodoitemsscanner.h" #include "qmljstodoitemsscanner.h"
#include "todoitemsmodel.h"
#include "todoitemsscanner.h"
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>

View File

@@ -36,8 +36,6 @@
#include "todoitem.h" #include "todoitem.h"
#include "settings.h" #include "settings.h"
#include "todoitemsmodel.h"
#include "todoitemsscanner.h"
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <coreplugin/editormanager/ieditor.h> #include <coreplugin/editormanager/ieditor.h>
@@ -48,6 +46,9 @@
namespace Todo { namespace Todo {
namespace Internal { namespace Internal {
class TodoItemsModel;
class TodoItemsScanner;
class TodoItemsProvider : public QObject class TodoItemsProvider : public QObject
{ {
Q_OBJECT Q_OBJECT

View File

@@ -35,7 +35,7 @@
#define TODOITEMSSCANNER_H #define TODOITEMSSCANNER_H
#include "todoitem.h" #include "todoitem.h"
#include "settings.h" #include "keyword.h"
#include <QObject> #include <QObject>

View File

@@ -33,9 +33,13 @@
#include "todooutputpane.h" #include "todooutputpane.h"
#include "constants.h" #include "constants.h"
#include "todoitemsmodel.h"
#include <QIcon> #include <QIcon>
#include <QHeaderView> #include <QHeaderView>
#include <QTreeView>
#include <QToolButton>
#include <QButtonGroup>
namespace Todo { namespace Todo {
namespace Internal { namespace Internal {
@@ -147,7 +151,7 @@ void TodoOutputPane::scopeButtonClicked(QAbstractButton* button)
emit scanningScopeChanged(ScanningScopeProject); emit scanningScopeChanged(ScanningScopeProject);
} }
void TodoOutputPane::todoTreeViewClicked(QModelIndex index) void TodoOutputPane::todoTreeViewClicked(const QModelIndex &index)
{ {
// Create a to-do item and notify that it was clicked on // Create a to-do item and notify that it was clicked on
@@ -190,12 +194,12 @@ void TodoOutputPane::freeTreeView()
void TodoOutputPane::createScopeButtons() void TodoOutputPane::createScopeButtons()
{ {
m_currentFileButton = new QToolButton(); m_currentFileButton = new QToolButton();
m_currentFileButton->setIcon(QIcon(QString(Constants::ICON_CURRENT_FILE))); m_currentFileButton->setIcon(QIcon(QLatin1String(Constants::ICON_CURRENT_FILE)));
m_currentFileButton->setCheckable(true); m_currentFileButton->setCheckable(true);
m_currentFileButton->setToolTip(tr("Scan in the current opened file")); m_currentFileButton->setToolTip(tr("Scan in the current opened file"));
m_wholeProjectButton = new QToolButton(); m_wholeProjectButton = new QToolButton();
m_wholeProjectButton->setIcon(QIcon(QString(Constants::ICON_WHOLE_PROJECT))); m_wholeProjectButton->setIcon(QIcon(QLatin1String(Constants::ICON_WHOLE_PROJECT)));
m_wholeProjectButton->setCheckable(true); m_wholeProjectButton->setCheckable(true);
m_wholeProjectButton->setToolTip(tr("Scan in the whole project")); m_wholeProjectButton->setToolTip(tr("Scan in the whole project"));
@@ -205,7 +209,7 @@ void TodoOutputPane::createScopeButtons()
connect(m_scopeButtons, SIGNAL(buttonClicked(QAbstractButton*)), SLOT(scopeButtonClicked(QAbstractButton*))); connect(m_scopeButtons, SIGNAL(buttonClicked(QAbstractButton*)), SLOT(scopeButtonClicked(QAbstractButton*)));
m_spacer = new QWidget; m_spacer = new QWidget;
m_spacer->setMinimumWidth(Constants::OUTPUT_TOOLBAR_SPACER_WIDHT); m_spacer->setMinimumWidth(Constants::OUTPUT_TOOLBAR_SPACER_WIDTH);
} }
void TodoOutputPane::freeScopeButtons() void TodoOutputPane::freeScopeButtons()

View File

@@ -34,20 +34,24 @@
#ifndef TODOOUTPUTPANE_H #ifndef TODOOUTPUTPANE_H
#define TODOOUTPUTPANE_H #define TODOOUTPUTPANE_H
#include "keyword.h"
#include "todoitem.h"
#include "settings.h" #include "settings.h"
#include "todoitemsmodel.h"
#include <coreplugin/ioutputpane.h> #include <coreplugin/ioutputpane.h>
#include <QTreeView> QT_BEGIN_NAMESPACE
#include <QToolButton> class QTreeView;
#include <QButtonGroup> class QToolButton;
class QButtonGroup;
class QModelIndex;
class QAbstractButton;
QT_END_NAMESPACE
namespace Todo { namespace Todo {
namespace Internal { namespace Internal {
class TodoItem;
class TodoItemsModel;
class TodoOutputPane : public Core::IOutputPane class TodoOutputPane : public Core::IOutputPane
{ {
Q_OBJECT Q_OBJECT
@@ -79,7 +83,7 @@ signals:
private slots: private slots:
void scopeButtonClicked(QAbstractButton *button); void scopeButtonClicked(QAbstractButton *button);
void todoTreeViewClicked(QModelIndex index); void todoTreeViewClicked(const QModelIndex &index);
private: private:
QTreeView *m_todoTreeView; QTreeView *m_todoTreeView;

View File

@@ -33,6 +33,10 @@
#include "todoplugin.h" #include "todoplugin.h"
#include "constants.h" #include "constants.h"
#include "optionspage.h"
#include "keyword.h"
#include "todooutputpane.h"
#include "todoitemsprovider.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>

View File

@@ -34,19 +34,18 @@
#ifndef TODOPLUGIN_H #ifndef TODOPLUGIN_H
#define TODOPLUGIN_H #define TODOPLUGIN_H
#include "optionspage.h"
#include "keyword.h"
#include "todooutputpane.h"
#include "settings.h" #include "settings.h"
#include "todoitemsprovider.h"
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
#include <QStringList>
namespace Todo { namespace Todo {
namespace Internal { namespace Internal {
class TodoOutputPane;
class OptionsPage;
class TodoItemsProvider;
class TodoItem;
class TodoPlugin : public ExtensionSystem::IPlugin class TodoPlugin : public ExtensionSystem::IPlugin
{ {
Q_OBJECT Q_OBJECT