Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 390607 | Differences between
and this patch

Collapse All | Expand All

(-)pdfshuffler-test (-208 / +202 lines)
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

Return to bug 390607