1 /*
2 *Copyright (C) 2018 Laurent Tréguier
3 *
4 *This file is part of DLS.
5 *
6 *DLS is free software: you can redistribute it and/or modify
7 *it under the terms of the GNU General Public License as published by
8 *the Free Software Foundation, either version 3 of the License, or
9 *(at your option) any later version.
10 *
11 *DLS is distributed in the hope that it will be useful,
12 *but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 *GNU General Public License for more details.
15 *
16 *You should have received a copy of the GNU General Public License
17 *along with DLS. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20
21 module dls.protocol.messages.window;
22
23 import dls.protocol.interfaces : MessageActionItem;
24 import dls.util.nullable: Nullable;
25
26 void showMessageRequest(string id, Nullable!MessageActionItem item)
27 {
28 import dls.protocol.logger : logger;
29 import dls.tools.symbol_tool : SymbolTool;
30 import dls.util.i18n : Tr, tr;
31 import dls.util.uri : Uri;
32 import std.concurrency : locate, receiveOnly, send;
33 import std.process : browse;
34
35 while (id !in Util.messageRequestInfo)
36 {
37 auto data = receiveOnly!(Util.ThreadMessageData)();
38 Util.bindMessageToRequestId(data[0], data[1], data[2]);
39 }
40
41 if (!item.isNull)
42 {
43 switch (Util.messageRequestInfo[id][0])
44 {
45 case Tr.app_upgradeSelections:
46 if (item.title == tr(Tr.app_upgradeSelections_upgrade))
47 {
48 auto uri = new Uri(Util.messageRequestInfo[id][1]);
49 SymbolTool.instance.upgradeSelections(uri);
50 }
51
52 break;
53
54 case Tr.app_upgradeDls:
55 send(locate(Util.messageRequestInfo[id][1]),
56 item.title == tr(Tr.app_upgradeDls_upgrade));
57 break;
58
59 case Tr.app_showChangelog:
60 if (item.title == tr(Tr.app_showChangelog_show))
61 {
62 logger.info("Opening changelog in browser");
63 browse(Util.messageRequestInfo[id][1]);
64 }
65
66 break;
67
68 default:
69 assert(false, Util.messageRequestInfo[id][0] ~ " cannot be handled as requests");
70 }
71 }
72
73 Util.messageRequestInfo.remove(id);
74 }
75
76 final abstract class Util
77 {
78 import dls.protocol.jsonrpc : send;
79 import dls.protocol.messages.methods : Window;
80 import dls.util.i18n : Tr, tr, trType;
81 import std.array : array;
82 import std.algorithm : map;
83 import std.typecons : Tuple, tuple;
84
85 shared alias ThreadMessageData = Tuple!(string, Tr, string);
86
87 private static Tuple!(Tr, string)[string] messageRequestInfo;
88
89 static void sendMessage(Tr message, string[] args = [])
90 {
91 import dls.protocol.interfaces : ShowMessageParams;
92
93 send(Window.showMessage, new ShowMessageParams(trType(message), tr(message, args)));
94 }
95
96 static string sendMessageRequest(Tr message, Tr[] actions, string[] args = [])
97 {
98 import dls.protocol.interfaces : ShowMessageRequestParams;
99 import dls.util.nullable: nullable;
100
101 return send(Window.showMessageRequest, new ShowMessageRequestParams(trType(message),
102 tr(message, args), actions.map!(a => new MessageActionItem(tr(a,
103 args))).array.nullable));
104 }
105
106 static void bindMessageToRequestId(string id, Tr message, string data = null)
107 {
108 messageRequestInfo[id] = tuple(message, data);
109 }
110 }