mirror of https://github.com/qTox/qTox.git
Browse Source
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 disabledpull/3417/merge
10 changed files with 162 additions and 117 deletions
@ -1,54 +0,0 @@
@@ -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(); |
||||
} |
@ -1,21 +0,0 @@
@@ -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
|
@ -0,0 +1,103 @@
@@ -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
|
@ -0,0 +1,37 @@
@@ -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
|
Loading…
Reference in new issue