Fix qocoa mac build

This commit is contained in:
Jonas Kvinge
2018-09-05 18:15:28 +02:00
parent 1119c87b2f
commit 9e4f3f9867

View File

@@ -32,26 +32,21 @@ THE SOFTWARE.
#include <QKeyEvent> #include <QKeyEvent>
#include <QClipboard> #include <QClipboard>
class QSearchFieldPrivate : public QObject class QSearchFieldPrivate : public QObject {
{
public: public:
QSearchFieldPrivate(QSearchField *qSearchField, NSSearchField *nsSearchField) QSearchFieldPrivate(QSearchField *qSearchField, NSSearchField *nsSearchField)
: QObject(qSearchField), qSearchField(qSearchField), nsSearchField(nsSearchField) {} : QObject(qSearchField), qSearchField(qSearchField), nsSearchField(nsSearchField) {}
void textDidChange(const QString &text) void textDidChange(const QString &text) {
{ if (qSearchField) emit qSearchField->textChanged(text);
if (qSearchField)
emit qSearchField->textChanged(text);
} }
void textDidEndEditing() void textDidEndEditing() {
{
if (qSearchField) if (qSearchField)
emit qSearchField->editingFinished(); emit qSearchField->editingFinished();
} }
void returnPressed() void returnPressed() {
{
if (qSearchField) { if (qSearchField) {
emit qSearchField->returnPressed(); emit qSearchField->returnPressed();
QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier); QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier);
@@ -59,16 +54,14 @@ public:
} }
} }
void keyDownPressed() void keyDownPressed() {
{
if (qSearchField) { if (qSearchField) {
QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier); QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);
QApplication::postEvent(qSearchField, event); QApplication::postEvent(qSearchField, event);
} }
} }
void keyUpPressed() void keyUpPressed() {
{
if (qSearchField) { if (qSearchField) {
QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier); QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
QApplication::postEvent(qSearchField, event); QApplication::postEvent(qSearchField, event);
@@ -77,10 +70,10 @@ public:
QPointer<QSearchField> qSearchField; QPointer<QSearchField> qSearchField;
NSSearchField *nsSearchField; NSSearchField *nsSearchField;
}; };
@interface QSearchFieldDelegate : NSObject<NSTextFieldDelegate> @interface QSearchFieldDelegate : NSObject<NSTextFieldDelegate> {
{
@public @public
QPointer<QSearchFieldPrivate> pimpl; QPointer<QSearchFieldPrivate> pimpl;
} }
@@ -91,16 +84,14 @@ public:
@implementation QSearchFieldDelegate @implementation QSearchFieldDelegate
-(void)controlTextDidChange:(NSNotification*)notification { -(void)controlTextDidChange:(NSNotification*)notification {
Q_ASSERT(pimpl); Q_ASSERT(pimpl);
if (pimpl) if (pimpl) pimpl->textDidChange(toQString([[notification object] stringValue]));
pimpl->textDidChange(toQString([[notification object] stringValue]));
} }
-(void)controlTextDidEndEditing:(NSNotification*)notification { -(void)controlTextDidEndEditing:(NSNotification*)notification {
Q_UNUSED(notification); Q_UNUSED(notification);
// No Q_ASSERT here as it is called on destruction. // No Q_ASSERT here as it is called on destruction.
if (pimpl) if (!pimpl) return;
pimpl->textDidEndEditing(); pimpl->textDidEndEditing();
if ([[[notification userInfo] objectForKey:@"NSTextMovement"] intValue] == NSReturnTextMovement) if ([[[notification userInfo] objectForKey:@"NSTextMovement"] intValue] == NSReturnTextMovement)
pimpl->returnPressed(); pimpl->returnPressed();
} }
@@ -110,11 +101,11 @@ public:
(SEL)commandSelector { (SEL)commandSelector {
Q_ASSERT(pimpl); Q_ASSERT(pimpl);
if (!pimpl) return NO; if (!pimpl) return NO;
if (commandSelector == @selector(moveDown:)) { if (commandSelector == @selector(moveDown:)) {
pimpl->keyDownPressed(); pimpl->keyDownPressed();
return YES; return YES;
} else if (commandSelector == @selector(moveUp:)) { }
else if (commandSelector == @selector(moveUp:)) {
pimpl->keyUpPressed(); pimpl->keyUpPressed();
return YES; return YES;
} }
@@ -132,11 +123,9 @@ public:
// First, check if we have the focus. // First, check if we have the focus.
// If no, it probably means this event isn't for us. // If no, it probably means this event isn't for us.
NSResponder* firstResponder = [[NSApp keyWindow] firstResponder]; NSResponder* firstResponder = [[NSApp keyWindow] firstResponder];
if ([firstResponder isKindOfClass:[NSText class]] && if ([firstResponder isKindOfClass:[NSText class]] && [(NSText*)firstResponder delegate] == self) {
[(NSText*)firstResponder delegate] == self) {
if ([event type] == NSEventTypeKeyDown && [event modifierFlags] & NSEventModifierFlagCommand) if ([event type] == NSEventTypeKeyDown && [event modifierFlags] & NSEventModifierFlagCommand) {
{
QString keyString = toQString([event characters]); QString keyString = toQString([event characters]);
if (keyString == "a") // Cmd+a if (keyString == "a") // Cmd+a
{ {
@@ -165,133 +154,75 @@ public:
} }
@end @end
QSearchField::QSearchField(QWidget *parent) : QWidget(parent) QSearchField::QSearchField(QWidget *parent) : QWidget(parent) {
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSSearchField *search = [[QocoaSearchField alloc] init]; NSSearchField *search = [[QocoaSearchField alloc] init];
QSearchFieldDelegate *delegate = [[QSearchFieldDelegate alloc] init]; QSearchFieldDelegate *delegate = [[QSearchFieldDelegate alloc] init];
pimpl = delegate->pimpl = new QSearchFieldPrivate(this, search); pimpl = delegate->pimpl = new QSearchFieldPrivate(this, search);
[search setDelegate:delegate]; [search setDelegate:delegate];
setupLayout(search, this); setupLayout(search, this);
setFixedHeight(24); setFixedHeight(24);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
[search release]; [search release];
[pool drain]; [pool drain];
} }
void QSearchField::setMenu(QMenu *menu) void QSearchField::setText(const QString &text) {
{
Q_ASSERT(pimpl); Q_ASSERT(pimpl);
if (!pimpl) if (!pimpl) return;
return;
#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
NSMenu *nsMenu = menu->macMenu();
#else
NSMenu *nsMenu = menu->toNSMenu();
#endif
[[pimpl->nsSearchField cell] setSearchMenuTemplate:nsMenu];
}
void QSearchField::popupMenu()
{
}
void QSearchField::setText(const QString &text)
{
Q_ASSERT(pimpl);
if (!pimpl)
return;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pimpl->nsSearchField setStringValue:fromQString(text)]; [pimpl->nsSearchField setStringValue:fromQString(text)];
if (!text.isEmpty()) {
[pimpl->nsSearchField selectText:pimpl->nsSearchField];
[[pimpl->nsSearchField currentEditor] setSelectedRange:NSMakeRange([[pimpl->nsSearchField stringValue] length], 0)];
}
[pool drain]; [pool drain];
} }
void QSearchField::setPlaceholderText(const QString &text) void QSearchField::setPlaceholderText(const QString &text) {
{
Q_ASSERT(pimpl); Q_ASSERT(pimpl);
if (!pimpl) if (!pimpl) return;
return;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[[pimpl->nsSearchField cell] setPlaceholderString:fromQString(text)]; [[pimpl->nsSearchField cell] setPlaceholderString:fromQString(text)];
[pool drain]; [pool drain];
} }
void QSearchField::clear() void QSearchField::clear() {
{
Q_ASSERT(pimpl); Q_ASSERT(pimpl);
if (!pimpl) if (!pimpl) return;
return;
[pimpl->nsSearchField setStringValue:@""]; [pimpl->nsSearchField setStringValue:@""];
emit textChanged(QString()); emit textChanged(QString());
} }
void QSearchField::selectAll() void QSearchField::selectAll() {
{
Q_ASSERT(pimpl); Q_ASSERT(pimpl);
if (!pimpl) if (!pimpl) return;
return;
[pimpl->nsSearchField performSelector:@selector(selectText:)]; [pimpl->nsSearchField performSelector:@selector(selectText:)];
} }
QString QSearchField::text() const QString QSearchField::text() const {
{
Q_ASSERT(pimpl); Q_ASSERT(pimpl);
if (!pimpl) if (!pimpl) return QString();
return QString();
return toQString([pimpl->nsSearchField stringValue]); return toQString([pimpl->nsSearchField stringValue]);
} }
QString QSearchField::placeholderText() const QString QSearchField::placeholderText() const {
{
Q_ASSERT(pimpl); Q_ASSERT(pimpl);
if (!pimpl)
return QString();
return toQString([[pimpl->nsSearchField cell] placeholderString]); return toQString([[pimpl->nsSearchField cell] placeholderString]);
} }
void QSearchField::setFocus(Qt::FocusReason) void QSearchField::setFocus(Qt::FocusReason) {}
{
Q_ASSERT(pimpl);
if (!pimpl)
return;
if ([pimpl->nsSearchField acceptsFirstResponder]) void QSearchField::setFocus() {
[[pimpl->nsSearchField window] makeFirstResponder: pimpl->nsSearchField];
}
void QSearchField::setFocus()
{
setFocus(Qt::OtherFocusReason); setFocus(Qt::OtherFocusReason);
} }
void QSearchField::changeEvent(QEvent* event) void QSearchField::resizeEvent(QResizeEvent *resizeEvent) {
{
if (event->type() == QEvent::EnabledChange) {
Q_ASSERT(pimpl);
if (!pimpl)
return;
const bool enabled = isEnabled();
[pimpl->nsSearchField setEnabled: enabled];
}
QWidget::changeEvent(event);
}
void QSearchField::resizeEvent(QResizeEvent *resizeEvent)
{
QWidget::resizeEvent(resizeEvent); QWidget::resizeEvent(resizeEvent);
} }
bool QSearchField::eventFilter(QObject *o, QEvent *e) {
return QWidget::eventFilter(o, e);
}