Files
aya/client/studio/src/ShortcutHelpDialog.cpp
2025-12-17 16:47:48 +00:00

130 lines
3.6 KiB
C++

#include "ShortcutHelpDialog.hpp"
// Qt Headers
#include <QTreeWidget>
#include <QSettings>
#include <QHeaderView>
// Roblox Studio Headers
#include "RobloxMainWindow.hpp"
// shortcuts that should not be visible to the average user
static const QString ShortcutExceptions = "toggleBuildModeAction filePublishedProjectsAction toggleGridAction ";
enum eShortcutTableColumns
{
STC_NAME,
STC_SHORTCUT,
STC_DESCRIPTION,
STC_MAX,
};
ShortcutHelpDialog::ShortcutHelpDialog(RobloxMainWindow& MainWindow)
: QDialog(&MainWindow, Qt::WindowTitleHint | Qt::WindowSystemMenuHint)
, mMainWindow(MainWindow)
{
setAttribute(Qt::WA_DeleteOnClose, false);
setWindowTitle("Customize Shorcuts");
initialize();
populate();
// restore window state
QSettings settings;
restoreGeometry(settings.value(windowTitle() + "/Geometry").toByteArray());
}
ShortcutHelpDialog::~ShortcutHelpDialog()
{
// save window state
QSettings settings;
settings.setValue(windowTitle() + "/Geometry", saveGeometry());
}
/**
* Set up controls.
*/
void ShortcutHelpDialog::initialize()
{
AYAASSERT(!layout());
Aya::BaldPtr<QLayout> layout = new QVBoxLayout;
mTree = new QTreeWidget(this);
layout->addWidget(mTree);
setLayout(layout);
mTree->setSelectionMode(QAbstractItemView::NoSelection);
mTree->setHeaderHidden(false);
mTree->setContextMenuPolicy(Qt::NoContextMenu);
mTree->setDragEnabled(false);
mTree->setColumnCount(STC_MAX);
mTree->setSortingEnabled(true);
Aya::BaldPtr<QTreeWidgetItem> header_item = mTree->headerItem();
header_item->setText(STC_NAME, "Name");
header_item->setText(STC_SHORTCUT, "Shortcut");
header_item->setText(STC_DESCRIPTION, "Description");
Aya::BaldPtr<QHeaderView> header_view = mTree->header();
header_view->setStretchLastSection(true);
for (int i = 0; i < STC_MAX - 1; ++i)
header_view->setSectionResizeMode(i, QHeaderView::ResizeToContents);
}
/**
* Populates the controls with data.
*/
void ShortcutHelpDialog::populate()
{
mTree->setUpdatesEnabled(false);
mTree->clear();
// hide the toolbars
QObjectList objects = mMainWindow.children();
QObjectList::iterator iter = objects.begin();
for (; iter != objects.end(); ++iter)
{
Aya::BaldPtr<QAction> action = dynamic_cast<QAction*>(*iter);
if (action && !action->text().isEmpty() && !action->text().startsWith("&") && !action->shortcuts().empty() &&
!ShortcutExceptions.contains(action->objectName()))
{
Aya::BaldPtr<QTreeWidgetItem> item = new QTreeWidgetItem(mTree);
item->setText(STC_NAME, action->text());
// set icon
QIcon icon = action->icon();
if (icon.isNull())
{
// make a valid icon
QPixmap pix(16, 16);
pix.fill(QColor(0, 0, 0, 0)); // transparent
icon = QIcon(pix);
}
item->setIcon(STC_NAME, icon);
// set shortcut key sequence text
QList<QKeySequence> shortcuts = action->shortcuts();
QString shortcutText;
for (int i = 0; i < shortcuts.size(); ++i)
{
if (i > 0)
shortcutText.append(", ");
shortcutText += shortcuts[i].toString(QKeySequence::NativeText);
}
item->setText(STC_SHORTCUT, shortcutText);
// set status tip
item->setText(STC_DESCRIPTION, action->statusTip());
}
}
mTree->sortItems(STC_NAME, Qt::AscendingOrder);
mTree->setUpdatesEnabled(true);
}