Need help with QingDict?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

yingDev
205 Stars 30 Forks GNU General Public License v3.0 30 Commits 8 Opened issues

Description

Lightweight & pragmatic dictionary program for OS X. (Swift)

Services available

!
?

Need anything else?

Contributors list

No Data

QingDict

轻量级、实用主义的词典程序 for OS X

QingDict Icon

开发QingDict是基于以下一些想法: - 词典是为了帮助用户记住单词,而不是让用户反复查询同一个单词 - 工具程序不应该分散用户的注意力 - 以“实用”为目标,不拘泥于形式

获得代码

  git clone https://github.com/yingDev/QingDict.git
  cd QingDict
  git submodule init && git submodule update

截图

QingDict Demo QingDict Demo

QingDict Demo QingDict Demo

结构

包含三个Target: -

QingDict
:主程序,处理鼠标取词事件、显示状态栏图标、生词表、偏好设置 -
QingDict-Result
: 显示执行查词、显示查词结果、与主程序通信;出于减少内存占用的目的,这是一个可独立运行的app,每次执行失去焦点会自动退出 -
Launch-Helper
(objc): ServiceManagement实现启动项所需

有趣的关注点

  • 取词
    虽然有Accessibility API,但是OSX中许多程序是不支持此API取词的。本项目中采取了3中手段结合取词:AX、Cmd+C、模拟DragDrop,基本能应对大多数情形。这部分实现在

    UserTextSelectionExtractor.swfit
    中。
  • 进程间通信
    主程序与结果显示程序间用到了两种简单的IPC机制:命令行参数 和

    NSDistributedNotification
    。前者用于传递查询的单词和选项等;后者主要作为“添加到生词表”的API。
  • 可滑动删除条目的NSTableRowView

    Swift
    //这个类通过派生NSTableRowView, 处理一些鼠标事件、绘制逻辑,从而可以实现生词表“滑动删除条目”功能
    class WordbookRowView : NSTableRowView ...
    
  • NSStatusItem Hacking
    有很多OSX程序拥有菜单栏图标(NSStatusItem),其中一些有通过自定义窗口来实现的“弹出菜单”,这类实现往往有个问题,那就是Status Item的高亮状态,与系统不匹配。

    Swift
    //在 AppDelegate 的 createStatusItem() 方法中,通过这个方法拦截鼠标左键事件,阻止StatusItem被单击而引发系统默认行为,然后手动设置其高亮状态
    NSEvent.addLocalMonitorForEventsMatchingMask(NSEventMask.LeftMouseDownMask) ...
    
  • Swift dylibs

    QingDict-Result.app
    是放在
    QingDict.app/Contents/Resources
    中的。由于当前Swift运行时没有内置于OS X中,Xcode会拷贝所有swift的dylib到每个app中。这就导致
    QingDict-Result.app
    QingDict.app
    都包含独立的一堆dylib,浪费了7MB左右的空间。项目中采取的解决办法是,在Build Phase中把
    QingDict-Result.app
    中的dylib替换为指向
    QingDict.app
    中dylib的symlink。 ```bash

    与QingDict.app用到的dylib重复的,替换为symlink

    theDir="${TARGETBUILDDIR}/${TARGETNAME}.app/Contents/Frameworks" sourceDir="../../../../Frameworks" dylibs="libswiftAppKit libswiftCore libswiftCoreData libswiftCoreGraphics libswiftCoreImage libswiftDarwin libswiftDispatch libswiftFoundation libswiftObjectiveC"

for lib in $dylibs do theDylib="$theDir/$lib.dylib" rm -f $theDylib ln -s $sourceDir/$lib.dylib $theDylib done ```

License

GPL-V3

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.