2022-05-26 22:18:54 +01:00
|
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
/*
|
2023-06-10 14:42:27 +01:00
|
|
|
* Prism Launcher - Minecraft Launcher
|
2022-05-26 22:18:54 +01:00
|
|
|
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
|
2023-06-10 14:42:27 +01:00
|
|
|
* Copyright (C) 2023 TheKodeToad <TheKodeToad@proton.me>
|
2014-01-29 00:20:19 +00:00
|
|
|
*
|
2022-05-26 22:18:54 +01:00
|
|
|
* This program 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, version 3.
|
2014-01-29 00:20:19 +00:00
|
|
|
*
|
2022-05-26 22:18:54 +01:00
|
|
|
* This program 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.
|
2014-01-29 00:20:19 +00:00
|
|
|
*
|
2022-05-26 22:18:54 +01:00
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
* This file incorporates work covered by the following copyright and
|
|
|
|
* permission notice:
|
|
|
|
*
|
|
|
|
* Copyright 2013-2021 MultiMC Contributors
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
2014-01-29 00:20:19 +00:00
|
|
|
*/
|
|
|
|
|
2023-08-14 17:16:53 +01:00
|
|
|
#include "VersionListView.h"
|
2014-01-29 00:20:19 +00:00
|
|
|
#include <QApplication>
|
|
|
|
#include <QDrag>
|
2023-08-14 17:16:53 +01:00
|
|
|
#include <QHeaderView>
|
|
|
|
#include <QMouseEvent>
|
2014-01-29 00:20:19 +00:00
|
|
|
#include <QPainter>
|
|
|
|
|
2023-08-14 17:16:53 +01:00
|
|
|
VersionListView::VersionListView(QWidget* parent) : QTreeView(parent)
|
2014-01-29 00:20:19 +00:00
|
|
|
{
|
|
|
|
m_emptyString = tr("No versions are currently available.");
|
|
|
|
}
|
|
|
|
|
2023-08-14 17:16:53 +01:00
|
|
|
void VersionListView::rowsInserted(const QModelIndex& parent, int start, int end)
|
2014-01-29 00:20:19 +00:00
|
|
|
{
|
2023-08-14 17:16:53 +01:00
|
|
|
m_itemCount += end - start + 1;
|
2019-07-19 07:29:31 +01:00
|
|
|
updateEmptyViewPort();
|
2014-01-29 00:20:19 +00:00
|
|
|
QTreeView::rowsInserted(parent, start, end);
|
|
|
|
}
|
|
|
|
|
2023-08-14 17:16:53 +01:00
|
|
|
void VersionListView::rowsAboutToBeRemoved(const QModelIndex& parent, int start, int end)
|
2014-01-29 00:20:19 +00:00
|
|
|
{
|
2023-08-14 17:16:53 +01:00
|
|
|
m_itemCount -= end - start + 1;
|
2019-07-19 07:29:31 +01:00
|
|
|
updateEmptyViewPort();
|
2014-01-29 00:20:19 +00:00
|
|
|
QTreeView::rowsInserted(parent, start, end);
|
|
|
|
}
|
|
|
|
|
2023-08-14 17:16:53 +01:00
|
|
|
void VersionListView::setModel(QAbstractItemModel* model)
|
2014-01-29 00:20:19 +00:00
|
|
|
{
|
|
|
|
m_itemCount = model->rowCount();
|
2019-07-19 07:29:31 +01:00
|
|
|
updateEmptyViewPort();
|
2014-01-29 00:20:19 +00:00
|
|
|
QTreeView::setModel(model);
|
|
|
|
}
|
|
|
|
|
|
|
|
void VersionListView::reset()
|
|
|
|
{
|
2023-08-14 17:16:53 +01:00
|
|
|
if (model()) {
|
2014-01-29 00:20:19 +00:00
|
|
|
m_itemCount = model()->rowCount();
|
2023-08-14 17:16:53 +01:00
|
|
|
} else {
|
2019-07-19 07:29:31 +01:00
|
|
|
m_itemCount = 0;
|
|
|
|
}
|
|
|
|
updateEmptyViewPort();
|
2014-01-29 00:20:19 +00:00
|
|
|
QTreeView::reset();
|
|
|
|
}
|
|
|
|
|
|
|
|
void VersionListView::setEmptyString(QString emptyString)
|
|
|
|
{
|
|
|
|
m_emptyString = emptyString;
|
2015-05-02 22:42:33 +01:00
|
|
|
updateEmptyViewPort();
|
|
|
|
}
|
|
|
|
|
|
|
|
void VersionListView::setEmptyErrorString(QString emptyErrorString)
|
|
|
|
{
|
|
|
|
m_emptyErrorString = emptyErrorString;
|
|
|
|
updateEmptyViewPort();
|
|
|
|
}
|
|
|
|
|
|
|
|
void VersionListView::setEmptyMode(VersionListView::EmptyMode mode)
|
|
|
|
{
|
|
|
|
m_emptyMode = mode;
|
|
|
|
updateEmptyViewPort();
|
|
|
|
}
|
|
|
|
|
|
|
|
void VersionListView::updateEmptyViewPort()
|
|
|
|
{
|
2019-10-01 13:28:06 +01:00
|
|
|
#ifndef QT_NO_ACCESSIBILITY
|
2019-07-19 07:29:31 +01:00
|
|
|
setAccessibleDescription(currentEmptyString());
|
2019-10-01 13:28:06 +01:00
|
|
|
#endif /* !QT_NO_ACCESSIBILITY */
|
2019-07-19 07:29:31 +01:00
|
|
|
|
2023-08-14 17:16:53 +01:00
|
|
|
if (!m_itemCount) {
|
2014-01-29 00:20:19 +00:00
|
|
|
viewport()->update();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-14 17:16:53 +01:00
|
|
|
void VersionListView::paintEvent(QPaintEvent* event)
|
2014-01-29 00:20:19 +00:00
|
|
|
{
|
2023-08-14 17:16:53 +01:00
|
|
|
if (m_itemCount) {
|
2014-01-29 00:20:19 +00:00
|
|
|
QTreeView::paintEvent(event);
|
2023-08-14 17:16:53 +01:00
|
|
|
} else {
|
2014-01-29 00:20:19 +00:00
|
|
|
paintInfoLabel(event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-19 07:29:31 +01:00
|
|
|
QString VersionListView::currentEmptyString() const
|
2014-01-29 00:20:19 +00:00
|
|
|
{
|
2023-08-14 17:16:53 +01:00
|
|
|
switch (m_emptyMode) {
|
2019-07-19 07:29:31 +01:00
|
|
|
default:
|
2015-05-02 22:42:33 +01:00
|
|
|
case VersionListView::String:
|
2019-07-19 07:29:31 +01:00
|
|
|
return m_emptyString;
|
2015-05-02 22:42:33 +01:00
|
|
|
case VersionListView::ErrorString:
|
2019-07-19 07:29:31 +01:00
|
|
|
return m_emptyErrorString;
|
2015-05-02 22:42:33 +01:00
|
|
|
}
|
2019-07-19 07:29:31 +01:00
|
|
|
}
|
|
|
|
|
2023-08-14 17:16:53 +01:00
|
|
|
void VersionListView::paintInfoLabel(QPaintEvent* event) const
|
2019-07-19 07:29:31 +01:00
|
|
|
{
|
|
|
|
QString emptyString = currentEmptyString();
|
|
|
|
|
2023-08-14 17:16:53 +01:00
|
|
|
// calculate the rect for the overlay
|
2014-01-29 00:20:19 +00:00
|
|
|
QPainter painter(viewport());
|
|
|
|
painter.setRenderHint(QPainter::Antialiasing, true);
|
|
|
|
QFont font("sans", 20);
|
|
|
|
font.setBold(true);
|
2019-07-19 07:29:31 +01:00
|
|
|
|
2014-01-29 00:20:19 +00:00
|
|
|
QRect bounds = viewport()->geometry();
|
|
|
|
bounds.moveTop(0);
|
2019-07-19 07:29:31 +01:00
|
|
|
auto innerBounds = bounds;
|
|
|
|
innerBounds.adjust(10, 10, -10, -10);
|
|
|
|
|
2022-05-02 18:10:45 +01:00
|
|
|
QColor background = QApplication::palette().color(QPalette::WindowText);
|
2019-07-19 07:29:31 +01:00
|
|
|
QColor foreground = QApplication::palette().color(QPalette::Base);
|
|
|
|
foreground.setAlpha(190);
|
|
|
|
painter.setFont(font);
|
|
|
|
auto fontMetrics = painter.fontMetrics();
|
|
|
|
auto textRect = fontMetrics.boundingRect(innerBounds, Qt::AlignHCenter | Qt::TextWordWrap, emptyString);
|
|
|
|
textRect.moveCenter(bounds.center());
|
|
|
|
|
|
|
|
auto wrapRect = textRect;
|
|
|
|
wrapRect.adjust(-10, -10, 10, 10);
|
|
|
|
|
2023-08-14 17:16:53 +01:00
|
|
|
// check if we are allowed to draw in our area
|
2019-07-19 07:29:31 +01:00
|
|
|
if (!event->rect().intersects(wrapRect)) {
|
2014-01-29 00:20:19 +00:00
|
|
|
return;
|
|
|
|
}
|
2019-07-19 07:29:31 +01:00
|
|
|
|
2014-01-29 00:20:19 +00:00
|
|
|
painter.setBrush(QBrush(background));
|
|
|
|
painter.setPen(foreground);
|
2019-07-19 07:29:31 +01:00
|
|
|
painter.drawRoundedRect(wrapRect, 5.0, 5.0);
|
|
|
|
|
2014-01-29 00:20:19 +00:00
|
|
|
painter.setPen(foreground);
|
|
|
|
painter.setFont(font);
|
2019-07-19 07:29:31 +01:00
|
|
|
painter.drawText(textRect, Qt::AlignHCenter | Qt::TextWordWrap, emptyString);
|
2014-01-29 00:20:19 +00:00
|
|
|
}
|