Lines 40-73
Link Here
|
40 |
import gettext |
40 |
import gettext |
41 |
gettext.install('pdfshuffler', unicode=1) |
41 |
gettext.install('pdfshuffler', unicode=1) |
42 |
|
42 |
|
43 |
try: |
43 |
import gi |
44 |
import pygtk |
44 |
gi.require_version('Gtk', '3.0') |
45 |
pygtk.require('2.0') |
45 |
from gi.repository import Gtk, Gdk, GObject, Pango, Gio, GdkPixbuf, Poppler |
46 |
import gtk |
46 |
import cairo |
47 |
assert gtk.gtk_version >= (2, 10, 0) |
47 |
|
48 |
assert gtk.pygtk_version >= (2, 10, 0) |
48 |
Gdk.threads_init() |
49 |
except AssertionError: |
49 |
import array |
50 |
print('You do not have the required versions of GTK+ and/or PyGTK ' + |
|
|
51 |
'installed.\n\n' + |
52 |
'Installed GTK+ version is ' + |
53 |
'.'.join([str(n) for n in gtk.gtk_version]) + '\n' + |
54 |
'Required GTK+ version is 2.10.0 or higher\n\n' |
55 |
'Installed PyGTK version is ' + |
56 |
'.'.join([str(n) for n in gtk.pygtk_version]) + '\n' + |
57 |
'Required PyGTK version is 2.10.0 or higher') |
58 |
sys.exit(1) |
59 |
except: |
60 |
print('PyGTK version 2.10.0 or higher is required to run this program.') |
61 |
print('No version of PyGTK was found on your system.') |
62 |
sys.exit(1) |
63 |
|
64 |
gtk.gdk.threads_init() |
65 |
import gobject #to use custom signals |
66 |
import pango #to adjust the text alignment in CellRendererText |
67 |
import gio #to inquire mime types information |
68 |
import cairo, array |
69 |
|
50 |
|
70 |
import poppler #for the rendering of pdf pages |
|
|
71 |
from pyPdf import PdfFileWriter, PdfFileReader |
51 |
from pyPdf import PdfFileWriter, PdfFileReader |
72 |
|
52 |
|
73 |
class PDFshuffler: |
53 |
class PDFshuffler: |
Lines 75-82
Link Here
|
75 |
# All the preferences are stored here. |
55 |
# All the preferences are stored here. |
76 |
# ======================================================= |
56 |
# ======================================================= |
77 |
prefs = { |
57 |
prefs = { |
78 |
'window width': min (700, gtk.gdk.screen_get_default().get_width() / 2 ), |
58 |
'window width': min (700, Gdk.Screen.get_default().get_width() / 2 ), |
79 |
'window height': min(600, gtk.gdk.screen_get_default().get_height() - 50 ), |
59 |
'window height': min(600, Gdk.Screen.get_default().get_height() - 50 ), |
80 |
'window x': 0, |
60 |
'window x': 0, |
81 |
'window y': 0, |
61 |
'window y': 0, |
82 |
'initial thumbnail size': 530, |
62 |
'initial thumbnail size': 530, |
Lines 87-97
Link Here
|
87 |
MODEL_ROW_EXTERN = 1002 |
67 |
MODEL_ROW_EXTERN = 1002 |
88 |
TEXT_URI_LIST = 1003 |
68 |
TEXT_URI_LIST = 1003 |
89 |
MODEL_ROW_MOTION = 1004 |
69 |
MODEL_ROW_MOTION = 1004 |
90 |
TARGETS_IV = [('MODEL_ROW_INTERN', gtk.TARGET_SAME_WIDGET, MODEL_ROW_INTERN), |
70 |
TARGETS_IV = [Gtk.TargetEntry.new('MODEL_ROW_INTERN', Gtk.TargetFlags.SAME_WIDGET, MODEL_ROW_INTERN), |
91 |
('MODEL_ROW_EXTERN', gtk.TARGET_OTHER_APP, MODEL_ROW_EXTERN), |
71 |
Gtk.TargetEntry.new('MODEL_ROW_EXTERN', Gtk.TargetFlags.OTHER_APP, MODEL_ROW_EXTERN), |
92 |
('MODEL_ROW_MOTION', 0, MODEL_ROW_MOTION)] |
72 |
Gtk.TargetEntry.new('MODEL_ROW_MOTION', 0, MODEL_ROW_MOTION)] |
93 |
TARGETS_SW = [('text/uri-list', 0, TEXT_URI_LIST), |
73 |
TARGETS_SW = [Gtk.TargetEntry.new('text/uri-list', 0, TEXT_URI_LIST), |
94 |
('MODEL_ROW_EXTERN', gtk.TARGET_OTHER_APP, MODEL_ROW_EXTERN)] |
74 |
Gtk.TargetEntry.new('MODEL_ROW_EXTERN', Gtk.TargetFlags.OTHER_APP, MODEL_ROW_EXTERN)] |
95 |
|
75 |
|
96 |
def __init__(self): |
76 |
def __init__(self): |
97 |
# Create the temporary directory |
77 |
# Create the temporary directory |
Lines 100-112
Link Here
|
100 |
|
80 |
|
101 |
pixmap = os.path.join(sys.prefix,'share','pixmaps','pdfshuffler.png') |
81 |
pixmap = os.path.join(sys.prefix,'share','pixmaps','pdfshuffler.png') |
102 |
try: |
82 |
try: |
103 |
gtk.window_set_default_icon_from_file(pixmap) |
83 |
Gtk.Window.set_default_icon_from_file(pixmap) |
104 |
except: |
84 |
except: |
105 |
print(_('File %s does not exist') % pixmap) |
85 |
print(_('File %s does not exist') % pixmap) |
106 |
|
86 |
|
107 |
# Create the main window, and attach delete_event signal to terminating |
87 |
# Create the main window, and attach delete_event signal to terminating |
108 |
# the application |
88 |
# the application |
109 |
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) |
89 |
self.window = Gtk.Window.new(Gtk.WindowType.TOPLEVEL) |
110 |
self.window.set_title('PDF-Shuffler') |
90 |
self.window.set_title('PDF-Shuffler') |
111 |
self.window.set_border_width(0) |
91 |
self.window.set_border_width(0) |
112 |
self.window.move(self.prefs['window x'], self.prefs['window y']) |
92 |
self.window.move(self.prefs['window x'], self.prefs['window y']) |
Lines 116-146
Link Here
|
116 |
self.window.show() |
96 |
self.window.show() |
117 |
|
97 |
|
118 |
# Create a vbox to hold the thumnails-container |
98 |
# Create a vbox to hold the thumnails-container |
119 |
vbox = gtk.VBox() |
99 |
vbox = Gtk.Grid() |
|
|
100 |
vbox.set_orientation(Gtk.Orientation.VERTICAL) |
120 |
self.window.add(vbox) |
101 |
self.window.add(vbox) |
121 |
|
102 |
|
122 |
# Create a scrolled window to hold the thumbnails-container |
103 |
# Create a scrolled window to hold the thumbnails-container |
123 |
self.sw = gtk.ScrolledWindow() |
104 |
self.sw = Gtk.ScrolledWindow() |
124 |
self.sw.set_border_width(0) |
105 |
self.sw.set_border_width(0) |
125 |
self.sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) |
106 |
self.sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) |
126 |
self.sw.drag_dest_set(gtk.DEST_DEFAULT_MOTION | |
107 |
self.sw.drag_dest_set(Gtk.DestDefaults.MOTION | |
127 |
gtk.DEST_DEFAULT_HIGHLIGHT | |
108 |
Gtk.DestDefaults.HIGHLIGHT | |
128 |
gtk.DEST_DEFAULT_DROP | |
109 |
Gtk.DestDefaults.DROP | |
129 |
gtk.DEST_DEFAULT_MOTION, |
110 |
Gtk.DestDefaults.MOTION, |
130 |
self.TARGETS_SW, |
111 |
self.TARGETS_SW, |
131 |
gtk.gdk.ACTION_COPY | |
112 |
Gdk.DragAction.COPY | |
132 |
gtk.gdk.ACTION_MOVE ) |
113 |
Gdk.DragAction.MOVE ) |
133 |
self.sw.connect('drag_data_received', self.sw_dnd_received_data) |
114 |
self.sw.connect('drag_data_received', self.sw_dnd_received_data) |
134 |
self.sw.connect('button_press_event', self.sw_button_press_event) |
115 |
self.sw.connect('button_press_event', self.sw_button_press_event) |
135 |
vbox.pack_start(self.sw) |
116 |
vbox.add(self.sw) |
136 |
|
117 |
|
137 |
# Create an alignment to keep the thumbnails center-aligned |
118 |
# Create an alignment to keep the thumbnails center-aligned |
138 |
align = gtk.Alignment(0.5, 0.5, 0, 0) |
119 |
align = Gtk.Alignment.new(0.5, 0.5, 0, 0) |
139 |
self.sw.add_with_viewport(align) |
120 |
self.sw.add_with_viewport(align) |
140 |
|
121 |
|
141 |
# Create ListStore model and IconView |
122 |
# Create ListStore model and IconView |
142 |
self.model = gtk.ListStore(str, # 0.Text descriptor |
123 |
self.model = Gtk.ListStore(str, # 0.Text descriptor |
143 |
gtk.gdk.Pixbuf, # 1.Thumbnail image |
124 |
GdkPixbuf.Pixbuf, # 1.Thumbnail image |
144 |
int, # 2.Document number |
125 |
int, # 2.Document number |
145 |
int, # 3.Page number |
126 |
int, # 3.Page number |
146 |
int, # 4.Thumbnail width |
127 |
int, # 4.Thumbnail width |
Lines 155-184
Link Here
|
155 |
self.zoom_scale = self.prefs['initial zoom scale'] |
136 |
self.zoom_scale = self.prefs['initial zoom scale'] |
156 |
self.iv_col_width = self.prefs['initial thumbnail size'] |
137 |
self.iv_col_width = self.prefs['initial thumbnail size'] |
157 |
|
138 |
|
158 |
self.iconview = gtk.IconView(self.model) |
139 |
self.iconview = Gtk.IconView(model=self.model) |
|
|
140 |
self.iconview.set_hexpand(True) |
141 |
self.iconview.set_vexpand(True) |
159 |
self.iconview.set_item_width(self.iv_col_width + 12) |
142 |
self.iconview.set_item_width(self.iv_col_width + 12) |
160 |
|
143 |
|
161 |
self.iconview.set_pixbuf_column(1) |
144 |
self.iconview.set_pixbuf_column(1) |
162 |
# self.cellpb = gtk.CellRendererPixbuf() |
145 |
# self.cellpb = Gtk.CellRendererPixbuf() |
163 |
# self.cellpb.set_property('follow-state', True) |
146 |
# self.cellpb.set_property('follow-state', True) |
164 |
# self.iconview.pack_start(self.cellpb, False) |
147 |
# self.iconview.pack_start(self.cellpb, False) |
165 |
# self.iconview.set_attributes(self.cellpb, pixbuf=1) |
148 |
# self.iconview.set_attributes(self.cellpb, pixbuf=1) |
166 |
|
149 |
|
167 |
# self.iconview.set_text_column(0) |
150 |
self.iconview.set_text_column(0) |
168 |
self.celltxt = gtk.CellRendererText() |
151 |
self.celltxt = Gtk.CellRendererText() |
169 |
self.celltxt.set_property('width', self.iv_col_width) |
152 |
self.celltxt.set_property('width', self.iv_col_width) |
170 |
self.celltxt.set_property('wrap-width', self.iv_col_width) |
153 |
self.celltxt.set_property('wrap-width', self.iv_col_width) |
171 |
self.celltxt.set_property('alignment', pango.ALIGN_CENTER) |
154 |
self.celltxt.set_property('alignment', Pango.Alignment.CENTER) |
172 |
self.iconview.pack_start(self.celltxt, False) |
155 |
self.iconview.pack_start(self.celltxt, False) |
173 |
self.iconview.set_attributes(self.celltxt, text=0) |
156 |
#self.iconview.set_attributes(self.celltxt, text=0) |
174 |
|
157 |
|
175 |
self.iconview.set_selection_mode(gtk.SELECTION_MULTIPLE) |
158 |
self.iconview.set_selection_mode(Gtk.SelectionMode.MULTIPLE) |
176 |
self.iconview.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, |
159 |
self.iconview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, |
177 |
self.TARGETS_IV, |
160 |
self.TARGETS_IV, |
178 |
gtk.gdk.ACTION_COPY | |
161 |
Gdk.DragAction.COPY | |
179 |
gtk.gdk.ACTION_MOVE ) |
162 |
Gdk.DragAction.MOVE ) |
180 |
self.iconview.enable_model_drag_dest(self.TARGETS_IV, |
163 |
self.iconview.enable_model_drag_dest(self.TARGETS_IV, |
181 |
gtk.gdk.ACTION_DEFAULT) |
164 |
Gdk.DragAction.DEFAULT) |
182 |
self.iconview.connect('drag_begin', self.iv_drag_begin) |
165 |
self.iconview.connect('drag_begin', self.iv_drag_begin) |
183 |
self.iconview.connect('drag_data_get', self.iv_dnd_get_data) |
166 |
self.iconview.connect('drag_data_get', self.iv_dnd_get_data) |
184 |
self.iconview.connect('drag_data_received', self.iv_dnd_received_data) |
167 |
self.iconview.connect('drag_data_received', self.iv_dnd_received_data) |
Lines 191-238
Link Here
|
191 |
|
174 |
|
192 |
style = self.iconview.get_style().copy() |
175 |
style = self.iconview.get_style().copy() |
193 |
style_sw = self.sw.get_style() |
176 |
style_sw = self.sw.get_style() |
194 |
for state in (gtk.STATE_NORMAL, gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE): |
177 |
for state in (Gtk.StateType.NORMAL, Gtk.StateType.PRELIGHT, Gtk.StateType.ACTIVE): |
195 |
style.base[state] = style_sw.bg[gtk.STATE_NORMAL] |
178 |
style.base[state] = style_sw.bg[Gtk.StateType.NORMAL] |
196 |
self.iconview.set_style(style) |
179 |
self.iconview.set_style(style) |
197 |
|
180 |
|
198 |
align.add(self.iconview) |
181 |
align.add(self.iconview) |
199 |
|
182 |
|
200 |
# Create a horizontal box to hold the buttons |
183 |
# Create a horizontal box to hold the buttons |
201 |
hbox = gtk.HBox() |
184 |
hbox = Gtk.Grid() |
202 |
vbox.pack_start(hbox, expand=False, fill=False) |
185 |
hbox.set_column_homogeneous(True) |
|
|
186 |
vbox.add(hbox) |
203 |
|
187 |
|
204 |
# Create buttons |
188 |
# Create buttons |
205 |
self.button_exit = gtk.Button(stock=gtk.STOCK_QUIT) |
189 |
self.button_exit = Gtk.Button(stock=Gtk.STOCK_QUIT) |
|
|
190 |
self.button_exit.set_halign(Gtk.Align.CENTER) |
206 |
self.button_exit.connect('clicked', self.close_application) |
191 |
self.button_exit.connect('clicked', self.close_application) |
207 |
hbox.pack_start(self.button_exit, expand=True, fill=False, padding=20) |
192 |
hbox.add(self.button_exit) |
208 |
|
193 |
|
209 |
self.button_del = gtk.Button(_('Delete Page(s)')) |
194 |
self.button_del = Gtk.Button(_('Delete Page(s)')) |
210 |
image = gtk.Image() |
195 |
self.button_del.set_halign(Gtk.Align.CENTER) |
211 |
image.set_from_stock(gtk.STOCK_DELETE, gtk.ICON_SIZE_BUTTON) |
196 |
image = Gtk.Image() |
|
|
197 |
image.set_from_stock(Gtk.STOCK_DELETE, Gtk.IconSize.BUTTON) |
212 |
self.button_del.set_image(image) |
198 |
self.button_del.set_image(image) |
213 |
self.button_del.connect('clicked', self.clear_selected) |
199 |
self.button_del.connect('clicked', self.clear_selected) |
214 |
hbox.pack_start(self.button_del, expand=True, fill=False, padding=20) |
200 |
hbox.add(self.button_del) |
215 |
|
201 |
|
216 |
self.button_import = gtk.Button(_('Import pdf')) |
202 |
self.button_import = Gtk.Button(_('Import pdf')) |
217 |
image = gtk.Image() |
203 |
self.button_import.set_halign(Gtk.Align.CENTER) |
218 |
image.set_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON) |
204 |
image = Gtk.Image() |
|
|
205 |
image.set_from_stock(Gtk.STOCK_OPEN, Gtk.IconSize.BUTTON) |
219 |
self.button_import.set_image(image) |
206 |
self.button_import.set_image(image) |
220 |
self.button_import.connect('clicked', self.on_action_add_doc_activate) |
207 |
self.button_import.connect('clicked', self.on_action_add_doc_activate) |
221 |
hbox.pack_start(self.button_import, expand=True, fill=False, padding=20) |
208 |
hbox.add(self.button_import) |
222 |
|
209 |
|
223 |
self.button_export = gtk.Button(_('Export pdf')) |
210 |
self.button_export = Gtk.Button(_('Export pdf')) |
224 |
image = gtk.Image() |
211 |
self.button_export.set_halign(Gtk.Align.CENTER) |
225 |
image.set_from_stock(gtk.STOCK_SAVE_AS, gtk.ICON_SIZE_BUTTON) |
212 |
image = Gtk.Image() |
|
|
213 |
image.set_from_stock(Gtk.STOCK_SAVE_AS, Gtk.IconSize.BUTTON) |
226 |
self.button_export.set_image(image) |
214 |
self.button_export.set_image(image) |
227 |
self.button_export.connect('clicked', self.choose_export_pdf_name) |
215 |
self.button_export.connect('clicked', self.choose_export_pdf_name) |
228 |
hbox.pack_start(self.button_export, expand=True, fill=False, padding=20) |
216 |
hbox.add(self.button_export) |
229 |
|
217 |
|
230 |
self.button_export = gtk.Button(_('About')) |
218 |
self.button_export = Gtk.Button(_('About')) |
231 |
image = gtk.Image() |
219 |
self.button_export.set_halign(Gtk.Align.CENTER) |
232 |
image.set_from_stock(gtk.STOCK_ABOUT, gtk.ICON_SIZE_BUTTON) |
220 |
image = Gtk.Image() |
|
|
221 |
image.set_from_stock(Gtk.STOCK_ABOUT, Gtk.IconSize.BUTTON) |
233 |
self.button_export.set_image(image) |
222 |
self.button_export.set_image(image) |
234 |
self.button_export.connect('clicked', self.about_dialog) |
223 |
self.button_export.connect('clicked', self.about_dialog) |
235 |
hbox.pack_start(self.button_export, expand=True, fill=False, padding=20) |
224 |
hbox.add(self.button_export) |
236 |
|
225 |
|
237 |
# Define window callback function and show window |
226 |
# Define window callback function and show window |
238 |
self.window.connect('size_allocate', self.on_window_size_request) # resize |
227 |
self.window.connect('size_allocate', self.on_window_size_request) # resize |
Lines 240-250
Link Here
|
240 |
self.window.show_all() |
229 |
self.window.show_all() |
241 |
|
230 |
|
242 |
#Creating the popup menu |
231 |
#Creating the popup menu |
243 |
self.popup = gtk.Menu() |
232 |
self.popup = Gtk.Menu() |
244 |
popup_rotate_right = gtk.MenuItem(_('Rotate Page(s) Clockwise')) |
233 |
popup_rotate_right = Gtk.MenuItem(_('Rotate Page(s) Clockwise')) |
245 |
popup_rotate_left = gtk.MenuItem(_('Rotate Page(s) Counterclockwise')) |
234 |
popup_rotate_left = Gtk.MenuItem(_('Rotate Page(s) Counterclockwise')) |
246 |
popup_crop = gtk.MenuItem(_('Crop Page(s)')) |
235 |
popup_crop = Gtk.MenuItem(_('Crop Page(s)')) |
247 |
popup_delete = gtk.MenuItem(_('Delete Page(s)')) |
236 |
popup_delete = Gtk.MenuItem(_('Delete Page(s)')) |
248 |
popup_rotate_right.connect('activate', self.rotate_page_right) |
237 |
popup_rotate_right.connect('activate', self.rotate_page_right) |
249 |
popup_rotate_left.connect('activate', self.rotate_page_left) |
238 |
popup_rotate_left.connect('activate', self.rotate_page_left) |
250 |
popup_crop.connect('activate', self.crop_page_dialog) |
239 |
popup_crop.connect('activate', self.crop_page_dialog) |
Lines 265-288
Link Here
|
265 |
self.iv_auto_scroll_timer = None |
254 |
self.iv_auto_scroll_timer = None |
266 |
self.pdfqueue = [] |
255 |
self.pdfqueue = [] |
267 |
|
256 |
|
268 |
gobject.type_register(PDF_Renderer) |
257 |
GObject.type_register(PDF_Renderer) |
269 |
gobject.signal_new('reset_iv_width', PDF_Renderer, |
258 |
GObject.signal_new('reset_iv_width', PDF_Renderer, |
270 |
gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()) |
259 |
GObject.SignalFlags.RUN_FIRST, None, ()) |
271 |
self.rendering_thread = PDF_Renderer(self.model, self.pdfqueue, |
260 |
self.rendering_thread = PDF_Renderer(self.model, self.pdfqueue, |
272 |
self.zoom_scale, self.iv_col_width) |
261 |
self.zoom_scale, self.iv_col_width) |
273 |
self.rendering_thread.connect('reset_iv_width', self.reset_iv_width) |
262 |
self.rendering_thread.connect('reset_iv_width', self.reset_iv_width) |
274 |
self.rendering_thread.start() |
|
|
275 |
|
263 |
|
276 |
# Importing documents passed as command line arguments |
264 |
# Importing documents passed as command line arguments |
277 |
for filename in sys.argv[1:]: |
265 |
for filename in sys.argv[1:]: |
278 |
self.add_pdf_pages(filename) |
266 |
self.add_pdf_pages(filename) |
|
|
267 |
#GObject.idle_add(self.rendering_thread.run) |
279 |
|
268 |
|
280 |
# ======================================================= |
269 |
# ======================================================= |
281 |
def render(self): |
270 |
def render(self): |
282 |
if self.rendering_thread.paused: |
271 |
# if self.rendering_thread.paused: |
283 |
self.rendering_thread.paused = False |
272 |
# self.rendering_thread.paused = False |
284 |
self.rendering_thread.evnt.set() |
273 |
# self.rendering_thread.evnt.set() |
285 |
self.rendering_thread.evnt.clear() |
274 |
# self.rendering_thread.evnt.clear() |
|
|
275 |
GObject.idle_add(self.rendering_thread.run) |
286 |
|
276 |
|
287 |
# ======================================================= |
277 |
# ======================================================= |
288 |
def on_window_size_request(self, window, event): |
278 |
def on_window_size_request(self, window, event): |
Lines 309-332
Link Here
|
309 |
def on_keypress_event(self, widget, event): |
299 |
def on_keypress_event(self, widget, event): |
310 |
"""Keypress events in Main Window""" |
300 |
"""Keypress events in Main Window""" |
311 |
|
301 |
|
312 |
#keyname = gtk.gdk.keyval_name(event.keyval) |
302 |
#keyname = Gdk.keyval_name(event.keyval) |
313 |
if event.keyval == 65535: # Delete keystroke |
303 |
if event.keyval == Gdk.KEY_Delete: # Delete keystroke |
314 |
self.clear_selected() |
304 |
self.clear_selected() |
315 |
|
305 |
|
316 |
# ======================================================= |
306 |
# ======================================================= |
317 |
def close_application(self, widget, event=None, data=None): |
307 |
def close_application(self, widget, event=None, data=None): |
318 |
"""Termination""" |
308 |
"""Termination""" |
319 |
|
309 |
|
320 |
#gtk.gdk.threads_leave() |
310 |
#Gdk.threads_leave() |
321 |
self.rendering_thread.quit = True |
311 |
self.rendering_thread.quit = True |
322 |
#gtk.gdk.threads_enter() |
312 |
#Gdk.threads_enter() |
323 |
if self.rendering_thread.paused == True: |
313 |
#if self.rendering_thread.paused == True: |
324 |
self.rendering_thread.evnt.set() |
314 |
# self.rendering_thread.evnt.set() |
325 |
self.rendering_thread.evnt.clear() |
315 |
# self.rendering_thread.evnt.clear() |
326 |
if os.path.isdir(self.tmp_dir): |
316 |
if os.path.isdir(self.tmp_dir): |
327 |
shutil.rmtree(self.tmp_dir) |
317 |
shutil.rmtree(self.tmp_dir) |
328 |
if gtk.main_level(): |
318 |
if Gtk.main_level(): |
329 |
gtk.main_quit() |
319 |
Gtk.main_quit() |
330 |
else: |
320 |
else: |
331 |
sys.exit(0) |
321 |
sys.exit(0) |
332 |
return False |
322 |
return False |
Lines 367-373
Link Here
|
367 |
for npage in range(n_start, n_end + 1): |
357 |
for npage in range(n_start, n_end + 1): |
368 |
descriptor = ''.join([pdfdoc.shortname, '\n', _('page'), ' ', str(npage)]) |
358 |
descriptor = ''.join([pdfdoc.shortname, '\n', _('page'), ' ', str(npage)]) |
369 |
width = self.iv_col_width |
359 |
width = self.iv_col_width |
370 |
thumbnail = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, |
360 |
thumbnail = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, False, |
371 |
8, width, width) |
361 |
8, width, width) |
372 |
self.model.append((descriptor, # 0 |
362 |
self.model.append((descriptor, # 0 |
373 |
thumbnail, # 1 |
363 |
thumbnail, # 1 |
Lines 389-415
Link Here
|
389 |
def choose_export_pdf_name(self, widget=None): |
379 |
def choose_export_pdf_name(self, widget=None): |
390 |
"""Handles choosing a name for exporting """ |
380 |
"""Handles choosing a name for exporting """ |
391 |
|
381 |
|
392 |
chooser = gtk.FileChooserDialog(title=_('Export ...'), |
382 |
chooser = Gtk.FileChooserDialog(title=_('Export ...'), |
393 |
action=gtk.FILE_CHOOSER_ACTION_SAVE, |
383 |
action=Gtk.FileChooserAction.SAVE, |
394 |
buttons=(gtk.STOCK_CANCEL, |
384 |
buttons=(Gtk.STOCK_CANCEL, |
395 |
gtk.RESPONSE_CANCEL, |
385 |
Gtk.ResponseType.CANCEL, |
396 |
gtk.STOCK_SAVE, |
386 |
Gtk.STOCK_SAVE, |
397 |
gtk.RESPONSE_OK)) |
387 |
Gtk.ResponseType.OK)) |
398 |
chooser.set_do_overwrite_confirmation(True) |
388 |
chooser.set_do_overwrite_confirmation(True) |
399 |
chooser.set_current_folder(self.export_directory) |
389 |
chooser.set_current_folder(self.export_directory) |
400 |
filter_pdf = gtk.FileFilter() |
390 |
filter_pdf = Gtk.FileFilter() |
401 |
filter_pdf.set_name(_('PDF files')) |
391 |
filter_pdf.set_name(_('PDF files')) |
402 |
filter_pdf.add_mime_type('application/pdf') |
392 |
filter_pdf.add_mime_type('application/pdf') |
403 |
chooser.add_filter(filter_pdf) |
393 |
chooser.add_filter(filter_pdf) |
404 |
|
394 |
|
405 |
filter_all = gtk.FileFilter() |
395 |
filter_all = Gtk.FileFilter() |
406 |
filter_all.set_name(_('All files')) |
396 |
filter_all.set_name(_('All files')) |
407 |
filter_all.add_pattern('*') |
397 |
filter_all.add_pattern('*') |
408 |
chooser.add_filter(filter_all) |
398 |
chooser.add_filter(filter_all) |
409 |
|
399 |
|
410 |
while True: |
400 |
while True: |
411 |
response = chooser.run() |
401 |
response = chooser.run() |
412 |
if response == gtk.RESPONSE_OK: |
402 |
if response == Gtk.ResponseType.OK: |
413 |
file_out = chooser.get_filename() |
403 |
file_out = chooser.get_filename() |
414 |
(path, shortname) = os.path.split(file_out) |
404 |
(path, shortname) = os.path.split(file_out) |
415 |
(shortname, ext) = os.path.splitext(shortname) |
405 |
(shortname, ext) = os.path.splitext(shortname) |
Lines 419-430
Link Here
|
419 |
self.export_to_file(file_out) |
409 |
self.export_to_file(file_out) |
420 |
self.export_directory = path |
410 |
self.export_directory = path |
421 |
except IOError: |
411 |
except IOError: |
422 |
error_msg_win = gtk.MessageDialog(flags=gtk.DIALOG_MODAL, |
412 |
error_msg_win = Gtk.MessageDialog(flags=Gtk.DialogFlags.MODAL, |
423 |
type=gtk.MESSAGE_ERROR, |
413 |
type=Gtk.MessageType.ERROR, |
424 |
message_format=_("Error writing file: %s") % file_out, |
414 |
message_format=_("Error writing file: %s") % file_out, |
425 |
buttons=gtk.BUTTONS_OK) |
415 |
buttons=Gtk.ButtonsType.OK) |
426 |
response = error_msg_win.run() |
416 |
response = error_msg_win.run() |
427 |
if response == gtk.RESPONSE_OK: |
417 |
if response == Gtk.ResponseType.OK: |
428 |
error_msg_win.destroy() |
418 |
error_msg_win.destroy() |
429 |
continue |
419 |
continue |
430 |
break |
420 |
break |
Lines 491-523
Link Here
|
491 |
def on_action_add_doc_activate(self, widget, data=None): |
481 |
def on_action_add_doc_activate(self, widget, data=None): |
492 |
"""Import doc""" |
482 |
"""Import doc""" |
493 |
|
483 |
|
494 |
chooser = gtk.FileChooserDialog(title=_('Import...'), |
484 |
chooser = Gtk.FileChooserDialog(title=_('Import...'), |
495 |
action=gtk.FILE_CHOOSER_ACTION_OPEN, |
485 |
action=Gtk.FileChooserAction.OPEN, |
496 |
buttons=(gtk.STOCK_CANCEL, |
486 |
buttons=(Gtk.STOCK_CANCEL, |
497 |
gtk.RESPONSE_CANCEL, |
487 |
Gtk.ResponseType.CANCEL, |
498 |
gtk.STOCK_OPEN, |
488 |
Gtk.STOCK_OPEN, |
499 |
gtk.RESPONSE_OK)) |
489 |
Gtk.ResponseType.OK)) |
500 |
chooser.set_current_folder(self.import_directory) |
490 |
chooser.set_current_folder(self.import_directory) |
501 |
chooser.set_select_multiple(True) |
491 |
chooser.set_select_multiple(True) |
502 |
|
492 |
|
503 |
filter_all = gtk.FileFilter() |
493 |
filter_all = Gtk.FileFilter() |
504 |
filter_all.set_name(_('All files')) |
494 |
filter_all.set_name(_('All files')) |
505 |
filter_all.add_pattern('*') |
495 |
filter_all.add_pattern('*') |
506 |
chooser.add_filter(filter_all) |
496 |
chooser.add_filter(filter_all) |
507 |
|
497 |
|
508 |
filter_pdf = gtk.FileFilter() |
498 |
filter_pdf = Gtk.FileFilter() |
509 |
filter_pdf.set_name(_('PDF files')) |
499 |
filter_pdf.set_name(_('PDF files')) |
510 |
filter_pdf.add_mime_type('application/pdf') |
500 |
filter_pdf.add_mime_type('application/pdf') |
511 |
chooser.add_filter(filter_pdf) |
501 |
chooser.add_filter(filter_pdf) |
512 |
chooser.set_filter(filter_pdf) |
502 |
chooser.set_filter(filter_pdf) |
513 |
|
503 |
|
514 |
response = chooser.run() |
504 |
response = chooser.run() |
515 |
if response == gtk.RESPONSE_OK: |
505 |
if response == Gtk.ResponseType.OK: |
516 |
for filename in chooser.get_filenames(): |
506 |
for filename in chooser.get_filenames(): |
517 |
if os.path.isfile(filename): |
507 |
if os.path.isfile(filename): |
518 |
# FIXME |
508 |
# FIXME |
519 |
f = gio.File(filename) |
509 |
f = Gio.File.new_for_path(filename) |
520 |
f_info = f.query_info('standard::content-type') |
510 |
f_info = f.query_info('standard::content-type', 0, None) |
521 |
mime_type = f_info.get_content_type() |
511 |
mime_type = f_info.get_content_type() |
522 |
if mime_type == 'application/pdf': |
512 |
if mime_type == 'application/pdf': |
523 |
self.add_pdf_pages(filename) |
513 |
self.add_pdf_pages(filename) |
Lines 529-535
Link Here
|
529 |
print(_('File type not supported!')) |
519 |
print(_('File type not supported!')) |
530 |
else: |
520 |
else: |
531 |
print(_('File %s does not exist') % filename) |
521 |
print(_('File %s does not exist') % filename) |
532 |
elif response == gtk.RESPONSE_CANCEL: |
522 |
elif response == Gtk.ResponseType.CANCEL: |
533 |
print(_('Closed, no files selected')) |
523 |
print(_('Closed, no files selected')) |
534 |
chooser.destroy() |
524 |
chooser.destroy() |
535 |
|
525 |
|
Lines 559-565
Link Here
|
559 |
|
549 |
|
560 |
if len(iconview.get_selected_items()) > 1: |
550 |
if len(iconview.get_selected_items()) > 1: |
561 |
iconview.stop_emission('drag_begin') |
551 |
iconview.stop_emission('drag_begin') |
562 |
context.set_icon_stock(gtk.STOCK_DND_MULTIPLE, 0, 0) |
552 |
context.set_icon_stock(Gtk.STOCK_DND_MULTIPLE, 0, 0) |
563 |
|
553 |
|
564 |
# ======================================================= |
554 |
# ======================================================= |
565 |
def iv_dnd_get_data(self, iconview, context, |
555 |
def iv_dnd_get_data(self, iconview, context, |
Lines 599-621
Link Here
|
599 |
iter_to = None |
589 |
iter_to = None |
600 |
if drop_info: |
590 |
if drop_info: |
601 |
path, position = drop_info |
591 |
path, position = drop_info |
602 |
ref_to = gtk.TreeRowReference(model,path) |
592 |
ref_to = Gtk.TreeRowReference(model,path) |
603 |
else: |
593 |
else: |
604 |
position = gtk.ICON_VIEW_DROP_RIGHT |
594 |
position = Gtk.ICON_VIEW_DROP_RIGHT |
605 |
if len(model) > 0: #find the iterator of the last row |
595 |
if len(model) > 0: #find the iterator of the last row |
606 |
row = model[-1] |
596 |
row = model[-1] |
607 |
path = row.path |
597 |
path = row.path |
608 |
ref_to = gtk.TreeRowReference(model,path) |
598 |
ref_to = Gtk.TreeRowReference(model,path) |
609 |
if ref_to: |
599 |
if ref_to: |
610 |
before = ( position == gtk.ICON_VIEW_DROP_LEFT |
600 |
before = ( position == Gtk.ICON_VIEW_DROP_LEFT |
611 |
or position == gtk.ICON_VIEW_DROP_ABOVE) |
601 |
or position == Gtk.ICON_VIEW_DROP_ABOVE) |
612 |
#if target_id == self.MODEL_ROW_INTERN: |
602 |
#if target_id == self.MODEL_ROW_INTERN: |
613 |
if selection_data.target == 'MODEL_ROW_INTERN': |
603 |
if selection_data.target == 'MODEL_ROW_INTERN': |
614 |
if before: |
604 |
if before: |
615 |
data.sort(key=int) |
605 |
data.sort(key=int) |
616 |
else: |
606 |
else: |
617 |
data.sort(key=int,reverse=True) |
607 |
data.sort(key=int,reverse=True) |
618 |
ref_from_list = [gtk.TreeRowReference(model,path) |
608 |
ref_from_list = [Gtk.TreeRowReference(model,path) |
619 |
for path in data] |
609 |
for path in data] |
620 |
for ref_from in ref_from_list: |
610 |
for ref_from in ref_from_list: |
621 |
path = ref_to.get_path() |
611 |
path = ref_to.get_path() |
Lines 627-633
Link Here
|
627 |
model.insert_before(iter_to, row) |
617 |
model.insert_before(iter_to, row) |
628 |
else: |
618 |
else: |
629 |
model.insert_after(iter_to, row) |
619 |
model.insert_after(iter_to, row) |
630 |
if context.action == gtk.gdk.ACTION_MOVE: |
620 |
if context.action == Gdk.DragAction.MOVE: |
631 |
for ref_from in ref_from_list: |
621 |
for ref_from in ref_from_list: |
632 |
path = ref_from.get_path() |
622 |
path = ref_from.get_path() |
633 |
iter_from = model.get_iter(path) |
623 |
iter_from = model.get_iter(path) |
Lines 654-660
Link Here
|
654 |
model.move_before(iter_from, iter_to) |
644 |
model.move_before(iter_from, iter_to) |
655 |
else: |
645 |
else: |
656 |
model.move_after(iter_from, iter_to) |
646 |
model.move_after(iter_from, iter_to) |
657 |
if context.action == gtk.gdk.ACTION_MOVE: |
647 |
if context.action == Gdk.DragAction.MOVE: |
658 |
context.finish(True, True, etime) |
648 |
context.finish(True, True, etime) |
659 |
|
649 |
|
660 |
# ======================================================= |
650 |
# ======================================================= |
Lines 663-669
Link Here
|
663 |
|
653 |
|
664 |
model = self.iconview.get_model() |
654 |
model = self.iconview.get_model() |
665 |
selection = self.iconview.get_selected_items() |
655 |
selection = self.iconview.get_selected_items() |
666 |
ref_del_list = [gtk.TreeRowReference(model,path) for path in selection] |
656 |
ref_del_list = [Gtk.TreeRowReference(model,path) for path in selection] |
667 |
for ref_del in ref_del_list: |
657 |
for ref_del in ref_del_list: |
668 |
path = ref_del.get_path() |
658 |
path = ref_del.get_path() |
669 |
iter = model.get_iter(path) |
659 |
iter = model.get_iter(path) |
Lines 678-693
Link Here
|
678 |
sw_height = self.sw.get_allocation().height |
668 |
sw_height = self.sw.get_allocation().height |
679 |
if y -sw_vadj.get_value() < autoscroll_area: |
669 |
if y -sw_vadj.get_value() < autoscroll_area: |
680 |
if not self.iv_auto_scroll_timer: |
670 |
if not self.iv_auto_scroll_timer: |
681 |
self.iv_auto_scroll_direction = gtk.DIR_UP |
671 |
self.iv_auto_scroll_direction = Gtk.DIR_UP |
682 |
self.iv_auto_scroll_timer = gobject.timeout_add(150, |
672 |
self.iv_auto_scroll_timer = GObject.timeout_add(150, |
683 |
self.iv_auto_scroll) |
673 |
self.iv_auto_scroll) |
684 |
elif y -sw_vadj.get_value() > sw_height - autoscroll_area: |
674 |
elif y -sw_vadj.get_value() > sw_height - autoscroll_area: |
685 |
if not self.iv_auto_scroll_timer: |
675 |
if not self.iv_auto_scroll_timer: |
686 |
self.iv_auto_scroll_direction = gtk.DIR_DOWN |
676 |
self.iv_auto_scroll_direction = Gtk.DIR_DOWN |
687 |
self.iv_auto_scroll_timer = gobject.timeout_add(150, |
677 |
self.iv_auto_scroll_timer = GObject.timeout_add(150, |
688 |
self.iv_auto_scroll) |
678 |
self.iv_auto_scroll) |
689 |
elif self.iv_auto_scroll_timer: |
679 |
elif self.iv_auto_scroll_timer: |
690 |
gobject.source_remove(self.iv_auto_scroll_timer) |
680 |
GObject.source_remove(self.iv_auto_scroll_timer) |
691 |
self.iv_auto_scroll_timer = None |
681 |
self.iv_auto_scroll_timer = None |
692 |
|
682 |
|
693 |
# ======================================================= |
683 |
# ======================================================= |
Lines 695-701
Link Here
|
695 |
"""Ends the auto-scroll during DND""" |
685 |
"""Ends the auto-scroll during DND""" |
696 |
|
686 |
|
697 |
if self.iv_auto_scroll_timer: |
687 |
if self.iv_auto_scroll_timer: |
698 |
gobject.source_remove(self.iv_auto_scroll_timer) |
688 |
GObject.source_remove(self.iv_auto_scroll_timer) |
699 |
self.iv_auto_scroll_timer = None |
689 |
self.iv_auto_scroll_timer = None |
700 |
|
690 |
|
701 |
# ======================================================= |
691 |
# ======================================================= |
Lines 704-713
Link Here
|
704 |
|
694 |
|
705 |
sw_vadj = self.sw.get_vadjustment() |
695 |
sw_vadj = self.sw.get_vadjustment() |
706 |
sw_vpos = sw_vadj.get_value() |
696 |
sw_vpos = sw_vadj.get_value() |
707 |
if self.iv_auto_scroll_direction == gtk.DIR_UP: |
697 |
if self.iv_auto_scroll_direction == Gtk.DIR_UP: |
708 |
sw_vpos -= sw_vadj.step_increment |
698 |
sw_vpos -= sw_vadj.step_increment |
709 |
sw_vadj.set_value( max(sw_vpos, sw_vadj.lower) ) |
699 |
sw_vadj.set_value( max(sw_vpos, sw_vadj.lower) ) |
710 |
elif self.iv_auto_scroll_direction == gtk.DIR_DOWN: |
700 |
elif self.iv_auto_scroll_direction == Gtk.DIR_DOWN: |
711 |
sw_vpos += sw_vadj.step_increment |
701 |
sw_vpos += sw_vadj.step_increment |
712 |
sw_vadj.set_value( min(sw_vpos, sw_vadj.upper - sw_vadj.page_size) ) |
702 |
sw_vadj.set_value( min(sw_vpos, sw_vadj.upper - sw_vadj.page_size) ) |
713 |
return True #call me again |
703 |
return True #call me again |
Lines 727-733
Link Here
|
727 |
iconview.unselect_all() |
717 |
iconview.unselect_all() |
728 |
iconview.select_path(path) |
718 |
iconview.select_path(path) |
729 |
iconview.grab_focus() |
719 |
iconview.grab_focus() |
730 |
self.popup.popup( None, None, None, event.button, time) |
720 |
self.popup.popup( None, None, None, None, event.button, time) |
731 |
return 1 |
721 |
return 1 |
732 |
|
722 |
|
733 |
# ======================================================= |
723 |
# ======================================================= |
Lines 746-752
Link Here
|
746 |
npage, angle = [int(k) for k in tmp[1:3]] |
736 |
npage, angle = [int(k) for k in tmp[1:3]] |
747 |
crop = [float(side) for side in tmp[3:7]] |
737 |
crop = [float(side) for side in tmp[3:7]] |
748 |
if self.add_pdf_pages(filename, npage, npage, angle, crop): |
738 |
if self.add_pdf_pages(filename, npage, npage, angle, crop): |
749 |
if context.action == gtk.gdk.ACTION_MOVE: |
739 |
if context.action == Gdk.DragAction.MOVE: |
750 |
context.finish(True, True, etime) |
740 |
context.finish(True, True, etime) |
751 |
elif target_id == self.TEXT_URI_LIST: |
741 |
elif target_id == self.TEXT_URI_LIST: |
752 |
uri = data.strip() |
742 |
uri = data.strip() |
Lines 837-881
Link Here
|
837 |
pos = model.get_iter(path) |
827 |
pos = model.get_iter(path) |
838 |
crop = [model.get_value(pos, 8 + side) for side in range(4)] |
828 |
crop = [model.get_value(pos, 8 + side) for side in range(4)] |
839 |
|
829 |
|
840 |
dialog = gtk.Dialog(title=(_('Crop Selected Page(s)')), |
830 |
dialog = Gtk.Dialog(title=(_('Crop Selected Page(s)')), |
841 |
parent=self.window, |
831 |
parent=self.window, |
842 |
flags=gtk.DIALOG_MODAL, |
832 |
flags=Gtk.DialogFlags.MODAL, |
843 |
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, |
833 |
buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, |
844 |
gtk.STOCK_OK, gtk.RESPONSE_OK)) |
834 |
Gtk.STOCK_OK, Gtk.ResponseType.OK)) |
845 |
dialog.set_size_request(340, 250) |
835 |
dialog.set_size_request(340, 250) |
846 |
dialog.set_default_response(gtk.RESPONSE_OK) |
836 |
dialog.set_default_response(Gtk.ResponseType.OK) |
847 |
|
837 |
|
848 |
frame = gtk.Frame(_('Crop Margins')) |
838 |
frame = Gtk.Frame.new(_('Crop Margins')) |
849 |
dialog.vbox.pack_start(frame, False, False, 20) |
839 |
dialog.vbox.pack_start(frame, False, False, 20) |
850 |
|
840 |
|
851 |
vbox = gtk.VBox(False, 0) |
841 |
vbox = Gtk.VBox(False, 0) |
852 |
frame.add(vbox) |
842 |
frame.add(vbox) |
853 |
|
843 |
|
854 |
spin_list = [] |
844 |
spin_list = [] |
855 |
units = 2 * [_('% of width')] + 2 * [_('% of height')] |
845 |
units = 2 * [_('% of width')] + 2 * [_('% of height')] |
856 |
for side in sides: |
846 |
for side in sides: |
857 |
hbox = gtk.HBox(True, 0) |
847 |
hbox = Gtk.HBox(True, 0) |
858 |
vbox.pack_start(hbox, False, False, 5) |
848 |
vbox.pack_start(hbox, False, False, 5) |
859 |
|
849 |
|
860 |
label = gtk.Label(side_names[side]) |
850 |
label = Gtk.Label(label=side_names[side]) |
861 |
label.set_alignment(0, 0.0) |
851 |
label.set_alignment(0, 0.0) |
862 |
hbox.pack_start(label, True, True, 20) |
852 |
hbox.pack_start(label, True, True, 20) |
863 |
|
853 |
|
864 |
adj = gtk.Adjustment(100.*crop.pop(0), 0.0, 99.0, 1.0, 5.0, 0.0) |
854 |
adj = Gtk.Adjustment(100.*crop.pop(0), 0.0, 99.0, 1.0, 5.0, 0.0) |
865 |
spin = gtk.SpinButton(adj, 0, 1) |
855 |
spin = Gtk.SpinButton.new(adj, 0, 1) |
866 |
spin.set_activates_default(True) |
856 |
spin.set_activates_default(True) |
867 |
spin.connect('value-changed', set_crop_value, side) |
857 |
spin.connect('value-changed', set_crop_value, side) |
868 |
spin_list.append(spin) |
858 |
spin_list.append(spin) |
869 |
hbox.pack_start(spin, False, False, 30) |
859 |
hbox.pack_start(spin, False, False, 30) |
870 |
|
860 |
|
871 |
label = gtk.Label(units.pop(0)) |
861 |
label = Gtk.Label(label=units.pop(0)) |
872 |
label.set_alignment(0, 0.0) |
862 |
label.set_alignment(0, 0.0) |
873 |
hbox.pack_start(label, True, True, 0) |
863 |
hbox.pack_start(label, True, True, 0) |
874 |
|
864 |
|
875 |
dialog.show_all() |
865 |
dialog.show_all() |
876 |
result = dialog.run() |
866 |
result = dialog.run() |
877 |
|
867 |
|
878 |
if result == gtk.RESPONSE_OK: |
868 |
if result == Gtk.ResponseType.OK: |
879 |
crop = [] |
869 |
crop = [] |
880 |
for spin in spin_list: |
870 |
for spin in spin_list: |
881 |
crop.append( spin.get_value()/100. ) |
871 |
crop.append( spin.get_value()/100. ) |
Lines 885-897
Link Here
|
885 |
model.set_value(pos, 8 + it, crop[it]) |
875 |
model.set_value(pos, 8 + it, crop[it]) |
886 |
model.set_value(pos, 6, False) #rendering request |
876 |
model.set_value(pos, 6, False) #rendering request |
887 |
self.render() |
877 |
self.render() |
888 |
elif result == gtk.RESPONSE_CANCEL: |
878 |
elif result == Gtk.ResponseType.CANCEL: |
889 |
print(_('Dialog closed')) |
879 |
print(_('Dialog closed')) |
890 |
dialog.destroy() |
880 |
dialog.destroy() |
891 |
|
881 |
|
892 |
# ======================================================= |
882 |
# ======================================================= |
893 |
def about_dialog(self, widget, data=None): |
883 |
def about_dialog(self, widget, data=None): |
894 |
about_dialog = gtk.AboutDialog() |
884 |
about_dialog = Gtk.AboutDialog() |
895 |
try: |
885 |
try: |
896 |
about_dialog.set_transient_for(self.window) |
886 |
about_dialog.set_transient_for(self.window) |
897 |
about_dialog.set_modal(True) |
887 |
about_dialog.set_modal(True) |
Lines 920-981
Link Here
|
920 |
self.filename = os.path.abspath(filename) |
910 |
self.filename = os.path.abspath(filename) |
921 |
(self.path, self.shortname) = os.path.split(self.filename) |
911 |
(self.path, self.shortname) = os.path.split(self.filename) |
922 |
(self.shortname, self.ext) = os.path.splitext(self.shortname) |
912 |
(self.shortname, self.ext) = os.path.splitext(self.shortname) |
923 |
f = gio.File(filename) |
913 |
f = Gio.File.new_for_path(filename) |
924 |
mime_type = f.query_info('standard::content-type').get_content_type() |
914 |
mime_type = f.query_info('standard::content-type', 0, None).get_content_type() |
925 |
if mime_type == 'application/pdf': |
915 |
if mime_type == 'application/pdf': |
926 |
self.nfile = nfile + 1 |
916 |
self.nfile = nfile + 1 |
927 |
self.mtime = os.path.getmtime(filename) |
917 |
self.mtime = os.path.getmtime(filename) |
928 |
self.copyname = os.path.join(tmp_dir, '%02d_' % self.nfile + |
918 |
self.copyname = os.path.join(tmp_dir, '%02d_' % self.nfile + |
929 |
self.shortname + '.pdf') |
919 |
self.shortname + '.pdf') |
930 |
shutil.copy(self.filename, self.copyname) |
920 |
shutil.copy(self.filename, self.copyname) |
931 |
self.document = poppler.document_new_from_file("file://" + self.copyname, None) |
921 |
self.document = Poppler.Document.new_from_file("file://" + self.copyname, None) |
932 |
self.npage = self.document.get_n_pages() |
922 |
self.npage = self.document.get_n_pages() |
933 |
else: |
923 |
else: |
934 |
self.nfile = 0 |
924 |
self.nfile = 0 |
935 |
|
925 |
|
936 |
|
926 |
|
937 |
# ======================================================= |
927 |
# ======================================================= |
938 |
class PDF_Renderer(threading.Thread,gobject.GObject): |
928 |
class PDF_Renderer(threading.Thread,GObject.GObject): |
939 |
|
929 |
|
940 |
def __init__(self, model, pdfqueue, scale=1., width=100): |
930 |
def __init__(self, model, pdfqueue, scale=1., width=100): |
941 |
threading.Thread.__init__(self) |
931 |
GObject.GObject.__init__(self) |
942 |
gobject.GObject.__init__(self) |
|
|
943 |
self.model = model |
932 |
self.model = model |
944 |
self.scale = scale |
933 |
self.scale = scale |
945 |
self.default_width = width |
934 |
self.default_width = width |
946 |
self.pdfqueue = pdfqueue |
935 |
self.pdfqueue = pdfqueue |
947 |
self.quit = False |
936 |
self.quit = False |
948 |
self.evnt = threading.Event() |
|
|
949 |
self.paused = False |
950 |
|
937 |
|
951 |
def run(self): |
938 |
def run(self): |
952 |
while not self.quit: |
939 |
while not self.quit: |
953 |
rendered_all = True |
940 |
rendered_all = True |
954 |
for row in self.model: |
941 |
for row in self.model: |
955 |
if self.quit: |
942 |
if self.quit: |
956 |
break |
943 |
break |
957 |
if not row[6]: |
944 |
if not row[6]: |
958 |
rendered_all = False |
945 |
rendered_all = False |
959 |
gtk.gdk.threads_enter() |
946 |
try: |
960 |
try: |
947 |
nfile = row[2] |
961 |
nfile = row[2] |
948 |
npage = row[3] |
962 |
npage = row[3] |
949 |
angle = row[7] |
963 |
angle = row[7] |
950 |
crop = [row[8],row[9],row[10],row[11]] |
964 |
crop = [row[8],row[9],row[10],row[11]] |
951 |
pdfdoc = self.pdfqueue[nfile - 1] |
965 |
pdfdoc = self.pdfqueue[nfile - 1] |
952 |
thumbnail = self.load_pdf_thumbnail(pdfdoc, npage, angle, crop) |
966 |
thumbnail = self.load_pdf_thumbnail(pdfdoc, npage, angle, crop) |
953 |
row[6] = True |
967 |
row[6] = True |
954 |
row[4] = thumbnail.get_width() |
968 |
row[4] = thumbnail.get_width() |
955 |
row[1] = thumbnail |
969 |
row[1] = thumbnail |
956 |
finally: |
970 |
finally: |
957 |
pass #Gdk.threads_leave() |
971 |
gtk.gdk.threads_leave() |
958 |
if rendered_all: |
972 |
if rendered_all: |
959 |
self.quit = True |
973 |
if self.model.get_iter_first(): #just checking if model isn't empty |
960 |
if self.model.get_iter_first(): #just checking if model isn't empty |
974 |
self.emit('reset_iv_width') |
961 |
self.emit('reset_iv_width') |
975 |
self.paused = True |
962 |
self.quit = False |
976 |
self.evnt.wait() |
963 |
return False |
977 |
|
964 |
|
978 |
# ======================================================= |
965 |
# ======================================================= |
|
|
966 |
def pixbuf_destroy_fn(self, pixbuf, data): |
967 |
pass #del pixbuf |
968 |
|
979 |
def load_pdf_thumbnail(self, pdfdoc, npage, rotation=0, crop=[0.,0.,0.,0.]): |
969 |
def load_pdf_thumbnail(self, pdfdoc, npage, rotation=0, crop=[0.,0.,0.,0.]): |
980 |
"""Create pdf pixbuf""" |
970 |
"""Create pdf pixbuf""" |
981 |
|
971 |
|
Lines 988-993
Link Here
|
988 |
data = array.array('c', '\x00' * stride * pix_h) |
978 |
data = array.array('c', '\x00' * stride * pix_h) |
989 |
pix_surface = cairo.ImageSurface.create_for_data(data, cairo.FORMAT_ARGB32, |
979 |
pix_surface = cairo.ImageSurface.create_for_data(data, cairo.FORMAT_ARGB32, |
990 |
pix_w, pix_h, stride) |
980 |
pix_w, pix_h, stride) |
|
|
981 |
#thumbnail = GdkPixbuf.Pixbuf(GdkPixbuf.Colorspace.RGB, False, |
982 |
# 8, pix_w , pix_h) |
991 |
ctx = cairo.Context(pix_surface) |
983 |
ctx = cairo.Context(pix_surface) |
992 |
ctx.scale(self.scale, self.scale) |
984 |
ctx.scale(self.scale, self.scale) |
993 |
page.render(ctx) |
985 |
page.render(ctx) |
Lines 996-1005
Link Here
|
996 |
data[1::4], data[2::4], data[3::4], data[0::4] |
988 |
data[1::4], data[2::4], data[3::4], data[0::4] |
997 |
else: |
989 |
else: |
998 |
data[0::4], data[2::4] = data[2::4], data[0::4] |
990 |
data[0::4], data[2::4] = data[2::4], data[0::4] |
999 |
thumbnail = gtk.gdk.pixbuf_new_from_data(data, |
991 |
thumbnail = GdkPixbuf.Pixbuf.new_from_data(data, |
1000 |
gtk.gdk.COLORSPACE_RGB, |
992 |
GdkPixbuf.Colorspace.RGB, |
1001 |
True, 8, pix_w , pix_h, |
993 |
True, 8, pix_w, pix_h, |
1002 |
stride) |
994 |
stride, self.pixbuf_destroy_fn, |
|
|
995 |
None) |
996 |
#page.render_to_pixbuf(0,0,pix_w,pix_h,self.scale,0,thumbnail) |
1003 |
rotation = (-rotation) % 360 |
997 |
rotation = (-rotation) % 360 |
1004 |
rotation = ((rotation + 45) / 90) * 90 |
998 |
rotation = ((rotation + 45) / 90) * 90 |
1005 |
thumbnail = thumbnail.rotate_simple(rotation) |
999 |
thumbnail = thumbnail.rotate_simple(rotation) |
Lines 1010-1016
Link Here
|
1010 |
src_y = int( crop[2] * pix_h ) |
1004 |
src_y = int( crop[2] * pix_h ) |
1011 |
width = int( (1. - crop[0] - crop[1]) * pix_w ) |
1005 |
width = int( (1. - crop[0] - crop[1]) * pix_w ) |
1012 |
height = int( (1. - crop[2] - crop[3]) * pix_h ) |
1006 |
height = int( (1. - crop[2] - crop[3]) * pix_h ) |
1013 |
new_thumbnail = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, |
1007 |
new_thumbnail = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, |
1014 |
8, width, height) |
1008 |
8, width, height) |
1015 |
thumbnail.copy_area(src_x, src_y, width, height, |
1009 |
thumbnail.copy_area(src_x, src_y, width, height, |
1016 |
new_thumbnail, 0, 0) |
1010 |
new_thumbnail, 0, 0) |
Lines 1022-1035
Link Here
|
1022 |
traceback.print_exc() |
1016 |
traceback.print_exc() |
1023 |
pix_w = self.default_width |
1017 |
pix_w = self.default_width |
1024 |
pix_h = pix_w |
1018 |
pix_h = pix_w |
1025 |
thumbnail = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, |
1019 |
thumbnail = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, False, |
1026 |
8, pix_w, pix_h) |
1020 |
8, pix_w, pix_h) |
1027 |
thumbnail.fill(0xffffffff) |
1021 |
thumbnail.fill(0xffffffff) |
1028 |
|
1022 |
|
1029 |
#add border |
1023 |
#add border |
1030 |
thickness = 3 |
1024 |
thickness = 3 |
1031 |
color = 0x000000FF |
1025 |
color = 0x000000FF |
1032 |
canvas = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, |
1026 |
canvas = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, |
1033 |
pix_w + thickness + 1, |
1027 |
pix_w + thickness + 1, |
1034 |
pix_h + thickness + 1) |
1028 |
pix_h + thickness + 1) |
1035 |
canvas.fill(color) |
1029 |
canvas.fill(color) |
Lines 1042-1048
Link Here
|
1042 |
# ======================================================= |
1036 |
# ======================================================= |
1043 |
if __name__ == '__main__': |
1037 |
if __name__ == '__main__': |
1044 |
PDFshuffler() |
1038 |
PDFshuffler() |
1045 |
gtk.gdk.threads_enter() |
1039 |
Gdk.threads_enter() |
1046 |
gtk.main() |
1040 |
Gtk.main() |
1047 |
gtk.gdk.threads_leave() |
1041 |
Gdk.threads_leave() |
1048 |
|
1042 |
|