-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c960e42
commit 6d21115
Showing
7 changed files
with
481 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() {} | ||
|
||
} | ||
?> |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
|
||
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
|
||
?> |
Oops, something went wrong.