Skip to content

Commit

Permalink
git status
Browse files Browse the repository at this point in the history
  • Loading branch information
przybylski committed Jun 6, 2012
1 parent c960e42 commit 6d21115
Show file tree
Hide file tree
Showing 7 changed files with 481 additions and 33 deletions.
7 changes: 4 additions & 3 deletions apps/gallery/ajax/thumbnail.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,15 @@
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/


OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('gallery');
require_once('apps/gallery/lib/managers.php');


$img = $_GET['img'];
$img = $_GET['filepath'];

$image = OC_Gallery_Photo::getThumbnail($img);
$image = \OC\Pictures\ThumbnailsManager::getInstance()->getThumbnail($img);
if ($image) {
OCP\Response::enableCaching(3600 * 24); // 24 hour
$image->show();
Expand Down
94 changes: 94 additions & 0 deletions apps/gallery/lib/managers.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php

namespace OC\Pictures;

require_once('lib/base.php');

\OCP\JSON::checkLoggedIn();
\OCP\JSON::checkAppEnabled('gallery');

class DatabaseManager {
private static $instance = null;
const TAG = 'DatabaseManager';

public static function getInstance() {
if (self::$instance === null)
self::$instance = new DatabaseManager();
return self::$instance;
}

public function getFileData($path) {
$gallery_path = \OCP\Config::getSystemValue( 'datadirectory' ).'/'.\OC_User::getUser().'/gallery';
$path = $gallery_path.$path;
$stmt = \OCP\DB::prepare('SELECT * FROM *PREFIX*pictures_images_cache WHERE uid_owner LIKE ? AND path = ?');
$result = $stmt->execute(array(\OCP\USER::getUser(), $path));
if (($row = $result->fetchRow()) != false) {
return $row;
}
$image = new \OC_Image();
if (!$image->loadFromFile($path)) {
return false;
}
$stmt = \OCP\DB::prepare('INSERT INTO *PREFIX*pictures_images_cache (uid_owner, path, width, height) VALUES (?, ?, ?, ?)');
$stmt->execute(array(\OCP\USER::getUser(), $path, $image->width(), $image->height()));
unset($image);
return $this->getFileData($path);
}

private function __construct() {}
}

class ThumbnailsManager {

private static $instance = null;
const TAG = 'ThumbnailManager';

public static function getInstance() {
if (self::$instance === null)
self::$instance = new ThumbnailsManager();
return self::$instance;
}

public function getThumbnail($path) {
$gallery_path = \OCP\Config::getSystemValue( 'datadirectory' ).'/'.\OC_User::getUser().'/gallery';
if (file_exists($gallery_path.$path)) {
return new \OC_Image($gallery_path.$path);
}
if (!\OC_Filesystem::file_exists($path)) {
\OC_Log::write(self::TAG, 'File '.$path.' don\'t exists', \OC_Log::WARN);
return false;
}
$image = new \OC_Image();
$image->loadFromFile(\OC_Filesystem::getLocalFile($path));
if (!$image->valid()) return false;

$image->fixOrientation();

$ret = $image->preciseResize(floor((200*$image->width())/$image->height()), 200);

if (!$ret) {
\OC_Log::write(self::TAG, 'Couldn\'t resize image', \OC_Log::ERROR);
unset($image);
return false;
}

$image->save($gallery_path.'/'.$path);
return $image;
}

public function getThumbnailInfo($path) {
$arr = DatabaseManager::getInstance()->getFileData($path);
$ret = array('filepath' => $arr['path'],
'width' => $arr['width'],
'height' => $arr['height']);
return $ret;
}

public function delete($path) {
unlink(\OC::$CONFIG_DATADIRECTORY_ROOT.'/'.\OC_User::getUser()."/gallery".$path);
}

private function __construct() {}

}
?>
Binary file added apps/gallery/lib/testimg.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
183 changes: 183 additions & 0 deletions apps/gallery/lib/tiles.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
<?php

namespace OC\Pictures;

require_once('lib/base.php');
require_once('managers.php');

const TILE_PROPORTION_HORIZONTAL = 0;
const TILE_PROPORTION_VERTICAL = 0;
const GET_THUMBNAIL_PATH = '?app=gallery&getfile=ajax/thumbnail.php&filepath=';
const TAG = 'Pictures';

class TileBase {
public function getWidth() { return false; }

public function getHeight() { return 200; }

public function getOnHoverAction() { return false; }

public function getOnOutAction() { return false; }

public function getOnClickAction() { return false; }

public function getDisplayedLayer() { return false; }

public function getTileProportion() { return false; }

public function get() { return false; }
}

class TilesLine {

public function __construct() {
$this->tiles_array = array();
}

public function setAvailableSpace($space) {
$available_space = $space;
}

public function getTilesCount() {
return count($this->tiles_array);
}

public function addTile($tile) {
array_push($this->tiles_array, $tile);
}

public function getLeftSpace() {
$occupied_space = 0;
for ($i = 0; $i < count($this->tiles_array); $i++) {
$occupied_space += $this->tiles_array[$i]->getWidth();
}
return $this->available_space - $occupied_space;
}

public function tileWillFit($tile) {
return $this->getLeftSpace() > $tile->getWidth();
}

public function get() {
$r = '<div class="line gallery_div">';

for ($i = 0; $i < count($this->tiles_array); $i++) {
$img_w = $this->tiles_array[$i]->getWidth();
$extra = '';
if ($img_w != 200) $extra = ' style="width:'.$img_w.'px"';
$r .= '<div class="gallery_div" '.$extra.' onmouseover="'.$this->tiles_array[$i]->getOnHoverAction().'" onmouseout="'.$this->tiles_array[$i]->getOnOutAction().'">'.$this->tiles_array[$i]->get().'</div>';
}

$r .= '</div>';
return $r;
}

private $tiles_array;
private $available_space;
}

class TileSingle extends TileBase {

public function __construct($path) {
\OC_Log::write(TAG, 'Loading file from path '.$path, \OC_Log::DEBUG);
$this->file_path = $path;
/* $this->image = new \OC_Image();
if (!$this->image->loadFromFile($this->file_path)) {
\OC_Log::write(TAG, 'Loading file filed', \OC_Log::ERROR);
return;
}
$this->image->fixOrientation();*/
}

public function getWidth() {
$a = ThumbnailsManager::getInstance()->getThumbnailInfo($this->file_path);
return $a['width'];
}

public function forceSize($width_must_fit=false) {
$current_height = $this->image->height();
$current_width = $this->image->width();

// we need height of 250px but not for tiles stack
if ($current_width > $current_height && !$width_must_fit) {
$this->image->resize(floor((250*$current_width)/$current_height));
} else {
$this->image->resize(200);
}
}

public function get($extra = '') {
return '<img src="'.GET_THUMBNAIL_PATH.urlencode($this->getPath()).'" '.$extra.'>';
}

public function getMiniatureSrc() {
return GET_THUMBNAIL_PATH.urlencode($this->getPath());
}

public function getPath() {
return $this->file_path;
}

private $file_path;
private $image;
}

class TileStack extends TileBase {

const STACK_REPRESENTATIVES = 3;

public function __construct($path_array, $stack_name) {
$this->tiles_array = array();
$this->stack_name = $stack_name;
for ($i = 0; $i < count($path_array) && $i < self::STACK_REPRESENTATIVES; $i++) {
$tile = new TileSingle($path_array[$i]);
array_push($this->tiles_array, $tile);
}
}

public function forceSize($width_must_fit=false) {
for ($i = 0; $i < count($this->tiles_array); $i++)
$this->tiles_array[$i]->forceSize(true);
}

public function getWidth() {
$max = 0;
for ($i = 0; $i < count($this->tiles_array); $i++) {
$max = max($max, $this->tiles_array[$i]->getWidth());
}
return min(200, $max);
}

public function get() {
$r = '<div class="title gallery_div">'.$this->stack_name.'</div>';
for ($i = 0; $i < count($this->tiles_array); $i++) {
$top = rand(-5, 5);
$left = rand(-5, 5);
$img_w = $this->tiles_array[$i]->getWidth();
$extra = '';
if ($img_w < 200) {
$extra = 'width:'.$img_w.'px;';
}
$r .= '<div class="miniature_border gallery_div" style="background-image:url(\''.$this->tiles_array[$i]->getMiniatureSrc().'\');margin-top:'.$top.'px; margin-left:'.$left.'px;'.$extra.'"></div>';
// $r .= $this->tiles_array[$i]->get(' style="margin-top:'.$top.'px; margin-left:'.$left.'px; "');
}
return $r;
}

public function getOnHoverAction() {
return 'javascript:t(this);return false;';
}

public function getOnOutAction() {
return 'javascript:o(this);return false;';
}

public function getCount() {
return count($this->tiles_array);
}

private $tiles_array;
private $stack_name;
}

?>
87 changes: 87 additions & 0 deletions apps/gallery/lib/tiles_test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php
$l = OC_L10N::get('gallery');
?>
<style>
div.gallery_div {position:relative; display: inline-block; height: 202px; width: 200px; margin: 5px;}
div.miniature_border {position:absolute; height: 200px; -webkit-transition-duration: .2s; background-position: 50%;}
div.line {display:inline-block; border: 0; width: auto; height: 210px}
div.gallery_div img{position:absolute; top: 1; left: 0; -webkit-transition-duration: 0.3s; height:200px; width: auto;}
div.gallery_div img.shrinker {width:80px !important;}
div.title { opacity: 0; text-align: center; vertical-align: middle; font-family: Arial; font-size: 12px; border: 0; position: absolute; text-overflow: ellipsis; bottom: 20px; left:10px; height:auto; padding: 5px; width: 170px; background-color: black; color: white; -webkit-transition: opacity 0.5s; z-index:1000; border-radius: 7px}
div.visible { opacity: 0.8;}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
function t(element) {
$('div', element).each(function(index, elem) {
if ($(elem).hasClass('title')) {
$(elem).addClass('visible');
} else {
$(elem).css('margin-top', Math.floor(30-(Math.random()*60)) + 'px')
.css('margin-left', Math.floor(30-(Math.random()*60))+ 'px')
.css('z-index', '999');
}
});
}

function o(element) {
$('div', element).each(function(index, elem) {
if ($(elem).hasClass('title')) {
$(elem).removeClass('visible');
} else {
$(elem).css('margin-top', Math.floor(5-(Math.random()*10)) + 'px')
.css('margin-left', Math.floor(5-(Math.random()*10))+ 'px')
.css('z-index', '3');
}
});
}

</script>

<?php

include('apps/gallery/lib/tiles.php');
$root = empty($_GET['root'])?'/':$_GET['root'];

$images = \OC_FileCache::searchByMime('image', null, '/bartek/files'.$root);
sort($images);

$arr = array();
$tl = new \OC\Pictures\TilesLine();
$ts = new \OC\Pictures\TileStack(array(), '');
$previous_element = $images[0];
for($i = 0; $i < count($images); $i++) {
error_log($images[$i]);
$prev_dir_arr = explode('/', $previous_element);
$dir_arr = explode('/', $images[$i]);

if (count($dir_arr)==1) {
$tl->addTile(new \OC\Pictures\TileSingle($images[$i]));
continue;
}
if (strcmp($prev_dir_arr[0], $dir_arr[0])!=0) {
$tl->addTile(new \OC\Pictures\TileStack($arr, $prev_dir_arr[0]));
$arr = array();
}
$arr[] = $root.$images[$i];
$previous_element = $images[$i];
}

$dir_arr = explode('/', $previous_element);

if (count($dir_arr)==0) {
$tl->addTile(new \OC\Pictures\TileSingle($previous_element));
} else if (count($dir_arr) && $ts->getCount() == 0){
$ts = new \OC\Pictures\TileStack(array($previous_element), $dir_arr[0]);
} else {
$arr[] = $previous_element;
$ts->addTile($arr);
}

if ($ts->getCount() != 0) {
$tl->addTile($ts);
}

echo $tl->get();

?>
Loading

0 comments on commit 6d21115

Please sign in to comment.