File indexing completed on 2024-05-12 04:39:44

0001 /*
0002     SPDX-FileCopyrightText: 2013 Vlas Puhov <vlas.puhov@mail.ru>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "registersview.h"
0008 
0009 #include "converters.h"
0010 #include "debuglog.h"
0011 #include "modelsmanager.h"
0012 
0013 #include <QMenu>
0014 #include <QContextMenuEvent>
0015 
0016 #include <KLocalizedString>
0017 
0018 using namespace KDevMI;
0019 
0020 namespace
0021 {
0022 const int TABLES_COUNT = 5;
0023 }
0024 
0025 RegistersView::RegistersView(QWidget* p)
0026     : QWidget(p), m_menu(new QMenu(this))
0027 {
0028     setupUi(this);
0029 
0030     setupActions();
0031 
0032     connect(tabWidget, &QTabWidget::currentChanged, this, &RegistersView::updateRegisters);
0033 }
0034 
0035 void RegistersView::contextMenuEvent(QContextMenuEvent* e)
0036 {
0037     //Don't remove update action.
0038     const QList<QAction*> actions = m_menu->actions();
0039     for (int i = 1; i < actions.count(); i++) {
0040         m_menu->removeAction(actions[i]);
0041     }
0042 
0043     QString group = activeViews().first();
0044 
0045     for (QAction* act : qAsConst(m_actions)) {
0046         act->setChecked(false);
0047     }
0048 
0049     const QVector<Format> formats = m_modelsManager->formats(group);
0050     if (formats.size() > 1) {
0051         QMenu* m = m_menu->addMenu(i18nc("@title:menu", "Format"));
0052         for (Format fmt : formats) {
0053             m->addAction(findAction(Converters::formatToString(fmt)));
0054         }
0055         findAction(Converters::formatToString(formats.first()))->setChecked(true);
0056     }
0057 
0058     const QVector<Mode> modes = m_modelsManager->modes(group);
0059     if (modes.size() > 1) {
0060         QMenu* m = m_menu->addMenu(i18nc("@title:menu", "Mode"));
0061         for (Mode mode : modes) {
0062             m->addAction(findAction(Converters::modeToString(mode)));
0063         }
0064         findAction(Converters::modeToString(modes.first()))->setChecked(true);
0065     }
0066 
0067     m_menu->exec(e->globalPos());
0068 }
0069 
0070 void RegistersView::updateRegisters()
0071 {
0072     changeAvaliableActions();
0073 
0074     const auto views = activeViews();
0075     for (const QString& v : views) {
0076         m_modelsManager->updateRegisters(v);
0077     }
0078 }
0079 
0080 void RegistersView::menuTriggered(const QString& formatOrMode)
0081 {
0082     Format f = Converters::stringToFormat(formatOrMode);
0083     if (f != LAST_FORMAT) {
0084         m_modelsManager->setFormat(activeViews().first(), f);
0085     } else {
0086         m_modelsManager->setMode(activeViews().first(), Converters::stringToMode(formatOrMode));
0087     }
0088 
0089     updateRegisters();
0090 }
0091 
0092 void RegistersView::changeAvaliableActions()
0093 {
0094     const QString view = activeViews().first();
0095     if (view.isEmpty()) {
0096         return;
0097     }
0098 
0099     const QVector<Format> formats = m_modelsManager->formats(view) ;
0100     const QVector<Mode> modes = m_modelsManager->modes(view);
0101 
0102     for (QAction* a : qAsConst(m_actions)) {
0103         bool enable = false;
0104         for (Format f : formats) {
0105             if (a->text() == Converters::formatToString(f)) {
0106                 enable = true;
0107                 break;
0108             }
0109         }
0110 
0111         if (!enable) {
0112             for (Mode m : modes) {
0113                 if (a->text() == Converters::modeToString(m)) {
0114                     enable = true;
0115                     break;
0116                 }
0117             }
0118         }
0119 
0120         a->setVisible(enable);
0121         a->setEnabled(enable);
0122     }
0123 }
0124 
0125 QAction* RegistersView::findAction(const QString& name) const
0126 {
0127     auto it = std::find_if(m_actions.begin(), m_actions.end(), [&](QAction* a) {
0128         return (a->text() == name);
0129     });
0130     return (it != m_actions.end()) ? *it : nullptr;
0131 }
0132 
0133 void RegistersView::addView(QTableView* view, int idx)
0134 {
0135     view->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
0136     view->horizontalHeader()->hide();
0137     view->verticalHeader()->hide();
0138     view->setSelectionMode(QAbstractItemView::SingleSelection);
0139     view->setMinimumWidth(10);
0140     view->verticalHeader()->setDefaultSectionSize(15);
0141 
0142     QString name = m_modelsManager->addView(view);
0143 
0144     setNameForTable(idx, name);
0145 }
0146 
0147 void RegistersView::enable(bool enabled)
0148 {
0149     setEnabled(enabled);
0150     if (enabled) {
0151 
0152         clear();
0153 
0154         addView(registers, 0);
0155         addView(flags, 0);
0156         addView(table_1, 1);
0157         addView(table_2, 2);
0158         addView(table_3, 3);
0159 
0160         changeAvaliableActions();
0161     }
0162 }
0163 
0164 void RegistersView::setNameForTable(int idx, const QString& name)
0165 {
0166     qCDebug(DEBUGGERCOMMON) << name << " " << idx;
0167     const QString text = tabWidget->tabText(idx);
0168     if (!text.contains(name)) {
0169         tabWidget->setTabText(idx, text.isEmpty() ? name : text + QLatin1Char('/') + name);
0170     }
0171 }
0172 
0173 void RegistersView::setModel(ModelsManager* m)
0174 {
0175     m_modelsManager = m;
0176 }
0177 
0178 QStringList RegistersView::activeViews()
0179 {
0180     return tabWidget->tabText(tabWidget->currentIndex()).split(QLatin1Char('/'));
0181 }
0182 
0183 void RegistersView::clear()
0184 {
0185     for (int i = 0; i < TABLES_COUNT; i++) {
0186         tabWidget->setTabText(i, QString());
0187     }
0188 }
0189 
0190 void RegistersView::setupActions()
0191 {
0192     auto* updateAction = new QAction(this);
0193     updateAction->setShortcut(Qt::Key_U);
0194     updateAction->setShortcutContext(Qt::WidgetWithChildrenShortcut);
0195     updateAction->setText(i18nc("@action:inmenu", "Update"));
0196     connect(updateAction, &QAction::triggered, this, &RegistersView::updateRegisters);
0197     addAction(updateAction);
0198     m_menu->addAction(updateAction);
0199 
0200     insertAction(Converters::formatToString(Binary), Qt::Key_B);
0201     insertAction(Converters::formatToString(Octal), Qt::Key_O);
0202     insertAction(Converters::formatToString(Decimal), Qt::Key_D);
0203     insertAction(Converters::formatToString(Hexadecimal), Qt::Key_H);
0204     insertAction(Converters::formatToString(Raw), Qt::Key_R);
0205     insertAction(Converters::formatToString(Unsigned), Qt::Key_N);
0206 
0207     insertAction(Converters::modeToString(u32), Qt::Key_I);
0208     insertAction(Converters::modeToString(u64), Qt::Key_L);
0209     insertAction(Converters::modeToString(f32), Qt::Key_F);
0210     insertAction(Converters::modeToString(f64), Qt::Key_P);
0211 
0212     insertAction(Converters::modeToString(v2_double), Qt::Key_P);
0213     insertAction(Converters::modeToString(v2_int64), Qt::Key_L);
0214     insertAction(Converters::modeToString(v4_float), Qt::Key_F);
0215     insertAction(Converters::modeToString(v4_int32), Qt::Key_I);
0216 }
0217 
0218 void RegistersView::insertAction(const QString& name, Qt::Key k)
0219 {
0220     auto* a = new QAction(this);
0221     a->setCheckable(true);
0222     a->setShortcut(k);
0223     a->setText(name);
0224     a->setShortcutContext(Qt::WidgetWithChildrenShortcut);
0225     m_actions.append(a);
0226     addAction(a);
0227 
0228     connect(a, &QAction::triggered, this, [this, a](){ menuTriggered(a->text()); });
0229 }
0230 
0231 #include "moc_registersview.cpp"