From 8cff6ea9cb6881fd1a8e10bdec5ebe2ab4d43b4d Mon Sep 17 00:00:00 2001 From: epriestley Date: Fri, 7 Dec 2012 13:36:35 -0800 Subject: [PATCH] Add eye icon to left menu button Summary: Do we have an icon with 2x for the right menu? Test Plan: {F26590} Reviewers: chad Reviewed By: chad CC: aran Maniphest Tasks: T1960 Differential Revision: https://secure.phabricator.com/D4101 --- resources/sprite/manifest/gradient.json | 4 +- resources/sprite/manifest/menu.json | 10 +++ resources/sprite/menu_1x/app.png | Bin 0 -> 989 bytes resources/sprite/menu_1x/eye.png | Bin 0 -> 354 bytes resources/sprite/menu_2x/app.png | Bin 0 -> 1027 bytes resources/sprite/menu_2x/eye.png | Bin 0 -> 509 bytes scripts/celerity/generate_sprites.php | 19 +++++- .../celerity/CeleritySpriteGenerator.php | 15 ++++- .../page/menu/PhabricatorMainMenuView.php | 36 +++++++++-- .../css/application/base/main-menu-view.css | 57 ++++++++++++++---- webroot/rsrc/css/sprite-gradient.css | 6 +- webroot/rsrc/css/sprite-menu.css | 10 ++- webroot/rsrc/image/sprite-menu-X2.png | Bin 3314 -> 3807 bytes webroot/rsrc/image/sprite-menu.png | Bin 1779 -> 2083 bytes webroot/rsrc/image/texture/dark-menu.png | Bin 0 -> 4361 bytes 15 files changed, 134 insertions(+), 23 deletions(-) create mode 100644 resources/sprite/menu_1x/app.png create mode 100644 resources/sprite/menu_1x/eye.png create mode 100644 resources/sprite/menu_2x/app.png create mode 100644 resources/sprite/menu_2x/eye.png create mode 100644 webroot/rsrc/image/texture/dark-menu.png diff --git a/resources/sprite/manifest/gradient.json b/resources/sprite/manifest/gradient.json index ab96d12c96..c050f77f36 100644 --- a/resources/sprite/manifest/gradient.json +++ b/resources/sprite/manifest/gradient.json @@ -28,7 +28,7 @@ }, "gradient-dark-menu-label" : { "name" : "gradient-dark-menu-label", - "rule" : ".gradient-dark-menu-label", + "rule" : ".gradient-dark-menu-label, .phabricator-dark-menu .phabricator-menu-item-type-label", "hash" : "89a908596142d38fbe61a706694cd321" }, "gradient-green-dark" : { @@ -55,6 +55,6 @@ "scales" : [ 1 ], - "header" : "\/**\n * @provides sprite-gradient-css\n * @generated\n *\/\n\n.sprite-gradient, button, a.button, a.button:visited, input.inputsubmit {\n background-image: url(\/rsrc\/image\/sprite-gradient.png);\n background-repeat: repeat-x;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-gradient, button, a.button, a.button:visited, input.inputsubmit {\n background-image: url(\/rsrc\/image\/sprite-gradient-X2.png);\n background-size: {X}px {Y}px;\n }\n}", + "header" : "\/**\n * @provides sprite-gradient-css\n * @generated\n *\/\n\n.sprite-gradient, button, a.button, a.button:visited, input.inputsubmit, .phabricator-dark-menu .phabricator-menu-item-type-label {\n background-image: url(\/rsrc\/image\/sprite-gradient.png);\n background-repeat: repeat-x;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-gradient, button, a.button, a.button:visited, input.inputsubmit, .phabricator-dark-menu .phabricator-menu-item-type-label {\n background-image: url(\/rsrc\/image\/sprite-gradient-X2.png);\n background-size: {X}px {Y}px;\n }\n}", "type" : "repeat-x" } diff --git a/resources/sprite/manifest/menu.json b/resources/sprite/manifest/menu.json index 75c4747934..e008dc5386 100644 --- a/resources/sprite/manifest/menu.json +++ b/resources/sprite/manifest/menu.json @@ -1,6 +1,11 @@ { "version" : 1, "sprites" : { + "app" : { + "name" : "app", + "rule" : ".menu-icon-app", + "hash" : "a389f99d9c00f688e625da71579ee90a" + }, "arrow-right" : { "name" : "arrow-right", "rule" : ".phabricator-crumb-divider", @@ -11,6 +16,11 @@ "rule" : ".phabricator-main-menu-alert-bubble.alert-unread", "hash" : "1145ac8a137a2a22517c1945fe22c517" }, + "eye" : { + "name" : "eye", + "rule" : ".menu-icon-eye", + "hash" : "d598b1acb1933a86eaed3dea3347f7b0" + }, "round_bubble" : { "name" : "round_bubble", "rule" : ".phabricator-main-menu-alert-bubble", diff --git a/resources/sprite/menu_1x/app.png b/resources/sprite/menu_1x/app.png new file mode 100644 index 0000000000000000000000000000000000000000..c395e306af525b2d51162b413ce103f9fb31a8f7 GIT binary patch literal 989 zcmaJ=J#W)M77e%Nym0`x0oNA5KjEAa) zUDk{-Y~=cs%`mHLk#AZpL_i%i98ZJaKYWD1u{F4rGI+z!p{7$j2+-!iM%6lKS&9wU z?t#@vr2;M@CWzc!FH|E9_Hd^vKahG0>>ahD7y7>FNrO#7e3j$c?Kay^vN&jPf}$v~hA1W| zA`$L;#EcSNxHwSIQD_B@PaN!lSkbKGJ)%Jx>3IsSKa};tewk>&xXAQ5f#u_r20+93 zKh$-H=#W&e$+Ikw*qx`+}Pt$&H7>^{Hna17Xs{pUec;FI+pZEy*}3-9ZO~;m!rXOaclo- z^}s~uC*BSRmmY?rk32f>0Ud0=b2LjY#iNp*tw!JKzq;ME@x<7T@mFJC54*+r%V(#b zzI>iOIsxmmw+l-TmM4y+>u^rmN^bu+K6!q2T9w|uoP0O2QiG(K|Jl5|5M5&~O*2=e UboS}o>rQ;(O8E`Fv%Y=!2VWgBXaE2J literal 0 HcmV?d00001 diff --git a/resources/sprite/menu_1x/eye.png b/resources/sprite/menu_1x/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ccfe2bfd51130c079c7cb8d0de06880c0467ec GIT binary patch literal 354 zcmV-o0iFJdP)rI>2h*T>@me4O#3!+6J^;ji zKr9W#eo!%Va1v?;RtrRd_%;?z?RbK*9gF(gP_s}h;0NMMI9$$*#{!VtVJ!MCLCs`< zh51Pw;cA0qm_1b8Nhljx{6CK1;shy}k0;{zkqml{B>o&poF9+=`Aoo+%1mUQ`AY;F z9Wav;L>^F=KZml34k8d1qCq4Jp(j%bDkf72axOV literal 0 HcmV?d00001 diff --git a/resources/sprite/menu_2x/app.png b/resources/sprite/menu_2x/app.png new file mode 100644 index 0000000000000000000000000000000000000000..f59dc10f147f84976085cf9ebca698d4d519b05a GIT binary patch literal 1027 zcmaJ=PiWIn7>}Dy84d)YOb_ywiEd!?uWh!5b+c{St!U=ximM1>n!K)IOJ0_|+H?mQ zB2K+|_29vQcoK$820QHFA5e7Q#lyfMBJ40>2XA`Nm#*zRSVNNczVCg%-}m?3n;0MM z>O9#=QB+rEOwN*(BVXT<4)R}Jtj>|;1Wx7gBr4*H>Od;4qXGmOQ=NucsOr_Zw{VD} z+D{v~JkBc@B@LO3>f11$X%jR>4UKrVs?9(Q3UJ!6V)X9XIt>gxMo&c)PO+1)WQ@%_ zaB_Y;r_Il3QJo$c21A}i2uz4o;F+_QD|s=x#w(G%uV!gbGr==4dM~KFG69mvfgr+! zf*Qy3Kol8191%tS91u8OU^()NK|U-+L`fI`^@k?j9K9%I<#gQ_kz#ZSV_Ra`N~OY7 zLJV@ISw0$#`W%7~Bo;xpYGKt2T5fNHL58m87&bPL1$;)efXX;VlSubcFzqI-<<`qY z3dVY>&GHQAr_?Z1l>eKWX4BfmS-2nXKZ)I3)rM>qx~S}Eq;bVw-<2&T9jIdDqte(#j^Za09FFV^b}${xFy}@hn5fxB>OFgG^9MS~6P4l4!|S z$Lg(PNw&nYBpB9j?O&~KsL1^I+veaBp*i}{BJ=K$!M+`QB$7)}&dBkcxB30ka@PWP zRQ}k#eE1i7edbB#K}RaQu(bWAKl^QGV!B|@n~Og_bMo%!?)IgvQy2P< zy$n3;=hj9KTz&d8aR2Pql7G|mo-23T?&JfHec{^s#LYsWjXEDF^ib60_SJ*k)T#<0J!$~ZNM^K3Xl23raIhy2~gtJA6d4`3H18t~Ka3+vowNnnD z#VHT0wK-xaK4cC_O4?Z86@2!cyH)l!F7AXKP?u zKE36eo@p5ktw*LRaYGc0l{EEyheFxhL~$b962BQ`o;}~8P&RMZx_7BO1ei`;Hdz%Y zE18gWie?*)qL4+=N<`7j&Ay$U)qy7ZBjvc+yT?_EtKx%C*g279f; zz2*3iSBnpIxr^k$Ltd|QI $generator->buildGradientSheet(), ); +list($err) = exec_manual('optipng'); +if ($err) { + $have_optipng = false; + echo phutil_console_format( + " WARNING `optipng` not found in PATH.\n". + "Sprites will not be optimized! Install `optipng`!\n"); +} else { + $have_optipng = true; +} + foreach ($sheets as $name => $sheet) { $manifest_path = $root.'/resources/sprite/manifest/'.$name.'.json'; if (!$args->getArg('force')) { @@ -226,7 +236,14 @@ foreach ($sheets as $name => $sheet) { } else { $sheet_name = "sprite-{$name}-X{$scale}.png"; } - $sheet->generateImage("{$webroot}/image/{$sheet_name}", $scale); + + $full_path = "{$webroot}/image/{$sheet_name}"; + $sheet->generateImage($full_path, $scale); + + if ($have_optipng) { + echo "Optimizing...\n"; + phutil_passthru('optipng -o7 -clobber %s', $full_path); + } } } diff --git a/src/infrastructure/celerity/CeleritySpriteGenerator.php b/src/infrastructure/celerity/CeleritySpriteGenerator.php index 4d88b69c99..fe2033efae 100644 --- a/src/infrastructure/celerity/CeleritySpriteGenerator.php +++ b/src/infrastructure/celerity/CeleritySpriteGenerator.php @@ -113,6 +113,16 @@ final class CeleritySpriteGenerator { 'y' => 31, 'css' => '.phabricator-crumb-divider', ), + 'eye' => array( + 'x' => 24, + 'y' => 20, + 'css' => '.menu-icon-eye', + ), + 'app' => array( + 'x' => 24, + 'y' => 20, + 'css' => '.menu-icon-app', + ), ); $scales = array( @@ -177,6 +187,8 @@ final class CeleritySpriteGenerator { 'button.grey_active, a.dropdown-open', 'green-dark' => ', button.green, a.green, a.green:visited', 'green-light' => ', button.green:active, a.green:active', + 'dark-menu-label' + => ', .phabricator-dark-menu .phabricator-menu-item-type-label', ); $sprites = array(); @@ -195,7 +207,8 @@ final class CeleritySpriteGenerator { $sheet = $this->buildSheet( 'gradient', PhutilSpriteSheet::TYPE_REPEAT_X, - ', button, a.button, a.button:visited, input.inputsubmit'); + ', button, a.button, a.button:visited, input.inputsubmit, '. + '.phabricator-dark-menu .phabricator-menu-item-type-label'); foreach ($sprites as $sprite) { $sheet->addSprite($sprite); } diff --git a/src/view/page/menu/PhabricatorMainMenuView.php b/src/view/page/menu/PhabricatorMainMenuView.php index a833960e4d..f9059dc28f 100644 --- a/src/view/page/menu/PhabricatorMainMenuView.php +++ b/src/view/page/menu/PhabricatorMainMenuView.php @@ -7,7 +7,6 @@ final class PhabricatorMainMenuView extends AphrontView { private $controller; private $applicationMenu; - public function setApplicationMenu(PhabricatorMenuView $application_menu) { $this->applicationMenu = $application_menu; return $this; @@ -110,7 +109,9 @@ final class PhabricatorMainMenuView extends AphrontView { self::renderSingleView( array( $this->renderPhabricatorMenuButton($header_id), - $this->renderApplicationMenuButton($header_id), + $application_menu + ? $this->renderApplicationMenuButton($header_id) + : null, $this->renderPhabricatorLogo(), $alerts, $phabricator_menu, @@ -164,7 +165,12 @@ final class PhabricatorMainMenuView extends AphrontView { ), ), ), - ''); + phutil_render_tag( + 'span', + array( + 'class' => 'phabricator-menu-button-icon sprite-menu menu-icon-eye', + ), + '')); } public function renderApplicationMenuButton($header_id) { @@ -180,7 +186,12 @@ final class PhabricatorMainMenuView extends AphrontView { ), ), ), - ''); + phutil_render_tag( + 'span', + array( + 'class' => 'phabricator-menu-button-icon sprite-menu menu-icon-app', + ), + '')); } private function renderPhabricatorMenu() { @@ -221,6 +232,23 @@ final class PhabricatorMainMenuView extends AphrontView { $search = $this->renderSearch(); $view->appendChild($search); + $view + ->newLabel(pht('Home')) + ->addClass('phabricator-core-item-device'); + $view->addMenuItem( + id(new PhabricatorMenuItemView()) + ->addClass('phabricator-core-item-device') + ->setName(pht('Phabricator Home')) + ->setHref('/')); + if ($controller->getCurrentApplication()) { + $application = $controller->getCurrentApplication(); + $view->addMenuItem( + id(new PhabricatorMenuItemView()) + ->addClass('phabricator-core-item-device') + ->setName(pht('%s Home', $application->getName())) + ->setHref($controller->getApplicationURI())); + } + if ($core) { $view->addMenuItem( id(new PhabricatorMenuItemView()) diff --git a/webroot/rsrc/css/application/base/main-menu-view.css b/webroot/rsrc/css/application/base/main-menu-view.css index 2e7de7a188..035eb5636c 100644 --- a/webroot/rsrc/css/application/base/main-menu-view.css +++ b/webroot/rsrc/css/application/base/main-menu-view.css @@ -1,4 +1,4 @@ -/** +<<iIACRo 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

fX*H}>{tZ!e>a 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 N002ovPDHLkV1l9h+QEa000KMNkl=pNjB z>Vr?gGNB!V3-hI29ib0COmUalwLWYm9h)0v*s!vf7Ub@C-0#}!-Hj%iqdBDqz9jdk z_xJgo`#ZmT&hN-^uVTA!@%=K;@Lv9QX7*MYX!tO}B~Wya;1Vc$SnyLI8RXgn{1iwA zxeg0HiSPnm$H~)36F!OX0$#_-(>N$_7lISTuumjmlm@s9!HHtnCz3EaD0p54FJlOa z_&vG{Jgf8LtyM4)8kgk}6DOyiVvi zz|(@?8eRO1yL8~UMi)Qh_%yWeF52*lM7{nLVWWi<_4;Xsji?=AkWJGUO93xx zM;K(&^u=gr86{-G*cVfQOQ~`_W*H@9!q^v6flJhLJuVA)O(;o$pie-bQWClMFxqND+k0xoAhI?Y2aSP-K>eTyC`?Hav@wJ>$B`i;Cr;oW z591AcK>?5-Z|0*U0c`}(W&{}s%gJ=W>p)j<1bQgLrsGTxvRpy7l&u;xiXQt98C?4` z!pK&w2W|unsK9+WCO@(bAnUf~27Q3>=F3q9Foe$Oje1XxgvxGn;N|ES78cszqc2Cp zMK65%keTC(ii${QkO6Q-L1gB*f`S49-pvqvH!^R+M;Hm2t!1fHinz=D70m^0!%wd1U6enwpvh*0K%H^YxqXSFc_*K@2eiPgn`_*7~5T zs;Y&RH!QNgY&UM)Fu_|($n~`iVZ46*dddIR#6F*ohezVi;c)R2M%|r=EX(=L&CRtr zI{E@(BaA7xQt(4VS69~w@Y0(rJ1N3KmFH@}U0q#+*=%;fWbx33B{qmHVw2b=4Ew4&ksE-DK_*ZMWtq^{{-9rlMq;fNH|T!c zL-wM`TbWF3GB>Qb240OBX8|%uk$J+8o!hQv{oHh93l?b z(lPo^L1_{sg9N;egEBrv@nL*->@#0`&;e4^}=!&NJho5PXuLjVtxuIUbbFD z9t^);%vic@t;o!SWR<2sB7RS64&>+M4E!_Ct0sG_{$p>0TjjWatft& zVtx{g^k*5|hxZG@y-6%@TZ7*}VwFHK{4V2l0>7)Z>xp?APSk9}D++-Fr_=@)%Z|#Z z1b)Urf~sH9&KbyHF!(5Mz{5}&b*gRNGgrtOiF*CJ#tf{N1C;l#5wNkXrhdnAOa#d) zxj;5eUs@;TwBf@LHrwF8u~zY*1V{#ju`h<#L=q^iT<<>sc(>N**GH?%K)mW&21%fd zPRzZOk8?=AcT!n8S}Ybf=6G5a-Cn4*G*E$WXlSU%(V=w+<~x7>Je~Fa;NV~hrb-%d zA8KrDY@)jBsI07XP#FEqo!7|72;Kj)nVXw4;UmuG%PIu*78`dEZDL}g8czkYk$Hkp zLqB(*o7T&hFV~_2-TTNcApq}KSy?&w@~J z;&!`RRR8$t^6D+T^=aJUTjBfBg9Iw$jql4vU?Je!eGY)43 zbMR1+oxXT!aOt$eInE;dnV%j!{PT>X^;eLAMF$qncD}O;p(C&eADq4U)qNQGJ1oK* zpFe-`m%XKJ9Y(*FMF*~peKh_(z<%(>C+@k+*Y#Qv9RdCOz1*C z8T~O9;T_9ANF?rI@;dWbbYQvttqub3VHW;0Yw#F0YcT4MmiqQ>t zJ9`^&Qu_Gv<}E0FIGHScK+(xdicWskz-&{_Zh002ovPDHLkV1laRTWkOT diff --git a/webroot/rsrc/image/texture/dark-menu.png b/webroot/rsrc/image/texture/dark-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..64982f5b9ce2461149cb07b0809c5a640d79a31a GIT binary patch literal 4361 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