From 4812cec634601a44ae686336560e09364b8a0a36 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= <bjourne@gmail.com>
Date: Fri, 16 Oct 2015 09:20:29 +0200
Subject: [PATCH] ui.gadgets.buttons: memoize the roll button themes pens

It reduces memory usage by about 10% for the #1488 test on my machine
and doesnt seem to have any bad side-effects.
---
 basis/ui/gadgets/buttons/buttons-tests.factor |  7 +++++-
 basis/ui/gadgets/buttons/buttons.factor       | 25 +++++++++++--------
 2 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/basis/ui/gadgets/buttons/buttons-tests.factor b/basis/ui/gadgets/buttons/buttons-tests.factor
index c94f7611ee..a427da9793 100644
--- a/basis/ui/gadgets/buttons/buttons-tests.factor
+++ b/basis/ui/gadgets/buttons/buttons-tests.factor
@@ -1,4 +1,4 @@
-USING: accessors models namespaces tools.test ui.gadgets
+USING: accessors kernel models namespaces tools.test ui.gadgets
 ui.gadgets.buttons ;
 IN: ui.gadgets.buttons.tests
 
@@ -18,3 +18,8 @@ IN: ui.gadgets.buttons.tests
 { 2 } [
     "religion" get gadget-child control-value
 ] unit-test
+
+{ t t } [
+    "but1" [ ] <roll-button> "but2" [ ] <roll-button>
+    [ [ boundary>> ] bi@ eq? ] [ [ interior>> ] bi@ eq? ] 2bi
+] unit-test
diff --git a/basis/ui/gadgets/buttons/buttons.factor b/basis/ui/gadgets/buttons/buttons.factor
index 80e2bf3fe2..123ecc6e93 100644
--- a/basis/ui/gadgets/buttons/buttons.factor
+++ b/basis/ui/gadgets/buttons/buttons.factor
@@ -1,11 +1,10 @@
 ! Copyright (C) 2005, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs classes colors colors.constants combinators
-combinators.short-circuit combinators.smart fry kernel locals
-math.vectors models namespaces sequences ui.commands ui.gadgets
-ui.gadgets.borders ui.gadgets.labels ui.gadgets.packs
-ui.gadgets.theme ui.gadgets.tracks ui.gadgets.worlds ui.gestures
-ui.pens ui.pens.image ui.pens.solid ui.pens.tile ;
+USING: accessors assocs colors combinators combinators.short-circuit
+combinators.smart fry kernel locals math.vectors memoize models
+namespaces sequences ui.commands ui.gadgets ui.gadgets.borders
+ui.gadgets.labels ui.gadgets.packs ui.gadgets.theme ui.gadgets.worlds
+ui.gestures ui.pens ui.pens.image ui.pens.solid ui.pens.tile ;
 FROM: models => change-model ;
 IN: ui.gadgets.buttons
 
@@ -60,8 +59,8 @@ button H{
     button new-button ;
 
 TUPLE: button-pen
-plain rollover
-pressed selected pressed-selected ;
+    plain rollover
+    pressed selected pressed-selected ;
 
 C: <button-pen> button-pen
 
@@ -103,9 +102,15 @@ M: button-pen pen-foreground
 : align-left ( button -- button )
     { 0 1/2 } >>align ; inline
 
+MEMO: button-pen-boundary ( -- button-pen )
+    f roll-button-rollover-border <solid> dup f f <button-pen> ;
+
+MEMO: button-pen-interior ( -- button-pen )
+    f f roll-button-selected-background <solid> f f <button-pen> ;
+
 : roll-button-theme ( button -- button )
-    f roll-button-rollover-border <solid> dup f f <button-pen> >>boundary
-    f f roll-button-selected-background <solid> f f <button-pen> >>interior
+    button-pen-boundary >>boundary
+    button-pen-interior >>interior
     align-left ; inline
 
 PRIVATE>