Add 'empty text' to all the version selection dialogs.
Customize it for the Forge one so people finally shut up about 1.7.4
This commit is contained in:
parent
ffbc5bb62c
commit
b4b6091372
@ -315,10 +315,14 @@ gui/dialogs/UpdateDialog.h
|
||||
gui/dialogs/UpdateDialog.cpp
|
||||
|
||||
# GUI - widgets
|
||||
gui/widgets/Common.h
|
||||
gui/widgets/Common.cpp
|
||||
gui/widgets/InstanceDelegate.h
|
||||
gui/widgets/InstanceDelegate.cpp
|
||||
gui/widgets/ModListView.h
|
||||
gui/widgets/ModListView.cpp
|
||||
gui/widgets/VersionListView.h
|
||||
gui/widgets/VersionListView.cpp
|
||||
gui/widgets/LabeledToolButton.h
|
||||
gui/widgets/LabeledToolButton.cpp
|
||||
gui/widgets/MCModInfoFrame.h
|
||||
|
@ -142,7 +142,8 @@ void OneSixModEditDialog::on_customEditorBtn_clicked()
|
||||
{
|
||||
if (!MMC->openJsonEditor(m_inst->instanceRoot() + "/custom.json"))
|
||||
{
|
||||
QMessageBox::warning(this, tr("Error"), tr("Unable to open custom.json, check the settings"));
|
||||
QMessageBox::warning(this, tr("Error"),
|
||||
tr("Unable to open custom.json, check the settings"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -151,6 +152,8 @@ void OneSixModEditDialog::on_forgeBtn_clicked()
|
||||
{
|
||||
VersionSelectDialog vselect(MMC->forgelist().get(), tr("Select Forge version"), this);
|
||||
vselect.setFilter(1, m_inst->currentVersionId());
|
||||
vselect.setEmptyString(tr("No Forge versions are currently available for Minecraft ") +
|
||||
m_inst->currentVersionId());
|
||||
if (vselect.exec() && vselect.selectedVersion())
|
||||
{
|
||||
if (m_inst->versionIsCustom())
|
||||
@ -240,9 +243,9 @@ void OneSixModEditDialog::on_liteloaderBtn_clicked()
|
||||
}
|
||||
if (!liteloader.apply(m_version))
|
||||
{
|
||||
QMessageBox::critical(
|
||||
this, tr("LiteLoader"),
|
||||
tr("For reasons unknown, the LiteLoader installation failed. Check your MultiMC log files for details."));
|
||||
QMessageBox::critical(this, tr("LiteLoader"),
|
||||
tr("For reasons unknown, the LiteLoader installation failed. "
|
||||
"Check your MultiMC log files for details."));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -51,6 +51,11 @@ VersionSelectDialog::VersionSelectDialog(BaseVersionList *vlist, QString title,
|
||||
}
|
||||
}
|
||||
|
||||
void VersionSelectDialog::setEmptyString(QString emptyString)
|
||||
{
|
||||
ui->listView->setEmptyString(emptyString);
|
||||
}
|
||||
|
||||
VersionSelectDialog::~VersionSelectDialog()
|
||||
{
|
||||
delete ui;
|
||||
|
@ -44,6 +44,7 @@ public:
|
||||
BaseVersionPtr selectedVersion() const;
|
||||
|
||||
void setFilter(int column, QString filter);
|
||||
void setEmptyString(QString emptyString);
|
||||
void setResizeOn(int column);
|
||||
|
||||
private
|
||||
|
@ -15,7 +15,7 @@
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTreeView" name="listView">
|
||||
<widget class="VersionListView" name="listView">
|
||||
<property name="horizontalScrollBarPolicy">
|
||||
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||
</property>
|
||||
@ -65,6 +65,13 @@
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>VersionListView</class>
|
||||
<extends>QTreeView</extends>
|
||||
<header>gui/widgets/VersionListView.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
|
27
gui/widgets/Common.cpp
Normal file
27
gui/widgets/Common.cpp
Normal file
@ -0,0 +1,27 @@
|
||||
#include "Common.h"
|
||||
|
||||
// Origin: Qt
|
||||
QStringList viewItemTextLayout(QTextLayout &textLayout, int lineWidth, qreal &height,
|
||||
qreal &widthUsed)
|
||||
{
|
||||
QStringList lines;
|
||||
height = 0;
|
||||
widthUsed = 0;
|
||||
textLayout.beginLayout();
|
||||
QString str = textLayout.text();
|
||||
while (true)
|
||||
{
|
||||
QTextLine line = textLayout.createLine();
|
||||
if (!line.isValid())
|
||||
break;
|
||||
if (line.textLength() == 0)
|
||||
break;
|
||||
line.setLineWidth(lineWidth);
|
||||
line.setPosition(QPointF(0, height));
|
||||
height += line.height();
|
||||
lines.append(str.mid(line.textStart(), line.textLength()));
|
||||
widthUsed = qMax(widthUsed, line.naturalTextWidth());
|
||||
}
|
||||
textLayout.endLayout();
|
||||
return lines;
|
||||
}
|
6
gui/widgets/Common.h
Normal file
6
gui/widgets/Common.h
Normal file
@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
#include <QStringList>
|
||||
#include <QTextLayout>
|
||||
|
||||
QStringList viewItemTextLayout(QTextLayout &textLayout, int lineWidth, qreal &height,
|
||||
qreal &widthUsed);
|
@ -19,30 +19,7 @@
|
||||
#include <QTextLayout>
|
||||
#include <QApplication>
|
||||
#include <QtCore/qmath.h>
|
||||
|
||||
// Origin: Qt
|
||||
static void viewItemTextLayout(QTextLayout &textLayout, int lineWidth, qreal &height,
|
||||
qreal &widthUsed)
|
||||
{
|
||||
height = 0;
|
||||
widthUsed = 0;
|
||||
textLayout.beginLayout();
|
||||
QString str = textLayout.text();
|
||||
while (true)
|
||||
{
|
||||
QTextLine line = textLayout.createLine();
|
||||
if (!line.isValid())
|
||||
break;
|
||||
if (line.textLength() == 0)
|
||||
break;
|
||||
line.setLineWidth(lineWidth);
|
||||
line.setPosition(QPointF(0, height));
|
||||
height += line.height();
|
||||
widthUsed = qMax(widthUsed, line.naturalTextWidth());
|
||||
}
|
||||
textLayout.endLayout();
|
||||
}
|
||||
|
||||
#include "Common.h"
|
||||
#define QFIXED_MAX (INT_MAX / 256)
|
||||
|
||||
ListViewDelegate::ListViewDelegate(QObject *parent) : QStyledItemDelegate(parent)
|
||||
|
150
gui/widgets/VersionListView.cpp
Normal file
150
gui/widgets/VersionListView.cpp
Normal file
@ -0,0 +1,150 @@
|
||||
/* Copyright 2013 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.
|
||||
*/
|
||||
|
||||
#include <QHeaderView>
|
||||
#include <QApplication>
|
||||
#include <QMouseEvent>
|
||||
#include <QDrag>
|
||||
#include <QPainter>
|
||||
#include "VersionListView.h"
|
||||
#include "Common.h"
|
||||
|
||||
VersionListView::VersionListView(QWidget *parent)
|
||||
:QTreeView ( parent )
|
||||
{
|
||||
m_emptyString = tr("No versions are currently available.");
|
||||
}
|
||||
|
||||
void VersionListView::rowsInserted(const QModelIndex &parent, int start, int end)
|
||||
{
|
||||
if(!m_itemCount)
|
||||
viewport()->update();
|
||||
m_itemCount += end-start+1;
|
||||
QTreeView::rowsInserted(parent, start, end);
|
||||
}
|
||||
|
||||
|
||||
void VersionListView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
|
||||
{
|
||||
m_itemCount -= end-start+1;
|
||||
if(!m_itemCount)
|
||||
viewport()->update();
|
||||
QTreeView::rowsInserted(parent, start, end);
|
||||
}
|
||||
|
||||
void VersionListView::setModel(QAbstractItemModel *model)
|
||||
{
|
||||
m_itemCount = model->rowCount();
|
||||
if(!m_itemCount)
|
||||
viewport()->update();
|
||||
QTreeView::setModel(model);
|
||||
}
|
||||
|
||||
void VersionListView::reset()
|
||||
{
|
||||
if(model())
|
||||
{
|
||||
m_itemCount = model()->rowCount();
|
||||
}
|
||||
viewport()->update();
|
||||
QTreeView::reset();
|
||||
}
|
||||
|
||||
void VersionListView::setEmptyString(QString emptyString)
|
||||
{
|
||||
m_emptyString = emptyString;
|
||||
if(!m_itemCount)
|
||||
{
|
||||
viewport()->update();
|
||||
}
|
||||
}
|
||||
|
||||
void VersionListView::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
if(m_itemCount)
|
||||
{
|
||||
QTreeView::paintEvent(event);
|
||||
}
|
||||
else
|
||||
{
|
||||
paintInfoLabel(event);
|
||||
}
|
||||
}
|
||||
|
||||
void VersionListView::paintInfoLabel(QPaintEvent *event)
|
||||
{
|
||||
int scrollInterval = 500;
|
||||
|
||||
//calculate the rect for the overlay
|
||||
QPainter painter(viewport());
|
||||
painter.setRenderHint(QPainter::Antialiasing, true);
|
||||
const QChar letter = 'Q';
|
||||
QFont font("sans", 20);
|
||||
font.setBold(true);
|
||||
|
||||
QRect bounds = viewport()->geometry();
|
||||
bounds.moveTop(0);
|
||||
QTextLayout layout(m_emptyString, font);
|
||||
qreal height = 0.0;
|
||||
qreal widthUsed = 0.0;
|
||||
QStringList lines = viewItemTextLayout(layout, bounds.width() - 20, height, widthUsed);
|
||||
QRect rect (0,0, widthUsed, height);
|
||||
rect.setWidth(rect.width()+20);
|
||||
rect.setHeight(rect.height()+20);
|
||||
rect.moveCenter(bounds.center());
|
||||
//check if we are allowed to draw in our area
|
||||
if (!event->rect().intersects(rect)) {
|
||||
return;
|
||||
}
|
||||
//draw the letter of the topmost item semitransparent in the middle
|
||||
QColor background = QApplication::palette().color(QPalette::Foreground);
|
||||
QColor foreground = QApplication::palette().color(QPalette::Base);
|
||||
/*
|
||||
background.setAlpha(128 - scrollFade);
|
||||
foreground.setAlpha(128 - scrollFade);
|
||||
*/
|
||||
painter.setBrush(QBrush(background));
|
||||
painter.setPen(foreground);
|
||||
painter.drawRoundedRect(rect, 5.0, 5.0);
|
||||
foreground.setAlpha(190);
|
||||
painter.setPen(foreground);
|
||||
painter.setFont(font);
|
||||
painter.drawText(rect, Qt::AlignCenter, lines.join("\n"));
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
void ModListView::setModel ( QAbstractItemModel* model )
|
||||
{
|
||||
QTreeView::setModel ( model );
|
||||
auto head = header();
|
||||
head->setStretchLastSection(false);
|
||||
// HACK: this is true for the checkbox column of mod lists
|
||||
auto string = model->headerData(0,head->orientation()).toString();
|
||||
if(!string.size())
|
||||
{
|
||||
head->setSectionResizeMode(0, QHeaderView::ResizeToContents);
|
||||
head->setSectionResizeMode(1, QHeaderView::Stretch);
|
||||
for(int i = 2; i < head->count(); i++)
|
||||
head->setSectionResizeMode(i, QHeaderView::ResizeToContents);
|
||||
}
|
||||
else
|
||||
{
|
||||
head->setSectionResizeMode(0, QHeaderView::Stretch);
|
||||
for(int i = 1; i < head->count(); i++)
|
||||
head->setSectionResizeMode(i, QHeaderView::ResizeToContents);
|
||||
}
|
||||
}
|
||||
*/
|
43
gui/widgets/VersionListView.h
Normal file
43
gui/widgets/VersionListView.h
Normal file
@ -0,0 +1,43 @@
|
||||
/* Copyright 2013 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.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <QTreeView>
|
||||
|
||||
class Mod;
|
||||
|
||||
class VersionListView : public QTreeView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit VersionListView(QWidget *parent = 0);
|
||||
virtual void paintEvent(QPaintEvent *event) override;
|
||||
void setEmptyString(QString emptyString);
|
||||
virtual void setModel ( QAbstractItemModel* model );
|
||||
|
||||
public slots:
|
||||
virtual void reset() override;
|
||||
|
||||
protected slots:
|
||||
virtual void rowsAboutToBeRemoved(const QModelIndex & parent, int start, int end) override;
|
||||
virtual void rowsInserted(const QModelIndex &parent, int start, int end) override;
|
||||
|
||||
private: /* methods */
|
||||
void paintInfoLabel(QPaintEvent *event);
|
||||
|
||||
private: /* variables */
|
||||
int m_itemCount = 0;
|
||||
QString m_emptyString;
|
||||
};
|
Loading…
Reference in New Issue
Block a user