From 42565f19fc22a94aa93bd59dd058ec359b0b2328 Mon Sep 17 00:00:00 2001
From: str4d <str4d@mail.i2p>
Date: Tue, 10 Jul 2012 11:42:20 +0000
Subject: [PATCH] Use image buttons for ordering summary bar sections (images
 courtesy of dr|z3d)

---
 .../i2p/router/web/ConfigSummaryHandler.java  |  36 ++++++++++--------
 .../src/net/i2p/router/web/SummaryHelper.java |  27 +++++++------
 apps/routerconsole/jsp/configsidebar.jsp      |   3 ++
 .../console/classic/images/move_bottom.png    | Bin 0 -> 326 bytes
 .../console/classic/images/move_down.png      | Bin 0 -> 325 bytes
 .../console/classic/images/move_top.png       | Bin 0 -> 325 bytes
 .../themes/console/classic/images/move_up.png | Bin 0 -> 290 bytes
 .../resources/themes/console/dark/console.css |   4 ++
 .../console/dark/images/move_bottom.png       | Bin 0 -> 497 bytes
 .../themes/console/dark/images/move_down.png  | Bin 0 -> 498 bytes
 .../themes/console/dark/images/move_top.png   | Bin 0 -> 519 bytes
 .../themes/console/dark/images/move_up.png    | Bin 0 -> 452 bytes
 .../console/light/images/move_bottom.png      | Bin 0 -> 326 bytes
 .../themes/console/light/images/move_down.png | Bin 0 -> 325 bytes
 .../themes/console/light/images/move_top.png  | Bin 0 -> 325 bytes
 .../themes/console/light/images/move_up.png   | Bin 0 -> 290 bytes
 .../console/midnight/images/move_bottom.png   | Bin 0 -> 497 bytes
 .../console/midnight/images/move_down.png     | Bin 0 -> 498 bytes
 .../console/midnight/images/move_top.png      | Bin 0 -> 519 bytes
 .../console/midnight/images/move_up.png       | Bin 0 -> 452 bytes
 20 files changed, 43 insertions(+), 27 deletions(-)
 create mode 100644 installer/resources/themes/console/classic/images/move_bottom.png
 create mode 100644 installer/resources/themes/console/classic/images/move_down.png
 create mode 100644 installer/resources/themes/console/classic/images/move_top.png
 create mode 100644 installer/resources/themes/console/classic/images/move_up.png
 create mode 100644 installer/resources/themes/console/dark/images/move_bottom.png
 create mode 100644 installer/resources/themes/console/dark/images/move_down.png
 create mode 100644 installer/resources/themes/console/dark/images/move_top.png
 create mode 100644 installer/resources/themes/console/dark/images/move_up.png
 create mode 100644 installer/resources/themes/console/light/images/move_bottom.png
 create mode 100644 installer/resources/themes/console/light/images/move_down.png
 create mode 100644 installer/resources/themes/console/light/images/move_top.png
 create mode 100644 installer/resources/themes/console/light/images/move_up.png
 create mode 100644 installer/resources/themes/console/midnight/images/move_bottom.png
 create mode 100644 installer/resources/themes/console/midnight/images/move_down.png
 create mode 100644 installer/resources/themes/console/midnight/images/move_top.png
 create mode 100644 installer/resources/themes/console/midnight/images/move_up.png

diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java
index 3ad7c1c206..92228d4bf2 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigSummaryHandler.java
@@ -26,10 +26,7 @@ public class ConfigSummaryHandler extends FormHandler {
         boolean deleting = _action.equals(_("Delete selected"));
         boolean adding = _action.equals(_("Add item"));
         boolean saving = _action.equals(_("Save order"));
-        boolean movingTop = _action.substring(_action.indexOf(' ') + 1).equals(_("Top"));
-        boolean movingUp = _action.substring(_action.indexOf(' ') + 1).equals(_("Up"));
-        boolean movingDown = _action.substring(_action.indexOf(' ') + 1).equals(_("Down"));
-        boolean movingBottom = _action.substring(_action.indexOf(' ') + 1).equals(_("Bottom"));
+        boolean moving = _action.startsWith("move_");
         if (_action.equals(_("Save")) && "0".equals(group)) {
             try {
                 int refreshInterval = Integer.parseInt(getJettyString("refreshInterval"));
@@ -50,8 +47,7 @@ public class ConfigSummaryHandler extends FormHandler {
             _context.router().saveConfig(SummaryHelper.PROP_SUMMARYBAR + "default", SummaryHelper.DEFAULT_MINIMAL);
             addFormNotice(_("Minimal summary bar default restored.") + " " +
                           _("Summary bar will refresh shortly."));
-        } else if (adding || deleting || saving ||
-                   movingTop || movingUp || movingDown || movingBottom) {
+        } else if (adding || deleting || saving || moving) {
             Map<Integer, String> sections = new TreeMap<Integer, String>();
             for (Object o : _settings.keySet()) {
                 if (!(o instanceof String))
@@ -115,21 +111,19 @@ public class ConfigSummaryHandler extends FormHandler {
                         addFormNotice(_("Removed") + ": " + removedName);
                     }
                 }
-            } else if (movingTop || movingUp || movingDown || movingBottom) {
-                int start = _action.indexOf('[');
-                int end = _action.indexOf(']');
-                String fromStr = _action.substring(start + 1, end - start);
+            } else if (moving) {
+                String parts[] = _action.split("_");
                 try {
-                    int from = Integer.parseInt(fromStr);
+                    int from = Integer.parseInt(parts[1]);
                     int to = 0;
-                    if (movingUp)
+                    if ("up".equals(parts[2]))
                         to = from - 1;
-                    if (movingDown)
+                    if ("down".equals(parts[2]))
                         to = from + 1;
-                    if (movingBottom)
+                    if ("bottom".equals(parts[2]))
                         to = sections.size() - 1;
                     int n = -1;
-                    if (movingDown || movingBottom)
+                    if ("down".equals(parts[2]) || "bottom".equals(parts[2]))
                         n = 1;
                     for (int i = from; n * i < n * to; i += n) {
                         String temp = sections.get(i + n);
@@ -159,4 +153,16 @@ public class ConfigSummaryHandler extends FormHandler {
             return null;
         return arr[0].trim();
     }
+
+    public void setMovingAction() {
+        for (Object o : _settings.keySet()) {
+            if (!(o instanceof String))
+                continue;
+            String k = (String) o;
+            if (k.startsWith("move_") && k.endsWith(".x") && _settings.get(k) != null) {
+                _action = k.substring(0, k.length() - 2);
+                break;
+            }
+        }
+    }
 }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
index 79d3233501..3adcf38cd9 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -799,6 +799,9 @@ public class SummaryHelper extends HelperBase {
                 sortedSections.add(section);
         }
 
+        String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME);
+        String imgPath = CSSHelper.BASE_THEME_PATH + theme + "/images/";
+
         StringBuilder buf = new StringBuilder(2048);
         buf.append("<table><tr><th>")
            .append(_("Remove"))
@@ -817,28 +820,28 @@ public class SummaryHelper extends HelperBase {
                .append(i)
                .append("\">");
             if (i > 0) {
-                buf.append("<input type=\"submit\" class=\"buttonTop\" name=\"action\" value=\"[")
+                buf.append("<input type=\"image\" class=\"buttonTop\" name=\"move_")
                    .append(i)
-                   .append("] ")
+                   .append("_top\" alt=\"")
                    .append(_("Top"))
-                   .append("\">");
-                buf.append("<input type=\"submit\" class=\"buttonUp\" name=\"action\" value=\"[")
+                   .append("\" src=\"" + imgPath + "move_top.png\">");
+                buf.append("<input type=\"image\" class=\"buttonUp\" name=\"move_")
                    .append(i)
-                   .append("] ")
+                   .append("_up\" alt=\"")
                    .append(_("Up"))
-                   .append("\">");
+                   .append("\" src=\"" + imgPath + "move_up.png\">");
             }
             if (i < sections.size() - 1) {
-                buf.append("<input type=\"submit\" class=\"buttonDown\" name=\"action\" value=\"[")
+                buf.append("<input type=\"image\" class=\"buttonDown\" name=\"move_")
                    .append(i)
-                   .append("] ")
+                   .append("_down\" alt=\"")
                    .append(_("Down"))
-                   .append("\">");
-                buf.append("<input type=\"submit\" class=\"buttonBottom\" name=\"action\" value=\"[")
+                   .append("\" src=\"" + imgPath + "move_down.png\">");
+                buf.append("<input type=\"image\" class=\"buttonBottom\" name=\"move_")
                    .append(i)
-                   .append("] ")
+                   .append("_bottom\" alt=\"")
                    .append(_("Bottom"))
-                   .append("\">");
+                   .append("\" src=\"" + imgPath + "move_bottom.png\">");
             }
             buf.append("</td><td align=\"left\">")
                .append(section)
diff --git a/apps/routerconsole/jsp/configsidebar.jsp b/apps/routerconsole/jsp/configsidebar.jsp
index 3f219fb40b..cbb270d4f6 100644
--- a/apps/routerconsole/jsp/configsidebar.jsp
+++ b/apps/routerconsole/jsp/configsidebar.jsp
@@ -30,6 +30,9 @@ input.default {
 <jsp:setProperty name="formhandler" property="*" />
 <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute(\"i2p.contextId\")%>" />
 <jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" />
+<%
+    formhandler.setMovingAction();
+%>
 <jsp:getProperty name="formhandler" property="allMessages" />
 <%
     String pageNonce = formhandler.getNewNonce();
diff --git a/installer/resources/themes/console/classic/images/move_bottom.png b/installer/resources/themes/console/classic/images/move_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..577ae3352199ef87736c59ec1a137aa5165a4961
GIT binary patch
literal 326
zcmV-M0lEH(P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pF_(?=TR5*=|(lJT{K@`UEp9*4OB?N?RJwWc^0R(T51EjUK@eUS(
zot?d4k!u7YU>)2@Hfv&$5oX7?s~=4B=9~X~Z{9$IU9qP6H4Xd?JfST%K2ZgbD(&Uo
zHZfda6M!BA&_e*)BnG$(TKvK|gN#$HZ0R<?=?u%lw8kv+%u+4)EYsPJCOxUHan+M%
z6149abKQsE;w`PM?gP(p6oKH<?+LDhmfGYU)N63C1i$<RA)e0AGzWE$I)Kz^@87Dh
z3P3CIj~~=ck*ZF$PzOC}&T)!ooY;@Pv7gij-mw@;G1C1nKYuBzjq-zs0c;nfE|ZrY
Y-?oO31t8!@xc~qF07*qoM6N<$g4HyLSpWb4

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/classic/images/move_down.png b/installer/resources/themes/console/classic/images/move_down.png
new file mode 100644
index 0000000000000000000000000000000000000000..d82b5d45dcfd3fe251ef497ce48108cb251109be
GIT binary patch
literal 325
zcmV-L0lNN)P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pF_en%SR5*>D(>+Q<K@`RDAEdPstg-{EfUVeN4FPvxBQ^ouf{U;c
zEbPQ88%W~{6dOfI?e|A~T4V+$!+kO4z`%Pm=l$=wmwE7spK1-YYZ&;aaG4&;gEw>o
zNH?98-fx`4W_qbXX94Im0KJz*Pg*MV3P>*~IK_S)`KvO0U|e{{X|MF$qEp8{##4}L
z7lR;8gYBSw>v*h^HMmQwsrD}-NY-J3)h*U7%?&ux8XoXceOR}2un3a1hvx;Ld%=Js
zb#Q}8OPZZ!AXx*v2B6V@AX!(qHb3-@RX}~So11^?qg5bTBeQ!ovE+c;v}M*(|1aY&
XgZ+fDxsXG{00000NkvXXu0mjf;#`J!

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/classic/images/move_top.png b/installer/resources/themes/console/classic/images/move_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..55192cf79bd3ce5bb58ab0323eed2d3f05b2bab7
GIT binary patch
literal 325
zcmV-L0lNN)P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pF_en%SR5*>5(mhH8Q51&ZM+LD62!bFCSh;}gBMWd1E+DN7a1Vlo
zU?JGq3RYP}8W99b5ho@?Of0;Co0&72_`zw;J>Sduxvc9DQ!G2;2gkW_w+7lzk!xkn
zwWBM60w?I<5eF$h#Q<M;$6MeHb%`?Ts7$$kslY^YH<R?XwXR!0C2qEb^!;6B)5ZGR
zfSxeh0Gi>s3o^hwFxJ8IR2ym!;~Hpz*A$By=p}g?x<IA5kMk7uy;aGxrXD_mkw#g~
zC>Ze*M>*)KrJMXZ(KV~&1*e(|{>EJ}{%v}zFa8YfTR_ndE?Phjf{~UO29TA8L4EZL
Xwg-;nhc4HW00000NkvXXu0mjf(6)lH

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/classic/images/move_up.png b/installer/resources/themes/console/classic/images/move_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..e512dbdc2d1682d38bd58edaa248aff3cbde7863
GIT binary patch
literal 290
zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Q!3HFy+4N(86lZ})WHAE+-(e7DJf6QI1t@sM
z)5S5wqIc;eN3Ny>f!6)Z70e5bcku3UzhHaE?eq&7#|i9$Sr^waZxQ)EbJ^C6x*2uH
zx72(PJNN&Y;bR+#V}2H#h95+Z1^4thDBJwc-o%n+8mPN<z5v5cqrx*!b4{)}q)LPy
zNL%B{F{Q0DS#y@7%#T0jcG(wej^4@G!(F;IRe?|a-tud_;fbqX@fN%^{&@bal-QxR
zcU^NWSR4}9OwsgBTNCl%XyR34-z6p!4MSOT<{q&6&U-`p_4_Bj+42W?6sGduKXJ<I
mM)H)VxetyQ6ngN~er1}Z);!0lMNby!KL$@%KbLh*2~7a>p>lr!

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/dark/console.css b/installer/resources/themes/console/dark/console.css
index a08bce0641..827d3a6b7d 100644
--- a/installer/resources/themes/console/dark/console.css
+++ b/installer/resources/themes/console/dark/console.css
@@ -923,6 +923,10 @@ input[type=text]:active, input[type=text]:hover {
      background: #000;
 }
 
+input[type=image] {
+     min-width: 0;
+}
+
 fieldset {
 overflow: hidden;
 position: relative;
diff --git a/installer/resources/themes/console/dark/images/move_bottom.png b/installer/resources/themes/console/dark/images/move_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..349fe2d5046056bb6e6f3082b2ef063268bcfeb9
GIT binary patch
literal 497
zcmV<N0S^9&P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pGqe(<TR5*==lCf^oP!L7$9S4+x7A<Q(SNuRKYI=Gk3O)cu2pYDD
zM3HI<AVjq-5)xk!zJP)@9}p@(dqK2l746z{Dey+#w+3Ei-#b2Y-;CKb&05k8?4DUs
z6t6LI>biab;B2Uo+?b?ulHJgdbXrwakwU7fDkPmIkWSLMx%&)&5))?jCIy+<E0U=!
zcb{2VmY0&=N!kp|Ly`|;j7M7`#&|^X5rD%%@(sziWm#St0J!_y%&vxQ+`T2a7^Gad
zdz&P@YTNb<0IqY!7@q)mPjWbTC;3=X2jCL`8>Rv9EQGMw0ZGc5rujxPNXoV{fY?8W
zZGAuBnCJQ3?V_$b^yaa&J9kMFNt2{0Bpna8y|;q8uD<}d2jFJv^=D1;Yo6!#cjlE=
zNqP$4;4csWIB@spskjFUAzYCB2w*h=SpoPELb&)Z2mrdSJHg1c0npuFj(sx<D$BA4
zFi%pg0L*)Dze6fiRaInJc8BCGcmIq(f4NIqo7n?Nzq+pbo&tA3%jNR6yZ=aZjnvA_
nCe!Kk=fAF|<eekQ(;EB+;lasi@|=Nl00000NkvXXu0mjf*udGW

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/dark/images/move_down.png b/installer/resources/themes/console/dark/images/move_down.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9152a3a005daaa7e896e26f872232e24ee6bd4a
GIT binary patch
literal 498
zcmV<O0S*3%P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pGq)9|UR5*==P(N!FK^%Q=_6!jug~f&0-Dw2-d;&j$r67_Ikj}<~
z0|f~oV6;;S*xA_HSjA2(t*w>a->L{UiYB@2Jexb2o9x9`&Ai`l-k)LDb*GXpVHuOE
zsvctiW_Az2LCTTrU5xPvK%WjI?KVwQ<swbfRFZZxIs$m@ilUeRVCDel+>>0$IroTU
zPS5(jzw5mB9|61saGVU+N#1JPc56YjZM#MCHh}fC63Iyj!5jd@7#{!_E#-~zjO1bR
z=rG23mZkaZy?>6hl9?R<*a2`Q)g!qrsR!^1fJ<f~d7~`L_e(-e(_D4VeIj{T(juJz
zwDWVF>`T&{x~^|7-v4t5A^ae@58zMYN=ciNHd9kcCz5v3j%iekMx$qveggQN{LLE4
zwX~9RZW=<cl|tk3_?M);d8Jh_@BP!9bU9H~)e8V$NPZhqA$f;npY!L0=1cb_Z4BtV
zEz9!VpurFc0A}_9zy^Tp03hkKD2m#9|9xoxT%rV1lGjMi=J$uIME(miJ2JCb*L7bd
o6&LMZln5lJ0HUPrp$|^+7vONDRgw^63IG5A07*qoM6N<$f@QtlFaQ7m

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/dark/images/move_top.png b/installer/resources/themes/console/dark/images/move_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..b743ff473eea18cda0dda3d895784e29cb4f48c8
GIT binary patch
literal 519
zcmV+i0{H!jP)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pGxk*GpR5*=|Q$34QQ52jxcZo49q}}-P)JCurZM4xJkOd1XYeCpv
z(JIA)ji6ZQKkx_G_#3Pgn^Y2;eK(j0HVQ7AyfZd0*_)f};(^<okC{2cxkM7<@wnS=
zx2FIu;QVki+w1juKbHwhtDR1#1)!A;sd;HIN8U&r9UT=RgguhG?*0)#yD1%;*+9~t
zx~_keWf{}CogAoXh%v@tLll;z?tZT*io<QYZYWx+GP7?0E@q{_?tU#-17sepl4gh4
z^aTJELU{3CimIx*LGtriBmi8}t$x4%^;|_}_8P$A3=jZVkbJu_m#G;@x{KrlB%Me)
zN!nTfZdX+`*a{>mkbFa~Z7Y&fl2as}kp#(iqtU3f0Tg3=Ea{4*kOBdC+PoEzq#)^1
zx7&TR0tbNEY__{tEGkLebS08silVsF5Pgz#ljKST$=`KdUoFe>mjS?hJ|DV!XKiP*
z9Z3fX@PV1F9k9E%&Fnb<a59-(mh>H`7YqQ$06r8&@h}~XF}?@z0H@yu0BU!?ZUA0o
z2163u{Ry&g_h-`josxu^y)*##GlM~Lxa}L1Wf@5hGtxkE{~tq%zBfM=p>hBK002ov
JPDHLkV1kir+j0N^

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/dark/images/move_up.png b/installer/resources/themes/console/dark/images/move_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..937e4266fea11848e0ea610f4f9a686e29d3626d
GIT binary patch
literal 452
zcmV;#0XzPQP)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pGc1c7*R5*=|ld)<PQ5c24b0?z~q5*M=9R@UDCn9!&`U)wm^bOJ*
zZDij-qS#sI0elAqJKsPNmOGG@bScEUJIBHy+`a5>^20ReKmWPs=llZ~RE+UB#&~=Y
zPurS(-#@Ya1whi%$z<|%6E|!Vvi$)VfWh|1ZQPAQec!(X9*mp-+#j*EwRW}ne11Kp
z^b@#Uw0_rhz1K9&*`*vU7K_)mcT3#%?sB<&dnre=*{lsA`~a@58?c>h-|f0CZgo^u
z)e%sw69JH<k+a!R9(U&8?<jC3hb2AB&!Kd5#Q(VSffGq5fLHbXDIYu+8l!z!h#NQ@
zzg#Ftx|g4W;5_bMz^!~GN#EPHeGCv|{AT-6vEpf6*LRwxIST+Or9(+KSFDDxWBVWz
zJ_sS~<Q&^KQc6<*ZHW61@VRZ<7y01$^F9ZzW$;qcUZ|?-y`=IbhGBR`QNu92vAu#x
u0(cjIecM&hoR$X%&~;suG%X&jfc<~e%&L_LfI^o50000<MNUMnLSTX=;K?=s

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/light/images/move_bottom.png b/installer/resources/themes/console/light/images/move_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..577ae3352199ef87736c59ec1a137aa5165a4961
GIT binary patch
literal 326
zcmV-M0lEH(P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pF_(?=TR5*=|(lJT{K@`UEp9*4OB?N?RJwWc^0R(T51EjUK@eUS(
zot?d4k!u7YU>)2@Hfv&$5oX7?s~=4B=9~X~Z{9$IU9qP6H4Xd?JfST%K2ZgbD(&Uo
zHZfda6M!BA&_e*)BnG$(TKvK|gN#$HZ0R<?=?u%lw8kv+%u+4)EYsPJCOxUHan+M%
z6149abKQsE;w`PM?gP(p6oKH<?+LDhmfGYU)N63C1i$<RA)e0AGzWE$I)Kz^@87Dh
z3P3CIj~~=ck*ZF$PzOC}&T)!ooY;@Pv7gij-mw@;G1C1nKYuBzjq-zs0c;nfE|ZrY
Y-?oO31t8!@xc~qF07*qoM6N<$g4HyLSpWb4

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/light/images/move_down.png b/installer/resources/themes/console/light/images/move_down.png
new file mode 100644
index 0000000000000000000000000000000000000000..d82b5d45dcfd3fe251ef497ce48108cb251109be
GIT binary patch
literal 325
zcmV-L0lNN)P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pF_en%SR5*>D(>+Q<K@`RDAEdPstg-{EfUVeN4FPvxBQ^ouf{U;c
zEbPQ88%W~{6dOfI?e|A~T4V+$!+kO4z`%Pm=l$=wmwE7spK1-YYZ&;aaG4&;gEw>o
zNH?98-fx`4W_qbXX94Im0KJz*Pg*MV3P>*~IK_S)`KvO0U|e{{X|MF$qEp8{##4}L
z7lR;8gYBSw>v*h^HMmQwsrD}-NY-J3)h*U7%?&ux8XoXceOR}2un3a1hvx;Ld%=Js
zb#Q}8OPZZ!AXx*v2B6V@AX!(qHb3-@RX}~So11^?qg5bTBeQ!ovE+c;v}M*(|1aY&
XgZ+fDxsXG{00000NkvXXu0mjf;#`J!

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/light/images/move_top.png b/installer/resources/themes/console/light/images/move_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..55192cf79bd3ce5bb58ab0323eed2d3f05b2bab7
GIT binary patch
literal 325
zcmV-L0lNN)P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pF_en%SR5*>5(mhH8Q51&ZM+LD62!bFCSh;}gBMWd1E+DN7a1Vlo
zU?JGq3RYP}8W99b5ho@?Of0;Co0&72_`zw;J>Sduxvc9DQ!G2;2gkW_w+7lzk!xkn
zwWBM60w?I<5eF$h#Q<M;$6MeHb%`?Ts7$$kslY^YH<R?XwXR!0C2qEb^!;6B)5ZGR
zfSxeh0Gi>s3o^hwFxJ8IR2ym!;~Hpz*A$By=p}g?x<IA5kMk7uy;aGxrXD_mkw#g~
zC>Ze*M>*)KrJMXZ(KV~&1*e(|{>EJ}{%v}zFa8YfTR_ndE?Phjf{~UO29TA8L4EZL
Xwg-;nhc4HW00000NkvXXu0mjf(6)lH

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/light/images/move_up.png b/installer/resources/themes/console/light/images/move_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..e512dbdc2d1682d38bd58edaa248aff3cbde7863
GIT binary patch
literal 290
zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Q!3HFy+4N(86lZ})WHAE+-(e7DJf6QI1t@sM
z)5S5wqIc;eN3Ny>f!6)Z70e5bcku3UzhHaE?eq&7#|i9$Sr^waZxQ)EbJ^C6x*2uH
zx72(PJNN&Y;bR+#V}2H#h95+Z1^4thDBJwc-o%n+8mPN<z5v5cqrx*!b4{)}q)LPy
zNL%B{F{Q0DS#y@7%#T0jcG(wej^4@G!(F;IRe?|a-tud_;fbqX@fN%^{&@bal-QxR
zcU^NWSR4}9OwsgBTNCl%XyR34-z6p!4MSOT<{q&6&U-`p_4_Bj+42W?6sGduKXJ<I
mM)H)VxetyQ6ngN~er1}Z);!0lMNby!KL$@%KbLh*2~7a>p>lr!

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/midnight/images/move_bottom.png b/installer/resources/themes/console/midnight/images/move_bottom.png
new file mode 100644
index 0000000000000000000000000000000000000000..349fe2d5046056bb6e6f3082b2ef063268bcfeb9
GIT binary patch
literal 497
zcmV<N0S^9&P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pGqe(<TR5*==lCf^oP!L7$9S4+x7A<Q(SNuRKYI=Gk3O)cu2pYDD
zM3HI<AVjq-5)xk!zJP)@9}p@(dqK2l746z{Dey+#w+3Ei-#b2Y-;CKb&05k8?4DUs
z6t6LI>biab;B2Uo+?b?ulHJgdbXrwakwU7fDkPmIkWSLMx%&)&5))?jCIy+<E0U=!
zcb{2VmY0&=N!kp|Ly`|;j7M7`#&|^X5rD%%@(sziWm#St0J!_y%&vxQ+`T2a7^Gad
zdz&P@YTNb<0IqY!7@q)mPjWbTC;3=X2jCL`8>Rv9EQGMw0ZGc5rujxPNXoV{fY?8W
zZGAuBnCJQ3?V_$b^yaa&J9kMFNt2{0Bpna8y|;q8uD<}d2jFJv^=D1;Yo6!#cjlE=
zNqP$4;4csWIB@spskjFUAzYCB2w*h=SpoPELb&)Z2mrdSJHg1c0npuFj(sx<D$BA4
zFi%pg0L*)Dze6fiRaInJc8BCGcmIq(f4NIqo7n?Nzq+pbo&tA3%jNR6yZ=aZjnvA_
nCe!Kk=fAF|<eekQ(;EB+;lasi@|=Nl00000NkvXXu0mjf*udGW

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/midnight/images/move_down.png b/installer/resources/themes/console/midnight/images/move_down.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9152a3a005daaa7e896e26f872232e24ee6bd4a
GIT binary patch
literal 498
zcmV<O0S*3%P)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pGq)9|UR5*==P(N!FK^%Q=_6!jug~f&0-Dw2-d;&j$r67_Ikj}<~
z0|f~oV6;;S*xA_HSjA2(t*w>a->L{UiYB@2Jexb2o9x9`&Ai`l-k)LDb*GXpVHuOE
zsvctiW_Az2LCTTrU5xPvK%WjI?KVwQ<swbfRFZZxIs$m@ilUeRVCDel+>>0$IroTU
zPS5(jzw5mB9|61saGVU+N#1JPc56YjZM#MCHh}fC63Iyj!5jd@7#{!_E#-~zjO1bR
z=rG23mZkaZy?>6hl9?R<*a2`Q)g!qrsR!^1fJ<f~d7~`L_e(-e(_D4VeIj{T(juJz
zwDWVF>`T&{x~^|7-v4t5A^ae@58zMYN=ciNHd9kcCz5v3j%iekMx$qveggQN{LLE4
zwX~9RZW=<cl|tk3_?M);d8Jh_@BP!9bU9H~)e8V$NPZhqA$f;npY!L0=1cb_Z4BtV
zEz9!VpurFc0A}_9zy^Tp03hkKD2m#9|9xoxT%rV1lGjMi=J$uIME(miJ2JCb*L7bd
o6&LMZln5lJ0HUPrp$|^+7vONDRgw^63IG5A07*qoM6N<$f@QtlFaQ7m

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/midnight/images/move_top.png b/installer/resources/themes/console/midnight/images/move_top.png
new file mode 100644
index 0000000000000000000000000000000000000000..b743ff473eea18cda0dda3d895784e29cb4f48c8
GIT binary patch
literal 519
zcmV+i0{H!jP)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pGxk*GpR5*=|Q$34QQ52jxcZo49q}}-P)JCurZM4xJkOd1XYeCpv
z(JIA)ji6ZQKkx_G_#3Pgn^Y2;eK(j0HVQ7AyfZd0*_)f};(^<okC{2cxkM7<@wnS=
zx2FIu;QVki+w1juKbHwhtDR1#1)!A;sd;HIN8U&r9UT=RgguhG?*0)#yD1%;*+9~t
zx~_keWf{}CogAoXh%v@tLll;z?tZT*io<QYZYWx+GP7?0E@q{_?tU#-17sepl4gh4
z^aTJELU{3CimIx*LGtriBmi8}t$x4%^;|_}_8P$A3=jZVkbJu_m#G;@x{KrlB%Me)
zN!nTfZdX+`*a{>mkbFa~Z7Y&fl2as}kp#(iqtU3f0Tg3=Ea{4*kOBdC+PoEzq#)^1
zx7&TR0tbNEY__{tEGkLebS08silVsF5Pgz#ljKST$=`KdUoFe>mjS?hJ|DV!XKiP*
z9Z3fX@PV1F9k9E%&Fnb<a59-(mh>H`7YqQ$06r8&@h}~XF}?@z0H@yu0BU!?ZUA0o
z2163u{Ry&g_h-`josxu^y)*##GlM~Lxa}L1Wf@5hGtxkE{~tq%zBfM=p>hBK002ov
JPDHLkV1kir+j0N^

literal 0
HcmV?d00001

diff --git a/installer/resources/themes/console/midnight/images/move_up.png b/installer/resources/themes/console/midnight/images/move_up.png
new file mode 100644
index 0000000000000000000000000000000000000000..937e4266fea11848e0ea610f4f9a686e29d3626d
GIT binary patch
literal 452
zcmV;#0XzPQP)<h;3K|Lk000e1NJLTq000sI000mO1^@s68wM|200009a7bBm000id
z000id0mpBsWB>pGc1c7*R5*=|ld)<PQ5c24b0?z~q5*M=9R@UDCn9!&`U)wm^bOJ*
zZDij-qS#sI0elAqJKsPNmOGG@bScEUJIBHy+`a5>^20ReKmWPs=llZ~RE+UB#&~=Y
zPurS(-#@Ya1whi%$z<|%6E|!Vvi$)VfWh|1ZQPAQec!(X9*mp-+#j*EwRW}ne11Kp
z^b@#Uw0_rhz1K9&*`*vU7K_)mcT3#%?sB<&dnre=*{lsA`~a@58?c>h-|f0CZgo^u
z)e%sw69JH<k+a!R9(U&8?<jC3hb2AB&!Kd5#Q(VSffGq5fLHbXDIYu+8l!z!h#NQ@
zzg#Ftx|g4W;5_bMz^!~GN#EPHeGCv|{AT-6vEpf6*LRwxIST+Or9(+KSFDDxWBVWz
zJ_sS~<Q&^KQc6<*ZHW61@VRZ<7y01$^F9ZzW$;qcUZ|?-y`=IbhGBR`QNu92vAu#x
u0(cjIecM&hoR$X%&~;suG%X&jfc<~e%&L_LfI^o50000<MNUMnLSTX=;K?=s

literal 0
HcmV?d00001

-- 
GitLab