commit
65cd15ca15
@ -0,0 +1,11 @@ |
||||
<?php |
||||
|
||||
$currentVersion=OC_Appconfig::getValue('gallery', 'installed_version'); |
||||
if (version_compare($currentVersion, '0.5.0', '<')) { |
||||
$stmt = OCP\DB::prepare('DROP TABLE IF EXISTS *PREFIX*gallery_photos'); |
||||
$stmt->execute(); |
||||
$stmt = OCP\DB::prepare('DROP TABLE IF EXISTS *PREFIX*gallery_albums'); |
||||
$stmt->execute(); |
||||
|
||||
\OC_DB::createDbFromStructure(OC::$APPSROOT.'/apps/'.$appid.'/appinfo/database.xml'); |
||||
} |
@ -1 +1 @@ |
||||
0.4.3 |
||||
0.5.0 |
||||
|
@ -0,0 +1,97 @@ |
||||
<?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; |
||||
} |
||||
\OCP\DB::beginTransaction(); |
||||
$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())); |
||||
\OCP\DB::commit(); |
||||
$ret = array('filepath' => $path, 'width' => $image->width(), 'height' => $image->height()); |
||||
unset($image); |
||||
return $ret; |
||||
} |
||||
|
||||
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((150*$image->width())/$image->height()), 150); |
||||
|
||||
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() {} |
||||
|
||||
} |
||||
?> |
@ -0,0 +1,178 @@ |
||||
<?php |
||||
|
||||
namespace OC\Pictures; |
||||
|
||||
require_once('lib/base.php'); |
||||
require_once('managers.php'); |
||||
|
||||
const TAG = 'Pictures'; |
||||
const IMAGE_WIDTH = 150; |
||||
|
||||
class TileBase { |
||||
public function getWidth() { return false; } |
||||
|
||||
public function getHeight() { return IMAGE_WIDTH; } |
||||
|
||||
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 != IMAGE_WIDTH) $extra = ' style="width:'.$img_w.'px"'; |
||||
$r .= '<div class="gallery_div" '.$extra.' onmouseover="'.$this->tiles_array[$i]->getOnHoverAction().'" onmouseout="'.$this->tiles_array[$i]->getOnOutAction().'" onclick="'.$this->tiles_array[$i]->getOnClickAction().'">'.$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 get($extra = '') { |
||||
// !HACK! file path needs to be encoded twice because files app decode twice url, so any special chars like + or & in filename |
||||
// !HACK! will result in failing of opening them |
||||
return '<a rel="images" title="'.basename($this->getPath()).'" href="'.\OCP\Util::linkTo('files', 'download.php').'?file='.urlencode(urlencode($this->getPath())).'"><img rel="images" src="'.\OCP\Util::linkTo('gallery', 'ajax/thumbnail.php').'&filepath='.urlencode($this->getPath()).'" '.$extra.'></a>'; |
||||
} |
||||
|
||||
public function getMiniatureSrc() { |
||||
return \OCP\Util::linkTo('gallery', 'ajax/thumbnail.php').'&filepath='.urlencode($this->getPath()); |
||||
} |
||||
|
||||
public function getPath() { |
||||
return $this->file_path; |
||||
} |
||||
|
||||
public function getOnClickAction() { |
||||
return '';//'javascript:openFile(\''.$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(IMAGE_WIDTH, $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 < IMAGE_WIDTH) { |
||||
$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>'; |
||||
} |
||||
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); |
||||
} |
||||
|
||||
public function getOnClickAction() { |
||||
return 'javascript:openNewGal(\''.$this->stack_name.'\');'; |
||||
} |
||||
|
||||
private $tiles_array; |
||||
private $stack_name; |
||||
} |
||||
|
||||
?> |
@ -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(); |
||||
|
||||
?> |
@ -1,31 +1,105 @@ |
||||
<?php |
||||
OCP\Util::addStyle('gallery', 'styles'); |
||||
OCP\Util::addscript('gallery', 'albums'); |
||||
OCP\Util::addscript('gallery', 'scanner'); |
||||
OCP\Util::addscript('gallery', 'album_cover'); |
||||
OCP\Util::addStyle('files', 'files'); |
||||
OCP\Util::addscript('files_imageviewer', 'jquery.mousewheel-3.0.4.pack'); |
||||
OCP\Util::addscript('files_imageviewer', 'jquery.fancybox-1.3.4.pack'); |
||||
OCP\Util::addStyle( 'files_imageviewer', 'jquery.fancybox-1.3.4' ); |
||||
|
||||
$l = OC_L10N::get('gallery'); |
||||
?> |
||||
<script type="text/javascript">var gallery_scanning_root='<?php echo OCP\Config::getUserValue(OCP\USER::getUser(), 'gallery', 'root', '/'); ?>'; var gallery_default_order = '<?php echo OCP\Config::getUserValue(OCP\USER::getUser(), 'gallery', 'order', 'ASC'); ?>';</script>
|
||||
<div id="controls"> |
||||
<div id="scan"> |
||||
<div id="scanprogressbar"></div> |
||||
<input type="button" class="start" value="<?php echo $l->t('Rescan');?>" onclick="javascript:scanForAlbums();" />
|
||||
<input type="button" class="stop" style="display:none" value="<?php echo $l->t('Stop');?>" onclick="javascript:Scanner.stop();" />
|
||||
<input type="button" id="g-share-button" value="<?php echo $l->t('Share'); ?>" onclick="javascript:shareGallery();" />
|
||||
<input type="button" id="g-settings-button" value="<?php echo $l->t('Settings');?>" onclick="javascript:settings();"/>
|
||||
</div> |
||||
<div id="g-album-navigation"> |
||||
<div class="crumb last" style="background-image:url('<?php echo OC::$WEBROOT;?>/core/img/breadcrumb.png')">
|
||||
<a href="javascript:returnToElement(0);">main</a> |
||||
</div> |
||||
</div> |
||||
<div id="g-album-loading" class="crumb" style="display:none"> |
||||
<img src="<?php echo OCP\Util::linkTo('gallery', 'img/loading.gif'); ?>">
|
||||
</div> |
||||
</div> |
||||
<div id="gallery_list"> |
||||
</div> |
||||
<style> |
||||
div.gallery_div {position:relative; display: inline-block; height: 152px; width: 150px; margin: 5px;} |
||||
div.miniature_border {position:absolute; height: 150px; -webkit-transition-duration: .2s; background-position: 50%;} |
||||
div.line {display:inline-block; border: 0; width: auto; height: 160px} |
||||
div.gallery_div img{position:absolute; top: 1; left: 0; -webkit-transition-duration: 0.3s; height:150px; 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:5px; height:auto; padding: 5px; width: 140px; background-color: black; color: white; -webkit-transition: opacity 0.5s; z-index:1000; border-radius: 7px} |
||||
div.visible { opacity: 0.8;} |
||||
</style> |
||||
<script type="text/javascript"> |
||||
|
||||
var root = "<?php echo !empty($_GET['root']) ? $_GET['root'] : '/'; ?>";
|
||||
|
||||
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'); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
function openNewGal(album_name) { |
||||
root = root + album_name + "/"; |
||||
var url = window.location.toString().replace(window.location.search, ''); |
||||
url = url + "?app=gallery&root="+encodeURIComponent(root); |
||||
|
||||
window.location = url; |
||||
} |
||||
|
||||
$(document).ready(function() { |
||||
$("a[rel=images]").fancybox({ |
||||
'titlePosition': 'inside' |
||||
}); |
||||
}); |
||||
|
||||
</script> |
||||
|
||||
<?php |
||||
|
||||
include('apps/gallery/lib/tiles.php'); |
||||
$root = empty($_GET['root'])?'/':$_GET['root']; |
||||
|
||||
$images = \OC_FileCache::searchByMime('image', null, '/'.\OCP\USER::getUser().'/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++) { |
||||
$prev_dir_arr = explode('/', $previous_element); |
||||
$dir_arr = explode('/', $images[$i]); |
||||
|
||||
if (count($dir_arr)==1) { |
||||
$tl->addTile(new \OC\Pictures\TileSingle($root.$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($images)>1) { |
||||
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($root.$previous_element), $dir_arr[0]); |
||||
} else { |
||||
$arr[] = $previous_element; |
||||
$ts->addTile($arr); |
||||
} |
||||
} |
||||
|
||||
if ($ts->getCount() != 0) { |
||||
$tl->addTile($ts); |
||||
} |
||||
|
||||
echo $tl->get(); |
||||
|
||||
?> |
||||
|
@ -0,0 +1,55 @@ |
||||
<?php |
||||
/** |
||||
* Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl> |
||||
* This file is licensed under the Affero General Public License version 3 or |
||||
* later. |
||||
* See the COPYING-README file. |
||||
*/ |
||||
|
||||
class OC_Cache_Broker { |
||||
protected $fast_cache; |
||||
protected $slow_cache; |
||||
|
||||
public function __construct($fast_cache, $slow_cache) { |
||||
$this->fast_cache = $fast_cache; |
||||
$this->slow_cache = $slow_cache; |
||||
} |
||||
|
||||
public function get($key) { |
||||
if ($r = $this->fast_cache->get($key)) { |
||||
return $r; |
||||
} |
||||
return $this->slow_cache->get($key); |
||||
} |
||||
|
||||
public function set($key, $value, $ttl=0) { |
||||
$set_slow = strlen($value) > 8192; |
||||
if ($set_slow) { |
||||
if ($this->fast_cache->hasKey($key)) { |
||||
$this->fast_cache->remove($key); |
||||
} |
||||
$this->slow_cache->set($key, $value, $ttl); |
||||
} else { |
||||
$this->fast_cache->set($key, $value, $ttl); |
||||
} |
||||
} |
||||
|
||||
public function hasKey($key) { |
||||
if ($this->fast_cache->hasKey($key)) { |
||||
return true; |
||||
} |
||||
return $this->slow_cache->hasKey($key); |
||||
} |
||||
|
||||
public function remove($key) { |
||||
if ($this->fast_cache->remove($key)) { |
||||
return true; |
||||
} |
||||
return $this->slow_cache->remove($key); |
||||
} |
||||
|
||||
public function clear(){ |
||||
$this->fast_cache->clear(); |
||||
$this->slow_cache->clear(); |
||||
} |
||||
} |
Loading…
Reference in new issue