Compare commits

..
108 Commits
Author SHA1 Message Date
Brian Munro 2232bdfc77 Merge pull request #497 from Modorganizer2/Develop
Fix possible crash during write to disk error
2018-08-22 06:38:34 +02:00
LostDragonist 258bddb6b7 Fix possible crash during write to disk error 2018-08-21 15:59:22 -05:00
Brian Munro 364289db72 Merge pull request #495 from Modorganizer2/Develop
Release 2.1.5
2018-08-21 12:23:47 +02:00
LostDragonist ef771fd8ca Fix disabled menu item styling in Paper Dark theme 2018-08-20 00:55:18 -05:00
LostDragonist 2060df1585 Detect errors when writing downloads to disk and cancel download 2018-08-19 16:33:34 -05:00
LostDragonist 9a973ccf5f Center profile deletion dialog on parent 2018-08-19 13:02:54 -05:00
LostDragonist a2eb3e0266 Prevent user from deleting currently active profile 2018-08-19 13:02:30 -05:00
LostDragonist d65031c814 Allow user to cancel VFS mapping 2018-08-16 22:40:17 -05:00
LostDragonist c27e718fbd Add "enable/disable selected" to mod list context menu 2018-08-16 14:32:28 -05:00
LostDragonist 43b2df9077 Add "enable/disable selected" to plugin list context menu 2018-08-16 13:58:44 -05:00
LostDragonist 79b2e52a58 Fix another instance of "Open in Explorer" 2018-08-16 08:35:19 -05:00
LostDragonist 16a7ef78d3 Change version to 2.1.5 2018-08-16 08:19:05 -05:00
LostDragonist 74202cc743 Dracula theme: Make disabled widgets darker than enabled widgets
Fix by Kob, author of the Paper themes.
2018-08-16 01:29:01 -05:00
LostDragonist 8f86130759 Correct file category when manually querying info
The Nexus API appears to have been changed back in July 2018 to match what MO was expecting without the conversion.
2018-08-15 11:53:33 -05:00
LostDragonist 17e4ec7b13 Fix selecting the active profile when opening the profiles dialog 2018-08-12 19:59:54 -05:00
LostDragonist 9a426a2474 Revert "Improve robustness of endorsement checks"
This reverts commit fc8a6b358f.
2018-08-12 12:33:22 -05:00
LostDragonist 80594d6e1a Set toolbar widget names later to catch the problems and update widgets 2018-08-12 12:13:47 -05:00
Al12rs 56473e0ec8 Updated "Thanks". 2018-08-07 19:57:23 +02:00
LostDragonist 71988e386c Modify dark and dracula stylesheets to allow text colors on download widgets 2018-08-06 21:40:59 -05:00
LostDragonist 5e7c0fddf0 Update Paper themes by 6788-00 to version 3.0.1 2018-08-06 21:37:05 -05:00
Al12rs b0c15c9cfb Added Open File option to downloads tab. 2018-08-06 20:17:57 +02:00
Al12rs f92027bea6 Merge PR 2018-08-06 19:54:45 +02:00
Al a31b5495b8 Merge pull request #469 from Freso/minor-fixups
A couple of minor fixes
2018-08-06 16:13:18 +02:00
Frederik “Freso” S. Olesen fc19486f53 Fix capitalisation of "Explorer"
1. Explorer is a specific program, so it should be treated as a proper
   noun, and thus capitalised.
2. Other menu items in the same menu are Title Cases, so it looks out of
   place that this item is not.
2018-08-06 15:17:23 +02:00
Frederik “Freso” S. Olesen 232bbfb23b Fix DownloadManager::openInDownloadsFolder error message 2018-08-06 13:23:28 +02:00
Frederik “Freso” S. Olesen 2af99f2170 Clean up DownloadManager::openFile 2018-08-06 13:21:08 +02:00
Frederik “Freso” S. Olesen 796224d733 Add new "Open File" right-click dialog for Downloads
This enables the user to directly open the downloaded archived/file
which can be useful for e.g., inspection of what's inside or if they
need to copy files from inside the archive to somewhere else. Saves a
step compared to "Show in Folder" and then opening the file.
2018-08-06 12:21:02 +02:00
LostDragonist 1e4b5d2436 Set the names of the toolbar widgets to allow styling
QToolButton#foo where foo is one of:
  actionChange_Game
  actionInstallMod
  actionNexus
  actionAdd_Profile
  actionModify_Executables
  actionTool
  actionSettings
  seperator
  actionEndorseMO
  actionProblems
  actionUpdate
  actionHelp
2018-08-05 15:56:39 -05:00
LostDragonist 94ef8dffbc List load order backups from most recent to oldest 2018-08-04 22:16:39 -05:00
LePresidente 7b1821a518 Reverted bad commit, should of removed VS_FF_PRERELEASE 2018-08-04 11:24:49 +02:00
LePresidente fb0d4d5e5a use VER_FILEVERSION_STR instead of VER_FILEVERSION so pre-alpha is not shown 2018-08-04 10:35:56 +02:00
Brian Munro 9a3a15b1f6 Merge pull request #454 from Modorganizer2/Develop
Release 2.1.4
2018-08-02 09:15:12 +02:00
Al12rs 1ea43586d8 Merge branch 'Develop' of https://github.com/Modorganizer2/modorganizer into Develop 2018-08-01 20:12:32 +02:00
Al12rs fd51434e5e Enabled Ctrl+C to copy selected stuff instead of the entire log. No one used it before and now it's much more practical. 2018-08-01 20:04:59 +02:00
LostDragonist 7eb4b33214 Tweak shading of mods and plugins to better support dark themes 2018-08-01 12:55:36 -05:00
Al12rs e1e367c7ea Added CTRL+Doubleclick on plugin list as well 2018-08-01 17:55:07 +02:00
Al12rs 696bb3bc47 Added CTRL+Double Click on Modlist to open in Explorer 2018-08-01 17:18:07 +02:00
Al12rs 10be66a62a Revert "Temporarely disable the BSA list refresh if it is hidden from view. this will need to be reversted once the Bsa changes are added I presume."
This reverts commit 8f28e0af36.
2018-08-01 17:07:35 +02:00
LostDragonist a02b920b19 Force nxmhandler.exe registration when the associate button is clicked
This allows the register dialog to appear when the user had previously selected "No, don't ask again".  If a user is clicking this button, there's a good chance they want MO to be the primary nxm handler.
2018-07-27 12:34:28 -05:00
LostDragonist 2f8e5b4f69 Update translation file 2018-07-24 14:00:26 -05:00
LostDragonist 385765ecdd Truncate strings longer than 1024 characters in the plugin list tooltip 2018-07-23 14:13:12 -05:00
LostDragonist 447a2169fe Allow more characters in instance names and add an error message
Previously allowed:  "A-Za-z0-9 "
Now allowed:         "A-Za-z0-9 !@#$%^()_+-=[]{};'."
2018-07-22 19:44:39 -05:00
LostDragonist fc8a6b358f Improve robustness of endorsement checks
At times, the voted_by_user item is returned as Invalid.  toBool() causes this to be false, meaning the item is seen as not endorsed.  Now, the endorsement state is not checked if the data is invalid.
2018-07-22 14:28:38 -05:00
Al12rs edf608ab23 Allow normal QAbstractItemModel event handling for mainwindow. Somehow before it wouldn't work. 2018-07-22 15:49:40 +02:00
Al12rs d02df7e4b4 Avoided downloads defaulting to "File Time" sorting at each startup.
Improved downloads tab header sizes and resize policy.
2018-07-21 23:43:04 +02:00
Al12rs cc63717060 Added "Open Mods folder" to "Open Folder" context menu. 2018-07-21 20:09:25 +02:00
Al12rs 8f28e0af36 Temporarely disable the BSA list refresh if it is hidden from view. this will need to be reversted once the Bsa changes are added I presume. 2018-07-21 20:01:40 +02:00
Al12rs e80bb3a837 Check if there is actually something in overwrite to delete before asking confirmation. 2018-07-18 16:14:16 +02:00
Al12rs f6ecb93d46 Set delete Key to recursively clear overwrite with confirmation message. 2018-07-18 16:00:19 +02:00
Al12rs 4f14598cfc Changed size rappresentation in downloads compact view. 2018-07-18 12:06:35 +02:00
Al12rs ce2494ba20 Don't show info dialog for unmanaged pluugins. 2018-07-18 12:03:02 +02:00
Al12rs d5f3bee642 Changed unit check. 2018-07-18 12:01:50 +02:00
Al12rs b38957d853 Small visual fix for size positioning in compact downloads. 2018-07-18 12:00:55 +02:00
Al12rs f824d255a2 Added clarification to loads archives tooltip. 2018-07-17 19:51:30 +02:00
Al12rs 344b83957e Revert "Fix download index in downloadFinished"
This reverts commit 942e656a71.
2018-07-17 18:35:32 +02:00
Al12rs 023cacab7f Added ability to open mod information window by double cliking on plugins. 2018-07-17 16:26:17 +02:00
Al12rs 35bbe0001e Added a flag to the plugin list indicating if a certain plugin has one or more archives attached.
Changed the tooltip to list the loaded archives.
Fixed tool tip to have titles for subsections.
2018-07-17 14:37:50 +02:00
Al12rs 75478f68a1 Avoid asking users if they are sure they want to close of all downlaods are paused. 2018-07-17 13:32:53 +02:00
Al12rs 5a0b8b431c Added Contains INI files content filter and checking. 2018-07-17 13:10:08 +02:00
Al12rs 61b33a8351 Added feather and scroll content icon to rappresent ini files. Icon curtesy of WolfHeartAurora. 2018-07-17 13:09:57 +02:00
Al 103e3f3098 Merge pull request #438 from LostDragonist/Develop
Added support for selecting multiple mod for multiple modlist options.
Added check for Windows Event Service before spawning new hooked processes.
2018-07-17 02:08:17 +02:00
Al12rs 872c33fe55 Added new "Hide Uninstalled" and "Delete Uninstalled" options to downloads tab. 2018-07-17 00:49:41 +02:00
Al12rs 9ddb26ea51 Added size label to compact download view. 2018-07-17 00:10:30 +02:00
Al12rs 1867c20f02 Added sortable "Size" column to the downlaods tab. 2018-07-17 00:10:03 +02:00
LostDragonist 6552054e58 Detect if the Windows Event Log service is not running 2018-07-16 15:46:44 -05:00
LostDragonist a830f3e09e Allow "unignore update" to work with multiple mods 2018-07-16 15:46:44 -05:00
LostDragonist eaf3655492 Allow "ignore update" to work with multiple mods 2018-07-16 15:46:44 -05:00
LostDragonist 952f1fe8cd Allow "open in explorer" to work with multiple mods 2018-07-16 15:46:44 -05:00
LostDragonist b4530eb843 Allow "mark as converted" to work with multiple mods 2018-07-16 15:46:43 -05:00
LostDragonist f20a1f6a84 Allow "ignore missing data" to work with multiple mods 2018-07-16 15:46:43 -05:00
LostDragonist 942e656a71 Fix download index in downloadFinished
An index of 0 is valid as this is a bog standard array.  This resolves an instance of the warning "no download index 0".
2018-07-16 15:46:43 -05:00
LostDragonist 7f3dc586b0 Redirect endorsements of MO2 to the Skyrim SE nexus 2018-07-16 15:46:43 -05:00
Al12rs 2524d65441 Added "Open in Folder" option to downloads tab. 2018-07-16 20:56:47 +02:00
Al12rs 5efddbd515 Chnged download speed to be a little more consistant in display, to avoid the progrss bar jumping around all the time. Chnaged the kb->MB jumps to happen at 1000 instead of 1024 to avoid going in the 4 digits, but still divide by 1024 to keep units acuurate. 2018-07-16 14:18:25 +02:00
Silarn 181de232f4 Potential fix for corrupted downloads 2018-06-25 20:50:49 -05:00
Al12rs 1f9103c24e Added the path of the managed game in the settings menu under the path tab, it's read only for now as allowing the user to change it would probably require a lot more work. 2018-06-22 02:47:58 +02:00
Al12rs 2d49ba2bef Add open in explorer button to Overwrite dialog. 2018-06-21 18:54:20 +02:00
Al12rs e41c97b64f Merge branch 'Develop' of https://github.com/Modorganizer2/modorganizer into Develop1 2018-06-20 21:33:27 +02:00
Al12rs b7d6bbb451 Fix for downloads getting stuck after pausing them.
Disabled timer check as it appeared to terminate some downloads early.
2018-06-20 19:33:56 +02:00
Al 4a765cc152 Merge pull request #410 from LostDragonist/Develop
Extend mod backups and load order backups to a maximum of 10
2018-06-20 16:17:29 +02:00
LostDragonist 30f170c10d Extend mod backups and load order backups to a maximum of 10 2018-06-20 08:45:05 -05:00
Al12rs b6aa12b323 Fix for downloads getting insta-completed if there isn't enough bandwidth for them to procede. Now they will instead remain in the download state and continue once the bandwidth is available.
There is much room for improvement here but for now I guess this will avoid MO simply stopping the download.
2018-06-19 23:13:06 +02:00
Al 19d80cc23d Merge pull request #400 from LostDragonist/Develop
Sort by game and fix for instance names
2018-06-10 09:55:41 +02:00
LostDragonist 0c4b1e9a92 Prevent instances from ending in a space
Windows directories are not allowed to end in a space.  Allowing
this creates a broken directory that is difficult for the user
to remove.
2018-06-09 10:44:23 -07:00
Lost Dragonist cacf7e0542 Allow sorting by "source game" column 2018-06-08 22:48:53 -05:00
Silarn f09ec53fcf Updated strings 2018-06-08 18:05:01 -05:00
Al12rs ddb40b712e *Avoided some unnecessary refreshes while removing mods.
*Added "Visit on Nexus" menu entry in the downloads tab.

*Added confirmation message when deleting a single download.

*Changed text of messages to more easily distinguish deleting from hiding.
2018-05-25 15:33:53 +02:00
Al12rs 186f26b71e Added un-hide all option to downlods tab.
Improved performace when hiding/unhiding. There is still room for improvement for hiding but it requires refactoring the function
2018-05-21 01:27:13 +02:00
Al12rs 6d6444c126 Made downlods file sizes human readable instead of just being KB 2018-05-20 23:53:57 +02:00
Al12rs 4b66c6c1ef Added "Open Plugins folder" option to Open folder menu. 2018-05-20 23:02:50 +02:00
Al 08f35d6519 Merge pull request #369 from iaz3/Develop
Fix a memory leak in updateToolBar
2018-05-18 14:02:02 +02:00
Diana 6617be8ef9 Fix a memory leak in updateToolBar
updateToolBar was creating new QActions and QWidgets every call, without cleaning them up.

The spacer, help widgets, and toolbuttons only need to be created once.
Those have been moved out into the MainWindow constructor

updateToolBar is called in various places, importantly when adding/removing executable shortcuts.

Also adds a deleteLater() call to clean up executable shortcut actions.
2018-05-18 07:45:13 -04:00
Al 5a5bfee712 Merge pull request #362 from Al12rs/dirWatcher
Downloads tab: fix for freezes and greatly improved performance and responsiveness
2018-05-17 19:59:06 +02:00
Silarn 2fc55ccc86 Updated strings for downloads 2018-05-16 23:54:50 -05:00
Al12rs 8731159bfb Huge performace improvements for downloads tab by disabling the dirWatcher triggered refreshes.
Avoid app freezes caused by stacked refresh calls.
Added chack to see if a download is alerady hidden before trying to hide it.
Made sure to refresh Download tab where it was othwerwise relying in the dirwatcher to refresh.
2018-05-17 00:03:10 +02:00
Al12rs 1c6543454e Initial work on avoiding the spamming of the Downlods tab refresh caused by the fileSystemWatcher picking up changes made by MO itself and triggering multiple refreshes 2018-05-17 00:02:34 +02:00
Silarn 941c50bff9 Add UA to resume and fix edge case for hung download check 2018-05-16 14:58:43 -05:00
Silarn 1e6e055f39 Add the MO user agent string to the download requests (fixes EU#1) 2018-05-16 11:14:44 -05:00
Jeremy Rimpo 81e329fb39 Merge pull request #361 from AnyOldName3/even-better-version-parsing
Move improved version parsing to util.h and use it everywhere.
2018-05-16 09:32:13 -05:00
AnyOldName3 15db1b76f7 Move improved version parsing to util.h and use it everywhere. 2018-05-16 00:42:31 +01:00
Jeremy Rimpo 75e6c72ae4 Merge pull request #360 from AnyOldName3/better-version-parsing
Better version parsing
2018-05-15 17:55:02 -05:00
AnyOldName3 9c1806cc74 Remove sneaky test qDebug instance. 2018-05-15 23:45:15 +01:00
AnyOldName3 8f905e1d49 Change how the VersionInfo object is created from version.rc such that non-release builds are possible and get labelled as such 2018-05-15 23:43:35 +01:00
Silarn 2ee5f0e96d Push version update for 2.1.4 dev 2018-05-15 12:46:49 -05:00
Silarn 0d220b6b41 Fixes for download errors and retrying with alternate mirrors 2018-05-15 11:13:16 -05:00
Silarn decbbb611e Download resume fixes for restarting MO, hung downloads 2018-05-13 18:32:59 -05:00
Silarn aeb0b42cde Refresh the sort proxy when the data is changed 2018-05-10 11:21:27 -05:00
Silarn 38391b10e9 Fix plugin lock slot typo 2018-05-10 09:21:02 -05:00
51 changed files with 2853 additions and 1521 deletions
+6 -1
View File
@@ -189,6 +189,11 @@
<property name="text">
<string notr="true">Silarn</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">LostDragonist</string>
</property>
</item>
</widget>
</item>
@@ -208,7 +213,7 @@
</property>
<item>
<property name="text">
<string notr="true">AnyOldName3 (Python Plugins)</string>
<string notr="true">AnyOldName3</string>
</property>
</item>
</widget>
+2 -1
View File
@@ -40,7 +40,7 @@ int DownloadList::rowCount(const QModelIndex&) const
int DownloadList::columnCount(const QModelIndex&) const
{
return 3;
return 4;
}
@@ -63,6 +63,7 @@ QVariant DownloadList::headerData(int section, Qt::Orientation orientation, int
switch (section) {
case COL_NAME: return tr("Name");
case COL_FILETIME: return tr("Filetime");
case COL_SIZE: return tr("Size");
default: return tr("Done");
}
} else {
+2 -1
View File
@@ -39,7 +39,8 @@ public:
enum EColumn {
COL_NAME = 0,
COL_FILETIME,
COL_STATUS
COL_STATUS,
COL_SIZE
};
public:
+2
View File
@@ -47,6 +47,8 @@ bool DownloadListSortProxy::lessThan(const QModelIndex &left,
return m_Manager->getFileTime(leftIndex) < m_Manager->getFileTime(rightIndex);
} else if (left.column() == DownloadList::COL_STATUS) {
return m_Manager->getState(leftIndex) < m_Manager->getState(rightIndex);
} else if(left.column() == DownloadList::COL_SIZE){
return m_Manager->getFileSize(leftIndex) < m_Manager->getFileSize(rightIndex);
} else {
return leftIndex < rightIndex;
}
+95 -16
View File
@@ -82,11 +82,30 @@ void DownloadListWidgetDelegate::drawCache(QPainter *painter, const QStyleOption
{
QRect rect = option.rect;
rect.setLeft(0);
rect.setWidth(m_View->columnWidth(0) + m_View->columnWidth(1) + m_View->columnWidth(2));
rect.setWidth(m_View->columnWidth(0) + m_View->columnWidth(1) + m_View->columnWidth(2) + m_View->columnWidth(3));
painter->drawPixmap(rect, cache);
}
QString DownloadListWidgetDelegate::sizeFormat(quint64 size) const
{
qreal calc = size;
QStringList list;
list << "KB" << "MB" << "GB" << "TB";
QStringListIterator i(list);
QString unit("byte(s)");
while (calc >= 1024.0 && i.hasNext())
{
unit = i.next();
calc /= 1024.0;
}
return QString().setNum(calc, 'f', 2) + " " + unit;
}
void DownloadListWidgetDelegate::paintPendingDownload(int downloadIndex) const
{
std::tuple<QString, int, int> nexusids = m_Manager->getPendingDownload(downloadIndex);
@@ -106,9 +125,9 @@ void DownloadListWidgetDelegate::paintRegularDownload(int downloadIndex) const
name.append("...");
}
m_NameLabel->setText(name);
m_SizeLabel->setText(QString::number(m_Manager->getFileSize(downloadIndex) / 1024));
m_SizeLabel->setText(sizeFormat(m_Manager->getFileSize(downloadIndex) ));
DownloadManager::DownloadState state = m_Manager->getState(downloadIndex);
if ((state == DownloadManager::STATE_PAUSED) || (state == DownloadManager::STATE_ERROR)) {
if ((state == DownloadManager::STATE_PAUSED) || (state == DownloadManager::STATE_ERROR) || (state == DownloadManager::STATE_PAUSING)) {
QPalette labelPalette;
m_InstallLabel->setVisible(true);
m_Progress->setVisible(false);
@@ -174,7 +193,7 @@ void DownloadListWidgetDelegate::paint(QPainter *painter, const QStyleOptionView
return;
}
m_ItemWidget->resize(QSize(m_View->columnWidth(0) + m_View->columnWidth(1) + m_View->columnWidth(2), option.rect.height()));
m_ItemWidget->resize(QSize(m_View->columnWidth(0) + m_View->columnWidth(1) + m_View->columnWidth(2) + m_View->columnWidth(3), option.rect.height()));
int downloadIndex = index.data().toInt();
@@ -226,7 +245,11 @@ void DownloadListWidgetDelegate::issueQueryInfo()
void DownloadListWidgetDelegate::issueDelete()
{
emit removeDownload(m_ContextRow, true);
if (QMessageBox::question(nullptr, tr("Delete Files?"),
tr("This will permanently delete the selected download."),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
emit removeDownload(m_ContextRow, true);
}
}
void DownloadListWidgetDelegate::issueRemoveFromView()
@@ -236,7 +259,27 @@ void DownloadListWidgetDelegate::issueRemoveFromView()
void DownloadListWidgetDelegate::issueRestoreToView()
{
emit restoreDownload(m_ContextRow);
emit restoreDownload(m_ContextRow);
}
void DownloadListWidgetDelegate::issueRestoreToViewAll()
{
emit restoreDownload(-1);
}
void DownloadListWidgetDelegate::issueVisitOnNexus()
{
emit visitOnNexus(m_ContextRow);
}
void DownloadListWidgetDelegate::issueOpenFile()
{
emit openFile(m_ContextRow);
}
void DownloadListWidgetDelegate::issueOpenInDownloadsFolder()
{
emit openInDownloadsFolder(m_ContextRow);
}
void DownloadListWidgetDelegate::issueCancel()
@@ -256,7 +299,7 @@ void DownloadListWidgetDelegate::issueResume()
void DownloadListWidgetDelegate::issueDeleteAll()
{
if (QMessageBox::question(nullptr, tr("Are you sure?"),
if (QMessageBox::question(nullptr, tr("Delete Files?"),
tr("This will remove all finished downloads from this list and from disk."),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
emit removeDownload(-1, true);
@@ -265,13 +308,22 @@ void DownloadListWidgetDelegate::issueDeleteAll()
void DownloadListWidgetDelegate::issueDeleteCompleted()
{
if (QMessageBox::question(nullptr, tr("Are you sure?"),
if (QMessageBox::question(nullptr, tr("Delete Files?"),
tr("This will remove all installed downloads from this list and from disk."),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
emit removeDownload(-2, true);
}
}
void DownloadListWidgetDelegate::issueDeleteUninstalled()
{
if (QMessageBox::question(nullptr, tr("Delete Files?"),
tr("This will remove all uninstalled downloads from this list and from disk."),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
emit removeDownload(-3, true);
}
}
void DownloadListWidgetDelegate::issueRemoveFromViewAll()
{
if (QMessageBox::question(nullptr, tr("Are you sure?"),
@@ -290,6 +342,15 @@ void DownloadListWidgetDelegate::issueRemoveFromViewCompleted()
}
}
void DownloadListWidgetDelegate::issueRemoveFromViewUninstalled()
{
if (QMessageBox::question(nullptr, tr("Are you sure?"),
tr("This will remove all uninstalled downloads from this list (but NOT from disk)."),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
emit removeDownload(-3, false);
}
}
bool DownloadListWidgetDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
const QStyleOptionViewItem &option, const QModelIndex &index)
{
@@ -298,7 +359,7 @@ bool DownloadListWidgetDelegate::editorEvent(QEvent *event, QAbstractItemModel *
QModelIndex sourceIndex = qobject_cast<QSortFilterProxyModel*>(model)->mapToSource(index);
if (m_Manager->getState(sourceIndex.row()) >= DownloadManager::STATE_READY) {
emit installDownload(sourceIndex.row());
} else if (m_Manager->getState(sourceIndex.row()) >= DownloadManager::STATE_PAUSED) {
} else if ((m_Manager->getState(sourceIndex.row()) >= DownloadManager::STATE_PAUSED) || (m_Manager->getState(sourceIndex.row()) == DownloadManager::STATE_PAUSING)) {
emit resumeDownload(sourceIndex.row());
}
return true;
@@ -315,7 +376,15 @@ bool DownloadListWidgetDelegate::editorEvent(QEvent *event, QAbstractItemModel *
menu.addAction(tr("Install"), this, SLOT(issueInstall()));
if (m_Manager->isInfoIncomplete(m_ContextRow)) {
menu.addAction(tr("Query Info"), this, SLOT(issueQueryInfo()));
}else {
menu.addAction(tr("Visit on Nexus"), this,SLOT(issueVisitOnNexus()));
}
menu.addAction(tr("Open File"), this, SLOT(issueOpenFile()));
menu.addAction(tr("Show in Folder"), this, SLOT(issueOpenInDownloadsFolder()));
menu.addSeparator();
menu.addAction(tr("Delete"), this, SLOT(issueDelete()));
if (hidden) {
menu.addAction(tr("Un-Hide"), this, SLOT(issueRestoreToView()));
@@ -325,20 +394,30 @@ bool DownloadListWidgetDelegate::editorEvent(QEvent *event, QAbstractItemModel *
} else if (state == DownloadManager::STATE_DOWNLOADING){
menu.addAction(tr("Cancel"), this, SLOT(issueCancel()));
menu.addAction(tr("Pause"), this, SLOT(issuePause()));
} else if ((state == DownloadManager::STATE_PAUSED) || (state == DownloadManager::STATE_ERROR)) {
menu.addAction(tr("Remove"), this, SLOT(issueDelete()));
menu.addAction(tr("Show in Folder"), this, SLOT(issueOpenInDownloadsFolder()));
} else if ((state == DownloadManager::STATE_PAUSED) || (state == DownloadManager::STATE_ERROR) || (state == DownloadManager::STATE_PAUSING)) {
menu.addAction(tr("Delete"), this, SLOT(issueDelete()));
menu.addAction(tr("Resume"), this, SLOT(issueResume()));
menu.addAction(tr("Show in Folder"), this, SLOT(issueOpenInDownloadsFolder()));
}
menu.addSeparator();
}
menu.addAction(tr("Delete Installed..."), this, SLOT(issueDeleteCompleted()));
menu.addAction(tr("Delete Uninstalled..."), this, SLOT(issueDeleteUninstalled()));
menu.addAction(tr("Delete All..."), this, SLOT(issueDeleteAll()));
if (!hidden) {
menu.addSeparator();
menu.addAction(tr("Hide Installed..."), this, SLOT(issueRemoveFromViewCompleted()));
menu.addAction(tr("Hide All..."), this, SLOT(issueRemoveFromViewAll()));
}
if (!hidden) {
menu.addSeparator();
menu.addAction(tr("Hide Installed..."), this, SLOT(issueRemoveFromViewCompleted()));
menu.addAction(tr("Hide Uninstalled..."), this, SLOT(issueRemoveFromViewUninstalled()));
menu.addAction(tr("Hide All..."), this, SLOT(issueRemoveFromViewAll()));
}
if (hidden) {
menu.addSeparator();
menu.addAction(tr("Un-Hide All..."), this, SLOT(issueRestoreToViewAll()));
}
menu.exec(mouseEvent->globalPos());
event->accept();
+11
View File
@@ -71,14 +71,19 @@ signals:
void cancelDownload(int index);
void pauseDownload(int index);
void resumeDownload(int index);
void visitOnNexus(int index);
void openFile(int index);
void openInDownloadsFolder(int index);
protected:
QString sizeFormat(quint64 size) const;
bool editorEvent(QEvent *event, QAbstractItemModel *model,
const QStyleOptionViewItem &option, const QModelIndex &index);
private:
void drawCache(QPainter *painter, const QStyleOptionViewItem &option, const QPixmap &cache) const;
private slots:
@@ -87,13 +92,19 @@ private slots:
void issueDelete();
void issueRemoveFromView();
void issueRestoreToView();
void issueRestoreToViewAll();
void issueVisitOnNexus();
void issueOpenFile();
void issueOpenInDownloadsFolder();
void issueCancel();
void issuePause();
void issueResume();
void issueDeleteAll();
void issueDeleteCompleted();
void issueDeleteUninstalled();
void issueRemoveFromViewAll();
void issueRemoveFromViewCompleted();
void issueRemoveFromViewUninstalled();
void issueQueryInfo();
void stateChanged(int row, DownloadManager::DownloadState);
+3
View File
@@ -86,6 +86,9 @@
<widget class="QLabel" name="label_2">
<property name="text">
<string notr="true">KB</string>
</property>
<property name="visible">
<bool>false</bool>
</property>
</widget>
</item>
+89 -14
View File
@@ -81,18 +81,35 @@ void DownloadListWidgetCompactDelegate::drawCache(QPainter *painter, const QStyl
{
QRect rect = option.rect;
rect.setLeft(0);
rect.setWidth(m_View->columnWidth(0) + m_View->columnWidth(1) + m_View->columnWidth(2));
rect.setWidth(m_View->columnWidth(0) + m_View->columnWidth(1) + m_View->columnWidth(2) + m_View->columnWidth(3));
painter->drawPixmap(rect, cache);
}
QString DownloadListWidgetCompactDelegate::sizeFormat(quint64 size) const
{
qreal calc = size;
QStringList list;
list << "KB" << "MB" << "GB" << "TB";
QStringListIterator i(list);
QString unit("byte(s)");
while (calc >= 1024.0 && i.hasNext())
{
unit = i.next();
calc /= 1024.0;
}
return QString().setNum(calc, 'f', 2) + " " + unit;
}
void DownloadListWidgetCompactDelegate::paintPendingDownload(int downloadIndex) const
{
std::tuple<QString, int, int> nexusids = m_Manager->getPendingDownload(downloadIndex);
m_NameLabel->setText(tr("< game %1 mod %2 file %3 >").arg(std::get<0>(nexusids)).arg(std::get<1>(nexusids)).arg(std::get<2>(nexusids)));
if (m_SizeLabel != nullptr) {
m_SizeLabel->setText("???");
}
//if (m_SizeLabel != nullptr) {
// m_SizeLabel->setText("???");
//}
m_DoneLabel->setVisible(true);
m_DoneLabel->setText(tr("Pending"));
m_Progress->setVisible(false);
@@ -110,11 +127,15 @@ void DownloadListWidgetCompactDelegate::paintRegularDownload(int downloadIndex)
DownloadManager::DownloadState state = m_Manager->getState(downloadIndex);
if ((m_SizeLabel != nullptr) && (state >= DownloadManager::STATE_READY)) {
m_SizeLabel->setText(QString::number(m_Manager->getFileSize(downloadIndex) / 1048576));
if (m_SizeLabel != nullptr) {
m_SizeLabel->setText(sizeFormat(m_Manager->getFileSize(downloadIndex)) + " ");
m_SizeLabel->setVisible(true);
}
//else {
// m_SizeLabel->setVisible(false);
//}
if ((state == DownloadManager::STATE_PAUSED) || (state == DownloadManager::STATE_ERROR)) {
if ((state == DownloadManager::STATE_PAUSED) || (state == DownloadManager::STATE_ERROR) || (state == DownloadManager::STATE_PAUSING)) {
m_DoneLabel->setVisible(true);
m_Progress->setVisible(false);
m_DoneLabel->setText(QString("%1<img src=\":/MO/gui/inactive\">").arg(tr("Paused")));
@@ -153,7 +174,7 @@ void DownloadListWidgetCompactDelegate::paint(QPainter *painter, const QStyleOpt
return;
}
m_ItemWidget->resize(QSize(m_View->columnWidth(0) + m_View->columnWidth(1) + m_View->columnWidth(2), option.rect.height()));
m_ItemWidget->resize(QSize(m_View->columnWidth(0) + m_View->columnWidth(1) + m_View->columnWidth(2) + m_View->columnWidth(3), option.rect.height()));
if (index.row() % 2 == 1) {
m_ItemWidget->setBackgroundRole(QPalette::AlternateBase);
} else {
@@ -209,7 +230,11 @@ void DownloadListWidgetCompactDelegate::issueQueryInfo()
void DownloadListWidgetCompactDelegate::issueDelete()
{
emit removeDownload(m_ContextIndex.row(), true);
if (QMessageBox::question(nullptr, tr("Are you sure?"),
tr("This will permanently delete the selected download."),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
emit removeDownload(m_ContextIndex.row(), true);
}
}
void DownloadListWidgetCompactDelegate::issueRemoveFromView()
@@ -217,11 +242,32 @@ void DownloadListWidgetCompactDelegate::issueRemoveFromView()
emit removeDownload(m_ContextIndex.row(), false);
}
void DownloadListWidgetCompactDelegate::issueVisitOnNexus()
{
emit visitOnNexus(m_ContextIndex.row());
}
void DownloadListWidgetCompactDelegate::issueOpenFile()
{
emit openFile(m_ContextIndex.row());
}
void DownloadListWidgetCompactDelegate::issueOpenInDownloadsFolder()
{
emit openInDownloadsFolder(m_ContextIndex.row());
}
void DownloadListWidgetCompactDelegate::issueRestoreToView()
{
emit restoreDownload(m_ContextIndex.row());
emit restoreDownload(m_ContextIndex.row());
}
void DownloadListWidgetCompactDelegate::issueRestoreToViewAll()
{
emit restoreDownload(-1);
}
void DownloadListWidgetCompactDelegate::issueCancel()
{
emit cancelDownload(m_ContextIndex.row());
@@ -255,6 +301,15 @@ void DownloadListWidgetCompactDelegate::issueDeleteCompleted()
}
}
void DownloadListWidgetCompactDelegate::issueDeleteUninstalled()
{
if (QMessageBox::question(nullptr, tr("Are you sure?"),
tr("This will remove all uninstalled downloads from this list and from disk."),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
emit removeDownload(-3, true);
}
}
void DownloadListWidgetCompactDelegate::issueRemoveFromViewAll()
{
if (QMessageBox::question(nullptr, tr("Are you sure?"),
@@ -273,6 +328,15 @@ void DownloadListWidgetCompactDelegate::issueRemoveFromViewCompleted()
}
}
void DownloadListWidgetCompactDelegate::issueRemoveFromViewUninstalled()
{
if (QMessageBox::question(nullptr, tr("Are you sure?"),
tr("This will permanently remove all uninstalled downloads from this list (but NOT from disk)."),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
emit removeDownload(-3, false);
}
}
bool DownloadListWidgetCompactDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
const QStyleOptionViewItem &option, const QModelIndex &index)
@@ -282,7 +346,7 @@ bool DownloadListWidgetCompactDelegate::editorEvent(QEvent *event, QAbstractItem
QModelIndex sourceIndex = qobject_cast<QSortFilterProxyModel*>(model)->mapToSource(index);
if (m_Manager->getState(sourceIndex.row()) >= DownloadManager::STATE_READY) {
emit installDownload(sourceIndex.row());
} else if (m_Manager->getState(sourceIndex.row()) >= DownloadManager::STATE_PAUSED) {
} else if ((m_Manager->getState(sourceIndex.row()) >= DownloadManager::STATE_PAUSED) || (m_Manager->getState(sourceIndex.row()) == DownloadManager::STATE_PAUSING)) {
emit resumeDownload(sourceIndex.row());
}
return true;
@@ -299,7 +363,12 @@ bool DownloadListWidgetCompactDelegate::editorEvent(QEvent *event, QAbstractItem
menu.addAction(tr("Install"), this, SLOT(issueInstall()));
if (m_Manager->isInfoIncomplete(m_ContextIndex.row())) {
menu.addAction(tr("Query Info"), this, SLOT(issueQueryInfo()));
}else {
menu.addAction(tr("Visit on Nexus"), this, SLOT(issueVisitOnNexus()));
}
menu.addAction(tr("Open File"), this, SLOT(issueOpenFile()));
menu.addAction(tr("Show in Folder"), this, SLOT(issueOpenInDownloadsFolder()));
menu.addSeparator();
menu.addAction(tr("Delete"), this, SLOT(issueDelete()));
if (hidden) {
menu.addAction(tr("Un-Hide"), this, SLOT(issueRestoreToView()));
@@ -309,20 +378,27 @@ bool DownloadListWidgetCompactDelegate::editorEvent(QEvent *event, QAbstractItem
} else if (state == DownloadManager::STATE_DOWNLOADING){
menu.addAction(tr("Cancel"), this, SLOT(issueCancel()));
menu.addAction(tr("Pause"), this, SLOT(issuePause()));
} else if ((state == DownloadManager::STATE_PAUSED) || (state == DownloadManager::STATE_ERROR)) {
menu.addAction(tr("Show in Folder"), this, SLOT(issueOpenInDownloadsFolder()));
} else if ((state == DownloadManager::STATE_PAUSED) || (state == DownloadManager::STATE_ERROR) || (state == DownloadManager::STATE_PAUSING)) {
menu.addAction(tr("Remove"), this, SLOT(issueDelete()));
menu.addAction(tr("Resume"), this, SLOT(issueResume()));
menu.addAction(tr("Show in Folder"), this, SLOT(issueOpenInDownloadsFolder()));
}
menu.addSeparator();
}
menu.addAction(tr("Delete Installed..."), this, SLOT(issueDeleteCompleted()));
menu.addAction(tr("Delete Uninstalled..."), this, SLOT(issueDeleteUninstalled()));
menu.addAction(tr("Delete All..."), this, SLOT(issueDeleteAll()));
if (!hidden) {
menu.addSeparator();
menu.addAction(tr("Hide Installed..."), this, SLOT(issueRemoveFromViewCompleted()));
menu.addAction(tr("Hide Uninstalled..."), this, SLOT(issueRemoveFromViewUninstalled()));
menu.addAction(tr("Hide All..."), this, SLOT(issueRemoveFromViewAll()));
}
if (hidden) {
menu.addSeparator();
menu.addAction(tr("Un-Hide All..."), this, SLOT(issueRestoreToViewAll()));
}
menu.exec(mouseEvent->globalPos());
event->accept();
@@ -335,4 +411,3 @@ bool DownloadListWidgetCompactDelegate::editorEvent(QEvent *event, QAbstractItem
return QItemDelegate::editorEvent(event, model, option, index);
}
+11 -2
View File
@@ -35,7 +35,7 @@ class DownloadListWidgetCompact;
class DownloadListWidgetCompact : public QWidget
{
Q_OBJECT
public:
explicit DownloadListWidgetCompact(QWidget *parent = 0);
~DownloadListWidgetCompact();
@@ -69,9 +69,13 @@ signals:
void cancelDownload(int index);
void pauseDownload(int index);
void resumeDownload(int index);
void visitOnNexus(int index);
void openFile(int index);
void openInDownloadsFolder(int index);
protected:
QString sizeFormat(quint64 size) const;
bool editorEvent(QEvent *event, QAbstractItemModel *model,
const QStyleOptionViewItem &option, const QModelIndex &index);
@@ -87,13 +91,19 @@ private slots:
void issueDelete();
void issueRemoveFromView();
void issueRestoreToView();
void issueRestoreToViewAll();
void issueVisitOnNexus();
void issueOpenFile();
void issueOpenInDownloadsFolder();
void issueCancel();
void issuePause();
void issueResume();
void issueDeleteAll();
void issueDeleteCompleted();
void issueDeleteUninstalled();
void issueRemoveFromViewAll();
void issueRemoveFromViewCompleted();
void issueRemoveFromViewUninstalled();
void issueQueryInfo();
void stateChanged(int row, DownloadManager::DownloadState);
@@ -119,4 +129,3 @@ private:
};
#endif // DOWNLOADLISTWIDGETCOMPACT_H
+10 -3
View File
@@ -19,7 +19,7 @@
<property name="autoFillBackground">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0">
<property name="spacing">
<number>2</number>
</property>
@@ -58,18 +58,25 @@
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<width>10</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="sizeLabel">
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="doneLabel">
<property name="sizePolicy">
+278 -56
View File
File diff suppressed because it is too large Load Diff
+38 -1
View File
@@ -29,6 +29,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QFile>
#include <QNetworkReply>
#include <QTime>
#include <QTimer>
#include <QVector>
#include <QMap>
#include <QStringList>
@@ -77,6 +78,7 @@ private:
qint64 m_PreResumeSize;
std::pair<int, QString> m_Progress;
std::tuple<int, int, int, int, int> m_SpeedDiff;
bool m_HasData;
DownloadState m_State;
int m_CurrentUrl;
QStringList m_Urls;
@@ -114,7 +116,7 @@ private:
private:
static unsigned int s_NextDownloadID;
private:
DownloadInfo() : m_TotalSize(0), m_ReQueried(false), m_Hidden(false), m_SpeedDiff(std::tuple<int,int,int,int,int>(0,0,0,0,0)) {}
DownloadInfo() : m_TotalSize(0), m_ReQueried(false), m_Hidden(false), m_SpeedDiff(std::tuple<int,int,int,int,int>(0,0,0,0,0)), m_HasData(false) {}
};
public:
@@ -136,6 +138,13 @@ public:
**/
bool downloadsInProgress();
/**
* @brief determine if a download is currently in progress, does not count paused ones.
*
* @return true if there is currently a download in progress (that is not paused already).
**/
bool downloadsInProgressNoPause();
/**
* @brief set the output directory to write to
*
@@ -143,6 +152,17 @@ public:
**/
void setOutputDirectory(const QString &outputDirectory);
/**
* @brief disables feedback from the downlods fileSystemWhatcher untill disableDownloadsWatcherEnd() is called
*
**/
static void startDisableDirWatcher();
/**
* @brief re-enables feedback from the downlods fileSystemWhatcher after disableDownloadsWatcherStart() was called
**/
static void endDisableDirWatcher();
/**
* @return current download directory
**/
@@ -423,6 +443,12 @@ public slots:
void queryInfo(int index);
void visitOnNexus(int index);
void openFile(int index);
void openInDownloadsFolder(int index);
void nxmDescriptionAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID);
void nxmFilesAvailable(QString gameName, int modID, QVariant userData, QVariant resultData, int requestID);
@@ -443,6 +469,7 @@ private slots:
void downloadError(QNetworkReply::NetworkError error);
void metaDataChanged();
void directoryChanged(const QString &dirctory);
void checkDownloadTimeout();
private:
@@ -497,6 +524,8 @@ private:
static QString getFileTypeString(int fileType);
void writeData(DownloadInfo *info);
private:
static const int AUTOMATIC_RETRIES = 3;
@@ -517,6 +546,12 @@ private:
QFileSystemWatcher m_DirWatcher;
//The dirWatcher is actually triggering off normal Mo operations such as deleting downloads or editing .meta files
//so it needs to be disabled during operations that are known to cause the creation or deletion of files in the Downloads folder.
//Notably using QSettings to edit a file creates a temporarily .lock file that causes the Watcher to trigger multiple listRefreshes freezing the ui.
static int m_DirWatcherDisabler;
std::map<QString, int> m_DownloadFails;
bool m_ShowHidden;
@@ -524,6 +559,8 @@ private:
QRegExp m_DateExpression;
MOBase::IPluginGame const *m_ManagedGame;
QTimer m_TimeoutTimer;
};
+32 -3
View File
@@ -131,11 +131,12 @@ QString InstanceManager::manageInstances(const QStringList &instanceList) const
QString InstanceManager::queryInstanceName(const QStringList &instanceList) const
{
QString instanceId;
QString dialogText;
while (instanceId.isEmpty()) {
QInputDialog dialog;
dialog.setWindowTitle(QObject::tr("Enter a Name for the new Instance"));
dialog.setLabelText(QObject::tr("Enter a new name or select one from the sugested list (only letters and numbers allowed):"));
dialog.setWindowTitle(QObject::tr("Enter a Name for the new Instance"));
dialog.setLabelText(QObject::tr("Enter a new name or select one from the suggested list:"));
// would be neat if we could take the names from the game plugins but
// the required initialization order requires the ini file to be
// available *before* we load plugins
@@ -146,7 +147,17 @@ QString InstanceManager::queryInstanceName(const QStringList &instanceList) cons
if (dialog.exec() == QDialog::Rejected) {
throw MOBase::MyException(QObject::tr("Canceled"));
}
instanceId = dialog.textValue().replace(QRegExp("[^0-9a-zA-Z ]"), "");
dialogText = dialog.textValue();
instanceId = sanitizeInstanceName(dialogText);
if (instanceId != dialogText) {
if (QMessageBox::question( nullptr,
QObject::tr("Invalid instance name"),
QObject::tr("The instance name \"%1\" is invalid. Use the name \"%2\" instead?").arg(dialogText,instanceId),
QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) {
instanceId="";
continue;
}
}
bool alreadyExists=false;
for (const QString &instance : instanceList) {
@@ -296,3 +307,21 @@ QString InstanceManager::determineDataPath()
}
}
QString InstanceManager::sanitizeInstanceName(const QString &name) const
{
QString new_name = name;
// Restrict the allowed characters
new_name = new_name.remove(QRegExp("[^A-Za-z0-9 _=+;!@#$%^'\\-\\.\\[\\]\\{\\}\\(\\)]"));
// Don't end in spaces and periods
new_name = new_name.remove(QRegExp("\\.*$"));
new_name = new_name.remove(QRegExp(" *$"));
// Recurse until stuff stops changing
if (new_name != name) {
return sanitizeInstanceName(new_name);
}
return new_name;
}
+1
View File
@@ -50,6 +50,7 @@ private:
QString manageInstances(const QStringList &instanceList) const;
QString sanitizeInstanceName(const QString &name) const;
void setCurrentInstance(const QString &name);
QString queryInstanceName(const QStringList &instanceList) const;
+1 -5
View File
@@ -446,11 +446,7 @@ static void preloadSsl()
static QString getVersionDisplayString()
{
VS_FIXEDFILEINFO version = GetFileVersion(ToWString(QApplication::applicationFilePath()));
return VersionInfo(version.dwFileVersionMS >> 16,
version.dwFileVersionMS & 0xFFFF,
version.dwFileVersionLS >> 16,
version.dwFileVersionLS & 0xFFFF).displayString();
return createVersionInfo().displayString();
}
int runApplication(MOApplication &application, SingleInstance &instance,
+268 -82
View File
File diff suppressed because it is too large Load Diff
+11
View File
@@ -304,6 +304,8 @@ private:
Ui::MainWindow *ui;
QAction *m_Sep; // Executable Shortcuts are added after this. Non owning.
bool m_WasVisible;
MOBase::TutorialControl m_Tutorial;
@@ -415,6 +417,8 @@ private slots:
void visitWebPage_clicked();
void openExplorer_clicked();
void information_clicked();
void enableSelectedMods_clicked();
void disableSelectedMods_clicked();
// savegame context menu
void deleteSavegame_clicked();
void fixMods_clicked(SaveGameInfo::MissingAssets const &missingAssets);
@@ -426,6 +430,10 @@ private slots:
void hideFile();
void unhideFile();
// pluginlist context menu
void enableSelectedPlugins_clicked();
void disableSelectedPlugins_clicked();
void linkToolbar();
void linkDesktop();
void linkMenu();
@@ -498,7 +506,9 @@ private slots:
void openInstanceFolder();
void openLogsFolder();
void openInstallFolder();
void openPluginsFolder();
void openDownloadsFolder();
void openModsFolder();
void openProfileFolder();
void openGameFolder();
void openMyGamesFolder();
@@ -571,6 +581,7 @@ private slots: // ui slots
void on_executablesListBox_currentIndexChanged(int index);
void on_modList_customContextMenuRequested(const QPoint &pos);
void on_modList_doubleClicked(const QModelIndex &index);
void on_espList_doubleClicked(const QModelIndex &index);
void on_profileBox_currentIndexChanged(int index);
void on_savegameList_customContextMenuRequested(const QPoint &pos);
void on_startButton_clicked();
+41 -84
View File
@@ -96,9 +96,9 @@
</item>
<item>
<widget class="QPushButton" name="clickBlankButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Maximum">
<horstretch>0</horstretch>
@@ -194,7 +194,7 @@
</widget>
</item>
<item>
<widget class="QComboBox" name="profileBox">
<widget class="QComboBox" name="profileBox">
<property name="toolTip">
<string>Pick a module collection</string>
</property>
@@ -248,7 +248,7 @@ p, li { white-space: pre-wrap; }
<height>16</height>
</size>
</property>
</widget>
</widget>
</item>
<item>
<widget class="QPushButton" name="openFolderMenu">
@@ -265,16 +265,6 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item>
<widget class="QPushButton" name="restoreModsButton">
<property name="toolTip">
<string>Restore Backup...</string>
@@ -509,7 +499,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@@ -521,7 +511,7 @@ p, li { white-space: pre-wrap; }
</size>
</property>
</spacer>
</item>
</item>
<item alignment="Qt::AlignLeft">
<widget class="QPushButton" name="clearFiltersButton">
<property name="sizePolicy">
@@ -536,12 +526,12 @@ p, li { white-space: pre-wrap; }
<height>22</height>
</size>
</property>
<property name="baseSize">
<property name="baseSize">
<size>
<width>95</width>
<height>0</height>
</size>
</property>
</property>
<property name="visible">
<bool>false</bool>
</property>
@@ -567,7 +557,7 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -579,14 +569,14 @@ p, li { white-space: pre-wrap; }
</property>
</spacer>
</item>
<item>
<widget class="QComboBox" name="groupCombo">
<property name="baseSize">
<item>
<widget class="QComboBox" name="groupCombo">
<property name="baseSize">
<size>
<width>220</width>
<height>0</height>
</size>
</property>
</property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
@@ -608,13 +598,13 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item>
<widget class="MOBase::LineEditClear" name="modFilterEdit">
<property name="baseSize">
<widget class="MOBase::LineEditClear" name="modFilterEdit">
<property name="baseSize">
<size>
<width>220</width>
<height>0</height>
</size>
</property>
</property>
<property name="placeholderText">
<string>Namefilter</string>
</property>
@@ -835,12 +825,12 @@ p, li { white-space: pre-wrap; }
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QPushButton" name="bossButton">
<property name="visible">
<bool>true</bool>
</property>
<property name="visible">
<bool>true</bool>
</property>
<property name="text">
<string>Sort</string>
</property>
</property>
<property name="icon">
<iconset resource="resources.qrc">
<normaloff>:/MO/gui/sort</normaloff>:/MO/gui/sort</iconset>
@@ -954,6 +944,9 @@ p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;This list contains the esps, esms, and esls contained in the active mods. These require their own load order. Use drag&amp;amp;drop to modify this load order. Please note that MO will only save the load order for mods that are active/checked.&lt;br /&gt;There is a great tool named &amp;quot;BOSS&amp;quot; to automatically sort these files.&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="editTriggers">
<set>QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
@@ -987,6 +980,9 @@ p, li { white-space: pre-wrap; }
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>false</bool>
</property>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
@@ -1009,15 +1005,12 @@ p, li { white-space: pre-wrap; }
</layout>
</widget>
<widget class="QWidget" name="bsaTab">
<property name="visible">
<bool>false</bool>
</property>
<attribute name="title">
<string>Archives</string>
</attribute>
<property name="visible">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_9">
<property name="leftMargin">
<number>6</number>
@@ -1032,17 +1025,7 @@ p, li { white-space: pre-wrap; }
<number>6</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_9" stretch="0,1">
<!--<item>-->
<!--<widget class="QCheckBox" name="manageArchivesBox">-->
<!--<property name="text">-->
<!--<string/>-->
<!--</property>-->
<!--<property name="checked">-->
<!--<bool>true</bool>-->
<!--</property>-->
<!--</widget>-->
<!--</item>-->
<layout class="QHBoxLayout" name="horizontalLayout_9" stretch="0">
<item>
<widget class="QLabel" name="managedArchiveLabel">
<property name="toolTip">
@@ -1072,50 +1055,24 @@ p, li { white-space: pre-wrap; }
BSAs checked here are loaded in such a way that your installation order is obeyed properly.</string>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="showDropIndicator" stdset="0">
<bool>false</bool>
</property>
<property name="dragEnabled">
<property name="dragEnabled" stdset="0">
<bool>false</bool>
</property>
<property name="dragDropOverwriteMode">
<property name="dragDropOverwriteMode" stdset="0">
<bool>false</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::NoDragDrop</enum>
</property>
<property name="defaultDropAction">
<enum>Qt::IgnoreAction</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="indentation">
<property name="indentation" stdset="0">
<number>20</number>
</property>
<property name="itemsExpandable">
<property name="itemsExpandable" stdset="0">
<bool>true</bool>
</property>
<property name="columnCount">
<property name="columnCount" stdset="0">
<number>1</number>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<attribute name="headerDefaultSectionSize">
<number>200</number>
</attribute>
<column>
<property name="text">
<string>File</string>
</property>
</column>
</widget>
</item>
</layout>
@@ -1286,7 +1243,7 @@ p, li { white-space: pre-wrap; }
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="dragEnabled">
<bool>true</bool>
@@ -1319,7 +1276,10 @@ p, li { white-space: pre-wrap; }
<bool>true</bool>
</property>
<attribute name="headerDefaultSectionSize">
<number>100</number>
<number>50</number>
</attribute>
<attribute name="headerMinimumSectionSize">
<number>15</number>
</attribute>
<attribute name="headerStretchLastSection">
<bool>true</bool>
@@ -1601,9 +1561,6 @@ Right now this has very limited functionality</string>
<property name="text">
<string>Copy Log to Clipboard</string>
</property>
<property name="shortcut">
<string>Ctrl+C</string>
</property>
</action>
<action name="actionChange_Game">
<property name="icon">
+4 -3
View File
@@ -102,6 +102,7 @@ QString ModInfo::getContentTypeName(int contentType)
case CONTENT_SKSE: return tr("Script Extender");
case CONTENT_SKYPROC: return tr("SkyProc Tools");
case CONTENT_MCM: return tr("MCM Data");
case CONTENT_INI: return tr("INI files");
default: throw MyException(tr("invalid content type %1").arg(contentType));
}
}
@@ -286,9 +287,9 @@ int ModInfo::checkAllForUpdate(PluginContainer *pluginContainer, QObject *receiv
int result = 0;
std::vector<int> modIDs;
//I ought to store this, it's used elsewhere
IPluginGame const *game = qApp->property("managed_game").value<IPluginGame *>();
if (game->nexusModOrganizerID()) {
// Normally this would be the managed game but MO2 is only uploaded to the Skyrim SE site right now
IPluginGame const *game = pluginContainer->managedGame("Skyrim Special Edition");
if (game && game->nexusModOrganizerID()) {
modIDs.push_back(game->nexusModOrganizerID());
checkChunkForUpdate(pluginContainer, modIDs, receiver, game->gameShortName());
modIDs.clear();
+3 -2
View File
@@ -84,10 +84,11 @@ public:
CONTENT_SCRIPT,
CONTENT_SKSE,
CONTENT_SKYPROC,
CONTENT_MCM
CONTENT_MCM,
CONTENT_INI
};
static const int NUM_CONTENT_TYPES = CONTENT_MCM + 1;
static const int NUM_CONTENT_TYPES = CONTENT_INI + 1;
enum EHighlight {
HIGHLIGHT_NONE = 0,

Some files were not shown because too many files have changed in this diff Show More