From 5d1154c24e2475ed2b7ac248de27ab7b501a1e5e Mon Sep 17 00:00:00 2001 From: Tannin Date: Sat, 16 Feb 2013 19:09:57 +0100 Subject: - hooks for CreateHardLink - createprocess hook will now reroute the cwd (fixes SUM, may break other tools?) - profile code moved to separate file - executables can now be linked to toolbar - category filters are now represented as a tree - csv export of mod list - ModInfoDialog is now "window modal" instead of "application modal" - nexus dialog now updates the mod-id field while browsing - right-click in nexus browser allows to open in external browser - ini viewer is no longer modal - bugfix: another attempt to fix processing of invalid header lines in fomod xmls (bom now handled) - bugfix: integrated fomod installer will no longer overwrite detected mod name by the one from the xml - bugfix: "hide file" from conflicted files list now updates that list - bugfix: conflicted files list no longer offers to hide files in BSAs - bugfix: pressing delete on the mod list with multiplie files selected offered to delete the wrong files - regression: mod name guessing with the old regular expression was less likely to lead to an empty mod name. Now both are tried --- src/fomodinstallerdialog.h | 386 +++++++++++++++++++++++---------------------- 1 file changed, 195 insertions(+), 191 deletions(-) (limited to 'src/fomodinstallerdialog.h') diff --git a/src/fomodinstallerdialog.h b/src/fomodinstallerdialog.h index 0fb5a5ec..875146a6 100644 --- a/src/fomodinstallerdialog.h +++ b/src/fomodinstallerdialog.h @@ -17,194 +17,198 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#ifndef FOMODINSTALLERDIALOG_H -#define FOMODINSTALLERDIALOG_H - -#include "installdialog.h" -#include -#include -#include -#include -#include - -namespace Ui { -class FomodInstallerDialog; -} - - -class Condition : public QObject { - Q_OBJECT -public: - Condition(QObject *parent = NULL) : QObject(parent) { } - Condition(const Condition &reference) : QObject(reference.parent()), m_Name(reference.m_Name), m_Value(reference.m_Value) { } - Condition(const QString &name, const QString &value) : QObject(), m_Name(name), m_Value(value) { } - QString m_Name; - QString m_Value; -private: - Condition &operator=(const Condition&); -}; - -Q_DECLARE_METATYPE(Condition) - - -class FileDescriptor : public QObject { - Q_OBJECT -public: - FileDescriptor(QObject *parent) - : QObject(parent), m_Source(), m_Destination(), m_Priority(0), m_IsFolder(false), m_AlwaysInstall(false), - m_InstallIfUsable(false) {} - FileDescriptor(const FileDescriptor &reference) - : QObject(reference.parent()), m_Source(reference.m_Source), m_Destination(reference.m_Destination), - m_Priority(reference.m_Priority), m_IsFolder(reference.m_IsFolder), m_AlwaysInstall(reference.m_AlwaysInstall), - m_InstallIfUsable(reference.m_InstallIfUsable) {} - QString m_Source; - QString m_Destination; - int m_Priority; - bool m_IsFolder; - bool m_AlwaysInstall; - bool m_InstallIfUsable; -private: - FileDescriptor &operator=(const FileDescriptor&); -}; - -Q_DECLARE_METATYPE(FileDescriptor*) - - -class FomodInstallerDialog : public QDialog -{ - Q_OBJECT - -public: - explicit FomodInstallerDialog(const QString &modName, const QString &fomodPath, QWidget *parent = 0); - ~FomodInstallerDialog(); - - void initData(); - - /** - * @return bool true if the user requested the manual dialog - **/ - bool manualRequested() const { return m_Manual; } - - /** - * @return QString the (user-modified) name to be used for the mod - **/ - QString getName() const; - - /** - * @brief retrieve the updated archive tree from the dialog. The caller is responsible to delete the returned tree. - * - * @note This call is destructive on the input tree! - * - * @param tree input tree. (TODO isn't this the same as the tree passed in the constructor?) - * @return DataTree* a new tree with only the selected options and directories arranged correctly. The caller takes custody of this pointer! - **/ - DirectoryTree *updateTree(DirectoryTree *tree); - -protected: - - virtual bool eventFilter(QObject *object, QEvent *event); - -private slots: - - void on_cancelBtn_clicked(); - - void on_manualBtn_clicked(); - - void on_websiteLabel_linkActivated(const QString &link); - - void on_nextBtn_clicked(); - - void on_prevBtn_clicked(); - -private: - - enum ItemOrder { - ORDER_ASCENDING, - ORDER_DESCENDING, - ORDER_EXPLICIT - }; - - enum GroupType { - TYPE_SELECTATLEASTONE, - TYPE_SELECTATMOSTONE, - TYPE_SELECTEXACTLYONE, - TYPE_SELECTANY, - TYPE_SELECTALL - }; - - enum PluginType { - TYPE_REQUIRED, - TYPE_RECOMMENDED, - TYPE_OPTIONAL, - TYPE_NOTUSABLE, - TYPE_COULDBEUSABLE - }; - - struct Plugin { - QString m_Name; - QString m_Description; - QString m_ImagePath; - PluginType m_Type; - std::vector m_Conditions; - std::vector m_Files; - }; - - struct ConditionalInstall { - enum { - OP_AND, - OP_OR - } m_Operator; - std::vector m_Conditions; - std::vector m_Files; - }; - -private: - - QString readContent(QXmlStreamReader &reader); - void parseInfo(const QByteArray &data); - - static ItemOrder getItemOrder(const QString &orderString); - static GroupType getGroupType(const QString &typeString); - static PluginType getPluginType(const QString &typeString); - static bool byPriority(const FileDescriptor *LHS, const FileDescriptor *RHS); - - bool copyFileIterator(DirectoryTree *sourceTree, DirectoryTree *destinationTree, FileDescriptor *descriptor); - void readFileList(QXmlStreamReader &reader, std::vector &fileList); - void readPluginType(QXmlStreamReader &reader, Plugin &plugin); - void readConditionFlags(QXmlStreamReader &reader, Plugin &plugin); - FomodInstallerDialog::Plugin readPlugin(QXmlStreamReader &reader); - void readPlugins(QXmlStreamReader &reader, GroupType groupType, QLayout *layout); - void readGroup(QXmlStreamReader &reader, QLayout *layout); - void readGroups(QXmlStreamReader &reader, QLayout *layout); - void readVisible(QXmlStreamReader &reader, QVariantList &conditions); - QGroupBox *readInstallerStep(QXmlStreamReader &reader); - ConditionalInstall readConditionalPattern(QXmlStreamReader &reader); - void readConditionalFileInstalls(QXmlStreamReader &reader); - void readInstallerSteps(QXmlStreamReader &reader); - void parseModuleConfig(const QByteArray &data); - void highlightControl(QAbstractButton *button); - - bool testCondition(int maxIndex, const QString &flag, const QString &value); - bool testVisible(int pageIndex); - bool nextPage(); - void activateCurrentPage(); - void moveTree(DirectoryTree::Node *target, DirectoryTree::Node *source); - DirectoryTree::Node *findNode(DirectoryTree::Node *node, const QString &path, bool create); - void copyLeaf(DirectoryTree::Node *sourceTree, const QString &sourcePath, - DirectoryTree::Node *destinationTree, const QString &destinationPath); - -private: - - Ui::FomodInstallerDialog *ui; - - QString m_FomodPath; - bool m_Manual; - -// ItemOrder m_StepOrder; -// std::vector m_Steps; - std::vector m_RequiredFiles; - std::vector m_ConditionalInstalls; - -}; - -#endif // FOMODINSTALLERDIALOG_H +#ifndef FOMODINSTALLERDIALOG_H +#define FOMODINSTALLERDIALOG_H + +#include "installdialog.h" +#include +#include +#include +#include +#include + +namespace Ui { +class FomodInstallerDialog; +} + + +class Condition : public QObject { + Q_OBJECT +public: + Condition(QObject *parent = NULL) : QObject(parent) { } + Condition(const Condition &reference) : QObject(reference.parent()), m_Name(reference.m_Name), m_Value(reference.m_Value) { } + Condition(const QString &name, const QString &value) : QObject(), m_Name(name), m_Value(value) { } + QString m_Name; + QString m_Value; +private: + Condition &operator=(const Condition&); +}; + +Q_DECLARE_METATYPE(Condition) + + +class FileDescriptor : public QObject { + Q_OBJECT +public: + FileDescriptor(QObject *parent) + : QObject(parent), m_Source(), m_Destination(), m_Priority(0), m_IsFolder(false), m_AlwaysInstall(false), + m_InstallIfUsable(false) {} + FileDescriptor(const FileDescriptor &reference) + : QObject(reference.parent()), m_Source(reference.m_Source), m_Destination(reference.m_Destination), + m_Priority(reference.m_Priority), m_IsFolder(reference.m_IsFolder), m_AlwaysInstall(reference.m_AlwaysInstall), + m_InstallIfUsable(reference.m_InstallIfUsable) {} + QString m_Source; + QString m_Destination; + int m_Priority; + bool m_IsFolder; + bool m_AlwaysInstall; + bool m_InstallIfUsable; +private: + FileDescriptor &operator=(const FileDescriptor&); +}; + +Q_DECLARE_METATYPE(FileDescriptor*) + + +class FomodInstallerDialog : public QDialog +{ + Q_OBJECT + +public: + explicit FomodInstallerDialog(const QString &modName, bool nameWasGuessed, const QString &fomodPath, QWidget *parent = 0); + ~FomodInstallerDialog(); + + void initData(); + + /** + * @return bool true if the user requested the manual dialog + **/ + bool manualRequested() const { return m_Manual; } + + /** + * @return QString the (user-modified) name to be used for the mod + **/ + QString getName() const; + + /** + * @brief retrieve the updated archive tree from the dialog. The caller is responsible to delete the returned tree. + * + * @note This call is destructive on the input tree! + * + * @param tree input tree. (TODO isn't this the same as the tree passed in the constructor?) + * @return DataTree* a new tree with only the selected options and directories arranged correctly. The caller takes custody of this pointer! + **/ + DirectoryTree *updateTree(DirectoryTree *tree); + +protected: + + virtual bool eventFilter(QObject *object, QEvent *event); + +private slots: + + void on_cancelBtn_clicked(); + + void on_manualBtn_clicked(); + + void on_websiteLabel_linkActivated(const QString &link); + + void on_nextBtn_clicked(); + + void on_prevBtn_clicked(); + +private: + + enum ItemOrder { + ORDER_ASCENDING, + ORDER_DESCENDING, + ORDER_EXPLICIT + }; + + enum GroupType { + TYPE_SELECTATLEASTONE, + TYPE_SELECTATMOSTONE, + TYPE_SELECTEXACTLYONE, + TYPE_SELECTANY, + TYPE_SELECTALL + }; + + enum PluginType { + TYPE_REQUIRED, + TYPE_RECOMMENDED, + TYPE_OPTIONAL, + TYPE_NOTUSABLE, + TYPE_COULDBEUSABLE + }; + + struct Plugin { + QString m_Name; + QString m_Description; + QString m_ImagePath; + PluginType m_Type; + std::vector m_Conditions; + std::vector m_Files; + }; + + struct ConditionalInstall { + enum { + OP_AND, + OP_OR + } m_Operator; + std::vector m_Conditions; + std::vector m_Files; + }; + +private: + + static int bomOffset(const QByteArray &buffer); + + QString readContent(QXmlStreamReader &reader); + void parseInfo(const QByteArray &data); + + static ItemOrder getItemOrder(const QString &orderString); + static GroupType getGroupType(const QString &typeString); + static PluginType getPluginType(const QString &typeString); + static bool byPriority(const FileDescriptor *LHS, const FileDescriptor *RHS); + + bool copyFileIterator(DirectoryTree *sourceTree, DirectoryTree *destinationTree, FileDescriptor *descriptor); + void readFileList(QXmlStreamReader &reader, std::vector &fileList); + void readPluginType(QXmlStreamReader &reader, Plugin &plugin); + void readConditionFlags(QXmlStreamReader &reader, Plugin &plugin); + FomodInstallerDialog::Plugin readPlugin(QXmlStreamReader &reader); + void readPlugins(QXmlStreamReader &reader, GroupType groupType, QLayout *layout); + void readGroup(QXmlStreamReader &reader, QLayout *layout); + void readGroups(QXmlStreamReader &reader, QLayout *layout); + void readVisible(QXmlStreamReader &reader, QVariantList &conditions); + QGroupBox *readInstallerStep(QXmlStreamReader &reader); + ConditionalInstall readConditionalPattern(QXmlStreamReader &reader); + void readConditionalFileInstalls(QXmlStreamReader &reader); + void readInstallerSteps(QXmlStreamReader &reader); + void parseModuleConfig(const QByteArray &data); + void highlightControl(QAbstractButton *button); + + bool testCondition(int maxIndex, const QString &flag, const QString &value); + bool testVisible(int pageIndex); + bool nextPage(); + void activateCurrentPage(); + void moveTree(DirectoryTree::Node *target, DirectoryTree::Node *source); + DirectoryTree::Node *findNode(DirectoryTree::Node *node, const QString &path, bool create); + void copyLeaf(DirectoryTree::Node *sourceTree, const QString &sourcePath, + DirectoryTree::Node *destinationTree, const QString &destinationPath); + +private: + + Ui::FomodInstallerDialog *ui; + + bool m_NameWasGuessed; + + QString m_FomodPath; + bool m_Manual; + +// ItemOrder m_StepOrder; +// std::vector m_Steps; + std::vector m_RequiredFiles; + std::vector m_ConditionalInstalls; + +}; + +#endif // FOMODINSTALLERDIALOG_H -- cgit v1.3.1