From ec05e6074b297b6909bae9c8d246dbff9129fa2b Mon Sep 17 00:00:00 2001 From: Adam Iwaniuk Date: Mon, 12 Jun 2017 15:32:33 +0200 Subject: [PATCH 1/8] minimap enabled --- include/ui/hexedit.h | 4 + include/ui/hexeditwidget.h | 2 + include/ui/nodewidget.h | 10 +++ include/visualization/minimap.h | 5 +- include/visualization/minimap_panel.h | 10 ++- src/ui/hexedit.cc | 17 ++++- src/ui/hexeditwidget.cc | 32 +++++--- src/ui/nodewidget.cc | 102 +++++++++++++++++--------- src/visualization/minimap.cc | 17 +++-- src/visualization/minimap_panel.cc | 100 +++++++++++++++++++------ 10 files changed, 224 insertions(+), 75 deletions(-) diff --git a/include/ui/hexedit.h b/include/ui/hexedit.h index 793b15aa..4e8a39b2 100644 --- a/include/ui/hexedit.h +++ b/include/ui/hexedit.h @@ -75,6 +75,7 @@ public slots: signals: void selectionChanged(qint64 start_addr, qint64 selection_size); void editStateChanged(bool has_changes, bool has_undo); + void visibleRegionChanged(qint64 start_addr, qint64 region_size); private: FileBlobModel *dataModel_; @@ -154,6 +155,9 @@ public slots: QScopedPointer textEncoder_; util::EditEngine edit_engine_; + qint64 visible_region_start_; + qint64 visible_region_size_; + void recalculateValues(); void initParseMenu(); void adjustBytesPerRowToWindowSize(); diff --git a/include/ui/hexeditwidget.h b/include/ui/hexeditwidget.h index 9b442ce7..a815e9db 100644 --- a/include/ui/hexeditwidget.h +++ b/include/ui/hexeditwidget.h @@ -61,10 +61,12 @@ class HexEditWidget : public View { signals: void showNodeTree(bool show); void showMinimap(bool show); + void updateMinimap(qint64 start_addr, qint64 region_size); public slots: void nodeTreeVisibilityChanged(bool visibility); void minimapVisibilityChanged(bool visibility); + void minimapSelectionChanged(size_t start, size_t end); private slots: void parse(QAction *action); diff --git a/include/ui/nodewidget.h b/include/ui/nodewidget.h index 83d40261..53792876 100644 --- a/include/ui/nodewidget.h +++ b/include/ui/nodewidget.h @@ -22,6 +22,7 @@ #include #include #include +#include #include "util/sampling/uniform_sampler.h" @@ -50,6 +51,10 @@ class NodeWidget : public View { public slots: void loadBinDataToMinimap(); + private slots: + void updateMinimap(); + void showMinimap(bool show); + private: MainWindowWithDetachableDockWidgets *main_window_; @@ -65,6 +70,11 @@ class NodeWidget : public View { util::UniformSampler* sampler_; QByteArray sampler_data_; + + QTimer update_minimap_timer_; + qint64 update_minimap_start_; + qint64 update_minimap_size_; + bool ignore_update_minimap_; }; } // namespace ui diff --git a/include/visualization/minimap.h b/include/visualization/minimap.h index 90259ea4..e435c594 100644 --- a/include/visualization/minimap.h +++ b/include/visualization/minimap.h @@ -48,10 +48,11 @@ class VisualizationMinimap : public QOpenGLWidget, ENTROPY }; - explicit VisualizationMinimap(QWidget *parent = 0); + explicit VisualizationMinimap(bool size_control = true, QWidget *parent = 0); ~VisualizationMinimap(); void setSampler(util::ISampler * sampler); + QPair getRange(); void setRange(size_t start, size_t end, bool reset_selection = true); QPair getSelectedRange(); void setSelectedRange(size_t start_address, size_t end_address); @@ -153,6 +154,8 @@ class VisualizationMinimap : public QOpenGLWidget, QOpenGLBuffer square_vertex_; QOpenGLVertexArrayObject vao_; + + bool size_control_; }; diff --git a/include/visualization/minimap_panel.h b/include/visualization/minimap_panel.h index 578e1f86..f9eb2dd4 100644 --- a/include/visualization/minimap_panel.h +++ b/include/visualization/minimap_panel.h @@ -33,27 +33,32 @@ class MinimapPanel : public QWidget { Q_OBJECT public: - explicit MinimapPanel(QWidget *parent = 0); + explicit MinimapPanel(QWidget *parent = 0, bool size_control = true); ~MinimapPanel(); void setSampler(util::ISampler *sampler); QPair getSelection(); + void adjustMinimaps(size_t selection_size, int grow_factor, size_t start_position = 0); signals: void selectionChanged(size_t start, size_t end); + public slots: + void selectRange(size_t start, size_t end); + private slots: void addMinimap(); void removeMinimap(); void changeMinimapMode(); void updateSelection(int minimap_index, size_t start, size_t end); void showSelectRangeDialog(); - void selectRange(); private: void initLayout(); VisualizationMinimap::MinimapColor getMinimapColor(); + bool size_control_; + util::ISampler *sampler_; QVector minimap_samplers_; QVector minimaps_; @@ -63,6 +68,7 @@ class MinimapPanel : public QWidget { VisualizationMinimap::MinimapMode mode_; + QHBoxLayout *button_layout_; QBoxLayout *layout_, *minimaps_layout_; QPushButton *add_minimap_button_, *remove_minimap_button_; QPushButton *change_mode_button_, *select_range_button_; diff --git a/src/ui/hexedit.cc b/src/ui/hexedit.cc index 45cb5940..b1ba89dd 100644 --- a/src/ui/hexedit.cc +++ b/src/ui/hexedit.cc @@ -73,6 +73,16 @@ void HexEdit::recalculateValues() { horizontalScrollBar()->setRange(0, lineWidth_ - viewport()->width()); startPosX_ = horizontalScrollBar()->value(); + + bool visible_region_start_changed = visible_region_start_ != startRow_ * bytesPerRow_; + bool visible_region_size_changed = visible_region_size_ != rowsOnScreen_ * bytesPerRow_; + + visible_region_start_ = startRow_ * bytesPerRow_; + visible_region_size_ = rowsOnScreen_ * bytesPerRow_; + + if (visible_region_start_changed || visible_region_size_changed) { + emit visibleRegionChanged(visible_region_start_, visible_region_size_); + } } void HexEdit::resizeEvent(QResizeEvent *event) { @@ -110,7 +120,9 @@ HexEdit::HexEdit(FileBlobModel *dataModel, QItemSelectionModel *selectionModel, current_area_(WindowArea::HEX), cursor_pos_in_byte_(0), cursor_visible_(false), - edit_engine_(bindata_width_) { + edit_engine_(bindata_width_), + visible_region_start_(0), + visible_region_size_(0) { setFont(util::settings::theme::font()); connect(dataModel_, &FileBlobModel::newBinData, @@ -1070,6 +1082,9 @@ void HexEdit::scrollToByte(qint64 bytePos, bool minimal_change) { if (isByteVisible(bytePos) && minimal_change) { return; } + if (bytePos >= dataBytesCount_) { + return; + } auto byte_row = bytePos / bytesPerRow_; auto current_top_row = verticalScrollBar()->value(); diff --git a/src/ui/hexeditwidget.cc b/src/ui/hexeditwidget.cc index d2eed973..eab121fb 100644 --- a/src/ui/hexeditwidget.cc +++ b/src/ui/hexeditwidget.cc @@ -62,6 +62,10 @@ HexEditWidget::HexEditWidget(MainWindowWithDetachableDockWidgets *main_window, connect(hex_edit_, &HexEdit::selectionChanged, this, &HexEditWidget::selectionChanged); + connect(hex_edit_, &HexEdit::visibleRegionChanged, [this] (qint64 start_addr, qint64 region_size) { + emit updateMinimap(start_addr, region_size); + }); + search_dialog_ = new SearchDialog(hex_edit_, this); createActions(); @@ -176,16 +180,16 @@ void HexEditWidget::createActions() { connect(show_node_tree_act_, SIGNAL(toggled(bool)), this, SIGNAL(showNodeTree(bool))); -// Currently not implemented -// show_minimap_act_ = ShortcutsModel::ShortcutsModel::getShortcutsModel()->createQAction( -// util::settings::shortcuts::SHOW_MINIMAP, -// this, QIcon(":/images/show_minimap.png"), Qt::WidgetWithChildrenShortcut); -// show_minimap_act_->setToolTip(tr("Minimap")); -// show_minimap_act_->setEnabled(true); -// show_minimap_act_->setCheckable(true); -// show_minimap_act_->setChecked(false); -// connect(show_minimap_act_, SIGNAL(toggled(bool)), this, -// SIGNAL(showMinimap(bool))); + //Currently not implemented + show_minimap_act_ = ShortcutsModel::ShortcutsModel::getShortcutsModel()->createQAction( + util::settings::shortcuts::SHOW_MINIMAP, + this, QIcon(":/images/show_minimap.png"), Qt::WidgetWithChildrenShortcut); + show_minimap_act_->setToolTip(tr("Minimap")); + show_minimap_act_->setEnabled(true); + show_minimap_act_->setCheckable(true); + show_minimap_act_->setChecked(false); + connect(show_minimap_act_, SIGNAL(toggled(bool)), this, + SIGNAL(showMinimap(bool))); show_hex_edit_act_ = ShortcutsModel::getShortcutsModel()->createQAction( util::settings::shortcuts::OPEN_HEX, @@ -201,8 +205,8 @@ void HexEditWidget::createToolBars() { addAction(show_node_tree_act_); tools_tool_bar_->addAction(show_node_tree_act_); //Disabled until minimap does anything of value in hex-view - //addAction(show_minimap_act_); - //tools_tool_bar_->addAction(show_minimap_act_); + addAction(show_minimap_act_); + tools_tool_bar_->addAction(show_minimap_act_); auto parser_tool_button = new QToolButton(); parser_tool_button->setMenu(&parsers_menu_); @@ -372,5 +376,9 @@ void HexEditWidget::minimapVisibilityChanged(bool visibility) { show_minimap_act_->setChecked(visibility); } +void HexEditWidget::minimapSelectionChanged(size_t start, size_t end) { + hex_edit_->scrollToByte(start); +} + } // namespace ui } // namespace veles diff --git a/src/ui/nodewidget.cc b/src/ui/nodewidget.cc index 15650b91..8651af64 100644 --- a/src/ui/nodewidget.cc +++ b/src/ui/nodewidget.cc @@ -44,6 +44,8 @@ namespace veles { namespace ui { +const float k_minimap_selection_factor = 10; + /*****************************************************************************/ /* Public methods */ /*****************************************************************************/ @@ -54,7 +56,9 @@ NodeWidget::NodeWidget(MainWindowWithDetachableDockWidgets *main_window, : View("Hex editor", ":/images/show_hex_edit.png"), main_window_(main_window), minimap_(nullptr), minimap_dock_(nullptr), data_model_(data_model), - selection_model_(selection_model), sampler_(nullptr) { + selection_model_(selection_model), sampler_(nullptr), + update_minimap_start_(0), update_minimap_size_(0), + ignore_update_minimap_(false) { hex_edit_widget_ = new HexEditWidget( main_window, data_model, selection_model); addAction(hex_edit_widget_->uploadAction()); @@ -79,49 +83,80 @@ NodeWidget::NodeWidget(MainWindowWithDetachableDockWidgets *main_window, setDockNestingEnabled(true); addDockWidget(Qt::LeftDockWidgetArea, node_tree_dock_); -#if 0 // We do not use minimap for NodeWidget yet, - minimap_dock_ = new QDockWidget; - new DockWidgetVisibilityGuard(minimap_dock_); - minimap_dock_->setWindowTitle("Minimap"); - minimap_ = new visualization::MinimapPanel(this); - - if(data_model_->binData().size() > 0) { - loadBinDataToMinimap(); - } else { - sampler_data_ = QByteArray(""); - sampler_ = new util::UniformSampler(sampler_data_); - sampler_->setSampleSize(4096 * 1024); - minimap_->setSampler(sampler_); - } - - minimap_dock_->setWidget(minimap_); - minimap_dock_->setContextMenuPolicy(Qt::PreventContextMenu); - minimap_dock_->setAllowedAreas( - Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); - addDockWidget(Qt::LeftDockWidgetArea, minimap_dock_); - MainWindowWithDetachableDockWidgets::splitDockWidget2(this, node_tree_dock_, - minimap_dock_, Qt::Horizontal); -#endif - connect(hex_edit_widget_, &HexEditWidget::showNodeTree, node_tree_dock_, &QDockWidget::setVisible); connect(node_tree_dock_, &QDockWidget::visibilityChanged, hex_edit_widget_, &HexEditWidget::nodeTreeVisibilityChanged); -#if 0 // We do not use minimap for NodeWidget yet, - connect(hex_edit_widget_, &HexEditWidget::showMinimap, - minimap_dock_, &QDockWidget::setVisible); - connect(data_model_.data(), &FileBlobModel::newBinData, - this, &NodeWidget::loadBinDataToMinimap); - connect(minimap_dock_, &QDockWidget::visibilityChanged, - hex_edit_widget_, &HexEditWidget::minimapVisibilityChanged); -#endif + connect(hex_edit_widget_, &HexEditWidget::showMinimap, this, &NodeWidget::showMinimap); + connect(hex_edit_widget_, &HexEditWidget::updateMinimap, [this](qint64 start, qint64 size) { + if (!ignore_update_minimap_) { + update_minimap_start_ = start; + update_minimap_size_ = size; + update_minimap_timer_.start(400); + } + }); + + update_minimap_timer_.setSingleShot(true); + connect(&update_minimap_timer_, &QTimer::timeout, this, &NodeWidget::updateMinimap); } NodeWidget::~NodeWidget() { delete sampler_; } +void NodeWidget::showMinimap(bool show) { + if (minimap_dock_ == nullptr) { + if (!show) { + return; + } + minimap_dock_ = new QDockWidget; + new DockWidgetVisibilityGuard(minimap_dock_); + minimap_dock_->setWindowTitle("Minimap"); + minimap_ = new visualization::MinimapPanel(this, /*size_control=*/false); + + if(data_model_->binData().size() > 0) { + loadBinDataToMinimap(); + } else { + sampler_data_ = QByteArray(""); + sampler_ = new util::UniformSampler(sampler_data_); + sampler_->setSampleSize(4096 * 1024); + minimap_->setSampler(sampler_); + } + + minimap_dock_->setWidget(minimap_); + minimap_dock_->setContextMenuPolicy(Qt::PreventContextMenu); + minimap_dock_->setAllowedAreas( + Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + addDockWidget(Qt::LeftDockWidgetArea, minimap_dock_); + MainWindowWithDetachableDockWidgets::splitDockWidget2(this, node_tree_dock_, + minimap_dock_, Qt::Horizontal); + + connect(data_model_.data(), &FileBlobModel::newBinData, + this, &NodeWidget::loadBinDataToMinimap); + connect(minimap_dock_, &QDockWidget::visibilityChanged, + hex_edit_widget_, &HexEditWidget::minimapVisibilityChanged); + connect(minimap_, &visualization::MinimapPanel::selectionChanged, [this] (size_t start, size_t end) { + if (!ignore_update_minimap_) { + ignore_update_minimap_ = true; + hex_edit_widget_->minimapSelectionChanged(start, end); + ignore_update_minimap_ = false; + } + }); + } + minimap_dock_->setVisible(show); + +} + +void NodeWidget::updateMinimap() { + if (minimap_dock_ == nullptr || sampler_->empty()) { + return; + } + ignore_update_minimap_ = true; + minimap_->adjustMinimaps(update_minimap_size_, k_minimap_selection_factor, update_minimap_start_); + ignore_update_minimap_ = false; +} + void NodeWidget::loadBinDataToMinimap() { delete sampler_; @@ -130,6 +165,7 @@ void NodeWidget::loadBinDataToMinimap() { sampler_ = new util::UniformSampler(sampler_data_); sampler_->setSampleSize(4096 * 1024); minimap_->setSampler(sampler_); + updateMinimap(); } } // namespace ui diff --git a/src/visualization/minimap.cc b/src/visualization/minimap.cc index f8fbdbbd..143103b0 100644 --- a/src/visualization/minimap.cc +++ b/src/visualization/minimap.cc @@ -23,12 +23,12 @@ namespace veles { namespace visualization { -VisualizationMinimap::VisualizationMinimap(QWidget *parent) : +VisualizationMinimap::VisualizationMinimap(bool size_control, QWidget *parent) : QOpenGLWidget(parent), initialised_(false), gl_initialised_(false), sampler_(nullptr), rows_(0), cols_(0), selection_start_(0), selection_end_(0), top_line_pos_(1.0), bottom_line_pos_(-1.0), color_(k_default_color), mode_(k_default_mode), texture_(nullptr), - lines_texture_(nullptr) {} + lines_texture_(nullptr), size_control_(size_control) {} VisualizationMinimap::~VisualizationMinimap() { if (gl_initialised_) { @@ -48,6 +48,12 @@ void VisualizationMinimap::setSampler(util::ISampler *sampler) { refresh(); } +QPair VisualizationMinimap::getRange() { + if (empty()) return qMakePair(0, 0); + auto range = sampler_->getRange(); + return qMakePair(range.first, range.second); +} + QPair VisualizationMinimap::getSelectedRange() { if (empty()) return qMakePair(0, 0); size_t start = sampler_->getFileOffset(selection_start_); @@ -511,15 +517,15 @@ void VisualizationMinimap::mousePressEvent(QMouseEvent *event) { grab_bot = position >= blp_bottom && position <= blp_top, between = position < tlp_bottom && position > blp_top; - if (grab_top) { + if (grab_top && size_control_) { drag_state_ = DragState::TOP_LINE; return; } - if (grab_bot) { + if (grab_bot && size_control_) { drag_state_ = DragState::BOTTOM_LINE; return; } - if (between) { + if (between || (!size_control_ && (grab_top || grab_bot))) { drag_state_ = DragState::BOX; return; } @@ -565,6 +571,7 @@ void VisualizationMinimap::wheelEvent(QWheelEvent *event) { void VisualizationMinimap::updateLinePositions(bool keep_selection, bool keep_size) { assert(!empty()); + float row_size = 2.0 / texture_rows_; float minimum_distance = std::max(k_minimum_line_distance, row_size); diff --git a/src/visualization/minimap_panel.cc b/src/visualization/minimap_panel.cc index 8a96f791..6fca0397 100644 --- a/src/visualization/minimap_panel.cc +++ b/src/visualization/minimap_panel.cc @@ -14,6 +14,7 @@ * limitations under the License. * */ +#include #include #include @@ -23,7 +24,6 @@ #include "visualization/minimap_panel.h" - namespace veles { namespace visualization { @@ -31,16 +31,17 @@ const float k_minimum_auto_selection_size = 0.1f; typedef VisualizationMinimap::MinimapMode MinimapMode; -MinimapPanel::MinimapPanel(QWidget *parent) : - QWidget(parent), mode_(MinimapMode::VALUE), +MinimapPanel::MinimapPanel(QWidget *parent, bool size_control) : + QWidget(parent), size_control_(size_control), mode_(MinimapMode::VALUE), select_range_dialog_(new SelectRangeDialog(this)) { - minimaps_.push_back(new VisualizationMinimap(this)); + minimaps_.push_back(new VisualizationMinimap(size_control_, this)); connect(minimaps_[0], &VisualizationMinimap::selectionChanged, std::bind(&MinimapPanel::updateSelection, this, 0, std::placeholders::_1, std::placeholders::_2)); - connect(select_range_dialog_, &SelectRangeDialog::accepted, - this, &MinimapPanel::selectRange); + connect(select_range_dialog_, &SelectRangeDialog::accepted, [this] () { + selectRange(select_range_dialog_->getStartAddress(), select_range_dialog_->getEndAddress()); + }); initLayout(); } @@ -82,32 +83,40 @@ void MinimapPanel::initLayout() { } layout_->addLayout(minimaps_layout_); - select_range_button_ = new QPushButton("select range", this); + select_range_button_ = new QPushButton("select range"); connect(select_range_button_, SIGNAL(released()), this, SLOT(showSelectRangeDialog())); - layout_->addWidget(select_range_button_); - auto button_layout = new QHBoxLayout(); + if (size_control_) { + layout_->addWidget(select_range_button_); + } + + button_layout_ = new QHBoxLayout(); remove_minimap_button_ = new QPushButton(); remove_minimap_button_->setIcon(QIcon(":/images/minus.png")); remove_minimap_button_->setEnabled(false); connect(remove_minimap_button_, SIGNAL(released()), this, SLOT(removeMinimap())); - button_layout->addWidget(remove_minimap_button_, 0); - - change_mode_button_ = new QPushButton("mode", this); + if (size_control_) { + button_layout_->addWidget(remove_minimap_button_, 0); + } + change_mode_button_ = new QPushButton("mode"); connect(change_mode_button_, SIGNAL(released()), this, SLOT(changeMinimapMode())); - button_layout->addWidget(change_mode_button_); + button_layout_->addWidget(change_mode_button_); add_minimap_button_ = new QPushButton(); add_minimap_button_->setIcon(QIcon(":/images/plus.png")); connect(add_minimap_button_, SIGNAL(released()), this, SLOT(addMinimap())); - button_layout->addWidget(add_minimap_button_, 0); - button_layout->setSpacing(0); - button_layout->setContentsMargins(0, 0, 0, 0); + if (size_control_) { + button_layout_->addWidget(add_minimap_button_, 0); + } + button_layout_->setSpacing(0); + button_layout_->setContentsMargins(0, 0, 0, 0); + + layout_->addLayout(button_layout_); + - layout_->addLayout(button_layout); layout_->setSpacing(0); layout_->setContentsMargins(0, 0, 0, 0); setLayout(layout_); @@ -129,7 +138,7 @@ VisualizationMinimap::MinimapColor MinimapPanel::getMinimapColor() { /*****************************************************************************/ void MinimapPanel::addMinimap() { - auto new_minimap = new VisualizationMinimap(this); + auto new_minimap = new VisualizationMinimap(size_control_, this); auto new_sampler = minimap_samplers_.back()->clone(); auto range = minimaps_.back()->getSelectedRange(); new_sampler->setRange(range.first, range.second); @@ -199,9 +208,7 @@ void MinimapPanel::showSelectRangeDialog() { select_range_dialog_->show(); } -void MinimapPanel::selectRange() { - size_t start = select_range_dialog_->getStartAddress(); - size_t end = select_range_dialog_->getEndAddress(); +void MinimapPanel::selectRange(size_t start, size_t end) { size_t center = start + ((end - start) / 2); size_t size = end - start; size_t curr_start = 0; @@ -247,5 +254,56 @@ void MinimapPanel::selectRange() { } } +void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t start_position) { + size_t full_size = sampler_->getFileOffset(sampler_->getSampleSize()); + QVector minimap_sizes; + QVector minimap_selection_sizes; + QVector minimap_start_position; + QVector minimap_selection_offset; + + do { + selection_size = std::min(full_size, selection_size); + minimap_selection_sizes.append(selection_size); + size_t minimap_size = std::min(static_cast(selection_size * grow_factor), full_size); + minimap_sizes.append(minimap_size); + + size_t offset = start_position % minimap_size; + + // jump to begin if selection overflows bar + if (offset + selection_size > minimap_size && (offset + selection_size < full_size)) { + offset = 0; + } + + // fit end of bar to end of data + if (start_position - offset + minimap_size > full_size) { + offset += ((start_position - offset + minimap_size) - full_size); + } + + size_t minimap_start = start_position - offset; + minimap_start_position.append(minimap_start); + + minimap_selection_offset.append(minimap_start + offset); + + start_position = minimap_start; + selection_size = minimap_size; + + } while (selection_size < full_size); + + int index = 0; + while(index < minimap_sizes.size()) { + if (index >= minimaps_.size()) { + addMinimap(); + } + + int reversed_index = minimap_sizes.size() - index - 1; + minimaps_[index]->setRange(minimap_start_position[reversed_index], minimap_start_position[reversed_index] + minimap_sizes[reversed_index]); + minimaps_[index]->setSelectedRange(minimap_selection_offset[reversed_index], minimap_selection_offset[reversed_index] + minimap_selection_sizes[reversed_index]); + ++index; + } + while (minimaps_.size() > index + 1) { + removeMinimap(); + } +} + } // namespace visualization } // namespace veles From 1de081be7f6faa8652def1293c18450d9ab6a4d3 Mon Sep 17 00:00:00 2001 From: Adam Iwaniuk Date: Wed, 5 Jul 2017 11:40:49 +0200 Subject: [PATCH 2/8] crash fix --- src/visualization/minimap_panel.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/visualization/minimap_panel.cc b/src/visualization/minimap_panel.cc index 6fca0397..46c654fe 100644 --- a/src/visualization/minimap_panel.cc +++ b/src/visualization/minimap_panel.cc @@ -270,11 +270,11 @@ void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t size_t offset = start_position % minimap_size; // jump to begin if selection overflows bar - if (offset + selection_size > minimap_size && (offset + selection_size < full_size)) { + if (offset + selection_size > minimap_size && (start_position + selection_size < full_size)) { offset = 0; } - // fit end of bar to end of data + // fit bar start position at end of data if (start_position - offset + minimap_size > full_size) { offset += ((start_position - offset + minimap_size) - full_size); } @@ -282,6 +282,11 @@ void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t size_t minimap_start = start_position - offset; minimap_start_position.append(minimap_start); + // at the end of data make sure that selection don't overflow bar + if (offset + selection_size > minimap_size) { + offset = minimap_size - selection_size; + } + minimap_selection_offset.append(minimap_start + offset); start_position = minimap_start; From 13a0c28136160d1127153158fd9b0d287f2949a9 Mon Sep 17 00:00:00 2001 From: Adam Iwaniuk Date: Wed, 5 Jul 2017 12:27:08 +0200 Subject: [PATCH 3/8] review fixes --- include/ui/nodewidget.h | 1 + include/visualization/minimap_panel.h | 2 +- src/ui/hexeditwidget.cc | 4 ++-- src/ui/nodewidget.cc | 4 ++-- src/visualization/minimap.cc | 4 ++-- src/visualization/minimap_panel.cc | 18 ++++++++++++------ 6 files changed, 20 insertions(+), 13 deletions(-) diff --git a/include/ui/nodewidget.h b/include/ui/nodewidget.h index 53792876..d5d5506f 100644 --- a/include/ui/nodewidget.h +++ b/include/ui/nodewidget.h @@ -71,6 +71,7 @@ class NodeWidget : public View { util::UniformSampler* sampler_; QByteArray sampler_data_; + // don't change minimap too often when scrolling by "normal" hex edit scroll bar QTimer update_minimap_timer_; qint64 update_minimap_start_; qint64 update_minimap_size_; diff --git a/include/visualization/minimap_panel.h b/include/visualization/minimap_panel.h index f9eb2dd4..8799aa41 100644 --- a/include/visualization/minimap_panel.h +++ b/include/visualization/minimap_panel.h @@ -33,7 +33,7 @@ class MinimapPanel : public QWidget { Q_OBJECT public: - explicit MinimapPanel(QWidget *parent = 0, bool size_control = true); + explicit MinimapPanel(bool size_control = true, QWidget *parent = 0); ~MinimapPanel(); void setSampler(util::ISampler *sampler); diff --git a/src/ui/hexeditwidget.cc b/src/ui/hexeditwidget.cc index eab121fb..7da1ea2d 100644 --- a/src/ui/hexeditwidget.cc +++ b/src/ui/hexeditwidget.cc @@ -62,7 +62,7 @@ HexEditWidget::HexEditWidget(MainWindowWithDetachableDockWidgets *main_window, connect(hex_edit_, &HexEdit::selectionChanged, this, &HexEditWidget::selectionChanged); - connect(hex_edit_, &HexEdit::visibleRegionChanged, [this] (qint64 start_addr, qint64 region_size) { + connect(hex_edit_, &HexEdit::visibleRegionChanged, [this](qint64 start_addr, qint64 region_size) { emit updateMinimap(start_addr, region_size); }); @@ -180,7 +180,7 @@ void HexEditWidget::createActions() { connect(show_node_tree_act_, SIGNAL(toggled(bool)), this, SIGNAL(showNodeTree(bool))); - //Currently not implemented + // Currently not implemented show_minimap_act_ = ShortcutsModel::ShortcutsModel::getShortcutsModel()->createQAction( util::settings::shortcuts::SHOW_MINIMAP, this, QIcon(":/images/show_minimap.png"), Qt::WidgetWithChildrenShortcut); diff --git a/src/ui/nodewidget.cc b/src/ui/nodewidget.cc index 8651af64..91511bda 100644 --- a/src/ui/nodewidget.cc +++ b/src/ui/nodewidget.cc @@ -115,7 +115,7 @@ void NodeWidget::showMinimap(bool show) { minimap_dock_->setWindowTitle("Minimap"); minimap_ = new visualization::MinimapPanel(this, /*size_control=*/false); - if(data_model_->binData().size() > 0) { + if (data_model_->binData().size() > 0) { loadBinDataToMinimap(); } else { sampler_data_ = QByteArray(""); @@ -136,7 +136,7 @@ void NodeWidget::showMinimap(bool show) { this, &NodeWidget::loadBinDataToMinimap); connect(minimap_dock_, &QDockWidget::visibilityChanged, hex_edit_widget_, &HexEditWidget::minimapVisibilityChanged); - connect(minimap_, &visualization::MinimapPanel::selectionChanged, [this] (size_t start, size_t end) { + connect(minimap_, &visualization::MinimapPanel::selectionChanged, [this](size_t start, size_t end) { if (!ignore_update_minimap_) { ignore_update_minimap_ = true; hex_edit_widget_->minimapSelectionChanged(start, end); diff --git a/src/visualization/minimap.cc b/src/visualization/minimap.cc index 143103b0..0a0976e3 100644 --- a/src/visualization/minimap.cc +++ b/src/visualization/minimap.cc @@ -49,7 +49,7 @@ void VisualizationMinimap::setSampler(util::ISampler *sampler) { } QPair VisualizationMinimap::getRange() { - if (empty()) return qMakePair(0, 0); + if (empty()) return {0, 0}; auto range = sampler_->getRange(); return qMakePair(range.first, range.second); } @@ -58,7 +58,7 @@ QPair VisualizationMinimap::getSelectedRange() { if (empty()) return qMakePair(0, 0); size_t start = sampler_->getFileOffset(selection_start_); size_t end = sampler_->getFileOffset(selection_end_); - return qMakePair(start, end); + return {start, end}; } void VisualizationMinimap::setSelectedRange(size_t start_address, size_t end_address) { diff --git a/src/visualization/minimap_panel.cc b/src/visualization/minimap_panel.cc index 46c654fe..02442bb7 100644 --- a/src/visualization/minimap_panel.cc +++ b/src/visualization/minimap_panel.cc @@ -31,7 +31,7 @@ const float k_minimum_auto_selection_size = 0.1f; typedef VisualizationMinimap::MinimapMode MinimapMode; -MinimapPanel::MinimapPanel(QWidget *parent, bool size_control) : +MinimapPanel::MinimapPanel(bool size_control, QWidget *parent) : QWidget(parent), size_control_(size_control), mode_(MinimapMode::VALUE), select_range_dialog_(new SelectRangeDialog(this)) { minimaps_.push_back(new VisualizationMinimap(size_control_, this)); @@ -39,7 +39,7 @@ MinimapPanel::MinimapPanel(QWidget *parent, bool size_control) : std::bind(&MinimapPanel::updateSelection, this, 0, std::placeholders::_1, std::placeholders::_2)); - connect(select_range_dialog_, &SelectRangeDialog::accepted, [this] () { + connect(select_range_dialog_, &SelectRangeDialog::accepted, [this]() { selectRange(select_range_dialog_->getStartAddress(), select_range_dialog_->getEndAddress()); }); initLayout(); @@ -256,11 +256,17 @@ void MinimapPanel::selectRange(size_t start, size_t end) { void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t start_position) { size_t full_size = sampler_->getFileOffset(sampler_->getSampleSize()); + + if (full_size == 0) { + return; + } + QVector minimap_sizes; QVector minimap_selection_sizes; QVector minimap_start_position; QVector minimap_selection_offset; + // calculate number of minimaps and all parameters do { selection_size = std::min(full_size, selection_size); minimap_selection_sizes.append(selection_size); @@ -269,12 +275,12 @@ void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t size_t offset = start_position % minimap_size; - // jump to begin if selection overflows bar + // Jump to beginning if selection overflows bar. if (offset + selection_size > minimap_size && (start_position + selection_size < full_size)) { offset = 0; } - // fit bar start position at end of data + // Fit bar start position at end of data. if (start_position - offset + minimap_size > full_size) { offset += ((start_position - offset + minimap_size) - full_size); } @@ -282,7 +288,7 @@ void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t size_t minimap_start = start_position - offset; minimap_start_position.append(minimap_start); - // at the end of data make sure that selection don't overflow bar + // At the end of data make sure that selection don't overflow bar. if (offset + selection_size > minimap_size) { offset = minimap_size - selection_size; } @@ -292,7 +298,7 @@ void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t start_position = minimap_start; selection_size = minimap_size; - } while (selection_size < full_size); + } while(selection_size < full_size); int index = 0; while(index < minimap_sizes.size()) { From c79808d769948423b96a6916e9ffef286f8ac40e Mon Sep 17 00:00:00 2001 From: Adam Iwaniuk Date: Wed, 5 Jul 2017 12:28:01 +0200 Subject: [PATCH 4/8] review fixes2 --- src/visualization/minimap_panel.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/visualization/minimap_panel.cc b/src/visualization/minimap_panel.cc index 02442bb7..4fb68263 100644 --- a/src/visualization/minimap_panel.cc +++ b/src/visualization/minimap_panel.cc @@ -298,10 +298,10 @@ void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t start_position = minimap_start; selection_size = minimap_size; - } while(selection_size < full_size); + } while (selection_size < full_size); int index = 0; - while(index < minimap_sizes.size()) { + while (index < minimap_sizes.size()) { if (index >= minimaps_.size()) { addMinimap(); } From 75512b57a02a284cd3c70e7bcd6778d8b5990d6e Mon Sep 17 00:00:00 2001 From: Adam Iwaniuk Date: Wed, 5 Jul 2017 12:30:51 +0200 Subject: [PATCH 5/8] review fixes3 --- src/ui/hexeditwidget.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/hexeditwidget.cc b/src/ui/hexeditwidget.cc index 7da1ea2d..78d77b77 100644 --- a/src/ui/hexeditwidget.cc +++ b/src/ui/hexeditwidget.cc @@ -182,8 +182,8 @@ void HexEditWidget::createActions() { // Currently not implemented show_minimap_act_ = ShortcutsModel::ShortcutsModel::getShortcutsModel()->createQAction( - util::settings::shortcuts::SHOW_MINIMAP, - this, QIcon(":/images/show_minimap.png"), Qt::WidgetWithChildrenShortcut); + util::settings::shortcuts::SHOW_MINIMAP, + this, QIcon(":/images/show_minimap.png"), Qt::WidgetWithChildrenShortcut); show_minimap_act_->setToolTip(tr("Minimap")); show_minimap_act_->setEnabled(true); show_minimap_act_->setCheckable(true); From 2832b01b343aead25bcaf1f7a60e325b94c763c9 Mon Sep 17 00:00:00 2001 From: Adam Iwaniuk Date: Wed, 5 Jul 2017 12:35:45 +0200 Subject: [PATCH 6/8] review fixes4 --- src/visualization/minimap_panel.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/visualization/minimap_panel.cc b/src/visualization/minimap_panel.cc index 4fb68263..31ccee20 100644 --- a/src/visualization/minimap_panel.cc +++ b/src/visualization/minimap_panel.cc @@ -27,7 +27,7 @@ namespace veles { namespace visualization { -const float k_minimum_auto_selection_size = 0.1f; +const float K_MINIMUM_AUTO_SELECTION_SIZE = 0.1f; typedef VisualizationMinimap::MinimapMode MinimapMode; @@ -220,7 +220,7 @@ void MinimapPanel::selectRange(size_t start, size_t end) { addMinimap(); } size_t curr_size = std::max(size, - static_cast(std::ceil(k_minimum_auto_selection_size * + static_cast(std::ceil(K_MINIMUM_AUTO_SELECTION_SIZE * (curr_end - curr_start)))); if (size == curr_size) { minimaps_[index]->setSelectedRange(start, end); @@ -298,10 +298,10 @@ void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t start_position = minimap_start; selection_size = minimap_size; - } while (selection_size < full_size); + } while(selection_size < full_size); int index = 0; - while (index < minimap_sizes.size()) { + while(index < minimap_sizes.size()) { if (index >= minimaps_.size()) { addMinimap(); } From 551453c12e5fb686faab6a9dfecf93f9a020a9ab Mon Sep 17 00:00:00 2001 From: Adam Iwaniuk Date: Wed, 5 Jul 2017 12:38:37 +0200 Subject: [PATCH 7/8] review fixes5 --- src/visualization/minimap_panel.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/visualization/minimap_panel.cc b/src/visualization/minimap_panel.cc index 31ccee20..5e6eef62 100644 --- a/src/visualization/minimap_panel.cc +++ b/src/visualization/minimap_panel.cc @@ -266,7 +266,7 @@ void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t QVector minimap_start_position; QVector minimap_selection_offset; - // calculate number of minimaps and all parameters + // Calculate number of minimaps and all parameters. do { selection_size = std::min(full_size, selection_size); minimap_selection_sizes.append(selection_size); @@ -301,7 +301,7 @@ void MinimapPanel::adjustMinimaps(size_t selection_size, int grow_factor, size_t } while(selection_size < full_size); int index = 0; - while(index < minimap_sizes.size()) { + while (index < minimap_sizes.size()) { if (index >= minimaps_.size()) { addMinimap(); } From 890bc5e444fe0ec649bc7694af7b66349b303b6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?= Date: Wed, 5 Jul 2017 15:36:47 +0200 Subject: [PATCH 8/8] mwk fixes --- src/ui/nodewidget.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/nodewidget.cc b/src/ui/nodewidget.cc index 91511bda..60a6128c 100644 --- a/src/ui/nodewidget.cc +++ b/src/ui/nodewidget.cc @@ -113,7 +113,7 @@ void NodeWidget::showMinimap(bool show) { minimap_dock_ = new QDockWidget; new DockWidgetVisibilityGuard(minimap_dock_); minimap_dock_->setWindowTitle("Minimap"); - minimap_ = new visualization::MinimapPanel(this, /*size_control=*/false); + minimap_ = new visualization::MinimapPanel(/*size_control=*/false, this); if (data_model_->binData().size() > 0) { loadBinDataToMinimap();