File indexing completed on 2023-10-03 07:19:02

0001 /*
0002     SPDX-FileCopyrightText: 2003 Russell Steffen <rsteffen@bayarea.net>
0003     SPDX-FileCopyrightText: 2003 Stephan Zehetner <s.zehetner@nevox.org>
0004     SPDX-FileCopyrightText: 2006 Dmitry Suzdalev <dimsuz@gmail.com>
0005     SPDX-FileCopyrightText: 2006 Inge Wallin <inge@lysator.liu.se>
0006     SPDX-FileCopyrightText: 2006 Pierre Ducroquet <pinaraf@gmail.com>
0007     Copyright Sean D'Epagnier <geckosenator@gmail.com>
0008 
0009     SPDX-License-Identifier: GPL-2.0-or-later
0010 */
0011 
0012 #include "minimapview.h"
0013 
0014 #include <QMouseEvent>
0015 #include <QPainter>
0016 
0017 #include "planet.h"
0018 #include "players/player.h"
0019 
0020 
0021 MiniMapView::MiniMapView(QWidget *parent) :
0022     QWidget(parent),
0023     m_map(nullptr),
0024     m_selection(-1, -1)
0025 {
0026     QPalette  pal = palette();
0027     pal.setColor(backgroundRole(), Qt::black);
0028     setPalette(pal);
0029 
0030     setMinimumSize(100, 100);
0031     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
0032 }
0033 
0034 
0035 MiniMapView::~MiniMapView()
0036 {
0037 }
0038 
0039 
0040 void
0041 MiniMapView::setMap(Map *map)
0042 {
0043     m_map = map;
0044     connect(m_map, &Map::update, this, static_cast<void (QWidget::*)(void)>(&QWidget::update));
0045 }
0046 
0047 
0048 void
0049 MiniMapView::CalculateOffsets(float &sectorSize, float &woffset, float &hoffset)
0050 {
0051     sectorSize = ((float)width())/m_map->columns();
0052     if (height()/m_map->rows() < sectorSize)
0053         sectorSize = ((float)height())/m_map->rows();
0054 
0055     woffset = ((float)width() - m_map->columns()*sectorSize)/2;
0056     hoffset = ((float)height() - m_map->rows()*sectorSize)/2;
0057 }
0058 
0059 
0060 void
0061 MiniMapView::mousePressEvent(QMouseEvent *event)
0062 {
0063     float sectorSize, woffset, hoffset;
0064     CalculateOffsets(sectorSize, woffset, hoffset);
0065 
0066     m_selection = Coordinate((event->x() - woffset) / sectorSize,
0067                              (event->y() - hoffset) / sectorSize);
0068 
0069     const Sector *sector = m_map->sector(m_selection);
0070     if (sector && !sector->hasPlanet())
0071         m_selection = Coordinate(-1, -1);
0072 
0073     Q_EMIT sectorSelected(m_selection);
0074 }
0075 
0076 
0077 void
0078 MiniMapView::paintEvent(QPaintEvent * /*event*/)
0079 {
0080     QPainter painter(this);
0081 
0082     float sectorSize, woffset, hoffset;
0083     CalculateOffsets(sectorSize, woffset, hoffset);
0084 
0085     // Draw the black background
0086     painter.setRenderHint(QPainter::Antialiasing);
0087     painter.setPen(Qt::black);
0088     painter.setBrush(Qt::black);
0089     painter.drawRect(QRectF(woffset, hoffset, m_map->columns() * sectorSize, m_map->rows() * sectorSize));
0090 
0091     // Draw selection
0092     if (hasSelection()) {
0093         painter.setBrush(Qt::cyan);
0094         painter.drawRect(QRectF(
0095             woffset + m_selection.x() * sectorSize,
0096             hoffset + m_selection.y() * sectorSize,
0097             sectorSize,
0098             sectorSize
0099         ));
0100     }
0101 
0102     // Now draw the planets...
0103     for (int col = 0 ; col < m_map->columns() ; col++) {
0104         for (int row = 0 ; row < m_map->rows() ; row++) {
0105             QPoint pt(col, row);
0106             Planet *planet = m_map->sector(pt)->planet();
0107             if (planet) {
0108                 Player *player = planet->player();
0109                 if (player) {
0110                     painter.setBrush(player->color());
0111 
0112                     // Draw a circle in the planets color to show the planet.
0113                     painter.drawEllipse(QRectF(
0114                         woffset + col * sectorSize,
0115                         hoffset + row * sectorSize,
0116                         sectorSize,
0117                         sectorSize
0118                     ));
0119                 }
0120             }
0121         }
0122     }
0123 }
0124 
0125 #include "moc_minimapview.cpp"