1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

Merge pull request #3383

Colomban Wendling (10):
      fix(capslockindicator): fix altering the line edit height
      fix(capslock_x11): properly release the X display handle
      refactor(capslockindicator): encapsulate event handling
      fix(capslockindicator): also update indicator when the app gets focus
      refactor(capslockindicator): expose as a QAction to simplify API
      refactor(capslockindicator): use a single shared event handler
      refactor(capslockindicator): avoid overhead on OSX
      refactor: replace CapsLockIndicator with new PasswordEdit widget
      fix(passwordfields): use PasswordEdit widget for all password fields
      refactor(passwordedit): don't add the caps indicator at all if disabled
This commit is contained in:
sudden6 2016-06-19 13:49:28 +02:00
commit fd2e5859fb
No known key found for this signature in database
GPG Key ID: 279509B499E032B9
10 changed files with 162 additions and 117 deletions

View File

@ -354,7 +354,7 @@ HEADERS += \
src/widget/about/aboutuser.h \ src/widget/about/aboutuser.h \
src/widget/form/groupinviteform.h \ src/widget/form/groupinviteform.h \
src/widget/tool/profileimporter.h \ src/widget/tool/profileimporter.h \
src/widget/capslockindicator.h src/widget/passwordedit.h
SOURCES += \ SOURCES += \
src/ipc.cpp \ src/ipc.cpp \
@ -471,4 +471,4 @@ SOURCES += \
src/widget/about/aboutuser.cpp \ src/widget/about/aboutuser.cpp \
src/widget/form/groupinviteform.cpp \ src/widget/form/groupinviteform.cpp \
src/widget/tool/profileimporter.cpp \ src/widget/tool/profileimporter.cpp \
src/widget/capslockindicator.cpp src/widget/passwordedit.cpp

View File

@ -130,11 +130,7 @@
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QLineEdit" name="newPass"> <widget class="PasswordEdit" name="newPass"/>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_8"> <widget class="QLabel" name="label_8">
@ -147,11 +143,7 @@
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLineEdit" name="newPassConfirm"> <widget class="PasswordEdit" name="newPassConfirm"/>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item> </item>
<item row="7" column="0" colspan="2"> <item row="7" column="0" colspan="2">
<widget class="QProgressBar" name="passStrengthMeter"> <widget class="QProgressBar" name="passStrengthMeter">
@ -302,11 +294,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLineEdit" name="loginPassword"> <widget class="PasswordEdit" name="loginPassword"/>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="autoLoginCB"> <widget class="QCheckBox" name="autoLoginCB">
@ -431,6 +419,13 @@
</property> </property>
</widget> </widget>
</widget> </widget>
<customwidgets>
<customwidget>
<class>PasswordEdit</class>
<extends>QLineEdit</extends>
<header>src/widget/passwordedit.h</header>
</customwidget>
</customwidgets>
<resources> <resources>
<include location="../res.qrc"/> <include location="../res.qrc"/>
</resources> </resources>

View File

@ -35,6 +35,7 @@ bool Platform::capsLockEnabled()
unsigned n; unsigned n;
XkbGetIndicatorState(d, XkbUseCoreKbd, &n); XkbGetIndicatorState(d, XkbUseCoreKbd, &n);
caps_state = (n & 0x01) == 1; caps_state = (n & 0x01) == 1;
XCloseDisplay(d);
} }
return caps_state; return caps_state;
} }

View File

@ -1,54 +0,0 @@
#include "capslockindicator.h"
#ifdef QTOX_PLATFORM_EXT
#include "src/platform/capslock.h"
#endif
CapsLockIndicator::CapsLockIndicator(QWidget *parent) : QToolButton(parent)
{
cleanInputStyle = parentWidget()->styleSheet();
QIcon icon = QIcon(":img/caps_lock.svg");
setIcon(icon);
setCursor(Qt::ArrowCursor);
setStyleSheet("border: none; padding: 0; color: white");
setToolTip(tr("CAPS-LOCK ENABLED"));
updateSize();
}
void CapsLockIndicator::updateSize()
{
inputSize = parentWidget()->size();
move(inputSize.width() - inputSize.height(), 0);
int side = inputSize.height() - 5;
QSize iconSize(side, side);
setIconSize(iconSize);
}
void CapsLockIndicator::show()
{
QToolButton::show();
QString style = QString("padding: -3px %1px -3px -6px; color: white").arg(iconSize().width() - 3);
parentWidget()->setStyleSheet(style);
}
void CapsLockIndicator::hide()
{
QToolButton::hide();
parentWidget()->setStyleSheet(cleanInputStyle);
}
void CapsLockIndicator::updateIndicator()
{
bool caps = false;
// It doesn't needed for OSX, because it shows indicator by default
#if defined(QTOX_PLATFORM_EXT) && !defined(Q_OS_OSX)
caps = Platform::capsLockEnabled();
#endif
if (caps)
show();
else
hide();
}

View File

@ -1,21 +0,0 @@
#ifndef CAPSLOCKINDICATOR_H
#define CAPSLOCKINDICATOR_H
#include <QToolButton>
class CapsLockIndicator : QToolButton
{
public:
CapsLockIndicator(QWidget *widget);
void updateIndicator();
void updateSize();
private:
void show();
void hide();
private:
QString cleanInputStyle;
QSize inputSize;
};
#endif // CAPSLOCKINDICATOR_H

View File

@ -43,18 +43,10 @@
</widget> </widget>
</item> </item>
<item row="4" column="1"> <item row="4" column="1">
<widget class="QLineEdit" name="repasswordlineEdit"> <widget class="PasswordEdit" name="repasswordlineEdit"/>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QLineEdit" name="passwordlineEdit"> <widget class="PasswordEdit" name="passwordlineEdit"/>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item> </item>
<item row="6" column="0" colspan="2"> <item row="6" column="0" colspan="2">
<widget class="QProgressBar" name="passStrengthMeter"> <widget class="QProgressBar" name="passStrengthMeter">
@ -96,6 +88,13 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<customwidgets>
<customwidget>
<class>PasswordEdit</class>
<extends>QLineEdit</extends>
<header>src/widget/passwordedit.h</header>
</customwidget>
</customwidgets>
<tabstops> <tabstops>
<tabstop>passwordlineEdit</tabstop> <tabstop>passwordlineEdit</tabstop>
<tabstop>repasswordlineEdit</tabstop> <tabstop>repasswordlineEdit</tabstop>

View File

@ -58,9 +58,6 @@ LoginScreen::LoginScreen(QWidget *parent) :
connect(ui->autoLoginCB, &QCheckBox::stateChanged, this, &LoginScreen::onAutoLoginToggled); connect(ui->autoLoginCB, &QCheckBox::stateChanged, this, &LoginScreen::onAutoLoginToggled);
connect(ui->importButton, &QPushButton::clicked, this, &LoginScreen::onImportProfile); connect(ui->importButton, &QPushButton::clicked, this, &LoginScreen::onImportProfile);
capsIndicator = new CapsLockIndicator(ui->newPass);
confimCapsIndicator = new CapsLockIndicator(ui->newPassConfirm);
reset(); reset();
this->setStyleSheet(Style::getStylesheet(":/ui/loginScreen/loginScreen.css")); this->setStyleSheet(Style::getStylesheet(":/ui/loginScreen/loginScreen.css"));
@ -72,8 +69,6 @@ LoginScreen::~LoginScreen()
{ {
Translator::unregister(this); Translator::unregister(this);
delete ui; delete ui;
delete capsIndicator;
delete confimCapsIndicator;
} }
void LoginScreen::reset() void LoginScreen::reset()
@ -120,11 +115,6 @@ bool LoginScreen::event(QEvent* event)
emit windowStateChanged(windowState()); emit windowStateChanged(windowState());
break; break;
#endif #endif
case QEvent::Show:
case QEvent::KeyRelease:
capsIndicator->updateIndicator();
confimCapsIndicator->updateIndicator();
break;
default: default:
break; break;
} }
@ -136,8 +126,6 @@ bool LoginScreen::event(QEvent* event)
void LoginScreen::onNewProfilePageClicked() void LoginScreen::onNewProfilePageClicked()
{ {
ui->stackedWidget->setCurrentIndex(0); ui->stackedWidget->setCurrentIndex(0);
capsIndicator->updateSize();
confimCapsIndicator->updateSize();
} }
void LoginScreen::onLoginPageClicked() void LoginScreen::onLoginPageClicked()

View File

@ -21,7 +21,6 @@
#ifndef LOGINSCREEN_H #ifndef LOGINSCREEN_H
#define LOGINSCREEN_H #define LOGINSCREEN_H
#include "capslockindicator.h"
#include <QWidget> #include <QWidget>
#include <QShortcut> #include <QShortcut>
#include <QToolButton> #include <QToolButton>
@ -67,8 +66,6 @@ private:
private: private:
Ui::LoginScreen *ui; Ui::LoginScreen *ui;
QShortcut quitShortcut; QShortcut quitShortcut;
CapsLockIndicator *capsIndicator;
CapsLockIndicator *confimCapsIndicator;
}; };
#endif // LOGINSCREEN_H #endif // LOGINSCREEN_H

103
src/widget/passwordedit.cpp Normal file
View File

@ -0,0 +1,103 @@
#include "passwordedit.h"
#ifdef QTOX_PLATFORM_EXT
#include "src/platform/capslock.h"
#endif
#include <QCoreApplication>
// It isn't needed for OSX, because it shows indicator by default
#if defined(QTOX_PLATFORM_EXT) && !defined(Q_OS_OSX)
#define ENABLE_CAPSLOCK_INDICATOR
#endif
PasswordEdit::EventHandler* PasswordEdit::eventHandler{nullptr};
PasswordEdit::PasswordEdit(QWidget* parent) :
QLineEdit(parent),
action(new QAction(this))
{
setEchoMode(QLineEdit::Password);
#ifdef ENABLE_CAPSLOCK_INDICATOR
action->setIcon(QIcon(":img/caps_lock.svg"));
action->setToolTip(tr("CAPS-LOCK ENABLED"));
addAction(action, QLineEdit::TrailingPosition);
#endif
}
PasswordEdit::~PasswordEdit()
{
unregisterHandler();
}
void PasswordEdit::registerHandler()
{
#ifdef ENABLE_CAPSLOCK_INDICATOR
if (!eventHandler)
eventHandler = new EventHandler();
if (!eventHandler->actions.contains(action))
eventHandler->actions.append(action);
#endif
}
void PasswordEdit::unregisterHandler()
{
#ifdef ENABLE_CAPSLOCK_INDICATOR
if (eventHandler && eventHandler->actions.contains(action))
{
eventHandler->actions.removeOne(action);
if (eventHandler->actions.isEmpty())
{
delete eventHandler;
eventHandler = nullptr;
}
}
#endif
}
void PasswordEdit::showEvent(QShowEvent*)
{
#ifdef ENABLE_CAPSLOCK_INDICATOR
action->setVisible(Platform::capsLockEnabled());
#endif
registerHandler();
}
void PasswordEdit::hideEvent(QHideEvent*)
{
unregisterHandler();
}
#ifdef ENABLE_CAPSLOCK_INDICATOR
PasswordEdit::EventHandler::EventHandler()
{
QCoreApplication::instance()->installEventFilter(this);
}
PasswordEdit::EventHandler::~EventHandler()
{
QCoreApplication::instance()->removeEventFilter(this);
}
void PasswordEdit::EventHandler::updateActions()
{
bool caps = Platform::capsLockEnabled();
for (QAction* action : actions)
action->setVisible(caps);
}
bool PasswordEdit::EventHandler::eventFilter(QObject *obj, QEvent *event)
{
switch (event->type())
{
case QEvent::WindowActivate:
case QEvent::KeyRelease:
updateActions();
break;
default:
break;
}
return QObject::eventFilter(obj, event);
}
#endif // ENABLE_CAPSLOCK_INDICATOR

37
src/widget/passwordedit.h Normal file
View File

@ -0,0 +1,37 @@
#ifndef PASSWORDEDIT_H
#define PASSWORDEDIT_H
#include <QAction>
#include <QLineEdit>
class PasswordEdit : public QLineEdit
{
public:
PasswordEdit(QWidget *parent);
~PasswordEdit();
protected:
virtual void showEvent(QShowEvent* event);
virtual void hideEvent(QHideEvent* event);
private:
class EventHandler : QObject
{
public:
QVector<QAction*> actions;
EventHandler();
~EventHandler();
void updateActions();
bool eventFilter(QObject *obj, QEvent *event);
};
void registerHandler();
void unregisterHandler();
private:
QAction* action;
static EventHandler* eventHandler;
};
#endif // PASSWORDEDIT_H