mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-01-11 15:27:54 +00:00
Put macOS specific functions to MacUtils namespace
This commit is contained in:
parent
d57bd62add
commit
d7fa5b6b6b
@ -33,9 +33,12 @@
|
||||
#include <QSize>
|
||||
#include <objc/objc.h>
|
||||
|
||||
QPixmap pixmapForExtension(const QString &ext, const QSize &size);
|
||||
void overrideDockClickHandler(bool (*dockClickHandler)(id, SEL, ...));
|
||||
void displayNotification(const QString &title, const QString &message);
|
||||
void openFiles(const QSet<QString> &pathsList);
|
||||
namespace MacUtils
|
||||
{
|
||||
QPixmap pixmapForExtension(const QString &ext, const QSize &size);
|
||||
void overrideDockClickHandler(bool (*dockClickHandler)(id, SEL, ...));
|
||||
void displayNotification(const QString &title, const QString &message);
|
||||
void openFiles(const QSet<QString> &pathsList);
|
||||
}
|
||||
|
||||
#endif // MACUTILITIES_H
|
||||
|
@ -33,64 +33,67 @@
|
||||
#include <objc/message.h>
|
||||
#import <Cocoa/Cocoa.h>
|
||||
|
||||
QPixmap pixmapForExtension(const QString &ext, const QSize &size)
|
||||
namespace MacUtils
|
||||
{
|
||||
@autoreleasepool {
|
||||
NSImage *image = [[NSWorkspace sharedWorkspace] iconForFileType:ext.toNSString()];
|
||||
if (image) {
|
||||
NSRect rect = NSMakeRect(0, 0, size.width(), size.height());
|
||||
CGImageRef cgImage = [image CGImageForProposedRect:&rect context:nil hints:nil];
|
||||
return QtMac::fromCGImageRef(cgImage);
|
||||
QPixmap pixmapForExtension(const QString &ext, const QSize &size)
|
||||
{
|
||||
@autoreleasepool {
|
||||
NSImage *image = [[NSWorkspace sharedWorkspace] iconForFileType:ext.toNSString()];
|
||||
if (image) {
|
||||
NSRect rect = NSMakeRect(0, 0, size.width(), size.height());
|
||||
CGImageRef cgImage = [image CGImageForProposedRect:&rect context:nil hints:nil];
|
||||
return QtMac::fromCGImageRef(cgImage);
|
||||
}
|
||||
|
||||
return QPixmap();
|
||||
}
|
||||
}
|
||||
|
||||
return QPixmap();
|
||||
}
|
||||
}
|
||||
|
||||
void overrideDockClickHandler(bool (*dockClickHandler)(id, SEL, ...))
|
||||
{
|
||||
NSApplication *appInst = [NSApplication sharedApplication];
|
||||
|
||||
if (!appInst)
|
||||
return;
|
||||
|
||||
Class delClass = [[appInst delegate] class];
|
||||
SEL shouldHandle = sel_registerName("applicationShouldHandleReopen:hasVisibleWindows:");
|
||||
|
||||
if (class_getInstanceMethod(delClass, shouldHandle)) {
|
||||
if (class_replaceMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:"))
|
||||
qDebug("Registered dock click handler (replaced original method)");
|
||||
else
|
||||
qWarning("Failed to replace method for dock click handler");
|
||||
}
|
||||
else {
|
||||
if (class_addMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:"))
|
||||
qDebug("Registered dock click handler");
|
||||
else
|
||||
qWarning("Failed to register dock click handler");
|
||||
}
|
||||
}
|
||||
|
||||
void displayNotification(const QString &title, const QString &message)
|
||||
{
|
||||
@autoreleasepool {
|
||||
NSUserNotification *notification = [[NSUserNotification alloc] init];
|
||||
notification.title = title.toNSString();
|
||||
notification.informativeText = message.toNSString();
|
||||
notification.soundName = NSUserNotificationDefaultSoundName;
|
||||
|
||||
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification];
|
||||
}
|
||||
}
|
||||
|
||||
void openFiles(const QSet<QString> &pathsList)
|
||||
{
|
||||
@autoreleasepool {
|
||||
NSMutableArray *pathURLs = [NSMutableArray arrayWithCapacity:pathsList.size()];
|
||||
|
||||
for (const auto &path : pathsList)
|
||||
[pathURLs addObject:[NSURL fileURLWithPath:path.toNSString()]];
|
||||
|
||||
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:pathURLs];
|
||||
void overrideDockClickHandler(bool (*dockClickHandler)(id, SEL, ...))
|
||||
{
|
||||
NSApplication *appInst = [NSApplication sharedApplication];
|
||||
|
||||
if (!appInst)
|
||||
return;
|
||||
|
||||
Class delClass = [[appInst delegate] class];
|
||||
SEL shouldHandle = sel_registerName("applicationShouldHandleReopen:hasVisibleWindows:");
|
||||
|
||||
if (class_getInstanceMethod(delClass, shouldHandle)) {
|
||||
if (class_replaceMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:"))
|
||||
qDebug("Registered dock click handler (replaced original method)");
|
||||
else
|
||||
qWarning("Failed to replace method for dock click handler");
|
||||
}
|
||||
else {
|
||||
if (class_addMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:"))
|
||||
qDebug("Registered dock click handler");
|
||||
else
|
||||
qWarning("Failed to register dock click handler");
|
||||
}
|
||||
}
|
||||
|
||||
void displayNotification(const QString &title, const QString &message)
|
||||
{
|
||||
@autoreleasepool {
|
||||
NSUserNotification *notification = [[NSUserNotification alloc] init];
|
||||
notification.title = title.toNSString();
|
||||
notification.informativeText = message.toNSString();
|
||||
notification.soundName = NSUserNotificationDefaultSoundName;
|
||||
|
||||
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification];
|
||||
}
|
||||
}
|
||||
|
||||
void openFiles(const QSet<QString> &pathsList)
|
||||
{
|
||||
@autoreleasepool {
|
||||
NSMutableArray *pathURLs = [NSMutableArray arrayWithCapacity:pathsList.size()];
|
||||
|
||||
for (const auto &path : pathsList)
|
||||
[pathURLs addObject:[NSURL fileURLWithPath:path.toNSString()]];
|
||||
|
||||
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:pathURLs];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1298,7 +1298,7 @@ static bool dockClickHandler(id self, SEL cmd, ...)
|
||||
void MainWindow::setupDockClickHandler()
|
||||
{
|
||||
dockMainWindowHandle = this;
|
||||
overrideDockClickHandler(dockClickHandler);
|
||||
MacUtils::overrideDockClickHandler(dockClickHandler);
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -1557,7 +1557,7 @@ void MainWindow::showNotificationBaloon(QString title, QString msg) const
|
||||
if (!reply.isError())
|
||||
return;
|
||||
#elif defined(Q_OS_MAC)
|
||||
displayNotification(title, msg);
|
||||
MacUtils::displayNotification(title, msg);
|
||||
#else
|
||||
if (m_systrayIcon && QSystemTrayIcon::supportsMessages())
|
||||
m_systrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON);
|
||||
|
@ -150,7 +150,7 @@ namespace
|
||||
{
|
||||
QPixmap pixmapForExtension(const QString &ext) const override
|
||||
{
|
||||
return ::pixmapForExtension(ext, QSize(32, 32));
|
||||
return MacUtils::pixmapForExtension(ext, QSize(32, 32));
|
||||
}
|
||||
};
|
||||
#else
|
||||
|
@ -559,7 +559,7 @@ void TransferListWidget::openSelectedTorrentsFolder() const
|
||||
QString path = torrent->contentPath(true);
|
||||
pathsList.insert(path);
|
||||
}
|
||||
openFiles(pathsList);
|
||||
MacUtils::openFiles(pathsList);
|
||||
#else
|
||||
foreach (BitTorrent::TorrentHandle *const torrent, getSelectedTorrents()) {
|
||||
QString path = torrent->contentPath(true);
|
||||
|
Loading…
Reference in New Issue
Block a user