@@ -466,30 +466,76 @@ void MapView::draw() {
466466 ImVec2 btnSize (CONTROL_BUTTON_SIZE, CONTROL_BUTTON_SIZE);
467467 ImVec2 ctrlPos = ImVec2 (availableRegion.x - CONTROL_BUTTON_SIZE - CONTROL_BUTTON_MARGIN, CONTROL_BUTTON_MARGIN);
468468 ImGui::SetCursorPos (ctrlPos);
469- if (ImGui::ImageButton (icons::LOCATE, btnSize, ImVec2 (0 , 0 ), ImVec2 (1 , 1 ), 5 , ImVec4 (0 , 0 , 0 , 0 ))) {
470- prevPanLon = panLon = 0 .0f ;
471- prevPanLat = panLat = 0 .0f ;
472- }
473- ctrlPos.y += CONTROL_BUTTON_SIZE + CONTROL_BUTTON_MARGIN;
474- ImGui::SetCursorPos (ctrlPos);
475- if (ImGui::ImageButton (icons::ZOOM_IN, btnSize, ImVec2 (0 , 0 ), ImVec2 (1 , 1 ), 5 , ImVec4 (0 , 0 , 0 , 0 ), zoom < 19 ? ImVec4 (0 , 0 , 0 , 1 ) : ImVec4 (0 , 0 , 0 , 0.3 ))) {
476- if (zoom < 19 ) {
477- zoom ++;
478- core::configManager.acquire ();
479- core::configManager.conf [" zoom" ] = zoom;
480- core::configManager.release (true );
481- }
482- }
483- ctrlPos.y += CONTROL_BUTTON_SIZE + CONTROL_BUTTON_MARGIN;
484- ImGui::SetCursorPos (ctrlPos);
485- if (ImGui::ImageButton (icons::ZOOM_OUT, btnSize, ImVec2 (0 , 0 ), ImVec2 (1 , 1 ), 5 , ImVec4 (0 , 0 , 0 , 0 ), zoom > 1 ? ImVec4 (0 , 0 , 0 , 1 ) : ImVec4 (0 , 0 , 0 , 0.3 ))) {
486- if (zoom > 1 ) {
487- zoom --;
488- core::configManager.acquire ();
489- core::configManager.conf [" zoom" ] = zoom;
490- core::configManager.release (true );
491- }
469+
470+ // Center location
471+ if (ImGui::ImageButton (icons::LOCATE, btnSize, ImVec2 (0 , 0 ), ImVec2 (1 , 1 ), 5 , ImVec4 (0 , 0 , 0 , 0 ))) {
472+ ImVec2 availableRegion = ImGui::GetContentRegionAvail ();
473+ ImVec2 screenCenter = ImVec2 (availableRegion.x * 0 .5f , availableRegion.y * 0 .5f );
474+ panLon = screenCenter.x - ((availableRegion.x - TILE_WIDTH) * 0 .5f ) - pxOffsetX;
475+ panLat = screenCenter.y - ((availableRegion.y - TILE_HEIGHT) * 0 .5f ) - pxOffsetY;
476+ prevPanLon = panLon;
477+ prevPanLat = panLat;
478+ core::configManager.acquire ();
479+ core::configManager.conf [" panLon" ] = panLon;
480+ core::configManager.conf [" panLat" ] = panLat;
481+ core::configManager.release (true );
492482 }
483+
484+ // Zoom in
485+ ctrlPos.y += CONTROL_BUTTON_SIZE + CONTROL_BUTTON_MARGIN;
486+ ImGui::SetCursorPos (ctrlPos);
487+ if (ImGui::ImageButton (icons::ZOOM_IN, btnSize, ImVec2 (0 , 0 ), ImVec2 (1 , 1 ), 5 , ImVec4 (0 , 0 , 0 , 0 ), zoom < 19 ? ImVec4 (0 , 0 , 0 , 1 ) : ImVec4 (0 , 0 , 0 , 0.3 ))) {
488+ if (zoom < 19 ) {
489+ ImVec2 screenCenter = ImVec2 (availableRegion.x * 0 .5f , availableRegion.y * 0 .5f );
490+ ImVec2 tileScreenPos = ImVec2 (offsetX, offsetY);
491+ float centerOffsetFromGPSX = screenCenter.x - (tileScreenPos.x + pxOffsetX);
492+ float centerOffsetFromGPSY = screenCenter.y - (tileScreenPos.y + pxOffsetY);
493+ zoom++;
494+ centerOffsetFromGPSX *= 2 .0f ;
495+ centerOffsetFromGPSY *= 2 .0f ;
496+ int newTileX, newTileY, newPxOffsetX, newPxOffsetY;
497+ latLonToTilePixel (latitude, longitude, newTileX, newTileY, newPxOffsetX, newPxOffsetY);
498+ float newTileDefaultX = (availableRegion.x - TILE_WIDTH) * 0 .5f ;
499+ float newTileDefaultY = (availableRegion.y - TILE_HEIGHT) * 0 .5f ;
500+ panLon = screenCenter.x - newTileDefaultX - newPxOffsetX - centerOffsetFromGPSX;
501+ panLat = screenCenter.y - newTileDefaultY - newPxOffsetY - centerOffsetFromGPSY;
502+ prevPanLon = panLon;
503+ prevPanLat = panLat;
504+ core::configManager.acquire ();
505+ core::configManager.conf [" zoom" ] = zoom;
506+ core::configManager.conf [" panLon" ] = panLon;
507+ core::configManager.conf [" panLat" ] = panLat;
508+ core::configManager.release (true );
509+ }
510+ }
511+
512+ // Zoom out
513+ ctrlPos.y += CONTROL_BUTTON_SIZE + CONTROL_BUTTON_MARGIN;
514+ ImGui::SetCursorPos (ctrlPos);
515+ if (ImGui::ImageButton (icons::ZOOM_OUT, btnSize, ImVec2 (0 , 0 ), ImVec2 (1 , 1 ), 5 , ImVec4 (0 , 0 , 0 , 0 ), zoom > 1 ? ImVec4 (0 , 0 , 0 , 1 ) : ImVec4 (0 , 0 , 0 , 0.3 ))) {
516+ if (zoom > 1 ) {
517+ ImVec2 screenCenter = ImVec2 (availableRegion.x * 0 .5f , availableRegion.y * 0 .5f );
518+ ImVec2 tileScreenPos = ImVec2 (offsetX, offsetY);
519+ float centerOffsetFromGPSX = screenCenter.x - (tileScreenPos.x + pxOffsetX);
520+ float centerOffsetFromGPSY = screenCenter.y - (tileScreenPos.y + pxOffsetY);
521+ zoom--;
522+ centerOffsetFromGPSX *= 0 .5f ;
523+ centerOffsetFromGPSY *= 0 .5f ;
524+ int newTileX, newTileY, newPxOffsetX, newPxOffsetY;
525+ latLonToTilePixel (latitude, longitude, newTileX, newTileY, newPxOffsetX, newPxOffsetY);
526+ float newTileDefaultX = (availableRegion.x - TILE_WIDTH) * 0 .5f ;
527+ float newTileDefaultY = (availableRegion.y - TILE_HEIGHT) * 0 .5f ;
528+ panLon = screenCenter.x - newTileDefaultX - newPxOffsetX - centerOffsetFromGPSX;
529+ panLat = screenCenter.y - newTileDefaultY - newPxOffsetY - centerOffsetFromGPSY;
530+ prevPanLon = panLon;
531+ prevPanLat = panLat;
532+ core::configManager.acquire ();
533+ core::configManager.conf [" zoom" ] = zoom;
534+ core::configManager.conf [" panLon" ] = panLon;
535+ core::configManager.conf [" panLat" ] = panLat;
536+ core::configManager.release (true );
537+ }
538+ }
493539
494540 // OpenStreetMap attribution
495541 ImGui::PushStyleColor (ImGuiCol_Button, ImVec4 (0 , 0 , 0 , 0 ));
0 commit comments