diff --git a/application/pages/global/AccountListPage.cpp b/application/pages/global/AccountListPage.cpp index 9b7f9d17..6ea6df9b 100644 --- a/application/pages/global/AccountListPage.cpp +++ b/application/pages/global/AccountListPage.cpp @@ -34,10 +34,14 @@ #include "MultiMC.h" AccountListPage::AccountListPage(QWidget *parent) - : QWidget(parent), ui(new Ui::AccountListPage) + : QMainWindow(parent), ui(new Ui::AccountListPage) { ui->setupUi(this); - ui->tabWidget->tabBar()->hide(); + ui->listView->setEmptyString(tr( + "Welcome!\n" + "If you're new here, you can click the \"Add\" button to add your Mojang or Minecraft account." + )); + ui->listView->setEmptyMode(VersionListView::String); m_accounts = MMC->accounts(); @@ -64,18 +68,27 @@ AccountListPage::~AccountListPage() delete ui; } +void AccountListPage::changeEvent(QEvent* event) +{ + if (event->type() == QEvent::LanguageChange) + { + ui->retranslateUi(this); + } + QMainWindow::changeEvent(event); +} + void AccountListPage::listChanged() { updateButtonStates(); } -void AccountListPage::on_addAccountBtn_clicked() +void AccountListPage::on_actionAdd_triggered() { addAccount(tr("Please enter your Mojang or Minecraft account username and password to add " "your account.")); } -void AccountListPage::on_rmAccountBtn_clicked() +void AccountListPage::on_actionRemove_triggered() { QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes(); if (selection.size() > 0) @@ -85,7 +98,7 @@ void AccountListPage::on_rmAccountBtn_clicked() } } -void AccountListPage::on_setDefaultBtn_clicked() +void AccountListPage::on_actionSetDefault_triggered() { QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes(); if (selection.size() > 0) @@ -97,7 +110,7 @@ void AccountListPage::on_setDefaultBtn_clicked() } } -void AccountListPage::on_noDefaultBtn_clicked() +void AccountListPage::on_actionNoDefault_triggered() { m_accounts->setActiveAccount(""); } @@ -107,11 +120,19 @@ void AccountListPage::updateButtonStates() // If there is no selection, disable buttons that require something selected. QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes(); - ui->rmAccountBtn->setEnabled(selection.size() > 0); - ui->setDefaultBtn->setEnabled(selection.size() > 0); - ui->uploadSkinBtn->setEnabled(selection.size() > 0); + ui->actionRemove->setEnabled(selection.size() > 0); + ui->actionSetDefault->setEnabled(selection.size() > 0); + ui->actionUploadSkin->setEnabled(selection.size() > 0); + + if(m_accounts->activeAccount().get() == nullptr) { + ui->actionNoDefault->setEnabled(false); + ui->actionNoDefault->setChecked(true); + } + else { + ui->actionNoDefault->setEnabled(true); + ui->actionNoDefault->setChecked(false); + } - ui->noDefaultBtn->setDown(m_accounts->activeAccount().get() == nullptr); } void AccountListPage::addAccount(const QString &errMsg) @@ -140,7 +161,7 @@ void AccountListPage::addAccount(const QString &errMsg) } } -void AccountListPage::on_uploadSkinBtn_clicked() +void AccountListPage::on_actionUploadSkin_triggered() { QModelIndexList selection = ui->listView->selectionModel()->selectedIndexes(); if (selection.size() > 0) diff --git a/application/pages/global/AccountListPage.h b/application/pages/global/AccountListPage.h index 9db0db88..f4c94119 100644 --- a/application/pages/global/AccountListPage.h +++ b/application/pages/global/AccountListPage.h @@ -15,7 +15,7 @@ #pragma once -#include +#include #include #include "pages/BasePage.h" @@ -30,7 +30,7 @@ class AccountListPage; class AuthenticateTask; -class AccountListPage : public QWidget, public BasePage +class AccountListPage : public QMainWindow, public BasePage { Q_OBJECT public: @@ -59,17 +59,20 @@ public: return "Getting-Started#adding-an-account"; } +private: + void changeEvent(QEvent * event) override; + public slots: - void on_addAccountBtn_clicked(); + void on_actionAdd_triggered(); - void on_rmAccountBtn_clicked(); + void on_actionRemove_triggered(); - void on_setDefaultBtn_clicked(); + void on_actionSetDefault_triggered(); - void on_noDefaultBtn_clicked(); + void on_actionNoDefault_triggered(); - void on_uploadSkinBtn_clicked(); + void on_actionUploadSkin_triggered(); void listChanged(); diff --git a/application/pages/global/AccountListPage.ui b/application/pages/global/AccountListPage.ui index f4e87680..b56d0b59 100644 --- a/application/pages/global/AccountListPage.ui +++ b/application/pages/global/AccountListPage.ui @@ -1,122 +1,101 @@ AccountListPage - + 0 0 - 694 - 609 + 800 + 600 - - - 0 + + MainWindow + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + toolBar - - 0 + + true - - 0 + + Qt::LeftToolBarArea|Qt::RightToolBarArea - - 0 + + Qt::ToolButtonTextOnly - - - - 0 - - - - Tab 1 - - - - - - <html><head/><body><p>Welcome! If you're new here, you can click the &quot;Add&quot; button to add your Mojang or Minecraft account.</p></body></html> - - - true - - - - - - - - - - - - - - &Add - - - - - - - &Remove - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - <html><head/><body><p>Set the currently selected account as the active account. The active account is the account that is used to log in (unless it is overridden in an instance-specific setting).</p></body></html> - - - &Set Default - - - - - - - Set no default account. This will cause MultiMC to prompt you to select an account every time you launch an instance that doesn't have its own default set. - - - &No Default - - - - - - - Opens a dialog to select and upload a skin image to the selected account. - - - &Upload Skin - - - - - - - - - - - - + + false + + + RightToolBarArea + + + false + + + + + + + + + + Add + + + + + Remove + + + + + Set Default + + + + + true + + + No Default + + + + + Upload Skin + + + + + VersionListView + QTreeView +
widgets/VersionListView.h
+
+
diff --git a/application/widgets/VersionListView.cpp b/application/widgets/VersionListView.cpp index 359bd89c..09df75b7 100644 --- a/application/widgets/VersionListView.cpp +++ b/application/widgets/VersionListView.cpp @@ -29,9 +29,8 @@ VersionListView::VersionListView(QWidget *parent) void VersionListView::rowsInserted(const QModelIndex &parent, int start, int end) { - if(!m_itemCount) - viewport()->update(); m_itemCount += end-start+1; + updateEmptyViewPort(); QTreeView::rowsInserted(parent, start, end); } @@ -39,16 +38,14 @@ void VersionListView::rowsInserted(const QModelIndex &parent, int start, int end void VersionListView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) { m_itemCount -= end-start+1; - if(!m_itemCount) - viewport()->update(); + updateEmptyViewPort(); QTreeView::rowsInserted(parent, start, end); } void VersionListView::setModel(QAbstractItemModel *model) { m_itemCount = model->rowCount(); - if(!m_itemCount) - viewport()->update(); + updateEmptyViewPort(); QTreeView::setModel(model); } @@ -58,7 +55,10 @@ void VersionListView::reset() { m_itemCount = model()->rowCount(); } - viewport()->update(); + else { + m_itemCount = 0; + } + updateEmptyViewPort(); QTreeView::reset(); } @@ -82,6 +82,8 @@ void VersionListView::setEmptyMode(VersionListView::EmptyMode mode) void VersionListView::updateEmptyViewPort() { + setAccessibleDescription(currentEmptyString()); + if(!m_itemCount) { viewport()->update(); @@ -100,77 +102,60 @@ void VersionListView::paintEvent(QPaintEvent *event) } } -void VersionListView::paintInfoLabel(QPaintEvent *event) +QString VersionListView::currentEmptyString() const { - QString emptyString; + if(m_itemCount) { + return QString(); + } switch(m_emptyMode) { + default: case VersionListView::Empty: - return; + return QString(); case VersionListView::String: - emptyString = m_emptyString; - break; + return m_emptyString; case VersionListView::ErrorString: - emptyString = m_emptyErrorString; - break; + return m_emptyErrorString; } +} + + +void VersionListView::paintInfoLabel(QPaintEvent *event) const +{ + QString emptyString = currentEmptyString(); + //calculate the rect for the overlay QPainter painter(viewport()); painter.setRenderHint(QPainter::Antialiasing, true); QFont font("sans", 20); font.setBold(true); - + QRect bounds = viewport()->geometry(); bounds.moveTop(0); - QTextLayout layout(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 + auto innerBounds = bounds; + innerBounds.adjust(10, 10, -10, -10); + QColor background = QApplication::palette().color(QPalette::Foreground); QColor foreground = QApplication::palette().color(QPalette::Base); - /* - background.setAlpha(128 - scrollFade); - foreground.setAlpha(128 - scrollFade); - */ + 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); + + //check if we are allowed to draw in our area + if (!event->rect().intersects(wrapRect)) { + return; + } + painter.setBrush(QBrush(background)); painter.setPen(foreground); - painter.drawRoundedRect(rect, 5.0, 5.0); - foreground.setAlpha(190); + painter.drawRoundedRect(wrapRect, 5.0, 5.0); + painter.setPen(foreground); painter.setFont(font); - painter.drawText(rect, Qt::AlignCenter, lines.join("\n")); - + painter.drawText(textRect, Qt::AlignHCenter | Qt::TextWordWrap, emptyString); } - -/* -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); - } -} -*/ diff --git a/application/widgets/VersionListView.h b/application/widgets/VersionListView.h index d376d9e1..233479bb 100644 --- a/application/widgets/VersionListView.h +++ b/application/widgets/VersionListView.h @@ -46,8 +46,9 @@ protected slots: virtual void rowsInserted(const QModelIndex &parent, int start, int end) override; private: /* methods */ - void paintInfoLabel(QPaintEvent *event); + void paintInfoLabel(QPaintEvent *event) const; void updateEmptyViewPort(); + QString currentEmptyString() const; private: /* variables */ int m_itemCount = 0;