aboutsummaryrefslogtreecommitdiff
path: root/libs/installer_bsplugins/src/BSPluginList/PluginsWidget.h
blob: e44fc7edaf6bd759372a84bc4be2a183f6800258 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#ifndef BSPLUGINLIST_PLUGINSWIDGET_H
#define BSPLUGINLIST_PLUGINSWIDGET_H

#include "MOPlugin/IPanelInterface.h"
#include "PluginGroupProxyModel.h"
#include "PluginListModel.h"
#include "PluginSortFilterProxyModel.h"
#include "TESData/PluginList.h"

#include <QSortFilterProxyModel>
#include <QWidget>

class Ui_PluginsWidget;

namespace BSPluginList
{

class PluginsWidget final : public QWidget
{
  Q_OBJECT

public:
  PluginsWidget(MOBase::IOrganizer* organizer, IPanelInterface* panelInterface,
                QWidget* parent = nullptr);

  PluginsWidget(const PluginsWidget&) = delete;
  PluginsWidget(PluginsWidget&&)      = delete;

  ~PluginsWidget() noexcept;

  PluginsWidget& operator=(const PluginsWidget&) = delete;
  PluginsWidget& operator=(PluginsWidget&&)      = delete;

  [[nodiscard]] TESData::PluginList* getPluginList() { return m_PluginList; }

  bool eventFilter(QObject* watched, QEvent* event) override;

public slots:
  void updatePluginCount();

protected:
  void changeEvent(QEvent* event) override;

private slots:
  void onGroupCollapsed(const QModelIndex& index);
  void onGroupExpanded(const QModelIndex& index);
  void onSelectionChanged();

  void onPanelActivated();

  void onSelectedOriginsChanged(const QList<QString>& origins);

  void toggleHideForceEnabled();
  void toggleIgnoreMasterConflicts();
  void displayPluginInformation(const QModelIndex& index);

  void on_pluginList_customContextMenuRequested(const QPoint& pos);
  void on_pluginList_doubleClicked(const QModelIndex& index);
  void on_pluginList_openOriginExplorer(const QModelIndex& index);
  void on_espFilterEdit_textChanged(const QString& filter);
  void on_sortButton_clicked();
  void on_restoreButton_clicked();
  void on_saveButton_clicked();

private:
  [[nodiscard]] QMenu* listOptionsMenu();
  void saveState();
  void restoreState();

  void onModStateChanged(const std::map<QString, MOBase::IModList::ModStates>& mods);
  bool onAboutToRun(const QString& binary);
  void onFinishedRun(const QString& binary, unsigned int exitCode);
  void onSettingChanged(const QString& key, const QVariant& oldValue,
                        const QVariant& newValue);
  void checkLoadOrderChanged(const QString& binaryName);
  void importLootGroups();

  // HACK: Attempt to keep our custom plugin list synchronized with the built-in panel
  void synchronizePluginLists(MOBase::IOrganizer* organizer);

  Ui_PluginsWidget* ui;

  QMenu* optionsMenu           = nullptr;
  QAction* toggleForceEnabled  = nullptr;
  QAction* toggleIgnoreMasters = nullptr;

  TESData::PluginList* m_PluginList       = nullptr;
  PluginListModel* m_PluginListModel      = nullptr;
  PluginSortFilterProxyModel* m_SortProxy = nullptr;
  PluginGroupProxyModel* m_GroupProxy     = nullptr;
  IPanelInterface* m_PanelInterface;

  MOBase::IOrganizer* m_Organizer;

  bool m_DidUpdateMasterList   = false;
  bool m_OrganizerRefreshing   = false;
  bool m_IsRunningApp          = false;
  bool m_ExternalStatesChanged = false;
};

}  // namespace BSPluginList

#endif  // TESDATA_PLUGINSWIDGET_H