Refactor ProcessorTab to use its toolbar for simulator control
MODIFY
resources/icons/icons.qrc
resources/icons/icons.qrc
<file>step-clock.svg</file>
<file>rewind.svg</file>
<file>reset.svg</file>
+ <file>tag.svg</file>
+ <file>run.svg</file>
</qresource>
</RCC>

ADD
resources/icons/run.svg
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ viewBox="0 0 129 129"
+ enable-background="new 0 0 129 129"
+ id="svg367"
+ sodipodi:docname="run.svg"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)">
+ <metadata
+ id="metadata373">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs371" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1853"
+ inkscape:window-height="1025"
+ id="namedview369"
+ showgrid="false"
+ inkscape:zoom="0.57829276"
+ inkscape:cx="755.05669"
+ inkscape:cy="-125.04766"
+ inkscape:window-x="67"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg367" />
+ <g
+ id="g365"
+ transform="translate(-15.563052,-0.64846048)">
+ <path
+ d="m 40.4,121.3 c -0.8,0.8 -1.8,1.2 -2.9,1.2 -1.1,0 -2.1,-0.4 -2.9,-1.2 -1.6,-1.6 -1.6,-4.2 0,-5.8 l 51,-51 -51,-51 C 33,11.9 33,9.3 34.6,7.7 c 1.6,-1.6 4.2,-1.6 5.8,0 l 53.9,53.9 c 1.6,1.6 1.6,4.2 0,5.8 z"
+ id="path363"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="translate(16.821394,0.08625834)"
+ id="g365-3">
+ <path
+ inkscape:connector-curvature="0"
+ d="m 40.4,121.3 c -0.8,0.8 -1.8,1.2 -2.9,1.2 -1.1,0 -2.1,-0.4 -2.9,-1.2 -1.6,-1.6 -1.6,-4.2 0,-5.8 l 51,-51 -51,-51 C 33,11.9 33,9.3 34.6,7.7 c 1.6,-1.6 4.2,-1.6 5.8,0 l 53.9,53.9 c 1.6,1.6 1.6,4.2 0,5.8 z"
+ id="path363-6" />
+ </g>
+</svg>

ADD
resources/icons/tag.svg
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 487.85 487.85"
+ style="enable-background:new 0 0 487.85 487.85;"
+ xml:space="preserve"
+ sodipodi:docname="tag.svg"
+ inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
+ id="metadata217"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs215" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1853"
+ inkscape:window-height="1025"
+ id="namedview213"
+ showgrid="false"
+ inkscape:zoom="0.17103331"
+ inkscape:cx="3380.4123"
+ inkscape:cy="-412.7946"
+ inkscape:window-x="67"
+ inkscape:window-y="27"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" />
+<g
+ id="g180">
+ <path
+ d="M479,215.275l-83.5-113.9c-11-15-33.3-26.3-51.8-26.3H39.2c-21.6,0-39.2,17.6-39.2,39.2v259.3c0,21.6,17.6,39.2,39.2,39.2 h304.5c18.6,0,40.9-11.3,51.8-26.3l83.5-113.9C490.8,256.575,490.8,231.375,479,215.275z M457.2,256.775l-83.5,113.9 c-5.8,8-20.2,15.2-30.1,15.2H39.2c-6.7,0-12.2-5.5-12.2-12.2v-259.4c0-6.7,5.5-12.2,12.2-12.2h304.5c9.9,0,24.2,7.3,30.1,15.2 l83.5,113.9C462.1,237.875,462.1,250.075,457.2,256.775z"
+ id="path178" />
+</g>
+<g
+ id="g182">
+</g>
+<g
+ id="g184">
+</g>
+<g
+ id="g186">
+</g>
+<g
+ id="g188">
+</g>
+<g
+ id="g190">
+</g>
+<g
+ id="g192">
+</g>
+<g
+ id="g194">
+</g>
+<g
+ id="g196">
+</g>
+<g
+ id="g198">
+</g>
+<g
+ id="g200">
+</g>
+<g
+ id="g202">
+</g>
+<g
+ id="g204">
+</g>
+<g
+ id="g206">
+</g>
+<g
+ id="g208">
+</g>
+<g
+ id="g210">
+</g>
+<text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+ x="60.660694"
+ y="324.31653"
+ id="text3924"><tspan
+ sodipodi:role="line"
+ id="tspan3922"
+ x="60.660694"
+ y="324.31653"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:240px;line-height:6.25;font-family:sans-serif;-inkscape-font-specification:sans-serif">0x</tspan></text>
+</svg>
\ No newline at end of file

MODIFY
src/mainwindow.cpp
src/mainwindow.cpp
@@ -25,7 +25,6 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), m_ui(new Ui::Main
setWindowIcon(QIcon(":/icons/logo.svg"));
showMaximized();
- m_toolbar = addToolBar("Ripes actions");
setupMenus();
// Create tabs
@@ -88,7 +87,7 @@ void MainWindow::tabChanged() {
for (int i = 0; i < m_stackedTabs->count(); i++) {
auto* w = dynamic_cast<RipesTab*>(m_stackedTabs->widget(i));
auto* tb = w->getToolbar();
- tb->setVisible(w == tab);
+ tb->setVisible(w == tab && (tb->children().length() != 0));
}
}
@@ -96,7 +95,7 @@ void MainWindow::setupMenus() {}
void MainWindow::run() {
// Function for triggering the run dialog from unit tests
- m_processorTab->on_run_clicked();
+ m_processorTab->run();
}
MainWindow::~MainWindow() {

MODIFY
src/processortab.cpp
src/processortab.cpp
#include "processortab.h"
-#include <QScrollBar>
-#include "graphics/pipelinewidget.h"
-#include "instructionmodel.h"
-#include "rundialog.h"
#include "ui_processortab.h"
#include <QFileDialog>
+#include <QScrollBar>
+#include <QSpinBox>
+#include "graphics/pipelinewidget.h"
+#include "instructionmodel.h"
#include "parser.h"
#include "pipeline.h"
+#include "rundialog.h"
ProcessorTab::ProcessorTab(QToolBar* toolbar, QWidget* parent) : RipesTab(toolbar, parent), m_ui(new Ui::ProcessorTab) {
m_ui->setupUi(this);
- // Setup buttons
- connect(m_ui->start, &QPushButton::toggled, this, &ProcessorTab::toggleTimer);
-
- // Setup execution speed slider
- connect(m_ui->execSpeed, &QSlider::valueChanged, [=](int pos) {
- // Reverse the slider, going from high to low
- const static int delay = m_ui->execSpeed->maximum() + m_ui->execSpeed->minimum();
- m_timer.setInterval(delay - pos);
- });
- m_ui->execSpeed->valueChanged(m_ui->execSpeed->value());
-
- connect(m_ui->reset, &QPushButton::clicked, [=] { m_ui->start->setChecked(false); });
-
- // Setup stepping timer
- connect(&m_timer, &QTimer::timeout, this, &ProcessorTab::on_step_clicked);
+ setupSimulatorActions();
// Setup updating signals
connect(this, &ProcessorTab::update, m_ui->registerContainer, &RegisterContainerWidget::update);
@@ -48,39 +35,86 @@ ProcessorTab::ProcessorTab(QToolBar* toolbar, QWidget* parent) : RipesTab(toolba
<< (m_ui->consolesTab->minimumHeight() + 1));
m_ui->consolesTab->removeTab(1);
- // Initially, no file is loaded, disable run, step and reset buttons
- m_ui->reset->setEnabled(false);
- m_ui->step->setEnabled(false);
- m_ui->run->setEnabled(false);
- m_ui->start->setEnabled(false);
- m_ui->table->setEnabled(false);
-}
-
-void ProcessorTab::toggleTimer(bool state) {
- const static QString pauseText = QLatin1String("Stop autostepping (F5)");
- const static QString startText = QLatin1String("Start autostepping (F5)");
- if (state) {
- m_ui->start->setText(pauseText);
- m_ui->start->setShortcut(Qt::Key_F5); // The shortcut is for some reason cleared when editing the button text
- m_timer.start();
+ // Initially, no file is loaded, disable toolbuttons
+ updateActionState();
+}
+
+void ProcessorTab::setupSimulatorActions() {
+ const QIcon resetIcon = QIcon(":/icons/reset.svg");
+ m_resetAction = new QAction(resetIcon, "Reset (F4)", this);
+ connect(m_resetAction, &QAction::triggered, this, &ProcessorTab::reset);
+ m_resetAction->setShortcut(QKeySequence("F4"));
+ m_toolbar->addAction(m_resetAction);
+
+ const QIcon reverseIcon = QIcon(":/icons/rewind.svg");
+ m_reverseAction = new QAction(reverseIcon, "Rewind (F5)", this);
+ m_reverseAction->setShortcut(QKeySequence("F5"));
+ m_toolbar->addAction(m_reverseAction);
+
+ const QIcon clockIcon = QIcon(":/icons/step.svg");
+ m_clockAction = new QAction(clockIcon, "Clock (F6)", this);
+ connect(m_clockAction, &QAction::triggered, this, &ProcessorTab::clock);
+ m_clockAction->setShortcut(QKeySequence("F6"));
+ m_toolbar->addAction(m_clockAction);
+
+ QTimer* timer = new QTimer();
+ connect(timer, &QTimer::timeout, this, &ProcessorTab::clock);
+
+ const QIcon startAutoClockIcon = QIcon(":/icons/step-clock.svg");
+ const QIcon stopAutoTimerIcon = QIcon(":/icons/stop-clock.svg");
+ m_autoClockAction = new QAction(startAutoClockIcon, "Auto clock (F7)", this);
+ m_autoClockAction->setShortcut(QKeySequence("F7"));
+ m_autoClockAction->setCheckable(true);
+ connect(m_autoClockAction, &QAction::toggled, [=](bool checked) {
+ if (!checked) {
+ timer->stop();
+ m_autoClockAction->setIcon(startAutoClockIcon);
} else {
- m_ui->start->setText(startText);
- m_ui->start->setShortcut(Qt::Key_F5);
- m_ui->start->setChecked(false);
- m_timer.stop();
- };
+ timer->start();
+ m_autoClockAction->setIcon(stopAutoTimerIcon);
+ }
+ });
+ m_autoClockAction->setChecked(false);
+ m_toolbar->addAction(m_autoClockAction);
+
+ QSpinBox* stepSpinBox = new QSpinBox();
+ stepSpinBox->setRange(1, 10000);
+ stepSpinBox->setSuffix(" ms");
+ stepSpinBox->setToolTip("Auto clock interval");
+ connect(stepSpinBox, qOverload<int>(&QSpinBox::valueChanged), [timer](int msec) { timer->setInterval(msec); });
+ stepSpinBox->setValue(100);
+ m_toolbar->addWidget(stepSpinBox);
+
+ const QIcon runIcon = QIcon(":/icons/run.svg");
+ m_runAction = new QAction(runIcon, "Run (F8)", this);
+ m_runAction->setShortcut(QKeySequence("F8"));
+ connect(m_runAction, &QAction::triggered, this, &ProcessorTab::run);
+ m_toolbar->addAction(m_runAction);
+
+ m_toolbar->addSeparator();
+
+ const QIcon tagIcon = QIcon(":/icons/tag.svg");
+ m_displayValuesAction = new QAction(tagIcon, "Display signal values", this);
+ m_displayValuesAction->setCheckable(true);
+ m_displayValuesAction->setChecked(false);
+ connect(m_displayValuesAction, &QAction::triggered, this, &ProcessorTab::displayValues);
+ m_toolbar->addAction(m_displayValuesAction);
+
+ const QIcon expandIcon = QIcon(":/icons/expand.svg");
+ m_fitViewAction = new QAction(expandIcon, "Fit to view", this);
+ connect(m_fitViewAction, &QAction::triggered, this, &ProcessorTab::expandView);
+ m_toolbar->addAction(m_fitViewAction);
+
+ const QIcon tableIcon = QIcon(":/icons/spreadsheet.svg");
+ m_pipelineTableAction = new QAction(tableIcon, "Show pipelining table", this);
+ connect(m_pipelineTableAction, &QAction::triggered, this, &ProcessorTab::showPipeliningTable);
+ m_toolbar->addAction(m_pipelineTableAction);
}
void ProcessorTab::restart() {
// Invoked when changes to binary simulation file has been made
emit update();
- bool pipelineReady = Pipeline::getPipeline()->getTextSize() > 0;
-
- m_ui->step->setEnabled(pipelineReady);
- m_ui->run->setEnabled(pipelineReady);
- m_ui->reset->setEnabled(pipelineReady);
- m_ui->start->setEnabled(pipelineReady);
- m_ui->table->setEnabled(pipelineReady);
+ updateActionState();
}
void ProcessorTab::initRegWidget() {
@@ -117,35 +151,52 @@ ProcessorTab::~ProcessorTab() {
delete m_ui;
}
-void ProcessorTab::on_expandView_clicked() {
+void ProcessorTab::expandView() {
m_ui->pipelineWidget->expandToView();
}
-void ProcessorTab::on_displayValues_toggled(bool checked) {
+void ProcessorTab::displayValues(bool checked) {
m_ui->pipelineWidget->displayAllValues(checked);
}
-void ProcessorTab::on_run_clicked() {
+void ProcessorTab::run() {
+ m_autoClockAction->setChecked(false);
auto pipeline = Pipeline::getPipeline();
RunDialog dialog(this);
if (pipeline->isReady()) {
if (dialog.exec() && pipeline->isFinished()) {
emit update();
- m_ui->step->setEnabled(false);
- m_ui->start->setEnabled(false);
- m_ui->run->setEnabled(false);
+ updateActionState();
}
}
}
-void ProcessorTab::on_reset_clicked() {
+void ProcessorTab::updateActionState() {
+ const auto ready = Pipeline::getPipeline()->isReady();
+
+ m_clockAction->setEnabled(ready);
+ m_autoClockAction->setEnabled(ready);
+ m_runAction->setEnabled(ready);
+ m_displayValuesAction->setEnabled(ready);
+ m_fitViewAction->setEnabled(ready);
+ m_pipelineTableAction->setEnabled(ready);
+ m_reverseAction->setEnabled(ready);
+ m_resetAction->setEnabled(ready);
+
+ if (Pipeline::getPipeline()->isFinished()) {
+ m_clockAction->setEnabled(false);
+ m_autoClockAction->setChecked(false);
+ m_autoClockAction->setEnabled(false);
+ m_runAction->setEnabled(false);
+ }
+}
+
+void ProcessorTab::reset() {
+ m_autoClockAction->setChecked(false);
Pipeline::getPipeline()->restart();
emit update();
- m_ui->step->setEnabled(true);
- m_ui->start->setEnabled(true);
- m_ui->run->setEnabled(true);
- m_ui->table->setEnabled(true);
+ updateActionState();
emit appendToLog("\n");
}
@@ -165,7 +216,7 @@ void ProcessorTab::setCurrentInstruction(int row) {
}
}
-void ProcessorTab::on_step_clicked() {
+void ProcessorTab::clock() {
auto pipeline = Pipeline::getPipeline();
auto state = pipeline->step();
@@ -178,10 +229,7 @@ void ProcessorTab::on_step_clicked() {
// Pipeline has finished executing
if (pipeline->isFinished() || (state == 1 && ecallVal.first == Pipeline::ECALL::exit)) {
- m_ui->step->setEnabled(false);
- m_ui->start->setEnabled(false);
- m_ui->run->setEnabled(false);
- toggleTimer(false);
+ updateActionState();
}
}
@@ -210,35 +258,7 @@ bool ProcessorTab::handleEcall(const std::pair<Pipeline::ECALL, int32_t>& ecall_
return true; // continue
}
-void ProcessorTab::on_zoomIn_clicked() {
- m_ui->pipelineWidget->zoomIn();
-}
-
-void ProcessorTab::on_zoomOut_clicked() {
- m_ui->pipelineWidget->zoomOut();
-}
-
-void ProcessorTab::on_save_clicked() {
- QFileDialog dialog;
- dialog.setNameFilter("*.png");
- dialog.setAcceptMode(QFileDialog::AcceptSave);
- dialog.setOption(QFileDialog::DontUseNativeDialog);
- if (dialog.exec()) {
- auto files = dialog.selectedFiles();
- if (files.length() == 1) {
- auto scene = m_ui->pipelineWidget->scene();
- QImage image(scene->sceneRect().size().toSize(), QImage::Format_ARGB32);
- image.fill(Qt::white);
- QPainter painter(&image);
- painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing |
- QPainter::SmoothPixmapTransform);
- scene->render(&painter, QRectF(), QRect(), Qt::IgnoreAspectRatio);
- image.save(files[0]);
- }
- }
-}
-
-void ProcessorTab::on_table_clicked() {
+void ProcessorTab::showPipeliningTable() {
// Setup pipeline table window
PipelineTable window;
PipelineTableModel model;

MODIFY
src/processortab.h
src/processortab.h
#ifndef PROCESSORTAB_H
#define PROCESSORTAB_H
+#include <QAction>
#include <QTimer>
#include <QToolBar>
#include <QWidget>
@@ -31,34 +32,39 @@ public:
public slots:
void restart();
- void on_run_clicked();
+ void run();
private slots:
- void on_expandView_clicked();
- void on_displayValues_toggled(bool checked);
- void on_reset_clicked();
- void on_step_clicked();
- void toggleTimer(bool state);
- void on_zoomIn_clicked();
- void on_zoomOut_clicked();
- void on_save_clicked();
+ void expandView();
+ void displayValues(bool checked);
+ void reset();
+ void clock();
void setCurrentInstruction(int row);
-
- void on_table_clicked();
-
+ void showPipeliningTable();
void updateMetrics();
+signals:
+ void update();
+ void appendToLog(QString string);
+
private:
+ void setupSimulatorActions();
+ void updateActionState();
+
bool handleEcall(const std::pair<Pipeline::ECALL, int32_t>& ecallValue);
Ui::ProcessorTab* m_ui;
InstructionModel* m_instrModel;
- QTimer m_timer;
-
-signals:
- void update();
- void appendToLog(QString string);
+ // Actions
+ QAction* m_clockAction = nullptr;
+ QAction* m_autoClockAction = nullptr;
+ QAction* m_runAction = nullptr;
+ QAction* m_displayValuesAction = nullptr;
+ QAction* m_fitViewAction = nullptr;
+ QAction* m_pipelineTableAction = nullptr;
+ QAction* m_reverseAction = nullptr;
+ QAction* m_resetAction = nullptr;
};
#endif // PROCESSORTAB_H

MODIFY
src/processortab.ui
src/processortab.ui
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
- <widget class="QGroupBox" name="groupBox_2">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="title">
- <string>Simulator control</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_7">
- <item row="0" column="0">
- <layout class="QHBoxLayout" name="horizontalLayout_5" stretch="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">
- <item>
- <widget class="QPushButton" name="run">
- <property name="toolTip">
- <string>Run until encountering a breakpoint or to the end of the program</string>
- </property>
- <property name="text">
- <string>Run (F4)</string>
- </property>
- <property name="shortcut">
- <string>F4</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="Line" name="line">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="start">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>90</width>
- <height>0</height>
- </size>
- </property>
- <property name="toolTip">
- <string>Automatically step through the program</string>
- </property>
- <property name="text">
- <string>Start autostepping (F5)</string>
- </property>
- <property name="shortcut">
- <string>F5</string>
- </property>
- <property name="checkable">
- <bool>true</bool>
- </property>
- <property name="autoRepeatDelay">
- <number>300</number>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="step">
- <property name="text">
- <string>Step (F6)</string>
- </property>
- <property name="shortcut">
- <string>F6</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="reset">
- <property name="toolTip">
- <string/>
- </property>
- <property name="text">
- <string>Reset (F7)</string>
- </property>
- <property name="shortcut">
- <string>F7</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Autostep speed:</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QSlider" name="execSpeed">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimum">
- <number>50</number>
- </property>
- <property name="maximum">
- <number>500</number>
- </property>
- <property name="value">
- <number>250</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="invertedControls">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="Line" name="line_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="displayValues">
- <property name="toolTip">
- <string>Hover over an output node to view signal value</string>
- </property>
- <property name="text">
- <string>Display all signal values</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="Line" name="line_4">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="table">
- <property name="toolTip">
- <string>View program pipeline chart</string>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/icons/icons.qrc">
- <normaloff>:/icons/spreadsheet.svg</normaloff>:/icons/spreadsheet.svg</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="Line" name="line_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="expandView">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="toolTip">
- <string>Fit pipeline to view (F10)</string>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/icons/icons.qrc">
- <normaloff>:/icons/expand.svg</normaloff>:/icons/expand.svg</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- <property name="shortcut">
- <string>F10</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="zoomIn">
- <property name="toolTip">
- <string>Zoom in</string>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/icons/icons.qrc">
- <normaloff>:/icons/zoom-in.svg</normaloff>:/icons/zoom-in.svg</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="zoomOut">
- <property name="toolTip">
- <string>Zoom out</string>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/icons/icons.qrc">
- <normaloff>:/icons/zoom-out.svg</normaloff>:/icons/zoom-out.svg</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="save">
- <property name="toolTip">
- <string>Save image to file</string>
- </property>
- <property name="text">
- <string>...</string>
- </property>
- <property name="icon">
- <iconset resource="../resources/icons/icons.qrc">
- <normaloff>:/icons/save.svg</normaloff>:/icons/save.svg</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>24</width>
- <height>24</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
- <item row="1" column="0">
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<header>graphics/pipelinewidget.h</header>
</customwidget>
</customwidgets>
- <resources>
- <include location="../resources/icons/icons.qrc"/>
- </resources>
+ <resources/>
<connections/>
</ui>

Refactor ProcessorTab to use its toolbar for simulator control