~thelupine/pyscreenie/trunk

« back to all changes in this revision

Viewing changes to src/pyscreenie

  • Committer: TheLupine
  • Date: 2011-11-18 05:31:45 UTC
  • Revision ID: thelupine@gmail.com-20111118053145-50uxne99alz2ec44
added CONFIGFILE via sqlite3 support

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
    description:    Python/GTK/Glade app to capture a screenshot of your desktop.
11
11
    
12
12
"""
13
 
import sys, os, subprocess, signal, re, time
14
 
import gobject, gtk, gtk.gdk, pango, gtk.glade, pygtk
 
13
import sys, os, subprocess, signal, re, time, sqlite3, \
 
14
gobject, gtk, gtk.gdk, pango, gtk.glade, pygtk
15
15
     
16
16
APPNAME     = "pyscreenie"
17
 
APPVERSION  = "1.9.1"
 
17
APPVERSION  = "1.9.3"
18
18
APPCONFDIR  = os.environ["HOME"] + '/.pyscreenie'
19
19
GLADEFILE   = "/usr/share/pyscreenie/pyscreenie.glade"
20
20
#GLADEFILE   = "glade/pyscreenie.glade"
21
21
SCHEDULER   = 'pyscreenie-scheduler'
22
22
PIDFILE     = APPCONFDIR + '/pyscreenie.pid'
 
23
CONFIGFILE  = APPCONFDIR + "/config.db"
23
24
 
24
25
print "\n\n" + APPNAME + " version " + APPVERSION + ", Copyright (C) 2008 - TheLupine"
25
26
print APPNAME + " comes with ABSOLUTELY NO WARRANTY, is licensed under the"
42
43
        sys.exit(1)
43
44
 
44
45
class pyscreenie:
45
 
    def __init__(self):
46
 
        gtkbuilder = gtk.Builder()
47
 
        gtkbuilder.add_from_file(GLADEFILE)
48
 
        
49
 
        #glade objects
50
 
        self.statusicon = gtkbuilder.get_object('statusicon')
51
 
        self.prefs_dialog = gtkbuilder.get_object('prefs_dialog')
52
 
        self.menu_rightclick = gtkbuilder.get_object('menu_statusicon')
53
 
        self.label_version = gtkbuilder.get_object('label_version')
54
 
        self.about_dialog = gtkbuilder.get_object('about_dialog')
55
 
        self.statusicon_menuitem_enable = gtkbuilder.get_object('statusicon_menuitem_enable')
56
 
        self.radiobutton_repeatyes = gtkbuilder.get_object('radiobutton_repeatyes')
57
 
        self.radiobutton_repeatno = gtkbuilder.get_object('radiobutton_repeatno')
58
 
        self.filechooser_screeniepath = gtkbuilder.get_object('filechooser_screeniepath')
59
 
        self.spinbutton_hour = gtkbuilder.get_object('spinbutton_hour')
60
 
        self.spinbutton_minute = gtkbuilder.get_object('spinbutton_minute')
61
 
        self.radiobutton_minute = gtkbuilder.get_object('radiobutton_minute')
62
 
        self.radiobutton_hour = gtkbuilder.get_object('radiobutton_hour')
63
 
        self.radiobutton_day = gtkbuilder.get_object('radiobutton_day')
64
 
        self.radiobutton_week = gtkbuilder.get_object('radiobutton_week')
65
 
        self.radiobutton_png = gtkbuilder.get_object('radiobutton_png')
66
 
        self.radiobutton_jpg = gtkbuilder.get_object('radiobutton_jpg')
67
 
        self.label_compression = gtkbuilder.get_object('label_compression')
68
 
        self.spinbutton_compression = gtkbuilder.get_object('spinbutton_compression')
69
 
        
70
 
        signals = { 'on_menuitem_about_activate' : self.on_about_menu_activate,
71
 
                    'on_menuitem_close_activate' : self.on_menuitem_close_activate,
72
 
                    'on_menuitem_quit_activate' : self.main_quit,
73
 
                    'on_statusicon_button_press_event' : self.on_statusicon_button_press_event,
74
 
                    'on_statusicon_menuitem_enable_toggled': self.on_statusicon_menuitem_enable_toggled,
75
 
                    'on_statusicon_menuitem_prefs_activate' : self.on_statusicon_menuitem_prefs_activate,
76
 
                    'on_statusicon_menuitem_about_activate' : self.on_about_menu_activate,
77
 
                    'on_statusicon_menuitem_quit_activate' : self.main_quit,
78
 
                    'on_about_menu_activate' : self.on_about_menu_activate,
79
 
                    'on_about_close_button_clicked' : self.on_about_dialog_delete_event,
80
 
                    'on_about_dialog_delete_event' : self.on_about_dialog_delete_event,
81
 
                    'on_prefs_dialog_delete_event' : self.on_menuitem_close_activate,
82
 
                    'on_button_cancel_clicked' : self.on_menuitem_close_activate,
83
 
                    'on_button_enable_clicked' : self.on_button_enable_clicked,
84
 
                    'on_radiobutton_jpg_clicked' : self.on_radiobutton_jpg_clicked,
85
 
                    'on_radiobutton_png_clicked' : self.on_radiobutton_png_clicked
86
 
                     }
87
 
        gtkbuilder.connect_signals(signals)
88
 
        
89
 
        #setup some initial values of certain widgets
90
 
        self.statusicon.set_tooltip(APPNAME)
91
 
        
92
 
        #cleanup left over PIDs and config files (possibly from a crash or logout)
93
 
        self.startupcleanup()
94
46
 
95
47
    def startupcleanup(self):
96
48
        """This function will remove any existing PID or conf files"""
182
134
            datestampfile.close()
183
135
 
184
136
            #get screenie location
185
 
            location = self.filechooser_screeniepath.get_current_folder()
 
137
            savepath = self.filechooser_screeniepath.get_uri()
 
138
            location = savepath.replace('file://','')
186
139
            
187
140
            #png or jpg?
188
141
            pngorjpg = ''
 
142
            getcomp = ''
189
143
            if self.radiobutton_png.get_active():
190
144
                pngorjpg = 'png'
 
145
                filetype = 'png'
191
146
            elif self.radiobutton_jpg.get_active():
192
147
                getcomp = self.spinbutton_compression.get_text()
 
148
                filetype = 'jpg'
193
149
                pngorjpg = 'jpg' + getcomp
194
150
                
195
151
            #is it going to repeat?
220
176
            #spawn the process
221
177
            self.spawn_child(datestamp, location, pngorjpg, starttime, repeat, everywhen)
222
178
            self.statusicon.set_tooltip(APPNAME + ' - enabled')
 
179
            
 
180
            #update the CONFIGFILE
 
181
            self.update_configfile(savepath, filetype, getcomp, starthour, startmin, \
 
182
                                repeat, everywhen)
223
183
        else:
224
184
            self.clear_conf_files()
225
185
            self.stop_child()
226
186
            self.statusicon.set_tooltip(APPNAME)
227
187
 
 
188
    def check_sqlitedb(self):
 
189
        """
 
190
        This function will check for the sqlite3 file, and if not exist
 
191
        it will create it.  If it does exist, it will perform any DB
 
192
        updates that are needed.
 
193
        """
 
194
        if os.path.isfile(CONFIGFILE):
 
195
            sqlconn = sqlite3.connect(CONFIGFILE)
 
196
            sqlcursor = sqlconn.cursor()
 
197
            sqlcursor.execute('''pragma table_info('options')''')
 
198
            """
 
199
            # this is what the current schema should look like
 
200
            0|id|int|0||0
 
201
            2|savepath|text|0||0
 
202
            3|filetype|text|0||0
 
203
            4|compression|int|0||0
 
204
            5|hour|int|0||0
 
205
            6|minute|int|0||0
 
206
            7|repeat|text|0||0
 
207
            8|repeatevery|text|0||0
 
208
            """
 
209
        else:
 
210
            try:
 
211
                sqlite3.connect(CONFIGFILE)
 
212
            except:
 
213
                errormessage = 'Unable to connect to sqlite3 file:\n' \
 
214
                                + CONFIGFILE + \
 
215
                                '\nYou will not be able to save config options.\n\n'
 
216
                print errormessage
 
217
            else:
 
218
                sqlconn = sqlite3.connect(CONFIGFILE)
 
219
                sqlcursor = sqlconn.cursor()
 
220
                sqlcursor.execute('''create table if not exists options
 
221
                                        (id int,
 
222
                                        savepath text, 
 
223
                                        filetype text, 
 
224
                                        compression int,
 
225
                                        hour int,
 
226
                                        minute int,
 
227
                                        repeat text,
 
228
                                        repeatevery text)''')
 
229
                sqlconn.commit()
 
230
                sqlcursor.execute('''INSERT INTO options VALUES (?,?,?,?,?,?,?,?)
 
231
                                    ''',("0","","png","0","0","0","True","min") )
 
232
                sqlconn.commit()
 
233
                sqlconn.close
 
234
 
 
235
    def read_configfile(self):
 
236
        """
 
237
        This function will read in the settings from the sqlite
 
238
        CONFIGFILE file, and populate the necessary values
 
239
        """
 
240
        savepath = ""
 
241
        filetype = ""
 
242
        compression = ""
 
243
        hour = ""
 
244
        minute = ""
 
245
        repeat = ""
 
246
        repeatevery = ""
 
247
        
 
248
        sqlconn = sqlite3.connect(CONFIGFILE)
 
249
        sqlcursor = sqlconn.cursor()
 
250
        #first look through the sqlite db, and assign values to variables
 
251
        for row in sqlcursor.execute("SELECT * FROM options"):
 
252
            if (row[1]):
 
253
                savepath = row[1]
 
254
                self.filechooser_screeniepath.set_uri(savepath)
 
255
 
 
256
            if (row[2]):
 
257
                filetype = row[2]
 
258
                if filetype == "png":
 
259
                    self.radiobutton_png.set_active(1)
 
260
                if filetype == "jpg":
 
261
                    self.radiobutton_jpg.set_active(1)
 
262
                    self.label_compression.set_text(compression)
 
263
                
 
264
            if (row[3]):
 
265
                compression = str(row[3])
 
266
                self.spinbutton_compression.set_text(compression)
 
267
                
 
268
            if (row[4]):
 
269
                hour = str(row[4])
 
270
                self.spinbutton_hour.set_text(hour)
 
271
            
 
272
            if (row[5]):
 
273
                minute = str(row[5])
 
274
                self.spinbutton_minute.set_text(minute)
 
275
 
 
276
            if (row[6]):
 
277
                repeat = row[6]
 
278
                if repeat == "False":
 
279
                    self.radiobutton_repeatno.set_active(1)
 
280
                else:
 
281
                    self.radiobutton_repeatyes.set_active(1)
 
282
 
 
283
            if (row[7]):
 
284
                repeatevery = row[7]
 
285
                if repeatevery == "min":
 
286
                    self.radiobutton_minute.set_active(1)
 
287
                if repeatevery == "hour":
 
288
                    self.radiobutton_hour.set_active(1)
 
289
                if repeatevery == "day":
 
290
                    self.radiobutton_day.set_active(1)
 
291
                if repeatevery == "week":
 
292
                    self.radiobutton_week.set_active(1)
 
293
 
 
294
    def update_configfile(self,savepath,filetype,compression,hour, \
 
295
        minute,repeat,repeatevery):
 
296
        """
 
297
        This function will update the CONFIGFILE file
 
298
        """
 
299
        sqlconn = sqlite3.connect(CONFIGFILE)
 
300
        sqlcursor = sqlconn.cursor()
 
301
        values = (savepath,filetype,compression,hour, \
 
302
                    minute,repeat,repeatevery,"0")
 
303
        sqlcursor.execute('''
 
304
                        UPDATE options SET
 
305
                            savepath=?,
 
306
                            filetype=?,
 
307
                            compression=?,
 
308
                            hour=?,
 
309
                            minute=?,
 
310
                            repeat=?,
 
311
                            repeatevery=?
 
312
                        WHERE id=? ''', values)
 
313
        #update and close the database
 
314
        sqlconn.commit()
 
315
        sqlconn.close()
 
316
                            
 
317
    
 
318
    def __init__(self):
 
319
        gtkbuilder = gtk.Builder()
 
320
        gtkbuilder.add_from_file(GLADEFILE)
 
321
        
 
322
        #glade objects
 
323
        self.statusicon = gtkbuilder.get_object('statusicon')
 
324
        self.prefs_dialog = gtkbuilder.get_object('prefs_dialog')
 
325
        self.menu_rightclick = gtkbuilder.get_object('menu_statusicon')
 
326
        self.label_version = gtkbuilder.get_object('label_version')
 
327
        self.about_dialog = gtkbuilder.get_object('about_dialog')
 
328
        self.statusicon_menuitem_enable = gtkbuilder.get_object('statusicon_menuitem_enable')
 
329
        self.radiobutton_repeatyes = gtkbuilder.get_object('radiobutton_repeatyes')
 
330
        self.radiobutton_repeatno = gtkbuilder.get_object('radiobutton_repeatno')
 
331
        self.filechooser_screeniepath = gtkbuilder.get_object('filechooser_screeniepath')
 
332
        self.spinbutton_hour = gtkbuilder.get_object('spinbutton_hour')
 
333
        self.spinbutton_minute = gtkbuilder.get_object('spinbutton_minute')
 
334
        self.radiobutton_minute = gtkbuilder.get_object('radiobutton_minute')
 
335
        self.radiobutton_hour = gtkbuilder.get_object('radiobutton_hour')
 
336
        self.radiobutton_day = gtkbuilder.get_object('radiobutton_day')
 
337
        self.radiobutton_week = gtkbuilder.get_object('radiobutton_week')
 
338
        self.radiobutton_png = gtkbuilder.get_object('radiobutton_png')
 
339
        self.radiobutton_jpg = gtkbuilder.get_object('radiobutton_jpg')
 
340
        self.label_compression = gtkbuilder.get_object('label_compression')
 
341
        self.spinbutton_compression = gtkbuilder.get_object('spinbutton_compression')
 
342
        
 
343
        signals = { 'on_menuitem_about_activate' : self.on_about_menu_activate,
 
344
                    'on_menuitem_close_activate' : self.on_menuitem_close_activate,
 
345
                    'on_menuitem_quit_activate' : self.main_quit,
 
346
                    'on_statusicon_button_press_event' : self.on_statusicon_button_press_event,
 
347
                    'on_statusicon_menuitem_enable_toggled': self.on_statusicon_menuitem_enable_toggled,
 
348
                    'on_statusicon_menuitem_prefs_activate' : self.on_statusicon_menuitem_prefs_activate,
 
349
                    'on_statusicon_menuitem_about_activate' : self.on_about_menu_activate,
 
350
                    'on_statusicon_menuitem_quit_activate' : self.main_quit,
 
351
                    'on_about_menu_activate' : self.on_about_menu_activate,
 
352
                    'on_about_close_button_clicked' : self.on_about_dialog_delete_event,
 
353
                    'on_about_dialog_delete_event' : self.on_about_dialog_delete_event,
 
354
                    'on_prefs_dialog_delete_event' : self.on_menuitem_close_activate,
 
355
                    'on_button_cancel_clicked' : self.on_menuitem_close_activate,
 
356
                    'on_button_enable_clicked' : self.on_button_enable_clicked,
 
357
                    'on_radiobutton_jpg_clicked' : self.on_radiobutton_jpg_clicked,
 
358
                    'on_radiobutton_png_clicked' : self.on_radiobutton_png_clicked
 
359
                     }
 
360
        gtkbuilder.connect_signals(signals)
 
361
        
 
362
        #setup some initial values of certain widgets
 
363
        self.statusicon.set_tooltip(APPNAME)
 
364
        
 
365
        #cleanup left over PIDs and config files (possibly from a crash or logout)
 
366
        self.startupcleanup()
 
367
 
 
368
        #perform some initialization functions
 
369
        self.check_sqlitedb()
 
370
        self.read_configfile()
 
371
 
228
372
if __name__ == "__main__":
229
373
    pyscreenie = pyscreenie()
230
374
    gtk.gdk.threads_enter()