mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Pull from driver-dev
This commit is contained in:
commit
1b52e46586
@ -67,11 +67,19 @@ class DevicePlugin(Plugin):
|
|||||||
For example: For devices that present themselves as USB Mass storage
|
For example: For devices that present themselves as USB Mass storage
|
||||||
devices, this method would be responsible for mounting the device or
|
devices, this method would be responsible for mounting the device or
|
||||||
if the device has been automounted, for finding out where it has been
|
if the device has been automounted, for finding out where it has been
|
||||||
mounted. The driver for the PRS505 has a implementation of this function
|
mounted. The base class within USBMS device.py has a implementation of
|
||||||
that should serve as a good example for USB Mass storage devices.
|
this function that should serve as a good example for USB Mass storage
|
||||||
|
devices.
|
||||||
'''
|
'''
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def eject(self):
|
||||||
|
'''
|
||||||
|
Un-mount / eject the device from the OS. This does not check if there
|
||||||
|
are pending GUI jobs that need to communicate with the device.
|
||||||
|
'''
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
def set_progress_reporter(self, report_progress):
|
def set_progress_reporter(self, report_progress):
|
||||||
'''
|
'''
|
||||||
@param report_progress: Function that is called with a % progress
|
@param report_progress: Function that is called with a % progress
|
||||||
|
@ -279,6 +279,9 @@ class PRS500(DeviceConfig, DevicePlugin):
|
|||||||
if res.code != 0:
|
if res.code != 0:
|
||||||
raise ProtocolError("Could not set time on device")
|
raise ProtocolError("Could not set time on device")
|
||||||
|
|
||||||
|
def eject(self):
|
||||||
|
pass
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
""" Release device interface """
|
""" Release device interface """
|
||||||
try:
|
try:
|
||||||
|
@ -491,3 +491,39 @@ class Device(DeviceConfig, DevicePlugin):
|
|||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
self.open_osx()
|
self.open_osx()
|
||||||
|
|
||||||
|
def eject_windows(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def eject_osx(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def eject_linux(self):
|
||||||
|
drives = self.find_device_nodes()
|
||||||
|
for drive in drives:
|
||||||
|
if drive:
|
||||||
|
cmd = ['pumount']
|
||||||
|
try:
|
||||||
|
p = subprocess.Popen(cmd + [drive])
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
while p.poll() is None:
|
||||||
|
time.sleep(0.1)
|
||||||
|
|
||||||
|
def eject(self):
|
||||||
|
if islinux:
|
||||||
|
try:
|
||||||
|
self.eject_linux()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
if iswindows:
|
||||||
|
try:
|
||||||
|
self.eject_windows()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
if isosx:
|
||||||
|
try:
|
||||||
|
self.eject_osx()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
self._main_prefix = self._card_a_prefix = self._card_b_prefix = None
|
||||||
|
|
||||||
|
@ -1,312 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
'''
|
|
||||||
Maping of non-acii symbols and their corresponding html entity number and name
|
|
||||||
'''
|
|
||||||
__license__ = 'GPL v3'
|
|
||||||
__copyright__ = '2009, John Schember <john@nachtimwald.com>'
|
|
||||||
|
|
||||||
# http://www.w3schools.com/tags/ref_symbols.asp
|
|
||||||
HTML_SYMBOLS = {
|
|
||||||
# Math Symbols
|
|
||||||
u'∀' : ['∀', '∀'], # for all
|
|
||||||
u'∂' : ['∂', '∂'], # part
|
|
||||||
u'∃' : ['∃', '&exists;'], # exists
|
|
||||||
u'∅' : ['∅', '∅'], # empty
|
|
||||||
u'∇' : ['∇', '∇'], # nabla
|
|
||||||
u'∈' : ['∈', '∈'], # isin
|
|
||||||
u'∉' : ['∉', '∉'], # notin
|
|
||||||
u'∋' : ['∋', '∋'], # ni
|
|
||||||
u'∏' : ['∏', '∏'], # prod
|
|
||||||
u'∑' : ['∑', '∑'], # sum
|
|
||||||
u'−' : ['−', '−'], # minus
|
|
||||||
u'∗' : ['∗', '∗'], # lowast
|
|
||||||
u'√' : ['√', '√'], # square root
|
|
||||||
u'∝' : ['∝', '∝'], # proportional to
|
|
||||||
u'∞' : ['∞', '∞'], # infinity
|
|
||||||
u'∠' : ['∠', '∠'], # angle
|
|
||||||
u'∧' : ['∧', '∧'], # and
|
|
||||||
u'∨' : ['∨', '∨'], # or
|
|
||||||
u'∩' : ['∩', '∩'], # cap
|
|
||||||
u'∪' : ['∪', '∪'], # cup
|
|
||||||
u'∫' : ['∫', '∫'], # integral
|
|
||||||
u'∴' : ['∴', '∴'], # therefore
|
|
||||||
u'∼' : ['∼', '∼'], # simular to
|
|
||||||
u'≅' : ['≅', '≅'], # approximately equal
|
|
||||||
u'≈' : ['≈', '≈'], # almost equal
|
|
||||||
u'≠' : ['≠', '≠'], # not equal
|
|
||||||
u'≡' : ['≡', '≡'], # equivalent
|
|
||||||
u'≤' : ['≤', '≤'], # less or equal
|
|
||||||
u'≥' : ['≥', '≥'], # greater or equal
|
|
||||||
u'⊂' : ['⊂', '⊂'], # subset of
|
|
||||||
u'⊃' : ['⊃', '⊃'], # superset of
|
|
||||||
u'⊄' : ['⊄', '⊄'], # not subset of
|
|
||||||
u'⊆' : ['⊆', '⊆'], # subset or equal
|
|
||||||
u'⊇' : ['⊇', '⊇'], # superset or equal
|
|
||||||
u'⊕' : ['⊕', '⊕'], # circled plus
|
|
||||||
u'⊗' : ['⊗', '⊗'], # cirled times
|
|
||||||
u'⊥' : ['⊥', '⊥'], # perpendicular
|
|
||||||
u'⋅' : ['⋅', '⋅'], # dot operator
|
|
||||||
# Greek Letters
|
|
||||||
u'Α' : ['Α', 'Α'], # Alpha
|
|
||||||
u'Β' : ['Β', 'Β'], # Beta
|
|
||||||
u'Γ' : ['Γ', 'Γ'], # Gamma
|
|
||||||
u'Δ' : ['Δ', 'Δ'], # Delta
|
|
||||||
u'Ε' : ['Ε', 'Ε'], # Epsilon
|
|
||||||
u'Ζ' : ['Ζ', 'Ζ'], # Zeta
|
|
||||||
u'Η' : ['Η', 'Η'], # Eta
|
|
||||||
u'Θ' : ['Θ', 'Θ'], # Theta
|
|
||||||
u'Ι' : ['Ι', 'Ι'], # Iota
|
|
||||||
u'Κ' : ['Κ', 'Κ'], # Kappa
|
|
||||||
u'Λ' : ['Λ', 'Λ'], # Lambda
|
|
||||||
u'Μ' : ['Μ', 'Μ'], # Mu
|
|
||||||
u'Ν' : ['Ν', 'Ν'], # Nu
|
|
||||||
u'Ξ' : ['Ξ', 'Ξ'], # Xi
|
|
||||||
u'Ο' : ['Ο', 'Ο'], # Omicron
|
|
||||||
u'Π' : ['Π', 'Π'], # Pi
|
|
||||||
u'Ρ' : ['Ρ', 'Ρ'], # Rho
|
|
||||||
u'Σ' : ['Σ', 'Σ'], # Sigma
|
|
||||||
u'Τ' : ['Τ', 'Τ'], # Tau
|
|
||||||
u'Υ' : ['Υ', 'Υ'], # Upsilon
|
|
||||||
u'Φ' : ['Φ', 'Φ'], # Phi
|
|
||||||
u'Χ' : ['Χ', 'Χ'], # Chi
|
|
||||||
u'Ψ' : ['Ψ', 'Ψ'], # Psi
|
|
||||||
u'ω' : ['ω', 'ω'], # omega
|
|
||||||
u'ϑ' : ['ϑ', 'ϑ'], # theta symbol
|
|
||||||
u'ϒ' : ['ϒ', 'ϒ'], # upsilon symbol
|
|
||||||
u'ϖ' : ['ϖ', 'ϖ'], # pi symbol
|
|
||||||
# Other
|
|
||||||
u'Œ' : ['Œ', 'Œ'], # capital ligature OE
|
|
||||||
u'œ' : ['œ', 'œ'], # small ligature oe
|
|
||||||
u'Š' : ['Š', 'Š'], # capital S with caron
|
|
||||||
u'š' : ['š', 'š'], # small S with caron
|
|
||||||
u'Ÿ' : ['Ÿ', 'Ÿ'], # capital Y with diaeres
|
|
||||||
u'ƒ' : ['ƒ', 'ƒ'], # f with hook
|
|
||||||
u'ˆ' : ['ˆ', 'ˆ'], # modifier letter circumflex accent
|
|
||||||
u'˜' : ['˜', '˜'], # small tilde
|
|
||||||
u'–' : ['–', '–'], # en dash
|
|
||||||
u'—' : ['—', '—'], # em dash
|
|
||||||
u'‘' : ['‘', '‘'], # left single quotation mark
|
|
||||||
u'’' : ['’', '’'], # right single quotation mark
|
|
||||||
u'‚' : ['‚', '‚'], # single low-9 quotation mark
|
|
||||||
u'“' : ['“', '“'], # left double quotation mark
|
|
||||||
u'”' : ['”', '”'], # right double quotation mark
|
|
||||||
u'„' : ['„', '„'], # double low-9 quotation mark
|
|
||||||
u'†' : ['†', '†'], # dagger
|
|
||||||
u'‡' : ['‡', '‡'], # double dagger
|
|
||||||
u'•' : ['•', '•'], # bullet
|
|
||||||
u'…' : ['…', '…'], # horizontal ellipsis
|
|
||||||
u'‰' : ['‰', '‰'], # per mille
|
|
||||||
u'′' : ['′', '′'], # minutes
|
|
||||||
u'″' : ['″', '″'], # seconds
|
|
||||||
u'‹' : ['‹', '‹'], # single left angle quotation
|
|
||||||
u'›' : ['›', '›'], # single right angle quotation
|
|
||||||
u'‾' : ['‾', '‾'], # overline
|
|
||||||
u'€' : ['€', '€'], # euro
|
|
||||||
u'™' : ['™', '™'], # trademark
|
|
||||||
u'←' : ['←', '←'], # left arrow
|
|
||||||
u'↑' : ['↑', '↑'], # up arrow
|
|
||||||
u'→' : ['→', '→'], # right arrow
|
|
||||||
u'↓' : ['↓', '↓'], # down arrow
|
|
||||||
u'↔' : ['↔', '↔'], # left right arrow
|
|
||||||
u'↵' : ['↵', '↵'], # carriage return arrow
|
|
||||||
u'⌈' : ['⌈', '⌈'], # left ceiling
|
|
||||||
u'⌉' : ['⌉', '⌉'], # right ceiling
|
|
||||||
u'⌊' : ['⌊', '⌊'], # left floor
|
|
||||||
u'⌋' : ['⌋', '⌋'], # right floor
|
|
||||||
u'◊' : ['◊', '◊'], # lozenge
|
|
||||||
u'♠' : ['♠', '♠'], # spade
|
|
||||||
u'♣' : ['♣', '♣'], # club
|
|
||||||
u'♥' : ['♥', '♥'], # heart
|
|
||||||
u'♦' : ['♦', '♦'], # diamond
|
|
||||||
# Extra http://www.ascii.cl/htmlcodes.htm
|
|
||||||
u' ' : [' '], # space
|
|
||||||
u'!' : ['!'], # exclamation point
|
|
||||||
u'#' : ['#'], # number sign
|
|
||||||
u'$' : ['$'], # dollar sign
|
|
||||||
u'%' : ['%'], # percent sign
|
|
||||||
u'\'' : ['''], # single quote
|
|
||||||
u'(' : ['('], # opening parenthesis
|
|
||||||
u')' : [')'], # closing parenthesis
|
|
||||||
u'*' : ['*'], # asterisk
|
|
||||||
u'+' : ['+'], # plus sign
|
|
||||||
u',' : [','], # comma
|
|
||||||
u'-' : ['-'], # minus sign - hyphen
|
|
||||||
u'.' : ['.'], # period
|
|
||||||
u'/' : ['/'], # slash
|
|
||||||
u'0' : ['0'], # zero
|
|
||||||
u'1' : ['1'], # one
|
|
||||||
u'2' : ['2'], # two
|
|
||||||
u'3' : ['3'], # three
|
|
||||||
u'4' : ['4'], # four
|
|
||||||
u'5' : ['5'], # five
|
|
||||||
u'6' : ['6'], # six
|
|
||||||
u'7' : ['7'], # seven
|
|
||||||
u'8' : ['8'], # eight
|
|
||||||
u'9' : ['9'], # nine
|
|
||||||
u':' : [':'], # colon
|
|
||||||
u';' : [';'], # semicolon
|
|
||||||
u'=' : ['='], # equal sign
|
|
||||||
u'?' : ['?'], # question mark
|
|
||||||
u'@' : ['@'], # at symbol
|
|
||||||
u'A' : ['A'], #
|
|
||||||
u'B' : ['B'], #
|
|
||||||
u'C' : ['C'], #
|
|
||||||
u'D' : ['D'], #
|
|
||||||
u'E' : ['E'], #
|
|
||||||
u'F' : ['F'], #
|
|
||||||
u'G' : ['G'], #
|
|
||||||
u'H' : ['H'], #
|
|
||||||
u'I' : ['I'], #
|
|
||||||
u'J' : ['J'], #
|
|
||||||
u'K' : ['K'], #
|
|
||||||
u'L' : ['L'], #
|
|
||||||
u'M' : ['M'], #
|
|
||||||
u'N' : ['N'], #
|
|
||||||
u'O' : ['O'], #
|
|
||||||
u'P' : ['P'], #
|
|
||||||
u'Q' : ['Q'], #
|
|
||||||
u'R' : ['R'], #
|
|
||||||
u'S' : ['S'], #
|
|
||||||
u'T' : ['T'], #
|
|
||||||
u'U' : ['U'], #
|
|
||||||
u'V' : ['V'], #
|
|
||||||
u'W' : ['W'], #
|
|
||||||
u'X' : ['X'], #
|
|
||||||
u'Y' : ['Y'], #
|
|
||||||
u'Z' : ['Z'], #
|
|
||||||
u'[' : ['['], # opening bracket
|
|
||||||
u'\\' : ['\'], # backslash
|
|
||||||
u']' : [']'], # closing bracket
|
|
||||||
u'^' : ['^'], # caret - circumflex
|
|
||||||
u'_' : ['_'], # underscore
|
|
||||||
u'`' : ['`'], # grave accent
|
|
||||||
u'a' : ['a'], #
|
|
||||||
u'b' : ['b'], #
|
|
||||||
u'c' : ['c'], #
|
|
||||||
u'd' : ['d'], #
|
|
||||||
u'e' : ['e'], #
|
|
||||||
u'f' : ['f'], #
|
|
||||||
u'g' : ['g'], #
|
|
||||||
u'h' : ['h'], #
|
|
||||||
u'i' : ['i'], #
|
|
||||||
u'j' : ['j'], #
|
|
||||||
u'k' : ['k'], #
|
|
||||||
u'l' : ['l'], #
|
|
||||||
u'm' : ['m'], #
|
|
||||||
u'n' : ['n'], #
|
|
||||||
u'o' : ['o'], #
|
|
||||||
u'p' : ['p'], #
|
|
||||||
u'q' : ['q'], #
|
|
||||||
u'r' : ['r'], #
|
|
||||||
u's' : ['s'], #
|
|
||||||
u't' : ['t'], #
|
|
||||||
u'u' : ['u'], #
|
|
||||||
u'v' : ['v'], #
|
|
||||||
u'w' : ['w'], #
|
|
||||||
u'x' : ['x'], #
|
|
||||||
u'y' : ['y'], #
|
|
||||||
u'z' : ['z'], #
|
|
||||||
u'{' : ['{'], # opening brace
|
|
||||||
u'|' : ['|'], # vertical bar
|
|
||||||
u'}' : ['}'], # closing brace
|
|
||||||
u'~' : ['~'], # equivalency sign - tilde
|
|
||||||
u'<' : ['<', '<'], # less than sign
|
|
||||||
u'>' : ['>', '>'], # greater than sign
|
|
||||||
u'¡' : ['¡', '¡'], # inverted exclamation mark
|
|
||||||
u'¢' : ['¢', '¢'], # cent sign
|
|
||||||
u'£' : ['£', '£'], # pound sign
|
|
||||||
u'¤' : ['¤', '¤'], # currency sign
|
|
||||||
u'¥' : ['¥', '¥'], # yen sign
|
|
||||||
u'¦' : ['¦', '¦'], # broken vertical bar
|
|
||||||
u'§' : ['§', '§'], # section sign
|
|
||||||
u'¨' : ['¨', '¨'], # spacing diaeresis - umlaut
|
|
||||||
u'©' : ['©', '©'], # copyright sign
|
|
||||||
u'ª' : ['ª', 'ª'], # feminine ordinal indicator
|
|
||||||
u'«' : ['«', '«'], # left double angle quotes
|
|
||||||
u'¬' : ['¬', '¬'], # not sign
|
|
||||||
u'®' : ['®', '®'], # registered trade mark sign
|
|
||||||
u'¯' : ['¯', '¯'], # spacing macron - overline
|
|
||||||
u'°' : ['°', '°'], # degree sign
|
|
||||||
u'±' : ['±', '±'], # plus-or-minus sign
|
|
||||||
u'²' : ['²', '²'], # superscript two - squared
|
|
||||||
u'³' : ['³', '³'], # superscript three - cubed
|
|
||||||
u'´' : ['´', '´'], # acute accent - spacing acute
|
|
||||||
u'µ' : ['µ', 'µ'], # micro sign
|
|
||||||
u'¶' : ['¶', '¶'], # pilcrow sign - paragraph sign
|
|
||||||
u'·' : ['·', '·'], # middle dot - Georgian comma
|
|
||||||
u'¸' : ['¸', '¸'], # spacing cedilla
|
|
||||||
u'¹' : ['¹', '¹'], # superscript one
|
|
||||||
u'º' : ['º', 'º'], # masculine ordinal indicator
|
|
||||||
u'»' : ['»', '»'], # right double angle quotes
|
|
||||||
u'¼' : ['¼', '¼'], # fraction one quarter
|
|
||||||
u'½' : ['½', '½'], # fraction one half
|
|
||||||
u'¾' : ['¾', '¾'], # fraction three quarters
|
|
||||||
u'¿' : ['¿', '¿'], # inverted question mark
|
|
||||||
u'À' : ['À', 'À'], # latin capital letter A with grave
|
|
||||||
u'Á' : ['Á', 'Á'], # latin capital letter A with acute
|
|
||||||
u'Â' : ['Â', 'Â'], # latin capital letter A with circumflex
|
|
||||||
u'Ã' : ['Ã', 'Ã'], # latin capital letter A with tilde
|
|
||||||
u'Ä' : ['Ä', 'Ä'], # latin capital letter A with diaeresis
|
|
||||||
u'Å' : ['Å', 'Å'], # latin capital letter A with ring above
|
|
||||||
u'Æ' : ['Æ', 'Æ'], # latin capital letter AE
|
|
||||||
u'Ç' : ['Ç', 'Ç'], # latin capital letter C with cedilla
|
|
||||||
u'È' : ['È', 'È'], # latin capital letter E with grave
|
|
||||||
u'É' : ['É', 'É'], # latin capital letter E with acute
|
|
||||||
u'Ê' : ['Ê', 'Ê'], # latin capital letter E with circumflex
|
|
||||||
u'Ë' : ['Ë', 'Ë'], # latin capital letter E with diaeresis
|
|
||||||
u'Ì' : ['Ì', 'Ì'], # latin capital letter I with grave
|
|
||||||
u'Í' : ['Í', 'Í'], # latin capital letter I with acute
|
|
||||||
u'Î' : ['Î', 'Î'], # latin capital letter I with circumflex
|
|
||||||
u'Ï' : ['Ï', 'Ï'], # latin capital letter I with diaeresis
|
|
||||||
u'Ð' : ['Ð', 'Ð'], # latin capital letter ETH
|
|
||||||
u'Ñ' : ['Ñ', 'Ñ'], # latin capital letter N with tilde
|
|
||||||
u'Ò' : ['Ò', 'Ò'], # latin capital letter O with grave
|
|
||||||
u'Ó' : ['Ó', 'Ó'], # latin capital letter O with acute
|
|
||||||
u'Ô' : ['Ô', 'Ô'], # latin capital letter O with circumflex
|
|
||||||
u'Õ' : ['Õ', 'Õ'], # latin capital letter O with tilde
|
|
||||||
u'Ö' : ['Ö', 'Ö'], # latin capital letter O with diaeresis
|
|
||||||
u'×' : ['×', '×'], # multiplication sign
|
|
||||||
u'Ø' : ['Ø', 'Ø'], # latin capital letter O with slash
|
|
||||||
u'Ù' : ['Ù', 'Ù'], # latin capital letter U with grave
|
|
||||||
u'Ú' : ['Ú', 'Ú'], # latin capital letter U with acute
|
|
||||||
u'Û' : ['Û', 'Û'], # latin capital letter U with circumflex
|
|
||||||
u'Ü' : ['Ü', 'Ü'], # latin capital letter U with diaeresis
|
|
||||||
u'Ý' : ['Ý', 'Ý'], # latin capital letter Y with acute
|
|
||||||
u'Þ' : ['Þ', 'Þ'], # latin capital letter THORN
|
|
||||||
u'ß' : ['ß', 'ß'], # latin small letter sharp s - ess-zed
|
|
||||||
u'à' : ['à', 'à'], # latin small letter a with grave
|
|
||||||
u'á' : ['á', 'á'], # latin small letter a with acute
|
|
||||||
u'â' : ['â', 'â'], # latin small letter a with circumflex
|
|
||||||
u'ã' : ['ã', 'ã'], # latin small letter a with tilde
|
|
||||||
u'ä' : ['ä', 'ä'], # latin small letter a with diaeresis
|
|
||||||
u'å' : ['å', 'å'], # latin small letter a with ring above
|
|
||||||
u'æ' : ['æ', 'æ'], # latin small letter ae
|
|
||||||
u'ç' : ['ç', 'ç'], # latin small letter c with cedilla
|
|
||||||
u'è' : ['è', 'è'], # latin small letter e with grave
|
|
||||||
u'é' : ['é', 'é'], # latin small letter e with acute
|
|
||||||
u'ê' : ['ê', 'ê'], # latin small letter e with circumflex
|
|
||||||
u'ë' : ['ë', 'ë'], # latin small letter e with diaeresis
|
|
||||||
u'ì' : ['ì', 'ì'], # latin small letter i with grave
|
|
||||||
u'í' : ['í', 'í'], # latin small letter i with acute
|
|
||||||
u'î' : ['î', 'î'], # latin small letter i with circumflex
|
|
||||||
u'ï' : ['ï', 'ï'], # latin small letter i with diaeresis
|
|
||||||
u'ð' : ['ð', 'ð'], # latin small letter eth
|
|
||||||
u'ñ' : ['ñ', 'ñ'], # latin small letter n with tilde
|
|
||||||
u'ò' : ['ò', 'ò'], # latin small letter o with grave
|
|
||||||
u'ó' : ['ó', 'ó'], # latin small letter o with acute
|
|
||||||
u'ô' : ['ô', 'ô'], # latin small letter o with circumflex
|
|
||||||
u'õ' : ['õ', 'õ'], # latin small letter o with tilde
|
|
||||||
u'ö' : ['ö', 'ö'], # latin small letter o with diaeresis
|
|
||||||
u'÷' : ['÷', '÷'], # division sign
|
|
||||||
u'ø' : ['ø', 'ø'], # latin small letter o with slash
|
|
||||||
u'ù' : ['ù', 'ù'], # latin small letter u with grave
|
|
||||||
u'ú' : ['ú', 'ú'], # latin small letter u with acute
|
|
||||||
u'û' : ['û', 'û'], # latin small letter u with circumflex
|
|
||||||
u'ü' : ['ü', 'ü'], # latin small letter u with diaeresis
|
|
||||||
u'ý' : ['ý', 'ý'], # latin small letter y with acute
|
|
||||||
u'þ' : ['þ', 'þ'], # latin small letter thorn
|
|
||||||
u'ÿ' : ['ÿ', 'ÿ'], # latin small letter y with diaeresis
|
|
||||||
# More
|
|
||||||
u' ' : [' '],
|
|
||||||
}
|
|
||||||
|
|
@ -22,6 +22,11 @@ class PDBOutput(OutputFormatPlugin):
|
|||||||
short_switch='f', choices=FORMAT_WRITERS.keys(),
|
short_switch='f', choices=FORMAT_WRITERS.keys(),
|
||||||
help=(_('Format to use inside the pdb container. Choices are:')+\
|
help=(_('Format to use inside the pdb container. Choices are:')+\
|
||||||
' %s' % FORMAT_WRITERS.keys())),
|
' %s' % FORMAT_WRITERS.keys())),
|
||||||
|
OptionRecommendation(name='output_encoding', recommended_value='cp1252',
|
||||||
|
level=OptionRecommendation.LOW,
|
||||||
|
help=_('Specify the character encoding of the output document. ' \
|
||||||
|
'The default is cp1252. Note: This option is not honored by all ' \
|
||||||
|
'formats.')),
|
||||||
])
|
])
|
||||||
|
|
||||||
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
||||||
|
@ -34,7 +34,7 @@ class Writer(FormatWriter):
|
|||||||
self.log.info('Compessing data...')
|
self.log.info('Compessing data...')
|
||||||
for i in range(0, len(txt_records)):
|
for i in range(0, len(txt_records)):
|
||||||
self.log.debug('\tCompressing record %i' % i)
|
self.log.debug('\tCompressing record %i' % i)
|
||||||
txt_records[i] = compress_doc(txt_records[i].encode('cp1252', 'replace'))
|
txt_records[i] = compress_doc(txt_records[i])
|
||||||
section_lengths.append(len(txt_records[i]))
|
section_lengths.append(len(txt_records[i]))
|
||||||
|
|
||||||
out_stream.seek(0)
|
out_stream.seek(0)
|
||||||
@ -46,7 +46,7 @@ class Writer(FormatWriter):
|
|||||||
|
|
||||||
def _generate_text(self, spine):
|
def _generate_text(self, spine):
|
||||||
txt_writer = TxtWriter(TxtNewlines('system').newline, self.log)
|
txt_writer = TxtWriter(TxtNewlines('system').newline, self.log)
|
||||||
txt = txt_writer.dump(spine)
|
txt = txt_writer.dump(spine).encode(self.opts.output_encoding, 'replace')
|
||||||
|
|
||||||
txt_length = len(txt)
|
txt_length = len(txt)
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ class Writer(FormatWriter):
|
|||||||
|
|
||||||
def _generate_text(self, spine):
|
def _generate_text(self, spine):
|
||||||
txt_writer = TxtWriter(TxtNewlines('system').newline, self.log)
|
txt_writer = TxtWriter(TxtNewlines('system').newline, self.log)
|
||||||
txt = txt_writer.dump(spine)
|
txt = txt_writer.dump(spine).encode(self.opts.output_encoding, 'replace')
|
||||||
|
|
||||||
txt_length = len(txt)
|
txt_length = len(txt)
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ except ImportError:
|
|||||||
import cStringIO
|
import cStringIO
|
||||||
|
|
||||||
from calibre.customize.conversion import OutputFormatPlugin
|
from calibre.customize.conversion import OutputFormatPlugin
|
||||||
|
from calibre.customize.conversion import OptionRecommendation
|
||||||
from calibre.ptempfile import TemporaryDirectory
|
from calibre.ptempfile import TemporaryDirectory
|
||||||
from calibre.utils.zipfile import ZipFile
|
from calibre.utils.zipfile import ZipFile
|
||||||
from calibre.ebooks.oeb.base import OEB_IMAGES
|
from calibre.ebooks.oeb.base import OEB_IMAGES
|
||||||
@ -26,12 +27,20 @@ class PMLOutput(OutputFormatPlugin):
|
|||||||
author = 'John Schember'
|
author = 'John Schember'
|
||||||
file_type = 'pmlz'
|
file_type = 'pmlz'
|
||||||
|
|
||||||
|
options = set([
|
||||||
|
OptionRecommendation(name='output_encoding', recommended_value='cp1252',
|
||||||
|
level=OptionRecommendation.LOW,
|
||||||
|
help=_('Specify the character encoding of the output document. ' \
|
||||||
|
'The default is cp1252. Note: This option is not honored by all ' \
|
||||||
|
'formats.')),
|
||||||
|
])
|
||||||
|
|
||||||
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
||||||
with TemporaryDirectory('_pmlz_output') as tdir:
|
with TemporaryDirectory('_pmlz_output') as tdir:
|
||||||
pmlmlizer = PMLMLizer(ignore_tables=opts.linearize_tables)
|
pmlmlizer = PMLMLizer(ignore_tables=opts.linearize_tables)
|
||||||
content = pmlmlizer.extract_content(oeb_book, opts)
|
content = pmlmlizer.extract_content(oeb_book, opts)
|
||||||
with open(os.path.join(tdir, 'index.pml'), 'wb') as out:
|
with open(os.path.join(tdir, 'index.pml'), 'wb') as out:
|
||||||
out.write(content.encode('utf-8'))
|
out.write(content.encode(self.opts.output_encoding, 'replace'))
|
||||||
|
|
||||||
self.write_images(oeb_book.manifest, tdir)
|
self.write_images(oeb_book.manifest, tdir)
|
||||||
|
|
||||||
|
@ -10,10 +10,9 @@ __docformat__ = 'restructuredtext en'
|
|||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from calibre.ebooks.pdb.ereader import image_name
|
from htmlentitydefs import codepoint2name
|
||||||
from calibre.ebooks.htmlsymbols import HTML_SYMBOLS
|
|
||||||
|
|
||||||
from BeautifulSoup import BeautifulSoup
|
from calibre.ebooks.pdb.ereader import image_name
|
||||||
|
|
||||||
PML_HTML_RULES = [
|
PML_HTML_RULES = [
|
||||||
(re.compile(r'\\p'), lambda match: '<br /><br style="page-break-after: always;" />'),
|
(re.compile(r'\\p'), lambda match: '<br /><br style="page-break-after: always;" />'),
|
||||||
@ -71,10 +70,12 @@ def pml_to_html(pml):
|
|||||||
for rule in PML_HTML_RULES:
|
for rule in PML_HTML_RULES:
|
||||||
html = rule[0].sub(rule[1], html)
|
html = rule[0].sub(rule[1], html)
|
||||||
|
|
||||||
for symbol in HTML_SYMBOLS.keys():
|
# Turn special characters into entities.
|
||||||
if ord(symbol) > 128:
|
cps = [ord(c) for c in set(html)]
|
||||||
html = html.replace(symbol, HTML_SYMBOLS[symbol][len(HTML_SYMBOLS[symbol]) - 1])
|
cps = set(cps).intersection(codepoint2name.keys()).difference([60, 62])
|
||||||
|
for cp in cps:
|
||||||
|
html = html.replace(unichr(cp), '&%s;' % codepoint2name[cp])
|
||||||
|
|
||||||
return html
|
return html
|
||||||
|
|
||||||
def footnote_sidebar_to_html(id, pml):
|
def footnote_sidebar_to_html(id, pml):
|
||||||
|
@ -17,13 +17,18 @@ class TXTOutput(OutputFormatPlugin):
|
|||||||
file_type = 'txt'
|
file_type = 'txt'
|
||||||
|
|
||||||
options = set([
|
options = set([
|
||||||
OptionRecommendation(name='newline', recommended_value='system',
|
OptionRecommendation(name='newline', recommended_value='system',
|
||||||
level=OptionRecommendation.LOW,
|
level=OptionRecommendation.LOW,
|
||||||
short_switch='n', choices=TxtNewlines.NEWLINE_TYPES.keys(),
|
short_switch='n', choices=TxtNewlines.NEWLINE_TYPES.keys(),
|
||||||
help=_('Type of newline to use. Options are %s. Default is \'system\'. '
|
help=_('Type of newline to use. Options are %s. Default is \'system\'. '
|
||||||
'Use \'old_mac\' for compatibility with Mac OS 9 and earlier. '
|
'Use \'old_mac\' for compatibility with Mac OS 9 and earlier. '
|
||||||
'For Mac OS X use \'unix\'. \'system\' will default to the newline '
|
'For Mac OS X use \'unix\'. \'system\' will default to the newline '
|
||||||
'type used by this OS.') % sorted(TxtNewlines.NEWLINE_TYPES.keys())),
|
'type used by this OS.') % sorted(TxtNewlines.NEWLINE_TYPES.keys())),
|
||||||
|
OptionRecommendation(name='output_encoding', recommended_value='utf-8',
|
||||||
|
level=OptionRecommendation.LOW,
|
||||||
|
help=_('Specify the character encoding of the output document. ' \
|
||||||
|
'The default is utf-8. Note: This option is not honored by all ' \
|
||||||
|
'formats.')),
|
||||||
])
|
])
|
||||||
|
|
||||||
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
||||||
@ -41,7 +46,7 @@ class TXTOutput(OutputFormatPlugin):
|
|||||||
|
|
||||||
out_stream.seek(0)
|
out_stream.seek(0)
|
||||||
out_stream.truncate()
|
out_stream.truncate()
|
||||||
out_stream.write(txt.encode('utf-8'))
|
out_stream.write(txt.encode(self.opts.output_encoding, 'replace'))
|
||||||
|
|
||||||
if close:
|
if close:
|
||||||
out_stream.close()
|
out_stream.close()
|
||||||
|
@ -12,7 +12,6 @@ import os
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from calibre import entity_to_unicode
|
from calibre import entity_to_unicode
|
||||||
from calibre.ebooks.htmlsymbols import HTML_SYMBOLS
|
|
||||||
|
|
||||||
from BeautifulSoup import BeautifulSoup
|
from BeautifulSoup import BeautifulSoup
|
||||||
|
|
||||||
@ -82,10 +81,6 @@ class TxtWriter(object):
|
|||||||
return stripped
|
return stripped
|
||||||
|
|
||||||
def replace_html_symbols(self, content):
|
def replace_html_symbols(self, content):
|
||||||
for symbol in HTML_SYMBOLS:
|
|
||||||
for code in HTML_SYMBOLS[symbol]:
|
|
||||||
content = content.replace(code, symbol)
|
|
||||||
|
|
||||||
for entity in set(re.findall('&.+?;', content)):
|
for entity in set(re.findall('&.+?;', content)):
|
||||||
mo = re.search('(%s)' % entity[1:-1], content)
|
mo = re.search('(%s)' % entity[1:-1], content)
|
||||||
content = content.replace(entity, entity_to_unicode(mo))
|
content = content.replace(entity, entity_to_unicode(mo))
|
||||||
|
@ -123,6 +123,10 @@ class DeviceManager(Thread):
|
|||||||
self.connected_slot(False)
|
self.connected_slot(False)
|
||||||
device[1] ^= True
|
device[1] ^= True
|
||||||
|
|
||||||
|
def umount_device(self):
|
||||||
|
self.device.eject()
|
||||||
|
self.device = None
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
if not self.jobs.empty():
|
if not self.jobs.empty():
|
||||||
try:
|
try:
|
||||||
@ -852,5 +856,3 @@ class DeviceGUI(object):
|
|||||||
getattr(f, 'close', lambda : True)()
|
getattr(f, 'close', lambda : True)()
|
||||||
if memory and memory[1]:
|
if memory and memory[1]:
|
||||||
self.library_view.model().delete_books_by_id(memory[1])
|
self.library_view.model().delete_books_by_id(memory[1])
|
||||||
|
|
||||||
|
|
||||||
|
281
src/calibre/gui2/images/eject.svg
Normal file
281
src/calibre/gui2/images/eject.svg
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://web.resource.org/cc/"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="128"
|
||||||
|
height="128"
|
||||||
|
id="svg3186"
|
||||||
|
sodipodi:version="0.32"
|
||||||
|
inkscape:version="0.45"
|
||||||
|
version="1.0"
|
||||||
|
sodipodi:docname="player_end.svg"
|
||||||
|
sodipodi:docbase="/home/david/Progetti/sandbox"
|
||||||
|
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||||
|
sodipodi:modified="true">
|
||||||
|
<defs
|
||||||
|
id="defs3188">
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#radialGradient3163"
|
||||||
|
id="radialGradient2197"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(4.7377213e-8,-0.1315545,0.7519296,0,12.61245,94.56941)"
|
||||||
|
cx="80.342453"
|
||||||
|
cy="68.340897"
|
||||||
|
fx="80.342453"
|
||||||
|
fy="68.340897"
|
||||||
|
r="40.0294" />
|
||||||
|
<radialGradient
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.6667,0,0,0.7574,20.7214,14.064)"
|
||||||
|
r="40.0294"
|
||||||
|
cy="59.1865"
|
||||||
|
cx="53.1978"
|
||||||
|
id="radialGradient3163">
|
||||||
|
<stop
|
||||||
|
id="stop3165"
|
||||||
|
style="stop-color:#000000;stop-opacity:1;"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="stop3175"
|
||||||
|
style="stop-color:#666666;stop-opacity:1;"
|
||||||
|
offset="1" />
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="XMLID_9_"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="11.9487"
|
||||||
|
y1="34"
|
||||||
|
x2="104.0518"
|
||||||
|
y2="34"
|
||||||
|
gradientTransform="translate(559.14286,-264.28571)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#FFFFFF"
|
||||||
|
id="stop56" />
|
||||||
|
<stop
|
||||||
|
offset="0.80000001"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
id="stop58" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
id="XMLID_8_"
|
||||||
|
cx="53.1978"
|
||||||
|
cy="59.1865"
|
||||||
|
r="40.0294"
|
||||||
|
gradientTransform="matrix(0.6667,0,0,0.7574,20.7214,14.064)"
|
||||||
|
gradientUnits="userSpaceOnUse">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#323232"
|
||||||
|
id="stop41" />
|
||||||
|
<stop
|
||||||
|
offset="0.2083"
|
||||||
|
style="stop-color:#363636"
|
||||||
|
id="stop43" />
|
||||||
|
<stop
|
||||||
|
offset="0.4278"
|
||||||
|
style="stop-color:#434343"
|
||||||
|
id="stop45" />
|
||||||
|
<stop
|
||||||
|
offset="0.6526"
|
||||||
|
style="stop-color:#585858"
|
||||||
|
id="stop47" />
|
||||||
|
<stop
|
||||||
|
offset="0.8796"
|
||||||
|
style="stop-color:#757575"
|
||||||
|
id="stop49" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#888888"
|
||||||
|
id="stop51" />
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient
|
||||||
|
id="XMLID_7_"
|
||||||
|
cx="58"
|
||||||
|
cy="58"
|
||||||
|
r="48"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(559.14286,-264.28571)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#FFFFFF"
|
||||||
|
id="stop26" />
|
||||||
|
<stop
|
||||||
|
offset="0.574"
|
||||||
|
style="stop-color:#FFFFFF"
|
||||||
|
id="stop28" />
|
||||||
|
<stop
|
||||||
|
offset="0.6842"
|
||||||
|
style="stop-color:#FBFBFB"
|
||||||
|
id="stop30" />
|
||||||
|
<stop
|
||||||
|
offset="0.8001"
|
||||||
|
style="stop-color:#EEEEEE"
|
||||||
|
id="stop32" />
|
||||||
|
<stop
|
||||||
|
offset="0.9"
|
||||||
|
style="stop-color:#DDDDDD"
|
||||||
|
id="stop34" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#BBBBBB"
|
||||||
|
id="stop36" />
|
||||||
|
</radialGradient>
|
||||||
|
<filter
|
||||||
|
id="AI_Sfocatura_4">
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="4"
|
||||||
|
id="feGaussianBlur6" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
id="XMLID_6_"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="58.0005"
|
||||||
|
y1="116"
|
||||||
|
x2="58.0005"
|
||||||
|
y2="4.882812e-04">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#555555"
|
||||||
|
id="stop9" />
|
||||||
|
<stop
|
||||||
|
offset="0.2736"
|
||||||
|
style="stop-color:#595959"
|
||||||
|
id="stop11" />
|
||||||
|
<stop
|
||||||
|
offset="0.562"
|
||||||
|
style="stop-color:#666666"
|
||||||
|
id="stop13" />
|
||||||
|
<stop
|
||||||
|
offset="0.8561"
|
||||||
|
style="stop-color:#7B7B7B"
|
||||||
|
id="stop15" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#888888"
|
||||||
|
id="stop17" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#XMLID_9_"
|
||||||
|
id="linearGradient3242"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(6.0000006,6.0000006)"
|
||||||
|
x1="11.9487"
|
||||||
|
y1="34"
|
||||||
|
x2="104.0518"
|
||||||
|
y2="34" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#XMLID_7_"
|
||||||
|
id="radialGradient3246"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.0833333,0,0,1.0833333,1.1666673,1.1666673)"
|
||||||
|
cx="58"
|
||||||
|
cy="58"
|
||||||
|
r="48" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#XMLID_6_"
|
||||||
|
id="linearGradient3251"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="58.0005"
|
||||||
|
y1="116"
|
||||||
|
x2="58.0005"
|
||||||
|
y2="4.882812e-04" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#radialGradient3163"
|
||||||
|
id="radialGradient3253"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.6667,0,0,0.7574,20.7214,14.064)"
|
||||||
|
cx="53.1978"
|
||||||
|
cy="59.186501"
|
||||||
|
r="40.0294" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
gridtolerance="10000"
|
||||||
|
guidetolerance="10"
|
||||||
|
objecttolerance="10"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="2.8284271"
|
||||||
|
inkscape:cx="62"
|
||||||
|
inkscape:cy="44.566099"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
width="128px"
|
||||||
|
height="128px"
|
||||||
|
showgrid="true"
|
||||||
|
gridspacingx="8px"
|
||||||
|
gridspacingy="8px"
|
||||||
|
inkscape:window-width="792"
|
||||||
|
inkscape:window-height="581"
|
||||||
|
inkscape:window-x="225"
|
||||||
|
inkscape:window-y="112" />
|
||||||
|
<metadata
|
||||||
|
id="metadata3191">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<circle
|
||||||
|
cx="58"
|
||||||
|
cy="58"
|
||||||
|
r="58"
|
||||||
|
id="circle19"
|
||||||
|
style="fill:url(#linearGradient3251)"
|
||||||
|
sodipodi:cx="58"
|
||||||
|
sodipodi:cy="58"
|
||||||
|
sodipodi:rx="58"
|
||||||
|
sodipodi:ry="58"
|
||||||
|
transform="matrix(1.1034483,0,0,1.1034483,0,-2.8e-6)" />
|
||||||
|
<g
|
||||||
|
id="g21"
|
||||||
|
transform="matrix(1.0833333,0,0,1.0833333,1.1666686,1.1666686)"
|
||||||
|
style="filter:url(#AI_Sfocatura_4);opacity:0.8">
|
||||||
|
<path
|
||||||
|
d="M 10,58 C 10,84.467 31.533,106 58,106 C 84.467,106 106,84.467 106,58 C 106,31.533 84.467,10 58,10 C 31.533,10 10,31.533 10,58 z "
|
||||||
|
id="path23" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
d="M 12,63.999999 C 12,92.672581 35.327414,116 63.999998,116 C 92.672584,116 116,92.672581 116,63.999999 C 116,35.327415 92.672584,12 63.999998,12 C 35.327414,12 12,35.327415 12,63.999999 z "
|
||||||
|
id="path38"
|
||||||
|
style="fill:url(#radialGradient3246)" />
|
||||||
|
<polygon
|
||||||
|
points="42,26 90,58 42,90 42,26 "
|
||||||
|
id="polygon53"
|
||||||
|
style="fill:url(#radialGradient3253);fill-opacity:1"
|
||||||
|
transform="matrix(0,-0.8333333,1,0,6,107)" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccccc"
|
||||||
|
id="path2195"
|
||||||
|
d="M 40,88 L 40.38871,80 L 87.95798,80.005265 L 88,87.94911 L 40,88 z "
|
||||||
|
style="fill:url(#radialGradient2197);fill-opacity:1" />
|
||||||
|
<path
|
||||||
|
d="M 63.999998,63.999999 C 81.788999,63.999999 97.967006,58.87 110.05199,50.491 C 104.19999,30.582 85.775999,16 63.999998,16 C 42.222999,16 23.798999,30.582999 17.949,50.491 C 30.032,58.87 46.209999,63.999999 63.999998,63.999999 z "
|
||||||
|
id="path60"
|
||||||
|
style="opacity:0.5;fill:url(#linearGradient3242)" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 8.0 KiB |
@ -176,10 +176,23 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
|
|||||||
SIGNAL('activated(QSystemTrayIcon::ActivationReason)'),
|
SIGNAL('activated(QSystemTrayIcon::ActivationReason)'),
|
||||||
self.system_tray_icon_activated)
|
self.system_tray_icon_activated)
|
||||||
self.tool_bar.contextMenuEvent = self.no_op
|
self.tool_bar.contextMenuEvent = self.no_op
|
||||||
|
|
||||||
|
####################### Start spare job server ########################
|
||||||
|
QTimer.singleShot(1000, self.add_spare_server)
|
||||||
|
|
||||||
|
####################### Setup device detection ########################
|
||||||
|
self.device_manager = DeviceManager(Dispatcher(self.device_detected),
|
||||||
|
self.job_manager)
|
||||||
|
self.device_manager.start()
|
||||||
|
|
||||||
|
|
||||||
####################### Location View ########################
|
####################### Location View ########################
|
||||||
QObject.connect(self.location_view,
|
QObject.connect(self.location_view,
|
||||||
SIGNAL('location_selected(PyQt_PyObject)'),
|
SIGNAL('location_selected(PyQt_PyObject)'),
|
||||||
self.location_selected)
|
self.location_selected)
|
||||||
|
QObject.connect(self.location_view,
|
||||||
|
SIGNAL('umount_device()'),
|
||||||
|
self.device_manager.umount_device)
|
||||||
|
|
||||||
####################### Vanity ########################
|
####################### Vanity ########################
|
||||||
self.vanity_template = _('<p>For help visit <a href="http://%s.'
|
self.vanity_template = _('<p>For help visit <a href="http://%s.'
|
||||||
@ -462,13 +475,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
|
|||||||
|
|
||||||
|
|
||||||
self.setMaximumHeight(max_available_height())
|
self.setMaximumHeight(max_available_height())
|
||||||
####################### Start spare job server ########################
|
|
||||||
QTimer.singleShot(1000, self.add_spare_server)
|
|
||||||
|
|
||||||
####################### Setup device detection ########################
|
|
||||||
self.device_manager = DeviceManager(Dispatcher(self.device_detected),
|
|
||||||
self.job_manager)
|
|
||||||
self.device_manager.start()
|
|
||||||
|
|
||||||
|
|
||||||
if config['autolaunch_server']:
|
if config['autolaunch_server']:
|
||||||
|
@ -45,6 +45,9 @@
|
|||||||
<height>75</height>
|
<height>75</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="mouseTracking">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
<property name="verticalScrollBarPolicy">
|
<property name="verticalScrollBarPolicy">
|
||||||
<enum>Qt::ScrollBarAlwaysOff</enum>
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
</property>
|
</property>
|
||||||
|
@ -9,7 +9,8 @@ from PyQt4.Qt import QListView, QIcon, QFont, QLabel, QListWidget, \
|
|||||||
QSyntaxHighlighter, QCursor, QColor, QWidget, \
|
QSyntaxHighlighter, QCursor, QColor, QWidget, \
|
||||||
QPixmap, QMovie, QPalette, QTimer, QDialog, \
|
QPixmap, QMovie, QPalette, QTimer, QDialog, \
|
||||||
QAbstractListModel, QVariant, Qt, SIGNAL, \
|
QAbstractListModel, QVariant, Qt, SIGNAL, \
|
||||||
QRegExp, QSettings, QSize, QModelIndex
|
QRegExp, QSettings, QSize, QModelIndex, \
|
||||||
|
QAbstractButton, QPainter
|
||||||
|
|
||||||
from calibre.gui2 import human_readable, NONE, TableView, \
|
from calibre.gui2 import human_readable, NONE, TableView, \
|
||||||
qstring_to_unicode, error_dialog
|
qstring_to_unicode, error_dialog
|
||||||
@ -234,6 +235,13 @@ class LocationView(QListView):
|
|||||||
self.setCursor(Qt.PointingHandCursor)
|
self.setCursor(Qt.PointingHandCursor)
|
||||||
self.currentChanged = self.current_changed
|
self.currentChanged = self.current_changed
|
||||||
|
|
||||||
|
self.eject_button = EjectButton(self)
|
||||||
|
self.eject_button.hide()
|
||||||
|
|
||||||
|
self.connect(self, SIGNAL('entered(QModelIndex)'), self.show_eject)
|
||||||
|
self.connect(self, SIGNAL('viewportEntered()'), self.hide_eject)
|
||||||
|
self.connect(self.eject_button, SIGNAL('clicked()'), lambda: self.emit(SIGNAL('umount_device()')))
|
||||||
|
|
||||||
def count_changed(self, new_count):
|
def count_changed(self, new_count):
|
||||||
self.model().count = new_count
|
self.model().count = new_count
|
||||||
self.model().reset()
|
self.model().reset()
|
||||||
@ -249,6 +257,33 @@ class LocationView(QListView):
|
|||||||
if 0 <= row and row <= 3:
|
if 0 <= row and row <= 3:
|
||||||
self.model().location_changed(row)
|
self.model().location_changed(row)
|
||||||
|
|
||||||
|
def show_eject(self, location):
|
||||||
|
self.eject_button.hide()
|
||||||
|
|
||||||
|
if location.row() == 1:
|
||||||
|
rect = self.visualRect(location)
|
||||||
|
|
||||||
|
self.eject_button.resize(rect.height()/2, rect.height()/2)
|
||||||
|
|
||||||
|
x, y = rect.left(), rect.top()
|
||||||
|
x = x + (rect.width() - self.eject_button.width() - 2)
|
||||||
|
y += 6
|
||||||
|
|
||||||
|
self.eject_button.move(x, y)
|
||||||
|
self.eject_button.show()
|
||||||
|
|
||||||
|
def hide_eject(self):
|
||||||
|
self.eject_button.hide()
|
||||||
|
|
||||||
|
|
||||||
|
class EjectButton(QAbstractButton):
|
||||||
|
|
||||||
|
def paintEvent(self, event):
|
||||||
|
painter = QPainter(self)
|
||||||
|
painter.setClipRect(event.rect());
|
||||||
|
painter.drawPixmap(0, 0, QPixmap(':/images/eject').scaledToHeight(event.rect().height(), Qt.SmoothTransformation))
|
||||||
|
|
||||||
|
|
||||||
class DetailView(QDialog, Ui_Dialog):
|
class DetailView(QDialog, Ui_Dialog):
|
||||||
|
|
||||||
def __init__(self, parent, job):
|
def __init__(self, parent, job):
|
||||||
@ -617,4 +652,3 @@ class PythonHighlighter(QSyntaxHighlighter):
|
|||||||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
||||||
QSyntaxHighlighter.rehighlight(self)
|
QSyntaxHighlighter.rehighlight(self)
|
||||||
QApplication.restoreOverrideCursor()
|
QApplication.restoreOverrideCursor()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user