Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Region highlight #25

Draft
wants to merge 16 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions ProvinceMapper/Source/Frames/Images/ImageCanvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,45 @@ void ImageCanvas::strafeProvince(const std::shared_ptr<Province>& province)
strafedPixels.emplace_back(pixel);
}

void ImageCanvas::highlightRegionByCommentRow(const int row)
{
if (!activeVersion)
{
return;
}
const auto& links = activeVersion->getLinks();
if (row >= static_cast<int>(links->size()))
{
return;
}
if (const auto& commentLink = links->at(row); commentLink->getComment())
{
auto rowUnderComment = row + 1;
while (static_cast<unsigned long>(rowUnderComment) < links->size() && !links->at(rowUnderComment)->getComment())
{
const auto& link = links->at(rowUnderComment);
// Highlight our provinces' pixels.
highlightProvinces(link);
++rowUnderComment;
}
}
}

void ImageCanvas::highlightProvinces(const std::shared_ptr<LinkMapping>& linkToHighlight)
{
for (const auto& province: getRelevantProvinces(linkToHighlight))
highlightProvince(province);
}

void ImageCanvas::highlightProvince(const std::shared_ptr<Province>& province)
{
for (const auto& pixel: province->innerPixels)
{
highlightedProvinces.emplace_back(province);
IhateTrains marked this conversation as resolved.
Show resolved Hide resolved
highlightedPixels.emplace_back(pixel);
}
}

void ImageCanvas::dismarkProvince(const std::shared_ptr<Province>& province) const
{
// This fires when provinces within link are deselected, we're restoring their original color.
Expand Down Expand Up @@ -153,6 +192,17 @@ void ImageCanvas::applyStrafedPixels()
}
}

void ImageCanvas::applyHighlightedPixels()
{
for (const auto& pixel: highlightedPixels)
{
const auto offset = coordsToOffset(pixel.x, pixel.y, width);
imageData[offset] = 150;
imageData[offset + 1] = 150;
imageData[offset + 2] = 150;
}
}

void ImageCanvas::deactivateLink()
{
activeLink.reset();
Expand All @@ -176,6 +226,21 @@ void ImageCanvas::deactivateLink()
strafedPixels.clear();
}

void ImageCanvas::dehighlightRegion()
{
for (const auto& province: highlightedProvinces)
{
for (const auto& pixel: province->innerPixels)
{
const auto offset = coordsToOffset(pixel.x, pixel.y, width);
imageData[offset] = province->r;
imageData[offset + 1] = province->g;
imageData[offset + 2] = province->b;
}
}
highlightedPixels.clear();
}
IhateTrains marked this conversation as resolved.
Show resolved Hide resolved

void ImageCanvas::onMouseOver(wxMouseEvent& event)
{
auto x = CalcUnscrolledPosition(event.GetPosition()).x;
Expand Down
12 changes: 12 additions & 0 deletions ProvinceMapper/Source/Frames/Images/ImageCanvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,15 @@ class ImageCanvas: public wxScrolledCanvas

void clearShadedPixels() { shadedPixels.clear(); }
void clearStrafedPixels() { strafedPixels.clear(); }
void clearHighlightedPixels()
{
highlightedPixels.clear();
highlightedProvinces.clear();
}
void generateShadedPixels();
void applyShadedPixels();
void applyStrafedPixels();
void applyHighlightedPixels();
void restoreImageData() const;
void setBlack() { black = true; }
void clearBlack() { black = false; }
Expand All @@ -60,6 +66,8 @@ class ImageCanvas: public wxScrolledCanvas
void activateLinkByIndex(int row);
void activateLinkByID(int ID);
void deactivateLink();
void highlightRegionByCommentRow(int row);
void dehighlightRegion();
void toggleProvinceByID(int ID);
void shadeProvinceByID(int ID);
void deleteActiveLink();
Expand All @@ -80,6 +88,8 @@ class ImageCanvas: public wxScrolledCanvas
void stageToggleProvinceByID(int provinceID) const;
void strafeProvinces();
void strafeProvince(const std::shared_ptr<Province>& province);
void highlightProvinces(const std::shared_ptr<LinkMapping>& linkToHighlight);
void highlightProvince(const std::shared_ptr<Province>& province);
void dismarkProvince(const std::shared_ptr<Province>& province) const;
void markProvince(const std::shared_ptr<Province>& province);
void selectLink(int linkID) const;
Expand Down Expand Up @@ -116,6 +126,8 @@ class ImageCanvas: public wxScrolledCanvas

std::vector<Pixel> shadedPixels;
std::vector<Pixel> strafedPixels;
std::vector<Pixel> highlightedPixels;
std::vector<std::shared_ptr<Province>> highlightedProvinces;

std::shared_ptr<LinkMappingVersion> activeVersion;
std::shared_ptr<Definitions> definitions;
Expand Down
30 changes: 27 additions & 3 deletions ProvinceMapper/Source/Frames/Images/ImageFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,8 @@ void ImageFrame::onToggleBlack(wxCommandEvent& event)
sourceCanvas->restoreImageData();
targetCanvas->clearShadedPixels();
targetCanvas->restoreImageData();
sourceCanvas->applyHighlightedPixels();
targetCanvas->applyHighlightedPixels();
sourceCanvas->applyStrafedPixels();
targetCanvas->applyStrafedPixels();
}
Expand All @@ -282,6 +284,8 @@ void ImageFrame::onToggleBlack(wxCommandEvent& event)
sourceCanvas->applyShadedPixels();
targetCanvas->generateShadedPixels();
targetCanvas->applyShadedPixels();
sourceCanvas->applyHighlightedPixels();
targetCanvas->applyHighlightedPixels();
sourceCanvas->applyStrafedPixels();
targetCanvas->applyStrafedPixels();
}
Expand Down Expand Up @@ -331,6 +335,24 @@ void ImageFrame::deleteActiveLink()
Refresh();
}

void ImageFrame::highlightRegionByCommentRow(const int commentRow)
{
sourceCanvas->highlightRegionByCommentRow(commentRow);
targetCanvas->highlightRegionByCommentRow(commentRow);
sourceCanvas->applyHighlightedPixels();
targetCanvas->applyHighlightedPixels();
render();
Refresh();
}

void ImageFrame::clearRegionHighlight()
{
sourceCanvas->dehighlightRegion();
targetCanvas->dehighlightRegion();
render();
Refresh();
}

void ImageFrame::toggleProvinceByID(const int ID, const bool sourceImage)
{
if (sourceImage)
Expand All @@ -346,7 +368,7 @@ void ImageFrame::toggleProvinceByID(const int ID, const bool sourceImage)
Refresh();
}

void ImageFrame::shadeProvinceByID(int ID, bool sourceImage)
void ImageFrame::shadeProvinceByID(const int ID, const bool sourceImage)
{
if (sourceImage)
{
Expand All @@ -361,7 +383,7 @@ void ImageFrame::shadeProvinceByID(int ID, bool sourceImage)
Refresh();
}

void ImageFrame::centerMap(int ID)
void ImageFrame::centerMap(const int ID)
{
const auto pt1 = sourceCanvas->locateLinkCoordinates(ID);
const auto pt2 = targetCanvas->locateLinkCoordinates(ID);
Expand All @@ -382,7 +404,7 @@ void ImageFrame::centerMap(int ID)
Refresh();
}

void ImageFrame::centerProvince(ImageTabSelector selector, int ID)
void ImageFrame::centerProvince(const ImageTabSelector selector, const int ID)
{
if (selector == ImageTabSelector::SOURCE)
{
Expand Down Expand Up @@ -413,6 +435,8 @@ void ImageFrame::setVersion(const std::shared_ptr<LinkMappingVersion>& version)
targetCanvas->setVersion(version);
sourceCanvas->clearStrafedPixels();
targetCanvas->clearStrafedPixels();
sourceCanvas->clearHighlightedPixels();
targetCanvas->clearHighlightedPixels();
sourceCanvas->restoreImageData();
targetCanvas->restoreImageData();

Expand Down
4 changes: 3 additions & 1 deletion ProvinceMapper/Source/Frames/Images/ImageFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,17 @@ class ImageFrame: public wxFrame
void activateLinkByIndex(int row);
void activateLinkByID(int ID);
void deactivateLink();
void highlightRegionByCommentRow(int commentRow);
void toggleProvinceByID(int ID, bool sourceImage);
void shadeProvinceByID(int ID, bool sourceImage);
void centerMap(int ID);
void centerProvince(ImageTabSelector selector, int ID);
void deleteActiveLink();
void setVersion(const std::shared_ptr<LinkMappingVersion>& version);
void showToolbar() const;
void clearRegionHighlight();

private:
private:
void onScrollPaint(wxPaintEvent& event);
void onToggleOrientation(wxCommandEvent& event);
void onToggleBlack(wxCommandEvent& event);
Expand Down
20 changes: 18 additions & 2 deletions ProvinceMapper/Source/Frames/Links/LinksTab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
wxDEFINE_EVENT(wxEVT_DELETE_ACTIVE_LINK, wxCommandEvent);
wxDEFINE_EVENT(wxEVT_DEACTIVATE_LINK, wxCommandEvent);
wxDEFINE_EVENT(wxEVT_SELECT_LINK_BY_INDEX, wxCommandEvent);
wxDEFINE_EVENT(wxEVT_HIGHLIGHT_REGION, wxCommandEvent);
wxDEFINE_EVENT(wxEVT_DISABLE_REGION_HIGHLIGHT, wxCommandEvent);
wxDEFINE_EVENT(wxEVT_CENTER_MAP, wxCommandEvent);
wxDEFINE_EVENT(wxEVT_MOVE_ACTIVE_LINK_UP, wxCommandEvent);
wxDEFINE_EVENT(wxEVT_MOVE_ACTIVE_LINK_DOWN, wxCommandEvent);
Expand Down Expand Up @@ -158,10 +160,19 @@ void LinksTab::leftUp(const wxGridEvent& event)
eventListener->QueueEvent(evt->Clone());

lastClickedRow = row;

// if the selected row's link is a comment
// highlight provinces from all links between the selected comment and the first comment below it
if (const auto& links = version->getLinks(); links->at(row)->getComment())
{
auto* evt = new wxCommandEvent(wxEVT_HIGHLIGHT_REGION);
evt->SetInt(row);
eventListener->QueueEvent(evt->Clone());
}
IhateTrains marked this conversation as resolved.
Show resolved Hide resolved
}
}

void LinksTab::restoreRowColor(int row) const
void LinksTab::restoreRowColor(const int row) const
{
const auto& link = version->getLinks()->at(row);
if (link->getComment())
Expand All @@ -170,7 +181,7 @@ void LinksTab::restoreRowColor(int row) const
theGrid->SetCellBackgroundColour(row, 0, wxColour(240, 240, 240)); // link regular
}

void LinksTab::activateRowColor(int row) const
void LinksTab::activateRowColor(const int row) const
{
const auto& link = version->getLinks()->at(row);
if (link->getComment())
Expand Down Expand Up @@ -274,6 +285,11 @@ void LinksTab::rightUp(wxGridEvent& event)
// If our active link is dry, we're not deselecting it, we're deleting it.
const auto* evt = new wxCommandEvent(wxEVT_DEACTIVATE_LINK);
eventListener->QueueEvent(evt->Clone());

// If the link is a comment, disable the region highlight
evt = new wxCommandEvent(wxEVT_DISABLE_REGION_HIGHLIGHT);
eventListener->QueueEvent(evt->Clone());

event.Skip();
}

Expand Down
2 changes: 2 additions & 0 deletions ProvinceMapper/Source/Frames/Links/LinksTab.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
wxDECLARE_EVENT(wxEVT_DELETE_ACTIVE_LINK, wxCommandEvent);
wxDECLARE_EVENT(wxEVT_DEACTIVATE_LINK, wxCommandEvent);
wxDECLARE_EVENT(wxEVT_SELECT_LINK_BY_INDEX, wxCommandEvent);
wxDECLARE_EVENT(wxEVT_HIGHLIGHT_REGION, wxCommandEvent);
wxDECLARE_EVENT(wxEVT_DISABLE_REGION_HIGHLIGHT, wxCommandEvent);
wxDECLARE_EVENT(wxEVT_CENTER_MAP, wxCommandEvent);
wxDECLARE_EVENT(wxEVT_MOVE_ACTIVE_LINK_UP, wxCommandEvent);
wxDECLARE_EVENT(wxEVT_MOVE_ACTIVE_LINK_DOWN, wxCommandEvent);
Expand Down
16 changes: 14 additions & 2 deletions ProvinceMapper/Source/Frames/MainFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& si
Bind(wxEVT_DEACTIVATE_LINK, &MainFrame::onDeactivateLink, this);
Bind(wxEVT_DELETE_ACTIVE_LINK, &MainFrame::onDeleteActiveLink, this);
Bind(wxEVT_SELECT_LINK_BY_INDEX, &MainFrame::onActivateLinkByIndex, this);
Bind(wxEVT_HIGHLIGHT_REGION, &MainFrame::onHighlightRegion, this);
Bind(wxEVT_DISABLE_REGION_HIGHLIGHT, &MainFrame::clearRegionHighlight, this);
Bind(wxEVT_SELECT_LINK_BY_ID, &MainFrame::onActivateLinkByID, this);
Bind(wxEVT_TOGGLE_PROVINCE, &MainFrame::onToggleProvince, this);
Bind(wxEVT_CENTER_MAP, &MainFrame::onCenterMap, this);
Expand Down Expand Up @@ -565,6 +567,16 @@ void MainFrame::onActivateLinkByID(const wxCommandEvent& evt)
linksFrame->activateLinkByID(evt.GetInt());
}

void MainFrame::onHighlightRegion(const wxCommandEvent& evt)
{
imageFrame->highlightRegionByCommentRow(evt.GetInt());
}

void MainFrame::clearRegionHighlight(wxCommandEvent& evt)
{
imageFrame->clearRegionHighlight();
}

void MainFrame::onToggleProvince(const wxCommandEvent& evt)
{
// Two things can happen. We're either:
Expand Down Expand Up @@ -663,7 +675,7 @@ void MainFrame::mergeRivers() const
Log(LogLevel::Info) << "Merging source rivers";
auto* imageData = sourceImg->GetData();
const auto imageDataSize = sourceImg->GetSize().x * sourceImg->GetSize().y * 3;
auto* riverData = sourceRiversImg->GetData();
const auto* riverData = sourceRiversImg->GetData();
const auto riverDataSize = sourceRiversImg->GetSize().x * sourceRiversImg->GetSize().y * 3;
if (riverDataSize == imageDataSize)
mergeRiverData(imageData, riverData, imageDataSize);
Expand All @@ -673,7 +685,7 @@ void MainFrame::mergeRivers() const
Log(LogLevel::Info) << "Merging target rivers";
auto* imageData = targetImg->GetData();
const auto imageDataSize = targetImg->GetSize().x * targetImg->GetSize().y * 3;
auto* riverData = targetRiversImg->GetData();
const auto* riverData = targetRiversImg->GetData();
const auto riverDataSize = targetRiversImg->GetSize().x * targetRiversImg->GetSize().y * 3;
if (riverDataSize == imageDataSize)
mergeRiverData(imageData, riverData, imageDataSize);
Expand Down
5 changes: 5 additions & 0 deletions ProvinceMapper/Source/Frames/MainFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ class MainFrame final : public wxFrame
void onDeactivateLink(wxCommandEvent& evt);
void onActivateLinkByIndex(const wxCommandEvent& evt);
void onActivateLinkByID(const wxCommandEvent& evt);
void onHighlightRegion(const wxCommandEvent& evt);
void clearRegionHighlight(wxCommandEvent& evt);
void onToggleProvince(const wxCommandEvent& evt);
void onCenterMap(const wxCommandEvent& evt);
void onCenterProvince(const wxCommandEvent& evt);
Expand Down Expand Up @@ -109,4 +111,7 @@ class MainFrame final : public wxFrame

// source/target pickers, links, source/target tokens
std::array<bool, 5> sanity = {false, false, false, false, false};

// for region highlight
wxArrayInt linksToHighlight;
};