summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2013-09-01 13:40:44 +0200
committerTannin <devnull@localhost>2013-09-01 13:40:44 +0200
commit1e6c5f7c25ddd2094e26e6af1159ec5912448705 (patch)
tree83ff6e2fd35c1614f2e13ff22f0f7b8214ab042b /src
parent49e1dd23b699b499d9b715ef74cb7ca5b0189584 (diff)
- added a new column for not-yet-endorsed mods
- set categories menu no longer closes when the mouse cursor leaves the menu - MO will no longer change the endorsement flag if an update doesn't contain it - the column selection for the mod list can now only be accessed by mouse, hotkeys open the context menu of the mod - now displaying a progress dialog during login. For unknown reasons MO hangs during that time
Diffstat (limited to 'src')
-rw-r--r--src/categories.h1
-rw-r--r--src/mainwindow.cpp26
-rw-r--r--src/modinfo.cpp2
-rw-r--r--src/modlist.cpp2
-rw-r--r--src/modlistsortproxy.cpp4
-rw-r--r--src/nxmaccessmanager.cpp11
-rw-r--r--src/nxmaccessmanager.h2
7 files changed, 40 insertions, 8 deletions
diff --git a/src/categories.h b/src/categories.h
index 8ec573b2..75698149 100644
--- a/src/categories.h
+++ b/src/categories.h
@@ -46,6 +46,7 @@ public:
static const int CATEGORY_SPECIAL_UPDATEAVAILABLE = 10002;
static const int CATEGORY_SPECIAL_NOCATEGORY = 10003;
static const int CATEGORY_SPECIAL_CONFLICT = 10004;
+ static const int CATEGORY_SPECIAL_NOTENDORSED = 10005;
public:
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 93efb137..2988c602 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -2592,6 +2592,7 @@ void MainWindow::refreshFilters()
addFilterItem(NULL, tr("<Update>"), CategoryFactory::CATEGORY_SPECIAL_UPDATEAVAILABLE);
addFilterItem(NULL, tr("<No category>"), CategoryFactory::CATEGORY_SPECIAL_NOCATEGORY);
addFilterItem(NULL, tr("<Conflicted>"), CategoryFactory::CATEGORY_SPECIAL_CONFLICT);
+ addFilterItem(NULL, tr("<Not Endorsed>"), CategoryFactory::CATEGORY_SPECIAL_NOTENDORSED);
std::set<int> categoriesUsed;
for (unsigned int modIdx = 0; modIdx < ModInfo::getNumMods(); ++modIdx) {
@@ -3311,6 +3312,17 @@ void MainWindow::exportModListCSV()
}
}
+
+void addMenuAsPushButton(QMenu *menu, QMenu *subMenu)
+{
+ QPushButton *pushBtn = new QPushButton(subMenu->title());
+ pushBtn->setMenu(subMenu);
+ QWidgetAction *action = new QWidgetAction(menu);
+ action->setDefaultWidget(pushBtn);
+ menu->addAction(action);
+}
+
+
void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos)
{
try {
@@ -3319,6 +3331,7 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos)
m_ContextRow = mapToModel(&m_ModList, modList->indexAt(pos)).row();
QMenu menu;
+
menu.addAction(tr("Install Mod..."), this, SLOT(installMod_clicked()));
menu.addAction(tr("Enable all visible"), this, SLOT(enableVisibleMods()));
@@ -3343,13 +3356,16 @@ void MainWindow::on_modList_customContextMenuRequested(const QPoint &pos)
menu.addAction(tr("Restore Backup"), this, SLOT(restoreBackup_clicked()));
menu.addAction(tr("Remove Backup..."), this, SLOT(removeMod_clicked()));
} else {
- QMenu *addCategoryMenu = menu.addMenu(tr("Set Category"));
+ // Set categories is a separate menu connected to a push button. This way it doesn't simply close every time you hover the mouse outside
+ QMenu *addCategoryMenu = new QMenu(tr("Set Category"));
addCategories(addCategoryMenu, 0);
connect(addCategoryMenu, SIGNAL(aboutToHide()), this, SLOT(saveCategories()));
+ addMenuAsPushButton(&menu, addCategoryMenu);
- QMenu *primaryCategoryMenu = menu.addMenu(tr("Primary Category"));
+ QMenu *primaryCategoryMenu = new QMenu(tr("Primary Category"));
connect(primaryCategoryMenu, SIGNAL(aboutToShow()), this, SLOT(addPrimaryCategoryCandidates()));
connect(primaryCategoryMenu, SIGNAL(aboutToHide()), this, SLOT(savePrimaryCategory()));
+ addMenuAsPushButton(&menu, primaryCategoryMenu);
menu.addAction(tr("Rename Mod..."), this, SLOT(renameMod_clicked()));
menu.addAction(tr("Remove Mod..."), this, SLOT(removeMod_clicked()));
@@ -4146,7 +4162,6 @@ void MainWindow::modDetailsUpdated(bool)
void MainWindow::nxmUpdatesAvailable(const std::vector<int> &modIDs, QVariant userData, QVariant resultData, int)
{
m_ModsToUpdate -= modIDs.size();
-
QVariantList resultList = resultData.toList();
for (auto iter = resultList.begin(); iter != resultList.end(); ++iter) {
QVariantMap result = iter->toMap();
@@ -4159,8 +4174,9 @@ void MainWindow::nxmUpdatesAvailable(const std::vector<int> &modIDs, QVariant us
for (auto iter = info.begin(); iter != info.end(); ++iter) {
(*iter)->setNewestVersion(VersionInfo(result["version"].toString()));
(*iter)->setNexusDescription(result["description"].toString());
- if (NexusInterface::instance()->getAccessManager()->loggedIn()) {
- // don't use endorsement info if we're not logged in
+ if (NexusInterface::instance()->getAccessManager()->loggedIn() &&
+ result.contains("voted_by_user")) {
+ // don't use endorsement info if we're not logged in or if the response doesn't contain it
(*iter)->setIsEndorsed(result["voted_by_user"].toBool());
}
}
diff --git a/src/modinfo.cpp b/src/modinfo.cpp
index 5cae62be..8372af55 100644
--- a/src/modinfo.cpp
+++ b/src/modinfo.cpp
@@ -410,7 +410,7 @@ void ModInfoRegular::nxmDescriptionAvailable(int, QVariant, QVariant resultData)
QVariantMap result = resultData.toMap();
m_NewestVersion.parse(result["version"].toString());
m_NexusDescription = result["description"].toString();
- if (m_EndorsedState != ENDORSED_NEVER) {
+ if ((m_EndorsedState != ENDORSED_NEVER) && (result.contains("voted_by_user"))) {
m_EndorsedState = result["voted_by_user"].toBool() ? ENDORSED_TRUE : ENDORSED_FALSE;
}
m_LastNexusQuery = QDateTime::currentDateTime();
diff --git a/src/modlist.cpp b/src/modlist.cpp
index a08162e7..dc464497 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -747,7 +747,7 @@ bool ModList::eventFilter(QObject *obj, QEvent *event)
if (event->type() == QEvent::ContextMenu) {
QContextMenuEvent *contextEvent = static_cast<QContextMenuEvent*>(event);
QWidget *object = qobject_cast<QWidget*>(obj);
- if (object != NULL) {
+ if ((object != NULL) && (contextEvent->reason() == QContextMenuEvent::Mouse)) {
emit requestColumnSelect(object->mapToGlobal(contextEvent->pos()));
return true;
diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp
index 37509b12..53c03c6a 100644
--- a/src/modlistsortproxy.cpp
+++ b/src/modlistsortproxy.cpp
@@ -219,6 +219,10 @@ bool ModListSortProxy::filterMatches(ModInfo::Ptr info, bool enabled) const
case CategoryFactory::CATEGORY_SPECIAL_CONFLICT: {
if (!hasConflictFlag(info->getFlags())) return false;
} break;
+ case CategoryFactory::CATEGORY_SPECIAL_NOTENDORSED: {
+ ModInfo::EEndorsedState state = info->endorsedState();
+ return (state == ModInfo::ENDORSED_FALSE) || (state == ModInfo::ENDORSED_NEVER);
+ } break;
default: {
if (!info->categorySet(*iter)) return false;
} break;
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp
index dce2131a..008d20a6 100644
--- a/src/nxmaccessmanager.cpp
+++ b/src/nxmaccessmanager.cpp
@@ -23,10 +23,12 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "utility.h"
#include "selfupdater.h"
#include <QMessageBox>
+#include <QPushButton>
#include <QNetworkProxy>
#include <QNetworkRequest>
#include <QNetworkCookie>
#include <QNetworkCookieJar>
+#include <QCoreApplication>
#include <gameinfo.h>
#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
@@ -117,8 +119,13 @@ void NXMAccessManager::pageLogin()
postDataQuery = postData.encodedQuery();
#endif
- m_LoginReply = post(request, postDataQuery);
+ m_ProgressDialog.setLabelText(tr("Logging into Nexus"));
+ QList<QPushButton*> buttons = m_ProgressDialog.findChildren<QPushButton*>();
+ buttons.at(0)->setEnabled(false);
+ m_ProgressDialog.show();
+ QCoreApplication::processEvents(); // for some reason the whole app hangs during the login. This way the user has at least a little feedback
+ m_LoginReply = post(request, postDataQuery);
m_LoginTimeout.start();
connect(m_LoginReply, SIGNAL(finished()), this, SLOT(loginFinished()));
connect(m_LoginReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(loginError(QNetworkReply::NetworkError)));
@@ -138,6 +145,7 @@ void NXMAccessManager::loginTimeout()
void NXMAccessManager::loginError(QNetworkReply::NetworkError)
{
+ m_ProgressDialog.hide();
emit loginFailed(m_LoginReply->errorString());
m_LoginTimeout.stop();
m_LoginReply->deleteLater();
@@ -162,6 +170,7 @@ bool NXMAccessManager::hasLoginCookies() const
void NXMAccessManager::loginFinished()
{
+ m_ProgressDialog.hide();
if (hasLoginCookies()) {
emit loginSuccessful(true);
} else {
diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h
index 4e2b24ce..b0c43978 100644
--- a/src/nxmaccessmanager.h
+++ b/src/nxmaccessmanager.h
@@ -24,6 +24,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QNetworkAccessManager>
#include <QTimer>
#include <QNetworkReply>
+#include <QProgressDialog>
/**
@@ -85,6 +86,7 @@ private:
QTimer m_LoginTimeout;
QNetworkReply *m_LoginReply;
+ QProgressDialog m_ProgressDialog;
QString m_Username;
QString m_Password;