ããã«ã¡ã¯ ãã®èšäºã¯ãSailfish OSã¢ãã€ã«ãã©ãããã©ãŒã åãã®ã¢ããªã±ãŒã·ã§ã³éçºã«é¢ããäžé£ã®èšäºã®ç¶ãã§ãã ä»åã¯ããŠãŒã¶ãŒãã¡ã¢ãä¿åãã¿ã°ä»ããç»åãåçããªãã€ã³ããŒãè¿œå ããEvernoteã¢ã«ãŠã³ããšåæã§ããããã«ããã¡ã¢ãåãã¢ããªã±ãŒã·ã§ã³ã«çŠç¹ãåœãŠãŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®è©³çŽ°ãª
説æããèšäºãéå§ãã
æè¡çãªè©³çŽ°ã«é²ã¿ãŸãã
ã¢ããªã±ãŒã·ã§ã³ã®èª¬æ
ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ç»é¢ã¯ããŠãŒã¶ãŒãšã³ããªã®ãªã¹ãã§ãããªã¹ãã®åèŠçŽ ã«ã¯ãããŒãã®ã¿ã€ãã«ã説æïŒãŸãã¯èª¬æãå®å
šã«åãŸããªãå Žåã¯ãã®äžéšïŒãããã³è¿œå ãããå Žåã®ç»åã衚瀺ãããŸãã ãªã¹ãã¢ã€ãã ã«ã¯ãã¡ã¢ãåé€ããããç·šéçšã®ãã€ã¢ãã°ãéãããã§ããã³ã³ããã¹ãã¡ãã¥ãŒããããŸãã ãªã¹ãé
ç®ãã¯ãªãã¯ãããšããã®ããŒãã«é¢ãããã¹ãŠã®æ
å ±ã衚瀺ããç»é¢ãéããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠè©³ãã説æããŸãããã ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ç»é¢ã¯ããŠãŒã¶ãŒãšã³ããªã®ãªã¹ãã§ãããªã¹ãã®åèŠçŽ ã«ã¯ãããŒãã®ã¿ã€ãã«ã説æïŒãŸãã¯èª¬æãå®å
šã«åãŸããªãå Žåã¯ãã®äžéšïŒãããã³è¿œå ãããå Žåã®ç»åã衚瀺ãããŸãã ãªã¹ãã¢ã€ãã ã«ã¯ãã¡ã¢ãåé€ããããç·šéçšã®ãã€ã¢ãã°ãéãããã§ããã³ã³ããã¹ãã¡ãã¥ãŒããããŸãã ãªã¹ãé
ç®ãã¯ãªãã¯ãããšããã®ããŒãã«é¢ãããã¹ãŠã®æ
å ±ã衚瀺ããç»é¢ãéããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ç»é¢ã«ã¯ã
PullDownMenuèŠçŽ ãš
PushUpMenuèŠçŽ ãå«ãŸããŠã
ãŸã ã
PullDownMenuã«ã¯ãæ°ããããŒããè¿œå ããããã®ãã€ã¢ãã°ãéãã¡ãã¥ãŒé
ç®ã1ã€ãããããŸããã
PushUpMenuã«ã¯2ã€ã®é
ç®ããããŸãã1ã€ç®ã¯ãã¹ãŠã®ã¿ã°ã®ãªã¹ããå«ããŠã£ã³ããŠãéãã2ã€ç®ã¯èšå®ãŠã£ã³ããŠã§ãã
ã¡ã¢ãè¿œå /ç·šéããããã®ãã€ã¢ãã°ã«ã¯ãã¿ã°ãã¿ã€ãã«ã説æãå
¥åããããã®ããã¹ããã£ãŒã«ããããã³ç»åãåçãã¢ã©ãŒã ãè¿œå ããããã®ãã¿ã³ãå«ãŸããŠããŸãã ãç»åã®è¿œå ããã¿ã³ãã¯ãªãã¯ãããšããã€ã¢ãã°ãéãããŠãŒã¶ãŒã¯ç»é¢ã«äœããæãããæžãããããŠããã®ç»åãã¡ã¢ã«è¿œå ã§ããŸãã [åçãè¿œå ]ãã¿ã³ãæŒããšãããã€ã¹ã®ã«ã¡ã©ãéããç»é¢ãã¯ãªãã¯ãããšãç»åã®ãããªåçãã¡ã¢ã«è¿œå ãããŸãã
ãªãã€ã³ããŒãè¿œå ããããã®ãã¿ã³ãã¯ãªãã¯ãããšãã€ã¢ãã°ãéããæšæºã³ã³ããŒãã³ãã®
DatePickerDialogããã³
TimePickerDialogã䜿çšããŠãªãã€ã³ããŒã®æ¥ä»ãšæå»ãèšå®ã§ããŸãã
[ã¿ã°]ç»é¢ã¯ãã¡ã¢ã«è¿œå ããããã¹ãŠã®ã¿ã°ã®ãªã¹ãã§ãã ãªã¹ãå
ã®ã¿ã°ãã¯ãªãã¯ãããšããã®ã¿ã°ã§ããŒã¯ãããã¬ã³ãŒãã®ã¿ãå«ãç»é¢ã衚瀺ãããŸãã ãã®ç»é¢ã§ã¯ãã¡ã¢ã䜿çšãããã¹ãŠã®æäœïŒæ
å ±ã®è¡šç€ºãç·šéãåé€ãæ°ããã¡ã¢ã®è¿œå ïŒãå©çšã§ããŸãã
èšå®ç»é¢ã«ã¯ãEvernoteçµç±ã®ãã°ã€ã³ãé
ç®ã1ã€å«ãŸããŠãããèªèšŒåŸã«ãEvernoteãããã°ã¢ãŠãããšãããŒã¿ã®åæããšãã2ã€ã®é
ç®ã«å€æŽãããŸãã 1ã€ç®ã¯ãEvernoteã¢ã«ãŠã³ããããã°ã¢ãŠãããŠããŒã¿åæãç¡å¹ã«ããããšãå¯èœã«ãã2ã€ç®ã¯ãåæããã»ã¹ãæåã§éå§ããããšãå¯èœã«ããŸãã ãŸããããŒã¿ãå€æŽããããšåæãèªåçã«éå§ãããŸãã
Nemo QMLãã©ã°ã€ã³ã®éç¥
ãã®èšäºã§ã¯ãSailfish OSã§ã®éç¥ã®æäœã«çŠç¹ãåãããããšã«ããŸããã éç¥ãåŠçããããã«ãSailfish SDKã¯
Nemo QMLãã©ã°ã€ã³éç¥ãã©ã°ã€ã³ãæäŸã
ãŸã ã ãã©ã°ã€ã³ã«ã¯2ã€ã®ã¯ã©ã¹ãå«ãŸããŸãã
- QMLã³ãŒãå
ã«éç¥ãäœæããããã®QMLã¯ã©ã¹éç¥ ã
- C ++ã³ãŒãå
ã§éç¥ãäœæããããã®C ++ éç¥ã¯ã©ã¹ã
Notificationã¯ã©ã¹ã䜿çšãããšãD-Busã䜿çšããŠ
Lipstick Notification Managerãšéä¿¡ããããã«äœ¿çšã§ããéç¥ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãã
以åã®èšäºã®1ã€ã§ã D-Busã®æŠèŠãšãã®æäœæ¹æ³ã«ã€ããŠæ¢ã«èª¬æããŸããã ãŸã 確èªããŠããªãå Žåã¯ãå¿
ã確èªããŠãã ããã
éç¥ã¯ãããã€ãã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠçæãããŸãã äž»ãªãã®ããªã¹ãããŸãã
- appIcon-éç¥èªäœãšå
±ã«è¡šç€ºãããã¢ããªã±ãŒã·ã§ã³ã¢ã€ã³ã³ãžã®ãã¹ã
- appName-éç¥ã¢ã€ã³ã³ã«å ããŠãã¢ããªã±ãŒã·ã§ã³ã®ååã衚瀺ã§ããŸãã
- æŠèŠ -éç¥ããã«ã«è¡šç€ºãããéç¥ã¿ã€ãã«ã
- previewSummary-ç»é¢äžéšã®éç¥ãããŒã«è¡šç€ºãããéç¥ã¿ã€ãã«ã
- body-éç¥ã®ãæ¬æããéç¥ããã«ã«è¡šç€ºããã説æã
- previewBody-éç¥ãããŒã«è¡šç€ºãããéç¥ã®èª¬æã
- itemCount -1ã€ã®ã¢ã€ãã ã«ãã£ãŠè¡šç€ºãããéç¥ã®æ°ã ããšãã°ã itemCountã4ã®å Žåã1ã€ã®éç¥ã§æ倧4ã€ã®äžåšçä¿¡ã衚瀺ã§ããŸãã
- ã¿ã€ã ã¹ã¿ã³ã -éç¥ãé¢é£ä»ããããŠããã€ãã³ãã®ã¿ã€ã ã¹ã¿ã³ãã¯ãéç¥èªäœã®äœæã«ã¯åœ±é¿ãããéç¥ã衚瀺ãããæå»ã§ã¯ãããŸããã
- remoteActions-ããããã£ãnameãããserviceãããpathãããifaceãããmethodãããdisplayNameãããiconããããã³ãargumentsããæã€ãªããžã§ã¯ãã®ãªã¹ãã¯ãäœæãããéç¥ãã¯ãªãã¯ããŠå¯èœãªã¢ã¯ã·ã§ã³ã決å®ããŸãã remoteActionsã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã
å
¬åŒããã¥ã¡ã³ãã®ãã¹ãŠã®éç¥ãã©ã¡ãŒã¿ãŒã«ã€ããŠèªãããšãã§ããŸããQMLã§éç¥ãäœæããäŸã以äžã«ç€ºããŸãã
Button { Notification { id: notification appName: "Example App" appIcon: "/usr/share/example-app/icon-l-application" summary: "Notification summary" body: "Notification body" previewSummary: "Notification preview summary" previewBody: "Notification preview body" itemCount: 5 timestamp: "2013-02-20 18:21:00" remoteActions: [{ "name": "default", "service": "com.example.service", "path": "/com/example/service", "iface": "com.example.service", "method": "trigger" "arguments": [ "argument 1" ] }] } onClicked: notification.publish() }
説æãããã¿ã³ãã¯ãªãã¯ãããšã
publishïŒïŒã¡ãœãããåŒã³åºãããããšãã³ãŒãããç解ãããããªããŸãã
publishïŒïŒã¡ãœããã¯ãéç¥ãéç¥ãããŒãžã£ãŒã«çºè¡ããããã€ã¹ç»é¢ã«è¡šç€ºããŸãã
åè¿°ã®ããã«ãéç¥ã«é¢é£ä»ããããã¢ã¯ã·ã§ã³ãã«ã¹ã¿ãã€ãºã§ããŸãã ããèªäœã瀺åããäŸã¯ãéç¥ãã¯ãªãã¯ããŠã¢ããªã±ãŒã·ã§ã³ãéãããšã§ãã éç¥ã¯D-Busãä»ããŠæ©èœãããããæåã«å¿
èŠãªããšã¯ãç¬èªã®D-BusãµãŒãã¹ãäœæããããšã§ãã ãããè¡ãã«ã¯ãæåã«ãããžã§ã¯ãã«ãŒãã«
dbusãã£ã¬ã¯ããªãè¿œå ãã次ã®å
容ãæã€* .serviceæ¡åŒµåã®ãã¡ã€ã«ãäœæããŸãã
[D-BUS Service] Interface=/com/example/service Name=com.example.service Exec=/usr/bin/invoker --type=silica-qt5 --desktop-file=example.desktop -s /usr/bin/example
ããã«æ··ä¹±ãé¿ããããã«ããµãŒãã¹åïŒ
Nameãã©ã¡ãŒã¿ãŒïŒãšãã¡ã€ã«èªäœã®ååã«åãååã䜿çšããããšããå§ãããŸãã ãŸãã
Execãã©ã¡ãŒã¿ãŒã¯ãããžã§ã¯ãã®* .desktopãã¡ã€ã«ãšããã€ã¹äžã®ã¢ããªã±ãŒã·ã§ã³ãžã®ãã¹ã䜿çšãããšããäºå®ã«æ³šæããŠãã ãããããã§ã¯ããäŸãã®ä»£ããã«ãããžã§ã¯ãã®ååã䜿çšããå¿
èŠããããŸãã
次ã«ã* .proãã¡ã€ã«ã«D-BusãµãŒãã¹ãžã®ãã¹ãç»é²ããå¿
èŠããããŸãã
... dbus.files = dbus/com.example.service.service dbus.path = /usr/share/dbus-1/services/ INSTALLS += dbus ...
ãŸãã* .specãã¡ã€ã«ã«ãã
... %files %{_datadir}/dbus-1/services ...
éç¥ã¢ã¯ã·ã§ã³ãã¢ããªã±ãŒã·ã§ã³ã«é¢é£ä»ããã«ã¯ã
DBusAdaptorãäœæããå¿
èŠããããŸãã
DBusAdaptor -D-BusãµãŒãã¹ãšå¯Ÿè©±ããæ©èœãæäŸãããªããžã§ã¯ãã
DBusAdaptor { service: 'com.example.service' iface: 'com.example.service' path: '/com/example/service' xml: ' <interface name="com.example.service">\n' + ' <method name="trigger">\n' + ' <arg name="param" type="s" access="readwrite"/>\n"' + ' </method">\n' + ' </interface>\n' function trigger(param) { console.log('param:', param); __silica_applicationwindow_instance.activate(); } }
ãµãŒãã¹ããã³
ifaceããããã£ã¯ç»é²ããD-BusãµãŒãã¹ã®ååã§ããã
pathããããã£ã¯ããã€ã¹ãã¡ã€ã«ã·ã¹ãã å
ã®ãµãŒãã¹ãªããžã§ã¯ããžã®ãã¹ã§ãã ç¹ã«èå³æ·±ãã®ã¯
xmlããããã£ã§ãã ãµãŒãã¹ã®å
容ãã€ãŸãåŒã³åºãããšãã§ããã¡ãœããã®ååãšãã®åŒæ°ãèšè¿°ããŸãã ããã§ã¯ã
ããªã¬ãŒïŒïŒé¢æ°ããµãŒãã¹ã¡ãœãããšããŠäœ¿çšããŸãããã®ã¡ãœããã¯ãæååãå
¥åãšããŠåãåã£ãŠã³ã³ãœãŒã«ã«è¡šç€ºãã
ApplicationWindowãªããžã§ã¯ãã§
activateïŒïŒã¡ãœãããåŒã³åºããŠã¢ããªã±ãŒã·ã§ã³ãéããŸãã
次ã«ãäœæããéç¥ã«ã¢ã¯ã·ã§ã³ãé¢é£ä»ããå¿
èŠããããŸãã
Notificationã¯ã©ã¹ã®
remoteActionsããããã£ã¯ããã«åœ¹ç«ã¡ãŸãã
Button { Notification { ... remoteActions: [{ "name": "default", "service": "com.example.service", "path": "/com/example/service", "iface": "com.example.service", "method": "trigger" "arguments": [ "argument 1" ] }] } onClicked: notification.publish() }
remoteActionsã§ã¯ ãD-BusãµãŒãã¹ãšã®éä¿¡ã®ããã®
service ã
path ãããã³
ifaceãã©ã¡ãŒã¿ãŒ ãèšè¿°ããŸãã
methodãã©ã¡ãŒã¿ãŒã¯ãµãŒãã¹ã¡ãœããã®ååã§ã
ãargumentsããããã£ã§ã¯ãã¡ãœããã®ãã©ã¡ãŒã¿ãŒã®ãªã¹ããæž¡ããŸãã ãããŠããã ãã§ãã ããã§ãéç¥ãã¯ãªãã¯ãããšãD-BusãµãŒãã¹ã¡ãœãããåŒã³åºãããã¢ããªã±ãŒã·ã§ã³ãéããŸãã
éç¥ãåŠçããæ©èœã®1ã€ã¯ãã¢ããªã±ãŒã·ã§ã³ãéãããããšãã«éç¥ã衚瀺ããã«ã¯ãD-Busã«ç»é²ããããµãŒãã¹ã管çããã¢ã¯ãã£ããªããŒã¢ã³ãå¿
èŠã«ãªãããšã§ãã ãµãŒãã¹ãéãããšç»é²ã解é€ãããããã ããã¯
Sailfish FAQã«ãæžãããŠããŸãã
ã¢ããªã±ãŒã·ã§ã³ã§éç¥ãæäœãã
ã¢ããªã±ãŒã·ã§ã³ã§éç¥ã®åŠçãå®è£
ããããã«ãC ++
Notificationã¯ã©ã¹ã䜿çšããŸããã ã¢ããªã±ãŒã·ã§ã³å
ã®éç¥ã¯ã¡ã¢ã®ã¿ã€ãã«ãšèª¬æã§æ§æãããããã«ãªãã€ã³ããè¿œå ãããããã次ã®ã¯ã©ã¹ããããã£ã«ã®ã¿é¢å¿ããããŸãïŒ
summary ã
body ã
previewSummaryããã³
previewBody ã ãã¡ããã
publishïŒïŒã¡ãœããã«ãèå³ããããŸãã
éç¥ã管çããããã«ã2ã€ã®
publishNotificationïŒïŒããã³
removeNotificationïŒïŒã¡ãœãããå«ã
NotificationManagerã¯ã©ã¹ãäœæããŸããã 1ã€ç®ã¯ãªãã€ã³ããŒãäœæããŠè¡šç€ºããããã«å¿
èŠã§ã2ã€ç®ã¯ãªãã€ã³ããŒãåé€ããããã«å¿
èŠã§ãã
Notificationã¯ã©ã¹ã¯ãéç¥ã衚瀺ããæéãèšå®ããæ©èœãæäŸããªãããšã«æ³šæããŠãã ãã;
publishïŒïŒã¡ãœããã¯ãéç¥ïŒã¡ãœããïŒãåŒã³åºãããç¬éã«éç¥ã衚瀺ããŸãã ã¿ã€ããŒïŒ
QTimerã¯ã©ã¹ïŒã䜿çšããŠéç¥ã衚瀺ãããæéãå¶åŸ¡ããããšã«ããããã®åé¡ã解決ããŸããã ãŸãããªãã€ã³ããŒä»ãã®ã¡ã¢ãè€æ°ããå Žåãããããããã®ãããªã¿ã€ããŒãããã€ãããã¯ãã§ãã ãããã£ãŠã
NotificationManagerã¯ã©ã¹ã§ããã·ã¥ïŒ
QHash ïŒãäœæããããã®ããŒã¯ããŒã¿ããŒã¹å
ã®ããŒãIDã§ãå€ã¯
QTimerã§ãã
class NotificationManager : public QObject { Q_OBJECT public: explicit NotificationManager(QObject *parent = 0); Q_INVOKABLE void publishNotification(const int noteId, const QString &summary, const QString &body, QDateTime dateTime); Q_INVOKABLE void removeNotification(const int noteId); private: QHash<int, QTimer*> timers; };
publishNotificationïŒïŒã¡ãœããã®å®è£
ãããã«è©³ããæ€èšããŸãããã åŒæ°ãšããŠãããŒã¿ããŒã¹å
ã®IDããŒããéç¥ã®ã¿ã€ãã«ãšèª¬æãããã³éç¥ã衚瀺ããæ¥æãåããŸãã
ãŸãããã®ã¡ãœããã¯æ°ããã¿ã€ããŒãäœæãããã®
ã¿ã€ã ã¢ãŠãïŒïŒä¿¡å·ãã©ã ãé¢æ°ã§èšè¿°ãããã¹ãããã«é¢é£ä»ããŸãã ã©ã ãé¢æ°ã§ã¯ãéç¥ãäœæããã³æ§æããã
publishïŒïŒã¡ãœãããåŒã³åºãããŸãã éç¥ã衚瀺ãããåŸãã¿ã€ããŒãåæ¢ããŸãã ãŸãã
publishNotificationïŒïŒã¡ãœããã¯ããã®ãããªã¬ã³ãŒãIDãæã€ã¿ã€ããŒãæ¢ã«ããã·ã¥ã«è¿œå ãããŠãããã©ããã確èªããè¿œå ãããŠããå Žåã¯ããã·ã¥ããåé€ããŸãã 次ã«ãã¿ã€ããŒãéå§ããåæ¢ããæéïŒããªç§åäœïŒãèšå®ããŠãæ°ããã¿ã€ããŒãããã·ã¥ã«è¿œå ããŸãã
void NotificationManager::publishNotification(const int noteId, const QString &summary, const QString &body, QDateTime dateTime) { QTimer *timer = new QTimer(); connect(timer, &QTimer::timeout, [summary, body, timer](){ Notification notification; notification.setSummary(summary); notification.setBody(body); notification.setPreviewSummary(summary); notification.setPreviewBody(body); notification.publish(); timer->stop(); }); if (this->timers.contains(noteId)) removeNotification(noteId); timer->start(QDateTime::currentDateTime().secsTo(dateTime) * 1000); this->timers[noteId] = timer; }
removeNotificationïŒïŒã¡ãœããã¯ã¯ããã«åçŽã«èŠããŸãã ãã©ã¡ãŒã¿ãŒãšããŠãéç¥ãåé€ããããŒãã®IDã®ã¿ãåãå
¥ããŸãã ãã®ã¡ãœããã¯ãæå®ãããIDãæã€ã¿ã€ããŒãæ¢ã«ã¿ã€ããŒä»ãããã·ã¥å
ã«ããããšã確èªããããããã§ããã°ãã¿ã€ããŒãåæ¢ããŠããã·ã¥ããåé€ããŸãã
void NotificationManager::removeNotification(const int noteId) { if (this->timers.contains(noteId)) { this->timers.value(noteId)->stop(); this->timers.remove(noteId); } }
ãããã«
ãã®çµæãç»åãã¿ã°ããªãã€ã³ããŒä»ãã®ã¡ã¢ãä¿åããããããEvernoteãšåæã§ããå¹
åºãæ©èœãåããã¢ããªã±ãŒã·ã§ã³ãäœæãããŸããã ãã®ã¢ããªã¯ãJolla Harborã¢ããªã¹ãã¢ã§SailNotesãšããååã§å
¬éãããŠããã誰ã§ãããŠã³ããŒãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã¯
GitHubã§å
¥æã§ã
ãŸã ã
æè¡çãªåé¡
ã¯ããã·ã¢èªã話ãã³ãã¥ããã£ã®Sailfish OSã®TelegramãŸãã¯
VKontakteã°ã«ãŒãã®
ãã£ãã«ã§ãè°è«ã§ããŸãã
èè
ïŒã€ãŽã¡ã³ã»ã·ãã