def addStartup(): if osName=='win': from scal3.windows import winMakeShortcut makeDir(winStartupDir) #fname = APP_NAME + ('-qt' if uiName=='qt' else '') + '.pyw' fname = core.COMMAND + '.pyw' fpath = join(rootDir, fname) #open(winStartupFile, 'w').write('execfile(%r, {"__file__":%r})'%(fpath, fpath)) try: winMakeShortcut(fpath, winStartupFile) except: return False else: return True elif isdir('%s/.config'%homeDir):## osName in ('linux', 'mac') ## maybe Gnome/KDE on Solaris, *BSD, ... text = '''[Desktop Entry] Type=Application Name=%s %s Icon=%s Exec=%s'''%(core.APP_DESC, core.VERSION, APP_NAME, core.COMMAND)## double quotes needed when the exec path has space makeDir(comDeskDir) try: fp = open(comDesk, 'w') except: core.myRaise(__file__) return False else: fp.write(text) return True elif osName=='mac':## FIXME pass return False
def addStartup(): if osName == 'win': from scal3.windows import winMakeShortcut makeDir(winStartupDir) #fname = APP_NAME + ('-qt' if uiName=='qt' else '') + '.pyw' fname = core.COMMAND + '.pyw' fpath = join(rootDir, fname) #open(winStartupFile, 'w').write('execfile(%r, {"__file__":%r})'%(fpath, fpath)) try: winMakeShortcut(fpath, winStartupFile) except: return False else: return True elif isdir( '%s/.config' % homeDir ): ## osName in ('linux', 'mac') ## maybe Gnome/KDE on Solaris, *BSD, ... text = '''[Desktop Entry] Type=Application Name=%s %s Icon=%s Exec=%s''' % (core.APP_DESC, core.VERSION, APP_NAME, core.COMMAND ) ## double quotes needed when the exec path has space makeDir(comDeskDir) try: fp = open(comDesk, 'w') except: core.myRaise(__file__) return False else: fp.write(text) return True elif osName == 'mac': ## FIXME pass return False
def addClicked(self, button): fcd = gtk.FileChooserDialog( buttons=( toBytes(_("_OK")), gtk.ResponseType.OK, toBytes(_("_Cancel")), gtk.ResponseType.CANCEL, ), title=_("Add File"), ) fcd.set_local_only(True) fcd.connect("response", lambda w, e: fcd.hide()) if fcd.run() == gtk.ResponseType.OK: from shutil import copy fpath = fcd.get_filename() fname = split(fpath)[-1] dstDir = self.event.filesDir ## os.makedirs(dstDir, exist_ok=True)## only on new pythons FIXME try: os.makedirs(dstDir) except: myRaise() copy(fpath, join(dstDir, fname)) self.event.files.append(fname) self.newFiles.append(fname) self.showFile(fname)
def _do_onGroupModify(self, group): group.afterModify() group.save()## FIXME try: if group.name == "universityTerm":## FIXME groupIter = self.groupIterById[group.id] n = self.trees.iter_n_children(groupIter) for i in range(n): eventIter = self.trees.iter_nth_child(groupIter, i) eid = self.trees.get(eventIter, 0)[0] self.trees.set(eventIter, 2, group[eid].summary) except: myRaise()
def _do_onGroupModify(self, group): group.afterModify() group.save()## FIXME try: if group.name == 'universityTerm':## FIXME groupIter = self.groupIterById[group.id] n = self.trees.iter_n_children(groupIter) for i in range(n): eventIter = self.trees.iter_nth_child(groupIter, i) eid = self.trees.get(eventIter, 0)[0] self.trees.set(eventIter, 2, group[eid].summary) except: myRaise()
def addStartup(): if osName == "win": from scal3.windows import winMakeShortcut, winStartupFile makeDir(winStartupDir) #fname = APP_NAME + ("-qt" if uiName=="qt" else "") + ".pyw" fname = core.COMMAND + ".pyw" fpath = join(rootDir, fname) #open(winStartupFile, "w").write( # "execfile(%r, {"__file__":%r})"%(fpath, fpath) #) try: winMakeShortcut(fpath, winStartupFile) except: return False else: return True elif isdir("%s/.config" % homeDir): # osName in ("linux", "mac") # maybe Gnome/KDE on Solaris, *BSD, ... text = """[Desktop Entry] Type=Application Name=%s %s Icon=%s Exec=%s""" % ( core.APP_DESC, core.VERSION, APP_NAME, core.COMMAND, ) # double quotes needed when the exec path has space makeDir(comDeskDir) try: fp = open(comDesk, "w") except: core.myRaise(__file__) return False else: fp.write(text) return True elif osName == "mac": # FIXME pass return False
def addClicked(self, button): fcd = gtk.FileChooserDialog( buttons=( toBytes(_('_OK')), gtk.ResponseType.OK, toBytes(_('_Cancel')), gtk.ResponseType.CANCEL, ), title=_('Add File'), ) fcd.set_local_only(True) fcd.connect('response', lambda w, e: fcd.hide()) if fcd.run() == gtk.ResponseType.OK: from shutil import copy fpath = fcd.get_filename() fname = split(fpath)[-1] dstDir = self.event.filesDir ## os.makedirs(dstDir, exist_ok=True)## only on new pythons FIXME try: os.makedirs(dstDir) except: myRaise() copy(fpath, join(dstDir, fname)) self.event.files.append(fname) self.newFiles.append(fname) self.showFile(fname)
def apply(self, widget=None): from scal3.ui_gtk.font_utils import gfontDecode ####### FIXME #print("fontDefault = %s" % ui.fontDefault) ui.fontDefault = gfontDecode(ud.settings.get_property("gtk-font-name")) #print("fontDefault = %s" % ui.fontDefault) ###################### Updating pref variables ##################### for opt in self.iterAllPrefItems(): opt.updateVar() ###### DB Manager (Plugin Manager) index = [] for row in self.plugTreestore: plugI = row[0] enable = row[1] show_date = row[2] index.append(plugI) plug = core.allPlugList[plugI] if plug.loaded: try: plug.enable = enable plug.show_date = show_date except: core.myRaise(__file__) print(i, core.plugIndex) else: if enable: plug = plugin_man.loadPlugin(plug.file, enable=True) if plug: assert plug.loaded core.allPlugList[plugI] = plug core.plugIndex = index core.updatePlugins() ###### first = self.comboFirstWD.get_active() if first == 7: core.firstWeekDayAuto = True try: core.firstWeekDay = core.getLocaleFirstWeekDay() except: pass else: core.firstWeekDayAuto = False core.firstWeekDay = first ###### mode = self.comboWeekYear.get_active() if mode == 8: core.weekNumberModeAuto = True core.weekNumberMode = core.getLocaleweekNumberMode() else: core.weekNumberModeAuto = False core.weekNumberMode = mode ###### ui.cellCache.clear() # Very important # ^ specially when calTypes.primary will be changed ###### ud.updateFormatsBin() ######################## Saving Preferences ####################### for mod in calTypes: mod.save() ##################### Saving locale config locale_man.saveConf() ##################### Saving core config core.version = core.VERSION core.saveConf() del core.version ##################### Saving ui config ui.prefPagesOrder = tuple( [self.notebook.page_num(page) for page in self.prefPages]) ui.saveConf() ##################### Saving gtk_ud config ud.saveConf() ######################### Updating GUI ########################### ud.windowList.onConfigChange() if ui.mainWin: """ if ui.bgUseDesk and ui.bgColor[3] == 255: msg = gtk.MessageDialog( buttons=gtk.ButtonsType.OK_CANCEL, message_format=_( "If you want to have a transparent calendar " + "(and see your desktop)," + "change the opacity of calendar background color!" ) ) if msg.run() == gtk.ResponseType.OK: self.colorbBg.emit("clicked") msg.destroy() """ if ui.checkNeedRestart(): d = gtk.Dialog( title=_("Restart " + core.APP_DESC), parent=self, flags=(gtk.DialogFlags.MODAL | gtk.DialogFlags.DESTROY_WITH_PARENT), buttons=(gtk.STOCK_CANCEL, 0), ) d.set_keep_above(True) label = gtk.Label( _("Some preferences need restarting %s to apply." % core.APP_DESC)) label.set_line_wrap(True) pack(d.vbox, label) resBut = d.add_button(_("_Restart"), 1) resBut.set_image( gtk.Image.new_from_stock( gtk.STOCK_REFRESH, gtk.IconSize.BUTTON, )) resBut.grab_default() d.vbox.show_all() if d.run() == 1: core.restart() else: d.destroy()
def genRightClickMenu(self, path): ## how about multi-selection? FIXME ## and Select _All menu item obj_list = self.getObjsByPath(path) #print(len(obj_list)) menu = gtk.Menu() if len(obj_list) == 1: group = obj_list[0] if group.name == "trash": #print("right click on trash", group.title) menu.add(eventWriteMenuItem( "Edit", gtk.STOCK_EDIT, self.editTrash, )) menu.add(eventWriteMenuItem( "Empty Trash",## or use group.title FIXME gtk.STOCK_CLEAR, self.emptyTrash, )) #menu.add(gtk.SeparatorMenuItem()) #menu.add(eventWriteMenuItem( # "Add New Group", # gtk.STOCK_NEW, # self.addGroupBeforeSelection, #))## FIXME else: #print("right click on group", group.title) menu.add(eventWriteMenuItem( "Edit", gtk.STOCK_EDIT, self.editGroupFromMenu, path, )) eventTypes = group.acceptsEventTypes if eventTypes is None: eventTypes = event_lib.classes.event.names if len(eventTypes) > 3: menu.add(eventWriteMenuItem( _("Add Event"), gtk.STOCK_ADD, self.addGenericEventToGroupFromMenu, path, group, )) else: for eventType in eventTypes: #if eventType == "custom":## FIXME # desc = _("Add ") + _("Event") #else: label = _("Add ") + event_lib.classes.event.byName[eventType].desc menu.add(eventWriteMenuItem( label, gtk.STOCK_ADD, self.addEventToGroupFromMenu, path, group, eventType, label, )) pasteItem = eventWriteMenuItem( "Paste Event", gtk.STOCK_PASTE, self.pasteEventFromMenu, path, ) menu.add(pasteItem) pasteItem.set_sensitive(self.canPasteToGroup(group)) ## if group.remoteIds: aid, remoteGid = group.remoteIds try: account = ui.eventAccounts[aid] except KeyError: myRaise() else: if account.enable: menu.add(gtk.SeparatorMenuItem()) menu.add(eventWriteMenuItem( "Synchronize", gtk.STOCK_CONNECT,## or gtk.STOCK_REFRESH FIXME self.syncGroupFromMenu, path, account, )) #else:## FIXME ## menu.add(gtk.SeparatorMenuItem()) #menu.add(eventWriteMenuItem( # "Add New Group", # gtk.STOCK_NEW, # self.addGroupBeforeGroup, # path, #))## FIXME menu.add(eventWriteMenuItem( "Duplicate", gtk.STOCK_COPY, self.duplicateGroupFromMenu, path, )) ### dupAllItem = labelStockMenuItem( "Duplicate with All Events", gtk.STOCK_COPY, self.duplicateGroupWithEventsFromMenu, path, ) menu.add(dupAllItem) dupAllItem.set_sensitive( not group.isReadOnly() and bool(group.idList) ) ### menu.add(gtk.SeparatorMenuItem()) menu.add(eventWriteMenuItem( "Delete Group", gtk.STOCK_DELETE, self.deleteGroupFromMenu, path, )) menu.add(gtk.SeparatorMenuItem()) ## #menu.add(eventWriteMenuItem( # "Move Up", # gtk.STOCK_GO_UP, # self.moveUpFromMenu, # path, #)) #menu.add(eventWriteMenuItem( # "Move Down", # gtk.STOCK_GO_DOWN, # self.moveDownFromMenu, # path, #)) ## menu.add(labelStockMenuItem( _("Export"), gtk.STOCK_CONVERT, self.groupExportFromMenu, group, )) ### sortItem = labelStockMenuItem( _("Sort Events"), gtk.STOCK_SORT_ASCENDING, self.groupSortFromMenu, path, ) menu.add(sortItem) sortItem.set_sensitive( not group.isReadOnly() and bool(group.idList) ) ### convertItem = labelStockMenuItem( _("Convert Calendar Type"), gtk.STOCK_CONVERT, self.groupConvertModeFromMenu, group, ) menu.add(convertItem) convertItem.set_sensitive( not group.isReadOnly() and bool(group.idList) ) ### for newGroupType in group.canConvertTo: menu.add(eventWriteMenuItem( _( "Convert to %s" ) % event_lib.classes.group.byName[newGroupType].desc, None, self.groupConvertTo, group, newGroupType, )) ### bulkItem = labelStockMenuItem( _("Bulk Edit Events"), gtk.STOCK_EDIT, self.groupBulkEditFromMenu, group, path, ) menu.add(bulkItem) bulkItem.set_sensitive( not group.isReadOnly() and bool(group.idList) ) ### for actionName, actionFuncName in group.actions: menu.add(eventWriteMenuItem( _(actionName), None, self.groupActionClicked, group, actionFuncName, )) elif len(obj_list) == 2: group, event = obj_list #print("right click on event", event.summary) if group.name != "trash": menu.add(eventWriteMenuItem( "Edit", gtk.STOCK_EDIT, self.editEventFromMenu, path, )) #### menu.add(eventWriteImageMenuItem( "History", "history-24.png", self.historyOfEventFromMenu, path, )) #### moveToItem = eventWriteMenuItem( _("Move to %s") % "...", None, # FIXME ) moveToMenu = gtk.Menu() for new_group in ui.eventGroups: if new_group.id == group.id: continue #if not new_group.enable:## FIXME # continue new_groupPath = self.trees.get_path(self.groupIterById[new_group.id]) if event.name in new_group.acceptsEventTypes: new_groupItem = ImageMenuItem() new_groupItem.set_label(new_group.title) ## image = gtk.Image() image.set_from_pixbuf(newColorCheckPixbuf(new_group.color, 20, True)) new_groupItem.set_image(image) ## new_groupItem.connect( "activate", self.moveEventToPathFromMenu, path, new_groupPath, ) ## moveToMenu.add(new_groupItem) moveToItem.set_submenu(moveToMenu) menu.add(moveToItem) #### menu.add(gtk.SeparatorMenuItem()) #### menu.add(eventWriteMenuItem( "Cut", gtk.STOCK_CUT, self.cutEvent, path, )) menu.add(eventWriteMenuItem( "Copy", gtk.STOCK_COPY, self.copyEvent, path, )) ## if group.name == "trash": menu.add(gtk.SeparatorMenuItem()) menu.add(eventWriteMenuItem( "Delete", gtk.STOCK_DELETE, self.deleteEventFromTrash, path, )) else: pasteItem = eventWriteMenuItem( "Paste", gtk.STOCK_PASTE, self.pasteEventFromMenu, path, ) menu.add(pasteItem) pasteItem.set_sensitive(self.canPasteToGroup(group)) ## menu.add(gtk.SeparatorMenuItem()) menu.add(labelImageMenuItem( _("Move to %s") % ui.eventTrash.title, ui.eventTrash.icon, self.moveEventToTrashFromMenu, path, )) else: return menu.show_all() return menu
def genRightClickMenu(self, path): ## how about multi-selection? FIXME ## and Select _All menu item obj_list = self.getObjsByPath(path) #print(len(obj_list)) menu = gtk.Menu() if len(obj_list)==1: group = obj_list[0] if group.name == 'trash': #print('right click on trash', group.title) menu.add(eventWriteMenuItem( 'Edit', gtk.STOCK_EDIT, self.editTrash, )) menu.add(eventWriteMenuItem( 'Empty Trash', gtk.STOCK_CLEAR, self.emptyTrash, )) #menu.add(gtk.SeparatorMenuItem()) #menu.add(eventWriteMenuItem( # 'Add New Group', # gtk.STOCK_NEW, # self.addGroupBeforeSelection, #))## FIXME else: #print('right click on group', group.title) menu.add(eventWriteMenuItem( 'Edit', gtk.STOCK_EDIT, self.editGroupFromMenu, path, )) eventTypes = group.acceptsEventTypes if eventTypes is None: eventTypes = event_lib.classes.event.names if len(eventTypes) > 3: menu.add(eventWriteMenuItem( _('Add Event'), gtk.STOCK_ADD, self.addGenericEventToGroupFromMenu, path, group, )) else: for eventType in eventTypes: #if eventType == 'custom':## FIXME # desc = _('Add ') + _('Event') #else: label = _('Add ') + event_lib.classes.event.byName[eventType].desc menu.add(eventWriteMenuItem( label, gtk.STOCK_ADD, self.addEventToGroupFromMenu, path, group, eventType, label, )) pasteItem = eventWriteMenuItem( 'Paste Event', gtk.STOCK_PASTE, self.pasteEventFromMenu, path, ) menu.add(pasteItem) pasteItem.set_sensitive(self.canPasteToGroup(group)) ## if group.remoteIds: aid, remoteGid = group.remoteIds try: account = ui.eventAccounts[aid] except KeyError: myRaise() else: if account.enable: menu.add(gtk.SeparatorMenuItem()) menu.add(eventWriteMenuItem( 'Synchronize', gtk.STOCK_CONNECT,## or gtk.STOCK_REFRESH FIXME self.syncGroupFromMenu, path, account, )) #else:## FIXME ## menu.add(gtk.SeparatorMenuItem()) #menu.add(eventWriteMenuItem( # 'Add New Group', # gtk.STOCK_NEW, # self.addGroupBeforeGroup, # path, #))## FIXME menu.add(eventWriteMenuItem( 'Duplicate', gtk.STOCK_COPY, self.duplicateGroupFromMenu, path, )) ### dupAllItem = labelStockMenuItem( 'Duplicate with All Events', gtk.STOCK_COPY, self.duplicateGroupWithEventsFromMenu, path, ) menu.add(dupAllItem) dupAllItem.set_sensitive(not event_lib.readOnly and bool(group.idList)) ### menu.add(gtk.SeparatorMenuItem()) menu.add(eventWriteMenuItem( 'Delete Group', gtk.STOCK_DELETE, self.deleteGroupFromMenu, path, )) menu.add(gtk.SeparatorMenuItem()) ## #menu.add(eventWriteMenuItem( # 'Move Up', # gtk.STOCK_GO_UP, # self.moveUpFromMenu, # path, #)) #menu.add(eventWriteMenuItem( # 'Move Down', # gtk.STOCK_GO_DOWN, # self.moveDownFromMenu, # path, #)) ## menu.add(labelStockMenuItem( _('Export'), gtk.STOCK_CONVERT, self.groupExportFromMenu, group, )) ### sortItem = labelStockMenuItem( _('Sort Events'), gtk.STOCK_SORT_ASCENDING, self.groupSortFromMenu, path, ) menu.add(sortItem) sortItem.set_sensitive(not event_lib.readOnly and bool(group.idList)) ### convertItem = labelStockMenuItem( _('Convert Calendar Type'), gtk.STOCK_CONVERT, self.groupConvertModeFromMenu, group, ) menu.add(convertItem) convertItem.set_sensitive(not event_lib.readOnly and bool(group.idList)) ### for newGroupType in group.canConvertTo: menu.add(eventWriteMenuItem( _('Convert to %s')%event_lib.classes.group.byName[newGroupType].desc, None, self.groupConvertTo, group, newGroupType, )) ### bulkItem = labelStockMenuItem( _('Bulk Edit Events'), gtk.STOCK_EDIT, self.groupBulkEditFromMenu, group, path, ) menu.add(bulkItem) bulkItem.set_sensitive(not event_lib.readOnly and bool(group.idList)) ### for actionName, actionFuncName in group.actions: menu.add(eventWriteMenuItem( _(actionName), None, self.groupActionClicked, group, actionFuncName, )) elif len(obj_list) == 2: group, event = obj_list #print('right click on event', event.summary) if group.name != 'trash': menu.add(eventWriteMenuItem( 'Edit', gtk.STOCK_EDIT, self.editEventFromMenu, path, )) #### moveToItem = eventWriteMenuItem( _('Move to %s')%'...', None,## FIXME ) moveToMenu = gtk.Menu() for new_group in ui.eventGroups: if new_group.id == group.id: continue #if not new_group.enable:## FIXME # continue new_groupPath = self.trees.get_path(self.groupIterById[new_group.id]) if event.name in new_group.acceptsEventTypes: new_groupItem = ImageMenuItem() new_groupItem.set_label(new_group.title) ## image = gtk.Image() image.set_from_pixbuf(newColorCheckPixbuf(new_group.color, 20, True)) new_groupItem.set_image(image) ## new_groupItem.connect( 'activate', self.moveEventToPathFromMenu, path, new_groupPath, ) ## moveToMenu.add(new_groupItem) moveToItem.set_submenu(moveToMenu) menu.add(moveToItem) #### menu.add(gtk.SeparatorMenuItem()) #### menu.add(eventWriteMenuItem( 'Cut', gtk.STOCK_CUT, self.cutEvent, path, )) menu.add(eventWriteMenuItem( 'Copy', gtk.STOCK_COPY, self.copyEvent, path, )) ## if group.name == 'trash': menu.add(gtk.SeparatorMenuItem()) menu.add(eventWriteMenuItem( 'Delete', gtk.STOCK_DELETE, self.deleteEventFromTrash, path, )) else: pasteItem = eventWriteMenuItem( 'Paste', gtk.STOCK_PASTE, self.pasteEventFromMenu, path, ) menu.add(pasteItem) pasteItem.set_sensitive(self.canPasteToGroup(group)) ## menu.add(gtk.SeparatorMenuItem()) menu.add(labelImageMenuItem( _('Move to %s')%ui.eventTrash.title, ui.eventTrash.icon, self.moveEventToTrashFromMenu, path, )) else: return menu.show_all() return menu
def apply(self, widget=None): from scal3.ui_gtk.font_utils import gfontDecode ####### FIXME #print("fontDefault = %s" % ui.fontDefault) ui.fontDefault = gfontDecode( ud.settings.get_property("gtk-font-name") ) #print("fontDefault = %s" % ui.fontDefault) ###################### Updating pref variables ##################### for opt in self.iterAllPrefItems(): opt.updateVar() ###### DB Manager (Plugin Manager) index = [] for row in self.plugTreestore: plugI = row[0] enable = row[1] show_date = row[2] index.append(plugI) plug = core.allPlugList[plugI] if plug.loaded: try: plug.enable = enable plug.show_date = show_date except: core.myRaise(__file__) print(i, core.plugIndex) else: if enable: plug = plugin_man.loadPlugin(plug.file, enable=True) if plug: assert plug.loaded core.allPlugList[plugI] = plug core.plugIndex = index core.updatePlugins() ###### first = self.comboFirstWD.get_active() if first == 7: core.firstWeekDayAuto = True try: core.firstWeekDay = core.getLocaleFirstWeekDay() except: pass else: core.firstWeekDayAuto = False core.firstWeekDay = first ###### mode = self.comboWeekYear.get_active() if mode == 8: core.weekNumberModeAuto = True core.weekNumberMode = core.getLocaleweekNumberMode() else: core.weekNumberModeAuto = False core.weekNumberMode = mode ###### ui.cellCache.clear() # Very important # ^ specially when calTypes.primary will be changed ###### ud.updateFormatsBin() ######################## Saving Preferences ####################### for mod in calTypes: mod.save() ##################### Saving locale config locale_man.saveConf() ##################### Saving core config core.version = core.VERSION core.saveConf() del core.version ##################### Saving ui config ui.prefPagesOrder = tuple([ self.notebook.page_num(page) for page in self.prefPages ]) ui.saveConf() ##################### Saving gtk_ud config ud.saveConf() ######################### Updating GUI ########################### ud.windowList.onConfigChange() if ui.mainWin: """ if ui.bgUseDesk and ui.bgColor[3] == 255: msg = gtk.MessageDialog( buttons=gtk.ButtonsType.OK_CANCEL, message_format=_( "If you want to have a transparent calendar " + "(and see your desktop)," + "change the opacity of calendar background color!" ) ) if msg.run() == gtk.ResponseType.OK: self.colorbBg.emit("clicked") msg.destroy() """ if ui.checkNeedRestart(): d = gtk.Dialog( title=_("Need Restart " + core.APP_DESC), parent=self, flags=( gtk.DialogFlags.MODAL | gtk.DialogFlags.DESTROY_WITH_PARENT ), buttons=(gtk.STOCK_CANCEL, 0), ) d.set_keep_above(True) label = gtk.Label(_( "Some preferences need for restart %s to apply." % core.APP_DESC )) label.set_line_wrap(True) pack(d.vbox, label) resBut = d.add_button(_("_Restart"), 1) resBut.set_image(gtk.Image.new_from_stock( gtk.STOCK_REFRESH, gtk.IconSize.BUTTON, )) resBut.grab_default() d.vbox.show_all() if d.run() == 1: core.restart() else: d.destroy()