Example #1
0
def makeWidget(obj):
    """
	obj is an instance of Event, EventRule, EventNotifier or EventGroup
	"""
    cls = obj.__class__
    try:
        WidgetClass = cls.WidgetClass
    except AttributeError:
        try:
            module = __import__(
                ".".join([
                    modPrefix,
                    cls.tname,
                    cls.name,
                ]),
                fromlist=["WidgetClass"],
            )
            WidgetClass = cls.WidgetClass = module.WidgetClass
        except:
            myRaise()
            return
    widget = WidgetClass(obj)
    try:
        widget.show_all()
    except AttributeError:
        widget.show()
    widget.updateWidget()  ## FIXME
    return widget
Example #2
0
 def add(self, t0, t1, eid, debug=False):
     if debug:
         from time import strftime, localtime
         f = "%F, %T"
         print("EventSearchTree.add: %s\t%s\t%s" % (
             eid,
             strftime(f, localtime(t0)),
             strftime(f, localtime(t1)),
         ))
     ###
     if t0 == t1:
         t1 += epsTm  ## needed? FIXME
     mt = (t0 + t1) / 2.0
     dt = (t1 - t0) / 2.0
     ###
     try:
         self.root = self.addStep(
             self.root,
             t0,
             t1,
             mt,
             dt,
             eid,
         )
     except:
         myRaise()
     hp = self.byId.get(eid)
     if hp is None:
         hp = self.byId[eid] = MaxHeap()
     hp.push(mt, dt)  ## FIXME
Example #3
0
	def statusIconUpdateIcon(self, ddate):## FIXME
		from scal3.utils import toBytes
		imagePath = ui.statusIconImageHoli if ui.todayCell.holiday else ui.statusIconImage
		ext = os.path.splitext(imagePath)[1][1:].lower()
		loader = GdkPixbuf.PixbufLoader.new_with_type(ext)
		if ui.statusIconFixedSizeEnable:
			try:
				width, height = ui.statusIconFixedSizeWH
				loader.set_size(width, height)
			except:
				myRaise()
		data = open(imagePath, 'rb').read()
		if ext == 'svg':
			dayNum = locale_man.numEncode(
				ddate[2],
				mode=calTypes.primary,  # FIXME
			)
			if ui.statusIconFontFamilyEnable:
				if ui.statusIconFontFamily:
					family = ui.statusIconFontFamily
				else:
					family = ui.getFont()[0]
				dayNum = '<tspan style="font-family:%s">%s</tspan>'%(family, dayNum)
			data = data.replace(
				b'TX',
				toBytes(dayNum),
			)
		loader.write(data)
		loader.close()
		pixbuf = loader.get_pixbuf()
		self.sicon.set_from_pixbuf(pixbuf)
Example #4
0
	def add(self, t0, t1, eid, debug=False):
		if debug:
			from time import strftime, localtime
			f = "%F, %T"
			print("EventSearchTree.add: %s\t%s\t%s" % (
				eid,
				strftime(f, localtime(t0)),
				strftime(f, localtime(t1)),
			))
		###
		if t0 == t1:
			t1 += epsTm ## needed? FIXME
		mt = (t0 + t1) / 2.0
		dt = (t1 - t0) / 2.0
		###
		try:
			self.root = self.addStep(
				self.root,
				t0, t1,
				mt, dt,
				eid,
			)
		except:
			myRaise()
		hp = self.byId.get(eid)
		if hp is None:
			hp = self.byId[eid] = MaxHeap()
		hp.push(mt, dt)## FIXME
Example #5
0
 def statusIconUpdateIcon(self, ddate):## FIXME
     from scal3.utils import toBytes
     imagePath = ui.statusIconImageHoli if ui.todayCell.holiday else ui.statusIconImage
     ext = os.path.splitext(imagePath)[1][1:].lower()
     loader = GdkPixbuf.PixbufLoader.new_with_type(ext)
     if ui.statusIconFixedSizeEnable:
         try:
             width, height = ui.statusIconFixedSizeWH
             loader.set_size(width, height)
         except:
             myRaise()
     data = open(imagePath).read()
     if ext == 'svg':
         dayNum = _(ddate[2])
         if ui.statusIconFontFamilyEnable:
             if ui.statusIconFontFamily:
                 family = ui.statusIconFontFamily
             else:
                 family = ui.getFont()[0]
             dayNum = '<tspan style="font-family:%s">%s</tspan>'%(family, dayNum)
         data = data.replace(
             'TX',
             dayNum,
         )
     data = toBytes(data)
     loader.write(data)
     loader.close()
     pixbuf = loader.get_pixbuf()
     self.sicon.set_from_pixbuf(pixbuf)
Example #6
0
def makeWidget(obj):
	"""
	obj is an instance of Event, EventRule, EventNotifier or EventGroup
	"""
	cls = obj.__class__
	try:
		WidgetClass = cls.WidgetClass
	except AttributeError:
		try:
			module = __import__(
				".".join([
					modPrefix,
					cls.tname,
					cls.name,
				]),
				fromlist=["WidgetClass"],
			)
			WidgetClass = cls.WidgetClass = module.WidgetClass
		except:
			myRaise()
			return
	widget = WidgetClass(obj)
	try:
		widget.show_all()
	except AttributeError:
		widget.show()
	widget.updateWidget()## FIXME
	return widget
Example #7
0
	def cleanup(self):
		for fname in os.listdir(tmpDir):
			if not fname.startswith(self.imNamePrefix):
				continue
			try:
				os.remove(join(tmpDir, fname))
			except:
				myRaise()
Example #8
0
def set_tooltip(widget, text):
    try:
        widget.set_tooltip_text(text)  ## PyGTK 2.12 or above
    except AttributeError:
        try:
            widget.set_tooltip(gtk.Tooltips(), text)
        except:
            myRaise(__file__)
Example #9
0
 def cleanup(self):
     for fname in os.listdir(tmpDir):
         if not fname.startswith(self.imNamePrefix):
             continue
         try:
             os.remove(join(tmpDir, fname))
         except:
             myRaise()
Example #10
0
 def setText(self, text):
     try:
         num = float(textNumDecode(text))
     except:
         myRaise()
         self.setDefault()
     else:
         self.setValue(num)
Example #11
0
def set_tooltip(widget, text):
    try:
        widget.set_tooltip_text(text)## PyGTK 2.12 or above
    except AttributeError:
        try:
            widget.set_tooltip(gtk.Tooltips(), text)
        except:
            myRaise(__file__)
Example #12
0
def imageFromFile(path):  ## the file must exist
    if not isabs(path):
        path = join(pixDir, path)
    im = gtk.Image()
    try:
        im.set_from_file(path)
    except:
        myRaise()
    return im
Example #13
0
def imageFromFile(path):## the file must exist
    if not isabs(path):
        path = join(pixDir, path)
    im = gtk.Image()
    try:
        im.set_from_file(path)
    except:
        myRaise()
    return im
Example #14
0
def pixbufFromFile(path):  ## the file may not exist
    if not path:
        return None
    if not isabs(path):
        path = join(pixDir, path)
    try:
        return GdkPixbuf.Pixbuf.new_from_file(path)
    except:
        myRaise()
        return None
Example #15
0
def pixbufFromFile(path):## the file may not exist
    if not path:
        return None
    if not isabs(path):
        path = join(pixDir, path)
    try:
        return GdkPixbuf.Pixbuf.new_from_file(path)
    except:
        myRaise()
        return None
Example #16
0
def checkAndSaveJsonLockFile(fpath):
    locked = False
    if isfile(fpath):
        try:
            text = open(fpath).read()
        except:
            myRaise()
            locked = True
        else:
            try:
                data = jsonToData(text)
            except:
                print('lock file %s is not valid' % fpath)
            else:
                try:
                    pid = data['pid']
                    cmd = data['cmd']
                except:
                    print('lock file %s is not valid' % fpath)
                else:
                    try:
                        proc = psutil.Process(pid)
                    except psutil.NoSuchProcess:
                        print('lock file %s: pid %s does not exist' %
                              (fpath, pid))
                    else:
                        if get_cmdline(proc) == cmd:
                            locked = True
                        else:
                            print('lock file %s: cmd does match: %s != %s' %
                                  (fpath, get_cmdline(proc), cmd))
    elif exists(fpath):
        ## what to do? FIXME
        pass
    ######
    if not locked:
        my_pid = os.getpid()
        my_proc = psutil.Process(my_pid)
        my_cmd = get_cmdline(my_proc)
        my_text = dataToPrettyJson(
            OrderedDict([
                ('pid', my_pid),
                ('cmd', my_cmd),
                ('time', now()),
            ]))
        try:
            open(fpath, 'w').write(my_text)
        except Exception as e:
            print('failed to write lock file %s: %s' % (fpath, e))
        else:
            atexit.register(os.remove, fpath)
    ######
    return locked
Example #17
0
	def quit(self, widget=None, event=None):
		try:
			ui.saveLiveConf()
		except:
			myRaise()
		if self.statusIconMode>1 and self.sicon:
			self.sicon.set_visible(False) ## needed for windows ## before or after main_quit ?
		self.destroy()
		######
		core.stopRunningThreads()
		######
		return gtk.main_quit()
Example #18
0
 def quit(self, widget=None, event=None):
     try:
         ui.saveLiveConf()
     except:
         myRaise()
     if self.statusIconMode>1 and self.sicon:
         self.sicon.set_visible(False) ## needed for windows ## before or after main_quit ?
     self.destroy()
     ######
     core.stopRunningThreads()
     ######
     return gtk.main_quit()
Example #19
0
	def setText(self, text):
		if text == "":
			self.setDefault()
			return
		try:
			num = int(float(textNumDecode(text)))
		except:
			print("IntField: invalid text = %r" % text)
			myRaise()
			self.setDefault()
		else:
			self.setValue(num)
Example #20
0
	def getLoadedObj(self):
		try:
			module = __import__(
				self.moduleName,
				fromlist=["CalObj"],
			)
			CalObj = module.CalObj
		except:
			myRaise()
			return
		obj = CalObj()
		obj.enable = self.enable
		return obj
Example #21
0
 def getLoadedObj(self):
     try:
         module = __import__(
             self.moduleName,
             fromlist=['CalObj'],
         )
         CalObj = module.CalObj
     except:
         myRaise()
         return
     obj = CalObj()
     obj.enable = self.enable
     return obj
Example #22
0
 def doAction(self):
     container = self._container
     if self.iconRadio.get_active():
         chType = self.iconChangeCombo.get_active()
         if chType != 0:
             icon = self.iconSelect.get_filename()
             for event in container:
                 if not (chType == 2 and event.icon):
                     event.icon = icon
                     event.afterModify()
                     event.save()
     elif self.timeZoneRadio.get_active():
         chType = self.timeZoneChangeCombo.get_active()
         timeZone = self.timeZoneInput.get_text()
         if chType != 0:
             try:
                 natz.timezone(timeZone)
             except:
                 myRaise('Invalid Time Zone "%s"' % timeZone)
             else:
                 for event in container:
                     if not (chType == 2 and event.timeZone):
                         event.timeZone = timeZone
                         event.afterModify()
                         event.save()
     else:
         chType = self.textChangeCombo.get_active()
         if chType != 0:
             text1 = self.textInput1.get_text()
             text2 = self.textInput2.get_text()
             if self.summaryRadio.get_active():
                 for event in container:
                     if chType == 1:
                         event.summary = text1 + event.summary
                     elif chType == 2:
                         event.summary = event.summary + text1
                     elif chType == 3:
                         event.summary = event.summary.replace(text1, text2)
                     event.afterModify()
                     event.save()
             elif self.descriptionRadio.get_active():
                 for event in container:
                     if chType == 1:
                         event.description = text1 + event.description
                     elif chType == 2:
                         event.description = event.description + text1
                     elif chType == 3:
                         event.description = event.description.replace(
                             text1, text2)
                     event.afterModify()
                     event.save()
Example #23
0
File: ui.py Project: ilius/starcal
def parseDroppedDate(text):
	part = text.split("/")
	if len(part) == 3:
		try:
			part[0] = numDecode(part[0])
			part[1] = numDecode(part[1])
			part[2] = numDecode(part[2])
		except:
			myRaise(__file__)
			return None
		maxPart = max(part)
		if maxPart > 999:
			minMax = (
				(1000, 2100),
				(1, 12),
				(1, 31),
			)
			formats = (
				[0, 1, 2],
				[1, 2, 0],
				[2, 1, 0],
			)
			for format in formats:
				for i in range(3):
					valid = True
					f = format[i]
					if not (minMax[f][0] <= part[i] <= minMax[f][1]):
						valid = False
						break
				if valid:
					# "format" must be list because we use method "index"
					year = part[format.index(0)]
					month = part[format.index(1)]
					day = part[format.index(2)]
					break
		else:
			valid = 0 <= part[0] <= 99 and \
				1 <= part[1] <= 12 and \
				1 <= part[2] <= 31
			###
			year = 2000 + part[0]  # FIXME
			month = part[1]
			day = part[2]
		if not valid:
			return None
	else:
		return None
	# FIXME: when drag from a persian GtkCalendar with format %y/%m/%d
	#if year < 100:
	#	year += 2000
	return (year, month, day)
Example #24
0
def parseDroppedDate(text):
	part = text.split("/")
	if len(part) == 3:
		try:
			part[0] = numDecode(part[0])
			part[1] = numDecode(part[1])
			part[2] = numDecode(part[2])
		except:
			myRaise(__file__)
			return None
		maxPart = max(part)
		if maxPart > 999:
			minMax = (
				(1000, 2100),
				(1, 12),
				(1, 31),
			)
			formats = (
				[0, 1, 2],
				[1, 2, 0],
				[2, 1, 0],
			)
			for format in formats:
				for i in range(3):
					valid = True
					f = format[i]
					if not (minMax[f][0] <= part[i] <= minMax[f][1]):
						valid = False
						break
				if valid:
					# "format" must be list because we use method "index"
					year = part[format.index(0)]
					month = part[format.index(1)]
					day = part[format.index(2)]
					break
		else:
			valid = 0 <= part[0] <= 99 and \
				1 <= part[1] <= 12 and \
				1 <= part[2] <= 31
			###
			year = 2000 + part[0]  # FIXME
			month = part[1]
			day = part[2]
		if not valid:
			return None
	else:
		return None
	# FIXME: when drag from a persian GtkCalendar with format %y/%m/%d
	#if year < 100:
	#	year += 2000
	return (year, month, day)
Example #25
0
	def doAction(self):
		container = self._container
		if self.iconRadio.get_active():
			chType = self.iconChangeCombo.get_active()
			if chType != 0:
				icon = self.iconSelect.get_filename()
				for event in container:
					if not (chType == 2 and event.icon):
						event.icon = icon
						event.afterModify()
						event.save()
		elif self.timeZoneRadio.get_active():
			chType = self.timeZoneChangeCombo.get_active()
			timeZone = self.timeZoneInput.get_text()
			if chType != 0:
				try:
					natz.gettz(timeZone)
				except:
					myRaise("Invalid Time Zone \"%s\"" % timeZone)
				else:
					for event in container:
						if not (chType == 2 and event.timeZone):
							event.timeZone = timeZone
							event.afterModify()
							event.save()
		else:
			chType = self.textChangeCombo.get_active()
			if chType != 0:
				text1 = self.textInput1.get_text()
				text2 = self.textInput2.get_text()
				if self.summaryRadio.get_active():
					for event in container:
						if chType == 1:
							event.summary = text1 + event.summary
						elif chType == 2:
							event.summary = event.summary + text1
						elif chType == 3:
							event.summary = event.summary.replace(text1, text2)
						event.afterModify()
						event.save()
				elif self.descriptionRadio.get_active():
					for event in container:
						if chType == 1:
							event.description = text1 + event.description
						elif chType == 2:
							event.description = event.description + text1
						elif chType == 3:
							event.description = event.description.replace(text1, text2)
						event.afterModify()
						event.save()
Example #26
0
def checkAndSaveJsonLockFile(fpath):
	locked = False
	if isfile(fpath):
		try:
			text = open(fpath).read()
		except:
			myRaise()
			locked = True
		else:
			try:
				data = jsonToData(text)
			except:
				print('lock file %s is not valid'%fpath)
			else:
				try:
					pid = data['pid']
					cmd = data['cmd']
				except:
					print('lock file %s is not valid'%fpath)
				else:
					try:
						proc = psutil.Process(pid)
					except psutil.NoSuchProcess:
						print('lock file %s: pid %s does not exist'%(fpath, pid))
					else:
						if get_cmdline(proc) == cmd:
							locked = True
						else:
							print('lock file %s: cmd does match: %s != %s'%(fpath, get_cmdline(proc), cmd))
	elif exists(fpath):
		## what to do? FIXME
		pass
	######
	if not locked:
		my_pid = os.getpid()
		my_proc = psutil.Process(my_pid)
		my_cmd = get_cmdline(my_proc)
		my_text = dataToPrettyJson(OrderedDict([
			('pid', my_pid),
			('cmd', my_cmd),
			('time', now()),
		]))
		try:
			open(fpath, 'w').write(my_text)
		except Exception as e:
			print('failed to write lock file %s: %s'%(fpath, e))
		else:
			atexit.register(os.remove, fpath)
	######
	return locked
Example #27
0
 def delete(self, eid):
     hp = self.byId.get(eid)
     if hp is None:
         return 0
     else:
         n = 0
         for mt, dt in hp.getAll():
             try:
                 self.root = self.deleteStep(self.root, mt, dt, eid)
             except:
                 myRaise()
             else:
                 n += 1
         del self.byId[eid]
         return n
Example #28
0
	def delete(self, eid):
		hp = self.byId.get(eid)
		if hp is None:
			return 0
		else:
			n = 0
			for mt, dt in hp.getAll():
				try:
					self.root = self.deleteStep(self.root, mt, dt, eid)
				except:
					myRaise()
				else:
					n += 1
			del self.byId[eid]
			return n
Example #29
0
 def delete(self, eid):
     try:
         hp = self.byId[eid]
     except KeyError:
         return 0
     else:
         n = 0
         for mt, dt in hp.getAll():
             try:
                 self.root = self.deleteStep(self.root, mt, dt, eid)
             except:
                 myRaise()
             else:
                 n += 1
         del self.byId[eid]
         return n
Example #30
0
	def delete(self, eid):
		try:
			hp = self.byId[eid]
		except KeyError:
			return 0
		else:
			n = 0
			for mt, dt in hp.getAll():
				try:
					self.root = self.deleteStep(self.root, mt, dt, eid)
				except:
					myRaise()
				else:
					n += 1
			del self.byId[eid]
			return n
Example #31
0
 def treevCursorChanged(self, selection):
     if self.activeOptionsWidget:
         try:
             self.vbox_l.remove(self.activeOptionsWidget)
         except:
             myRaise(__file__)
         self.activeOptionsWidget = None
     index_list = self.treev.get_cursor()[0]
     if not index_list:
         return
     item = self.getItemByPath(index_list)
     item.optionsWidgetCreate()
     if item.optionsWidget:
         item.optionsWidget.set_sensitive(item.enable)
         self.activeOptionsWidget = item.optionsWidget
         pack(self.vbox_l, item.optionsWidget)
         item.optionsWidget.show()
Example #32
0
def decodeRemoteEvent(remoteEventFull, accountId, group):
	"""
	remoteEventFull is dict

	return (event, error)
	where event is instance of event_lib.Event, or None
	and error is string or None
	"""
	try:
		eventType = remoteEventFull["eventType"]
	except KeyError:
		return None, "bad remoteEventFull: missing \"eventType\""
	try:
		remoteEvent = remoteEventFull["data"]
	except KeyError:
		return None, "bad remoteEventFull: missing \"data\""
	try:
		decoder = remoteEventTypeDecoders[eventType]
	except KeyError:
		return None, "bad remoteEventFull: unkown type \"%s\"" % eventType
	eventData = {
		"summary": remoteEvent["summary"],
		"description": remoteEvent["description"],
		"calType": remoteEvent["calType"],
		"icon": remoteEvent["icon"],
		"timeZone": remoteEvent["timeZone"],
		"timeZoneEnable": remoteEvent["timeZoneEnable"],
	}
	try:
		eventTypeData = decoder(remoteEvent)
	except Exception as e:
		myRaise()
		return None, "bad remoteEvent: %s" % e
	eventData.update(eventTypeData)
	event = event_lib.classes.event.byName[eventType]()
	event.setData(eventData)
	event.remoteIds = (
		accountId,
		remoteEventFull["groupId"],  # remoteGroupId,
		remoteEventFull["eventId"],
		remoteEventFull["sha1"],
	)
	return event, None
Example #33
0
def decodeRemoteEvent(remoteEventFull, accountId, group):
    """
	remoteEventFull is dict

	return (event, error)
	where event is instance of event_lib.Event, or None
	and error is string or None
	"""
    try:
        eventType = remoteEventFull["eventType"]
    except KeyError:
        return None, "bad remoteEventFull: missing \"eventType\""
    try:
        remoteEvent = remoteEventFull["data"]
    except KeyError:
        return None, "bad remoteEventFull: missing \"data\""
    try:
        decoder = remoteEventTypeDecoders[eventType]
    except KeyError:
        return None, "bad remoteEventFull: unkown type \"%s\"" % eventType
    eventData = {
        "summary": remoteEvent["summary"],
        "description": remoteEvent["description"],
        "calType": remoteEvent["calType"],
        "icon": remoteEvent["icon"],
        "timeZone": remoteEvent["timeZone"],
        "timeZoneEnable": remoteEvent["timeZoneEnable"],
    }
    try:
        eventTypeData = decoder(remoteEvent)
    except Exception as e:
        myRaise()
        return None, "bad remoteEvent: %s" % e
    eventData.update(eventTypeData)
    event = event_lib.classes.event.byName[eventType]()
    event.setData(eventData)
    event.remoteIds = (
        accountId,
        remoteEventFull["groupId"],  # remoteGroupId,
        remoteEventFull["eventId"],
        remoteEventFull["sha1"],
    )
    return event, None
Example #34
0
	def onExposeEvent(self, widget=None, event=None):
		cr = self.getContext()
		self.drawBg(cr)
		###
		w = self.get_allocation().width
		h = self.get_allocation().height
		###
		rowH = h/7.0
		itemW = w - ui.wcalPadding
		for i in range(7):
			c = self.wcal.status[i]
			iconList = c.getWeekEventIcons()
			if not iconList:
				continue
			n = len(iconList)
			scaleFact = min(
				1.0,
				h / self.maxPixH,
				w / (n * self.maxPixW),
			)
			x0 = (w/scaleFact - (n-1)*self.maxPixW) / 2.0
			y0 = (2*i + 1) * h / (14.0*scaleFact)
			if rtl:
				iconList.reverse()## FIXME
			for iconIndex, icon in enumerate(iconList):
				try:
					pix = GdkPixbuf.Pixbuf.new_from_file(icon)
				except:
					myRaise(__file__)
					continue
				pix_w = pix.get_width()
				pix_h = pix.get_height()
				x1 = x0 + iconIndex*self.maxPixW - pix_w/2.0
				y1 = y0 - pix_h/2.0
				cr.scale(scaleFact, scaleFact)
				gdk.cairo_set_source_pixbuf(cr, pix, x1, y1)
				cr.rectangle(x1, y1, pix_w, pix_h)
				cr.fill()
				cr.scale(1.0/scaleFact, 1.0/scaleFact)
Example #35
0
	def onExposeEvent(self, widget=None, event=None):
		cr = self.getContext()
		self.drawBg(cr)
		###
		w = self.get_allocation().width
		h = self.get_allocation().height
		###
		rowH = h / 7
		itemW = w - ui.wcalPadding
		for i in range(7):
			c = self.wcal.status[i]
			iconList = c.getWeekEventIcons()
			if not iconList:
				continue
			n = len(iconList)
			scaleFact = min(
				1.0,
				h / self.maxPixH,
				w / (n * self.maxPixW),
			)
			x0 = (w / scaleFact - (n - 1) * self.maxPixW) / 2
			y0 = (2 * i + 1) * h / (14 * scaleFact)
			if rtl:
				iconList.reverse()## FIXME
			for iconIndex, icon in enumerate(iconList):
				try:
					pix = GdkPixbuf.Pixbuf.new_from_file(icon)
				except:
					myRaise(__file__)
					continue
				pix_w = pix.get_width()
				pix_h = pix.get_height()
				x1 = x0 + iconIndex * self.maxPixW - pix_w / 2
				y1 = y0 - pix_h / 2
				cr.scale(scaleFact, scaleFact)
				gdk.cairo_set_source_pixbuf(cr, pix, x1, y1)
				cr.rectangle(x1, y1, pix_w, pix_h)
				cr.fill()
				cr.scale(1 / scaleFact, 1 / scaleFact)
Example #36
0
def setActionFuncs(obj):
    """
	obj is an instance of EventGroup
	"""
    cls = obj.__class__
    try:
        module = __import__(
            ".".join([
                modPrefix,
                cls.tname,
                cls.name,
            ]),
            fromlist=["WidgetClass"],
        )
    except:
        myRaise()
        return
    else:
        for actionName, actionFuncName in cls.actions:
            actionFunc = getattr(module, actionFuncName, None)
            if actionFunc is not None:
                print("setting %s.%s" % (cls.__name__, actionFuncName))
                setattr(cls, actionFuncName, actionFunc)
Example #37
0
	def statusIconUpdateIcon(self, ddate):  # FIXME
		from scal3.utils import toBytes
		imagePath = (
			ui.statusIconImageHoli if ui.todayCell.holiday
			else ui.statusIconImage
		)
		ext = os.path.splitext(imagePath)[1][1:].lower()
		loader = GdkPixbuf.PixbufLoader.new_with_type(ext)
		if ui.statusIconFixedSizeEnable:
			try:
				width, height = ui.statusIconFixedSizeWH
				loader.set_size(width, height)
			except:
				myRaise()
		data = open(imagePath, "rb").read()
		if ext == "svg":
			dayNum = locale_man.numEncode(
				ddate[2],
				mode=calTypes.primary,  # FIXME
			)
			if ui.statusIconFontFamilyEnable:
				if ui.statusIconFontFamily:
					family = ui.statusIconFontFamily
				else:
					family = ui.getFont()[0]
				dayNum = "<tspan style=\"font-family:%s\">%s</tspan>" % (
					family,
					dayNum,
				)
			data = data.replace(
				b"TX",
				toBytes(dayNum),
			)
		loader.write(data)
		loader.close()
		pixbuf = loader.get_pixbuf()
		self.sicon.set_from_pixbuf(pixbuf)
Example #38
0
	def setData(self, data):
		for (name, enable) in data['items']:
			try:
				item = self.defaultItemsDict[name]
			except KeyError:
				myRaise()
			else:
				item.enable = enable
				self.setupItemSignals(item)
				self.appendItem(item)
		###
		iconSize = data['iconSize']
		for (i, item) in enumerate(ud.iconSizeList):
			if item[0]==iconSize:
				self.iconSizeCombo.set_active(i)
		self.setIconSizeName(iconSize)
		###
		styleNum = self.styleList.index(data['style'])
		self.styleCombo.set_active(styleNum)
		self.set_style(styleNum)
		###
		bb = data.get('buttonsBorder', 0)
		self.buttonsBorderSpin.set_value(bb)
		self.setButtonsBorder(bb)
Example #39
0
 def setData(self, data):
     for (name, enable) in data['items']:
         try:
             item = self.defaultItemsDict[name]
         except KeyError:
             myRaise()
         else:
             item.enable = enable
             self.setupItemSignals(item)
             self.appendItem(item)
     ###
     iconSize = data['iconSize']
     for (i, item) in enumerate(ud.iconSizeList):
         if item[0]==iconSize:
             self.iconSizeCombo.set_active(i)
     self.setIconSizeName(iconSize)
     ###
     styleNum = self.styleList.index(data['style'])
     self.styleCombo.set_active(styleNum)
     self.set_style(styleNum)
     ###
     bb = data.get('buttonsBorder', 0)
     self.buttonsBorderSpin.set_value(bb)
     self.setButtonsBorder(bb)
Example #40
0
	def __init__(self, statusIconMode, **kwargs):
		gtk.Dialog.__init__(self, **kwargs)
		self.set_title(_("Preferences"))
		self.connect("delete-event", self.onDelete)
		#self.set_has_separator(False)
		#self.set_skip_taskbar_hint(True)
		###
		dialog_add_button(
			self,
			gtk.STOCK_CANCEL,
			_("_Cancel"),
			1,
			self.cancel,
		)
		dialog_add_button(
			self,
			gtk.STOCK_APPLY,
			_("_Apply"),
			2,
			self.apply,
		)
		okB = dialog_add_button(
			self,
			gtk.STOCK_OK,
			_("_OK"),
			3,
			self.ok,
			tooltip=_("Apply and Close"),
		)
		okB.grab_default()  # FIXME
		#okB.grab_focus()  # FIXME
		##############################################
		self.localePrefItems = []
		self.corePrefItems = []
		self.uiPrefItems = []
		self.gtkPrefItems = []  # FIXME
		#####
		self.prefPages = []
		################################ Tab 1 (General) #####################
		vbox = gtk.VBox()
		vbox.label = _("_General")
		vbox.icon = "preferences-other.png"
		self.prefPages.append(vbox)
		hbox = gtk.HBox(spacing=3)
		pack(hbox, gtk.Label(_("Language")))
		itemLang = LangPrefItem()
		self.localePrefItems.append(itemLang)
		###
		pack(hbox, itemLang.getWidget())
		if langSh != "en":
			pack(hbox, gtk.Label("Language"))
		pack(vbox, hbox)
		##########################
		hbox = gtk.HBox()
		frame = gtk.Frame()
		frame.set_label(_("Calendar Types"))
		itemCals = AICalsPrefItem()
		self.corePrefItems.append(itemCals)
		frame.add(itemCals.getWidget())
		pack(hbox, frame)
		pack(hbox, gtk.Label(""), 1, 1)
		hbox.set_border_width(5)
		#frame.set_border_width(5)
		pack(vbox, hbox, 1, 1)
		##########################
		if statusIconMode != 1:
			hbox = gtk.HBox(spacing=3)
			item = CheckStartupPrefItem()
			self.uiPrefItems.append(item)
			pack(hbox, item.getWidget(), 1, 1)
			pack(vbox, hbox)
			########################
			item = CheckPrefItem(
				ui,
				"showMain",
				_("Show main window on start"),
			)
			self.uiPrefItems.append(item)
			pack(vbox, item.getWidget())
		##########################
		item = CheckPrefItem(
			ui,
			"winTaskbar",
			_("Window in Taskbar"),
		)
		self.uiPrefItems.append(item)
		hbox = gtk.HBox(spacing=3)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		###########
		pack(vbox, hbox)
		##########################
		try:
			import scal3.ui_gtk.starcal_appindicator
		except (ImportError, ValueError):
			pass
		else:
			item = CheckPrefItem(
				ui,
				"useAppIndicator",
				_("Use AppIndicator"),
			)
			self.uiPrefItems.append(item)
			hbox = gtk.HBox(spacing=3)
			pack(hbox, item.getWidget())
			pack(hbox, gtk.Label(""), 1, 1)
			pack(vbox, hbox)
		##########################
		hbox = gtk.HBox(spacing=3)
		pack(hbox, gtk.Label(_("Show Digital Clock:")))
		pack(hbox, gtk.Label(""), 1, 1)
		#item = CheckPrefItem(
		#	ui,
		#	"showDigClockTb",
		#	_("On Toolbar"),
		#)  # FIXME
		#self.uiPrefItems.append(item)
		#pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		if statusIconMode == 1:
			item = CheckPrefItem(
				ui,
				"showDigClockTr",
				_("On Applet"),
				"Panel Applet",
			)
		else:
			item = CheckPrefItem(
				ui,
				"showDigClockTr",
				_("On Status Icon"),
				"Notification Area",
			)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		pack(vbox, hbox)
		################################ Tab 2 (Appearance) ##################
		vbox = gtk.VBox()
		# A is for Apply, P is for Plugins, R is for Regional, C is for Cancel, only "n" is left!
		vbox.label = _("Appeara_nce")
		vbox.icon = "preferences-desktop-theme.png"
		self.prefPages.append(vbox)
		########
		hbox = gtk.HBox(spacing=2)
		###
		customCheckItem = CheckPrefItem(
			ui,
			"fontCustomEnable",
			_("Application Font"),
		)
		self.uiPrefItems.append(customCheckItem)
		pack(hbox, customCheckItem.getWidget())
		###
		customItem = FontPrefItem(ui, "fontCustom", self)
		self.uiPrefItems.append(customItem)
		pack(hbox, customItem.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		customCheckItem.syncSensitive(customItem.getWidget())
		pack(vbox, hbox)
		########################### Theme #####################
		#hbox = gtk.HBox(spacing=3)
		#item = CheckPrefItem(ui, 'bgUseDesk', _('Use Desktop Background'))
		#self.uiPrefItems.append(item)
		#pack(hbox, item.getWidget())
		#pack(hbox, gtk.Label(''), 1, 1)
		#pack(vbox, hbox)
		#####################
		hbox = gtk.HBox(spacing=3)
		lab = gtk.Label("<b>%s:</b> " % _("Colors"))
		lab.set_use_markup(True)
		pack(hbox, lab)
		pack(hbox, gtk.Label(""), 1, 1)
		###
		pack(hbox, gtk.Label(_("Background")))
		item = ColorPrefItem(ui, "bgColor", True)
		self.uiPrefItems.append(item)
		self.colorbBg = item.getWidget() ## FIXME
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		###
		pack(hbox, gtk.Label(_("Border")))
		item = ColorPrefItem(ui, "borderColor", True)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		###
		pack(hbox, gtk.Label(_("Cursor")))
		item = ColorPrefItem(ui, "cursorOutColor", False)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		###
		pack(hbox, gtk.Label(_("Cursor BG")))
		item = ColorPrefItem(ui, "cursorBgColor", True)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		###
		pack(hbox, gtk.Label(_("Today")))
		item = ColorPrefItem(ui, "todayCellColor", True)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		###
		pack(vbox, hbox)
		####################
		hbox = gtk.HBox(spacing=3)
		lab = gtk.Label("<b>%s:</b> " % _("Font Colors"))
		lab.set_use_markup(True)
		pack(hbox, lab)
		pack(hbox, gtk.Label(""), 1, 1)
		####
		pack(hbox, gtk.Label(_("Normal")))
		item = ColorPrefItem(ui, "textColor", False)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		###
		pack(hbox, gtk.Label(_("Holiday")))
		item = ColorPrefItem(ui, "holidayColor", False)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		###
		pack(hbox, gtk.Label(_("Inactive Day")))
		item = ColorPrefItem(ui, "inactiveColor", True)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		####
		pack(hbox, gtk.Label(_("Border")))
		item = ColorPrefItem(ui, "borderTextColor", False)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		####
		pack(vbox, hbox)
		###################
		hbox = gtk.HBox(spacing=1)
		label = gtk.Label("<b>%s</b>:" % _("Cursor"))
		label.set_use_markup(True)
		pack(hbox, label)
		pack(hbox, gtk.Label(""), 1, 1)
		pack(hbox, gtk.Label(_("Diameter Factor")))
		item = SpinPrefItem(ui, "cursorDiaFactor", 0, 1, 2)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		###
		pack(hbox, gtk.Label(""), 1, 1)
		pack(hbox, gtk.Label(_("Rounding Factor")))
		item = SpinPrefItem(ui, "cursorRoundingFactor", 0, 1, 2)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		###
		pack(vbox, hbox)
		###################
		# the header label of gtk.Expander in gtk3 is always on the left (even in RTL mode)
		# that's why we use gtk.Frame instead
		exp = gtk.Frame()
		exp.set_border_width(5)
		label = gtk.Label("<b>%s</b>" % _("Status Icon"))
		label.set_use_markup(True)
		exp.set_label_widget(label)
		expVbox = gtk.VBox(spacing=1)
		expVbox.set_border_width(5)
		exp.add(expVbox)
		sgroup = gtk.SizeGroup(gtk.SizeGroupMode.HORIZONTAL)
		####
		hbox = gtk.HBox(spacing=1)
		pack(hbox, gtk.Label(" "))
		label = gtk.Label(_("Normal Days"))
		sgroup.add_widget(label)
		pack(hbox, label)
		item = FileChooserPrefItem(
			ui,
			"statusIconImage",
			title=_("Select Icon"),
			currentFolder=pixDir,
			defaultVarName="statusIconImageDefault",
		)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget(), 1, 1)
		pack(expVbox, hbox)
		####
		hbox = gtk.HBox(spacing=1)
		pack(hbox, gtk.Label(" "))
		label = gtk.Label(_("Holidays"))
		sgroup.add_widget(label)
		pack(hbox, label)
		item = FileChooserPrefItem(
			ui,
			"statusIconImageHoli",
			title=_("Select Icon"),
			currentFolder=pixDir,
			defaultVarName="statusIconImageHoliDefault",
		)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget(), 1, 1)
		pack(expVbox, hbox)
		####
		hbox = gtk.HBox(spacing=1)
		pack(hbox, gtk.Label(" "))
		checkItem = CheckPrefItem(
			ui,
			"statusIconFontFamilyEnable",
			label=_("Change font family to"),
			#tooltip=_("In SVG files"),
		)
		self.uiPrefItems.append(checkItem)
		#sgroup.add_widget(checkItem.getWidget())
		pack(hbox, checkItem.getWidget())
		item = FontFamilyPrefItem(
			ui,
			"statusIconFontFamily",
		)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget(), 1, 1)
		pack(expVbox, hbox)
		####
		hbox = gtk.HBox(spacing=1)
		pack(hbox, gtk.Label(" "))
		checkItem = CheckPrefItem(
			ui,
			"statusIconFixedSizeEnable",
			label=_("Fixed Size"),
			#tooltip=_(""),
		)
		self.uiPrefItems.append(checkItem)
		#sgroup.add_widget(checkItem.getWidget())
		pack(hbox, checkItem.getWidget())
		pack(hbox, gtk.Label(" "))
		item = WidthHeightPrefItem(
			ui,
			"statusIconFixedSizeWH",
			999,
		)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget(), 1, 1)
		pack(expVbox, hbox)
		########
		checkItem.syncSensitive(item.getWidget(), reverse=False)
		####
		pack(vbox, exp)
		################################ Tab 3 (Regional) ###################
		vbox = gtk.VBox()
		vbox.label = _("_Regional")
		vbox.icon = "preferences-desktop-locale.png"
		self.prefPages.append(vbox)
		######
		sgroup = gtk.SizeGroup(gtk.SizeGroupMode.HORIZONTAL)
		######
		hbox = gtk.HBox(spacing=5)
		label = gtk.Label(_("Date Format"))
		label.set_alignment(0, 0.5)
		pack(hbox, label)
		sgroup.add_widget(label)
		#pack(hbox, gtk.Label(""), 1, 1)
		item = ComboEntryTextPrefItem(ud, "dateFormat", (
			"%Y/%m/%d",
			"%Y-%m-%d",
			"%y/%m/%d",
			"%y-%m-%d",
			"%OY/%Om/%Od",
			"%OY-%Om-%Od",
			"%m/%d",
			"%m/%d/%Y",
		))
		self.gtkPrefItems.append(item)
		pack(hbox, item.getWidget(), 1, 1)
		pack(vbox, hbox)
		########
		hbox = gtk.HBox(spacing=3)
		pack(hbox, gtk.Label(_("First day of week")))
		##item = ComboTextPrefItem( ## FIXME
		self.comboFirstWD = gtk.ComboBoxText()
		for item in core.weekDayName:
			self.comboFirstWD.append_text(item)
		self.comboFirstWD.append_text(_("Automatic"))
		self.comboFirstWD.connect("changed", self.comboFirstWDChanged)
		pack(hbox, self.comboFirstWD)
		pack(vbox, hbox)
		#########
		hbox0 = gtk.HBox(spacing=0)
		pack(hbox0, gtk.Label(_("Holidays") + "    "))
		item = WeekDayCheckListPrefItem(core, "holidayWeekDays")
		self.corePrefItems.append(item)
		self.holiWDItem = item ## Holiday Week Days Item
		pack(hbox0, item.getWidget(), 1, 1)
		pack(vbox, hbox0)
		#########
		hbox = gtk.HBox(spacing=3)
		pack(hbox, gtk.Label(_("First week of year containts")))
		combo = gtk.ComboBoxText()
		texts = [
			_("First %s of year") % name
			for name in core.weekDayName
		] + [
			_("First day of year"),
		]
		texts[4] += " (ISO 8601)" ## FIXME
		for text in texts:
			combo.append_text(text)
		#combo.append_text(_("Automatic"))## (as Locale)  # FIXME
		pack(hbox, combo)
		pack(hbox, gtk.Label(""), 1, 1)
		pack(vbox, hbox)
		self.comboWeekYear = combo
		#########
		hbox = gtk.HBox(spacing=3)
		item = CheckPrefItem(
			locale_man,
			"enableNumLocale",
			_("Numbers Localization"),
		)
		self.localePrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		pack(vbox, hbox)
		##################################################
		################################
		options = []
		for mod in calTypes:
			for opt in mod.options:
				if opt[0] == "button":
					try:
						optl = ModuleOptionButton(opt[1:])
					except:
						myRaise()
						continue
				else:
					optl = ModuleOptionItem(mod, opt)
				options.append(optl)
				pack(vbox, optl.getWidget())
		self.moduleOptions = options
		################################ Tab 4 (Advanced) ###################
		vbox = gtk.VBox()
		vbox.label = _("A_dvanced")
		vbox.icon = "applications-system.png"
		self.prefPages.append(vbox)
		######
		hbox = gtk.HBox(spacing=5)
		#pack(hbox, gtk.Label(""), 1, 1)
		label = gtk.Label(_("Digital Clock Format"))
		label.set_alignment(0, 0.5)
		pack(hbox, label)
		#sgroup.add_widget(label)
		item = ComboEntryTextPrefItem(ud, "clockFormat", (
			"%T",
			"%X",
			"%Y/%m/%d - %T",
			"%OY/%Om/%Od - %X",
			"<i>%Y/%m/%d</i> - %T",
			"<b>%T</b>",
			"<b>%X</b>",
			"%H:%M",
			"<b>%H:%M</b>",
			"<span size=\"smaller\">%OY/%Om/%Od</span>,%X"
			"%OY/%Om/%Od,<span color=\"#ff0000\">%X</span>",
			"<span font=\"bold\">%X</span>",
			"%OH:%OM",
			"<b>%OH:%OM</b>",
		))
		self.gtkPrefItems.append(item)
		pack(hbox, item.getWidget(), 1, 1)
		pack(vbox, hbox)
		######
		hbox = gtk.HBox(spacing=5)
		label = gtk.Label(_("Days maximum cache size"))
		label.set_alignment(0, 0.5)
		pack(hbox, label)
		##sgroup.add_widget(label)
		item = SpinPrefItem(ui, "maxDayCacheSize", 100, 9999, 0)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(vbox, hbox)
		################################ Tab 5 (Plugins) ####################
		vbox = gtk.VBox()
		vbox.label = _("_Plugins")
		vbox.icon = "preferences-plugin.png"
		self.prefPages.append(vbox)
		#####
		##pluginsTextStatusIcon:
		hbox = gtk.HBox()
		if statusIconMode == 1:
			item = CheckPrefItem(
				ui,
				"pluginsTextStatusIcon",
				_("Show in applet (for today)"),
			)
		else:
			item = CheckPrefItem(
				ui,
				"pluginsTextStatusIcon",
				_("Show in Status Icon (for today)"),
			)
		self.uiPrefItems.append(item)
		pack(hbox, item.getWidget())
		pack(hbox, gtk.Label(""), 1, 1)
		pack(vbox, hbox)
		#####
		treev = gtk.TreeView()
		treev.set_headers_clickable(True)
		trees = gtk.ListStore(
			int, # index
			bool, # enable
			bool, # show_date
			str, # title
		)
		treev.set_model(trees)
		treev.enable_model_drag_source(
			gdk.ModifierType.BUTTON1_MASK,
			[
				("row", gtk.TargetFlags.SAME_WIDGET, 0),
			],
			gdk.DragAction.MOVE,
		)
		treev.enable_model_drag_dest(
			[
				("row", gtk.TargetFlags.SAME_WIDGET, 0),
			],
			gdk.DragAction.MOVE,
		)
		treev.connect("drag_data_received", self.plugTreevDragReceived)
		treev.get_selection().connect("changed", self.plugTreevCursorChanged)
		treev.connect("row-activated", self.plugTreevRActivate)
		treev.connect("button-press-event", self.plugTreevButtonPress)
		###
		#treev.drag_source_set_icon_stock(gtk.STOCK_CLOSE)
		#treev.drag_source_add_text_targets()
		#treev.drag_source_add_uri_targets()
		#treev.drag_source_unset()
		###
		swin = gtk.ScrolledWindow()
		swin.add(treev)
		swin.set_policy(
			gtk.PolicyType.AUTOMATIC,
			gtk.PolicyType.AUTOMATIC,
		)
		######
		cell = gtk.CellRendererToggle()
		#cell.set_property("activatable", True)
		cell.connect("toggled", self.plugTreeviewCellToggled)
		col = gtk.TreeViewColumn(_("Enable"), cell)
		col.add_attribute(cell, "active", 1)
		#cell.set_active(False)
		col.set_resizable(True)
		col.set_property("expand", False)
		treev.append_column(col)
		######
		cell = gtk.CellRendererToggle()
		#cell.set_property("activatable", True)
		cell.connect("toggled", self.plugTreeviewCellToggled2)
		col = gtk.TreeViewColumn(_("Show Date"), cell)
		col.add_attribute(cell, "active", 2)
		#cell.set_active(False)
		col.set_resizable(True)
		col.set_property("expand", False)
		treev.append_column(col)
		######
		#cell = gtk.CellRendererText()
		#col = gtk.TreeViewColumn(_("File Name"), cell, text=2)
		#col.set_resizable(True)
		#treev.append_column(col)
		#treev.set_search_column(1)
		######
		cell = gtk.CellRendererText()
		#cell.set_property("wrap-mode", gtk.WrapMode.WORD)
		#cell.set_property("editable", True)
		#cell.set_property("wrap-width", 200)
		col = gtk.TreeViewColumn(_("Title"), cell, text=3)
		#treev.connect("draw", self.plugTreevExpose)
		#self.plugTitleCell = cell
		#self.plugTitleCol = col
		#col.set_resizable(True)## No need!
		col.set_property("expand", True)
		treev.append_column(col)
		######
		#for i in xrange(len(core.plugIndex)):
		#	x = core.plugIndex[i]
		#	trees.append([x[0], x[1], x[2], core.allPlugList[x[0]].title])
		######
		self.plugTreeview = treev
		self.plugTreestore = trees
		#######################
		hbox = gtk.HBox()
		vboxPlug = gtk.VBox()
		pack(vboxPlug, swin, 1, 1)
		pack(hbox, vboxPlug, 1, 1)
		###
		hboxBut = gtk.HBox()
		###
		button = gtk.Button(_("_About Plugin"))
		button.set_use_underline(True)
		button.set_image(gtk.Image.new_from_stock(
			gtk.STOCK_ABOUT,
			gtk.IconSize.BUTTON,
		))
		button.set_sensitive(False)
		button.connect("clicked", self.plugAboutClicked)
		self.plugButtonAbout = button
		pack(hboxBut, button)
		pack(hboxBut, gtk.Label(""), 1, 1)
		###
		button = gtk.Button(_("C_onfigure Plugin"))
		button.set_use_underline(True)
		button.set_image(gtk.Image.new_from_stock(
			gtk.STOCK_PREFERENCES,
			gtk.IconSize.BUTTON,
		))
		button.set_sensitive(False)
		button.connect("clicked", self.plugConfClicked)
		self.plugButtonConf = button
		pack(hboxBut, button)
		pack(hboxBut, gtk.Label(""), 1, 1)
		###
		pack(vboxPlug, hboxBut)
		###
		toolbar = gtk.Toolbar()
		toolbar.set_orientation(gtk.Orientation.VERTICAL)
		#try:  # DeprecationWarning, FIXME
		#	toolbar.set_icon_size(gtk.IconSize.SMALL_TOOLBAR)
		#	# no different (argument to set_icon_size has no effect) FIXME
		#except:
		#	pass
		size = gtk.IconSize.SMALL_TOOLBAR
		# no different
		# argument 2 to image_new_from_stock has no affect FIXME
		######## gtk.IconSize.SMALL_TOOLBAR or gtk.IconSize.MENU
		tb = toolButtonFromStock(gtk.STOCK_GOTO_TOP, size)
		set_tooltip(tb, _("Move to top"))
		tb.connect("clicked", self.plugTreeviewTop)
		toolbar.insert(tb, -1)
		########
		tb = toolButtonFromStock(gtk.STOCK_GO_UP, size)
		set_tooltip(tb, _("Move up"))
		tb.connect("clicked", self.plugTreeviewUp)
		toolbar.insert(tb, -1)
		#########
		tb = toolButtonFromStock(gtk.STOCK_GO_DOWN, size)
		set_tooltip(tb, _("Move down"))
		tb.connect("clicked", self.plugTreeviewDown)
		toolbar.insert(tb, -1)
		########
		tb = toolButtonFromStock(gtk.STOCK_GOTO_BOTTOM, size)
		set_tooltip(tb, _("Move to bottom"))
		tb.connect("clicked", self.plugTreeviewBottom)
		toolbar.insert(tb, -1)
		##########
		tb = toolButtonFromStock(gtk.STOCK_ADD, size)
		set_tooltip(tb, _("Add"))
		#tb.connect("clicked", lambda obj: self.plugAddDialog.run())
		tb.connect("clicked", self.plugAddClicked)
		#if len(self.plugAddItems) == 0:
		#	tb.set_sensitive(False)
		toolbar.insert(tb, -1)
		self.plugButtonAdd = tb
		###########
		tb = toolButtonFromStock(gtk.STOCK_DELETE, size)
		set_tooltip(tb, _("Delete"))
		tb.connect("clicked", self.plugTreeviewDel)
		toolbar.insert(tb, -1)
		###########
		pack(hbox, toolbar)
		#####
		"""
		vpan = gtk.VPaned()
		vpan.add1(hbox)
		vbox2 = gtk.VBox()
		pack(vbox2, gtk.Label("Test Label"))
		vpan.add2(vbox2)
		vpan.set_position(100)
		pack(vbox, vpan)
		"""
		pack(vbox, hbox, 1, 1)
		##########################
		d = gtk.Dialog(parent=self)
		d.set_transient_for(self)
		# dialog.set_transient_for(parent) makes the window on top of parent
		# and at the center point of parent
		# but if you call dialog.show() or dialog.present(), the parent is
		# still active(clickabel widgets) before closing child "dialog"
		# you may call dialog.run() to realy make it transient for parent
		#d.set_has_separator(False)
		d.connect("delete-event", self.plugAddDialogClose)
		d.set_title(_("Add Plugin"))
		###
		dialog_add_button(
			d,
			gtk.STOCK_CANCEL,
			_("_Cancel"),
			1,
			self.plugAddDialogClose,
		)
		dialog_add_button(
			d,
			gtk.STOCK_OK,
			_("_OK"),
			2,
			self.plugAddDialogOK,
		)
		###
		treev = gtk.TreeView()
		trees = gtk.ListStore(str)
		treev.set_model(trees)
		#treev.enable_model_drag_source(
		#	gdk.ModifierType.BUTTON1_MASK,
		#	[("", 0, 0, 0)],
		#	gdk.DragAction.MOVE,
		#)  # FIXME
		#treev.enable_model_drag_dest(
		#	[("", 0, 0, 0)],
		#	gdk.DragAction.MOVE,
		#)  # FIXME
		treev.connect("drag_data_received", self.plugTreevDragReceived)
		treev.connect("row-activated", self.plugAddTreevRActivate)
		####
		cell = gtk.CellRendererText()
		col = gtk.TreeViewColumn(_("Title"), cell, text=0)
		#col.set_resizable(True)# no need when have only one column!
		treev.append_column(col)
		####
		swin = gtk.ScrolledWindow()
		swin.add(treev)
		swin.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
		pack(d.vbox, swin, 1, 1)
		d.vbox.show_all()
		self.plugAddDialog = d
		self.plugAddTreeview = treev
		self.plugAddTreestore = trees
		#############
		##treev.set_resize_mode(gtk.RESIZE_IMMEDIATE)
		##self.plugAddItems = []
		####################################### Tab 6 (Accounts)
		vbox = gtk.VBox()
		vbox.label = _("Accounts")
		vbox.icon = "web-settings.png"
		self.prefPages.append(vbox)
		#####
		treev = gtk.TreeView()
		treev.set_headers_clickable(True)
		trees = gtk.ListStore(int, bool, str)## id (hidden), enable, title
		treev.set_model(trees)
		treev.enable_model_drag_source(
			gdk.ModifierType.BUTTON1_MASK,
			[
				("row", gtk.TargetFlags.SAME_WIDGET, 0),
			],
			gdk.DragAction.MOVE,
		)
		treev.enable_model_drag_dest(
			[
				("row", gtk.TargetFlags.SAME_WIDGET, 0),
			],
			gdk.DragAction.MOVE,
		)
		treev.connect("row-activated", self.accountsTreevRActivate)
		treev.connect("button-press-event", self.accountsTreevButtonPress)
		###
		swin = gtk.ScrolledWindow()
		swin.add(treev)
		swin.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
		######
		cell = gtk.CellRendererToggle()
		#cell.set_property("activatable", True)
		cell.connect("toggled", self.accountsTreeviewCellToggled)
		col = gtk.TreeViewColumn(_("Enable"), cell)
		col.add_attribute(cell, "active", 1)
		#cell.set_active(False)
		col.set_resizable(True)
		col.set_property("expand", False)
		treev.append_column(col)
		######
		cell = gtk.CellRendererText()
		col = gtk.TreeViewColumn(_("Title"), cell, text=2)
		#col.set_resizable(True)## No need!
		col.set_property("expand", True)
		treev.append_column(col)
		######
		self.accountsTreeview = treev
		self.accountsTreestore = trees
		#######################
		hbox = gtk.HBox()
		vboxPlug = gtk.VBox()
		pack(vboxPlug, swin, 1, 1)
		pack(hbox, vboxPlug, 1, 1)
		###
		toolbar = gtk.Toolbar()
		toolbar.set_orientation(gtk.Orientation.VERTICAL)
		#try:  # DeprecationWarning, FIXME
		#	#toolbar.set_icon_size(gtk.IconSize.SMALL_TOOLBAR)
		#	# no different, argument to set_icon_size has no affect FIXME
		#except:
		#	pass
		size = gtk.IconSize.SMALL_TOOLBAR
		# argument 2 to image_new_from_stock has no effect FIXME
		######## gtk.IconSize.SMALL_TOOLBAR or gtk.IconSize.MENU
		tb = toolButtonFromFile("starcal-24.png")
		set_tooltip(tb, _("Register at StarCalendar.net"))
		tb.connect("clicked", self.accountsRegisterClicked)
		toolbar.insert(tb, -1)
		###########
		tb = toolButtonFromStock(gtk.STOCK_ADD, size)
		set_tooltip(tb, _("Add"))
		tb.connect("clicked", self.accountsAddClicked)
		toolbar.insert(tb, -1)
		###########
		tb = toolButtonFromStock(gtk.STOCK_EDIT, size)
		set_tooltip(tb, _("Edit"))
		tb.connect("clicked", self.accountsEditClicked)
		toolbar.insert(tb, -1)
		###########
		tb = toolButtonFromStock(gtk.STOCK_DELETE, size)
		set_tooltip(tb, _("Delete"))
		tb.connect("clicked", self.accountsDelClicked)
		toolbar.insert(tb, -1)
		##########
		tb = toolButtonFromStock(gtk.STOCK_GO_UP, size)
		set_tooltip(tb, _("Move up"))
		tb.connect("clicked", self.accountsUpClicked)
		toolbar.insert(tb, -1)
		#########
		tb = toolButtonFromStock(gtk.STOCK_GO_DOWN, size)
		set_tooltip(tb, _("Move down"))
		tb.connect("clicked", self.accountsDownClicked)
		toolbar.insert(tb, -1)
		###########
		pack(hbox, toolbar)
		pack(vbox, hbox, 1, 1)
		####################################################################
		notebook = gtk.Notebook()
		self.notebook = notebook
		#####################################
		for vbox in self.prefPages:
			l = gtk.Label(vbox.label)
			l.set_use_underline(True)
			vb = gtk.VBox(spacing=3)
			pack(vb, imageFromFile(vbox.icon))
			pack(vb, l)
			vb.show_all()
			notebook.append_page(vbox, vb)
			try:
				notebook.set_tab_reorderable(vbox, True)
			except AttributeError:
				pass
		#######################
		#notebook.set_property("homogeneous", True)## not in gtk3 FIXME
		#notebook.set_property("tab-border", 5)## not in gtk3 FIXME
		#notebook.set_property("tab-hborder", 15)## not in gtk3 FIXME
		pack(self.vbox, notebook)
		self.vbox.show_all()
		for i in ui.prefPagesOrder:
			try:
				j = ui.prefPagesOrder[i]
			except IndexError:
				continue
			notebook.reorder_child(self.prefPages[i], j)
Example #41
0
def checkAndSaveJsonLockFile(fpath):
    locked = False
    my_pid = os.getpid()
    if isfile(fpath):
        try:
            text = open(fpath).read()
        except:
            myRaise()
            locked = True
        else:
            try:
                data = jsonToData(text)
            except:
                print("lock file %s is not valid" % fpath)
            else:
                try:
                    pid = data["pid"]
                    cmd = data["cmd"]
                except:
                    print("lock file %s is not valid" % fpath)
                else:
                    try:
                        proc = psutil.Process(pid)
                    except psutil.NoSuchProcess:
                        print("lock file %s: pid %s does not exist" %
                              (fpath, pid))
                    else:
                        if pid == my_pid:
                            print("lock file %s: pid == my_pid == %s" % (
                                fpath,
                                pid,
                            ))
                        elif get_cmdline(proc) != cmd:
                            print("lock file %s: cmd does match: %s != %s" % (
                                fpath,
                                get_cmdline(proc),
                                cmd,
                            ))
                        else:
                            locked = True

    elif exists(fpath):
        ## what to do? FIXME
        pass
    ######
    if not locked:
        my_proc = psutil.Process(my_pid)
        my_cmd = get_cmdline(my_proc)
        my_text = dataToPrettyJson(
            OrderedDict([
                ("pid", my_pid),
                ("cmd", my_cmd),
                ("time", now()),
            ]))
        try:
            open(fpath, "w").write(my_text)
        except Exception as e:
            print("failed to write lock file %s: %s" % (fpath, e))
        else:
            atexit.register(os.remove, fpath)
    ######
    return locked
Example #42
0
 def drawAll(self, widget=None, cr=None, cursor=True):
     #gevent = gtk.get_current_event()
     #?????? Must enhance (only draw few cells, not all cells)
     self.calcCoord()
     w = self.get_allocation().width
     h = self.get_allocation().height
     if not cr:
         cr = self.get_window().cairo_create()
         #cr.set_line_width(0)#??????????????
         #cr.scale(0.5, 0.5)
     wx = ui.winX
     wy = ui.winY
     #if ui.bgUseDesk: # FIXME: should be re-implemented
     #	from scal3.ui_gtk import desktop
     #	from scal3.ui_gtk import wallpaper
     cr.rectangle(0, 0, w, h)
     fillColor(cr, ui.bgColor)
     status = getCurrentMonthStatus()
     #################################### Drawing Border
     if ui.mcalTopMargin > 0:
         ##### Drawing border top background
         ##menuBgColor == borderColor ##???????????????
         cr.rectangle(0, 0, w, ui.mcalTopMargin)
         fillColor(cr, ui.borderColor)
         ######## Drawing weekDays names
         setColor(cr, ui.borderTextColor)
         dx = 0
         wdayAb = (self.wdaysWidth > w)
         for i in range(7):
             wday = newTextLayout(self, core.getWeekDayAuto(i, wdayAb))
             try:
                 fontw, fonth = wday.get_pixel_size()
             except:
                 myRaise(__file__)
                 fontw, fonth = wday.get_pixel_size()
             cr.move_to(
                 self.cx[i] - fontw / 2,
                 (ui.mcalTopMargin - fonth) / 2 - 1,
             )
             show_layout(cr, wday)
         ######## Drawing "Menu" label
         setColor(cr, ui.menuTextColor)
         text = newTextLayout(self, _("Menu"))
         fontw, fonth = text.get_pixel_size()
         if rtl:
             cr.move_to(
                 w - (ui.mcalLeftMargin + fontw) / 2 - 3,
                 (ui.mcalTopMargin - fonth) / 2 - 1,
             )
         else:
             cr.move_to(
                 (ui.mcalLeftMargin - fontw) / 2,
                 (ui.mcalTopMargin - fonth) / 2 - 1,
             )
         show_layout(cr, text)
     if ui.mcalLeftMargin > 0:
         ##### Drawing border left background
         if rtl:
             cr.rectangle(
                 w - ui.mcalLeftMargin,
                 ui.mcalTopMargin,
                 ui.mcalLeftMargin,
                 h - ui.mcalTopMargin,
             )
         else:
             cr.rectangle(
                 0,
                 ui.mcalTopMargin,
                 ui.mcalLeftMargin,
                 h - ui.mcalTopMargin,
             )
         fillColor(cr, ui.borderColor)
         ##### Drawing week numbers
         setColor(cr, ui.borderTextColor)
         for i in range(6):
             lay = newTextLayout(self, _(status.weekNum[i]))
             fontw, fonth = lay.get_pixel_size()
             if rtl:
                 cr.move_to(
                     w - (ui.mcalLeftMargin + fontw) / 2,
                     self.cy[i] - fonth / 2 + 2,
                 )
             else:
                 cr.move_to(
                     (ui.mcalLeftMargin - fontw) / 2,
                     self.cy[i] - fonth / 2 + 2,
                 )
             show_layout(cr, lay)
     selectedCellPos = ui.cell.monthPos
     if ui.todayCell.inSameMonth(ui.cell):
         tx, ty = ui.todayCell.monthPos  ## today x and y
         x0 = self.cx[tx] - self.dx / 2
         y0 = self.cy[ty] - self.dy / 2
         cr.rectangle(x0, y0, self.dx, self.dy)
         fillColor(cr, ui.todayCellColor)
     for yPos in range(6):
         for xPos in range(7):
             c = status[yPos][xPos]
             x0 = self.cx[xPos]
             y0 = self.cy[yPos]
             cellInactive = (c.month != ui.cell.month)
             cellHasCursor = (cursor and (xPos, yPos) == selectedCellPos)
             if cellHasCursor:
                 ##### Drawing Cursor
                 cx0 = x0 - self.dx / 2 + 1
                 cy0 = y0 - self.dy / 2 + 1
                 cw = self.dx - 1
                 ch = self.dy - 1
                 ######### Circular Rounded
                 drawCursorBg(cr, cx0, cy0, cw, ch)
                 fillColor(cr, ui.cursorBgColor)
             ######## end of Drawing Cursor
             if not cellInactive:
                 iconList = c.getMonthEventIcons()
                 if iconList:
                     iconsN = len(iconList)
                     scaleFact = 1 / sqrt(iconsN)
                     fromRight = 0
                     for index, icon in enumerate(iconList):
                         ## if len(iconList) > 1 ## FIXME
                         try:
                             pix = GdkPixbuf.Pixbuf.new_from_file(icon)
                         except:
                             myRaise(__file__)
                             continue
                         pix_w = pix.get_width()
                         pix_h = pix.get_height()
                         # right buttom corner ???
                         # right side:
                         x1 = (x0 +
                               self.dx / 2) / scaleFact - fromRight - pix_w
                         # buttom side:
                         y1 = (y0 + self.dy / 2) / scaleFact - pix_h
                         cr.scale(scaleFact, scaleFact)
                         gdk.cairo_set_source_pixbuf(cr, pix, x1, y1)
                         cr.rectangle(x1, y1, pix_w, pix_h)
                         cr.fill()
                         cr.scale(1 / scaleFact, 1 / scaleFact)
                         fromRight += pix_w
             #### Drawing numbers inside every cell
             #cr.rectangle(
             #	x0-self.dx / 2+1,
             #	y0-self.dy / 2+1,
             #	self.dx-1,
             #	self.dy-1,
             #)
             mode = calTypes.primary
             params = ui.mcalTypeParams[0]
             daynum = newTextLayout(
                 self,
                 _(c.dates[mode][2], mode),
                 params["font"],
             )
             fontw, fonth = daynum.get_pixel_size()
             if cellInactive:
                 setColor(cr, ui.inactiveColor)
             elif c.holiday:
                 setColor(cr, ui.holidayColor)
             else:
                 setColor(cr, params["color"])
             cr.move_to(
                 x0 - fontw / 2 + params["pos"][0],
                 y0 - fonth / 2 + params["pos"][1],
             )
             show_layout(cr, daynum)
             if not cellInactive:
                 for mode, params in ui.getActiveMonthCalParams()[1:]:
                     daynum = newTextLayout(
                         self,
                         _(c.dates[mode][2], mode),
                         params["font"],
                     )
                     fontw, fonth = daynum.get_pixel_size()
                     setColor(cr, params["color"])
                     cr.move_to(
                         x0 - fontw / 2 + params["pos"][0],
                         y0 - fonth / 2 + params["pos"][1],
                     )
                     show_layout(cr, daynum)
                 if cellHasCursor:
                     ##### Drawing Cursor Outline
                     cx0 = x0 - self.dx / 2 + 1
                     cy0 = y0 - self.dy / 2 + 1
                     cw = self.dx - 1
                     ch = self.dy - 1
                     ######### Circular Rounded
                     drawCursorOutline(cr, cx0, cy0, cw, ch)
                     fillColor(cr, ui.cursorOutColor)
                     ##### end of Drawing Cursor Outline
     ################ end of drawing cells
     ##### drawGrid
     if ui.mcalGrid:
         setColor(cr, ui.mcalGridColor)
         for i in range(7):
             cr.rectangle(
                 self.cx[i] + rtlSgn() * self.dx / 2,
                 0,
                 1,
                 h,
             )
             cr.fill()
         for i in range(6):
             cr.rectangle(
                 0,
                 self.cy[i] - self.dy / 2,
                 w,
                 1,
             )
             cr.fill()
     return False
Example #43
0
 def __init__(self, statusIconMode=2):
     #from gi.repository import Gio
     #self.app = gtk.Application(application_id="apps.starcal")
     #self.app.register(Gio.Cancellable.new())
     #gtk.ApplicationWindow.__init__(self, application=self.app)
     gtk.Window.__init__(self)
     self.add_events(gdk.EventMask.ALL_EVENTS_MASK)
     self.initVars()
     ud.windowList.appendItem(self)
     ui.mainWin = self
     ##################
     ## statusIconMode:
         ## ('none', 'none')
         ## ('statusIcon', 'normal')
         ## ('applet', 'gnome')
         ## ('applet', 'kde')
         ##
         ## 0: none (simple window)
         ## 1: applet
         ## 2: standard status icon
     self.statusIconMode = statusIconMode
     ###
     #ui.eventManDialog = None
     #ui.timeLineWin = None
     ###
     #ui.weekCalWin = WeekCalWindow()
     #ud.windowList.appendItem(ui.weekCalWin)
     ###
     self.dayInfoDialog = None
     #print('windowList.items', [item._name for item in ud.windowList.items])
     ###########
     ##self.connect('window-state-event', selfStateEvent)
     self.set_title('%s %s'%(core.APP_DESC, core.VERSION))
     #self.connect('main-show', lambda arg: self.present())
     #self.connect('main-hide', lambda arg: self.hide())
     self.set_decorated(False)
     self.set_property('skip-taskbar-hint', not ui.winTaskbar) ## self.set_skip_taskbar_hint  ## FIXME
     self.set_role('starcal')
     #self.set_focus_on_map(True)#????????
     #self.set_type_hint(gdk.WindowTypeHint.NORMAL)
     #self.connect('realize', self.onRealize)
     self.set_default_size(ui.winWidth, 1)
     try:
         self.move(ui.winX, ui.winY)
     except:
         pass
     #############################################################
     self.connect('focus-in-event', self.focusIn, 'Main')
     self.connect('focus-out-event', self.focusOut, 'Main')
     self.connect('button-press-event', self.buttonPress)
     self.connect('key-press-event', self.keyPress)
     self.connect('configure-event', self.configureEvent)
     self.connect('destroy', self.quit)
     #############################################################
     """
     #self.add_events(gdk.EventMask.VISIBILITY_NOTIFY_MASK)
     #self.connect('frame-event', show_event)
     ## Compiz does not send configure-event(or any event) when MOVING window(sends in last point,
     ## when moving completed)
     #self.connect('drag-motion', show_event)
     ud.rootWindow.set_events(...
     ud.rootWindow.add_filter(self.onRootWinEvent)
     #self.realize()
     #gdk.flush()
     #self.configureEvent(None, None)
     #self.connect('drag-motion', show_event)
     ######################
     ## ????????????????????????????????????????????????
     ## when button is down(before button-release-event), motion-notify-event does not recived!
     """
     ##################################################################
     self.focus = False
     #self.focusOutTime = 0
     #self.clockTr = None
     ############################################################################
     self.winCon = None
     ############
     self.vbox = MainWinVbox()
     ui.checkMainWinItems()
     itemsPkg = 'scal3.ui_gtk.mainwin_items'
     for (name, enable) in ui.mainWinItems:
         #print(name, enable)
         if enable:
             try:
                 module = __import__(
                     '.'.join([
                         itemsPkg,
                         name,
                     ]),
                     fromlist=['CalObj'],
                 )
                 CalObj = module.CalObj
             except:
                 myRaise()
                 continue
             item = CalObj()
             item.enable = enable
             item.connect('size-allocate', self.childSizeAllocate)
             #modify_bg_all(item, gtk.StateType.NORMAL, rgbToGdkColor(*ui.bgColor))
         else:
             desc = mainWinItemsDesc[name]
             item = DummyCalObj(name, desc, itemsPkg, True)
         self.vbox.appendItem(item)
     self.appendItem(self.vbox)
     self.vbox.show()
     self.customizeDialog = None
     #######
     self.add(self.vbox)
     ####################
     self.isMaximized = False
     ####################
     #ui.prefDialog = None
     self.exportDialog = None
     self.selectDateDialog = None
     ############### Building About Dialog
     self.aboutDialog = None
     ###############
     self.menuMain = None
     #####
     check = gtk.CheckMenuItem(label=_('_On Top'))
     check.set_use_underline(True)
     check.connect('activate', self.keepAboveClicked)
     check.set_active(ui.winKeepAbove)
     self.set_keep_above(ui.winKeepAbove)
     self.checkAbove = check
     #####
     check = gtk.CheckMenuItem(label=_('_Sticky'))
     check.set_use_underline(True)
     check.connect('activate', self.stickyClicked)
     check.set_active(ui.winSticky)
     if ui.winSticky:
         self.stick()
     self.checkSticky = check
     ############################################################
     self.statusIconInit()
     listener.dateChange.add(self)
     #if self.statusIconMode!=1:
     #    gobject.timeout_add_seconds(self.timeout, self.statusIconUpdate)
     #########
     self.connect('delete-event', self.onDeleteEvent)
     #########################################
     for plug in core.allPlugList:
         if plug.external:
             try:
                 plug.set_dialog(self)
             except AttributeError:
                 pass
     ###########################
     self.onConfigChange()
Example #44
0
	def __init__(self, statusIconMode=2):
		#from gi.repository import Gio
		#self.app = gtk.Application(application_id="apps.starcal")
		#self.app.register(Gio.Cancellable.new())
		#gtk.ApplicationWindow.__init__(self, application=self.app)
		gtk.Window.__init__(self)
		self.add_events(gdk.EventMask.ALL_EVENTS_MASK)
		self.initVars()
		ud.windowList.appendItem(self)
		ui.mainWin = self
		##################
		## statusIconMode:
			## ('none', 'none')
			## ('statusIcon', 'normal')
			## ('applet', 'gnome')
			## ('applet', 'kde')
			##
			## 0: none (simple window)
			## 1: applet
			## 2: standard status icon
		self.statusIconMode = statusIconMode
		###
		#ui.eventManDialog = None
		#ui.timeLineWin = None
		###
		#ui.weekCalWin = WeekCalWindow()
		#ud.windowList.appendItem(ui.weekCalWin)
		###
		self.dayInfoDialog = None
		#print('windowList.items', [item._name for item in ud.windowList.items])
		###########
		##self.connect('window-state-event', selfStateEvent)
		self.set_title('%s %s'%(core.APP_DESC, core.VERSION))
		#self.connect('main-show', lambda arg: self.present())
		#self.connect('main-hide', lambda arg: self.hide())
		self.set_decorated(False)
		self.set_property('skip-taskbar-hint', not ui.winTaskbar) ## self.set_skip_taskbar_hint  ## FIXME
		self.set_role('starcal')
		#self.set_focus_on_map(True)#????????
		#self.set_type_hint(gdk.WindowTypeHint.NORMAL)
		#self.connect('realize', self.onRealize)
		self.set_default_size(ui.winWidth, 1)
		try:
			self.move(ui.winX, ui.winY)
		except:
			pass
		#############################################################
		self.connect('focus-in-event', self.focusIn, 'Main')
		self.connect('focus-out-event', self.focusOut, 'Main')
		self.connect('button-press-event', self.buttonPress)
		self.connect('key-press-event', self.keyPress)
		self.connect('configure-event', self.configureEvent)
		self.connect('destroy', self.quit)
		#############################################################
		"""
		#self.add_events(gdk.EventMask.VISIBILITY_NOTIFY_MASK)
		#self.connect('frame-event', show_event)
		## Compiz does not send configure-event(or any event) when MOVING window(sends in last point,
		## when moving completed)
		#self.connect('drag-motion', show_event)
		ud.rootWindow.set_events(...
		ud.rootWindow.add_filter(self.onRootWinEvent)
		#self.realize()
		#gdk.flush()
		#self.configureEvent(None, None)
		#self.connect('drag-motion', show_event)
		######################
		## ????????????????????????????????????????????????
		## when button is down(before button-release-event), motion-notify-event does not recived!
		"""
		##################################################################
		self.focus = False
		#self.focusOutTime = 0
		#self.clockTr = None
		############################################################################
		self.winCon = None
		############
		self.vbox = MainWinVbox()
		ui.checkMainWinItems()
		itemsPkg = 'scal3.ui_gtk.mainwin_items'
		for (name, enable) in ui.mainWinItems:
			#print(name, enable)
			if enable:
				try:
					module = __import__(
						'.'.join([
							itemsPkg,
							name,
						]),
						fromlist=['CalObj'],
					)
					CalObj = module.CalObj
				except:
					myRaise()
					continue
				item = CalObj()
				item.enable = enable
				item.connect('size-allocate', self.childSizeAllocate)
				#modify_bg_all(item, gtk.StateType.NORMAL, rgbToGdkColor(*ui.bgColor))
			else:
				desc = mainWinItemsDesc[name]
				item = DummyCalObj(name, desc, itemsPkg, True)
			self.vbox.appendItem(item)
		self.appendItem(self.vbox)
		self.vbox.show()
		self.customizeDialog = None
		#######
		self.add(self.vbox)
		####################
		self.isMaximized = False
		####################
		#ui.prefDialog = None
		self.exportDialog = None
		self.selectDateDialog = None
		############### Building About Dialog
		self.aboutDialog = None
		###############
		self.menuMain = None
		#####
		check = gtk.CheckMenuItem(label=_('_On Top'))
		check.set_use_underline(True)
		check.connect('activate', self.keepAboveClicked)
		check.set_active(ui.winKeepAbove)
		self.set_keep_above(ui.winKeepAbove)
		self.checkAbove = check
		#####
		check = gtk.CheckMenuItem(label=_('_Sticky'))
		check.set_use_underline(True)
		check.connect('activate', self.stickyClicked)
		check.set_active(ui.winSticky)
		if ui.winSticky:
			self.stick()
		self.checkSticky = check
		############################################################
		self.statusIconInit()
		listener.dateChange.add(self)
		#if self.statusIconMode!=1:
		#	gobject.timeout_add_seconds(self.timeout, self.statusIconUpdate)
		#########
		self.connect('delete-event', self.onDeleteEvent)
		#########################################
		for plug in core.allPlugList:
			if plug.external:
				try:
					plug.set_dialog(self)
				except AttributeError:
					pass
		###########################
		self.onConfigChange()
Example #45
0
 def drawAll(self, widget=None, cr=None, cursor=True):
     #gevent = gtk.get_current_event()
     w = self.get_allocation().width
     h = self.get_allocation().height
     if not cr:
         cr = self.get_window().cairo_create()
         #cr.set_line_width(0)#??????????????
         #cr.scale(0.5, 0.5)
     cr.rectangle(0, 0, w, h)
     fillColor(cr, ui.bgColor)
     #####
     c = ui.cell
     x0 = 0
     y0 = 0
     dx = w
     dy = h
     ########
     iconList = c.getDayEventIcons()
     if iconList:
         iconsN = len(iconList)
         scaleFact = 3.0 / sqrt(iconsN)
         fromRight = 0
         for index, icon in enumerate(iconList):
             ## if len(iconList) > 1 ## FIXME
             try:
                 pix = GdkPixbuf.Pixbuf.new_from_file(icon)
             except:
                 myRaise(__file__)
                 continue
             pix_w = pix.get_width()
             pix_h = pix.get_height()
             ## right buttom corner ?????????????????????
             x1 = (x0 + dx) / scaleFact - fromRight - pix_w  # right side
             y1 = (y0 + dy / 2) / scaleFact - pix_h / 2  # middle
             cr.scale(scaleFact, scaleFact)
             gdk.cairo_set_source_pixbuf(cr, pix, x1, y1)
             cr.rectangle(x1, y1, pix_w, pix_h)
             cr.fill()
             cr.scale(1 / scaleFact, 1 / scaleFact)
             fromRight += pix_w
     #### Drawing numbers inside every cell
     #cr.rectangle(
     #	x0-dx/2.0+1,
     #	y0-self.dy/2.0+1,
     #	dx-1,
     #	dy-1,
     #)
     mode = calTypes.primary
     params = ui.dcalTypeParams[0]
     daynum = newTextLayout(
         self,
         _(c.dates[mode][2], mode),
         params["font"],
     )
     fontw, fonth = daynum.get_pixel_size()
     if c.holiday:
         setColor(cr, ui.holidayColor)
     else:
         setColor(cr, params["color"])
     cr.move_to(
         x0 + dx / 2 - fontw / 2 + params["pos"][0],
         y0 + dy / 2 - fonth / 2 + params["pos"][1],
     )
     show_layout(cr, daynum)
     ####
     for mode, params in ui.getActiveDayCalParams()[1:]:
         daynum = newTextLayout(self, _(c.dates[mode][2], mode),
                                params["font"])
         fontw, fonth = daynum.get_pixel_size()
         setColor(cr, params["color"])
         cr.move_to(
             x0 + dx / 2 - fontw / 2 + params["pos"][0],
             y0 + dy / 2 - fonth / 2 + params["pos"][1],
         )
         show_layout(cr, daynum)
Example #46
0
    def __init__(self, statusIconMode, **kwargs):
        gtk.Dialog.__init__(self, **kwargs)
        self.set_title(_("Preferences"))
        self.connect("delete-event", self.onDelete)
        #self.set_has_separator(False)
        #self.set_skip_taskbar_hint(True)
        ###
        dialog_add_button(
            self,
            gtk.STOCK_CANCEL,
            _("_Cancel"),
            1,
            self.cancel,
        )
        dialog_add_button(
            self,
            gtk.STOCK_APPLY,
            _("_Apply"),
            2,
            self.apply,
        )
        okB = dialog_add_button(
            self,
            gtk.STOCK_OK,
            _("_OK"),
            3,
            self.ok,
            tooltip=_("Apply and Close"),
        )
        okB.grab_default()  # FIXME
        #okB.grab_focus()  # FIXME
        ##############################################
        self.localePrefItems = []
        self.corePrefItems = []
        self.uiPrefItems = []
        self.gtkPrefItems = []  # FIXME
        #####
        self.prefPages = []
        ################################ Tab 1 (General) #####################
        vbox = gtk.VBox()
        vbox.label = _("_General")
        vbox.icon = "preferences-other.png"
        self.prefPages.append(vbox)
        hbox = gtk.HBox(spacing=3)
        pack(hbox, gtk.Label(_("Language")))
        itemLang = LangPrefItem()
        self.localePrefItems.append(itemLang)
        ###
        pack(hbox, itemLang.getWidget())
        if langSh != "en":
            pack(hbox, gtk.Label("Language"))
        pack(vbox, hbox)
        ##########################
        hbox = gtk.HBox()
        frame = gtk.Frame()
        frame.set_label(_("Calendar Types"))
        itemCals = AICalsPrefItem()
        self.corePrefItems.append(itemCals)
        frame.add(itemCals.getWidget())
        pack(hbox, frame)
        pack(hbox, gtk.Label(""), 1, 1)
        hbox.set_border_width(5)
        #frame.set_border_width(5)
        pack(vbox, hbox, 1, 1)
        ##########################
        if statusIconMode != 1:
            hbox = gtk.HBox(spacing=3)
            item = CheckStartupPrefItem()
            self.uiPrefItems.append(item)
            pack(hbox, item.getWidget(), 1, 1)
            pack(vbox, hbox)
            ########################
            item = CheckPrefItem(
                ui,
                "showMain",
                _("Show main window on start"),
            )
            self.uiPrefItems.append(item)
            pack(vbox, item.getWidget())
        ##########################
        item = CheckPrefItem(
            ui,
            "winTaskbar",
            _("Window in Taskbar"),
        )
        self.uiPrefItems.append(item)
        hbox = gtk.HBox(spacing=3)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ###########
        pack(vbox, hbox)
        ##########################
        try:
            import scal3.ui_gtk.starcal_appindicator
        except (ImportError, ValueError):
            pass
        else:
            item = CheckPrefItem(
                ui,
                "useAppIndicator",
                _("Use AppIndicator"),
            )
            self.uiPrefItems.append(item)
            hbox = gtk.HBox(spacing=3)
            pack(hbox, item.getWidget())
            pack(hbox, gtk.Label(""), 1, 1)
            pack(vbox, hbox)
        ##########################
        hbox = gtk.HBox(spacing=3)
        pack(hbox, gtk.Label(_("Show Digital Clock:")))
        pack(hbox, gtk.Label(""), 1, 1)
        #item = CheckPrefItem(
        #	ui,
        #	"showDigClockTb",
        #	_("On Toolbar"),
        #)  # FIXME
        #self.uiPrefItems.append(item)
        #pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        if statusIconMode == 1:
            item = CheckPrefItem(
                ui,
                "showDigClockTr",
                _("On Applet"),
                "Panel Applet",
            )
        else:
            item = CheckPrefItem(
                ui,
                "showDigClockTr",
                _("On Status Icon"),
                "Notification Area",
            )
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        pack(vbox, hbox)
        ################################ Tab 2 (Appearance) ##################
        vbox = gtk.VBox()
        # A is for Apply, P is for Plugins, R is for Regional, C is for Cancel, only "n" is left!
        vbox.label = _("Appeara_nce")
        vbox.icon = "preferences-desktop-theme.png"
        self.prefPages.append(vbox)
        ########
        hbox = gtk.HBox(spacing=2)
        ###
        customCheckItem = CheckPrefItem(
            ui,
            "fontCustomEnable",
            _("Application Font"),
        )
        self.uiPrefItems.append(customCheckItem)
        pack(hbox, customCheckItem.getWidget())
        ###
        customItem = FontPrefItem(ui, "fontCustom", self)
        self.uiPrefItems.append(customItem)
        pack(hbox, customItem.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        customCheckItem.syncSensitive(customItem.getWidget())
        pack(vbox, hbox)
        ########################### Theme #####################
        #hbox = gtk.HBox(spacing=3)
        #item = CheckPrefItem(ui, 'bgUseDesk', _('Use Desktop Background'))
        #self.uiPrefItems.append(item)
        #pack(hbox, item.getWidget())
        #pack(hbox, gtk.Label(''), 1, 1)
        #pack(vbox, hbox)
        #####################
        hbox = gtk.HBox(spacing=3)
        lab = gtk.Label("<b>%s:</b> " % _("Colors"))
        lab.set_use_markup(True)
        pack(hbox, lab)
        pack(hbox, gtk.Label(""), 1, 1)
        ###
        pack(hbox, gtk.Label(_("Background")))
        item = ColorPrefItem(ui, "bgColor", True)
        self.uiPrefItems.append(item)
        self.colorbBg = item.getWidget()  ## FIXME
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ###
        pack(hbox, gtk.Label(_("Border")))
        item = ColorPrefItem(ui, "borderColor", True)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ###
        pack(hbox, gtk.Label(_("Cursor")))
        item = ColorPrefItem(ui, "cursorOutColor", False)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ###
        pack(hbox, gtk.Label(_("Cursor BG")))
        item = ColorPrefItem(ui, "cursorBgColor", True)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ###
        pack(hbox, gtk.Label(_("Today")))
        item = ColorPrefItem(ui, "todayCellColor", True)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ###
        pack(vbox, hbox)
        ####################
        hbox = gtk.HBox(spacing=3)
        lab = gtk.Label("<b>%s:</b> " % _("Font Colors"))
        lab.set_use_markup(True)
        pack(hbox, lab)
        pack(hbox, gtk.Label(""), 1, 1)
        ####
        pack(hbox, gtk.Label(_("Normal")))
        item = ColorPrefItem(ui, "textColor", False)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ###
        pack(hbox, gtk.Label(_("Holiday")))
        item = ColorPrefItem(ui, "holidayColor", False)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ###
        pack(hbox, gtk.Label(_("Inactive Day")))
        item = ColorPrefItem(ui, "inactiveColor", True)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ####
        pack(hbox, gtk.Label(_("Border")))
        item = ColorPrefItem(ui, "borderTextColor", False)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ####
        pack(vbox, hbox)
        ###################
        hbox = gtk.HBox(spacing=1)
        label = gtk.Label("<b>%s</b>:" % _("Cursor"))
        label.set_use_markup(True)
        pack(hbox, label)
        pack(hbox, gtk.Label(""), 1, 1)
        pack(hbox, gtk.Label(_("Diameter Factor")))
        item = SpinPrefItem(ui, "cursorDiaFactor", 0, 1, 2)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        ###
        pack(hbox, gtk.Label(""), 1, 1)
        pack(hbox, gtk.Label(_("Rounding Factor")))
        item = SpinPrefItem(ui, "cursorRoundingFactor", 0, 1, 2)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        ###
        pack(vbox, hbox)
        ###################
        # the header label of gtk.Expander in gtk3 is always on the left (even in RTL mode)
        # that's why we use gtk.Frame instead
        exp = gtk.Frame()
        exp.set_border_width(5)
        label = gtk.Label("<b>%s</b>" % _("Status Icon"))
        label.set_use_markup(True)
        exp.set_label_widget(label)
        expVbox = gtk.VBox(spacing=1)
        expVbox.set_border_width(5)
        exp.add(expVbox)
        sgroup = gtk.SizeGroup(gtk.SizeGroupMode.HORIZONTAL)
        ####
        hbox = gtk.HBox(spacing=1)
        pack(hbox, gtk.Label(" "))
        label = gtk.Label(_("Normal Days"))
        sgroup.add_widget(label)
        pack(hbox, label)
        item = FileChooserPrefItem(
            ui,
            "statusIconImage",
            title=_("Select Icon"),
            currentFolder=pixDir,
            defaultVarName="statusIconImageDefault",
        )
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget(), 1, 1)
        pack(expVbox, hbox)
        ####
        hbox = gtk.HBox(spacing=1)
        pack(hbox, gtk.Label(" "))
        label = gtk.Label(_("Holidays"))
        sgroup.add_widget(label)
        pack(hbox, label)
        item = FileChooserPrefItem(
            ui,
            "statusIconImageHoli",
            title=_("Select Icon"),
            currentFolder=pixDir,
            defaultVarName="statusIconImageHoliDefault",
        )
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget(), 1, 1)
        pack(expVbox, hbox)
        ####
        hbox = gtk.HBox(spacing=1)
        pack(hbox, gtk.Label(" "))
        checkItem = CheckPrefItem(
            ui,
            "statusIconFontFamilyEnable",
            label=_("Change font family to"),
            #tooltip=_("In SVG files"),
        )
        self.uiPrefItems.append(checkItem)
        #sgroup.add_widget(checkItem.getWidget())
        pack(hbox, checkItem.getWidget())
        item = FontFamilyPrefItem(
            ui,
            "statusIconFontFamily",
        )
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget(), 1, 1)
        pack(expVbox, hbox)
        ####
        hbox = gtk.HBox(spacing=1)
        pack(hbox, gtk.Label(" "))
        checkItem = CheckPrefItem(
            ui,
            "statusIconFixedSizeEnable",
            label=_("Fixed Size"),
            #tooltip=_(""),
        )
        self.uiPrefItems.append(checkItem)
        #sgroup.add_widget(checkItem.getWidget())
        pack(hbox, checkItem.getWidget())
        pack(hbox, gtk.Label(" "))
        item = WidthHeightPrefItem(
            ui,
            "statusIconFixedSizeWH",
            999,
        )
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget(), 1, 1)
        pack(expVbox, hbox)
        ########
        checkItem.syncSensitive(item.getWidget(), reverse=False)
        ####
        pack(vbox, exp)
        ################################ Tab 3 (Regional) ###################
        vbox = gtk.VBox()
        vbox.label = _("_Regional")
        vbox.icon = "preferences-desktop-locale.png"
        self.prefPages.append(vbox)
        ######
        sgroup = gtk.SizeGroup(gtk.SizeGroupMode.HORIZONTAL)
        ######
        hbox = gtk.HBox(spacing=5)
        label = gtk.Label(_("Date Format"))
        label.set_alignment(0, 0.5)
        pack(hbox, label)
        sgroup.add_widget(label)
        #pack(hbox, gtk.Label(""), 1, 1)
        item = ComboEntryTextPrefItem(ud, "dateFormat", (
            "%Y/%m/%d",
            "%Y-%m-%d",
            "%y/%m/%d",
            "%y-%m-%d",
            "%OY/%Om/%Od",
            "%OY-%Om-%Od",
            "%m/%d",
            "%m/%d/%Y",
        ))
        self.gtkPrefItems.append(item)
        pack(hbox, item.getWidget(), 1, 1)
        pack(vbox, hbox)
        ########
        hbox = gtk.HBox(spacing=3)
        pack(hbox, gtk.Label(_("First day of week")))
        ##item = ComboTextPrefItem( ## FIXME
        self.comboFirstWD = gtk.ComboBoxText()
        for item in core.weekDayName:
            self.comboFirstWD.append_text(item)
        self.comboFirstWD.append_text(_("Automatic"))
        self.comboFirstWD.connect("changed", self.comboFirstWDChanged)
        pack(hbox, self.comboFirstWD)
        pack(vbox, hbox)
        #########
        hbox0 = gtk.HBox(spacing=0)
        pack(hbox0, gtk.Label(_("Holidays") + "    "))
        item = WeekDayCheckListPrefItem(core, "holidayWeekDays")
        self.corePrefItems.append(item)
        self.holiWDItem = item  ## Holiday Week Days Item
        pack(hbox0, item.getWidget(), 1, 1)
        pack(vbox, hbox0)
        #########
        hbox = gtk.HBox(spacing=3)
        pack(hbox, gtk.Label(_("First week of year containts")))
        combo = gtk.ComboBoxText()
        texts = [_("First %s of year") % name for name in core.weekDayName] + [
            _("First day of year"),
        ]
        texts[4] += " (ISO 8601)"  ## FIXME
        for text in texts:
            combo.append_text(text)
        #combo.append_text(_("Automatic"))## (as Locale)  # FIXME
        pack(hbox, combo)
        pack(hbox, gtk.Label(""), 1, 1)
        pack(vbox, hbox)
        self.comboWeekYear = combo
        #########
        hbox = gtk.HBox(spacing=3)
        item = CheckPrefItem(
            locale_man,
            "enableNumLocale",
            _("Numbers Localization"),
        )
        self.localePrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        pack(vbox, hbox)
        ##################################################
        ################################
        options = []
        for mod in calTypes:
            for opt in mod.options:
                if opt[0] == "button":
                    try:
                        optl = ModuleOptionButton(opt[1:])
                    except:
                        myRaise()
                        continue
                else:
                    optl = ModuleOptionItem(mod, opt)
                options.append(optl)
                pack(vbox, optl.getWidget())
        self.moduleOptions = options
        ################################ Tab 4 (Advanced) ###################
        vbox = gtk.VBox()
        vbox.label = _("A_dvanced")
        vbox.icon = "applications-system.png"
        self.prefPages.append(vbox)
        ######
        hbox = gtk.HBox(spacing=5)
        #pack(hbox, gtk.Label(""), 1, 1)
        label = gtk.Label(_("Digital Clock Format"))
        label.set_alignment(0, 0.5)
        pack(hbox, label)
        #sgroup.add_widget(label)
        item = ComboEntryTextPrefItem(ud, "clockFormat", (
            "%T",
            "%X",
            "%Y/%m/%d - %T",
            "%OY/%Om/%Od - %X",
            "<i>%Y/%m/%d</i> - %T",
            "<b>%T</b>",
            "<b>%X</b>",
            "%H:%M",
            "<b>%H:%M</b>",
            "<span size=\"smaller\">%OY/%Om/%Od</span>,%X"
            "%OY/%Om/%Od,<span color=\"#ff0000\">%X</span>",
            "<span font=\"bold\">%X</span>",
            "%OH:%OM",
            "<b>%OH:%OM</b>",
        ))
        self.gtkPrefItems.append(item)
        pack(hbox, item.getWidget(), 1, 1)
        pack(vbox, hbox)
        ######
        hbox = gtk.HBox(spacing=5)
        label = gtk.Label(_("Days maximum cache size"))
        label.set_alignment(0, 0.5)
        pack(hbox, label)
        ##sgroup.add_widget(label)
        item = SpinPrefItem(ui, "maxDayCacheSize", 100, 9999, 0)
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(vbox, hbox)
        ################################ Tab 5 (Plugins) ####################
        vbox = gtk.VBox()
        vbox.label = _("_Plugins")
        vbox.icon = "preferences-plugin.png"
        self.prefPages.append(vbox)
        #####
        ##pluginsTextStatusIcon:
        hbox = gtk.HBox()
        if statusIconMode == 1:
            item = CheckPrefItem(
                ui,
                "pluginsTextStatusIcon",
                _("Show in applet (for today)"),
            )
        else:
            item = CheckPrefItem(
                ui,
                "pluginsTextStatusIcon",
                _("Show in Status Icon (for today)"),
            )
        self.uiPrefItems.append(item)
        pack(hbox, item.getWidget())
        pack(hbox, gtk.Label(""), 1, 1)
        pack(vbox, hbox)
        #####
        treev = gtk.TreeView()
        treev.set_headers_clickable(True)
        trees = gtk.ListStore(
            int,  # index
            bool,  # enable
            bool,  # show_date
            str,  # title
        )
        treev.set_model(trees)
        treev.enable_model_drag_source(
            gdk.ModifierType.BUTTON1_MASK,
            [
                ("row", gtk.TargetFlags.SAME_WIDGET, 0),
            ],
            gdk.DragAction.MOVE,
        )
        treev.enable_model_drag_dest(
            [
                ("row", gtk.TargetFlags.SAME_WIDGET, 0),
            ],
            gdk.DragAction.MOVE,
        )
        treev.connect("drag_data_received", self.plugTreevDragReceived)
        treev.get_selection().connect("changed", self.plugTreevCursorChanged)
        treev.connect("row-activated", self.plugTreevRActivate)
        treev.connect("button-press-event", self.plugTreevButtonPress)
        ###
        #treev.drag_source_set_icon_stock(gtk.STOCK_CLOSE)
        #treev.drag_source_add_text_targets()
        #treev.drag_source_add_uri_targets()
        #treev.drag_source_unset()
        ###
        swin = gtk.ScrolledWindow()
        swin.add(treev)
        swin.set_policy(
            gtk.PolicyType.AUTOMATIC,
            gtk.PolicyType.AUTOMATIC,
        )
        ######
        cell = gtk.CellRendererToggle()
        #cell.set_property("activatable", True)
        cell.connect("toggled", self.plugTreeviewCellToggled)
        col = gtk.TreeViewColumn(_("Enable"), cell)
        col.add_attribute(cell, "active", 1)
        #cell.set_active(False)
        col.set_resizable(True)
        col.set_property("expand", False)
        treev.append_column(col)
        ######
        cell = gtk.CellRendererToggle()
        #cell.set_property("activatable", True)
        cell.connect("toggled", self.plugTreeviewCellToggled2)
        col = gtk.TreeViewColumn(_("Show Date"), cell)
        col.add_attribute(cell, "active", 2)
        #cell.set_active(False)
        col.set_resizable(True)
        col.set_property("expand", False)
        treev.append_column(col)
        ######
        #cell = gtk.CellRendererText()
        #col = gtk.TreeViewColumn(_("File Name"), cell, text=2)
        #col.set_resizable(True)
        #treev.append_column(col)
        #treev.set_search_column(1)
        ######
        cell = gtk.CellRendererText()
        #cell.set_property("wrap-mode", gtk.WrapMode.WORD)
        #cell.set_property("editable", True)
        #cell.set_property("wrap-width", 200)
        col = gtk.TreeViewColumn(_("Title"), cell, text=3)
        #treev.connect("draw", self.plugTreevExpose)
        #self.plugTitleCell = cell
        #self.plugTitleCol = col
        #col.set_resizable(True)## No need!
        col.set_property("expand", True)
        treev.append_column(col)
        ######
        #for i in xrange(len(core.plugIndex)):
        #	x = core.plugIndex[i]
        #	trees.append([x[0], x[1], x[2], core.allPlugList[x[0]].title])
        ######
        self.plugTreeview = treev
        self.plugTreestore = trees
        #######################
        hbox = gtk.HBox()
        vboxPlug = gtk.VBox()
        pack(vboxPlug, swin, 1, 1)
        pack(hbox, vboxPlug, 1, 1)
        ###
        hboxBut = gtk.HBox()
        ###
        button = gtk.Button(_("_About Plugin"))
        button.set_use_underline(True)
        button.set_image(
            gtk.Image.new_from_stock(
                gtk.STOCK_ABOUT,
                gtk.IconSize.BUTTON,
            ))
        button.set_sensitive(False)
        button.connect("clicked", self.plugAboutClicked)
        self.plugButtonAbout = button
        pack(hboxBut, button)
        pack(hboxBut, gtk.Label(""), 1, 1)
        ###
        button = gtk.Button(_("C_onfigure Plugin"))
        button.set_use_underline(True)
        button.set_image(
            gtk.Image.new_from_stock(
                gtk.STOCK_PREFERENCES,
                gtk.IconSize.BUTTON,
            ))
        button.set_sensitive(False)
        button.connect("clicked", self.plugConfClicked)
        self.plugButtonConf = button
        pack(hboxBut, button)
        pack(hboxBut, gtk.Label(""), 1, 1)
        ###
        pack(vboxPlug, hboxBut)
        ###
        toolbar = gtk.Toolbar()
        toolbar.set_orientation(gtk.Orientation.VERTICAL)
        #try:  # DeprecationWarning, FIXME
        #	toolbar.set_icon_size(gtk.IconSize.SMALL_TOOLBAR)
        #	# no different (argument to set_icon_size has no effect) FIXME
        #except:
        #	pass
        size = gtk.IconSize.SMALL_TOOLBAR
        # no different
        # argument 2 to image_new_from_stock has no affect FIXME
        ######## gtk.IconSize.SMALL_TOOLBAR or gtk.IconSize.MENU
        tb = toolButtonFromStock(gtk.STOCK_GOTO_TOP, size)
        set_tooltip(tb, _("Move to top"))
        tb.connect("clicked", self.plugTreeviewTop)
        toolbar.insert(tb, -1)
        ########
        tb = toolButtonFromStock(gtk.STOCK_GO_UP, size)
        set_tooltip(tb, _("Move up"))
        tb.connect("clicked", self.plugTreeviewUp)
        toolbar.insert(tb, -1)
        #########
        tb = toolButtonFromStock(gtk.STOCK_GO_DOWN, size)
        set_tooltip(tb, _("Move down"))
        tb.connect("clicked", self.plugTreeviewDown)
        toolbar.insert(tb, -1)
        ########
        tb = toolButtonFromStock(gtk.STOCK_GOTO_BOTTOM, size)
        set_tooltip(tb, _("Move to bottom"))
        tb.connect("clicked", self.plugTreeviewBottom)
        toolbar.insert(tb, -1)
        ##########
        tb = toolButtonFromStock(gtk.STOCK_ADD, size)
        set_tooltip(tb, _("Add"))
        #tb.connect("clicked", lambda obj: self.plugAddDialog.run())
        tb.connect("clicked", self.plugAddClicked)
        #if len(self.plugAddItems) == 0:
        #	tb.set_sensitive(False)
        toolbar.insert(tb, -1)
        self.plugButtonAdd = tb
        ###########
        tb = toolButtonFromStock(gtk.STOCK_DELETE, size)
        set_tooltip(tb, _("Delete"))
        tb.connect("clicked", self.plugTreeviewDel)
        toolbar.insert(tb, -1)
        ###########
        pack(hbox, toolbar)
        #####
        """
		vpan = gtk.VPaned()
		vpan.add1(hbox)
		vbox2 = gtk.VBox()
		pack(vbox2, gtk.Label("Test Label"))
		vpan.add2(vbox2)
		vpan.set_position(100)
		pack(vbox, vpan)
		"""
        pack(vbox, hbox, 1, 1)
        ##########################
        d = gtk.Dialog(parent=self)
        d.set_transient_for(self)
        # dialog.set_transient_for(parent) makes the window on top of parent
        # and at the center point of parent
        # but if you call dialog.show() or dialog.present(), the parent is
        # still active(clickabel widgets) before closing child "dialog"
        # you may call dialog.run() to realy make it transient for parent
        #d.set_has_separator(False)
        d.connect("delete-event", self.plugAddDialogClose)
        d.set_title(_("Add Plugin"))
        ###
        dialog_add_button(
            d,
            gtk.STOCK_CANCEL,
            _("_Cancel"),
            1,
            self.plugAddDialogClose,
        )
        dialog_add_button(
            d,
            gtk.STOCK_OK,
            _("_OK"),
            2,
            self.plugAddDialogOK,
        )
        ###
        treev = gtk.TreeView()
        trees = gtk.ListStore(str)
        treev.set_model(trees)
        #treev.enable_model_drag_source(
        #	gdk.ModifierType.BUTTON1_MASK,
        #	[("", 0, 0, 0)],
        #	gdk.DragAction.MOVE,
        #)  # FIXME
        #treev.enable_model_drag_dest(
        #	[("", 0, 0, 0)],
        #	gdk.DragAction.MOVE,
        #)  # FIXME
        treev.connect("drag_data_received", self.plugTreevDragReceived)
        treev.connect("row-activated", self.plugAddTreevRActivate)
        ####
        cell = gtk.CellRendererText()
        col = gtk.TreeViewColumn(_("Title"), cell, text=0)
        #col.set_resizable(True)# no need when have only one column!
        treev.append_column(col)
        ####
        swin = gtk.ScrolledWindow()
        swin.add(treev)
        swin.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
        pack(d.vbox, swin, 1, 1)
        d.vbox.show_all()
        self.plugAddDialog = d
        self.plugAddTreeview = treev
        self.plugAddTreestore = trees
        #############
        ##treev.set_resize_mode(gtk.RESIZE_IMMEDIATE)
        ##self.plugAddItems = []
        ####################################### Tab 6 (Accounts)
        vbox = gtk.VBox()
        vbox.label = _("Accounts")
        vbox.icon = "web-settings.png"
        self.prefPages.append(vbox)
        #####
        treev = gtk.TreeView()
        treev.set_headers_clickable(True)
        trees = gtk.ListStore(int, bool, str)  ## id (hidden), enable, title
        treev.set_model(trees)
        treev.enable_model_drag_source(
            gdk.ModifierType.BUTTON1_MASK,
            [
                ("row", gtk.TargetFlags.SAME_WIDGET, 0),
            ],
            gdk.DragAction.MOVE,
        )
        treev.enable_model_drag_dest(
            [
                ("row", gtk.TargetFlags.SAME_WIDGET, 0),
            ],
            gdk.DragAction.MOVE,
        )
        treev.connect("row-activated", self.accountsTreevRActivate)
        treev.connect("button-press-event", self.accountsTreevButtonPress)
        ###
        swin = gtk.ScrolledWindow()
        swin.add(treev)
        swin.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
        ######
        cell = gtk.CellRendererToggle()
        #cell.set_property("activatable", True)
        cell.connect("toggled", self.accountsTreeviewCellToggled)
        col = gtk.TreeViewColumn(_("Enable"), cell)
        col.add_attribute(cell, "active", 1)
        #cell.set_active(False)
        col.set_resizable(True)
        col.set_property("expand", False)
        treev.append_column(col)
        ######
        cell = gtk.CellRendererText()
        col = gtk.TreeViewColumn(_("Title"), cell, text=2)
        #col.set_resizable(True)## No need!
        col.set_property("expand", True)
        treev.append_column(col)
        ######
        self.accountsTreeview = treev
        self.accountsTreestore = trees
        #######################
        hbox = gtk.HBox()
        vboxPlug = gtk.VBox()
        pack(vboxPlug, swin, 1, 1)
        pack(hbox, vboxPlug, 1, 1)
        ###
        toolbar = gtk.Toolbar()
        toolbar.set_orientation(gtk.Orientation.VERTICAL)
        #try:  # DeprecationWarning, FIXME
        #	#toolbar.set_icon_size(gtk.IconSize.SMALL_TOOLBAR)
        #	# no different, argument to set_icon_size has no affect FIXME
        #except:
        #	pass
        size = gtk.IconSize.SMALL_TOOLBAR
        # argument 2 to image_new_from_stock has no effect FIXME
        ######## gtk.IconSize.SMALL_TOOLBAR or gtk.IconSize.MENU
        tb = toolButtonFromFile("starcal-24.png")
        set_tooltip(tb, _("Register at StarCalendar.net"))
        tb.connect("clicked", self.accountsRegisterClicked)
        toolbar.insert(tb, -1)
        ###########
        tb = toolButtonFromStock(gtk.STOCK_ADD, size)
        set_tooltip(tb, _("Add"))
        tb.connect("clicked", self.accountsAddClicked)
        toolbar.insert(tb, -1)
        ###########
        tb = toolButtonFromStock(gtk.STOCK_EDIT, size)
        set_tooltip(tb, _("Edit"))
        tb.connect("clicked", self.accountsEditClicked)
        toolbar.insert(tb, -1)
        ###########
        tb = toolButtonFromStock(gtk.STOCK_DELETE, size)
        set_tooltip(tb, _("Delete"))
        tb.connect("clicked", self.accountsDelClicked)
        toolbar.insert(tb, -1)
        ##########
        tb = toolButtonFromStock(gtk.STOCK_GO_UP, size)
        set_tooltip(tb, _("Move up"))
        tb.connect("clicked", self.accountsUpClicked)
        toolbar.insert(tb, -1)
        #########
        tb = toolButtonFromStock(gtk.STOCK_GO_DOWN, size)
        set_tooltip(tb, _("Move down"))
        tb.connect("clicked", self.accountsDownClicked)
        toolbar.insert(tb, -1)
        ###########
        pack(hbox, toolbar)
        pack(vbox, hbox, 1, 1)
        ####################################################################
        notebook = gtk.Notebook()
        self.notebook = notebook
        #####################################
        for vbox in self.prefPages:
            l = gtk.Label(vbox.label)
            l.set_use_underline(True)
            vb = gtk.VBox(spacing=3)
            pack(vb, imageFromFile(vbox.icon))
            pack(vb, l)
            vb.show_all()
            notebook.append_page(vbox, vb)
            try:
                notebook.set_tab_reorderable(vbox, True)
            except AttributeError:
                pass
        #######################
        #notebook.set_property("homogeneous", True)## not in gtk3 FIXME
        #notebook.set_property("tab-border", 5)## not in gtk3 FIXME
        #notebook.set_property("tab-hborder", 15)## not in gtk3 FIXME
        pack(self.vbox, notebook)
        self.vbox.show_all()
        for i in ui.prefPagesOrder:
            try:
                j = ui.prefPagesOrder[i]
            except IndexError:
                continue
            notebook.reorder_child(self.prefPages[i], j)
Example #47
0
    def sync(self, group, remoteGroupId):  # in progress TODO
        """
		return None if successful, or error string if failed
		"""
        print("sync started")
        if not group.remoteIds:
            return "sync not enabled"
        if group.remoteIds[0] != self.id:
            return "mismatch account id"
        groupId = group.remoteIds[1]
        lastSyncTuple = group.getLastSync()
        if lastSyncTuple is None:
            lastSyncStartEpoch = group.getStartEpoch()
            lastSyncEndEpoch = None  # FIXME
        else:
            lastSyncStartEpoch, lastSyncEndEpoch = lastSyncTuple

        syncStart = datetime.now()

        path = "event/groups/%s/modified-events/%s/" % (
            groupId,
            jsonTimeFromEpoch(lastSyncStartEpoch),
        )
        data, error = self.call("get", path)
        if error:
            return error
        try:
            remoteModifiedEvents = data["modifiedEvents"]
        except KeyError:
            return "bad data: missing \"modifiedEvents\""
        try:
            group.setReadOnly(True)

            ### Pull
            for remoteEvent in remoteModifiedEvents:
                # remoteEvent is a dict
                pprint(remoteEvent)
                event, error = decodeRemoteEvent(
                    remoteEvent,
                    self.id,
                    group,
                )
                if error:
                    print(error)
                    continue
                # record = event.save() # record is (lastEpoch, lastHash, **args)
                # event.lastMergeSha1 = [
                # 	record[1], # local sha1
                # 	event.remoteIds[1], # remote sha1
                # ]
                # group.replaceEvent(event)

            ### Push
            if lastSyncEndEpoch:
                pass

        except Exception as e:
            myRaise()
            return "sync failed: %s" % e
        else:
            group.afterSync(syncStart.timestamp())
        finally:
            group.setReadOnly(False)
            group.save()
Example #48
0
from time import localtime
import os
import os.path
from os.path import join, dirname, isdir

sys.path.insert(0, dirname(dirname(dirname(__file__))))

from scal3.path import *
from scal3.utils import myRaise

if not isdir(confDir):
	from scal3.utils import restartLow
	try:
		__import__('scal3.ui_gtk.import_config_2to3')
	except:
		myRaise()
		if not isdir(confDir):
			os.mkdir(confDir, 0o755)
	else:
		restartLow()

from scal3.utils import versionLessThan
from scal3.cal_types import calTypes
from scal3 import core

from scal3 import locale_man
from scal3.locale_man import rtl, lang ## import scal3.locale_man after core
#_ = locale_man.loadTranslator(False)## FIXME
from scal3.locale_man import tr as _
from scal3 import event_lib
from scal3 import ui
Example #49
0
	def sync(self, group, remoteGroupId):  # in progress TODO
		"""
		return None if successful, or error string if failed
		"""
		print("sync started")
		if not group.remoteIds:
			return "sync not enabled"
		if group.remoteIds[0] != self.id:
			return "mismatch account id"
		groupId = group.remoteIds[1]
		lastSyncTuple = group.getLastSync()
		if lastSyncTuple is None:
			lastSyncStartEpoch = group.getStartEpoch()
			lastSyncEndEpoch = None  # FIXME
		else:
			lastSyncStartEpoch, lastSyncEndEpoch = lastSyncTuple

		syncStart = datetime.now()

		path = "event/groups/%s/modified-events/%s/" % (
			groupId,
			jsonTimeFromEpoch(lastSyncStartEpoch),
		)
		data, error = self.call("get", path)
		if error:
			return error
		try:
			remoteModifiedEvents = data["modifiedEvents"]
		except KeyError:
			return "bad data: missing \"modifiedEvents\""
		try:
			group.setReadOnly(True)

			### Pull
			for remoteEvent in remoteModifiedEvents:
				# remoteEvent is a dict
				pprint(remoteEvent)
				event, error = decodeRemoteEvent(
					remoteEvent,
					self.id,
					group,
				)
				if error:
					print(error)
					continue
				# record = event.save() # record is (lastEpoch, lastHash, **args)
				# event.lastMergeSha1 = [
				# 	record[1], # local sha1
				# 	event.remoteIds[1], # remote sha1
				# ]
				# group.replaceEvent(event)

			### Push
			if lastSyncEndEpoch:
				pass

		except Exception as e:
			myRaise()
			return "sync failed: %s" % e
		else:
			group.afterSync(syncStart.timestamp())
		finally:
			group.setReadOnly(False)
			group.save()
Example #50
0
 def drawAll(self, widget=None, cr=None, cursor=True):
     #gevent = gtk.get_current_event()
     #?????? Must enhance (only draw few cells, not all cells)
     self.calcCoord()
     w = self.get_allocation().width
     h = self.get_allocation().height
     if not cr:
         cr = self.get_window().cairo_create()
         #cr.set_line_width(0)#??????????????
         #cr.scale(0.5, 0.5)
     wx = ui.winX
     wy = ui.winY
     if ui.bgUseDesk:## FIXME
         ### ????????????????? Need for mainWin !!!!!
         coord = self.translate_coordinates(self, wx, wy)
         if len(coord)==2:
             from scal3.ui_gtk import desktop
             x0, y0 = coord
             try:
                 bg = desktop.get_wallpaper(x0, y0, w, h)
             except:
                 print('Could not get wallpaper!')
                 myRaise(__file__)
                 #os.popen('gnome-settings-daemon')
                 ui.bgUseDesk = False ##??????????????????
                 #if ui.prefDialog
                 #    ui.prefDialog.checkDeskBg.set_active(False)##??????????????????
             else:
                 gdk.cairo_set_source_pixbuf(cr, bg, 0, 0, 0)
                 cr.paint()
         #else:
         #    print(coord)
     cr.rectangle(0, 0, w, h)
     fillColor(cr, ui.bgColor)
     status = getCurrentMonthStatus()
     #################################### Drawing Border
     if ui.mcalTopMargin>0:
         ##### Drawing border top background
         ##menuBgColor == borderColor ##???????????????
         cr.rectangle(0, 0, w, ui.mcalTopMargin)
         fillColor(cr, ui.borderColor)
         ######## Drawing weekDays names
         setColor(cr, ui.borderTextColor)
         dx = 0
         wdayAb = (self.wdaysWidth > w)
         for i in range(7):
             wday = newTextLayout(self, core.getWeekDayAuto(i, wdayAb))
             try:
                 fontw, fonth = wday.get_pixel_size()
             except:
                 myRaise(__file__)
                 fontw, fonth = wday.get_pixel_size()
             cr.move_to(
                 self.cx[i]-fontw/2.0,
                 (ui.mcalTopMargin-fonth)/2.0-1,
             )
             show_layout(cr, wday)
         ######## Drawing "Menu" label
         setColor(cr, ui.menuTextColor)
         text = newTextLayout(self, _('Menu'))
         fontw, fonth = text.get_pixel_size()
         if rtl:
             cr.move_to(
                 w-(ui.mcalLeftMargin+fontw)/2.0 - 3,
                 (ui.mcalTopMargin-fonth)/2.0 - 1,
             )
         else:
             cr.move_to(
                 (ui.mcalLeftMargin-fontw)/2.0,
                 (ui.mcalTopMargin-fonth)/2.0 - 1,
             )
         show_layout(cr, text)
     if ui.mcalLeftMargin>0:
         ##### Drawing border left background
         if rtl:
             cr.rectangle(
                 w - ui.mcalLeftMargin,
                 ui.mcalTopMargin,
                 ui.mcalLeftMargin,
                 h - ui.mcalTopMargin,
             )
         else:
             cr.rectangle(
                 0,
                 ui.mcalTopMargin,
                 ui.mcalLeftMargin,
                 h - ui.mcalTopMargin,
             )
         fillColor(cr, ui.borderColor)
         ##### Drawing week numbers
         setColor(cr, ui.borderTextColor)
         for i in range(6):
             lay = newTextLayout(self, _(status.weekNum[i]))
             fontw, fonth = lay.get_pixel_size()
             if rtl:
                 cr.move_to(
                     w - (ui.mcalLeftMargin+fontw)/2.0,
                     self.cy[i]-fonth/2.0 + 2,
                 )
             else:
                 cr.move_to(
                     (ui.mcalLeftMargin-fontw)/2.0,
                     self.cy[i]-fonth/2.0 + 2,
                 )
             show_layout(cr, lay)
     selectedCellPos = ui.cell.monthPos
     if ui.todayCell.inSameMonth(ui.cell):
         tx, ty = ui.todayCell.monthPos ## today x and y
         x0 = self.cx[tx] - self.dx/2.0
         y0 = self.cy[ty] - self.dy/2.0
         cr.rectangle(x0, y0, self.dx, self.dy)
         fillColor(cr, ui.todayCellColor)
     for yPos in range(6):
         for xPos in range(7):
             c = status[yPos][xPos]
             x0 = self.cx[xPos]
             y0 = self.cy[yPos]
             cellInactive = (c.month != ui.cell.month)
             cellHasCursor = (cursor and (xPos, yPos) == selectedCellPos)
             if cellHasCursor:
                 ##### Drawing Cursor
                 cx0 = x0 - self.dx/2.0 + 1
                 cy0 = y0 - self.dy/2.0 + 1
                 cw = self.dx - 1
                 ch = self.dy - 1
                 ######### Circular Rounded
                 drawCursorBg(cr, cx0, cy0, cw, ch)
                 fillColor(cr, ui.cursorBgColor)
             ######## end of Drawing Cursor
             if not cellInactive:
                 iconList = c.getMonthEventIcons()
                 if iconList:
                     iconsN = len(iconList)
                     scaleFact = 1.0 / sqrt(iconsN)
                     fromRight = 0
                     for index, icon in enumerate(iconList):
                         ## if len(iconList) > 1 ## FIXME
                         try:
                             pix = GdkPixbuf.Pixbuf.new_from_file(icon)
                         except:
                             myRaise(__file__)
                             continue
                         pix_w = pix.get_width()
                         pix_h = pix.get_height()
                         ## right buttom corner ?????????????????????
                         x1 = (x0 + self.dx/2.0)/scaleFact - fromRight - pix_w # right side
                         y1 = (y0 + self.dy/2.0)/scaleFact - pix_h # buttom side
                         cr.scale(scaleFact, scaleFact)
                         gdk.cairo_set_source_pixbuf(cr, pix, x1, y1)
                         cr.rectangle(x1, y1, pix_w, pix_h)
                         cr.fill()
                         cr.scale(1.0/scaleFact, 1.0/scaleFact)
                         fromRight += pix_w
             #### Drawing numbers inside every cell
             #cr.rectangle(
             #    x0-self.dx/2.0+1,
             #    y0-self.dy/2.0+1,
             #    self.dx-1,
             #    self.dy-1,
             #)
             mode = calTypes.primary
             params = ui.mcalTypeParams[0]
             daynum = newTextLayout(self, _(c.dates[mode][2], mode), params['font'])
             fontw, fonth = daynum.get_pixel_size()
             if cellInactive:
                 setColor(cr, ui.inactiveColor)
             elif c.holiday:
                 setColor(cr, ui.holidayColor)
             else:
                 setColor(cr, params['color'])
             cr.move_to(
                 x0 - fontw/2.0 + params['pos'][0],
                 y0 - fonth/2.0 + params['pos'][1],
             )
             show_layout(cr, daynum)
             if not cellInactive:
                 for mode, params in ui.getActiveMonthCalParams()[1:]:
                     daynum = newTextLayout(self, _(c.dates[mode][2], mode), params['font'])
                     fontw, fonth = daynum.get_pixel_size()
                     setColor(cr, params['color'])
                     cr.move_to(
                         x0 - fontw/2.0 + params['pos'][0],
                         y0 - fonth/2.0 + params['pos'][1],
                     )
                     show_layout(cr, daynum)
                 if cellHasCursor:
                     ##### Drawing Cursor Outline
                     cx0 = x0-self.dx/2.0+1
                     cy0 = y0-self.dy/2.0+1
                     cw = self.dx-1
                     ch = self.dy-1
                     ######### Circular Rounded
                     drawCursorOutline(cr, cx0, cy0, cw, ch)
                     fillColor(cr, ui.cursorOutColor)
                     ##### end of Drawing Cursor Outline
     ################ end of drawing cells
     ##### drawGrid
     if ui.mcalGrid:
         setColor(cr, ui.mcalGridColor)
         for i in range(7):
             cr.rectangle(self.cx[i]+rtlSgn()*self.dx/2.0, 0, 1, h)
             cr.fill()
         for i in range(6):
             cr.rectangle(0, self.cy[i]-self.dy/2.0, w, 1)
             cr.fill()
     return False
Example #51
0
	def __init__(self, statusIconMode, **kwargs):
		gtk.Dialog.__init__(self, **kwargs)
		self.set_title(_('Preferences'))
		self.connect('delete-event', self.onDelete)
		#self.set_has_separator(False)
		#self.set_skip_taskbar_hint(True)
		###
		dialog_add_button(self, gtk.STOCK_CANCEL, _('_Cancel'), 1, self.cancel)
		dialog_add_button(self, gtk.STOCK_APPLY, _('_Apply'), 2, self.apply)
		okB = dialog_add_button(self, gtk.STOCK_OK, _('_OK'), 3, self.ok, tooltip=_('Apply and Close'))
		okB.grab_default()## FIXME
		#okB.grab_focus()## FIXME
		##############################################
		self.localePrefItems = []
		self.corePrefItems = []
		self.uiPrefItems = []
		self.gtkPrefItems = [] ## FIXME
		#####
		self.prefPages = []
		################################ Tab 1 (General) ############################################
		vbox = gtk.VBox()
		vbox.label = _('_General')
		vbox.icon = 'preferences-other.png'
		self.prefPages.append(vbox)
		hbox = gtk.HBox(spacing=3)
		pack(hbox, gtk.Label(_('Language')))
		itemLang = LangPrefItem()
		self.localePrefItems.append(itemLang)
		###
		pack(hbox, itemLang._widget)
		if langSh!='en':
			pack(hbox, gtk.Label('Language'))
		pack(vbox, hbox)
		##########################
		hbox = gtk.HBox()
		frame = gtk.Frame()
		frame.set_label(_('Calendar Types'))
		itemCals = AICalsPrefItem()
		self.corePrefItems.append(itemCals)
		frame.add(itemCals._widget)
		pack(hbox, frame)
		pack(hbox, gtk.Label(''), 1, 1)
		hbox.set_border_width(5)
		#frame.set_border_width(5)
		pack(vbox, hbox, 1, 1)
		##########################
		if statusIconMode!=1:
			hbox = gtk.HBox(spacing=3)
			item = CheckStartupPrefItem()
			self.uiPrefItems.append(item)
			pack(hbox, item._widget, 1, 1)
			pack(vbox, hbox)
			########################
			item = CheckPrefItem(ui, 'showMain', _('Show main window on start'))
			self.uiPrefItems.append(item)
			pack(vbox, item._widget)
		##########################
		item = CheckPrefItem(ui, 'winTaskbar', _('Window in Taskbar'))
		self.uiPrefItems.append(item)
		hbox = gtk.HBox(spacing=3)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		###########
		pack(vbox, hbox)
		##########################
		try:
			import scal3.ui_gtk.starcal_appindicator
		except (ImportError, ValueError):
			pass
		else:
			item = CheckPrefItem(ui, 'useAppIndicator', _('Use AppIndicator'))
			self.uiPrefItems.append(item)
			hbox = gtk.HBox(spacing=3)
			pack(hbox, item._widget)
			pack(hbox, gtk.Label(''), 1, 1)
			pack(vbox, hbox)
		##########################
		hbox = gtk.HBox(spacing=3)
		pack(hbox, gtk.Label(_('Show Digital Clock:')))
		pack(hbox, gtk.Label(''), 1, 1)
		#item = CheckPrefItem(ui, 'showDigClockTb', _('On Toolbar'))## FIXME
		#self.uiPrefItems.append(item)
		#pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		if statusIconMode==1:
			item = CheckPrefItem(ui, 'showDigClockTr', _('On Applet'), 'Panel Applet')
		else:
			item = CheckPrefItem(ui, 'showDigClockTr', _('On Status Icon'), 'Notification Area')
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		pack(vbox, hbox)
		################################ Tab 2 (Appearance) ###########################################
		vbox = gtk.VBox()
		vbox.label = _('A_ppearance')
		vbox.icon = 'preferences-desktop-theme.png'
		self.prefPages.append(vbox)
		########
		hbox = gtk.HBox(spacing=2)
		###
		customCheckItem = CheckPrefItem(ui, 'fontCustomEnable', _('Application Font'))
		self.uiPrefItems.append(customCheckItem)
		pack(hbox, customCheckItem._widget)
		###
		customItem = FontPrefItem(ui, 'fontCustom', self)
		self.uiPrefItems.append(customItem)
		pack(hbox, customItem._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		customCheckItem.syncSensitive(customItem._widget)
		pack(vbox, hbox)
		########################### Theme #####################
		#hbox = gtk.HBox(spacing=3)
		#item = CheckPrefItem(ui, 'bgUseDesk', _('Use Desktop Background'))
		#self.uiPrefItems.append(item)
		#pack(hbox, item._widget)
		#pack(hbox, gtk.Label(''), 1, 1)
		#pack(vbox, hbox)
		#####################
		hbox = gtk.HBox(spacing=3)
		lab = gtk.Label('<b>%s:</b> '%_('Colors'))
		lab.set_use_markup(True)
		pack(hbox, lab)
		pack(hbox, gtk.Label(''), 1, 1)
		###
		pack(hbox, gtk.Label(_('Background')))
		item = ColorPrefItem(ui, 'bgColor', True)
		self.uiPrefItems.append(item)
		self.colorbBg = item._widget ## FIXME
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		###
		pack(hbox, gtk.Label(_('Border')))
		item = ColorPrefItem(ui, 'borderColor', True)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		###
		pack(hbox, gtk.Label(_('Cursor')))
		item = ColorPrefItem(ui, 'cursorOutColor', False)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		###
		pack(hbox, gtk.Label(_('Cursor BG')))
		item = ColorPrefItem(ui, 'cursorBgColor', True)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		###
		pack(hbox, gtk.Label(_('Today')))
		item = ColorPrefItem(ui, 'todayCellColor', True)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		###
		pack(vbox, hbox)
		####################
		hbox = gtk.HBox(spacing=3)
		lab = gtk.Label('<b>%s:</b> '%_('Font Colors'))
		lab.set_use_markup(True)
		pack(hbox, lab)
		pack(hbox, gtk.Label(''), 1, 1)
		####
		pack(hbox, gtk.Label(_('Normal')))
		item = ColorPrefItem(ui, 'textColor', False)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		###
		pack(hbox, gtk.Label(_('Holiday')))
		item = ColorPrefItem(ui, 'holidayColor', False)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		###
		pack(hbox, gtk.Label(_('Inactive Day')))
		item = ColorPrefItem(ui, 'inactiveColor', True)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		####
		pack(hbox, gtk.Label(_('Border')))
		item = ColorPrefItem(ui, 'borderTextColor', False)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		####
		pack(vbox, hbox)
		###################
		hbox = gtk.HBox(spacing=1)
		label = gtk.Label('<b>%s</b>:'%_('Cursor'))
		label.set_use_markup(True)
		pack(hbox, label)
		pack(hbox, gtk.Label(''), 1, 1)
		pack(hbox, gtk.Label(_('Diameter Factor')))
		item = SpinPrefItem(ui, 'cursorDiaFactor', 0, 1, 2)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		###
		pack(hbox, gtk.Label(''), 1, 1)
		pack(hbox, gtk.Label(_('Rounding Factor')))
		item = SpinPrefItem(ui, 'cursorRoundingFactor', 0, 1, 2)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		###
		pack(vbox, hbox)
		###################
		exp = gtk.Expander()
		label = gtk.Label('<b>%s</b>'%_('Status Icon'))
		label.set_use_markup(True)
		exp.set_label_widget(label)
		expVbox = gtk.VBox(spacing=1)
		exp.add(expVbox)
		exp.set_expanded(True)
		sgroup = gtk.SizeGroup(gtk.SizeGroupMode.HORIZONTAL)
		####
		hbox = gtk.HBox(spacing=1)
		pack(hbox, gtk.Label('   '))
		label = gtk.Label(_('Normal Days'))
		sgroup.add_widget(label)
		pack(hbox, label)
		item = FileChooserPrefItem(
			ui,
			'statusIconImage',
			title=_('Select Icon'),
			currentFolder=pixDir,
			defaultVarName='statusIconImageDefault',
		)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget, 1, 1)
		pack(expVbox, hbox)
		####
		hbox = gtk.HBox(spacing=1)
		pack(hbox, gtk.Label('   '))
		label = gtk.Label(_('Holidays'))
		sgroup.add_widget(label)
		pack(hbox, label)
		item = FileChooserPrefItem(
			ui,
			'statusIconImageHoli',
			title=_('Select Icon'),
			currentFolder=pixDir,
			defaultVarName='statusIconImageHoliDefault',
		)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget, 1, 1)
		pack(expVbox, hbox)
		####
		hbox = gtk.HBox(spacing=1)
		pack(hbox, gtk.Label('   '))
		checkItem = CheckPrefItem(
			ui,
			'statusIconFontFamilyEnable',
			label=_('Change font family to'),
			#tooltip=_('In SVG files'),
		)
		self.uiPrefItems.append(checkItem)
		#sgroup.add_widget(checkItem._widget)
		pack(hbox, checkItem._widget)
		item = FontFamilyPrefItem(
			ui,
			'statusIconFontFamily',
		)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget, 1, 1)
		pack(expVbox, hbox)
		####
		hbox = gtk.HBox(spacing=1)
		pack(hbox, gtk.Label('   '))
		checkItem = CheckPrefItem(
			ui,
			'statusIconFixedSizeEnable',
			label=_('Fixed Size'),
			#tooltip=_(''),
		)
		self.uiPrefItems.append(checkItem)
		#sgroup.add_widget(checkItem._widget)
		pack(hbox, checkItem._widget)
		pack(hbox, gtk.Label('  '))
		item = WidthHeightPrefItem(
			ui,
			'statusIconFixedSizeWH',
			999,
		)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget, 1, 1)      
		pack(expVbox, hbox)
		########
		checkItem.syncSensitive(item._widget, reverse=False)
		####
		pack(vbox, exp)
		################################ Tab 3 (Advanced) ###########################################
		vbox = gtk.VBox()
		vbox.label = _('A_dvanced')
		vbox.icon = 'applications-system.png'
		self.prefPages.append(vbox)
		######
		sgroup = gtk.SizeGroup(gtk.SizeGroupMode.HORIZONTAL)
		######
		hbox = gtk.HBox(spacing=5)
		label = gtk.Label(_('Date Format'))
		label.set_alignment(0, 0.5)
		pack(hbox, label)
		sgroup.add_widget(label)
		#pack(hbox, gtk.Label(''), 1, 1)
		item = ComboEntryTextPrefItem(ud, 'dateFormat', (
			'%Y/%m/%d',
			'%Y-%m-%d',
			'%y/%m/%d',
			'%y-%m-%d',
			'%OY/%Om/%Od',
			'%OY-%Om-%Od',
			'%m/%d',
			'%m/%d/%Y',
		))
		self.gtkPrefItems.append(item)
		pack(hbox, item._widget, 1, 1)
		pack(vbox, hbox)
		###
		hbox = gtk.HBox(spacing=5)
		#pack(hbox, gtk.Label(''), 1, 1)
		label = gtk.Label(_('Digital Clock Format'))
		label.set_alignment(0, 0.5)
		pack(hbox, label)
		sgroup.add_widget(label)
		item = ComboEntryTextPrefItem(ud, 'clockFormat', (
			'%T',
			'%X',
			'%Y/%m/%d - %T',
			'%OY/%Om/%Od - %X',
			'<i>%Y/%m/%d</i> - %T',
			'<b>%T</b>',
			'<b>%X</b>',
			'%H:%M',
			'<b>%H:%M</b>',
			'<span size="smaller">%OY/%Om/%Od</span>,%X'
			'%OY/%Om/%Od,<span color="#ff0000">%X</span>',
			'<span font="bold">%X</span>',
			'%OH:%OM',
			'<b>%OH:%OM</b>',
		))
		self.gtkPrefItems.append(item)
		pack(hbox, item._widget, 1, 1)
		pack(vbox, hbox)
		######
		hbox = gtk.HBox(spacing=5)
		label = gtk.Label(_('Days maximum cache size'))
		label.set_alignment(0, 0.5)
		pack(hbox, label)
		##sgroup.add_widget(label)
		item = SpinPrefItem(ui, 'maxDayCacheSize', 100, 9999, 0)
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(vbox, hbox)
		vbox4 = vbox
		########
		hbox = gtk.HBox(spacing=3)
		pack(hbox, gtk.Label(_('First day of week')))
		##item = ComboTextPrefItem( ## FIXME
		self.comboFirstWD = gtk.ComboBoxText()
		for item in core.weekDayName:
			self.comboFirstWD.append_text(item)
		self.comboFirstWD.append_text(_('Automatic'))
		self.comboFirstWD.connect('changed', self.comboFirstWDChanged)
		pack(hbox, self.comboFirstWD)
		pack(vbox, hbox)
		#########
		hbox0 = gtk.HBox(spacing=0)
		pack(hbox0, gtk.Label(_('Holidays')+'    '))
		item = WeekDayCheckListPrefItem(core, 'holidayWeekDays')
		self.corePrefItems.append(item)
		self.holiWDItem = item ## Holiday Week Days Item
		pack(hbox0, item._widget, 1, 1)
		pack(vbox, hbox0)
		#########
		hbox = gtk.HBox(spacing=3)
		pack(hbox, gtk.Label(_('First week of year containts')))
		combo = gtk.ComboBoxText()
		texts = [_('First %s of year')%name for name in core.weekDayName]+[_('First day of year')]
		texts[4] += ' (ISO 8601)' ## FIXME
		for text in texts:
			combo.append_text(text)
		#combo.append_text(_('Automatic'))## (as Locale)## FIXME
		pack(hbox, combo)
		pack(hbox, gtk.Label(''), 1, 1)
		pack(vbox, hbox)
		self.comboWeekYear = combo
		#########
		hbox = gtk.HBox(spacing=3)
		item = CheckPrefItem(locale_man, 'enableNumLocale', _('Numbers Localization'))
		self.localePrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		pack(vbox, hbox)
		##################################################
		################################
		options = []
		for mod in calTypes:
			for opt in mod.options:
				if opt[0]=='button':
					try:
						optl = ModuleOptionButton(opt[1:])
					except:
						myRaise()
						continue
				else:
					optl = ModuleOptionItem(mod, opt)
				options.append(optl)
				pack(vbox, optl._widget)
		self.moduleOptions = options
		################################ Tab 4 (Plugins) ############################################
		vbox = gtk.VBox()
		vbox.label = _('_Plugins')
		vbox.icon = 'preferences-plugin.png'
		self.prefPages.append(vbox)
		#####
		##pluginsTextStatusIcon:
		hbox = gtk.HBox()
		if statusIconMode==1:
			item = CheckPrefItem(ui, 'pluginsTextStatusIcon', _('Show in applet (for today)'))
		else:
			item = CheckPrefItem(ui, 'pluginsTextStatusIcon', _('Show in Status Icon (for today)'))
		self.uiPrefItems.append(item)
		pack(hbox, item._widget)
		pack(hbox, gtk.Label(''), 1, 1)
		pack(vbox, hbox)
		#####
		treev = gtk.TreeView()
		treev.set_headers_clickable(True)
		trees = gtk.ListStore(int, bool, bool, str)
		treev.set_model(trees)
		treev.enable_model_drag_source(gdk.ModifierType.BUTTON1_MASK, [('row', gtk.TargetFlags.SAME_WIDGET, 0)], gdk.DragAction.MOVE)
		treev.enable_model_drag_dest([('row', gtk.TargetFlags.SAME_WIDGET, 0)], gdk.DragAction.MOVE)
		treev.connect('drag_data_received', self.plugTreevDragReceived)
		treev.get_selection().connect('changed', self.plugTreevCursorChanged)
		treev.connect('row-activated', self.plugTreevRActivate)
		treev.connect('button-press-event', self.plugTreevButtonPress)
		###
		#treev.drag_source_set_icon_stock(gtk.STOCK_CLOSE)
		#treev.drag_source_add_text_targets()
		#treev.drag_source_add_uri_targets()
		#treev.drag_source_unset()
		###
		swin = gtk.ScrolledWindow()
		swin.add(treev)
		swin.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
		######
		cell = gtk.CellRendererToggle()
		#cell.set_property('activatable', True)
		cell.connect('toggled', self.plugTreeviewCellToggled)
		col = gtk.TreeViewColumn(_('Enable'), cell)
		col.add_attribute(cell, 'active', 1)
		#cell.set_active(False)
		col.set_resizable(True)
		col.set_property('expand', False)
		treev.append_column(col)
		######
		cell = gtk.CellRendererToggle()
		#cell.set_property('activatable', True)
		cell.connect('toggled', self.plugTreeviewCellToggled2)
		col = gtk.TreeViewColumn(_('Show Date'), cell)
		col.add_attribute(cell, 'active', 2)
		#cell.set_active(False)
		col.set_resizable(True)
		col.set_property('expand', False)
		treev.append_column(col)
		######
		#cell = gtk.CellRendererText()
		#col = gtk.TreeViewColumn(_('File Name'), cell, text=2)
		#col.set_resizable(True)
		#treev.append_column(col)
		#treev.set_search_column(1)
		######
		cell = gtk.CellRendererText()
		#cell.set_property('wrap-mode', gtk.WrapMode.WORD)
		#cell.set_property('editable', True)
		#cell.set_property('wrap-width', 200)
		col = gtk.TreeViewColumn(_('Title'), cell, text=3)
		#treev.connect('draw', self.plugTreevExpose)
		#self.plugTitleCell = cell
		#self.plugTitleCol = col
		#col.set_resizable(True)## No need!
		col.set_property('expand', True)
		treev.append_column(col)
		######
		#for i in xrange(len(core.plugIndex)):
		#	x = core.plugIndex[i]
		#	trees.append([x[0], x[1], x[2], core.allPlugList[x[0]].title])
		######
		self.plugTreeview = treev
		self.plugTreestore = trees
		#######################
		hbox = gtk.HBox()
		vboxPlug = gtk.VBox()
		pack(vboxPlug, swin, 1, 1)
		pack(hbox, vboxPlug, 1, 1)
		###
		hboxBut = gtk.HBox()
		###
		button = gtk.Button(_('_About Plugin'))
		button.set_image(gtk.Image.new_from_stock(gtk.STOCK_ABOUT, gtk.IconSize.BUTTON))
		button.set_sensitive(False)
		button.connect('clicked', self.plugAboutClicked)
		self.plugButtonAbout = button
		pack(hboxBut, button)
		pack(hboxBut, gtk.Label(''), 1, 1)
		###
		button = gtk.Button(_('C_onfigure Plugin'))
		button.set_image(gtk.Image.new_from_stock(gtk.STOCK_PREFERENCES, gtk.IconSize.BUTTON))
		button.set_sensitive(False)
		button.connect('clicked', self.plugConfClicked)
		self.plugButtonConf = button
		pack(hboxBut, button)
		pack(hboxBut, gtk.Label(''), 1, 1)
		###
		pack(vboxPlug, hboxBut)
		###
		toolbar = gtk.Toolbar()
		toolbar.set_orientation(gtk.Orientation.VERTICAL)
		#try:## DeprecationWarning ## FIXME
			#toolbar.set_icon_size(gtk.IconSize.SMALL_TOOLBAR)
			### no different (argument to set_icon_size does not affect) FIXME
		#except:
		#	pass
		size = gtk.IconSize.SMALL_TOOLBAR
		##no different(argument2 to image_new_from_stock does not affect) FIXME
		######## gtk.IconSize.SMALL_TOOLBAR or gtk.IconSize.MENU
		tb = toolButtonFromStock(gtk.STOCK_GOTO_TOP, size)
		set_tooltip(tb, _('Move to top'))
		tb.connect('clicked', self.plugTreeviewTop)
		toolbar.insert(tb, -1)
		########
		tb = toolButtonFromStock(gtk.STOCK_GO_UP, size)
		set_tooltip(tb, _('Move up'))
		tb.connect('clicked', self.plugTreeviewUp)
		toolbar.insert(tb, -1)
		#########
		tb = toolButtonFromStock(gtk.STOCK_GO_DOWN, size)
		set_tooltip(tb, _('Move down'))
		tb.connect('clicked', self.plugTreeviewDown)
		toolbar.insert(tb, -1)
		########
		tb = toolButtonFromStock(gtk.STOCK_GOTO_BOTTOM, size)
		set_tooltip(tb, _('Move to bottom'))
		tb.connect('clicked', self.plugTreeviewBottom)
		toolbar.insert(tb, -1)
		##########
		tb = toolButtonFromStock(gtk.STOCK_ADD, size)
		set_tooltip(tb, _('Add'))
		#tb.connect('clicked', lambda obj: self.plugAddDialog.run())
		tb.connect('clicked', self.plugAddClicked)
		#if len(self.plugAddItems)==0:
		#	tb.set_sensitive(False)
		toolbar.insert(tb, -1)
		self.plugButtonAdd = tb
		###########
		tb = toolButtonFromStock(gtk.STOCK_DELETE, size)
		set_tooltip(tb, _('Delete'))
		tb.connect('clicked', self.plugTreeviewDel)
		toolbar.insert(tb, -1)
		###########
		pack(hbox, toolbar)
		#####
		'''
		vpan = gtk.VPaned()
		vpan.add1(hbox)
		vbox2 = gtk.VBox()
		pack(vbox2, gtk.Label('Test Label'))
		vpan.add2(vbox2)
		vpan.set_position(100)
		pack(vbox, vpan)
		'''
		pack(vbox, hbox, 1, 1)
		##########################
		d = gtk.Dialog(parent=self)
		d.set_transient_for(self)
		## dialog.set_transient_for(parent) makes the window on top of parent and at the center point of parent
		## but if you call dialog.show() or dialog.present(), the parent is still active(clickabel widgets) before closing child "dialog"
		## you may call dialog.run() to realy make it transient for parent
		#d.set_has_separator(False)
		d.connect('delete-event', self.plugAddDialogClose)
		d.set_title(_('Add Plugin'))
		###
		dialog_add_button(d, gtk.STOCK_CANCEL, _('_Cancel'), 1, self.plugAddDialogClose)
		dialog_add_button(d, gtk.STOCK_OK, _('_OK'), 2, self.plugAddDialogOK)
		###
		treev = gtk.TreeView()
		trees = gtk.ListStore(str)
		treev.set_model(trees)
		#treev.enable_model_drag_source(gdk.ModifierType.BUTTON1_MASK, [('', 0, 0, 0)], gdk.DragAction.MOVE)## FIXME
		#treev.enable_model_drag_dest([('', 0, 0, 0)], gdk.DragAction.MOVE)## FIXME
		treev.connect('drag_data_received', self.plugTreevDragReceived)
		treev.connect('row-activated', self.plugAddTreevRActivate)
		####
		cell = gtk.CellRendererText()
		col = gtk.TreeViewColumn(_('Title'), cell, text=0)
		#col.set_resizable(True)# no need when have only one column!
		treev.append_column(col)
		####
		swin = gtk.ScrolledWindow()
		swin.add(treev)
		swin.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
		pack(d.vbox, swin, 1, 1)
		d.vbox.show_all()
		self.plugAddDialog = d
		self.plugAddTreeview = treev
		self.plugAddTreestore = trees
		#############
		##treev.set_resize_mode(gtk.RESIZE_IMMEDIATE)
		##self.plugAddItems = []
		####################################### Tab 5 (Accounts)
		vbox = gtk.VBox()
		vbox.label = _('Accounts')
		vbox.icon = 'web-settings.png'
		self.prefPages.append(vbox)
		#####
		treev = gtk.TreeView()
		treev.set_headers_clickable(True)
		trees = gtk.ListStore(int, bool, str)## id (hidden), enable, title
		treev.set_model(trees)
		treev.enable_model_drag_source(gdk.ModifierType.BUTTON1_MASK, [('row', gtk.TargetFlags.SAME_WIDGET, 0)], gdk.DragAction.MOVE)
		treev.enable_model_drag_dest([('row', gtk.TargetFlags.SAME_WIDGET, 0)], gdk.DragAction.MOVE)
		treev.connect('row-activated', self.accountsTreevRActivate)
		treev.connect('button-press-event', self.accountsTreevButtonPress)
		###
		swin = gtk.ScrolledWindow()
		swin.add(treev)
		swin.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
		######
		cell = gtk.CellRendererToggle()
		#cell.set_property('activatable', True)
		cell.connect('toggled', self.accountsTreeviewCellToggled)
		col = gtk.TreeViewColumn(_('Enable'), cell)
		col.add_attribute(cell, 'active', 1)
		#cell.set_active(False)
		col.set_resizable(True)
		col.set_property('expand', False)
		treev.append_column(col)
		######
		cell = gtk.CellRendererText()
		col = gtk.TreeViewColumn(_('Title'), cell, text=2)
		#col.set_resizable(True)## No need!
		col.set_property('expand', True)
		treev.append_column(col)
		######
		self.accountsTreeview = treev
		self.accountsTreestore = trees
		#######################
		hbox = gtk.HBox()
		vboxPlug = gtk.VBox()
		pack(vboxPlug, swin, 1, 1)
		pack(hbox, vboxPlug, 1, 1)
		###
		toolbar = gtk.Toolbar()
		toolbar.set_orientation(gtk.Orientation.VERTICAL)
		#try:## DeprecationWarning ## FIXME
			#toolbar.set_icon_size(gtk.IconSize.SMALL_TOOLBAR)
			### no different (argument to set_icon_size does not affect) FIXME
		#except:
		#	pass
		size = gtk.IconSize.SMALL_TOOLBAR
		##no different(argument2 to image_new_from_stock does not affect) FIXME
		######## gtk.IconSize.SMALL_TOOLBAR or gtk.IconSize.MENU
		tb = toolButtonFromStock(gtk.STOCK_EDIT, size)
		set_tooltip(tb, _('Edit'))
		tb.connect('clicked', self.accountsEditClicked)
		toolbar.insert(tb, -1)
		###########
		tb = toolButtonFromStock(gtk.STOCK_ADD, size)
		set_tooltip(tb, _('Add'))
		tb.connect('clicked', self.accountsAddClicked)
		toolbar.insert(tb, -1)
		###########
		tb = toolButtonFromStock(gtk.STOCK_DELETE, size)
		set_tooltip(tb, _('Delete'))
		tb.connect('clicked', self.accountsDelClicked)
		toolbar.insert(tb, -1)
		##########
		tb = toolButtonFromStock(gtk.STOCK_GO_UP, size)
		set_tooltip(tb, _('Move up'))
		tb.connect('clicked', self.accountsUpClicked)
		toolbar.insert(tb, -1)
		#########
		tb = toolButtonFromStock(gtk.STOCK_GO_DOWN, size)
		set_tooltip(tb, _('Move down'))
		tb.connect('clicked', self.accountsDownClicked)
		toolbar.insert(tb, -1)
		###########
		pack(hbox, toolbar)
		pack(vbox, hbox, 1, 1)
		###################################################################################################
		notebook = gtk.Notebook()
		self.notebook = notebook
		#####################################
		for vbox in self.prefPages:
			l = gtk.Label(vbox.label)
			l.set_use_underline(True)
			vb = gtk.VBox(spacing=3)
			pack(vb, imageFromFile(vbox.icon))
			pack(vb, l)
			vb.show_all()
			notebook.append_page(vbox, vb)
			try:
				notebook.set_tab_reorderable(vbox, True)
			except AttributeError:
				pass
		#######################
		#notebook.set_property('homogeneous', True)## not in gtk3 FIXME
		#notebook.set_property('tab-border', 5)## not in gtk3 FIXME
		#notebook.set_property('tab-hborder', 15)## not in gtk3 FIXME
		pack(self.vbox, notebook)
		self.vbox.show_all()
		for i in ui.prefPagesOrder:
			try:
				j = ui.prefPagesOrder[i]
			except IndexError:
				continue
			notebook.reorder_child(self.prefPages[i], j)
Example #52
0
from time import localtime
import os
import os.path
from os.path import join, dirname, isdir

sys.path.insert(0, dirname(dirname(dirname(__file__))))

from scal3.path import *
from scal3.utils import myRaise

if not isdir(confDir):
    from scal3.utils import restartLow
    try:
        __import__('scal3.ui_gtk.import_config_2to3')
    except:
        myRaise()
        if not isdir(confDir):
            os.mkdir(confDir, 0o755)
    else:
        restartLow()

from scal3.utils import versionLessThan
from scal3.cal_types import calTypes
from scal3 import core

from scal3 import locale_man
from scal3.locale_man import rtl, lang ## import scal3.locale_man after core
#_ = locale_man.loadTranslator(False)## FIXME
from scal3.locale_man import tr as _
from scal3 import event_lib
from scal3 import ui
Example #53
0
	def drawAll(self, widget=None, cr=None, cursor=True):
		#gevent = gtk.get_current_event()
		w = self.get_allocation().width
		h = self.get_allocation().height
		if not cr:
			cr = self.get_window().cairo_create()
			#cr.set_line_width(0)#??????????????
			#cr.scale(0.5, 0.5)
		cr.rectangle(0, 0, w, h)
		fillColor(cr, ui.bgColor)
		#####
		c = ui.cell
		x0 = 0
		y0 = 0
		dx = w
		dy = h
		########
		iconList = c.getDayEventIcons()
		if iconList:
			iconsN = len(iconList)
			scaleFact = 3.0 / sqrt(iconsN)
			fromRight = 0
			for index, icon in enumerate(iconList):
				## if len(iconList) > 1 ## FIXME
				try:
					pix = GdkPixbuf.Pixbuf.new_from_file(icon)
				except:
					myRaise(__file__)
					continue
				pix_w = pix.get_width()
				pix_h = pix.get_height()
				## right buttom corner ?????????????????????
				x1 = (x0 + dx) / scaleFact - fromRight - pix_w # right side
				y1 = (y0 + dy / 2) / scaleFact - pix_h / 2 # middle
				cr.scale(scaleFact, scaleFact)
				gdk.cairo_set_source_pixbuf(cr, pix, x1, y1)
				cr.rectangle(x1, y1, pix_w, pix_h)
				cr.fill()
				cr.scale(1 / scaleFact, 1 / scaleFact)
				fromRight += pix_w
		#### Drawing numbers inside every cell
		#cr.rectangle(
		#	x0-dx/2.0+1,
		#	y0-self.dy/2.0+1,
		#	dx-1,
		#	dy-1,
		#)
		mode = calTypes.primary
		params = ui.dcalTypeParams[0]
		daynum = newTextLayout(
			self,
			_(c.dates[mode][2], mode),
			params["font"],
		)
		fontw, fonth = daynum.get_pixel_size()
		if c.holiday:
			setColor(cr, ui.holidayColor)
		else:
			setColor(cr, params["color"])
		cr.move_to(
			x0 + dx / 2 - fontw / 2 + params["pos"][0],
			y0 + dy / 2 - fonth / 2 + params["pos"][1],
		)
		show_layout(cr, daynum)
		####
		for mode, params in ui.getActiveDayCalParams()[1:]:
			daynum = newTextLayout(self, _(c.dates[mode][2], mode), params["font"])
			fontw, fonth = daynum.get_pixel_size()
			setColor(cr, params["color"])
			cr.move_to(
				x0 + dx / 2 - fontw / 2 + params["pos"][0],
				y0 + dy / 2 - fonth / 2 + params["pos"][1],
			)
			show_layout(cr, daynum)
Example #54
0
    def __init__(self, statusIconMode, **kwargs):
        gtk.Dialog.__init__(self, **kwargs)
        self.set_title(_('Preferences'))
        self.connect('delete-event', self.onDelete)
        #self.set_has_separator(False)
        #self.set_skip_taskbar_hint(True)
        ###
        dialog_add_button(self, gtk.STOCK_CANCEL, _('_Cancel'), 1, self.cancel)
        dialog_add_button(self, gtk.STOCK_APPLY, _('_Apply'), 2, self.apply)
        okB = dialog_add_button(self,
                                gtk.STOCK_OK,
                                _('_OK'),
                                3,
                                self.ok,
                                tooltip=_('Apply and Close'))
        okB.grab_default()  ## FIXME
        #okB.grab_focus()## FIXME
        ##############################################
        self.localePrefItems = []
        self.corePrefItems = []
        self.uiPrefItems = []
        self.gtkPrefItems = []  ## FIXME
        #####
        self.prefPages = []
        ################################ Tab 1 (General) ############################################
        vbox = gtk.VBox()
        vbox.label = _('_General')
        vbox.icon = 'preferences-other.png'
        self.prefPages.append(vbox)
        hbox = gtk.HBox(spacing=3)
        pack(hbox, gtk.Label(_('Language')))
        itemLang = LangPrefItem()
        self.localePrefItems.append(itemLang)
        ###
        pack(hbox, itemLang._widget)
        if langSh != 'en':
            pack(hbox, gtk.Label('Language'))
        pack(vbox, hbox)
        ##########################
        hbox = gtk.HBox()
        frame = gtk.Frame()
        frame.set_label(_('Calendar Types'))
        itemCals = AICalsPrefItem()
        self.corePrefItems.append(itemCals)
        frame.add(itemCals._widget)
        pack(hbox, frame)
        pack(hbox, gtk.Label(''), 1, 1)
        hbox.set_border_width(5)
        #frame.set_border_width(5)
        pack(vbox, hbox, 1, 1)
        ##########################
        if statusIconMode != 1:
            hbox = gtk.HBox(spacing=3)
            item = CheckStartupPrefItem()
            self.uiPrefItems.append(item)
            pack(hbox, item._widget, 1, 1)
            pack(vbox, hbox)
            ########################
            item = CheckPrefItem(ui, 'showMain',
                                 _('Show main window on start'))
            self.uiPrefItems.append(item)
            pack(vbox, item._widget)
        ##########################
        item = CheckPrefItem(ui, 'winTaskbar', _('Window in Taskbar'))
        self.uiPrefItems.append(item)
        hbox = gtk.HBox(spacing=3)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ###########
        pack(vbox, hbox)
        ##########################
        try:
            import scal3.ui_gtk.starcal_appindicator
        except (ImportError, ValueError):
            pass
        else:
            item = CheckPrefItem(ui, 'useAppIndicator', _('Use AppIndicator'))
            self.uiPrefItems.append(item)
            hbox = gtk.HBox(spacing=3)
            pack(hbox, item._widget)
            pack(hbox, gtk.Label(''), 1, 1)
            pack(vbox, hbox)
        ##########################
        hbox = gtk.HBox(spacing=3)
        pack(hbox, gtk.Label(_('Show Digital Clock:')))
        pack(hbox, gtk.Label(''), 1, 1)
        #item = CheckPrefItem(ui, 'showDigClockTb', _('On Toolbar'))## FIXME
        #self.uiPrefItems.append(item)
        #pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        if statusIconMode == 1:
            item = CheckPrefItem(ui, 'showDigClockTr', _('On Applet'),
                                 'Panel Applet')
        else:
            item = CheckPrefItem(ui, 'showDigClockTr', _('On Status Icon'),
                                 'Notification Area')
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        pack(vbox, hbox)
        ################################ Tab 2 (Appearance) ###########################################
        vbox = gtk.VBox()
        vbox.label = _('A_ppearance')
        vbox.icon = 'preferences-desktop-theme.png'
        self.prefPages.append(vbox)
        ########
        hbox = gtk.HBox(spacing=2)
        ###
        customCheckItem = CheckPrefItem(ui, 'fontCustomEnable',
                                        _('Application Font'))
        self.uiPrefItems.append(customCheckItem)
        pack(hbox, customCheckItem._widget)
        ###
        customItem = FontPrefItem(ui, 'fontCustom', self)
        self.uiPrefItems.append(customItem)
        pack(hbox, customItem._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        customCheckItem.syncSensitive(customItem._widget)
        pack(vbox, hbox)
        ########################### Theme #####################
        #hbox = gtk.HBox(spacing=3)
        #item = CheckPrefItem(ui, 'bgUseDesk', _('Use Desktop Background'))
        #self.uiPrefItems.append(item)
        #pack(hbox, item._widget)
        #pack(hbox, gtk.Label(''), 1, 1)
        #pack(vbox, hbox)
        #####################
        hbox = gtk.HBox(spacing=3)
        lab = gtk.Label('<b>%s:</b> ' % _('Colors'))
        lab.set_use_markup(True)
        pack(hbox, lab)
        pack(hbox, gtk.Label(''), 1, 1)
        ###
        pack(hbox, gtk.Label(_('Background')))
        item = ColorPrefItem(ui, 'bgColor', True)
        self.uiPrefItems.append(item)
        self.colorbBg = item._widget  ## FIXME
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ###
        pack(hbox, gtk.Label(_('Border')))
        item = ColorPrefItem(ui, 'borderColor', True)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ###
        pack(hbox, gtk.Label(_('Cursor')))
        item = ColorPrefItem(ui, 'cursorOutColor', False)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ###
        pack(hbox, gtk.Label(_('Cursor BG')))
        item = ColorPrefItem(ui, 'cursorBgColor', True)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ###
        pack(hbox, gtk.Label(_('Today')))
        item = ColorPrefItem(ui, 'todayCellColor', True)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ###
        pack(vbox, hbox)
        ####################
        hbox = gtk.HBox(spacing=3)
        lab = gtk.Label('<b>%s:</b> ' % _('Font Colors'))
        lab.set_use_markup(True)
        pack(hbox, lab)
        pack(hbox, gtk.Label(''), 1, 1)
        ####
        pack(hbox, gtk.Label(_('Normal')))
        item = ColorPrefItem(ui, 'textColor', False)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ###
        pack(hbox, gtk.Label(_('Holiday')))
        item = ColorPrefItem(ui, 'holidayColor', False)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ###
        pack(hbox, gtk.Label(_('Inactive Day')))
        item = ColorPrefItem(ui, 'inactiveColor', True)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ####
        pack(hbox, gtk.Label(_('Border')))
        item = ColorPrefItem(ui, 'borderTextColor', False)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ####
        pack(vbox, hbox)
        ###################
        hbox = gtk.HBox(spacing=1)
        label = gtk.Label('<b>%s</b>:' % _('Cursor'))
        label.set_use_markup(True)
        pack(hbox, label)
        pack(hbox, gtk.Label(''), 1, 1)
        pack(hbox, gtk.Label(_('Diameter Factor')))
        item = SpinPrefItem(ui, 'cursorDiaFactor', 0, 1, 2)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        ###
        pack(hbox, gtk.Label(''), 1, 1)
        pack(hbox, gtk.Label(_('Rounding Factor')))
        item = SpinPrefItem(ui, 'cursorRoundingFactor', 0, 1, 2)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        ###
        pack(vbox, hbox)
        ###################
        exp = gtk.Expander()
        label = gtk.Label('<b>%s</b>' % _('Status Icon'))
        label.set_use_markup(True)
        exp.set_label_widget(label)
        expVbox = gtk.VBox(spacing=1)
        exp.add(expVbox)
        exp.set_expanded(True)
        sgroup = gtk.SizeGroup(gtk.SizeGroupMode.HORIZONTAL)
        ####
        hbox = gtk.HBox(spacing=1)
        pack(hbox, gtk.Label('   '))
        label = gtk.Label(_('Normal Days'))
        sgroup.add_widget(label)
        pack(hbox, label)
        item = FileChooserPrefItem(
            ui,
            'statusIconImage',
            title=_('Select Icon'),
            currentFolder=pixDir,
            defaultVarName='statusIconImageDefault',
        )
        self.uiPrefItems.append(item)
        pack(hbox, item._widget, 1, 1)
        pack(expVbox, hbox)
        ####
        hbox = gtk.HBox(spacing=1)
        pack(hbox, gtk.Label('   '))
        label = gtk.Label(_('Holidays'))
        sgroup.add_widget(label)
        pack(hbox, label)
        item = FileChooserPrefItem(
            ui,
            'statusIconImageHoli',
            title=_('Select Icon'),
            currentFolder=pixDir,
            defaultVarName='statusIconImageHoliDefault',
        )
        self.uiPrefItems.append(item)
        pack(hbox, item._widget, 1, 1)
        pack(expVbox, hbox)
        ####
        hbox = gtk.HBox(spacing=1)
        pack(hbox, gtk.Label('   '))
        checkItem = CheckPrefItem(
            ui,
            'statusIconFontFamilyEnable',
            label=_('Change font family to'),
            #tooltip=_('In SVG files'),
        )
        self.uiPrefItems.append(checkItem)
        #sgroup.add_widget(checkItem._widget)
        pack(hbox, checkItem._widget)
        item = FontFamilyPrefItem(
            ui,
            'statusIconFontFamily',
        )
        self.uiPrefItems.append(item)
        pack(hbox, item._widget, 1, 1)
        pack(expVbox, hbox)
        ####
        hbox = gtk.HBox(spacing=1)
        pack(hbox, gtk.Label('   '))
        checkItem = CheckPrefItem(
            ui,
            'statusIconFixedSizeEnable',
            label=_('Fixed Size'),
            #tooltip=_(''),
        )
        self.uiPrefItems.append(checkItem)
        #sgroup.add_widget(checkItem._widget)
        pack(hbox, checkItem._widget)
        pack(hbox, gtk.Label('  '))
        item = WidthHeightPrefItem(
            ui,
            'statusIconFixedSizeWH',
            999,
        )
        self.uiPrefItems.append(item)
        pack(hbox, item._widget, 1, 1)
        pack(expVbox, hbox)
        ########
        checkItem.syncSensitive(item._widget, reverse=False)
        ####
        pack(vbox, exp)
        ################################ Tab 3 (Advanced) ###########################################
        vbox = gtk.VBox()
        vbox.label = _('A_dvanced')
        vbox.icon = 'applications-system.png'
        self.prefPages.append(vbox)
        ######
        sgroup = gtk.SizeGroup(gtk.SizeGroupMode.HORIZONTAL)
        ######
        hbox = gtk.HBox(spacing=5)
        label = gtk.Label(_('Date Format'))
        label.set_alignment(0, 0.5)
        pack(hbox, label)
        sgroup.add_widget(label)
        #pack(hbox, gtk.Label(''), 1, 1)
        item = ComboEntryTextPrefItem(ud, 'dateFormat', (
            '%Y/%m/%d',
            '%Y-%m-%d',
            '%y/%m/%d',
            '%y-%m-%d',
            '%OY/%Om/%Od',
            '%OY-%Om-%Od',
            '%m/%d',
            '%m/%d/%Y',
        ))
        self.gtkPrefItems.append(item)
        pack(hbox, item._widget, 1, 1)
        pack(vbox, hbox)
        ###
        hbox = gtk.HBox(spacing=5)
        #pack(hbox, gtk.Label(''), 1, 1)
        label = gtk.Label(_('Digital Clock Format'))
        label.set_alignment(0, 0.5)
        pack(hbox, label)
        sgroup.add_widget(label)
        item = ComboEntryTextPrefItem(ud, 'clockFormat', (
            '%T',
            '%X',
            '%Y/%m/%d - %T',
            '%OY/%Om/%Od - %X',
            '<i>%Y/%m/%d</i> - %T',
            '<b>%T</b>',
            '<b>%X</b>',
            '%H:%M',
            '<b>%H:%M</b>',
            '<span size="smaller">%OY/%Om/%Od</span>,%X'
            '%OY/%Om/%Od,<span color="#ff0000">%X</span>',
            '<span font="bold">%X</span>',
            '%OH:%OM',
            '<b>%OH:%OM</b>',
        ))
        self.gtkPrefItems.append(item)
        pack(hbox, item._widget, 1, 1)
        pack(vbox, hbox)
        ######
        hbox = gtk.HBox(spacing=5)
        label = gtk.Label(_('Days maximum cache size'))
        label.set_alignment(0, 0.5)
        pack(hbox, label)
        ##sgroup.add_widget(label)
        item = SpinPrefItem(ui, 'maxDayCacheSize', 100, 9999, 0)
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(vbox, hbox)
        vbox4 = vbox
        ########
        hbox = gtk.HBox(spacing=3)
        pack(hbox, gtk.Label(_('First day of week')))
        ##item = ComboTextPrefItem( ## FIXME
        self.comboFirstWD = gtk.ComboBoxText()
        for item in core.weekDayName:
            self.comboFirstWD.append_text(item)
        self.comboFirstWD.append_text(_('Automatic'))
        self.comboFirstWD.connect('changed', self.comboFirstWDChanged)
        pack(hbox, self.comboFirstWD)
        pack(vbox, hbox)
        #########
        hbox0 = gtk.HBox(spacing=0)
        pack(hbox0, gtk.Label(_('Holidays') + '    '))
        item = WeekDayCheckListPrefItem(core, 'holidayWeekDays')
        self.corePrefItems.append(item)
        self.holiWDItem = item  ## Holiday Week Days Item
        pack(hbox0, item._widget, 1, 1)
        pack(vbox, hbox0)
        #########
        hbox = gtk.HBox(spacing=3)
        pack(hbox, gtk.Label(_('First week of year containts')))
        combo = gtk.ComboBoxText()
        texts = [_('First %s of year') % name
                 for name in core.weekDayName] + [_('First day of year')]
        texts[4] += ' (ISO 8601)'  ## FIXME
        for text in texts:
            combo.append_text(text)
        #combo.append_text(_('Automatic'))## (as Locale)## FIXME
        pack(hbox, combo)
        pack(hbox, gtk.Label(''), 1, 1)
        pack(vbox, hbox)
        self.comboWeekYear = combo
        #########
        hbox = gtk.HBox(spacing=3)
        item = CheckPrefItem(locale_man, 'enableNumLocale',
                             _('Numbers Localization'))
        self.localePrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        pack(vbox, hbox)
        ##################################################
        ################################
        options = []
        for mod in calTypes:
            for opt in mod.options:
                if opt[0] == 'button':
                    try:
                        optl = ModuleOptionButton(opt[1:])
                    except:
                        myRaise()
                        continue
                else:
                    optl = ModuleOptionItem(mod, opt)
                options.append(optl)
                pack(vbox, optl._widget)
        self.moduleOptions = options
        ################################ Tab 4 (Plugins) ############################################
        vbox = gtk.VBox()
        vbox.label = _('_Plugins')
        vbox.icon = 'preferences-plugin.png'
        self.prefPages.append(vbox)
        #####
        ##pluginsTextStatusIcon:
        hbox = gtk.HBox()
        if statusIconMode == 1:
            item = CheckPrefItem(ui, 'pluginsTextStatusIcon',
                                 _('Show in applet (for today)'))
        else:
            item = CheckPrefItem(ui, 'pluginsTextStatusIcon',
                                 _('Show in Status Icon (for today)'))
        self.uiPrefItems.append(item)
        pack(hbox, item._widget)
        pack(hbox, gtk.Label(''), 1, 1)
        pack(vbox, hbox)
        #####
        treev = gtk.TreeView()
        treev.set_headers_clickable(True)
        trees = gtk.ListStore(int, bool, bool, str)
        treev.set_model(trees)
        treev.enable_model_drag_source(
            gdk.ModifierType.BUTTON1_MASK,
            [('row', gtk.TargetFlags.SAME_WIDGET, 0)], gdk.DragAction.MOVE)
        treev.enable_model_drag_dest([('row', gtk.TargetFlags.SAME_WIDGET, 0)],
                                     gdk.DragAction.MOVE)
        treev.connect('drag_data_received', self.plugTreevDragReceived)
        treev.get_selection().connect('changed', self.plugTreevCursorChanged)
        treev.connect('row-activated', self.plugTreevRActivate)
        treev.connect('button-press-event', self.plugTreevButtonPress)
        ###
        #treev.drag_source_set_icon_stock(gtk.STOCK_CLOSE)
        #treev.drag_source_add_text_targets()
        #treev.drag_source_add_uri_targets()
        #treev.drag_source_unset()
        ###
        swin = gtk.ScrolledWindow()
        swin.add(treev)
        swin.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
        ######
        cell = gtk.CellRendererToggle()
        #cell.set_property('activatable', True)
        cell.connect('toggled', self.plugTreeviewCellToggled)
        col = gtk.TreeViewColumn(_('Enable'), cell)
        col.add_attribute(cell, 'active', 1)
        #cell.set_active(False)
        col.set_resizable(True)
        col.set_property('expand', False)
        treev.append_column(col)
        ######
        cell = gtk.CellRendererToggle()
        #cell.set_property('activatable', True)
        cell.connect('toggled', self.plugTreeviewCellToggled2)
        col = gtk.TreeViewColumn(_('Show Date'), cell)
        col.add_attribute(cell, 'active', 2)
        #cell.set_active(False)
        col.set_resizable(True)
        col.set_property('expand', False)
        treev.append_column(col)
        ######
        #cell = gtk.CellRendererText()
        #col = gtk.TreeViewColumn(_('File Name'), cell, text=2)
        #col.set_resizable(True)
        #treev.append_column(col)
        #treev.set_search_column(1)
        ######
        cell = gtk.CellRendererText()
        #cell.set_property('wrap-mode', gtk.WrapMode.WORD)
        #cell.set_property('editable', True)
        #cell.set_property('wrap-width', 200)
        col = gtk.TreeViewColumn(_('Title'), cell, text=3)
        #treev.connect('draw', self.plugTreevExpose)
        #self.plugTitleCell = cell
        #self.plugTitleCol = col
        #col.set_resizable(True)## No need!
        col.set_property('expand', True)
        treev.append_column(col)
        ######
        #for i in xrange(len(core.plugIndex)):
        #	x = core.plugIndex[i]
        #	trees.append([x[0], x[1], x[2], core.allPlugList[x[0]].title])
        ######
        self.plugTreeview = treev
        self.plugTreestore = trees
        #######################
        hbox = gtk.HBox()
        vboxPlug = gtk.VBox()
        pack(vboxPlug, swin, 1, 1)
        pack(hbox, vboxPlug, 1, 1)
        ###
        hboxBut = gtk.HBox()
        ###
        button = gtk.Button(_('_About Plugin'))
        button.set_image(
            gtk.Image.new_from_stock(gtk.STOCK_ABOUT, gtk.IconSize.BUTTON))
        button.set_sensitive(False)
        button.connect('clicked', self.plugAboutClicked)
        self.plugButtonAbout = button
        pack(hboxBut, button)
        pack(hboxBut, gtk.Label(''), 1, 1)
        ###
        button = gtk.Button(_('C_onfigure Plugin'))
        button.set_image(
            gtk.Image.new_from_stock(gtk.STOCK_PREFERENCES,
                                     gtk.IconSize.BUTTON))
        button.set_sensitive(False)
        button.connect('clicked', self.plugConfClicked)
        self.plugButtonConf = button
        pack(hboxBut, button)
        pack(hboxBut, gtk.Label(''), 1, 1)
        ###
        pack(vboxPlug, hboxBut)
        ###
        toolbar = gtk.Toolbar()
        toolbar.set_orientation(gtk.Orientation.VERTICAL)
        #try:## DeprecationWarning ## FIXME
        #toolbar.set_icon_size(gtk.IconSize.SMALL_TOOLBAR)
        ### no different (argument to set_icon_size does not affect) FIXME
        #except:
        #	pass
        size = gtk.IconSize.SMALL_TOOLBAR
        ##no different(argument2 to image_new_from_stock does not affect) FIXME
        ######## gtk.IconSize.SMALL_TOOLBAR or gtk.IconSize.MENU
        tb = toolButtonFromStock(gtk.STOCK_GOTO_TOP, size)
        set_tooltip(tb, _('Move to top'))
        tb.connect('clicked', self.plugTreeviewTop)
        toolbar.insert(tb, -1)
        ########
        tb = toolButtonFromStock(gtk.STOCK_GO_UP, size)
        set_tooltip(tb, _('Move up'))
        tb.connect('clicked', self.plugTreeviewUp)
        toolbar.insert(tb, -1)
        #########
        tb = toolButtonFromStock(gtk.STOCK_GO_DOWN, size)
        set_tooltip(tb, _('Move down'))
        tb.connect('clicked', self.plugTreeviewDown)
        toolbar.insert(tb, -1)
        ########
        tb = toolButtonFromStock(gtk.STOCK_GOTO_BOTTOM, size)
        set_tooltip(tb, _('Move to bottom'))
        tb.connect('clicked', self.plugTreeviewBottom)
        toolbar.insert(tb, -1)
        ##########
        tb = toolButtonFromStock(gtk.STOCK_ADD, size)
        set_tooltip(tb, _('Add'))
        #tb.connect('clicked', lambda obj: self.plugAddDialog.run())
        tb.connect('clicked', self.plugAddClicked)
        #if len(self.plugAddItems)==0:
        #	tb.set_sensitive(False)
        toolbar.insert(tb, -1)
        self.plugButtonAdd = tb
        ###########
        tb = toolButtonFromStock(gtk.STOCK_DELETE, size)
        set_tooltip(tb, _('Delete'))
        tb.connect('clicked', self.plugTreeviewDel)
        toolbar.insert(tb, -1)
        ###########
        pack(hbox, toolbar)
        #####
        '''
		vpan = gtk.VPaned()
		vpan.add1(hbox)
		vbox2 = gtk.VBox()
		pack(vbox2, gtk.Label('Test Label'))
		vpan.add2(vbox2)
		vpan.set_position(100)
		pack(vbox, vpan)
		'''
        pack(vbox, hbox, 1, 1)
        ##########################
        d = gtk.Dialog(parent=self)
        d.set_transient_for(self)
        ## dialog.set_transient_for(parent) makes the window on top of parent and at the center point of parent
        ## but if you call dialog.show() or dialog.present(), the parent is still active(clickabel widgets) before closing child "dialog"
        ## you may call dialog.run() to realy make it transient for parent
        #d.set_has_separator(False)
        d.connect('delete-event', self.plugAddDialogClose)
        d.set_title(_('Add Plugin'))
        ###
        dialog_add_button(d, gtk.STOCK_CANCEL, _('_Cancel'), 1,
                          self.plugAddDialogClose)
        dialog_add_button(d, gtk.STOCK_OK, _('_OK'), 2, self.plugAddDialogOK)
        ###
        treev = gtk.TreeView()
        trees = gtk.ListStore(str)
        treev.set_model(trees)
        #treev.enable_model_drag_source(gdk.ModifierType.BUTTON1_MASK, [('', 0, 0, 0)], gdk.DragAction.MOVE)## FIXME
        #treev.enable_model_drag_dest([('', 0, 0, 0)], gdk.DragAction.MOVE)## FIXME
        treev.connect('drag_data_received', self.plugTreevDragReceived)
        treev.connect('row-activated', self.plugAddTreevRActivate)
        ####
        cell = gtk.CellRendererText()
        col = gtk.TreeViewColumn(_('Title'), cell, text=0)
        #col.set_resizable(True)# no need when have only one column!
        treev.append_column(col)
        ####
        swin = gtk.ScrolledWindow()
        swin.add(treev)
        swin.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
        pack(d.vbox, swin, 1, 1)
        d.vbox.show_all()
        self.plugAddDialog = d
        self.plugAddTreeview = treev
        self.plugAddTreestore = trees
        #############
        ##treev.set_resize_mode(gtk.RESIZE_IMMEDIATE)
        ##self.plugAddItems = []
        ####################################### Tab 5 (Accounts)
        vbox = gtk.VBox()
        vbox.label = _('Accounts')
        vbox.icon = 'web-settings.png'
        self.prefPages.append(vbox)
        #####
        treev = gtk.TreeView()
        treev.set_headers_clickable(True)
        trees = gtk.ListStore(int, bool, str)  ## id (hidden), enable, title
        treev.set_model(trees)
        treev.enable_model_drag_source(
            gdk.ModifierType.BUTTON1_MASK,
            [('row', gtk.TargetFlags.SAME_WIDGET, 0)], gdk.DragAction.MOVE)
        treev.enable_model_drag_dest([('row', gtk.TargetFlags.SAME_WIDGET, 0)],
                                     gdk.DragAction.MOVE)
        treev.connect('row-activated', self.accountsTreevRActivate)
        treev.connect('button-press-event', self.accountsTreevButtonPress)
        ###
        swin = gtk.ScrolledWindow()
        swin.add(treev)
        swin.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
        ######
        cell = gtk.CellRendererToggle()
        #cell.set_property('activatable', True)
        cell.connect('toggled', self.accountsTreeviewCellToggled)
        col = gtk.TreeViewColumn(_('Enable'), cell)
        col.add_attribute(cell, 'active', 1)
        #cell.set_active(False)
        col.set_resizable(True)
        col.set_property('expand', False)
        treev.append_column(col)
        ######
        cell = gtk.CellRendererText()
        col = gtk.TreeViewColumn(_('Title'), cell, text=2)
        #col.set_resizable(True)## No need!
        col.set_property('expand', True)
        treev.append_column(col)
        ######
        self.accountsTreeview = treev
        self.accountsTreestore = trees
        #######################
        hbox = gtk.HBox()
        vboxPlug = gtk.VBox()
        pack(vboxPlug, swin, 1, 1)
        pack(hbox, vboxPlug, 1, 1)
        ###
        toolbar = gtk.Toolbar()
        toolbar.set_orientation(gtk.Orientation.VERTICAL)
        #try:## DeprecationWarning ## FIXME
        #toolbar.set_icon_size(gtk.IconSize.SMALL_TOOLBAR)
        ### no different (argument to set_icon_size does not affect) FIXME
        #except:
        #	pass
        size = gtk.IconSize.SMALL_TOOLBAR
        ##no different(argument2 to image_new_from_stock does not affect) FIXME
        ######## gtk.IconSize.SMALL_TOOLBAR or gtk.IconSize.MENU
        tb = toolButtonFromStock(gtk.STOCK_EDIT, size)
        set_tooltip(tb, _('Edit'))
        tb.connect('clicked', self.accountsEditClicked)
        toolbar.insert(tb, -1)
        ###########
        tb = toolButtonFromStock(gtk.STOCK_ADD, size)
        set_tooltip(tb, _('Add'))
        tb.connect('clicked', self.accountsAddClicked)
        toolbar.insert(tb, -1)
        ###########
        tb = toolButtonFromStock(gtk.STOCK_DELETE, size)
        set_tooltip(tb, _('Delete'))
        tb.connect('clicked', self.accountsDelClicked)
        toolbar.insert(tb, -1)
        ##########
        tb = toolButtonFromStock(gtk.STOCK_GO_UP, size)
        set_tooltip(tb, _('Move up'))
        tb.connect('clicked', self.accountsUpClicked)
        toolbar.insert(tb, -1)
        #########
        tb = toolButtonFromStock(gtk.STOCK_GO_DOWN, size)
        set_tooltip(tb, _('Move down'))
        tb.connect('clicked', self.accountsDownClicked)
        toolbar.insert(tb, -1)
        ###########
        pack(hbox, toolbar)
        pack(vbox, hbox, 1, 1)
        ###################################################################################################
        notebook = gtk.Notebook()
        self.notebook = notebook
        #####################################
        for vbox in self.prefPages:
            l = gtk.Label(vbox.label)
            l.set_use_underline(True)
            vb = gtk.VBox(spacing=3)
            pack(vb, imageFromFile(vbox.icon))
            pack(vb, l)
            vb.show_all()
            notebook.append_page(vbox, vb)
            try:
                notebook.set_tab_reorderable(vbox, True)
            except AttributeError:
                pass
        #######################
        #notebook.set_property('homogeneous', True)## not in gtk3 FIXME
        #notebook.set_property('tab-border', 5)## not in gtk3 FIXME
        #notebook.set_property('tab-hborder', 15)## not in gtk3 FIXME
        pack(self.vbox, notebook)
        self.vbox.show_all()
        for i in ui.prefPagesOrder:
            try:
                j = ui.prefPagesOrder[i]
            except IndexError:
                continue
            notebook.reorder_child(self.prefPages[i], j)