openmw-tes3coop/apps/opencs/view/widget/pushbutton.cpp

189 lines
5.1 KiB
C++
Raw Normal View History

2014-07-10 09:03:55 +00:00
#include "pushbutton.hpp"
#include <QMouseEvent>
#include <QKeyEvent>
#include "../../model/prefs/state.hpp"
void CSVWidget::PushButton::processShortcuts()
{
const QChar SequenceStart = '{';
const QChar SequenceEnd = '}';
const QString ModifierSequence = QString::fromUtf8(":mod");
const QChar SettingSeparator = ';';
QStringList substrings;
int prevIndex = 0;
int startIndex = mToolTip.indexOf(SequenceStart);
int endIndex = (startIndex != -1) ? mToolTip.indexOf(SequenceEnd, startIndex) : -1;
// Process every valid shortcut escape sequence
while (startIndex != -1 && endIndex != -1)
{
int count = startIndex - prevIndex;
if (count > 0)
{
substrings.push_back(mToolTip.mid(prevIndex, count));
}
// Find sequence name
count = endIndex - startIndex - 1;
if (count > 0)
{
// Check if looking for modifier
int separatorIndex = mToolTip.indexOf(ModifierSequence, startIndex);
if (separatorIndex != -1 && separatorIndex < endIndex)
{
count = separatorIndex - startIndex - 1;
QString settingName = mToolTip.mid(startIndex+1, count);
QString value = QString::fromUtf8(
CSMPrefs::State::get()["Key Bindings"][settingName.toUtf8().data()].toString().c_str());
substrings.push_back(value.right(value.size() - value.indexOf(SettingSeparator) - 1));
}
else
{
QString settingName = mToolTip.mid(startIndex+1, count);
QString value = QString::fromUtf8(
CSMPrefs::State::get()["Key Bindings"][settingName.toUtf8().data()].toString().c_str());
// Don't want modifier
substrings.push_back(value.left(value.indexOf(SettingSeparator)));
}
prevIndex = endIndex + 1;
}
startIndex = mToolTip.indexOf(SequenceStart, endIndex);
endIndex = (startIndex != -1) ? mToolTip.indexOf(SequenceEnd, startIndex) : -1;
}
if (prevIndex < mToolTip.size())
{
substrings.push_back(mToolTip.mid(prevIndex));
}
mProcessedToolTip = substrings.join("");
}
void CSVWidget::PushButton::setExtendedToolTip()
2014-07-10 10:53:57 +00:00
{
QString tooltip = mProcessedToolTip;
2014-07-10 10:53:57 +00:00
if (tooltip.isEmpty())
2014-07-10 10:53:57 +00:00
tooltip = "(Tool tip not implemented yet)";
switch (mType)
{
case Type_TopMode:
tooltip +=
"<p>(left click to change mode)";
break;
case Type_TopAction:
break;
case Type_Mode:
tooltip +=
"<p>(left click to activate,"
"<br>shift-left click to activate and keep panel open)";
2014-08-12 09:07:54 +00:00
break;
2014-07-31 11:05:08 +00:00
case Type_Toggle:
tooltip += "<p>(left click to ";
tooltip += isChecked() ? "disable" : "enable";
tooltip += "<p>shift-left click to ";
tooltip += isChecked() ? "disable" : "enable";
tooltip += " and keep panel open)";
break;
}
2014-07-10 10:53:57 +00:00
setToolTip (tooltip);
2014-07-10 10:53:57 +00:00
}
2014-07-10 09:03:55 +00:00
void CSVWidget::PushButton::keyPressEvent (QKeyEvent *event)
{
if (event->key()!=Qt::Key_Shift)
mKeepOpen = false;
QPushButton::keyPressEvent (event);
}
void CSVWidget::PushButton::keyReleaseEvent (QKeyEvent *event)
{
if (event->key()==Qt::Key_Space)
mKeepOpen = event->modifiers() & Qt::ShiftModifier;
2014-07-31 11:05:08 +00:00
QPushButton::keyReleaseEvent (event);
}
2014-07-10 09:03:55 +00:00
void CSVWidget::PushButton::mouseReleaseEvent (QMouseEvent *event)
{
mKeepOpen = event->button()==Qt::LeftButton && (event->modifiers() & Qt::ShiftModifier);
QPushButton::mouseReleaseEvent (event);
}
CSVWidget::PushButton::PushButton (const QIcon& icon, Type type, const QString& tooltip,
2014-07-10 10:53:57 +00:00
QWidget *parent)
: QPushButton (icon, "", parent), mKeepOpen (false), mType (type), mToolTip (tooltip)
2014-07-10 09:03:55 +00:00
{
if (type==Type_Mode || type==Type_Toggle)
{
setCheckable (true);
connect (this, SIGNAL (toggled (bool)), this, SLOT (checkedStateChanged (bool)));
}
2014-07-31 11:05:08 +00:00
setCheckable (type==Type_Mode || type==Type_Toggle);
processShortcuts();
setExtendedToolTip();
connect (&CSMPrefs::State::get(), SIGNAL (settingChanged (const CSMPrefs::Setting *)),
this, SLOT (settingChanged (const CSMPrefs::Setting *)));
}
CSVWidget::PushButton::PushButton (Type type, const QString& tooltip, QWidget *parent)
: QPushButton (parent), mKeepOpen (false), mType (type), mToolTip (tooltip)
{
2014-07-31 11:05:08 +00:00
setCheckable (type==Type_Mode || type==Type_Toggle);
processShortcuts();
setExtendedToolTip();
2014-07-10 09:03:55 +00:00
}
bool CSVWidget::PushButton::hasKeepOpen() const
{
return mKeepOpen;
}
QString CSVWidget::PushButton::getBaseToolTip() const
{
return mProcessedToolTip;
}
CSVWidget::PushButton::Type CSVWidget::PushButton::getType() const
{
return mType;
}
void CSVWidget::PushButton::checkedStateChanged (bool checked)
{
setExtendedToolTip();
2015-03-11 14:54:45 +00:00
}
void CSVWidget::PushButton::settingChanged (const CSMPrefs::Setting *setting)
{
if (setting->getParent()->getKey() == "Key Bindings")
{
processShortcuts();
setExtendedToolTip();
}
}