REM-Client f4f35475: mail (base manager page Mail), friends (group window), the group on the radar, Locate, crewed ships named in the target panel (rem-server 6c3a680)

This commit is contained in:
2026-11-10 01:36:31 +01:00
parent 35cbc704b3
commit 28989b0f04
5 changed files with 91 additions and 4 deletions
+77 -1
View File
@@ -144,7 +144,11 @@
/* its nose (rem_ui_base.cpp kNoseDp: the dot 34dp from the centre) - drag the dot to turn it */
.sitemap .mark .nl { position: absolute; left: -1dp; top: -30dp; width: 2dp; height: 21dp; background-color: #f2b13c; }
.sitemap .mark .hd { position: absolute; left: -6dp; top: -40dp; width: 12dp; height: 12dp; border-radius: 6dp; background-color: #f2b13c; }
</style>
/* the Mail page */
.mail-letter { display: flex; flex-direction: column; flex: 1; min-height: 0; }
textarea.mail-text { display: block; width: 100%; height: 110dp; margin: 4dp 0 8dp 0; padding: 6dp 8dp; box-sizing: border-box; background-color: #0b1724; border: 1dp #24405c; color: #d8e6f2; font-size: 14dp; line-height: 1.35; }
textarea.mail-text:focus { border-color: #5cc8f0; }
</style>
</head>
<body class="window">
<div class="win-head" data-model="base">
@@ -168,6 +172,8 @@
<div class="item" data-class-active="page == 7" data-action="page" data-arg="7"><img class="ico" src="3db:INTERFACE/REM/IMAGES/icon_ships.3db"/><span>Pilots</span><span class="badge" data-if="drones.size &gt; 0">{{ drones.size }}</span></div>
<div class="item" data-class-active="page == 8" data-action="page" data-arg="8"><img class="ico" src="3db:INTERFACE/REM/IMAGES/icon_cargo.3db"/><span>Couriers</span></div>
<div class="item" data-class-active="page == 9" data-action="page" data-arg="9"><img class="ico" src="3db:INTERFACE/REM/IMAGES/icon_contracts.3db"/><span>Contracts</span><div class="tip">Trade bundles with other pilots - goods, equipment, ammunition and credits - or have them carried.</div></div>
<div class="sep"></div>
<div class="item" data-class-active="page == 10" data-action="page" data-arg="10"><img class="ico" src="3db:INTERFACE/NEURONET/ICONS/NN_Chat.3db"/><span>Mail</span><span class="badge" data-if="mail_unread &gt; 0">{{ mail_unread }}</span><div class="tip">Letters to any pilot, also offline - with credits and items from your depot.</div></div>
</div>
<div class="content" id="base-pages" data-model="base">
<div class="blocked" data-if="blocked != 0">
@@ -806,6 +812,76 @@
</div>
</div>
<!-- ================================================= MAIL -->
<div class="page" data-if="blocked == 0 &amp;&amp; page == 10">
<div class="blocked" data-if="!mail_linked" style="width: 100%;">
<div class="t">No account linked</div>
<div class="hint">Mail belongs to your Discord account, as bank and depots do. Link it with /register.</div>
</div>
<div class="colm gap" data-if="mail_linked">
<div class="col-h"><h3>Inbox</h3><span class="hint">{{ mail_unread }} unread</span><div class="btn" data-action="mail-refresh" style="margin-left: 10dp;">Refresh</div></div>
<div class="table" style="height: 210dp;">
<div class="head"><span class="c1" style="width: 110dp; flex: none;">From</span><span class="c2" style="flex: 1;">Subject</span><span class="c4" style="width: 130dp; flex: none;">Sent</span></div>
<div class="body">
<div class="empty" data-if="mail_rows.size == 0">No letters.</div>
<div class="row" data-for="r : mail_rows" data-class-selected="r.selected" data-class-current="r.current" data-action="mail-pick" data-attr-data-arg="r.key">
<span class="c1" style="width: 110dp; flex: none;">{{ r.a }}</span><span class="c2" style="flex: 1;">{{ r.b }}<span data-if="r.d != ''" style="color: #8197ad;"> - {{ r.d }}</span></span><span class="c4" style="width: 130dp; flex: none;">{{ r.c }}</span>
</div>
</div>
</div>
<div class="hint" data-if="!mail_sel">Pick a letter to read it. Unread letters are marked.</div>
<div data-if="mail_sel" class="mail-letter">
<div class="col-h"><h3>{{ mail_subject }}</h3><span class="hint">from {{ mail_from }}, {{ mail_date }}</span></div>
<div class="table grow"><div class="body"><div style="white-space: pre-wrap; padding: 8dp 10dp; line-height: 1.45;">{{ mail_body }}</div></div></div>
<div class="hint" data-if="mail_money != ''">Credits: {{ mail_money }}</div>
<div class="table" data-if="mail_items.size &gt; 0" style="height: 100dp;">
<div class="head"><span class="c1">Items</span><span class="c3">Amount</span></div>
<div class="body"><div class="row" data-for="r : mail_items"><span class="c1">{{ r.a }}</span><span class="c3">{{ r.c }}</span></div></div>
</div>
<div class="actions">
<div class="btn primary" data-if="mail_can_claim" data-action="mail-claim">Take credits and items<div class="tip">The credits go into your bank, the items into your depot on this base (dock at a base with your depot).</div></div>
<div class="btn" data-action="mail-reply">Reply</div>
<div class="btn" data-action="mail-delete">Delete</div>
</div>
</div>
</div>
<div class="colm" data-if="mail_linked">
<div class="col-h"><h3>Write a letter</h3><span class="hint">free, delivered at once</span></div>
<div class="namefield"><span class="label">To</span><input class="text" type="text" data-value="mail_to" maxlength="32"/></div>
<div data-if="mail_friends.size &gt; 0" style="margin: 4dp 0 6dp 0;">
<span class="hint">Friends: </span>
<span class="btn small" data-for="r : mail_friends" data-class-on="r.current" data-action="mail-to" data-attr-data-arg="r.key" style="margin: 2dp 4dp 2dp 0;">{{ r.a }}</span>
</div>
<div class="namefield"><span class="label">Subject</span><input class="text" type="text" data-value="mail_subj" maxlength="100"/></div>
<div class="label" style="margin-top: 6dp;">Text</div>
<textarea class="mail-text" data-value="mail_text" rows="6"></textarea>
<div class="namefield"><span class="label">Credits</span><input class="text" type="text" data-value="mail_credits" maxlength="12"/></div>
<div class="hint" data-if="!mail_docked">Items come from your depot - dock at a base with your depot to attach them.</div>
<div class="hint" data-if="mail_docked &amp;&amp; !mail_has_depot">You have no depot on this base - no items to attach here.</div>
<div class="table" data-if="mail_has_depot" style="height: 120dp;">
<div class="head"><span class="c1">Your depot here</span><span class="c3">Amount</span></div>
<div class="body">
<div class="empty" data-if="mail_inv.size == 0">The depot is empty.</div>
<div class="row" data-for="r : mail_inv" data-class-selected="r.selected" data-action="mail-inv" data-attr-data-arg="r.key"><span class="c1">{{ r.a }}</span><span class="c3">{{ r.c }}</span></div>
</div>
</div>
<div class="amount" data-if="mail_has_depot">
<span class="label">Amount</span>
<input class="range" type="range" min="1" step="1" data-attr-max="mail_count_max" data-value="mail_count"/>
<span class="v">{{ mail_count }}</span>
<div class="btn" data-action="mail-count-max">Max</div>
<div class="btn" data-action="mail-attach">Attach</div>
</div>
<div class="table" data-if="mail_attach.size &gt; 0" style="height: 90dp;">
<div class="head"><span class="c1">Attached</span><span class="c3">Amount</span></div>
<div class="body"><div class="row" data-for="r : mail_attach" data-action="mail-unattach" data-attr-data-arg="r.key"><span class="c1">{{ r.a }}</span><span class="c3">{{ r.c }}</span></div></div>
</div>
<div class="hint">{{ mail_limits }} A click on an attached item takes it off.</div>
<div class="hint" data-if="mail_msg != ''">{{ mail_msg }}</div>
<div class="actions"><div class="btn primary" data-action="mail-send">Send letter</div></div>
</div>
</div>
<!-- ================================================= DRONES -->
<div class="page" data-if="blocked == 0 &amp;&amp; page == 7">
<div class="colm side">
+10
View File
@@ -4,6 +4,7 @@
<link type="text/rcss" href="rem.rcss"/>
<style>
.members { margin-bottom: 14dp; }
.member.on { border-left-color: #6fd08c; background-color: #6fd08c14; }
.member { display: flex; flex-direction: row; align-items: center; padding: 8dp 12dp; margin-bottom: 6dp; font-size: 15dp; border-left: 3dp #5cc8f0; background-color: #5cc8f010; }
.request { padding: 12dp; margin-bottom: 10dp; border-left: 3dp #f2b13c; background-color: #5cc8f008; }
.request .t { white-space: pre-line; line-height: 1.5; font-size: 15dp; }
@@ -49,6 +50,15 @@
<div class="actions" data-if="can_leave">
<div class="btn" data-action="leave">Leave group</div>
</div>
<h3 style="margin: 14dp 0 8dp 0;">Friends</h3>
<div class="hint" data-if="friends.size == 0">No friends yet. Add a pilot by name, or right click a name (chat, contacts) - Add friend.</div>
<div class="member" data-for="f : friends" data-class-on="f.online" style="border-left-color: #6fd08c;">
<span style="flex: 1;">{{ f.name }}</span><span class="w" style="margin-right: 10dp; color: #8197ad;">{{ f.where }}</span><span class="btn small" data-action="friend_remove" data-attr-data-arg="f.name">Remove</span>
</div>
<div style="display: flex; flex-direction: row; align-items: center; margin-top: 8dp;">
<input class="text" type="text" data-value="friend_name" maxlength="32" style="flex: 1; margin-right: 8dp;"/>
<div class="btn" data-action="friend_add">Add friend</div>
</div>
</div>
</div>
<div class="win-foot">
+1
View File
@@ -277,6 +277,7 @@
<div data-if="has_target">
<div class="tname">{{ target_name }}</div>
<div class="tsub">{{ target_sub }} {{ target_rank }} {{ target_range }}</div>
<div class="tsub" data-if="target_crew != ''" style="color: #f2b13c; margin-top: -6dp;">{{ target_crew }}</div>
<div class="tbar hull"><span class="l">HULL</span><div class="bar"><div class="chips"><div class="sg" data-class-lit="target_hull_n > 0"></div><div class="sg" data-class-lit="target_hull_n > 1"></div><div class="sg" data-class-lit="target_hull_n > 2"></div><div class="sg" data-class-lit="target_hull_n > 3"></div><div class="sg" data-class-lit="target_hull_n > 4"></div><div class="sg" data-class-lit="target_hull_n > 5"></div><div class="sg" data-class-lit="target_hull_n > 6"></div><div class="sg" data-class-lit="target_hull_n > 7"></div><div class="sg" data-class-lit="target_hull_n > 8"></div><div class="sg" data-class-lit="target_hull_n > 9"></div><div class="sg" data-class-lit="target_hull_n > 10"></div><div class="sg" data-class-lit="target_hull_n > 11"></div><div class="sg" data-class-lit="target_hull_n > 12"></div><div class="sg" data-class-lit="target_hull_n > 13"></div><div class="sg" data-class-lit="target_hull_n > 14"></div><div class="sg" data-class-lit="target_hull_n > 15"></div></div></div></div>
<div class="tbar shield" data-if="target_has_shield"><span class="l">SHIELD</span><div class="bar"><div class="chips"><div class="sg" data-class-lit="target_shield_n > 0"></div><div class="sg" data-class-lit="target_shield_n > 1"></div><div class="sg" data-class-lit="target_shield_n > 2"></div><div class="sg" data-class-lit="target_shield_n > 3"></div><div class="sg" data-class-lit="target_shield_n > 4"></div><div class="sg" data-class-lit="target_shield_n > 5"></div><div class="sg" data-class-lit="target_shield_n > 6"></div><div class="sg" data-class-lit="target_shield_n > 7"></div><div class="sg" data-class-lit="target_shield_n > 8"></div><div class="sg" data-class-lit="target_shield_n > 9"></div><div class="sg" data-class-lit="target_shield_n > 10"></div><div class="sg" data-class-lit="target_shield_n > 11"></div><div class="sg" data-class-lit="target_shield_n > 12"></div><div class="sg" data-class-lit="target_shield_n > 13"></div><div class="sg" data-class-lit="target_shield_n > 14"></div><div class="sg" data-class-lit="target_shield_n > 15"></div></div></div></div>
<div class="tbtns">