Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
dcbriccetti committed Dec 13, 2009
1 parent 1a953a3 commit 49cf650
Show file tree
Hide file tree
Showing 7 changed files with 136 additions and 137 deletions.
10 changes: 10 additions & 0 deletions src/main/scala/birdshow/snippet/Home.scala
@@ -0,0 +1,10 @@
package birdshow.snippet

import xml.NodeSeq
import net.liftweb.util.Helpers._
import birdshow.model.Flickr

class Home {
def home(content: NodeSeq) = bind("home", content,
"randomUrl" -> <img src={Flickr.getRandomHomePhotoUrl}/>)
}
48 changes: 48 additions & 0 deletions src/main/scala/birdshow/snippet/PhotoRows.scala
@@ -0,0 +1,48 @@
package birdshow.snippet

import xml.{Node, NodeSeq}
import net.liftweb.util.Helpers._
import birdshow.util.Group
import birdshow.model.Flickr
import birdshow.model.flickr.PictureIdAndSizes

trait PhotoRows {
type PicAndSizes = Tuple2[Node, PictureIdAndSizes]

def bindPhotoRows[T](content: NodeSeq, photos: Seq[T],
img: (Option[T]) => NodeSeq, title: (Option[T]) => String) =
Group.group(photos).flatMap(g =>
bind("item", chooseTemplate("gal", "photoRows", content),
"img1" -> img (g._1),
"title1" -> title(g._1),
"img2" -> img (g._2),
"title2" -> title(g._2),
"img3" -> img (g._3),
"title3" -> title(g._3)))

protected def pImg(photoAndSize: Option[PicAndSizes]): NodeSeq = photoAndSize match {
case Some((photo, pictureIdAndSizes)) =>
<a href="#">
<img onclick={"BIRDSHOW.showBig('" + pictureIdAndSizes.getPreferredSizeUrl + "'); return false;"}
src={pictureIdAndSizes.getSmallSizeUrl}/>
</a>
case None => <p/>
}

protected def pTitle(photoSet: Option[PicAndSizes]): String = photoSet match {
case Some(ps) => (ps._1 \ "@title").text
case None => ""
}

protected def psAnchor(photoSet: Option[Node]): NodeSeq = photoSet match {
case Some(ps) =>
<a href={"?id=" + ((ps \ "@id").text)}><img src={Flickr.url(ps, "primary", "_m")}/></a>
case None => <p/>
}

protected def psTitle(photoSet: Option[Node]): String = photoSet match {
case Some(ps) => (ps \ "title").text
case None => ""
}

}
88 changes: 6 additions & 82 deletions src/main/scala/birdshow/snippet/Pictures.scala
@@ -1,70 +1,38 @@
package birdshow.snippet

import net.liftweb.util.Helpers._
import xml.{Text, Node, NodeSeq}
import xml.{Text, NodeSeq}
import net.liftweb.util.{Full}
import net.liftweb.http.{RequestVar, SHtml, S}
import birdshow.model.Flickr
import birdshow.model.flickr.PictureIdAndSizes
import birdshow.util.{Group, Loggable}
import birdshow.util.{Loggable}

class Pictures extends Loggable {
class Pictures extends Loggable with PhotoRows {
private object searchText extends RequestVar("")
private type PicAndSizes = Tuple2[Node, PictureIdAndSizes]

def home(content: NodeSeq) = bind("home", content,
"randomUrl" -> <img src={Flickr.getRandomHomePhotoUrl}/>)

def search(content: NodeSeq) = bind("search", content,
"text" -> SHtml.text(searchText.is, searchText(_)),
"submit" -> SHtml.submit("Search", () => {}))

def showShowPictures(content: NodeSeq): NodeSeq = {
def pImg(photoAndSize: Option[PicAndSizes]): NodeSeq = photoAndSize match {
case Some((photo, pictureIdAndSizes)) => <img src={pictureIdAndSizes.getSmallSizeUrl}/>
case None => <span/>
}

def bindGroup(content: NodeSeq, photosAndSizes: Flickr.PhotosSeq) =
Group.group(photosAndSizes).flatMap(picGroup =>
bind("item", chooseTemplate("photo", "list", content),
"img1" -> pImg (picGroup._1),
"title1" -> pTitle(picGroup._1),
"img2" -> pImg (picGroup._2),
"title2" -> pTitle(picGroup._2),
"img3" -> pImg (picGroup._3),
"title3" -> pTitle(picGroup._3)))

bind("gal", content,
"galleries" -> bindGroup(content, Flickr.getSetPhotosAndSizes(Flickr.getUser.showSetId)))
}

def showGalleries(content: NodeSeq): NodeSeq = {

def bindAllGalleries(content: NodeSeq) = bind("gal", content,
"heading" -> "",
"showAll" -> "",
"galleries" -> Group.group(Flickr.getSets).flatMap(setGroup =>
bind("item", chooseTemplate("photo", "list", content),
"img1" -> psAnchor(setGroup._1),
"title1" -> psTitle (setGroup._1),
"img2" -> psAnchor(setGroup._2),
"title2" -> psTitle (setGroup._2),
"img3" -> psAnchor(setGroup._3),
"title3" -> psTitle (setGroup._3))))
"photoRows" -> bindPhotoRows(content, Flickr.getSets, psAnchor, psTitle))

def bindGalleryWithId(content: NodeSeq, id: String) = bind("gal", content,
"heading" -> Text(Flickr.getSets.find(s => (s \ "@id").text == id) match {
case Some(photoSet) => (photoSet \ "title").text
case _ => ""
}),
"showAll" -> <a href="?">Show gallery index</a>,
"galleries" -> bindGroup(content, Flickr.getSetPhotosAndSizes(id)))
"photoRows" -> bindPhotoRows(content, Flickr.getSetPhotosAndSizes(id), pImg, pTitle))

def bindSearchResults(content: NodeSeq) = bind("gal", content,
"heading" -> Text("Results for " + searchText.is),
"showAll" -> <a href="?">Show gallery index</a>,
"galleries" -> bindGroup(content, Flickr.searchPhotos(searchText.is)))
"photoRows" -> bindPhotoRows(content, Flickr.searchPhotos(searchText.is), pImg, pTitle))

if (searchText.is != "")
bindSearchResults(content)
Expand All @@ -74,48 +42,4 @@ class Pictures extends Loggable {
case _ => bindAllGalleries(content)
}
}

def sets(content: NodeSeq): NodeSeq = <p>{getSetTitles.mkString(", ")}</p>

private def bindGroup(content: NodeSeq, photosAndSizes: Flickr.PhotosSeq) =
Group.group(photosAndSizes).flatMap(pGroup =>
bind("item", chooseTemplate("photo", "list", content),
"img1" -> pImg (pGroup._1),
"title1" -> pTitle(pGroup._1),
"img2" -> pImg (pGroup._2),
"title2" -> pTitle(pGroup._2),
"img3" -> pImg (pGroup._3),
"title3" -> pTitle(pGroup._3)))

private case class PrioritizedSource(val priority: Int, val source: String)

private def pImg(photoAndSize: Option[PicAndSizes]): NodeSeq = photoAndSize match {
case Some((photo, pictureIdAndSizes)) =>
<a href="#">
<img onclick={"BIRDSHOW.showBig('" + pictureIdAndSizes.getPreferredSizeUrl + "'); return false;"}
src={pictureIdAndSizes.getSmallSizeUrl}/>
</a>
case None => <p/>
}

private def pTitle(photoSet: Option[PicAndSizes]): String = photoSet match {
case Some(ps) => (ps._1 \ "@title").text
case None => ""
}

private def psAnchor(photoSet: Option[Node]): NodeSeq = photoSet match {
case Some(ps) =>
<a href={"?id=" + ((ps \ "@id").text)}><img src={Flickr.url(ps, "primary", "_m")}/></a>
case None => <p/>
}

private def psTitle(photoSet: Option[Node]): String = photoSet match {
case Some(ps) => (ps \ "title").text
case None => ""
}

private def getSetTitles: List[Tuple2[String,String]] = {
Flickr.getSets.map(s => ((s \ "@id").text, (s \ "title").text)).toList.sort(_._2 < _._2)
}

}
20 changes: 20 additions & 0 deletions src/main/scala/birdshow/snippet/Shows.scala
@@ -0,0 +1,20 @@
package birdshow.snippet

import net.liftweb.util.Helpers._
import xml.NodeSeq
import birdshow.model.Flickr
import birdshow.util.Loggable

class Shows extends Loggable with PhotoRows {

def showShowPictures(content: NodeSeq): NodeSeq = {
def pImg(photoAndSize: Option[PicAndSizes]): NodeSeq = photoAndSize match {
case Some((photo, pictureIdAndSizes)) => <img src={pictureIdAndSizes.getSmallSizeUrl}/>
case None => <span/>
}

bind("gal", content,
"photoRows" -> bindPhotoRows(content, Flickr.getSetPhotosAndSizes(Flickr.getUser.showSetId),
pImg, pTitle))
}
}
46 changes: 22 additions & 24 deletions src/main/webapp/galleries.html
Expand Up @@ -13,30 +13,28 @@
</div>
<gal:showAll/>
<table class="photos">
<gal:galleries>
<photo:list>
<tr>
<td>
<item:img1/>
<div class="title">
<item:title1/>
</div>
</td>
<td>
<item:img2/>
<div class="title">
<item:title2/>
</div>
</td>
<td>
<item:img3/>
<div class="title">
<item:title3/>
</div>
</td>
</tr>
</photo:list>
</gal:galleries>
<gal:photoRows>
<tr>
<td>
<item:img1/>
<div class="title">
<item:title1/>
</div>
</td>
<td>
<item:img2/>
<div class="title">
<item:title2/>
</div>
</td>
<td>
<item:img3/>
<div class="title">
<item:title3/>
</div>
</td>
</tr>
</gal:photoRows>
</table>
</lift:Pictures.showGalleries>

Expand Down
4 changes: 2 additions & 2 deletions src/main/webapp/index.html
Expand Up @@ -2,9 +2,9 @@

<div>
<div class="homePicture">
<lift:Pictures.home>
<lift:Home.home>
<home:randomUrl/>
</lift:Pictures.home>
</lift:Home.home>
</div>

<p>Welcome to Eleanor Briccetti Photography, where the emphasis is on wildlife in natural
Expand Down
57 changes: 28 additions & 29 deletions src/main/webapp/shows.html
@@ -1,39 +1,38 @@
<lift:surround with="default" at="content">

<p>Eleanor’s slide presentations are always enthusiastically and warmly received by audiences.
They are interesting, informative, and often infused with a touch of humor.
Shows usually last about an hour, and the subjects are chosen from the following:</p>

<lift:Pictures.showShowPictures>
<lift:Shows.showShowPictures>
<table class="photos">
<gal:galleries>
<photo:list>
<tr>
<td>
<item:img1/>
<div class="title">
<item:title1/>
</div>
</td>
<td>
<item:img2/>
<div class="title">
<item:title2/>
</div>
</td>
<td>
<item:img3/>
<div class="title">
<item:title3/>
</div>
</td>
</tr>
</photo:list>
</gal:galleries>
<gal:photoRows>
<tr>
<td>
<item:img1/>
<div class="title">
<item:title1/>
</div>
</td>
<td>
<item:img2/>
<div class="title">
<item:title2/>
</div>
</td>
<td>
<item:img3/>
<div class="title">
<item:title3/>
</div>
</td>
</tr>
</gal:photoRows>
</table>
</lift:Pictures.showShowPictures>
</lift:Shows.showShowPictures>

<p>Additional shows include Birds &amp; Bears of Churchill and The Adventures of a Wildlife Photographer.
To schedule a program please email <a href="mailto:eb@briccettiphoto.com">eb@briccettiphoto.com</a>.</p>

To schedule a program please email <a href="mailto:eb@briccettiphoto.com">eb@briccettiphoto.com</a>.
</p>

</lift:surround>

0 comments on commit 49cf650

Please sign in to comment.