##// END OF EJS Templates
Show monochrome image popups in monochrome threads
neko259 -
r1965:7ff6c47e default
parent child Browse files
Show More
@@ -1,199 +1,199 b''
1 .ui-button {
1 .ui-button {
2 display: none;
2 display: none;
3 }
3 }
4
4
5 .ui-dialog-content {
5 .ui-dialog-content {
6 padding: 0;
6 padding: 0;
7 min-height: 0;
7 min-height: 0;
8 }
8 }
9
9
10 .mark_btn {
10 .mark_btn {
11 cursor: pointer;
11 cursor: pointer;
12 }
12 }
13
13
14 .img-full {
14 .img-full {
15 position: fixed;
15 position: fixed;
16 background-color: #CCC;
16 background-color: #CCC;
17 border: 1px solid #000;
17 border: 1px solid #000;
18 cursor: pointer;
18 cursor: pointer;
19 }
19 }
20
20
21 .strikethrough {
21 .strikethrough {
22 text-decoration: line-through;
22 text-decoration: line-through;
23 }
23 }
24
24
25 .post_preview {
25 .post_preview {
26 z-index: 300;
26 z-index: 300;
27 position:absolute;
27 position:absolute;
28 }
28 }
29
29
30 .gallery_image {
30 .gallery_image {
31 display: inline-block;
31 display: inline-block;
32 }
32 }
33
33
34 @media print {
34 @media print {
35 .post-form-w {
35 .post-form-w {
36 display: none;
36 display: none;
37 }
37 }
38 }
38 }
39
39
40 input[name="image"] {
40 input[name="image"] {
41 display: block;
41 display: block;
42 width: 100px;
42 width: 100px;
43 height: 100px;
43 height: 100px;
44 cursor: pointer;
44 cursor: pointer;
45 position: absolute;
45 position: absolute;
46 opacity: 0;
46 opacity: 0;
47 z-index: 1;
47 z-index: 1;
48 }
48 }
49
49
50 .file_wrap {
50 .file_wrap {
51 width: 100px;
51 width: 100px;
52 height: 100px;
52 height: 100px;
53 border: solid 1px white;
53 border: solid 1px white;
54 display: inline-block;
54 display: inline-block;
55 }
55 }
56
56
57 form > .file_wrap {
57 form > .file_wrap {
58 float: left;
58 float: left;
59 }
59 }
60
60
61 .file-thumb {
61 .file-thumb {
62 width: 100px;
62 width: 100px;
63 height: 100px;
63 height: 100px;
64 background-size: cover;
64 background-size: cover;
65 background-position: center;
65 background-position: center;
66 }
66 }
67
67
68 .compact-form-text {
68 .compact-form-text {
69 margin-left:110px;
69 margin-left:110px;
70 }
70 }
71
71
72 textarea, input {
72 textarea, input {
73 -moz-box-sizing: border-box;
73 -moz-box-sizing: border-box;
74 -webkit-box-sizing: border-box;
74 -webkit-box-sizing: border-box;
75 box-sizing: border-box;
75 box-sizing: border-box;
76 }
76 }
77
77
78 .compact-form-text > textarea {
78 .compact-form-text > textarea {
79 height: 100px;
79 height: 100px;
80 width: 100%;
80 width: 100%;
81 }
81 }
82
82
83 .post-button-form {
83 .post-button-form {
84 display: inline;
84 display: inline;
85 }
85 }
86
86
87 .post-button-form > button, #autoupdate {
87 .post-button-form > button, #autoupdate {
88 border: none;
88 border: none;
89 margin: inherit;
89 margin: inherit;
90 padding: inherit;
90 padding: inherit;
91 background: none;
91 background: none;
92 font-size: inherit;
92 font-size: inherit;
93 cursor: pointer;
93 cursor: pointer;
94 }
94 }
95
95
96 .post-image-full {
96 .post-image-full {
97 width: 100%;
97 width: 100%;
98 height: auto;
98 height: auto;
99 }
99 }
100
100
101 #preview-text {
101 #preview-text {
102 display: none;
102 display: none;
103 }
103 }
104
104
105 .random-images-table {
105 .random-images-table {
106 text-align: center;
106 text-align: center;
107 }
107 }
108
108
109 .random-images-table > div {
109 .random-images-table > div {
110 margin-left: auto;
110 margin-left: auto;
111 margin-right: auto;
111 margin-right: auto;
112 }
112 }
113
113
114 .tag-image, .tag-text-data {
114 .tag-image, .tag-text-data {
115 display: inline-block;
115 display: inline-block;
116 }
116 }
117
117
118 .tag-text-data > h2 {
118 .tag-text-data > h2 {
119 margin: 0;
119 margin: 0;
120 }
120 }
121
121
122 .tag-image {
122 .tag-image {
123 margin-right: 5px;
123 margin-right: 5px;
124 }
124 }
125
125
126 .reply-to-message {
126 .reply-to-message {
127 display: none;
127 display: none;
128 }
128 }
129
129
130 .tripcode {
130 .tripcode {
131 padding: 2px;
131 padding: 2px;
132 }
132 }
133
133
134 #fav-panel {
134 #fav-panel {
135 display: none;
135 display: none;
136 margin: 1ex;
136 margin: 1ex;
137 }
137 }
138
138
139 .hidden_post {
139 .hidden_post {
140 opacity: 0.2;
140 opacity: 0.2;
141 }
141 }
142
142
143 .hidden_post:hover {
143 .hidden_post:hover {
144 opacity: 1;
144 opacity: 1;
145 }
145 }
146
146
147 .monochrome > .image > .thumb > img {
147 .monochrome > .image > .thumb > img, .monochrome.img-full {
148 filter: grayscale(100%);
148 filter: grayscale(100%);
149 -webkit-filter: grayscale(100%);
149 -webkit-filter: grayscale(100%);
150 }
150 }
151
151
152 #quote-button {
152 #quote-button {
153 position: absolute;
153 position: absolute;
154 display: none;
154 display: none;
155 cursor: pointer;
155 cursor: pointer;
156 z-index: 400;
156 z-index: 400;
157 }
157 }
158
158
159 .required-field:before {
159 .required-field:before {
160 content: '* ';
160 content: '* ';
161 }
161 }
162
162
163 .hint {
163 .hint {
164 border-bottom: dashed 1px;
164 border-bottom: dashed 1px;
165 cursor: help;
165 cursor: help;
166 }
166 }
167
167
168 .url-image:hover {
168 .url-image:hover {
169 filter: invert(100%);
169 filter: invert(100%);
170 }
170 }
171
171
172 .landing-tags, .landing-images {
172 .landing-tags, .landing-images {
173 max-width: 800px;
173 max-width: 800px;
174 margin-left: auto;
174 margin-left: auto;
175 margin-right: auto;
175 margin-right: auto;
176 }
176 }
177
177
178 .landing-images {
178 .landing-images {
179 text-align: center;
179 text-align: center;
180 }
180 }
181
181
182 .landing-threads {
182 .landing-threads {
183 margin-left: auto;
183 margin-left: auto;
184 margin-right: auto;
184 margin-right: auto;
185 text-align: center;
185 text-align: center;
186 display: flex;
186 display: flex;
187 flex-wrap: wrap;
187 flex-wrap: wrap;
188 justify-content: space-around;
188 justify-content: space-around;
189 }
189 }
190
190
191 .landing-threads > .thread-short {
191 .landing-threads > .thread-short {
192 display: inline-block;
192 display: inline-block;
193 width: 240px;
193 width: 240px;
194 }
194 }
195
195
196 audio {
196 audio {
197 width: 200px;
197 width: 200px;
198 }
198 }
199
199
@@ -1,205 +1,208 b''
1 /*
1 /*
2 @licstart The following is the entire license notice for the
2 @licstart The following is the entire license notice for the
3 JavaScript code in this page.
3 JavaScript code in this page.
4
4
5
5
6 Copyright (C) 2013 neko259
6 Copyright (C) 2013 neko259
7
7
8 The JavaScript code in this page is free software: you can
8 The JavaScript code in this page is free software: you can
9 redistribute it and/or modify it under the terms of the GNU
9 redistribute it and/or modify it under the terms of the GNU
10 General Public License (GNU GPL) as published by the Free Software
10 General Public License (GNU GPL) as published by the Free Software
11 Foundation, either version 3 of the License, or (at your option)
11 Foundation, either version 3 of the License, or (at your option)
12 any later version. The code is distributed WITHOUT ANY WARRANTY;
12 any later version. The code is distributed WITHOUT ANY WARRANTY;
13 without even the implied warranty of MERCHANTABILITY or FITNESS
13 without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
14 FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
15
15
16 As additional permission under GNU GPL version 3 section 7, you
16 As additional permission under GNU GPL version 3 section 7, you
17 may distribute non-source (e.g., minimized or compacted) forms of
17 may distribute non-source (e.g., minimized or compacted) forms of
18 that code without the copy of the GNU GPL normally required by
18 that code without the copy of the GNU GPL normally required by
19 section 4, provided you include this license notice and a URL
19 section 4, provided you include this license notice and a URL
20 through which recipients can access the Corresponding Source.
20 through which recipients can access the Corresponding Source.
21
21
22 @licend The above is the entire license notice
22 @licend The above is the entire license notice
23 for the JavaScript code in this page.
23 for the JavaScript code in this page.
24 */
24 */
25
25
26 var IMAGE_POPUP_MARGIN = 10;
26 var IMAGE_POPUP_MARGIN = 10;
27
27
28
28
29 var IMAGE_VIEWERS = [
29 var IMAGE_VIEWERS = [
30 ['simple', new SimpleImageViewer()],
30 ['simple', new SimpleImageViewer()],
31 ['popup', new PopupImageViewer()]
31 ['popup', new PopupImageViewer()]
32 ];
32 ];
33
33
34 var FULL_IMG_CLASS = 'post-image-full';
34 var FULL_IMG_CLASS = 'post-image-full';
35
35
36 var ATTR_SCALE = 'scale';
36 var ATTR_SCALE = 'scale';
37
37
38
38
39 // Init image viewer
39 // Init image viewer
40 var viewerName = $('body').attr('data-image-viewer');
40 var viewerName = $('body').attr('data-image-viewer');
41 var viewer = ImageViewer();
41 var viewer = ImageViewer();
42 for (var i = 0; i < IMAGE_VIEWERS.length; i++) {
42 for (var i = 0; i < IMAGE_VIEWERS.length; i++) {
43 var item = IMAGE_VIEWERS[i];
43 var item = IMAGE_VIEWERS[i];
44 if (item[0] === viewerName) {
44 if (item[0] === viewerName) {
45 viewer = item[1];
45 viewer = item[1];
46 break;
46 break;
47 }
47 }
48 }
48 }
49
49
50
50
51 function getFullImageWidth(previewImage) {
51 function getFullImageWidth(previewImage) {
52 var full_img_w = previewImage.attr('data-width');
52 var full_img_w = previewImage.attr('data-width');
53 if (full_img_w == null) {
53 if (full_img_w == null) {
54 full_img_w = previewImage[0].naturalWidth;
54 full_img_w = previewImage[0].naturalWidth;
55 }
55 }
56
56
57 return full_img_w;
57 return full_img_w;
58 }
58 }
59
59
60 function getFullImageHeight(previewImage) {
60 function getFullImageHeight(previewImage) {
61 var full_img_h = previewImage.attr('data-height');
61 var full_img_h = previewImage.attr('data-height');
62 if (full_img_h == null) {
62 if (full_img_h == null) {
63 full_img_h = previewImage[0].naturalHeight;
63 full_img_h = previewImage[0].naturalHeight;
64 }
64 }
65
65
66 return full_img_h;
66 return full_img_h;
67 }
67 }
68
68
69
69
70 function ImageViewer() {}
70 function ImageViewer() {}
71 ImageViewer.prototype.view = function (post) {};
71 ImageViewer.prototype.view = function (post) {};
72
72
73 function SimpleImageViewer() {}
73 function SimpleImageViewer() {}
74 SimpleImageViewer.prototype.view = function (post) {
74 SimpleImageViewer.prototype.view = function (post) {
75 var images = post.find('img');
75 var images = post.find('img');
76 images.toggle();
76 images.toggle();
77
77
78 // When we first enlarge an image, a full image needs to be created
78 // When we first enlarge an image, a full image needs to be created
79 if (images.length == 1) {
79 if (images.length == 1) {
80 var thumb = images.first();
80 var thumb = images.first();
81
81
82 var width = getFullImageWidth(thumb);
82 var width = getFullImageWidth(thumb);
83 var height = getFullImageHeight(thumb);
83 var height = getFullImageHeight(thumb);
84
84
85 if (width == null || height == null) {
85 if (width == null || height == null) {
86 width = '100%';
86 width = '100%';
87 height = '100%';
87 height = '100%';
88 }
88 }
89
89
90 var parent = images.first().parent();
90 var parent = images.first().parent();
91 var link = parent.attr('href');
91 var link = parent.attr('href');
92
92
93 var fullImg = $('<img />')
93 var fullImg = $('<img />')
94 .addClass(FULL_IMG_CLASS)
94 .addClass(FULL_IMG_CLASS)
95 .attr('src', link)
95 .attr('src', link)
96 .attr('width', width)
96 .attr('width', width)
97 .attr('height', height);
97 .attr('height', height);
98
98
99 parent.append(fullImg);
99 parent.append(fullImg);
100 }
100 }
101 };
101 };
102
102
103 function PopupImageViewer() {}
103 function PopupImageViewer() {}
104 PopupImageViewer.prototype.view = function (post) {
104 PopupImageViewer.prototype.view = function (post) {
105 var el = post;
105 var el = post;
106 var thumb_id = 'full' + el.find('img').attr('alt');
106 var thumb_id = 'full' + el.find('img').attr('alt');
107
107
108 var existingPopups = $('#' + thumb_id);
108 var existingPopups = $('#' + thumb_id);
109 if (!existingPopups.length) {
109 if (!existingPopups.length) {
110 var imgElement = el.find('img');
110 var imgElement = el.find('img');
111
111
112 var full_img_w = getFullImageWidth(imgElement);
112 var full_img_w = getFullImageWidth(imgElement);
113 var full_img_h = getFullImageHeight(imgElement);
113 var full_img_h = getFullImageHeight(imgElement);
114
114
115 var win = $(window);
115 var win = $(window);
116
116
117 var win_w = win.width();
117 var win_w = win.width();
118 var win_h = win.height();
118 var win_h = win.height();
119
119
120 // New image size
120 // New image size
121 var w_scale = 1;
121 var w_scale = 1;
122 var h_scale = 1;
122 var h_scale = 1;
123
123
124 var freeWidth = win_w - 2 * IMAGE_POPUP_MARGIN;
124 var freeWidth = win_w - 2 * IMAGE_POPUP_MARGIN;
125 var freeHeight = win_h - 2 * IMAGE_POPUP_MARGIN;
125 var freeHeight = win_h - 2 * IMAGE_POPUP_MARGIN;
126
126
127 if (full_img_w > freeWidth) {
127 if (full_img_w > freeWidth) {
128 w_scale = full_img_w / freeWidth;
128 w_scale = full_img_w / freeWidth;
129 }
129 }
130 if (full_img_h > freeHeight) {
130 if (full_img_h > freeHeight) {
131 h_scale = full_img_h / freeHeight;
131 h_scale = full_img_h / freeHeight;
132 }
132 }
133
133
134 var scale = Math.max(w_scale, h_scale)
134 var scale = Math.max(w_scale, h_scale)
135 var img_w = full_img_w / scale;
135 var img_w = full_img_w / scale;
136 var img_h = full_img_h / scale;
136 var img_h = full_img_h / scale;
137
137
138 var postNode = $(el);
138 var postNode = $(el);
139
139
140 var img_pv = new Image();
140 var img_pv = new Image();
141 var newImage = $(img_pv);
141 var newImage = $(img_pv);
142 newImage.addClass('img-full')
142 newImage.addClass('img-full')
143 .attr('id', thumb_id)
143 .attr('id', thumb_id)
144 .attr('src', postNode.attr('href'))
144 .attr('src', postNode.attr('href'))
145 .attr(ATTR_SCALE, scale)
145 .attr(ATTR_SCALE, scale)
146 .css({
146 .css({
147 'width': img_w,
147 'width': img_w,
148 'height': img_h,
148 'height': img_h,
149 'left': (win_w - img_w) / 2,
149 'left': (win_w - img_w) / 2,
150 'top': ((win_h - img_h) / 2),
150 'top': ((win_h - img_h) / 2),
151 'position': 'fixed' // Chrome fix because it adds a 'relative' value to the image somehow
151 'position': 'fixed' // Chrome fix because it adds a 'relative' value to the image somehow
152 })
152 })
153 //scaling preview
153 //scaling preview
154 .mousewheel(function(event, delta) {
154 .mousewheel(function(event, delta) {
155 var cx = event.originalEvent.clientX;
155 var cx = event.originalEvent.clientX;
156 var cy = event.originalEvent.clientY;
156 var cy = event.originalEvent.clientY;
157
157
158 var scale = newImage.attr(ATTR_SCALE) / (delta > 0 ? 1.25 : 0.8);
158 var scale = newImage.attr(ATTR_SCALE) / (delta > 0 ? 1.25 : 0.8);
159
159
160 var oldWidth = newImage.width();
160 var oldWidth = newImage.width();
161 var oldHeight = newImage.height();
161 var oldHeight = newImage.height();
162
162
163 var newIW = full_img_w / scale;
163 var newIW = full_img_w / scale;
164 var newIH = full_img_h / scale;
164 var newIH = full_img_h / scale;
165
165
166 newImage.width(newIW);
166 newImage.width(newIW);
167 newImage.height(newIH);
167 newImage.height(newIH);
168 newImage.attr(ATTR_SCALE, scale);
168 newImage.attr(ATTR_SCALE, scale);
169
169
170 // Set position
170 // Set position
171 var oldPosition = newImage.position();
171 var oldPosition = newImage.position();
172 newImage.css({
172 newImage.css({
173 left: parseInt(cx - (newIW/oldWidth) * (cx - parseInt(oldPosition.left, 10)), 10),
173 left: parseInt(cx - (newIW/oldWidth) * (cx - parseInt(oldPosition.left, 10)), 10),
174 top: parseInt(cy - (newIH/oldHeight) * (cy - parseInt(oldPosition.top, 10)), 10)
174 top: parseInt(cy - (newIH/oldHeight) * (cy - parseInt(oldPosition.top, 10)), 10)
175 });
175 });
176
176
177 return false;
177 return false;
178 })
178 })
179 .draggable({
179 .draggable({
180 addClasses: false,
180 addClasses: false,
181 stack: '.img-full'
181 stack: '.img-full'
182 })
182 })
183 .appendTo($('body'));
183 .appendTo($('body'));
184 newImage.click(function() {
184 newImage.click(function() {
185 $(this).remove();
185 $(this).remove();
186 });
186 });
187 if (post.parent().parent().hasClass('monochrome')) {
188 newImage.addClass('monochrome');
189 }
187 } else {
190 } else {
188 existingPopups.remove();
191 existingPopups.remove();
189 }
192 }
190 };
193 };
191
194
192 function addImgPreview() {
195 function addImgPreview() {
193 //keybind
196 //keybind
194 $(document).on('keyup.removepic', function(e) {
197 $(document).on('keyup.removepic', function(e) {
195 if(e.which === 27) {
198 if(e.which === 27) {
196 $('.img-full').remove();
199 $('.img-full').remove();
197 }
200 }
198 });
201 });
199
202
200 $('body').on('click', '.thumb', function() {
203 $('body').on('click', '.thumb', function() {
201 viewer.view($(this));
204 viewer.view($(this));
202
205
203 return false;
206 return false;
204 });
207 });
205 }
208 }
General Comments 0
You need to be logged in to leave comments. Login now