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 all 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
2 changes: 2 additions & 0 deletions ProvinceMapper.sln.DotSettings
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=movee/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
146 changes: 134 additions & 12 deletions ProvinceMapper/Source/Frames/Images/ImageCanvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,15 @@ void ImageCanvas::activateLinkByID(const int ID)
}
}

void ImageCanvas::activateFirstRegionLink(const int commentRow)
{
const auto firstRegionRow = commentRow + 1;
if (activeVersion && firstRegionRow < static_cast<int>(activeVersion->getLinks()->size()))
{
activeLink = activeVersion->getLinks()->at(firstRegionRow);
}
}

void ImageCanvas::strafeProvinces()
{
for (const auto& province: getRelevantProvinces(activeLink))
Expand All @@ -108,6 +117,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)
{
highlightedLinks.emplace_back(linkToHighlight);
for (const auto& province: getRelevantProvinces(linkToHighlight))
highlightProvince(province);
}

void ImageCanvas::highlightProvince(const std::shared_ptr<Province>& province)
{
for (const auto& pixel: province->innerPixels)
{
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 @@ -152,6 +200,27 @@ 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::applyProvinceHighlight(const std::shared_ptr<Province>& province)
{
for (const auto& pixel: province->innerPixels)
{
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 @@ -175,6 +244,25 @@ void ImageCanvas::deactivateLink()
strafedPixels.clear();
}

void ImageCanvas::clearRegionHighlight()
{
for (const auto& link: highlightedLinks)
{
const std::vector<std::shared_ptr<Province>>& provinces = selector == ImageTabSelector::SOURCE ? link->getSources() : link->getTargets();
for (const auto& province: provinces)
{
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;
}
}
}
clearHighlightedLinks();
}
IhateTrains marked this conversation as resolved.
Show resolved Hide resolved

void ImageCanvas::onMouseOver(wxMouseEvent& event)
{
auto x = CalcUnscrolledPosition(event.GetPosition()).x;
Expand Down Expand Up @@ -331,6 +419,8 @@ void ImageCanvas::toggleProvinceByID(const std::string& ID)
{
// mark the province as black if needed.
markProvince(province);
// highlight province if it's being added to currently highlighted region
HighlightProvinceIfInHighlightedRegion(province);
// We need to add this province to strafe.
strafeProvince(province);
applyStrafedPixels();
Expand All @@ -349,6 +439,22 @@ void ImageCanvas::toggleProvinceByID(const std::string& ID)
applyStrafedPixels();
}

void ImageCanvas::HighlightProvinceIfInHighlightedRegion(const std::shared_ptr<Province>& province)
{
for (const auto& link: highlightedLinks)
{
for (const auto& linkProvince: getRelevantProvinces(link))
{
if (linkProvince->ID == province->ID)
{
highlightProvince(province);
applyProvinceHighlight(province);
return;
}
}
}
}

void ImageCanvas::shadeProvinceByID(const std::string& ID)
{
// this is called when we're marking a province outside of a working link. Often a preface to a new link being initialized.
Expand All @@ -361,7 +467,16 @@ void ImageCanvas::shadeProvinceByID(const std::string& ID)
markProvince(province);
}

wxPoint ImageCanvas::locateLinkCoordinates(int ID) const
wxPoint ImageCanvas::locateActiveLinkCoordinates() const
{
if (activeLink)
{
return GetCoordinatesForLink(activeLink);
}
return wxPoint(0, 0);
}

wxPoint ImageCanvas::locateLinkCoordinates(const int ID) const
{
auto toReturn = wxPoint(0, 0);
std::shared_ptr<LinkMapping> link = nullptr;
Expand All @@ -382,18 +497,25 @@ wxPoint ImageCanvas::locateLinkCoordinates(int ID) const
// find out first province's pixels.
if (link)
{
const auto& relevantProvinces = getRelevantProvinces(link);
if (!relevantProvinces.empty()) // not all links have provinces in them.
toReturn = GetCoordinatesForLink(link);
}
return toReturn;
}

wxPoint ImageCanvas::GetCoordinatesForLink(const std::shared_ptr<LinkMapping>& link) const
{
auto toReturn = wxPoint(0, 0);
const auto& relevantProvinces = getRelevantProvinces(link);
if (!relevantProvinces.empty()) // not all links have provinces in them.
{
const auto& province = relevantProvinces.front();
// provinces usually have pixels.
if (!province->innerPixels.empty())
{
const auto& province = relevantProvinces.front();
// provinces usually have pixels.
if (!province->innerPixels.empty())
{
const auto& pixel = province->innerPixels.front();
// And there we have it.
toReturn.x = pixel.x;
toReturn.y = pixel.y;
}
const auto& pixel = province->innerPixels.front();
// And there we have it.
toReturn.x = pixel.x;
toReturn.y = pixel.y;
}
}
return toReturn;
Expand Down
17 changes: 17 additions & 0 deletions ProvinceMapper/Source/Frames/Images/ImageCanvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class ImageCanvas: public wxScrolledCanvas
[[nodiscard]] auto getOldScale() const { return oldScaleFactor; }
[[nodiscard]] const auto& getImageData() const { return imageData; }
[[nodiscard]] wxPoint locateLinkCoordinates(int ID) const;
[[nodiscard]] wxPoint GetCoordinatesForLink(const std::shared_ptr<LinkMapping>& link) const;
[[nodiscard]] wxPoint locateProvinceCoordinates(const std::string& ID) const;
[[nodiscard]] const auto& getPoints() const { return points; }
[[nodiscard]] std::string nameAtCoords(const wxPoint& point);
Expand All @@ -48,9 +49,16 @@ class ImageCanvas: public wxScrolledCanvas

void clearShadedPixels() { shadedPixels.clear(); }
void clearStrafedPixels() { strafedPixels.clear(); }
void clearHighlightedLinks()
{
highlightedPixels.clear();
highlightedLinks.clear();
}
void generateShadedPixels();
void applyShadedPixels();
void applyStrafedPixels();
void applyHighlightedPixels();
void applyProvinceHighlight(const std::shared_ptr<Province>& province);
void restoreImageData() const;
void setBlack() { black = true; }
void clearBlack() { black = false; }
Expand All @@ -60,9 +68,14 @@ class ImageCanvas: public wxScrolledCanvas

void activateLinkByIndex(int row);
void activateLinkByID(int ID);
void activateFirstRegionLink(int commentRow);
void deactivateLink();
void highlightRegionByCommentRow(int row);
void clearRegionHighlight();
void toggleProvinceByID(const std::string& ID);
void HighlightProvinceIfInHighlightedRegion(const std::shared_ptr<Province>& province);
void shadeProvinceByID(const std::string& ID);
[[nodiscard]] wxPoint locateActiveLinkCoordinates() const;
void deleteActiveLink();
void setVersion(const std::shared_ptr<LinkMappingVersion>& version) { activeVersion = version; }
void pushZoomLevel(int zoomLevel);
Expand All @@ -81,6 +94,8 @@ class ImageCanvas: public wxScrolledCanvas
void stageToggleProvinceByID(const std::string& 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 @@ -117,6 +132,8 @@ class ImageCanvas: public wxScrolledCanvas

std::vector<Pixel> shadedPixels;
std::vector<Pixel> strafedPixels;
std::vector<Pixel> highlightedPixels;
std::vector<std::shared_ptr<LinkMapping>> highlightedLinks;

std::shared_ptr<LinkMappingVersion> activeVersion;
std::shared_ptr<DefinitionsInterface> definitions;
Expand Down
46 changes: 43 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,30 @@ void ImageFrame::deleteActiveLink()
Refresh();
}

void ImageFrame::highlightRegionByCommentRow(const int commentRow)
{
sourceCanvas->clearRegionHighlight();
targetCanvas->clearRegionHighlight();

sourceCanvas->activateFirstRegionLink(commentRow);
targetCanvas->activateFirstRegionLink(commentRow);
sourceCanvas->highlightRegionByCommentRow(commentRow);
targetCanvas->highlightRegionByCommentRow(commentRow);
sourceCanvas->applyHighlightedPixels();
targetCanvas->applyHighlightedPixels();

render();
Refresh();
}

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

void ImageFrame::toggleProvinceByID(const std::string& ID, const bool sourceImage)
{
if (sourceImage)
Expand Down Expand Up @@ -361,20 +389,30 @@ void ImageFrame::shadeProvinceByID(const std::string& ID, bool sourceImage)
Refresh();
}

void ImageFrame::centerMap(int ID)
void ImageFrame::centerMapToActiveLink()
{
const auto pt1 = sourceCanvas->locateActiveLinkCoordinates();
const auto pt2 = targetCanvas->locateActiveLinkCoordinates();
centerMap(pt1, pt2);
}
void ImageFrame::centerMap(const int ID)
{
const auto pt1 = sourceCanvas->locateLinkCoordinates(ID);
const auto pt2 = targetCanvas->locateLinkCoordinates(ID);
centerMap(pt1, pt2);
}
void ImageFrame::centerMap(const wxPoint srcCanvasPoint, const wxPoint targetCanvasPoint)
{
const auto sourceScrollPageSizeX = sourceCanvas->GetScrollPageSize(wxHORIZONTAL);
const auto sourceScrollPageSizeY = sourceCanvas->GetScrollPageSize(wxVERTICAL);
const auto targetScrollPageSizeX = targetCanvas->GetScrollPageSize(wxHORIZONTAL);
const auto targetScrollPageSizeY = targetCanvas->GetScrollPageSize(wxVERTICAL);

auto units = wxPoint(static_cast<int>(pt1.x * sourceCanvas->getScale()), static_cast<int>(pt1.y * sourceCanvas->getScale()));
auto units = wxPoint(static_cast<int>(srcCanvasPoint.x * sourceCanvas->getScale()), static_cast<int>(srcCanvasPoint.y * sourceCanvas->getScale()));
auto offset = wxPoint(units.x - sourceScrollPageSizeX / 2, units.y - sourceScrollPageSizeY / 2);
sourceCanvas->Scroll(offset);

units = wxPoint(static_cast<int>(pt2.x * targetCanvas->getScale()), static_cast<int>(pt2.y * targetCanvas->getScale()));
units = wxPoint(static_cast<int>(targetCanvasPoint.x * targetCanvas->getScale()), static_cast<int>(targetCanvasPoint.y * targetCanvas->getScale()));
offset = wxPoint(units.x - targetScrollPageSizeX / 2, units.y - targetScrollPageSizeY / 2);
targetCanvas->Scroll(offset);

Expand Down Expand Up @@ -413,6 +451,8 @@ void ImageFrame::setVersion(const std::shared_ptr<LinkMappingVersion>& version)
targetCanvas->setVersion(version);
sourceCanvas->clearStrafedPixels();
targetCanvas->clearStrafedPixels();
sourceCanvas->clearHighlightedLinks();
targetCanvas->clearHighlightedLinks();
sourceCanvas->restoreImageData();
targetCanvas->restoreImageData();

Expand Down
6 changes: 5 additions & 1 deletion ProvinceMapper/Source/Frames/Images/ImageFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,19 @@ class ImageFrame: public wxFrame
void activateLinkByIndex(int row);
void activateLinkByID(int ID);
void deactivateLink();
void highlightRegionByCommentRow(int commentRow);
void toggleProvinceByID(const std::string& ID, bool sourceImage);
void shadeProvinceByID(const std::string& ID, bool sourceImage);
void centerMapToActiveLink();
void centerMap(int ID);
void centerMap(wxPoint srcCanvasPoint, wxPoint targetCanvasPoint);
void centerProvince(ImageTabSelector selector, const std::string& 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
Loading