forked from aya/aya
Initial commit
This commit is contained in:
267
client/studio/src/RobloxQuickAccessConfig.hpp
Normal file
267
client/studio/src/RobloxQuickAccessConfig.hpp
Normal file
@@ -0,0 +1,267 @@
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QTreeWidget>
|
||||
#include <QPointer>
|
||||
#include <QStack>
|
||||
#include <QAction>
|
||||
|
||||
#include "RobloxSavingStateDialog.hpp"
|
||||
|
||||
class RobloxMainWindow;
|
||||
class QAbstractButton;
|
||||
class QDialogButtonBox;
|
||||
namespace Qtitan
|
||||
{
|
||||
class RibbonQuickAccessBar;
|
||||
};
|
||||
|
||||
enum eAllActionsColumns
|
||||
{
|
||||
AC_ICON = 0,
|
||||
AC_NAME
|
||||
};
|
||||
|
||||
enum eQuickAccessActionsColumns
|
||||
{
|
||||
QAC_VISIBILITY = 0,
|
||||
QAC_ICON,
|
||||
QAC_NAME
|
||||
};
|
||||
|
||||
class ActionItem : public QTreeWidgetItem
|
||||
{
|
||||
public:
|
||||
ActionItem(QAction* pAction, Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable);
|
||||
|
||||
/*override*/ QVariant data(int column, int role) const;
|
||||
|
||||
void applyFilter(const QString& filter, int column);
|
||||
|
||||
bool canBeShown();
|
||||
QAction* getAction()
|
||||
{
|
||||
return m_pAction;
|
||||
}
|
||||
bool hasAction(QAction* pAction);
|
||||
|
||||
protected:
|
||||
QPointer<QAction> m_pAction;
|
||||
};
|
||||
|
||||
class QuickAccessActionItem : public ActionItem
|
||||
{
|
||||
public:
|
||||
QuickAccessActionItem(QAction* pAction, bool isVisible, Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable);
|
||||
|
||||
/*override*/ QVariant data(int column, int role) const;
|
||||
/*override*/ void setData(int column, int role, const QVariant& value);
|
||||
bool hasAction(QAction* pAction);
|
||||
|
||||
void setQuickAccess(Qt::CheckState state)
|
||||
{
|
||||
m_isQuickAccessCheckState = state;
|
||||
}
|
||||
bool hasQuickAccessOverride() const
|
||||
{
|
||||
return m_isQuickAccessCheckState != m_originalCheckState;
|
||||
}
|
||||
|
||||
void removeQuickAccessOverride();
|
||||
void commitQuickAccessOverride()
|
||||
{
|
||||
m_originalCheckState = m_isQuickAccessCheckState;
|
||||
}
|
||||
|
||||
private:
|
||||
Qt::CheckState m_isQuickAccessCheckState, m_originalCheckState;
|
||||
};
|
||||
|
||||
class BaseListWidget : public QTreeWidget
|
||||
{
|
||||
public:
|
||||
BaseListWidget(QWidget* parent);
|
||||
|
||||
bool isActionAvailable(QAction* pAction);
|
||||
void selectItem(int row);
|
||||
|
||||
void addAction(QAction* action);
|
||||
void removeAction(QAction* action);
|
||||
|
||||
protected:
|
||||
virtual ActionItem* createItem(QAction* action) = 0;
|
||||
virtual bool isValid(QAction* action);
|
||||
void setFilter(const QString& filter, int column);
|
||||
ActionItem* getItem(QAction* action);
|
||||
|
||||
private:
|
||||
void drawRow(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
|
||||
};
|
||||
|
||||
class AllActionsListWidget : public BaseListWidget
|
||||
{
|
||||
public:
|
||||
AllActionsListWidget(QWidget* parent);
|
||||
ActionItem* createItem(QAction* action);
|
||||
|
||||
void setFilter(const QString& filter);
|
||||
|
||||
void selectNextItem(ActionItem* item);
|
||||
void sort();
|
||||
|
||||
bool isValid(QAction* action);
|
||||
};
|
||||
|
||||
class QuickAccessActionsListWidget : public BaseListWidget
|
||||
{
|
||||
public:
|
||||
QuickAccessActionsListWidget(QWidget* parent);
|
||||
void initialize();
|
||||
|
||||
ActionItem* createItem(QAction* action);
|
||||
|
||||
void moveItem(QTreeWidgetItem* itemToAdd, bool moveUp);
|
||||
void removeItem(QTreeWidgetItem* itemToRemove);
|
||||
|
||||
void accept();
|
||||
};
|
||||
|
||||
class QuickAccessConfigDialog : public RobloxSavingStateDialog<QDialog>
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QuickAccessConfigDialog(QWidget* parent);
|
||||
|
||||
private Q_SLOTS:
|
||||
void accept();
|
||||
void cancel();
|
||||
void restoreDefaults(QAbstractButton* button);
|
||||
void onDefaultsRestored();
|
||||
void onQuickAccessListDataChanged();
|
||||
|
||||
void onAddButtonClicked();
|
||||
void onRemoveButtonClicked();
|
||||
void onMoveButtonClicked();
|
||||
|
||||
void setFilter(QString filter);
|
||||
|
||||
private:
|
||||
bool eventFilter(QObject* watched, QEvent* evt);
|
||||
void showEvent(QShowEvent* evt);
|
||||
void doLayout();
|
||||
|
||||
QDialogButtonBox* m_dialogButtonBox;
|
||||
|
||||
AllActionsListWidget* m_pAllActionListWidget;
|
||||
QuickAccessActionsListWidget* m_pQuickAccessActionsListWidget;
|
||||
|
||||
QPushButton* m_pAddButton;
|
||||
QPushButton* m_pRemoveButton;
|
||||
|
||||
QPushButton* m_pMoveUpButton;
|
||||
QPushButton* m_pMoveDownButton;
|
||||
|
||||
QLineEdit* m_pFilterEdit;
|
||||
|
||||
bool m_dataChanged;
|
||||
};
|
||||
|
||||
class RobloxQuickAccessConfig : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
static RobloxQuickAccessConfig& singleton();
|
||||
|
||||
bool loadQuickAccessConfig();
|
||||
void saveQuickAccessConfig();
|
||||
|
||||
void setPluginHostInitialized(bool state)
|
||||
{
|
||||
m_pluginHostInitialized = state;
|
||||
}
|
||||
|
||||
struct ActionData
|
||||
{
|
||||
QPointer<QAction> action;
|
||||
|
||||
bool isVisible;
|
||||
bool isInitialized;
|
||||
|
||||
ActionData(QAction* act, bool state, bool initialized = false)
|
||||
: action(act)
|
||||
, isVisible(state)
|
||||
, isInitialized(initialized)
|
||||
{
|
||||
}
|
||||
|
||||
bool isProxyAction() const;
|
||||
};
|
||||
|
||||
typedef QList<ActionData> QuickAccessActionCollection;
|
||||
|
||||
void restoreDefaults();
|
||||
void storeDefaults(const QuickAccessActionCollection& quickAccessBarActions);
|
||||
|
||||
void recreateQuickAccessBar(const QuickAccessActionCollection& quickAccessBarActions);
|
||||
QuickAccessActionCollection& getQuickAccessBarActions()
|
||||
{
|
||||
return m_currentQuickAccessBarActions;
|
||||
}
|
||||
|
||||
void addToQuickAccessBar(QAction* action, bool visibility);
|
||||
void removeFromQuickAccessBar(QAction* action);
|
||||
|
||||
QAction* mapProxyAction(QAction* action, bool force = false);
|
||||
QAction* resetProxyAction(QAction* action);
|
||||
bool updateProxyAction(QAction* action);
|
||||
QAction* getProxyAction(QAction* action);
|
||||
|
||||
bool visibleInQuickAccessBar(QAction* action);
|
||||
bool availableInQuickAccessBar(QAction* action);
|
||||
|
||||
Q_SIGNALS:
|
||||
void actionAdded(QAction* action);
|
||||
void actionRemoved(QAction* action);
|
||||
void defaultsRestored();
|
||||
|
||||
private Q_SLOTS:
|
||||
void updateQuickAccessMenu(QMenu* pMenu);
|
||||
void updateActionVisiblity(QAction* action);
|
||||
|
||||
void onExtensionMenuShow();
|
||||
void onExtensionMenuHide();
|
||||
|
||||
private:
|
||||
RobloxQuickAccessConfig();
|
||||
|
||||
RobloxMainWindow* m_pMainWindow;
|
||||
Qtitan::RibbonQuickAccessBar* m_pQuickAccessBar;
|
||||
|
||||
QuickAccessActionCollection m_defaultQuickAccessBarActions;
|
||||
QuickAccessActionCollection m_currentQuickAccessBarActions;
|
||||
|
||||
QPointer<QAction> m_pSeparationAction;
|
||||
|
||||
bool m_pluginHostInitialized;
|
||||
};
|
||||
|
||||
class QuickAccessBarProxyAction : public QAction
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
QuickAccessBarProxyAction(QObject* parent);
|
||||
void setSourceAction(QAction* pSourceAction);
|
||||
|
||||
bool hasAction(QAction* action);
|
||||
|
||||
private Q_SLOTS:
|
||||
void onChanged();
|
||||
void onSourceActionDestroyed(QObject*);
|
||||
void onActionTriggered();
|
||||
|
||||
private:
|
||||
QStack<QAction*> m_pSourceActions;
|
||||
QAction* m_pCurrentSourceAction;
|
||||
};
|
||||
Reference in New Issue
Block a user