diff --git a/notes/README.info-functions b/notes/README.info-functions new file mode 100644 index 0000000..a6ac302 --- /dev/null +++ b/notes/README.info-functions @@ -0,0 +1,63 @@ + + -symbol-info-functions [--include-nondebug] + [--type type_regexp] + [--name name_regexp] + [--max-results limit] + + + ^done,symbols={ + debug=[ + { + filename="elf-init.c", fullname="/home/abuild/rpmbuild/BUILD/glibc-2.31/csu/elf-init.c", + symbols=[ + { + line="95", + name="__libc_csu_fini", + type="void (void)", + description="void __libc_csu_fini(void);" + }, + { + line="67", + name="__libc_csu_init", + type="void (int, char **, char **)", + description="void __libc_csu_init(int, char **, char **);" + } + ] + }, + + { + filename="function1.cpp",fullname="/home/erniep/Development/Peak/src/seer/tests/helloworld/function1.cpp", + symbols=[ + { + line="5", + name="function1(std::__cxx11::basic_string, std::allocator > const&)", + type="void (const std::string &)", + description="void function1(std::__cxx11::basic_string, std::allocator > const&);"},{name="_GLOBAL__sub_I__Z9function1RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE()",type="void (void)",description="static void _GLOBAL__sub_I__Z9function1RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE();"},{name="__static_initialization_and_destruction_0(int, int)",type="void (int, int)",description="static void __static_initialization_and_destruction_0(int, int);" + } + ] + }, + + { + filename="helloworld.cpp",fullname="/home/erniep/Development/Peak/src/seer/tests/helloworld/helloworld.cpp", + symbols=[ + { + line="8", + name="main(int, char**)", + type="int (int, char **)", + description="int main(int, char**);" + }, + { + name="_GLOBAL__sub_I_main()", + type="void (void)", + description="static void _GLOBAL__sub_I_main();" + }, + { + name="__static_initialization_and_destruction_0(int, int)", + type="void (int, int)", + description="static void __static_initialization_and_destruction_0(int, int);" + } + ] + } + ] + } + diff --git a/notes/README.logging b/notes/README.logging index 9e3db6e..e398224 100644 --- a/notes/README.logging +++ b/notes/README.logging @@ -28,3 +28,13 @@ To turn on simple logging of qDebug(), et al, set this: Then start seer. There should be lots of debug output. + + +If qDebug() output is missing filename and lineno information. Like: + + [16:57:16][unknown:0][default] Some text... + +Then build with debug turned on. + + cmake -DCMAKE_BUILD_TYPE=Debug .. + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index da41d6e..4f40b2c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -54,8 +54,9 @@ set(HEADER_FILES SeerMemoryVisualizerWidget.h SeerRegisterValuesBrowserWidget.h SeerRunStatusIndicator.h - SeerSharedLibraryBrowserWidget.h + SeerLibraryBrowserWidget.h SeerSourceBrowserWidget.h + SeerFunctionBrowserWidget.h SeerSourceLibraryManagerWidget.h SeerStackArgumentsBrowserWidget.h SeerStackFramesBrowserWidget.h @@ -123,8 +124,9 @@ set(SOURCE_FILES SeerMemoryVisualizerWidget.cpp SeerRegisterValuesBrowserWidget.cpp SeerRunStatusIndicator.cpp - SeerSharedLibraryBrowserWidget.cpp + SeerLibraryBrowserWidget.cpp SeerSourceBrowserWidget.cpp + SeerFunctionBrowserWidget.cpp SeerSourceLibraryManagerWidget.cpp SeerStackArgumentsBrowserWidget.cpp SeerStackFramesBrowserWidget.cpp diff --git a/src/SeerFunctionBrowserWidget.cpp b/src/SeerFunctionBrowserWidget.cpp new file mode 100644 index 0000000..66fccba --- /dev/null +++ b/src/SeerFunctionBrowserWidget.cpp @@ -0,0 +1,160 @@ +#include "SeerFunctionBrowserWidget.h" +#include "SeerUtl.h" +#include +#include +#include +#include +#include +#include +#include +#include + +SeerFunctionBrowserWidget::SeerFunctionBrowserWidget (QWidget* parent) : QWidget(parent) { + + // Construct the UI. + setupUi(this); + + // Setup the widgets + functionSearchLineEdit->setPlaceholderText("Search..."); + functionSearchLineEdit->setClearButtonEnabled(true); + functionTreeWidget->setMouseTracking(true); + //functionTreeWidget->resizeColumnToContents(0); + functionTreeWidget->resizeColumnToContents(1); + functionTreeWidget->resizeColumnToContents(2); + functionTreeWidget->resizeColumnToContents(3); + functionTreeWidget->resizeColumnToContents(4); + functionTreeWidget->resizeColumnToContents(5); + functionTreeWidget->clear(); + functionTreeWidget->setSortingEnabled(false); + + // Connect things. + QObject::connect(functionTreeWidget, &QTreeWidget::itemDoubleClicked, this, &SeerFunctionBrowserWidget::handleItemDoubleClicked); + QObject::connect(functionSearchLineEdit, &QLineEdit::returnPressed, this, &SeerFunctionBrowserWidget::handleSearchLineEdit); +} + +SeerFunctionBrowserWidget::~SeerFunctionBrowserWidget () { +} + +void SeerFunctionBrowserWidget::handleText (const QString& text) { + + QApplication::setOverrideCursor(Qt::BusyCursor); + + if (text.startsWith("^done,symbols={") && text.endsWith("}")) { + + functionTreeWidget->clear(); + functionTreeWidget->setSortingEnabled(false); + functionTreeWidget->sortByColumn(-1, Qt::AscendingOrder); + + // -symbol-info-functions + // ^done,symbols={ + // debug=[ + // { + // filename="elf-init.c", + // fullname="/home/abuild/rpmbuild/BUILD/glibc-2.31/csu/elf-init.c", + // symbols=[ + // { + // line="95", + // name="__libc_csu_fini", + // type="void (void)", + // description="void __libc_csu_fini(void);" + // }, + // { + // line="67", + // name="__libc_csu_init", + // type="void (int, char **, char **)", + // description="void __libc_csu_init(int, char **, char **);" + // } + // ] + // }, + // ... + // ] + // } + + QString debug_text = Seer::parseFirst(text, "debug=", '[', ']', false); + + QStringList filenames_list = Seer::parse(debug_text, "", '{', '}', false); + + for (const auto& filename_entry : filenames_list) { + + QString filename_text = Seer::parseFirst(filename_entry, "filename=", '"', '"', false); + QString fullname_text = Seer::parseFirst(filename_entry, "fullname=", '"', '"', false); + + QString symbols_text = Seer::parseFirst(filename_entry, "symbols=", '[', ']', false); + + QStringList symbols_list = Seer::parse(symbols_text, "", '{', '}', false); + + for (const auto& symbol_entry : symbols_list) { + + QString line_text = Seer::parseFirst(symbol_entry, "line=", '"', '"', false); + QString name_text = Seer::parseFirst(symbol_entry, "name=", '"', '"', false); + QString type_text = Seer::parseFirst(symbol_entry, "type=", '"', '"', false); + QString description_text = Seer::parseFirst(symbol_entry, "type=", '"', '"', false); + + // Skip function entries that have no line number. + if (line_text == "") { + continue; + } + + // Add the function to the tree. + QTreeWidgetItem* item = new QTreeWidgetItem; + + QFont f0 = item->font(0); + f0.setBold(true); + item->setFont(0,f0); + + item->setText(0, name_text); + item->setText(1, filename_text); + item->setText(2, line_text); + item->setText(3, fullname_text); + item->setText(4, type_text); + item->setText(5, description_text); + + functionTreeWidget->addTopLevelItem(item); + } + } + + }else{ + // Ignore others. + } + + //functionTreeWidget->resizeColumnToContents(0); + functionTreeWidget->resizeColumnToContents(1); + functionTreeWidget->resizeColumnToContents(2); + functionTreeWidget->resizeColumnToContents(3); + functionTreeWidget->resizeColumnToContents(4); + functionTreeWidget->resizeColumnToContents(5); + functionTreeWidget->sortByColumn(0, Qt::AscendingOrder); + functionTreeWidget->setSortingEnabled(true); + + QApplication::restoreOverrideCursor(); +} + +void SeerFunctionBrowserWidget::handleItemDoubleClicked (QTreeWidgetItem* item, int column) { + + Q_UNUSED(column); + + emit selectedFile(item->text(1), item->text(3), item->text(2).toInt()); +} + +void SeerFunctionBrowserWidget::handleSearchLineEdit () { + + functionTreeWidget->clear(); + functionTreeWidget->setSortingEnabled(false); + functionTreeWidget->sortByColumn(-1, Qt::AscendingOrder); + + //functionTreeWidget->resizeColumnToContents(0); + functionTreeWidget->resizeColumnToContents(1); + functionTreeWidget->resizeColumnToContents(2); + functionTreeWidget->resizeColumnToContents(3); + functionTreeWidget->resizeColumnToContents(4); + functionTreeWidget->resizeColumnToContents(5); + + if (functionSearchLineEdit->text() != "") { + emit refreshFunctionList(functionSearchLineEdit->text()); + } +} + +void SeerFunctionBrowserWidget::refresh () { + handleSearchLineEdit(); +} + diff --git a/src/SeerFunctionBrowserWidget.h b/src/SeerFunctionBrowserWidget.h new file mode 100644 index 0000000..02597dc --- /dev/null +++ b/src/SeerFunctionBrowserWidget.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include "ui_SeerFunctionBrowserWidget.h" + +class SeerFunctionBrowserWidget : public QWidget, protected Ui::SeerFunctionBrowserWidgetForm { + + Q_OBJECT + + public: + explicit SeerFunctionBrowserWidget (QWidget* parent = 0); + ~SeerFunctionBrowserWidget (); + + public slots: + void handleText (const QString& text); + void refresh (); + + protected slots: + void handleSearchLineEdit (); + void handleItemDoubleClicked (QTreeWidgetItem* item, int column); + + signals: + void refreshFunctionList (const QString& functionRegex); + void selectedFile (QString file, QString fullname, int lineno); + + protected: + private: +}; + diff --git a/src/SeerFunctionBrowserWidget.ui b/src/SeerFunctionBrowserWidget.ui new file mode 100644 index 0000000..16c0174 --- /dev/null +++ b/src/SeerFunctionBrowserWidget.ui @@ -0,0 +1,68 @@ + + + SeerFunctionBrowserWidgetForm + + + + 0 + 0 + 730 + 698 + + + + Function Browser + + + + + + 6 + + + + Function + + + + + File + + + + + Line + + + + + Full Name + + + + + Type + + + + + Description + + + + + + + + Search in the list of functions. "*" is allowed. + + + + + + + + + + + diff --git a/src/SeerGdbWidget.cpp b/src/SeerGdbWidget.cpp index 73e0876..ccb0578 100644 --- a/src/SeerGdbWidget.cpp +++ b/src/SeerGdbWidget.cpp @@ -109,7 +109,8 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(_gdbMonitor, &GdbMonitor::astrixTextOutput, editorManagerWidget, &SeerEditorManagerWidget::handleText); QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, editorManagerWidget, &SeerEditorManagerWidget::handleText); QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, sourceLibraryManagerWidget->sourceBrowserWidget(), &SeerSourceBrowserWidget::handleText); - QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, sourceLibraryManagerWidget->sharedLibraryBrowserWidget(), &SeerSharedLibraryBrowserWidget::handleText); + QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, sourceLibraryManagerWidget->functionBrowserWidget(), &SeerFunctionBrowserWidget::handleText); + QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, sourceLibraryManagerWidget->libraryBrowserWidget(), &SeerLibraryBrowserWidget::handleText); QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, stackManagerWidget->stackFramesBrowserWidget(), &SeerStackFramesBrowserWidget::handleText); QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, stackManagerWidget->stackLocalsBrowserWidget(), &SeerStackLocalsBrowserWidget::handleText); QObject::connect(_gdbMonitor, &GdbMonitor::caretTextOutput, stackManagerWidget->stackArgumentsBrowserWidget(), &SeerStackArgumentsBrowserWidget::handleText); @@ -145,7 +146,9 @@ SeerGdbWidget::SeerGdbWidget (QWidget* parent) : QWidget(parent) { QObject::connect(sourceLibraryManagerWidget->sourceBrowserWidget(), &SeerSourceBrowserWidget::refreshSourceList, this, &SeerGdbWidget::handleGdbExecutableSources); QObject::connect(sourceLibraryManagerWidget->sourceBrowserWidget(), &SeerSourceBrowserWidget::selectedFile, editorManagerWidget, &SeerEditorManagerWidget::handleOpenFile); - QObject::connect(sourceLibraryManagerWidget->sharedLibraryBrowserWidget(), &SeerSharedLibraryBrowserWidget::refreshSharedLibraryList, this, &SeerGdbWidget::handleGdbExecutableSharedLibraries); + QObject::connect(sourceLibraryManagerWidget->functionBrowserWidget(), &SeerFunctionBrowserWidget::refreshFunctionList, this, &SeerGdbWidget::handleGdbExecutableFunctions); + QObject::connect(sourceLibraryManagerWidget->functionBrowserWidget(), &SeerFunctionBrowserWidget::selectedFile, editorManagerWidget, &SeerEditorManagerWidget::handleOpenFile); + QObject::connect(sourceLibraryManagerWidget->libraryBrowserWidget(), &SeerLibraryBrowserWidget::refreshLibraryList, this, &SeerGdbWidget::handleGdbExecutableSharedLibraries); QObject::connect(stackManagerWidget->stackFramesBrowserWidget(), &SeerStackFramesBrowserWidget::refreshStackFrames, this, &SeerGdbWidget::handleGdbStackListFrames); QObject::connect(stackManagerWidget->stackLocalsBrowserWidget(), &SeerStackLocalsBrowserWidget::refreshStackLocals, this, &SeerGdbWidget::handleGdbStackListLocals); @@ -1009,6 +1012,21 @@ void SeerGdbWidget::handleGdbExecutableSources () { handleGdbCommand("-file-list-exec-source-files"); } +void SeerGdbWidget::handleGdbExecutableFunctions (const QString& functionRegex) { + + if (executableLaunchMode() == "") { + return; + } + + if (functionRegex == "") { + return; + } + + //qDebug() << functionRegex; + + handleGdbCommand(QString("-symbol-info-functions --name %1").arg(functionRegex)); +} + void SeerGdbWidget::handleGdbExecutableSharedLibraries () { if (executableLaunchMode() == "") { diff --git a/src/SeerGdbWidget.h b/src/SeerGdbWidget.h index 25ce236..27dacc6 100644 --- a/src/SeerGdbWidget.h +++ b/src/SeerGdbWidget.h @@ -137,6 +137,7 @@ class SeerGdbWidget : public QWidget, protected Ui::SeerGdbWidgetForm { void handleGdbInterruptSIGUSR1 (); void handleGdbInterruptSIGUSR2 (); void handleGdbExecutableSources (); + void handleGdbExecutableFunctions (const QString& functionRegex); void handleGdbExecutableSharedLibraries (); void handleGdbExecutableName (); void handleGdbExecutableArguments (); diff --git a/src/SeerSharedLibraryBrowserWidget.cpp b/src/SeerLibraryBrowserWidget.cpp similarity index 58% rename from src/SeerSharedLibraryBrowserWidget.cpp rename to src/SeerLibraryBrowserWidget.cpp index e4d19b3..65afc71 100644 --- a/src/SeerSharedLibraryBrowserWidget.cpp +++ b/src/SeerLibraryBrowserWidget.cpp @@ -1,4 +1,4 @@ -#include "SeerSharedLibraryBrowserWidget.h" +#include "SeerLibraryBrowserWidget.h" #include "SeerUtl.h" #include #include @@ -8,31 +8,31 @@ #include #include -SeerSharedLibraryBrowserWidget::SeerSharedLibraryBrowserWidget (QWidget* parent) : QWidget(parent) { +SeerLibraryBrowserWidget::SeerLibraryBrowserWidget (QWidget* parent) : QWidget(parent) { // Construct the UI. setupUi(this); // Setup the widgets - sharedLibrarySearchLineEdit->setPlaceholderText("Search..."); - sharedLibrarySearchLineEdit->setClearButtonEnabled(true); - sharedLibraryTreeWidget->resizeColumnToContents(0); - sharedLibraryTreeWidget->resizeColumnToContents(1); - sharedLibraryTreeWidget->resizeColumnToContents(2); - sharedLibraryTreeWidget->resizeColumnToContents(3); - sharedLibraryTreeWidget->resizeColumnToContents(4); - sharedLibraryTreeWidget->resizeColumnToContents(5); - sharedLibraryTreeWidget->clear(); - sharedLibraryTreeWidget->setSortingEnabled(false); + librarySearchLineEdit->setPlaceholderText("Search..."); + librarySearchLineEdit->setClearButtonEnabled(true); + libraryTreeWidget->resizeColumnToContents(0); + libraryTreeWidget->resizeColumnToContents(1); + libraryTreeWidget->resizeColumnToContents(2); + libraryTreeWidget->resizeColumnToContents(3); + libraryTreeWidget->resizeColumnToContents(4); + libraryTreeWidget->resizeColumnToContents(5); + libraryTreeWidget->clear(); + libraryTreeWidget->setSortingEnabled(false); // Connect things. - QObject::connect(sharedLibrarySearchLineEdit, &QLineEdit::textChanged, this, &SeerSharedLibraryBrowserWidget::handleSearchLineEdit); + QObject::connect(librarySearchLineEdit, &QLineEdit::textChanged, this, &SeerLibraryBrowserWidget::handleSearchLineEdit); } -SeerSharedLibraryBrowserWidget::~SeerSharedLibraryBrowserWidget () { +SeerLibraryBrowserWidget::~SeerLibraryBrowserWidget () { } -void SeerSharedLibraryBrowserWidget::handleText (const QString& text) { +void SeerLibraryBrowserWidget::handleText (const QString& text) { // Don't do any work if the widget is hidden. if (isHidden()) { @@ -43,9 +43,9 @@ void SeerSharedLibraryBrowserWidget::handleText (const QString& text) { if (text.startsWith("^done,shared-libraries=[") && text.endsWith("]")) { - sharedLibraryTreeWidget->clear(); - sharedLibraryTreeWidget->setSortingEnabled(false); - sharedLibraryTreeWidget->sortByColumn(-1, Qt::AscendingOrder); + libraryTreeWidget->clear(); + libraryTreeWidget->setSortingEnabled(false); + libraryTreeWidget->sortByColumn(-1, Qt::AscendingOrder); // -file-list-shared-libraries // ^done,shared-libraries=[ @@ -77,32 +77,32 @@ void SeerSharedLibraryBrowserWidget::handleText (const QString& text) { item->setText(4, thread_group_text); item->setText(5, ranges_text); - sharedLibraryTreeWidget->addTopLevelItem(item); + libraryTreeWidget->addTopLevelItem(item); } }else{ // Ignore others. } - sharedLibraryTreeWidget->resizeColumnToContents(0); - sharedLibraryTreeWidget->resizeColumnToContents(1); - sharedLibraryTreeWidget->resizeColumnToContents(2); - sharedLibraryTreeWidget->resizeColumnToContents(3); - sharedLibraryTreeWidget->resizeColumnToContents(4); - sharedLibraryTreeWidget->resizeColumnToContents(5); - sharedLibraryTreeWidget->sortByColumn(0, Qt::AscendingOrder); - sharedLibraryTreeWidget->setSortingEnabled(true); + libraryTreeWidget->resizeColumnToContents(0); + libraryTreeWidget->resizeColumnToContents(1); + libraryTreeWidget->resizeColumnToContents(2); + libraryTreeWidget->resizeColumnToContents(3); + libraryTreeWidget->resizeColumnToContents(4); + libraryTreeWidget->resizeColumnToContents(5); + libraryTreeWidget->sortByColumn(0, Qt::AscendingOrder); + libraryTreeWidget->setSortingEnabled(true); - sharedLibrarySearchLineEdit->clear(); + librarySearchLineEdit->clear(); QApplication::restoreOverrideCursor(); } -void SeerSharedLibraryBrowserWidget::handleSearchLineEdit (const QString& text) { +void SeerLibraryBrowserWidget::handleSearchLineEdit (const QString& text) { // Set everything to a normal font. If there is no search text, unhide everything. // If there is search text, hide everything so the matching ones can be unhidden later on. - QTreeWidgetItemIterator it(sharedLibraryTreeWidget); + QTreeWidgetItemIterator it(libraryTreeWidget); if (*it) { @@ -118,7 +118,7 @@ void SeerSharedLibraryBrowserWidget::handleSearchLineEdit (const QString& text) } }else{ while (*it) { - (*it)->setHidden(true); // Has serach text, hide everything. Matching items to be unhidden below. + (*it)->setHidden(true); // Has search text, hide everything. Matching items to be unhidden below. (*it)->setFont(0,f0); ++it; } @@ -131,9 +131,9 @@ void SeerSharedLibraryBrowserWidget::handleSearchLineEdit (const QString& text) QList matches; if (text.contains('*')) { - matches = sharedLibraryTreeWidget->findItems(text, Qt::MatchWildcard | Qt::MatchRecursive, 0); + matches = libraryTreeWidget->findItems(text, Qt::MatchWildcard | Qt::MatchRecursive, 0); }else{ - matches = sharedLibraryTreeWidget->findItems(text, Qt::MatchStartsWith | Qt::MatchRecursive, 0); + matches = libraryTreeWidget->findItems(text, Qt::MatchStartsWith | Qt::MatchRecursive, 0); } QList::const_iterator it = matches.begin(); @@ -141,7 +141,7 @@ void SeerSharedLibraryBrowserWidget::handleSearchLineEdit (const QString& text) if (it != e) { - sharedLibraryTreeWidget->setCurrentItem(*it); + libraryTreeWidget->setCurrentItem(*it); QFont f0 = (*it)->font(0); @@ -157,19 +157,19 @@ void SeerSharedLibraryBrowserWidget::handleSearchLineEdit (const QString& text) //qDebug() << text << matches.size(); } - sharedLibraryTreeWidget->resizeColumnToContents(0); - sharedLibraryTreeWidget->resizeColumnToContents(1); - sharedLibraryTreeWidget->resizeColumnToContents(2); - sharedLibraryTreeWidget->resizeColumnToContents(3); - sharedLibraryTreeWidget->resizeColumnToContents(4); - sharedLibraryTreeWidget->resizeColumnToContents(5); + libraryTreeWidget->resizeColumnToContents(0); + libraryTreeWidget->resizeColumnToContents(1); + libraryTreeWidget->resizeColumnToContents(2); + libraryTreeWidget->resizeColumnToContents(3); + libraryTreeWidget->resizeColumnToContents(4); + libraryTreeWidget->resizeColumnToContents(5); } -void SeerSharedLibraryBrowserWidget::refresh () { - emit refreshSharedLibraryList(); +void SeerLibraryBrowserWidget::refresh () { + emit refreshLibraryList(); } -void SeerSharedLibraryBrowserWidget::showEvent (QShowEvent* event) { +void SeerLibraryBrowserWidget::showEvent (QShowEvent* event) { QWidget::showEvent(event); diff --git a/src/SeerSharedLibraryBrowserWidget.h b/src/SeerLibraryBrowserWidget.h similarity index 58% rename from src/SeerSharedLibraryBrowserWidget.h rename to src/SeerLibraryBrowserWidget.h index 802d57d..75ec95f 100644 --- a/src/SeerSharedLibraryBrowserWidget.h +++ b/src/SeerLibraryBrowserWidget.h @@ -2,23 +2,25 @@ #include #include -#include "ui_SeerSharedLibraryBrowserWidget.h" +#include "ui_SeerLibraryBrowserWidget.h" -class SeerSharedLibraryBrowserWidget : public QWidget, protected Ui::SeerSharedLibraryBrowserWidgetForm { +class SeerLibraryBrowserWidget : public QWidget, protected Ui::SeerLibraryBrowserWidgetForm { Q_OBJECT public: - explicit SeerSharedLibraryBrowserWidget (QWidget* parent = 0); - ~SeerSharedLibraryBrowserWidget (); + explicit SeerLibraryBrowserWidget (QWidget* parent = 0); + ~SeerLibraryBrowserWidget (); public slots: void handleText (const QString& text); - void handleSearchLineEdit (const QString& text); void refresh (); + protected slots: + void handleSearchLineEdit (const QString& text); + signals: - void refreshSharedLibraryList (); + void refreshLibraryList (); protected: void showEvent (QShowEvent* event); diff --git a/src/SeerSharedLibraryBrowserWidget.ui b/src/SeerLibraryBrowserWidget.ui similarity index 82% rename from src/SeerSharedLibraryBrowserWidget.ui rename to src/SeerLibraryBrowserWidget.ui index 79a5f1e..659c666 100644 --- a/src/SeerSharedLibraryBrowserWidget.ui +++ b/src/SeerLibraryBrowserWidget.ui @@ -1,7 +1,7 @@ - SeerSharedLibraryBrowserWidgetForm - + SeerLibraryBrowserWidgetForm + 0 @@ -11,11 +11,11 @@ - Shared Library Browser + Library Browser - + 6 @@ -52,7 +52,7 @@ - + Search in the list of libraries. "*" is allowed. diff --git a/src/SeerMainWindow.cpp b/src/SeerMainWindow.cpp index be6444e..a739588 100644 --- a/src/SeerMainWindow.cpp +++ b/src/SeerMainWindow.cpp @@ -517,6 +517,9 @@ void SeerMainWindow::handleText (const QString& text) { }else if (text.startsWith("^done,DataExpressionTable={") && text.endsWith("}")) { return; + }else if (text.startsWith("^done,symbols={") && text.endsWith("}")) { + return; + }else if (text == "^exit") { return; diff --git a/src/SeerSourceLibraryManagerWidget.cpp b/src/SeerSourceLibraryManagerWidget.cpp index 93d3def..20fdad9 100644 --- a/src/SeerSourceLibraryManagerWidget.cpp +++ b/src/SeerSourceLibraryManagerWidget.cpp @@ -14,11 +14,13 @@ SeerSourceLibraryManagerWidget::SeerSourceLibraryManagerWidget (QWidget* parent) tabWidget->setMovable(true); tabWidget->setTabsClosable(false); - _sourceBrowserWidget = new SeerSourceBrowserWidget(this); - _sharedLibraryBrowserWidget = new SeerSharedLibraryBrowserWidget(this); + _sourceBrowserWidget = new SeerSourceBrowserWidget(this); + _functionBrowserWidget = new SeerFunctionBrowserWidget(this); + _libraryBrowserWidget = new SeerLibraryBrowserWidget(this); - tabWidget->addTab(_sourceBrowserWidget, "Source"); - tabWidget->addTab(_sharedLibraryBrowserWidget, "Libraries"); + tabWidget->addTab(_sourceBrowserWidget, "Source"); + tabWidget->addTab(_functionBrowserWidget, "Functions"); + tabWidget->addTab(_libraryBrowserWidget, "Libraries"); QToolButton* refreshToolButton = new QToolButton(tabWidget); refreshToolButton->setIcon(QIcon(":/seer/resources/RelaxLightIcons/view-refresh.svg")); @@ -36,13 +38,18 @@ SeerSourceBrowserWidget* SeerSourceLibraryManagerWidget::sourceBrowserWidget () return _sourceBrowserWidget; } -SeerSharedLibraryBrowserWidget* SeerSourceLibraryManagerWidget::sharedLibraryBrowserWidget () { - return _sharedLibraryBrowserWidget; +SeerFunctionBrowserWidget* SeerSourceLibraryManagerWidget::functionBrowserWidget () { + return _functionBrowserWidget; +} + +SeerLibraryBrowserWidget* SeerSourceLibraryManagerWidget::libraryBrowserWidget () { + return _libraryBrowserWidget; } void SeerSourceLibraryManagerWidget::handleRefreshToolButtonClicked () { sourceBrowserWidget()->refresh(); - sharedLibraryBrowserWidget()->refresh(); + functionBrowserWidget()->refresh(); + libraryBrowserWidget()->refresh(); } diff --git a/src/SeerSourceLibraryManagerWidget.h b/src/SeerSourceLibraryManagerWidget.h index 2805043..3a400d1 100644 --- a/src/SeerSourceLibraryManagerWidget.h +++ b/src/SeerSourceLibraryManagerWidget.h @@ -1,7 +1,8 @@ #pragma once #include "SeerSourceBrowserWidget.h" -#include "SeerSharedLibraryBrowserWidget.h" +#include "SeerFunctionBrowserWidget.h" +#include "SeerLibraryBrowserWidget.h" #include @@ -16,7 +17,8 @@ class SeerSourceLibraryManagerWidget : public QWidget, protected Ui::SeerSourceL ~SeerSourceLibraryManagerWidget (); SeerSourceBrowserWidget* sourceBrowserWidget (); - SeerSharedLibraryBrowserWidget* sharedLibraryBrowserWidget (); + SeerFunctionBrowserWidget* functionBrowserWidget (); + SeerLibraryBrowserWidget* libraryBrowserWidget (); signals: public slots: @@ -25,6 +27,7 @@ class SeerSourceLibraryManagerWidget : public QWidget, protected Ui::SeerSourceL private: SeerSourceBrowserWidget* _sourceBrowserWidget; - SeerSharedLibraryBrowserWidget* _sharedLibraryBrowserWidget; + SeerFunctionBrowserWidget* _functionBrowserWidget; + SeerLibraryBrowserWidget* _libraryBrowserWidget; };