55#include < QMessageBox>
66#include < QFloat16>
77#include < QDebug>
8+ #include < QAccessible>
89
910#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
1011#include < QStringDecoder>
@@ -54,6 +55,7 @@ HexDump::HexDump(Architecture* architecture, QWidget* parent, MemoryPage* memPag
5455 connect (Bridge::getBridge (), SIGNAL (updateDump ()), this , SLOT (updateDumpSlot ()));
5556 connect (Bridge::getBridge (), SIGNAL (dbgStateChanged (DBGSTATE)), this , SLOT (debugStateChanged (DBGSTATE)));
5657 connect (this , &HexDump::selectionUpdated, this , &HexDump::updateSelectionUnderline);
58+ connect (this , SIGNAL (selectionUpdated ()), this , SLOT (selectionChangedSlot ()));
5759 setupCopyMenu ();
5860
5961 Initialize ();
@@ -347,7 +349,7 @@ QString HexDump::makeAddrText(duint va) const
347349 return std::move (addrText);
348350}
349351
350- QString HexDump::makeCopyText ()
352+ QString HexDump::makeCopyText () const
351353{
352354 auto deltaRowBase = getSelectionStart () % getBytePerRowCount () + mByteOffset ;
353355 if (deltaRowBase >= getBytePerRowCount ())
@@ -559,6 +561,7 @@ void HexDump::mousePressEvent(QMouseEvent* event)
559561
560562 // TODO: only update if the selection actually changed
561563 updateViewport ();
564+ accessibilityMousePressSetColumn (event);
562565 }
563566 }
564567 else if (colIndex == 0 )
@@ -588,6 +591,7 @@ void HexDump::mousePressEvent(QMouseEvent* event)
588591
589592 // TODO: only update if the selection actually changed
590593 updateViewport ();
594+ accessibilityMousePressSetColumn (event);
591595 }
592596 }
593597
@@ -699,6 +703,26 @@ void HexDump::keyPressEvent(QKeyEvent* event)
699703 if (granularity > 1 )
700704 expandSelectionUpTo (selStart + granularity - 1 );
701705 reloadData ();
706+ if (QAccessible::isActive ())
707+ {
708+ QAccessibleInterface* iface = QAccessible::queryAccessibleInterface (this );
709+ if (iface)
710+ {
711+ QAccessibleTableInterface* tface = (QAccessibleTableInterface*)iface->interface_cast (QAccessible::TableInterface);
712+ if (tface)
713+ {
714+ if (key == Qt::Key_Left && accessibilitySelectedColumn > 0 )
715+ {
716+ accessibilitySelectedColumn--;
717+ }
718+ else if (key == Qt::Key_Right && accessibilitySelectedColumn < tface->columnCount () - 1 )
719+ {
720+ accessibilitySelectedColumn++;
721+ }
722+ }
723+ }
724+ accessibilitySelectionChanged ();
725+ }
702726 }
703727 }
704728 else if (modifiers == Qt::ControlModifier || modifiers == (Qt::ControlModifier | Qt::AltModifier))
@@ -861,7 +885,7 @@ bool HexDump::isSelected(duint rva) const
861885 return rva >= mSelection .fromIndex && rva <= mSelection .toIndex ;
862886}
863887
864- void HexDump::getColumnRichText (duint col, duint rva, RichTextPainter::List & richText)
888+ void HexDump::getColumnRichText (duint col, duint rva, RichTextPainter::List & richText) const
865889{
866890 RichTextPainter::CustomRichText_t curData;
867891 curData.underline = false ;
@@ -1023,31 +1047,31 @@ void HexDump::getColumnRichText(duint col, duint rva, RichTextPainter::List & ri
10231047 }
10241048}
10251049
1026- void HexDump::toString (DataDescriptor desc, duint rva, uint8_t * data, RichTextPainter::CustomRichText_t & richText) // convert data to string
1050+ void HexDump::toString (DataDescriptor desc, duint rva, const uint8_t * data, RichTextPainter::CustomRichText_t & richText) const // convert data to string
10271051{
10281052 switch (desc.itemSize )
10291053 {
10301054 case Byte:
10311055 {
1032- byteToString (rva, *((uint8_t *)data), desc.byteMode , richText);
1056+ byteToString (rva, *((const uint8_t *)data), desc.byteMode , richText);
10331057 }
10341058 break ;
10351059
10361060 case Word:
10371061 {
1038- wordToString (rva, *((uint16_t *)data), desc.wordMode , richText);
1062+ wordToString (rva, *((const uint16_t *)data), desc.wordMode , richText);
10391063 }
10401064 break ;
10411065
10421066 case Dword:
10431067 {
1044- dwordToString (rva, *((uint32_t *)data), desc.dwordMode , richText);
1068+ dwordToString (rva, *((const uint32_t *)data), desc.dwordMode , richText);
10451069 }
10461070 break ;
10471071
10481072 case Qword:
10491073 {
1050- qwordToString (rva, *((uint64_t *)data), desc.qwordMode , richText);
1074+ qwordToString (rva, *((const uint64_t *)data), desc.qwordMode , richText);
10511075 }
10521076 break ;
10531077
@@ -1073,7 +1097,7 @@ void HexDump::toString(DataDescriptor desc, duint rva, uint8_t* data, RichTextPa
10731097 richText.textColor = ConfigColor (" HexDumpModifiedBytesColor" );
10741098}
10751099
1076- void HexDump::byteToString (duint rva, uint8_t byte, ByteViewMode mode, RichTextPainter::CustomRichText_t & richText)
1100+ void HexDump::byteToString (duint rva, uint8_t byte, ByteViewMode mode, RichTextPainter::CustomRichText_t & richText) const
10771101{
10781102 QString str = " " ;
10791103
@@ -1160,7 +1184,7 @@ void HexDump::byteToString(duint rva, uint8_t byte, ByteViewMode mode, RichTextP
11601184 }
11611185}
11621186
1163- void HexDump::wordToString (duint rva, uint16_t word, WordViewMode mode, RichTextPainter::CustomRichText_t & richText)
1187+ void HexDump::wordToString (duint rva, uint16_t word, WordViewMode mode, RichTextPainter::CustomRichText_t & richText) const
11641188{
11651189 Q_UNUSED (rva);
11661190 QString str;
@@ -1296,7 +1320,7 @@ void HexDump::qwordToString(duint rva, uint64_t qword, QwordViewMode mode, RichT
12961320 richText.text = str;
12971321}
12981322
1299- void HexDump::twordToString (duint rva, void * tword, TwordViewMode mode, RichTextPainter::CustomRichText_t & richText)
1323+ void HexDump::twordToString (duint rva, const void * tword, TwordViewMode mode, RichTextPainter::CustomRichText_t & richText)
13001324{
13011325 Q_UNUSED (rva);
13021326 QString str;
@@ -1653,3 +1677,17 @@ void HexDump::debugStateChanged(DBGSTATE state)
16531677 reloadData ();
16541678 }
16551679}
1680+
1681+ void HexDump::selectionChangedSlot ()
1682+ {
1683+ accessibilitySelectionChanged ();
1684+ }
1685+
1686+ int HexDump::accessibilitySelectedRow () const
1687+ {
1688+ auto sel = getInitialSelection ();
1689+ if (sel >= getTableOffsetRva () && sel <= getTableOffsetRva () + getViewableRowsCount () * getBytePerRowCount ())
1690+ return (getInitialSelection () - getTableOffsetRva ()) / getBytePerRowCount ();
1691+ else
1692+ return -1 ;
1693+ }
0 commit comments