/*
Copyright (C) 2012 Sebastian Herbord. All rights reserved.
This file is part of Mod Organizer.
Mod Organizer is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Mod Organizer is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Mod Organizer. If not, see .
*/
#include "fomodscreenshotdialog.h"
#include "ui_fomodscreenshotdialog.h"
#include
#include
#include
#include
#include
#include
#include
#include "scalelabel.h"
constexpr int kScreenshotTileWidth = 100;
constexpr int kScreenshotTileHeight = 80;
constexpr int kScreenshotTileSpacing = 16;
// Disables the native dotted selection border around focused elements. Unfortunately,
// disabling it via stylesheets is broken in the latest version of Qt
// https://stackoverflow.com/questions/9795791/removing-dotted-border-without-setting-nofocus-in-windows-pyqt
class NoFocusProxyStyle : public QProxyStyle
{
public:
NoFocusProxyStyle(QStyle* baseStyle = nullptr) : QProxyStyle(baseStyle) {}
void drawPrimitive(PrimitiveElement element, const QStyleOption* option,
QPainter* painter, const QWidget* widget) const
{
if (element == QStyle::PE_FrameFocusRect) {
return;
}
QProxyStyle::drawPrimitive(element, option, painter, widget);
}
};
FomodScreenshotDialog::FomodScreenshotDialog(
QWidget* parent, std::vector> carouselImages,
int carouselIndex)
: QDialog(parent, Qt::FramelessWindowHint), ui(new Ui::FomodScreenshotDialog),
m_carouselImages(carouselImages)
{
Q_INIT_RESOURCE(resources);
ui->setupUi(this);
setAttribute(Qt::WA_TranslucentBackground);
// Manually maximize the dialog since showMaximized() clips over the taskbar
QScreen* screen = this->screen();
QRect availableGeometry = screen->availableGeometry();
setFixedSize(availableGeometry.width(), availableGeometry.height());
move(availableGeometry.x(), availableGeometry.y());
QTableWidget* carouselList = ui->carouselList;
carouselList->setStyle(new NoFocusProxyStyle);
carouselList->setRowCount(1);
carouselList->setRowHeight(0, kScreenshotTileHeight);
carouselList->setColumnCount(0);
for (auto carouselImage : m_carouselImages) {
QFrame* container = new QFrame(carouselList);
QVBoxLayout* layout = new QVBoxLayout(container);
layout->setContentsMargins(0, 0, 0, 0);
container->setLayout(layout);
ScaleLabel* scaleLabel = new ScaleLabel(container);
scaleLabel->setScalableResource(carouselImage.second);
scaleLabel->setFixedSize(kScreenshotTileWidth, kScreenshotTileHeight);
scaleLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
scaleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
scaleLabel->setCursor(Qt::PointingHandCursor);
scaleLabel->setStatic(true);
layout->addWidget(scaleLabel);
layout->setAlignment(scaleLabel, Qt::AlignLeft | Qt::AlignVCenter);
int column = carouselList->columnCount();
carouselList->setColumnCount(column + 1);
carouselList->setColumnWidth(
column, kScreenshotTileWidth +
(column + 1 == carouselImages.size() ? 0 : kScreenshotTileSpacing));
QTableWidgetItem* item = new QTableWidgetItem("");
carouselList->setItem(0, column, item);
carouselList->setCellWidget(0, column, container);
}
connect(carouselList, &QTableWidget::itemSelectionChanged, this,
&FomodScreenshotDialog::selectedScreenshotChanged);
ui->carouselList->selectColumn(carouselIndex);
}
FomodScreenshotDialog::~FomodScreenshotDialog()
{
delete ui;
}
void FomodScreenshotDialog::on_closeButton_clicked()
{
close();
}
void FomodScreenshotDialog::on_navigateLeft_clicked()
{
int selectedColumn = getSelectedScreenshot();
if (selectedColumn == 0) {
return;
}
ui->carouselList->selectColumn(selectedColumn - 1);
}
void FomodScreenshotDialog::on_navigateRight_clicked()
{
int selectedColumn = getSelectedScreenshot();
if (selectedColumn == m_carouselImages.size() - 1) {
return;
}
ui->carouselList->selectColumn(selectedColumn + 1);
}
void FomodScreenshotDialog::selectedScreenshotChanged()
{
// In case the user ctrl+clicks current selection to result in an empty selection
if (ui->carouselList->selectedItems().isEmpty()) {
ui->carouselList->selectColumn(0);
return;
}
int selectedColumn = getSelectedScreenshot();
ui->imageTitleLabel->setText(m_carouselImages.at(selectedColumn).first);
ui->image->setScalableResource(m_carouselImages.at(selectedColumn).second);
ui->slideshowPosition->setText(QString("%1/%2").arg(
QString::number(selectedColumn + 1), QString::number(m_carouselImages.size())));
for (int column = 0; column < ui->carouselList->columnCount(); column++) {
QWidget* widget = ui->carouselList->cellWidget(0, column);
ScaleLabel* scaleLabel = widget->findChild();
if (column == selectedColumn) {
scaleLabel->setStyleSheet(scaleLabel->styleSheet() +
"QLabel { border:2px solid white; }");
} else {
scaleLabel->setStyleSheet(scaleLabel->styleSheet() + "QLabel { border:none; }");
}
}
}
int FomodScreenshotDialog::getSelectedScreenshot()
{
return ui->carouselList->selectedItems().front()->column();
}