Changed Qt GUI hot key set logic to be more like Win32 version. Each key now spawns a set/clear key state dialog window.

This commit is contained in:
mjbudd77 2021-03-30 04:32:00 -04:00
parent cf7d23694c
commit 1d7dd522ba
2 changed files with 232 additions and 97 deletions

View File

@ -79,8 +79,8 @@ HotKeyConfDialog_t::HotKeyConfDialog_t(QWidget *parent)
tree->addTopLevelItem(item);
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemNeverHasChildren );
item->setCheckState( 0, Qt::Checked );
//item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemNeverHasChildren );
//item->setCheckState( 0, Qt::Checked );
item->setText(0, QString::fromStdString(optionName));
item->setText(1, QString::fromStdString(keyName));
@ -89,6 +89,10 @@ HotKeyConfDialog_t::HotKeyConfDialog_t(QWidget *parent)
item->setTextAlignment(1, Qt::AlignCenter);
}
connect( tree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(hotKeyDoubleClicked(QTreeWidgetItem*,int) ) );
connect( tree, SIGNAL(itemActivated(QTreeWidgetItem*,int)), this, SLOT(hotKeyActivated(QTreeWidgetItem*,int) ) );
mainLayout->addWidget(tree);
closeButton = new QPushButton( tr("Close") );
@ -123,105 +127,36 @@ void HotKeyConfDialog_t::closeWindow(void)
deleteLater();
}
//----------------------------------------------------------------------------
void HotKeyConfDialog_t::assignHotkey(QKeyEvent *event)
{
bool keyIsModifier;
QKeySequence ks( event->modifiers() + event->key() );
SDL_Keycode k = convQtKey2SDLKeyCode((Qt::Key)event->key());
SDL_Keymod m = convQtKey2SDLModifier(event->modifiers());
keyIsModifier = (k == SDLK_LCTRL) || (k == SDLK_RCTRL) ||
(k == SDLK_LSHIFT) || (k == SDLK_RSHIFT) ||
(k == SDLK_LALT) || (k == SDLK_RALT) ||
(k == SDLK_LGUI) || (k == SDLK_RGUI) ||
(k == SDLK_CAPSLOCK);
//printf("Assign: '%s' %i 0x%08x\n", ks.toString().toStdString().c_str(), event->key(), event->key() );
if ((k != SDLK_UNKNOWN) && !keyIsModifier)
{
QList<QTreeWidgetItem *> l;
l = tree->selectedItems();
for (size_t i = 0; i < l.size(); i++)
{
int j, idx;
QString qs;
QTreeWidgetItem *item;
std::string keyText;
char keyName[128];
char buf[256];
keyText = ks.toString().toStdString();
//j = 0;
//if (m & (KMOD_LSHIFT | KMOD_RSHIFT))
//{
// if (j > 0)
// {
// keyText.append("+");
// }
// keyText.append("Shift");
// j++;
//}
//if (m & (KMOD_LALT | KMOD_RALT))
//{
// if (j > 0)
// {
// keyText.append("+");
// }
// keyText.append("Alt");
// j++;
//}
//if (m & (KMOD_LCTRL | KMOD_RCTRL))
//{
// if (j > 0)
// {
// keyText.append("+");
// }
// keyText.append("Ctrl");
// j++;
//}
//sprintf(buf, " key=%s", SDL_GetKeyName(k));
//keyText.append(buf);
item = l.at(i);
idx = tree->indexOfTopLevelItem(item);
qs = item->text(0);
g_config->setOption(qs.toStdString(), keyText);
setHotKeys();
Hotkeys[idx].getString(keyName);
item->setText(1, QString::fromStdString(keyName));
//printf("Hotkey Window Key Press: 0x%x item:%p\n '%s' : %i\n",
// k, item, qs.toStdString().c_str(), idx );
}
}
}
//----------------------------------------------------------------------------
void HotKeyConfDialog_t::keyPressEvent(QKeyEvent *event)
{
//printf("Hotkey Window Key Press: 0x%x \n", event->key() );
assignHotkey(event);
event->accept();
}
//----------------------------------------------------------------------------
void HotKeyConfDialog_t::keyReleaseEvent(QKeyEvent *event)
{
//printf("Hotkey Window Key Release: 0x%x \n", event->key() );
assignHotkey(event);
event->accept();
}
//----------------------------------------------------------------------------
void HotKeyConfDialog_t::hotKeyActivated(QTreeWidgetItem *item, int column)
{
int row = tree->indexOfTopLevelItem( item );
HotKeyConfSetDialog_t *win = new HotKeyConfSetDialog_t( row, 1, item, this );
win->exec();
}
//----------------------------------------------------------------------------
void HotKeyConfDialog_t::hotKeyDoubleClicked(QTreeWidgetItem *item, int column)
{
int row = tree->indexOfTopLevelItem( item );
HotKeyConfSetDialog_t *win = new HotKeyConfSetDialog_t( row, 0, item, this );
win->exec();
}
//----------------------------------------------------------------------------
HotKeyConfTree_t::HotKeyConfTree_t(QWidget *parent)
: QTreeWidget(parent)
{
@ -235,19 +170,191 @@ HotKeyConfTree_t::~HotKeyConfTree_t(void)
//----------------------------------------------------------------------------
void HotKeyConfTree_t::keyPressEvent(QKeyEvent *event)
{
if ( parent() )
{
static_cast<HotKeyConfDialog_t*>(parent())->assignHotkey(event);
}
event->accept();
//if ( parent() )
//{
// static_cast<HotKeyConfDialog_t*>(parent())->assignHotkey(event);
//}
//if ( event->key() == Qt::Key_Enter )
//{
// QTreeWidgetItem *item;
// item = currentItem();
// event->accept();
// if ( item )
// {
// HotKeyConfSetDialog_t *win = new HotKeyConfSetDialog_t( indexOfTopLevelItem( item ), item, this );
// win->exec();
// }
//}
//else
//{
QTreeWidget::keyPressEvent(event);
//}
}
//----------------------------------------------------------------------------
void HotKeyConfTree_t::keyReleaseEvent(QKeyEvent *event)
{
if ( parent() )
//if ( parent() )
//{
// static_cast<HotKeyConfDialog_t*>(parent())->assignHotkey(event);
//}
QTreeWidget::keyReleaseEvent(event);
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
HotKeyConfSetDialog_t::HotKeyConfSetDialog_t( int hkIndex, int discardNum, QTreeWidgetItem *itemIn, QWidget *parent )
: QDialog(parent)
{
QVBoxLayout *mainLayout;
QHBoxLayout *hbox;
QPushButton *clearButton, *okButton;
idx = hkIndex;
item = itemIn;
discardCount = discardNum;
setWindowTitle("Set Hot Key");
mainLayout = new QVBoxLayout();
hbox = new QHBoxLayout();
keySeqText = new QLineEdit();
keySeqText->setReadOnly(true);
keySeqText->setText( tr("Press a Key") );
mainLayout->addWidget(keySeqText);
mainLayout->addLayout( hbox );
clearButton = new QPushButton( tr("Clear") );
okButton = new QPushButton( tr("Ok") );
clearButton->setIcon(style()->standardIcon(QStyle::SP_DialogResetButton));
okButton->setIcon(style()->standardIcon(QStyle::SP_DialogApplyButton));
hbox->addWidget( clearButton );
hbox->addWidget( okButton );
setLayout( mainLayout );
connect( clearButton, SIGNAL(clicked(void)), this, SLOT(cleanButtonCB(void)) );
connect( okButton, SIGNAL(clicked(void)), this, SLOT( okButtonCB(void)) );
}
//----------------------------------------------------------------------------
HotKeyConfSetDialog_t::~HotKeyConfSetDialog_t(void)
{
}
//----------------------------------------------------------------------------
void HotKeyConfSetDialog_t::closeEvent(QCloseEvent *event)
{
//printf("Hot Key Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------------------------------
void HotKeyConfSetDialog_t::closeWindow(void)
{
//printf("Close Window\n");
done(0);
deleteLater();
}
//----------------------------------------------------------------------------
void HotKeyConfSetDialog_t::keyPressEvent(QKeyEvent *event)
{
//printf("Hotkey Window Key Press: 0x%x \n", event->key() );
if ( discardCount == 0 )
{
static_cast<HotKeyConfDialog_t*>(parent())->assignHotkey(event);
assignHotkey(event);
}
else if ( discardCount > 0 )
{
discardCount--;
}
event->accept();
}
//----------------------------------------------------------------------------
void HotKeyConfSetDialog_t::keyReleaseEvent(QKeyEvent *event)
{
if ( discardCount == 0 )
{
assignHotkey(event);
}
else if ( discardCount > 0 )
{
discardCount--;
}
//printf("Hotkey Window Key Release: 0x%x \n", event->key() );
//assignHotkey(event);
event->accept();
}
//----------------------------------------------------------------------------
void HotKeyConfSetDialog_t::assignHotkey(QKeyEvent *event)
{
bool keyIsModifier;
QKeySequence ks( event->modifiers() + event->key() );
SDL_Keycode k = convQtKey2SDLKeyCode((Qt::Key)event->key());
//SDL_Keymod m = convQtKey2SDLModifier(event->modifiers());
keyIsModifier = (k == SDLK_LCTRL) || (k == SDLK_RCTRL) ||
(k == SDLK_LSHIFT) || (k == SDLK_RSHIFT) ||
(k == SDLK_LALT) || (k == SDLK_RALT) ||
(k == SDLK_LGUI) || (k == SDLK_RGUI) ||
(k == SDLK_CAPSLOCK);
//printf("Assign: '%s' %i 0x%08x\n", ks.toString().toStdString().c_str(), event->key(), event->key() );
if ((k != SDLK_UNKNOWN) && !keyIsModifier)
{
std::string keyText;
std::string prefix = "SDL.Hotkeys.";
std::string confName;
confName = prefix + Hotkeys[idx].getConfigName();
keyText = ks.toString().toStdString();
g_config->setOption( confName, keyText);
setHotKeys();
if ( item )
{
item->setText(1, QString::fromStdString(keyText));
}
done(0);
deleteLater();
}
}
//----------------------------------------------------------------------------
void HotKeyConfSetDialog_t::cleanButtonCB(void)
{
std::string prefix = "SDL.Hotkeys.";
std::string confName;
confName = prefix + Hotkeys[idx].getConfigName();
g_config->setOption( confName, "");
setHotKeys();
if ( item )
{
item->setText(1, tr(""));
}
done(0);
deleteLater();
}
//----------------------------------------------------------------------------
void HotKeyConfSetDialog_t::okButtonCB(void)
{
done(0);
deleteLater();
}
//----------------------------------------------------------------------------

View File

@ -10,6 +10,7 @@
#include <QComboBox>
#include <QCheckBox>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QFrame>
#include <QGroupBox>
@ -18,6 +19,32 @@
#include "Qt/main.h"
class HotKeyConfSetDialog_t : public QDialog
{
Q_OBJECT
public:
HotKeyConfSetDialog_t( int hkIndex, int discardNum, QTreeWidgetItem *itemIn = 0, QWidget *parent = 0);
~HotKeyConfSetDialog_t(void);
protected:
void closeEvent(QCloseEvent *event);
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
void assignHotkey(QKeyEvent *event);
QLineEdit *keySeqText;
QTreeWidgetItem *item;
int idx;
int discardCount;
public slots:
void closeWindow(void);
void cleanButtonCB(void);
void okButtonCB(void);
};
class HotKeyConfTree_t : public QTreeWidget
{
Q_OBJECT
@ -39,7 +66,6 @@ public:
HotKeyConfDialog_t(QWidget *parent = 0);
~HotKeyConfDialog_t(void);
void assignHotkey(QKeyEvent *event);
protected:
void closeEvent(QCloseEvent *event);
void keyPressEvent(QKeyEvent *event);
@ -51,4 +77,6 @@ private:
public slots:
void closeWindow(void);
private slots:
void hotKeyActivated(QTreeWidgetItem *item, int column);
void hotKeyDoubleClicked(QTreeWidgetItem *item, int column);
};