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"