Pympress package¶
This page contains the inline documentation, generated from the code using sphinx.
The code is documented in the source using the Google style for docstrings. Sphinx has gathered a set of examples which serves as a better crash course than the full style reference.
Retructured text (rst) can be used inside the comments and docstrings.
Modules¶
pympress.__main__ – The entry point of pympress¶
- pympress.__main__.main(argv=['/usr/lib/python3/dist-packages/sphinx/__main__.py', '-N', '-bhtml', 'docs/', 'build/html'])[source]¶
Entry point of pympress. Parse command line arguments, instantiate the UI, and start the main loop.
- pympress.__main__.uncaught_handler(*exc_info)[source]¶
Exception handler, to log uncaught exceptions to our log file.
pympress.app – The Gtk.Application managing the lifetime and CLI¶
- class pympress.app.Pympress[source]¶
Bases:
ApplicationClass representing the single pympress Gtk application.
- action_startup_queue = []¶
listof actions to be passsed to the GUI that were queued before GUI was created
- activate_action(name, parameter=None)[source]¶
Parse an action name and activate it, with parameter wrapped in a
Variantif it is not None.- Parameters:
name (
str) – the name of the stateful actionparameter – an object or None to pass as a parameter to the action, wrapped in a GLib.Variant
- auto_log_level = True¶
boolto automatically upgrade log level (DEBUG / INFO at init, then ERROR), False if user set log level
- do_activate(timestamp=1712711118.919232)[source]¶
Activate: show UI windows.
Build them if they do not exist, otherwise bring to front.
- do_handle_local_options(opts_variant_dict)[source]¶
Parse command line options, returned as a VariantDict
- Returns:
estimated talk time, log level, notes positions.
- Return type:
tuple
- do_open(files, n_files, hint)[source]¶
Handle opening files. In practice we only open once, the last one.
- Parameters:
files (
listofFile) – representing an array of files to openn_files (
int) – the number of files passed.hint (
str) – a hint, such as view, edit, etc. Should always be the empty string.
- do_startup()[source]¶
Common start-up tasks for primary and remote instances.
NB. super(self) causes segfaults, Gtk.Application needs to be used as base.
- get_action_state(name)[source]¶
Parse an action name and return its unwrapped state from the
Variant.- Parameters:
name (
str) – the name of the stateful action- Returns:
the value contained in the action
- Return type:
str,int,boolorfloat
- option_descriptions = {'blank': ('Blank/unblank content screen', None), 'first': ('First slide', None), 'last': ('Last slide', None), 'log': ('Set level of verbosity in log file: DEBUG, INFO, WARNING, ERROR, or CRITICAL', '<level>'), 'next': ('Next slide', None), 'notes': ('Set the position of notes on the pdf page (none, left, right, top, bottom, after, odd, or prefix). Overrides the detection from the file.', '<position>'), 'pause': ('Toggle pause of talk timer', None), 'prev': ('Previous slide', None), 'quit': ('Close opened pympress instance', None), 'reset': ('Reset talk timer', None), 'talk-time': ('The estimated (intended) talk time in minutes (and optionally seconds)', 'mm[:ss]'), 'version': ('Print version and exit', None)}¶
- options = {'blank': (98, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'first': (102, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'last': (108, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'log': (0, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_STRING of type GLib.OptionArg>), 'next': (110, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'notes': (78, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_STRING of type GLib.OptionArg>), 'pause': (80, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'prev': (112, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'quit': (113, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'reset': (114, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'talk-time': (116, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_STRING of type GLib.OptionArg>), 'version': (118, <flags 0 of type GLib.OptionFlags>, <enum G_OPTION_ARG_NONE of type GLib.OptionArg>)}¶
- set_action_enabled(name, value)[source]¶
Parse an action name and set its enabled state to True or False.
- Parameters:
name (
str) – the name of the stateful actionvalue (
bool) – wheether the action should be enabled or disabled
- set_action_state(name, value)[source]¶
Parse an action name and set its state wrapped in a
Variant.- Parameters:
name (
str) – the name of the stateful actionvalue (
str,int,boolorfloat) – the value to set.
- set_log_level(action, param)[source]¶
Action that sets the logging level (on the root logger of the active instance)
- Parameters:
action (
Action) – The action activatd( (param) – class:~`GLib.Variant`): The desired level as an int wrapped in a GLib.Variant
- version_string = 'Pympress: 1.8.5 ; Python: 3.11.8 ; OS: Linux 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) ; Gtk 3.24.41 ; GLib 2.78.4 ; Poppler 22.12.0 cairo ; Cairo 1.18.0 , pycairo 1.26.0'¶
pympress.ui – GUI management¶
This module contains the whole graphical user interface of pympress, which is made of two separate windows: the Content window, which displays only the current page in full size, and the Presenter window, which displays both the current and the next page, as well as a time counter and a clock.
Both windows are managed by the UI class.
- class pympress.ui.UI(app, config)[source]¶
Bases:
BuilderPympress GUI management.
- accel_group = None¶
A
AccelGroupto store the shortcuts
- adjust_bottom_bar_font()[source]¶
Scale baseline font size of bottom bar, clipped to 6px..13px. Fonts are then scaled by CSS em indications.
- annotations = None¶
Class
Annotationsmanaging the display of annotations
- blanked = False¶
track whether we blank the screen
- c_da = None¶
DrawingAreafor the Content window.
- c_frame = None¶
AspectFramefor the Content window.
- c_win = None¶
Content window, as a
Windowinstance.
- cache = None¶
SurfaceCacheinstance.
- cancel_current_input(gaction, param=None)[source]¶
Handle the action cancelling the input, if applicable.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- change_notes_pos(gaction, target, force=False)[source]¶
Switch the position of the nodes in the slide.
- Returns:
the action triggering the call target (
Variant): the notes position as a string variant force (bool): Whether to force the notes switch even if it’s already enabled- Return type:
gaction (
Action)- Returns:
whether the notes position has been toggled
- Return type:
bool
- chosen_notes_mode = 4¶
Current choice of mode to toggle notes
- click_link(widget, event)[source]¶
Check whether a link was clicked and follow it.
Handles a click on a slide.
- Parameters:
widget (
Widget) – the widget in which the event occurredevent (
Event) – the event that occurred
- Returns:
whether the event was consumed
- Return type:
bool
- compute_frame_grid(grid_ar, n_frames)[source]¶
Determine the arragement of frames in a grid to maximise their size given respective aspect ratios
- Parameters:
grid_ar (
float) – aspect ratio of grid containing the slidesn_frames (
int) – the number of frames
- current_page = -1¶
number of page currently displayed in Content window’s miniatures
- do_page_change(unpause=True, autoplay=False)[source]¶
Switch to another page and display it.
This is a kind of event which is supposed to be called only from the
Documentclass.- Parameters:
is_preview (
bool) –Trueif the page change should not update the contentunpause (
bool) –Trueif the page change should unpause the timer,Falseotherwiseautoplay (
bool) –Trueif the page change is triggered automatically, otherwise cancel auto play
- doc_goto_end(gaction=None, param=None)[source]¶
Handle going to the end of the document
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- doc_goto_home(gaction=None, param=None)[source]¶
Handle going to the start of the document
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- doc_goto_next(gaction=None, param=None)[source]¶
Handle going to the previous page.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- doc_goto_prev(gaction=None, param=None)[source]¶
Handle going to the next page.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- doc_hist_next(gaction=None, param=None)[source]¶
Handle going to the next page in the history of visited pages
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- doc_hist_prev(gaction=None, param=None)[source]¶
Handle going to the previous page in the history of visited pages
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- doc_label_next(gaction=None, param=None)[source]¶
Handle going to the next page with a different label.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- doc_label_prev(gaction=None, param=None)[source]¶
Handle going to the previous page with a different label.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- error_opening_file(uri)[source]¶
Remove the current document.
- Parameters:
uri (
str) – the URI of the document
- est_time = None¶
EstimatedTalkTimeto set estimated/remaining talk time
- file_watcher = None¶
A
FileWatcherobject to reload modified files
- get_notes_mode()[source]¶
Simple getter.
- Returns:
Truthy when we split slides in content + notes
- Return type:
- goto_page(page, autoplay=False)[source]¶
Handle going to the page passed as argument
- Parameters:
page (
int) – the page to which to go. Will be clipped to document pages.autoplay (
bool) – whether this page change was triggered automatically
- grid_next = None¶
Gridfor the next slide(s) in the Presenter window.
- highlight_button = None¶
ToolButtonbig button for touch screens, go to scribble on screen
- hover_link(widget, event)[source]¶
Manage events related to hyperlinks, setting the cursor to a pointer if the hovered region is clickable.
- Parameters:
widget (
Widget) – the widget in which the event occurredevent (
Event) – the event that occurred
- Returns:
whether the event was consumed
- Return type:
bool
- inhibit_cookie = None¶
intorNone, may keep track of the Gtk.Application inhibit request
- laser_button = None¶
ToolButtonbig button for touch screens, go toggle the pointer
- layout_editor = None¶
LayoutEditorpopup to configure the layouts of the presenter window
- layout_name(notes_mode)[source]¶
Return the layout made for the selected notes_mode
- Parameters:
notes_mode (
PdfPage) – the mode/positioning of notes- Returns:
a string representing the appropriate layout
- Return type:
str
- load_layout(new)[source]¶
Replace the current layout
- Parameters:
new (
str) – the name of the layout to load,Noneto use current layout automatically
Display the “About pympress” dialog.
Handles clicks on the “about” menu.
- move_window(win, from_bounds, to_bounds)[source]¶
Move window from monitor number from_monitor to monitor to_monitor.
- next_button = None¶
ToolButtonbig button for touch screens, go to next slide
- next_frames_count = 16¶
intthe number of next slides currently on display in the “Next slides” pane, initialized to the maximal number
- notes_mode = 0¶
Whether to use notes mode or not
- on_configure_da(widget, event)[source]¶
Manage “configure” events for all drawing areas, e.g. resizes.
We tell the local
SurfaceCachecache about it, so that it can invalidate its internal cache for the specified widget and pre-render next pages at a correct size.Warning: Some not-explicitly sent signals contain wrong values! Just don’t resize in that case, since these always seem to happen after a correct signal that was sent explicitly.
- Parameters:
widget (
Widget) – the widget which has been resizedevent (
Event) – the GTK event, which contains the new dimensions of the widget
- on_configure_win(widget, event)[source]¶
Manage “configure” events for both window widgets.
- Parameters:
widget (
Widget) – the window which has been moved or resizedevent (
Event) – the GTK event, which contains the new dimensions of the widget
- on_drag_drop(widget, drag_context, x, y, data, info, time)[source]¶
Receive the drag-drops (as text only). If a file is dropped, open it.
- Parameters:
widget (
Widget) – The widget on which the dragged item was droppeddrag_context (
DragContext) – Context object of the draggingx (
float) – position of the dropy (
float) – position of the dropdata (
SelectionData) – container for the dropped datainfo (
int) – info on the targettime (
int) – time of the drop
- on_draw(widget, cairo_context)[source]¶
Manage draw events for both windows.
This callback may be called either directly on a page change or as an event handler by GTK. In both cases, it determines which widget needs to be updated, and updates it, using the
SurfaceCacheif possible.- Parameters:
widget (
Widget) – the widget to updatecairo_context (
Context) – the Cairo context (orNoneif called directly)
- on_key_input(widget, event)[source]¶
Handle key strokes at top level, only for when editing needs to bypass action accelerators
- Parameters:
widget (
Widget) – the widget which has received the key strokeevent (
Event) – the GTK event, which contains the key stroke details
- on_page_change(widget, event=None)[source]¶
Signal handler for current page editing.
- Parameters:
widget (
Widget) – the editable widget which has received the event.event (
Event) – the GTK event.
- on_pane_event(widget, evt)[source]¶
Signal handler for gtk.paned events.
This function allows one to delay drawing events when resizing, and to speed up redrawing when moving the middle pane is done (which happens at the end of a mouse resize)
- Parameters:
widget (
Widget) – the widget in which the event occurred (ignored)evt (
Event) – the event that occurred
- on_scroll(widget, event)[source]¶
Manage scroll events.
- Parameters:
widget (
Widget) – the widget in which the event occurred (ignored)event (
Event) – the event that occurred
- Returns:
whether the event was consumed
- Return type:
bool
- open_file(gaction, target)[source]¶
Open a document.
- Parameters:
gaction (
Action) – the action triggering the calltarget (
Variant) – the file to open as a string variant
- p_central = None¶
Boxfor the Presenter window.
- p_da_cur = None¶
DrawingAreafor the current slide copy in the Presenter window.
- p_da_notes = None¶
DrawingAreafor the current slide in the Presenter window.
- p_das_next = None¶
DrawingAreafor the next slide in the Presenter window.
- p_frame_annot = None¶
Framefor the annotations in the Presenter window.
- p_frame_cur = None¶
listofAspectFramefor the current slide copy in the Presenter window.
- p_frame_notes = None¶
AspectFramefor the current slide in the Presenter window.
- p_frames_next = None¶
listofAspectFramefor the next slide in the Presenter window.
- p_win = None¶
Presenter window, as a
Windowinstance.
- page_number = None¶
PageNumberdisplaying and setting current page numbers
- pane_handle_pos = {}¶
Map of
Panedto the relative position (floatbetween 0 and 1) of its handle
- placeable_widgets = {}¶
Dictionary of
Widgetfrom the presenter window that can be dynamically rearranged
Callback for the recent document menu.
Gets the URI and requests the document swap.
- Parameters:
gaction (
Action) – the action triggering the callis_opening (
Variant) – a wrapped boolean indicating whether the menu is opening or closing.
- prev_button = None¶
ToolButtonbig button for touch screens, go to previous slide
- preview_page = -1¶
number of page currently displayed in Presenter window’s miniatures
A
Menuto display the recent files to open
- reconfigure_next_frames(gaction, param)[source]¶
Callback to set the number of next frames to preview the the “next slides” panel
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the number of slides as a GVariant
- redraw_panes()[source]¶
Handler for
Paned’s resizing signal.Used for delayed drawing events of drawing areas inside the panes.
This is very useful on windows where resizing gets sluggish if we try to redraw while resizing.
- redraw_timeout = 0¶
Tracks return values of GLib.timeout_add to cancel gtk.paned’s redraw callbacks
- reflow_next_frames(n_frames=None)[source]¶
Set the number of next frames to preview the the “next slides” panel
- Parameters:
n_frames (
int) – the number of frames
- resize_panes = False¶
Indicates whether we should delay redraws on some drawing areas to fluidify resizing gtk.paned
- screens_changed(screen)[source]¶
Handle ::monitors-changed events
- Parameters:
screen (
Screen) – the screen
- scribbler = None¶
Class
Scribblemanaging drawing by the user on top of the current slide.
- set_screensaver(disabled)[source]¶
Disable or re-enable the screensaver.
- Parameters:
disabled (
bool) –Trueiff the screensaver should be disabled, otherwise enabled.
- setup_screens(screen, event_name='')[source]¶
If multiple monitors, fullscreen windows on monitors according to config.
- Parameters:
screen (
Screen) – the screenevent_name (
str) – a description of what caused the screen setup event, for debugging
- shortcuts_window = None¶
A
ShortcutsWindowto show the shortcuts
- show_annotations = True¶
Whether to display annotations or not
- show_bigbuttons = True¶
Whether to display big buttons or not
- swap_document(doc_uri, page=0, reloading=False)[source]¶
Replace the currently open document with a new one.
The new document is possibly and EmptyDocument if doc_uri is None. The state of the ui and cache are updated accordingly.
- Parameters:
doc_uri (
str) – the URI to the new documentpage (
int) – the page at which to start the presentationreloading (
bool) – whether we are reloading or detecting stuff from the document
- swap_screens(*args)[source]¶
Swap the monitors on which each window is displayed (if there are 2 monitors at least).
- switch_annotations(gaction, target)[source]¶
Switch the display to show annotations or to hide them.
- Returns:
the action triggering the call target (
Variant): the parameter as a variant, or None- Return type:
gaction (
Action)- Returns:
whether the mode has been toggled.
- Return type:
bool
- switch_blanked(gaction, param)[source]¶
Switch the blanked mode of the content screen.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- Returns:
whether the notes blanking has been toggled.
- Return type:
bool
- switch_fullscreen(gaction, target)[source]¶
Switch the Content window to fullscreen (if in normal mode) or to normal mode (if fullscreen).
Screensaver will be disabled when entering fullscreen mode, and enabled when leaving fullscreen mode.
- Parameters:
widget (
Widget) – the widget in which the event occurred- Returns:
whether some window’s full screen status got toggled
- Return type:
bool
- switch_mode(gaction, target_mode=None, force=False)[source]¶
Switch the display mode to “Notes mode” or “Normal mode” (without notes).
- Returns:
the action triggering the call target_mode (
PdfPage): the mode to which we should switch force (bool): Whether to force the mode switch even if it’s already enabled- Return type:
gaction (
Action)- Returns:
whether the notes mode has been toggled
- Return type:
bool
- talk_time = None¶
TimeCounterclock tracking talk time (elapsed, and remaining)
- timing = None¶
TimingReportpopup to show how much time was spent on which part
- track_clicks(widget, event)[source]¶
Track mouse press and release events.
Handles clicks on the slides.
- Parameters:
widget (
Widget) – the widget that received the clickevent (
Event) – the GTK event containing the click position
- Returns:
whether the event was consumed
- Return type:
bool
- track_motions(widget, event)[source]¶
Track mouse motion events.
Handles mouse motions on the “about” menu.
- Parameters:
widget (
Widget) – the widget that received the mouse motionevent (
Event) – the GTK event containing the mouse position
- Returns:
whether the event was consumed
- Return type:
bool
- unsaved_changes(reload=False)[source]¶
Prompt the user about what to do with changes in the document: save, discard, or cancel action
- Parameters:
reload (
bool) – The unsaved changes is prompted by reloading the file- Returns:
Trueiff we need to cancel the current action- Return type:
bool
- update_frame_position(widget, user_data)[source]¶
Callback to preview the frame alignment, called from the Gtk.SpinButton.
- Parameters:
widget (
SpinButton) – The button updating the slide alignment in the drawing area widgetuser_data (
str) – The property being set, either the x or y alignment (resp. xalign and yalign).
pympress.document – document handling¶
This module contains several classes that are used for managing documents (only PDF documents are supported at the moment, but other formats may be added in the future).
An important point is that this module is completely independent from the GUI: there should not be any GUI-related code here, except for page rendering (and only rendering itself: the preparation of the target surface must be done elsewhere).
- class pympress.document.Document(builder, pop_doc, uri)[source]¶
Bases:
objectThis is the main document handling class.
The page numbering starts as 0 and is aware of notes (i.e. number of pages may change to account for note pages). The document page numbers are the same as in Poppler, and also start at 0 but do not depend on notes.
- Parameters:
builder (
pympress.builder.Builder) – A builder to load callbackspop_doc (
Document) – Instance of the Poppler document that this class will wrapuri (
str) – URI of the PDF file to openpage (
int) – page number to which the file should be opened
- changes = False¶
boolindicating whether there were modifications to the document
- cleanup_media_files()[source]¶
Removes all files that were extracted from the pdf into the filesystem.
- static create(builder, uri)[source]¶
Initializes a Document by passing it a
Document.- Parameters:
builder (
pympress.builder.Builder) – A builder to load callbacksuri (
str) – URI to the PDF file to openpage (
int) – page number to which the file should be opened
- Returns:
The initialized document
- Return type:
- doc = None¶
Current PDF document (
Documentinstance)
- doc_page_labels = []¶
listof all the page labels, indexed on document page numbers
- get_full_path(filename)[source]¶
Returns full path, extrapolated from a path relative to this document or to the current directory.
- Parameters:
filename (
Pathorstr) – Name of the file or relative path to it- Returns:
the full path to the file or None if it doesn’t exist
- Return type:
Path
- get_last_label_pages()[source]¶
Return the last page number for each consecutively distinct page label
In other words, squash together consecutive same labels
- get_structure(index_iter=None)[source]¶
Gets the structure of the document from its index.
Recursive, pass the iterator.
- Parameters:
index_iter (
IndexIterorNone) – the iterator for the child index to explore.- Returns:
A list of tuples (depth, page number, title)
- Return type:
list
- get_uri()[source]¶
Gives access to the URI, rather than the path, of this document.
- Returns:
the URI to the file currently opened.
- Return type:
str
- goto(number)[source]¶
Switch to another page. Validates the number and returns one in the correct range. Also updates history.
- Parameters:
number (
int) – number of the destination page
- guess_notes(horizontal, vertical, current_page=0)[source]¶
Get our best guess for the document mode.
- Parameters:
horizontal (
str) – A string representing the preference for horizontal slidesvertical (
str) – A string representing the preference for vertical slides
- Returns:
the notes mode
- Return type:
- has_labels()[source]¶
Return whether this document has useful labels.
- Returns:
False iff there are no labels or they are just the page numbers
- Return type:
bool
- hist_pos = -1¶
Our position in the history
- history = []¶
History of pages we have visited, using note-aware page numbers
- label_after(page)[source]¶
Switch to the next page with different label.
If we’re within a set of pages with the same label we want to go to the last one.
- label_before(page)[source]¶
Switch to the previous page with different label.
If we’re within a set of pages with the same label we want to go before the first one.
- lookup_label(label, prefix_unique=True)[source]¶
Find a page from its label.
- Parameters:
label (
str) – the label we are searching forprefix_unique (
bool) – whether a prefix match should be unique, e.g. when the user is still typing
- Returns:
the page
- Return type:
int
callback, to be connected to
goto_page()
- nb_pages = -1¶
Number of pages in the document
- notes_mapping = None¶
listof (slide’s document page number, notes’ document page number) tuples, orNoneif there are no notes
- notes_page(number)[source]¶
Get the specified page.
- Parameters:
number (
int) – number of the page to return- Returns:
the wanted page, or
Noneif it does not exist- Return type:
- page(number)[source]¶
Get the specified page.
- Parameters:
number (
int) – number of the page to return- Returns:
the wanted page, or
Noneif it does not exist- Return type:
- page_labels = []¶
listof slide page labels, indexed on note-aware page numbers
- pages_cache = {}¶
Pages cache (
dictofPage). This makes navigation in the document faster by avoiding calls to Poppler when loading a page that has already been loaded.
- pages_number()[source]¶
Get the number of pages in the document.
- Returns:
the number of pages in the document
- Return type:
int
- path = None¶
URI
- Type:
Pathto pdf if uri is a file
- remove_on_exit(filename)[source]¶
Remember a temporary file to delete later.
- Parameters:
filename (
Path) – The path to the file to delete
- save_changes(dest_uri=None)[source]¶
Save the changes
- Parameters:
dest_uri (
strorNone) – The URI where to save the file, or None to save in-place
- set_notes_pos(notes_direction)[source]¶
Set whether where the notes pages are relative to normal pages
Valid values are returned by
direction()- page number (aka Libreoffice notes mode) - page parity (can not be detected automatically, where every other page contains notes) - page mapping (where labels of notes pages are corresponding slide labels prefixed with “notes:”)- Parameters:
notes_direction (
str) – Where the notes pages are
- start_editing_page_number()¶
callback, to be connected to
start_editing()
- temp_files = {}¶
setofPathrepresenting the temporary files which need to be removed
- uri = None¶
strfull path to pdf
- class pympress.document.EmptyDocument[source]¶
Bases:
DocumentA dummy document, placeholder for when no document is open.
- class pympress.document.EmptyPage(parent)[source]¶
Bases:
PageA dummy page, placeholder for when there are no valid pages around.
This page is a non-notes page with an aspect ratio of 1.3 and nothing else inside. Also, it has no “rendering” capability, and is made harmless by overriding its render function.
- can_render()[source]¶
Informs that rendering is not necessary (avoids checking the type).
- Returns:
False, no rendering- Return type:
bool
- render_cairo(cr, ww, wh, dtype=PdfPage.FULL)[source]¶
Overriding this purely for safety: make sure we do not accidentally try to render.
- Parameters:
cr (
CairoContext) – target surfaceww (
int) – target width in pixelswh (
int) – target height in pixelsdtype (
PdfPage) – the type of document that should be rendered
- class pympress.document.Link(x1, y1, x2, y2, action)[source]¶
Bases:
objectThis class encapsulates one hyperlink of the document.
- Parameters:
x1 (
float) – first x coordinate of the link rectangley1 (
float) – first y coordinate of the link rectanglex2 (
float) – second x coordinate of the link rectangley2 (
float) – second y coordinate of the link rectangleaction (
function) – action to perform when the link is clicked
- static build_closure(fun, *args, **kwargs)[source]¶
Return a lambda that calls fun(*args, **kwargs), with the current value of args and kwargs.
By creating the lambda in a new scope, we bind the arguments.
- Parameters:
fun (
function) – The function to be calledargs (
tuple) – non-keyworded variable-length argument list to pass to fun()kwargs (
dict) – keyworded variable-length argument dict to pass to fun()
- follow(**kwargs)¶
function, action to be perform to follow this link
- is_over(x, y)[source]¶
Tell if the input coordinates are on the link rectangle.
- Parameters:
x (
float) – input x coordinatey (
float) – input y coordinate
- Returns:
Trueif the input coordinates are within the link rectangle,Falseotherwise- Return type:
bool
- x1 = None¶
float, first x coordinate of the link rectangle
- x2 = None¶
float, second x coordinate of the link rectangle
- y1 = None¶
float, first y coordinate of the link rectangle
- y2 = None¶
float, second y coordinate of the link rectangle
- class pympress.document.Media(relative_margins, filename, autoplay, repeat, poster, show_controls, type, start_pos, duration)¶
Bases:
tupleA class that holds all the properties for media files
- autoplay¶
Alias for field number 2
- duration¶
Alias for field number 8
- filename¶
Alias for field number 1
- poster¶
Alias for field number 4
- relative_margins¶
Alias for field number 0
- repeat¶
Alias for field number 3
- show_controls¶
Alias for field number 5
- start_pos¶
Alias for field number 7
- type¶
Alias for field number 6
- class pympress.document.Page(page, number, parent)[source]¶
Bases:
objectClass representing a single page.
It provides several methods used by the GUI for preparing windows for displaying pages, managing hyperlinks, etc.
- Parameters:
doc (
Page) – the poppler object around the pagenumber (
int) – number of the page to fetch in the documentparent (
Document) – the parent Document class
- annotations = []¶
All text annotations
- can_render()[source]¶
Informs that rendering is necessary (avoids checking the type).
- Returns:
True, do rendering- Return type:
bool
- get_annot_action(link_type, action, rect)[source]¶
Get the function to be called when the link is followed.
- Parameters:
link_type (
ActionType) – The link typeaction (
Action) – The action to be performed when the link is clickedrect (
Rectangle) – The region of the page where the link is
- Returns:
The function to be called to follow the link
- Return type:
function
- get_annotations()[source]¶
Get the list of text annotations on this page.
- Returns:
annotations on this page
- Return type:
listofstr
- get_aspect_ratio(dtype=PdfPage.FULL)[source]¶
Get the page aspect ratio.
- Parameters:
dtype (
PdfPage) – the type of document to consider- Returns:
page aspect ratio
- Return type:
float
- get_link_action(link_type, action)[source]¶
Get the function to be called when the link is followed.
- Parameters:
link_type (
ActionType) – The type of action to be performedaction (
Action) – The atcion to be performed
- Returns:
The function to be called to follow the link
- Return type:
function
- get_link_at(x, y, dtype=PdfPage.FULL)[source]¶
Get the
Linkcorresponding to the given position.Returns
Noneif there is no link at this position.
- get_media()[source]¶
Get the list of medias this page might want to play.
- Returns:
medias in this page
- Return type:
list
- get_size(dtype=PdfPage.FULL)[source]¶
Get the page size.
- Parameters:
dtype (
PdfPage) – the type of document to consider- Returns:
page size
- Return type:
(float, float)
- new_annotation(pos, rect=None, value='')[source]¶
Add an annotation to this page
- Parameters:
pos (
int) – The position in the list of annotations in which to insert this annotationrect (
Rectangle) – A rectangle for the position of this annotationvalue (
str) – The contents of the annotation
- page = None¶
Page handled by this class (instance of
Page)
- page_label = None¶
strrepresenting the page label
- page_nb = -1¶
int, number of the current page (starting from 0)
- ph = 0.0¶
float, page height
- pw = 0.0¶
float, page width
- remove_annotation(pos)[source]¶
Remove an annotation from this page
- Parameters:
pos (
int) – The number of the annotation
- class pympress.document.PdfPage(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
IntEnumRepresents the part of a PDF page that we want to draw.
- AFTER = 6¶
Full page + draw another page for notes, which is after the slides
- BEFORE = 7¶
for a notes page, the slide page is BEFORE by half a document
- Type:
Complementary of AFTER
- BOTTOM = 2¶
Bottom half of PDF page
- EVEN = 9¶
Complementary of ODD
- FULL = 1¶
Full PDF page (without notes)
- LEFT = 5¶
Left half of PDF page
- MAP = 10¶
An arbitrary mapping of notes pages to slide pages
- NONE = 0¶
No notes on PDF page, only falsy value
- ODD = 8¶
Slides on even pages (0-indexed), notes on uneven pages
- RIGHT = 4¶
Right half of PDF page
- RMAP = 11¶
Reverse the arbitrary mapping MAP
- TOP = 3¶
Top half of PDF page
- direction()[source]¶
Returns whether the pdf page/notes mode is horizontal or vertical.
- Returns:
a string representing the direction that can be used as the key in the config section
- Return type:
str
- from_screen(x, y, x2=None, y2=None)[source]¶
Transform visible part of the page coordinates to full page coordinates.
Pass 2 floats to transform coordinates, 4 to transform margins, i.e. the second pair of coordinates is taken from the opposite corner.
- Parameters:
x (
float) – x coordinate on the screen, on a scale 0..1y (
float) – y coordinate on the screen, on a scale 0..1x2 (
float) – second x coordinate on the screen, from the other side, on a scale 0..1y2 (
float) – second y coordinate on the screen, from the other side, on a scale 0..1
- to_screen(x, y, x2=None, y2=None)[source]¶
Transform full page coordinates to visible part coordinates.
Pass 2 floats to transform coordinates, 4 to transform margins, i.e. the second pair of coordinates is taken from the opposite corner.
- Parameters:
x (
float) – x coordinate on the page, on a scale 0..1y (
float) – y coordinate on the page, on a scale 0..1x2 (
float) – second x coordinate on the page, from the other side, on a scale 0..1y2 (
float) – second y coordinate on the page, from the other side, on a scale 0..1
- pympress.document.get_extension(mime_type)[source]¶
Returns a valid filename extension (recognized by python) for a given mime type.
- Parameters:
mime_type (
str) – The mime type for which to find an extension- Returns:
A file extension used for the given mimetype
- Return type:
str
pympress.ui_builder – abstract GUI management¶
This module contains the tools to load the graphical user interface of pympress, building the widgets/objects from XML (glade) files, applying translation “manually” to avoid dealing with all the mess of C/GNU gettext’s bad portability.
- class pympress.builder.Builder[source]¶
Bases:
BuilderGUI builder, inherits from
Builderto read XML descriptions of GUIs and load them.- connect_signals(base_target)[source]¶
Signal connector connecting to properties of
base_target, or properties of its properties, etc.- Parameters:
base_target (
Builder) – The target object, that has functions to be connected tobuilder. (signals loaded in this) –
- get_callback_handler(handler_name)[source]¶
Returns the handler from its name, searching in target.
Parse handler names and split on ‘.’ to use recursion.
- Parameters:
target (
object) – An object that has a method calledhandler_namehandler_name (
str) – The name of the function to be connected to a signal
- Returns:
A function bound to an object
- Return type:
function
- list_attributes(target)[source]¶
List the None-valued attributes of target.
- Parameters:
target (
dict) – An object with None-valued attributes
- load_ui(resource_name, **kwargs)[source]¶
Loads the UI defined in the file named resource_name using the builder.
- Parameters:
resource_name (
str) – the basename of the glade file (without extension), identifying the resource to load.
- load_widgets(target)[source]¶
Fill in target with the missing elements introspectively.
This means that all attributes of
targetthat are None now must exist under the same name in the builder.- Parameters:
target (
dict) – An object with None-valued properties whose names correspond to ids of built widgets.
- pending_pane_resizes = {}¶
dictmappingPanednames to atupleof (handler id of the size-allocate signal, remaining number of times we allow this signal to run), and we run the signal 2 * (depth + 1) for each pane. This is because size allocation is done bottom-up but each pane sets a top-down constraint.
- replace_layout(layout, top_widget, leaf_widgets, pane_resize_handler=None)[source]¶
Remix the layout below top_widget with the layout configuration given in ‘layout’ (assumed to be valid!).
- Parameters:
layout (
dict) – the json-parsed config string, thus a hierarchy of lists/dicts, with strings as leavestop_widget (
Container) – The top-level widget under which we build the hierachyyleaf_widgets (
dict) – the map of valid leaf identifiers (strings) to the correspondingWidgetpane_resize_handler (function) – callback function to be called when the panes are resized
- Returns:
The mapping of the used
Panedwidgets to their relative handle position (in 0..1).- Return type:
dict
- resize_paned(paned, rect, relpos)[source]¶
Resize
panedto have its handle atrelpos, then disconnect this signal handler.Called from the
Gtk.Widget.signals.size_allocate()signal.- Parameters:
paned (
Paned) – Panel whose size has just been allocated, and whose handle needs initial placement.rect (
Rectangle) – The rectangle specifying the size that has just been allocated topanedrelpos (
float) – A number between0.and1.that specifies the handle position
- Returns:
True
- static setup_actions(actions, action_map=None)[source]¶
Sets up actions with a given prefix, using the Application as the ActionMap.
- Parameters:
actions (
dict) – Maps the action names to dictionaries containing their parameters.action_map (
ActionMap) – The object implementing the action map interface to register actions
- signal_connector(builder, obj, signal_name, handler_name, connect_object, flags, *user_data)[source]¶
Callback for signal connection. Implements the
BuilderConnectFuncfunction interface.- Parameters:
builder (
Builder) – The builder, unusedobj (
Object) – The object (usually a wiget) that has a signal to be connectedsignal_name (
str) – The name of the signalhandler_name (
str) – The name of the function to be connected to the signalconnect_object (
Object) – unusedflags (
ConnectFlags) – unuseduser_data (
tuple) – supplementary positional arguments to be passed to the handler
pympress.surfacecache – pages prerendering and caching¶
This modules contains stuff needed for caching pages and prerendering them. This
is done by the SurfaceCache class, using several
dict of ImageSurface for storing rendered pages.
The problem is, neither Gtk+ nor Poppler are particularly threadsafe. Hence the prerendering isn’t really done in parallel in another thread, but scheduled on the main thread at idle times using GLib.idle_add().
- class pympress.surfacecache.SurfaceCache(doc, max_pages)[source]¶
Bases:
objectPages caching and prerendering made (almost) easy.
- Parameters:
doc (
Document) – the current documentmax_pages (
int) – The maximum page number.
- active_widgets = {}¶
Set of active widgets
- add_widget(widget, wtype, prerender_enabled=True, zoomed=False, ignore_max=False)[source]¶
Add a widget to the list of widgets that have to be managed (for caching and prerendering).
This creates new entries for
widget_namein the needed internal data structures, and creates a new thread for prerendering pages for this widget.- Parameters:
widget (
Widget) – The widget for which we need to cachewtype (
int) – type of document handled by the widget (seesurface_type)prerender_enabled (
bool) – whether this widget is initially in the list of widgets to prerenderzoomed (
bool) – whether we will cache a zoomed portion of the widgetignore_max (
bool) – whether we will cache an unlimited number of slides
- clear_cache(widget_name=None)[source]¶
Remove all cached values for a given widget. Useful for zoomed views.
- Parameters:
widget_name (
str) – name of the widget that is resized,Nonefor all widgets.
- disable_prerender(widget_name)[source]¶
Remove a widget from the ones to be prerendered.
- Parameters:
widget_name (
str) – string used to identify a widget
- enable_prerender(widget_name)[source]¶
Add a widget to the ones to be prerendered.
- Parameters:
widget_name (
str) – string used to identify a widget
- get(widget_name, page_nb)[source]¶
Fetch a cached, prerendered page for the specified widget.
- Parameters:
widget_name (
str) – name of the concerned widgetpage_nb (
int) – number of the page to fetch in the cache
- Returns:
the cached page if available, or
Noneotherwise- Return type:
ImageSurface
- get_widget_type(widget_name)[source]¶
Get the document type of a widget.
- Parameters:
widget_name (
str) – string used to identify a widget- Returns:
type of document handled by the widget (see
surface_type)- Return type:
int
- locks = {}¶
Dictionary of
Lockused for managing conccurent accesses tosurface_cacheandsurface_size
- max_pages = 200¶
maximum number fo pages we keep in cache
- prerender(page_nb)[source]¶
Queue a page for prerendering.
The specified page will be prerendered for all the registered widgets.
- Parameters:
page_nb (
int) – number of the page to be prerendered
- put(widget_name, page_nb, val)[source]¶
Store a rendered page in the cache.
- Parameters:
widget_name (
str) – name of the concerned widgetpage_nb (
int) – number of the page to store in the cacheval (
ImageSurface) – content to store in the cache
- renderer(widget_name, page_nb)[source]¶
Rendering function.
This function is meant to be scheduled on the GLib main loop. When run, it will go through the following steps:
check if the job’s result is not already available in the cache
render it in a new
ImageSurfaceif necessarystore it in the cache if it was not added there since the beginning of the process and the widget configuration is still valid
- Parameters:
widget_name (
str) – name of the concerned widgetpage_nb (
int) – number of the page to store in the cache
- resize_widget(widget_name, width, height)[source]¶
Change the size of a registered widget, thus invalidating all the cached pages.
- Parameters:
widget_name (
str) – name of the widget that is resizedwidth (
int) – new width of the widgetheight (
int) – new height of the widget
- set_widget_type(widget_name, wtype)[source]¶
Set the document type of a widget.
- Parameters:
widget_name (
str) – string used to identify a widgetwtype (
int) – type of document handled by the widget (seesurface_type)
- surface_cache = {}¶
The actual cache. The
dict`s keys are widget names and its values are :class:`~collections.OrderedDict, whose keys are page numbers and values are instances ofImageSurface. In eachOrderedDictkeys are ordered by Least Recently Used (get or set), when the size is beyondmax_pages, pages are popped from the start of the cache.
- surface_factory = {}¶
dictcontaining functions that return aSurfacegiven aFormat, widthintand heightint, seecreate_similar_image_surface()
- surface_size = {}¶
Size of the different managed widgets, as a
dictof tuples
- surface_type = {}¶
its keys are widget names and its values are document types from ui.
- Type:
Type of document handled by each widget. It is a
dict
- swap_document(new_doc)[source]¶
Replaces the current document for which to cache slides with a new one.
This function also clears the cached pages, since they now belong to an outdated document.
- Parameters:
new_doc (
Document) – the new document
- unlimited = {}¶
Set of widgets for which we ignore the max
pympress.scribble – Manage user drawings on the current slide¶
- class pympress.scribble.Scribbler(config, builder, notes_mode)[source]¶
Bases:
BuilderUI that allows to draw free-hand on top of the current slide.
- Parameters:
- active_preset = -1¶
intthat is the currently selected element
- adjust_tools_orientation()[source]¶
Actually change the highlight tool elements orientations according to self.tools_orientation
- c_da = None¶
The
DrawingAreain the content window
- current_page = (None, None)¶
tupleof (int,str) indicating the current page number and label
- disable_scribbling()[source]¶
Disable the scribbling mode.
- Returns:
whether it was possible to disable (thus if it was not disabled already)
- Return type:
bool
- draw_scribble(widget, cairo_context)[source]¶
Perform the drawings by user.
- Parameters:
widget (
DrawingArea) – The widget where to draw the scribbles.cairo_context (
Context) – The canvas on which to render the drawings
- enable_scribbling()[source]¶
Enable the scribbling mode.
- Returns:
whether it was possible to enable (thus if it was not enabled already)
- Return type:
bool
- get_slide_point()¶
callback, to be connected to
get_slide_point()
- highlight_mode = 'single-page'¶
- key_event(widget, event)[source]¶
Handle key events to activate the eraser while the shortcut is held
- Parameters:
widget (
Widget) – the widget which has received the event.event (
Event) – the GTK event.
- Returns:
whether the event was consumed
- Return type:
bool
- load_layout()¶
callback, to be connected to
load_layout()
- load_preset(gaction=None, target=None)[source]¶
Loads the preset color of a given number or designed by a given widget, as an event handler.
- Parameters:
gaction (
Action) – the action triggering the calltarget (
Variant) – the new preset to load, as a string wrapped in a GLib.Variant
- Returns:
whether the preset was loaded
- Return type:
bool
- mouse_pos = None¶
The position of the mouse on the slide as
tupleoffloat
- next_render = 0¶
The next scribble to render (i.e. that is not rendered in cache)
- on_configure_da(widget, event)[source]¶
Transfer configure resize to the cache.
- Parameters:
widget (
Widget) – the widget which has been resizedevent (
Event) – the GTK event, which contains the new dimensions of the widget
- on_eraser_button_draw(widget, cairo_context)[source]¶
Handle drawing the eraser button.
- Parameters:
widget (
Widget) – the widget to updatecairo_context (
Context) – the Cairo context (orNoneif called directly)
- on_preset_button_draw(widget, cairo_context)[source]¶
Handle drawing the marker/pencil buttons, with appropriate thickness and color.
- Parameters:
widget (
Widget) – the widget to updatecairo_context (
Context) – the Cairo context (orNoneif called directly)
- p_central = None¶
Boxin the Presenter window, where we insert scribbling.
- page_change(page_number, page_label)[source]¶
Called when we change pages, to clear or restore scribbles
- Parameters:
page_number (
int) – The number of the new pagepage_label (
str) – The label of the new page
- page_change_action(gaction, param)[source]¶
Change whether we exit or stay in highlighting mode on page changes
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the new mode as a string wrapped in a GLib.Variant
- page_change_exits = True¶
boolindicating whether we exit highlighting mode on page change
- static parse_color(text)[source]¶
Transform a string to a Gdk object in a single function call
- Parameters:
text (
str) – A string describing a color- Returns:
A new color object parsed from the string
- Return type:
RGBA
- pen_action = None¶
The
Actionthat contains the currently selected pen
- points_to_curves(points)[source]¶
Transform a list of points from scribbles to bezier curves
- Returns:
control points of a bezier curves to draw
- Return type:
list
- preset_toolbar = None¶
Boxcontaining the presets
- previous_preset = -1¶
intto remember the previously selected element, before holding “eraser”
- redraw_current_slide()¶
callback, to be connected to
redraw_current_slide()
- remembered_scribbles = {}¶
dictof scribbles per page
- render_scribble(cairo_context, color, width, points, pressures)[source]¶
Draw a single scribble, i.e. a bezier curve, on the cairo context
- Parameters:
cairo_context (
Context) – The canvas on which to render the drawingscolor (
RGBA) – The color of the scribblewidth (
float) – The width of the curvepoints (
list) – The control points of the curve, scaled to the surface.pressures (
list) – The relative line width at each point asfloatvalues in 0..1
- resize_cache()¶
callback, to be connected to
resize_widget()
- scribble_c_eb = None¶
EventBoxfor the scribbling in the Content window, captures freehand drawing
- scribble_cache = None¶
A
Surfaceto hold drawn highlights
- scribble_clear = None¶
Buttonfor removing all drawn scribbles
- scribble_color = Gdk.RGBA(red=1.000000, green=1.000000, blue=1.000000, alpha=1.000000)¶
RGBAcurrent color of the scribbling tool
- scribble_color_selector = None¶
The
ColorButtonselecting the color of the pen
- scribble_color_toolbox = None¶
Boxcontaining the scribble color and width selectors
- scribble_drawing = False¶
Whether the current mouse movements are drawing strokes or should be ignored
- scribble_list = []¶
listof scribbles to be drawn, as tuples of colorRGBA, widthint, alistof points, and alistof pressure values.
- scribble_off_render = None¶
A
OffscreenWindowwhere we render the scribbling interface when it’s not shown
- scribble_overlay = None¶
HBoxthat replaces normal panes when scribbling is on, contains buttons and scribble drawing area.
- scribble_p_da = None¶
DrawingAreafor the scribbles in the Presenter window. Actually redraws the slide.
- scribble_p_eb = None¶
EventBoxfor the scribbling in the Presenter window, captures freehand drawing
- scribble_p_frame = None¶
AspectFramefor the slide in the Presenter’s highlight mode
- scribble_preset_buttons = []¶
The
listcontaining the radio buttonsModelButton
- scribble_redo = None¶
Buttonfor drawing the last removed scribble
- scribble_redo_list = []¶
listof undone scribbles to possibly redo
- scribble_toolbar = None¶
Boxcontaining the scribble buttons
- scribble_undo = None¶
Buttonfor removing the last drawn scribble
- scribble_width = 1¶
intcurrent stroke width of the scribbling tool
- scribble_width_selector = None¶
The
Scaleselecting the size of the pen
- scribbling_mode = False¶
Whether we are displaying the interface to scribble on screen and the overlays containing said scribbles
- set_mode(gaction, param)[source]¶
Change the mode of clearing and restoring highlights
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the new mode as a string wrapped in a GLib.Variant
- set_tools_orientation(gaction, target)[source]¶
Changes the orientation of the highlighting tool box.
- Parameters:
gaction (
Action) – the action triggering the calltarget (
Variant) – the new orientation to set, as a string wrapped in a GLib.Variant
- Returns:
whether the preset was loaded
- Return type:
bool
- start_zooming()¶
callback, to be connected to
start_zooming()
- stop_zooming()¶
callback, to be connected to
stop_zooming()
- switch_scribbling(gaction, target=None)[source]¶
Starts the mode where one can read on top of the screen.
Args:
- Returns:
whether the event was consumed
- Return type:
bool
- toggle_erase_modifiers = []¶
listthat contains the modifiers which, when held on scribble start, toggle the eraser
- toggle_erase_shortcuts = []¶
listthat contains the non-modifier shortcuts which, when held on scribble start, toggle the eraser
- toggle_erase_source = None¶
strorNonethat indicates whether a modifier + click or a held shortcut is toggling the eraser
- toggle_scribble(widget, event)[source]¶
Start/stop drawing scribbles.
- Parameters:
widget (
Widget) – the widget which has received the event.event (
Event) – the GTK event.
- Returns:
whether the event was consumed
- Return type:
bool
- tools_orientation = 'vertical'¶
strindicating the current layout of the highlight toolbar
- track_clicks()¶
callback, to be connected to
track_clicks()
- track_motions()¶
callback, to be connected to
track_motions()
- track_scribble(widget, event)[source]¶
Draw the scribble following the mouse’s moves.
- Parameters:
widget (
Widget) – the widget which has received the event.event (
Event) – the GTK event.
- Returns:
whether the event was consumed
- Return type:
bool
- try_cancel()[source]¶
Cancel scribbling, if it is enabled.
- Returns:
Trueif scribbling got cancelled,Falseif it was already disabled.- Return type:
bool
- update_active_color_width()[source]¶
Update modifications to the active scribble color and width, on the pen button and config object
- update_color(widget)[source]¶
Callback for the color chooser button, to set scribbling color.
- Parameters:
widget (
ColorButton) – the clicked button to trigger this event, if any
- update_width(widget, event, value)[source]¶
Callback for the width chooser slider, to set scribbling width.
- Parameters:
widget (
Scale) – The slider control used to select the scribble widthevent (
Event) – the GTK event triggering this update.value (
int) – the width of the scribbles to be drawn
- zoom_stop_button = None¶
Buttonthat is clicked to stop zooming, unsensitive when there is no zooming
pympress.pointer – Manage when and where to draw a software-emulated laser pointer on screen¶
- class pympress.pointer.Pointer(config, builder)[source]¶
Bases:
objectManage and draw the software “laser pointer” to point at the slide.
Displays a pointer of chosen color on the current slide (in both windows), either on all the time or only when clicking while ctrl pressed.
- Parameters:
- activate_pointermode(mode=None)[source]¶
Activate the pointer as given by mode.
Depending on the given mode, shows or hides the laser pointer and the normal mouse pointer.
- Parameters:
mode (
PointerMode) – The mode to activate
- c_da = None¶
DrawingAreaSlide in the Contents window, used to reliably set cursors.
- c_frame = None¶
AspectFrameFrame of the Contents window, used to reliably set cursors.
- change_pointercolor(action, target)[source]¶
Callback for a radio item selection as pointer mode (continuous, manual, none).
- Parameters:
action (
Action) – The action activatdtarget (
Variant) – The selected mode
- change_pointermode(action, target)[source]¶
Callback for a radio item selection as pointer mode (continuous, manual, none).
- Parameters:
action (
Action) – The action activatdtarget (
Variant) – The selected mode
- load_pointer(name)[source]¶
Perform the change of pointer using its color name.
- Parameters:
name (
str) – Name of the pointer to load
- old_pointer_mode = 2¶
The
PointerModeto which we toggle back
- p_da_cur = None¶
DrawingAreaSlide in the Presenter window, used to reliably set cursors.
- pointer = <GdkPixbuf.Pixbuf object at 0x7fa8a1ebf740 (GdkPixbuf at 0x3873ad0)>¶
Pixbufto read XML descriptions of GUIs and load them.
- pointer_mode = 1¶
PointerModeindicating the pointer mode
- pointer_pos = (0.5, 0.5)¶
(float, float)of position relative to slide, where the pointer should appear
- pointermode_radios = {}¶
a
dictof theRadioMenuItemselecting the pointer mode
- redraw_current_slide()¶
callback, to be connected to
redraw_current_slide()
- render_pointer(cairo_context, ww, wh)[source]¶
Draw the laser pointer on screen.
- Parameters:
cairo_context (
Context) – The canvas on which to render the pointerww (
int) – The widget widthwh (
int) – The widget height
- set_action_state = None¶
callback, to be connected to
set_action_state()
- show_pointer = False¶
boolindicating whether we should show the pointer
- toggle_pointer(widget, event)[source]¶
Track events defining when the laser is pointing.
- Parameters:
widget (
Widget) – the widget which has received the event.event (
Event) – the GTK event.
- Returns:
whether the event was consumed
- Return type:
bool
- track_enter_leave(widget, event)[source]¶
Switches laser off/on in continuous mode on leave/enter slides.
In continuous mode, the laser pointer is switched off when the mouse leaves the slide (otherwise the laser pointer “sticks” to the edge of the slide). It is switched on again when the mouse reenters the slide.
- Parameters:
widget (
Widget) – the widget which has received the event.event (
Event) – the GTK event.
- Returns:
whether the event was consumed
- Return type:
bool
- class pympress.pointer.PointerMode(value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
EnumPossible values for the pointer.
- CONTINUOUS = 2¶
Pointer switched on continuously
- DISABLED = 0¶
Pointer never switched on
- MANUAL = 1¶
Pointer switched on only manual
pympress.editable_label – A label that can be swapped out for an editable entry¶
- class pympress.editable_label.EditableLabel[source]¶
Bases:
objectA label that can switch between simply displaying a value, and allowing user input to edit this value.
- editing = False¶
booltracking whether we are currently editing the label.
- event_box = None¶
EventBoxaround the label, used to sense clicks
- on_keypress(widget, event)[source]¶
Manage key presses for the editable label. Needs to be reimplemented by children classes.
If we are editing the label, intercept some key presses (to validate or cancel editing or other specific behaviour), otherwise pass the key presses on to the button for normal behaviour.
- Parameters:
widget (
Widget) – the widget which has received the event.event (
Event) – the GTK event.name (
str) – the name of the key strokecommand (
str) – the name of the command in case this function is called by on_key_input
- Returns:
whether the event was consumed
- Return type:
bool
- on_label_event(widget_or_action, event=None)[source]¶
Manage events on the current slide label/entry.
This function triggers replacing the label with an entry when clicked or otherwise toggled.
- Parameters:
widget (
Widget) – the widget in which the event occurredevent (
Eventor None) – the event that occurred, None if tf we called from a menu item
- Returns:
whether the event was consumed
- Return type:
bool
- restore_label()[source]¶
Make sure that the editable label is not in entry mode.
If it is an entry, then replace it with the label.
- try_cancel()[source]¶
Cancel editing the label, if it is being edited.
- Returns:
Trueif editing got cancelled,Falseif the label was not being edited.- Return type:
bool
- class pympress.editable_label.EstimatedTalkTime(builder)[source]¶
Bases:
EditableLabelA label that displays the time elapsed since the start of the talk, that can be edited to select talk duration.
The duration of the talk will cause the label to blink and change colour as the elapsed time gets closer to the targeted talk duration.
- Parameters:
builder (builder.Builder) – The builder from which to load widgets.
- eb_ett = None¶
EventBoxassociated with the estimated talk time.
- entry_ett = None¶
Entryused to set the estimated talk time.
- est_time = 0¶
Estimated talk time,
intin seconds.
- label_ett = None¶
Estimated talk time
Labelfor the talk.
- label_time = None¶
Elapsed time
Label.
- restore_label(gaction=None, param=None)[source]¶
Make sure that the current page number is displayed in a label and not in an entry.
If it is an entry, then replace it with the label.
- set_time(gaction, param)[source]¶
Set the talk time.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – The time in seconds, as an int64 variant
- stop_editing_page_number()¶
callback, to be connected to
stop_editing()
- class pympress.editable_label.PageNumber(builder, page_num_scroll)[source]¶
Bases:
EditableLabelA label that displays “current page / max page”, that can be edited to select a page to which to go.
- Parameters:
builder (
Builder) – A builder from which to load widgets
- cancel(gaction=None, param=None)[source]¶
Make the UI re-display the pages from before editing the current page.
- eb_cur = None¶
EventBoxassociated with the slide counter label in the Presenter window.
- edit_label = None¶
Entryused to switch to another slide by typing its label.
- enable_labels(enable)[source]¶
Allow one to use or ignore labels.
- Parameters:
enable (
bool) – Whether to enable labels
- find_label()¶
callback, to be connected to
lookup_label()
- hb_cur = None¶
HBoxcontaining the slide counter label in the Presenter window.
- invert_scroll = True¶
boolwhether to scroll with the pages (True) or with the page numbers (False)
- label_after()¶
callback, to be connected to
label_before()
- label_before()¶
callback, to be connected to
label_after()
- label_cur = None¶
Slide counter
Labelfor the current slide.
- label_last = None¶
Slide counter
Labelfor the last slide.
- label_sep = None¶
Labelseparatingspin_curandedit_label
- max_page_number = 1¶
intholding the maximum page number in the document
- on_keypress(widget, event)[source]¶
Implement directions (left/right/home/end) keystrokes.
Otherwise pass on to
do_key_press_event().
- on_scroll(widget, event)[source]¶
Scroll event. Pass it on to the spin button if we’re currently editing the page number.
- Parameters:
widget (
Widget) – the widget which has received the event.event (
Event) – the GTK event.
- Returns:
whether the event was consumed
- Return type:
bool
- page_change()¶
callback, to be connected to
do_page_change()
- page_labels = True¶
boolholding whether we display or ignore page labels
- restore_label()[source]¶
Make sure that the current page number is displayed in a label and not in an entry.
If it is an entry, then replace it with the label.
- set_last(num_pages)[source]¶
Set the max number of pages, both on display and as the range of values for the spinner.
- Parameters:
num_pages (
int) – The maximum page number
- setup_doc_callbacks(doc)[source]¶
Callbacks that need to be setup again at every new document
- Parameters:
doc (
Document) – The new document that got loaded
- spin_cur = None¶
SpinButtonused to switch to another slide by typing its number.
pympress.talk_time – Manages the clock of elapsed talk time¶
- class pympress.talk_time.TimeCounter(builder, ett, timing_tracker, autoplay)[source]¶
Bases:
objectA double counter, that displays the time elapsed in the talk and a clock.
- Parameters:
builder (builder.Builder) – The builder from which to load widgets.
ett (
int) – the estimated time for the talk, in seconds.timing_tracker – (
TimingReport): to inform when the slides changeautoplay – (
AutoPlay): to adjust the timer display if we’re auto-playing/looping slides
- current_time()[source]¶
Returns the time elapsed in the presentation.
- Returns:
the time since the presentation started in seconds.
- Return type:
int
- elapsed_time = 0¶
Time elapsed since the beginning of the presentation,
intin seconds
- ett = None¶
EstimatedTalkTimethat handles changing the ett
- label_clock = None¶
Clock
Label
- label_colorer = None¶
TimeLabelColorerthat handles setting the colors oflabel_time
- label_time = None¶
Elapsed time
Label
- pause()[source]¶
Pause the timer if it is not paused, otherwise do nothing.
- Returns:
whether the clock’s pause was toggled.
- Return type:
bool
- pause_action = None¶
The pause-timer
Action
- paused = True¶
Timer paused status,
bool
- restart_time = 0¶
Time at which the counter was started,
intin seconds as returned bytime()
- switch_pause(gaction, param=None)[source]¶
Switch the timer between paused mode and running (normal) mode.
- Returns:
whether the clock’s pause was toggled.
- Return type:
bool
- timing_tracker = None¶
The
TimingReport, needs to know when the slides change
- class pympress.talk_time.TimeLabelColorer(label_time)[source]¶
Bases:
objectManage the colors of a label with a set of colors between which to fade, based on how much time remains.
Times are given in seconds (<0 has run out of time). In between timestamps the color will interpolated linearly, outside of the intervals the closest color will be used.
- Parameters:
label_time (
Gtk.Label) – the label where the talk time is displayed
- color_map = []¶
listof tuples (int,RGBA), which are the desired colors at the corresponding timestamps. Sorted on the timestamps.
- color_override = None¶
CssProvideraffecting the style context of the labels
- label_color_default = None¶
RGBAThe default color of the info labels
- label_time = None¶
The
Gtk.Labelwhose colors need updating
- load_color_from_css(style_context, class_name=None)[source]¶
Add class class_name to the time label and return its color.
- Parameters:
label_time (
Gtk.Label) – the label where the talk time is displayedstyle_context (
StyleContext) – the CSS context managing the color of the labelclass_name (
strorNone) – The name of the class, if any
- Returns:
The color of the label with class “class_name”
- Return type:
RGBA
pympress.config – Configuration¶
- class pympress.config.Config[source]¶
Bases:
ConfigParser,objectManage configuration :Get the configuration from its file and store its back.
- getboolean(*args, **kwargs)[source]¶
Wrapper for configparser’s getboolean to handle parsing errors when a fallback is given.
getboolean()
- getfloat(*args, **kwargs)[source]¶
Wrapper for configparser’s to handle parsing errors when a fallback is given.
See
getfloat()
- getint(*args, **kwargs)[source]¶
Wrapper for configparser’s getint to handle parsing errors when a fallback is given.
See
getint()
- getlist(*args)[source]¶
Parse a config value and return the list by splitting the value on commas.
i.e. bar = foo,qux returns the list [‘foo’, ‘qux’]
- Returns:
a config value split into a list.
- Return type:
list
- layout = {}¶
dict-tree of presenter layouts for various modes
- load_window_layouts()[source]¶
Parse and validate layouts loaded from config, with fallbacks if needed.
- static path_to_config(search_legacy_locations=False)[source]¶
Return the path to the currently used configuration file.
- Parameters:
search_legacy_locations (
bool) – whether to look in previously used locations- Returns:
The path to the config file to use
- Return type:
Path
- placeable_widgets = {'annotations': 'p_frame_annot', 'current': 'p_frame_cur', 'highlight': 'scribble_overlay', 'next': 'grid_next', 'notes': 'p_frame_notes'}¶
dictof strings that are the valid representations of widgets from the presenter window that can be dynamically rearranged, mapping to their names
- register_actions(builder)[source]¶
Register actions that impact the config file only.
- Parameters:
builder (
pympress.builder.Builder) – a builder to setup the actions
- shortcuts = {}¶
dictmapping accelerator keys to actions
- static_layout = {'deck-overview': 'deck'}¶
dict-tree of presenter layouts that are not configurable
- static toggle_portable_config(gaction, param=None)[source]¶
Create or remove a configuration file for portable installs.
The portable install file will be used by default, and deleting it causes the config to fall back to the user profile location.
No need to populate the new config file, this will be done on pympress exit.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- toggle_start(gaction, param=None)[source]¶
Generic function to toggle some boolean startup configuration.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- update_layout_from_widgets(layout_name, widget, pane_handle_pos)[source]¶
Setter for the notes layout.
- Parameters:
layout_name (
str) – the name of the layout to updatewidget (
Widget) – the widget that will contain the layout.pane_handle_pos (
dict) – Map ofPanedto the relative handle position (float in 0..1)
- update_layout_tree(layout_name, layout)[source]¶
Update the layout named
layout_name. Throws ValueError on invalid layouts.- Parameters:
layout_name (
str) – the name of the layout to updatelayout (
dict) – the hierarchy of dictionaries, lists, and strings representing the layout
- static using_portable_config()[source]¶
Checks which configuration file location is in use.
- Returns:
Trueiff we are using the portable (i.e. in install dir) location- Return type:
bool
- validate_layout(layout, expected_widgets, optional_widgets={})[source]¶
Validate layout: check whether the layout of widgets built from the config string is valid.
- Parameters:
layout (
dict) – the json-parsed config stringexpected_widgets (
set) – strings with the names of widgets that have to be used in this layoutoptional_widgets (
set) – strings with the names of widgets that may or may not be used in this layout
Layout must have all self.placeable_widgets (leaves of the tree, as
str) and only allowed properties on the nodes of the tree (asdict).Constraints on the only allowed properties of the nodes are: - resizeable:
bool(optional, defaults to no), - orientation:str, either “vertical” or “horizontal” (mandatory) - children:listof size >= 2, containingstr`s or `dict`s (mandatory) - proportions: `listoffloatwith sum = 1, length == len(children), representing the relative sizes of all the resizeable items (if and only if resizeable).
- widget_layout_to_tree(widget, pane_handle_pos)[source]¶
Build a tree representing a widget hierarchy, leaves are strings and nodes are
dict.Recursive function. See validate_layout() for more info on the tree structure.
- Parameters:
widget (
Widget) – the widget where to startpane_handle_pos (
dict) – Map ofPanedto the relative handle position (float in 0..1)
- Returns:
A tree of dicts reprensenting the widget hierarchy
- Return type:
dict
- widget_reqs = {'highlight': ({'highlight'}, {'annotations', 'current', 'next', 'notes'}), 'highlight_notes': ({'highlight'}, {'annotations', 'current', 'next', 'notes'}), 'note_pages': ({'annotations', 'next', 'notes'},), 'notes': ({'current', 'next', 'notes'}, {'annotations'}), 'plain': ({'annotations', 'current', 'next'},)}¶
dictmapping layout ids to tuples of their expected and optional widgets
pympress.extras – Manages the display of fancy extras such as annotations, videos and cursors¶
- class pympress.dialog.AutoPlay(parent)[source]¶
Bases:
BuilderWidget and machinery to setup and play slides automatically, optionally in a loop
- autoplay_button_loop = None¶
The
CheckButtonto loop
- autoplay_dialog = None¶
A
Dialogto contain the layout edition dialog
- autoplay_spin_lower = None¶
The
SpinButtonfor the lower page
- autoplay_spin_time = None¶
The
SpinButtonfor the transition between slides
- autoplay_spin_upper = None¶
The
SpinButtonfor the upper page
- get_page_range()[source]¶
Return the autoplay info
- Returns:
(first page, stop page, looping, delay i ms)
- Return type:
tuple
- goto_page()¶
callback, to be connected to
goto_page()
- next_page(it)[source]¶
Callback to turn the page to the next slide
- Parameters:
it (
iterator) – An iterator that contains the next pages to load. Stop when there are no more pages.- Returns:
Trueif he callback needs to be called again, otherwiseFalse- Return type:
bool
- page_changed(spin_button, scroll_direction)[source]¶
Callback for when a page spin button is modified, maintains a delta of at least 2 pages between first and last page of the intended loop. (No loops needed to loop a single slide.)
- Parameters:
spin_button (
SpinButton) – The button whose value was changedscroll_direction (
ScrollType) – The speed and amount of change
- remain = None¶
if the timeout has been paused,
intwhich represents the number of milliseconds until the next page slide
- run(gaction, param=None)[source]¶
Show the dialog to setup auto-play, and start the autoplay if « apply » is selected
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- set_doc_pages(n_pages)[source]¶
Callback for when a document number of pages changes
- Parameters:
n_pages (
int) – the number of pages of the loaded document
- source = None¶
Sourcewhich is the source id of the periodic slide transition, orNoneif there is no autoplay
- class pympress.dialog.LayoutEditor(parent, config)[source]¶
Bases:
BuilderWidget tracking and displaying hierachically how much time was spent in each page/section of the presentation.
- current_layout = 'plain'¶
strcontaining the layout currently edited
- get_info(path)[source]¶
Given a path string, look up the appropriate item in both the actual and GtkStore models
- Parameters:
path (
str) – A string representing a path in the treemodel- Returns:
the node and iterator representing the position in the layout and model
- Return type:
dict,TreeIter
- hltools_orientation_action = None¶
Actioncontaining the orientation
- layout_description = None¶
A
Labelto contain the description of the layout
- layout_descriptions = {'highlight': 'Layout to draw on the current slide', 'highlight_notes': 'Layout to draw on the current slide with notes displayed', 'note_pages': 'Layout for libreoffice notes on separate pages (with current slide preview in notes)', 'notes': 'Layout for beamer notes on second screen (no current slide preview in notes)', 'plain': 'Plain layout, without note slides'}¶
- layout_dialog = None¶
A
Dialogto contain the layout edition dialog
- layout_selected(widget, event=None)[source]¶
Manage events for the layout selector drop-down menu
- Parameters:
widget (
ComboBox) – the widget which has been modifiedevent (
Event) – the GTK event
- layout_selector = None¶
A
ComboBoxTextto select the layout to edit
- layout_treemodel = None¶
The
TreeModelcontaining the model of the layouts to view in the treeview
- layout_treeview = None¶
The
TreeViewdisplaying the hierarchical layouts
- load_layout()[source]¶
Load the given layout in the treemodel for display and manipulation in the treeview
- next_frames_action = None¶
Actioncontaining the number of next frames
- next_slide_count_edited(widget, path, value)[source]¶
Handle when the next slide count is modified
- Parameters:
widget (
ComboBox) – the widget which has been modifiedpath (
str) – A string representing the path to the modfied itemvalue (
int) – the new number of next slides
- normalize_layout(widget=None, drag_context=None, reload=True)[source]¶
Handler at the end of a drag-and-drop in the treeview
Here we transform the listmodel modified by drag-and-drop back to a valid
dictandstrhierarchy, and then trigger the loading of the layout again to display the corrected layout.- Parameters:
widget (
Widget) – The object which received the signaldrag_context (
DragContext) – the drag contextreload (
bool) – whether to reload the layout into the treemodel
- orientation_changed(widget, path, orient_it)[source]¶
Handle when the orientation of a box is changed
- Parameters:
widget (
ComboBox) – the widget which has been modifiedpath (
str) – A string representing the path to the modfied itemorient_it (
TreeIter) – the row of the newly selected value in the orientations liststore model
- orientations_model = None¶
The
ListModelcontaining the possible orientations
- resizeable_toggled(widget, path)[source]¶
Handle when box’ resizeable value is toggled
- Parameters:
widget (
ComboBox) – the widget which has been modifiedpath (
str) – A string representing the path to the modfied item
- set_current_layout(layout)[source]¶
Update which is the layout currently used by the UI
- Parameters:
layout (
str) – the layout id
- show_editor(gaction, param=None)[source]¶
Show the popup to edit the layout. Gather info to populate it, and handle apply/cancel at the end.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- treemodel_to_tree(iterator, parent_horizontal=False, parent_resizeable=False)[source]¶
Recursive function to transform the treemodel back into our dict-based representation of the layout
- Parameters:
iterator (
TreeIter) – the position in the treemodelparent_horizontal (
bool) – whether the parent node is horizontalparent_resieable (
bool) – whether the parent node is resizeable
- Returns:
the list of
dictorstrrepresenting the widgets at this level- Return type:
list
- ui_load_layout()¶
callback, to be connected to
load_layout()
- class pympress.dialog.TimingReport(parent)[source]¶
Bases:
BuilderWidget tracking and displaying hierachically how much time was spent in each page/section of the presentation.
- clear_on_next_transition = False¶
boolmarking whether next page transition should reset the history of page timings
- doc_structure = {}¶
A
dictcontaining the structure of the current document
- document_open = False¶
booltracking whether a document is opened
- end_time = -1¶
intthe time at which the clock was reset
- static format_time(secs)[source]¶
Formats a number of seconds as
minutes:seconds.- Returns:
The formatted time, with 2+ digits for minutes and 2 digits for seconds.
- Return type:
str
- page_labels = []¶
A
listwith the page label of each page of the current document
- page_time = []¶
listof time at which each page was reached
- reset(reset_time)[source]¶
A timer reset. Clear the history as soon as we start changing pages again.
- set_document_metadata(doc_structure, page_labels)[source]¶
Show the popup with the timing infortmation.
- Parameters:
doc_structure (
dict) – the structure of the documentpage_labels (
list) – the page labels for each of the pages
- show_report(gaction, param=None)[source]¶
Show the popup with the timing infortmation.
- Parameters:
gaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- time_report_dialog = None¶
A
Dialogto contain the timing to show
- timing_treeview = None¶
The
TreeViewcontaining the timing data to display in the dialog
pympress.extras – Manages the display of fancy extras such as annotations, videos and cursors¶
- class pympress.extras.Annotations(builder)[source]¶
Bases:
objectWidget displaying a PDF’s text annotations.
- add_annotation(gaction, param=None)[source]¶
Add an annotation to the the page’s annotation list
- Parameters:
gaction (
Action) – the action triggering the call, which identifies which backendparam (
Variant) – an optional parameter
- annotation_column = None¶
The
TreeViewColumnwhere the text is rendered
- annotation_renderer = None¶
The
CellRendererTextdefining how text is rendered
- annotations_liststore = None¶
The containing
ListStorestoring the annotations to be displayed
- annotations_treeview = None¶
The containing
TreeViewwidget for the annotations
- editing = None¶
The
Entryin which we are currently editing an annotation, or None
- editing_finished(cell_renderer)[source]¶
Handle the end of editing
- Parameters:
cell_renderer (
CellRenderer) – The renderer which received the signal
- editing_started(cell_renderer, widget, entry_number)[source]¶
Handle edit start
- Parameters:
cell_renderer (
CellRenderer) – The renderer which received the signalwidget (
CellEditable) – the Gtk entry editing the annotation entryentry_number (
str) – the string representation of the path identifying the edited cell
- editing_validated(cell_renderer, entry_number, new_content)[source]¶
Handle successful edit: store the new cell value in the model and the document
- Parameters:
cell_renderer (
CellRenderer) – The renderer which received the signalentry_number (
str) – the string representation of the path identifying the edited cellnew_content (
str) – the new value of the edited cell
- key_event(widget, event)[source]¶
Handle a key (press/release) event.
Needed to forward events directly to the
Entry, bypassing the global action accelerators.- Parameters:
widget (
Widget) – the widget which has received the event.event (
Event) – the GTK event.
- Returns:
whether the event was consumed
- Return type:
bool
- load_annotations(annot_page)[source]¶
Add annotations to be displayed (typically on going to a new slide).
- Parameters:
annot_page (
Page) – The page object that contains the annotations
- new_doc_annotation()¶
- remove_annotation(gaction, param=None)[source]¶
Remove an annotation to the from the page’s annotation list
- Parameters:
gaction (
Action) – the action triggering the call, which identifies which backendparam (
Variant) – an optional parameter
- remove_doc_annotation()¶
- rewrap_annotations()[source]¶
Update the wrap-width of the annotation column to fit its actual width
- set_doc_annotation()¶
- class pympress.extras.Cursor[source]¶
Bases:
objectClass managing cursors statically for displays, so we can select the mouse cursor with a simple string.
- class pympress.extras.FileWatcher[source]¶
Bases:
objectA class that wraps watchdog objects, to trigger callbacks when a file changes.
- callback()¶
Callback to be called on file changes, usually connected to
reload_document()
- monitor = None¶
A
FileSystemEventHandlerto get notified when the file changes
- observer = None¶
A
Observerto watch when the file changes
- path = None¶
The
Pathto the file being watched
- timeout = 0¶
- watch_file(uri, callback, *args, **kwargs)[source]¶
Watches a new file with a new callback. Removes any precedent watched files.
If the optional watchdog dependency is missing, does nothing.
- Parameters:
uri (
str) – URI of the file to watchcallback (
function) – callback to call with all the further arguments when the file changes
- class pympress.extras.Media(builder, conf)[source]¶
Bases:
objectClass managing statically the medias and media player backends, to enable play/pause callbacks.
- Parameters:
- adjust_margins_for_mode(page_type)[source]¶
Adjust the relative margins of child widgets for notes mode update.
- Parameters:
page_type (
PdfPage) – The part of the page to display
- c_overlay = None¶
Overlayfor the Content window.
- hide(media_id, gaction=None, param=None)[source]¶
Stops playing a media and hides the player. Used as a callback.
- Parameters:
media_id (
int) – A unique identifier of the media to start playinggaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- p_overlay = None¶
Overlayfor the Presenter window.
- play(media_id, gaction=None, param=None)[source]¶
Starts playing a media. Used as a callback.
- Parameters:
media_id (
int) – A unique identifier of the media to start playinggaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- play_pause(media_id, gaction=None, param=None)[source]¶
Toggles playing and pausing a media. Used as a callback.
- Parameters:
media_id (
int) – A unique idientifier of the media to start playinggaction (
Action) – the action triggering the callparam (
Variant) – the parameter as a variant, or None
- replace_media_overlays(current_page, page_type)[source]¶
Remove current media overlays, add new ones if page contains media.
- set_time(media_id, gaction=None, param=None)[source]¶
Set the player of a given media at time t. Used as a callback.
- Parameters:
media_id (
int) – A unique idientifier of the media to start playinggaction (
Action) – the action triggering the callparam (
Variant) – A wrapped float containing the time to which we have to go.
- toggle(gaction, param=None)[source]¶
Toggle a backend (if it was loaded correctly)
- Parameters:
gaction (
Action) – the action triggering the call, which identifies which backendparam (
Variant) – an optional parameter
- types_list = {}¶
dictcontaining backends and their mappings to mime type lists for which they are enabled. A default backend is marked by an empty list.
- class pympress.extras.Zoom(builder)[source]¶
Bases:
objectManage the zoom level (using a cairo matrix), draw area that will be zoomed while it is being selected.
- Parameters:
builder (
Builder) – A builder from which to load widgets
- clear_cache()¶
callback, to be connected to
clear_cache()
- draw_zoom_target(widget, cairo_context)[source]¶
Perform the drawings by user.
- Parameters:
widget (
DrawingArea) – The widget where to draw the scribbles.cairo_context (
Context) – The canvas on which to render the drawings
- get_matrix(ww, wh)[source]¶
Returns the
Matrixused to perform the zoom for the widget of size ww x wh.- Parameters:
ww (
float) – widget widthwh (
float) – widget height
- Returns:
the zoom transformation matrix
- Return type:
Matrix
- get_slide_point(widget, event)[source]¶
Gets the point on the slide on a scale (0..1, 0..1), from its position in the widget.
- p_central = None¶
Boxin the Presenter window, used to reliably set cursors.
- redraw_current_slide()¶
callback, to be connected to
redraw_current_slide()
- scale = 1.0¶
- set_action_enabled = None¶
callback, to be connected to
set_action_enabled()
- shift = (0, 0)¶
- start_zooming(*args)[source]¶
Setup for the user to select the zooming area.
- Returns:
whether the event was consumed
- Return type:
bool
- stop_zooming(*args)[source]¶
Cancel the zooming, reset the zoom level to full page.
- Returns:
whether the event was consumed
- Return type:
bool
- toggle_zoom_target(widget, event)[source]¶
Start/stop drawing the zoom’s target rectangle.
- Parameters:
widget (
Widget) – the widget which has received the event.event (
Event) – the GTK event.
- Returns:
whether the event was consumed
- Return type:
bool
- track_zoom_target(widget, event)[source]¶
Draw the zoom’s target rectangle.
- Parameters:
widget (
Widget) – the widget which has received the event.event (
Event) – the GTK event.
- Returns:
whether the event was consumed
- Return type:
bool
- try_cancel()[source]¶
Cancel the zoom selection, if it was enabled.
- Returns:
Trueif the zoom was cancelled,Falseif a zoom selection was not in progress.- Return type:
bool
- zoom_points = None¶
- zoom_selecting = False¶
Whether we are displaying the interface to scribble on screen and the overlays containing said scribbles
pympress.deck – Manage user drawings on the current slide¶
- class pympress.deck.Overview(config, builder, notes_mode)[source]¶
Bases:
BuilderUI that allows to draw free-hand on top of the current slide.
- Parameters:
- all_pages = False¶
boolwhether we show all pages or remove consecutive identically labeled pages, keeping only the last
- c_da = None¶
The
DrawingAreain the content window
- cache = None¶
SurfaceCacheinstance.
- compute_frame_grid()¶
callback, to be connected to
compute_frame_grid()
- deck0 = None¶
The
DrawingAreafor the first slide
- deck_grid = None¶
Gridthat displays all the slides of the overview
- deck_mode = False¶
Whether we are displaying the deck overview on screen
- deck_off_render = None¶
A
OffscreenWindowwhere we render the deck interface when it’s not shown
- deck_viewport = None¶
Viewportthat replaces normal panes when deck is shown
- disable_deck_overview()[source]¶
Disable the deck view.
- Returns:
whether it was possible to disable (thus if it was not disabled already)
- Return type:
bool
- enable_deck_overview()[source]¶
Enable the deck view.
- Returns:
whether it was possible to enable (thus if it was not enabled already)
- Return type:
bool
- goto_page()¶
callback, to be connected to
goto_page()
- grid_size = (0, 0)¶
tupleof rows/columns in the grid
- load_layout()¶
callback, to be connected to
load_layout()
- max_row_size = 6¶
intHow large (at most) to make rows
- on_deck_click(widget, event)[source]¶
A slide has been clicked, go to it
- Parameters:
widget (
Widget) – the widget which has received the key strokeevent (
Event) – the GTK event, which contains the key stroke details
- on_deck_draw(widget, cairo_context)[source]¶
Actually draw the deck slide – only do this from cache, to limit overhead
- Parameters:
widget (
Widget) – the widget to updatecairo_context (
Context) – the Cairo context (orNoneif called directly)
- p_central = None¶
Boxin the Presenter window, where we insert deck.
- prerender(da)[source]¶
Perform in-cache rendering
- Parameters:
da (
DrawingArea) – the widget for which we’re rendering
- resize_cache()¶
callback, to be connected to
resize_widget()
- setup_doc_callbacks(doc)[source]¶
Callbacks that need to be setup again at every new document
- Parameters:
doc (
Document) – The new document that got loaded
pympress.util – various utility functions¶
- class pympress.util.Monitor(obj, id_=None, num=None)[source]¶
Bases:
ScreenAreaA specialised
ScreenArearepresenting a monitor, with an descriptive string and a monitor number- static lookup_monitors(display, *windows)[source]¶
Get the info on the monitors
- Parameters:
display (
Display) – the current screen*windows (
tupleofWindow) – windows for which to look up the monitor position
- Returns:
The monitors for each window, followed by the best monitors for presenter and content
- Return type:
tupleofMonitor
- monitor_number = -1¶
An
intthat identifies the monitor inDisplay
- name = ''¶
A
strto represent a user-friendly name for the monitor
- exception pympress.util.NoMonitorPositions[source]¶
Bases:
ExceptionThe Exception we raise when there is no way of figuring out the monitor position of windows
- class pympress.util.ScreenArea(obj)[source]¶
Bases:
objectConvenience class to represent monitors or windows in terms of the area (position and size) they use on screen
This is similar to
Monitor, but necessary as we want to handle “mirrored” monitors as if they were a single monitor, and only use “extended” monitors as target for content window position and/or fullscreening.- contains(other)[source]¶
Check whether this area contains
other- Parameters:
other (
ScreenArea) – The screen area to compare with- Returns:
Trueiff the area is contained- Return type:
bool
- equal(other)[source]¶
Check whether 2 areas cover the exact same space
- Parameters:
other (
ScreenArea) – The screen area to compare with- Returns:
Trueiff the areas are identical- Return type:
bool
- intersection(other)[source]¶
Compute the intersection of 2 screen areas
- Parameters:
other (
ScreenArea) – The screen area to compare with- Returns:
An area representing the intersection, or
Noneif there is no intersection- Return type:
ScreenAreaorNone
- intersects(other)[source]¶
Check whether this area intersects
other- Parameters:
other (
ScreenArea) – The screen area to compare with- Returns:
Trueiff the areas have an intersection- Return type:
bool
- least_intersection(candidates)[source]¶
Find the rectangle that intersects least with
rectincandidates- Parameters:
candidates (iterable of `ScreenArea`s) – The monitor areas to check for intersection
- Returns:
The best candidate screen area, i.e. that has the smallest intersection
- Return type:
- pympress.util.close_opened_resources()[source]¶
Close all importlib context managers for resources that we needed over the program lifetime.
- pympress.util.fileopen(f)[source]¶
Call the right function to open files, based on the platform.
- Parameters:
f (path-like) – path to the file to open
- pympress.util.get_default_config()[source]¶
Returns the path to the configuration file containing the defaults.
- Returns:
The path to the portable configuration file.
- Return type:
Path
- pympress.util.get_icon_path(name)[source]¶
Get the path for an image from pympress’ resources
- Parameters:
name (
str) – The name of the icon to load- Returns:
The path to the icon to load
- Return type:
str
- pympress.util.get_log_path()[source]¶
Returns the appropriate path to the log file in the user app dirs.
- Returns:
path to the log file.
- Return type:
Path
- pympress.util.get_portable_config()[source]¶
Returns the path to the configuration file for a portable install (i.e. in the install root).
May return None if the install root is not a real directory (e.g. in a zip file).
- Returns:
The path to the portable configuration file.
- Return type:
PathorNone
- pympress.util.get_pympress_meta()[source]¶
Get metadata (version, etc) from pympress’ __init__.py or git describe.
- Returns:
metadata properties (version, contributors) mapped to their values
- Return type:
dict
- pympress.util.get_translation(domain)[source]¶
Returns a gettext translation object.
This re-implements gettext’s translation() and find() to allow using a python 3.9 Traversable as localedir
- Returns:
A gettext translation object with the strings for the domain loaded
- Return type:
NullTranslations
- pympress.util.get_ui_resource_file(name, ext='.glade')[source]¶
Load an UI definition file from pympress’ resources
- Parameters:
name (
str) – The name of the UI to loadext (
str) – The extension of the file
- Returns:
The full path to the glade file
- Return type:
str
- pympress.util.get_user_config()[source]¶
Returns the path to the configuration file in the user config directory
- Returns:
path to the user configuration file.
- Return type:
Path
- pympress.util.hard_set_screensaver(disabled)[source]¶
Enable or disable the screensaver.
- Parameters:
disabled (
bool) – ifTrue, indicates that the screensaver must be disabled; otherwise it will be enabled
- pympress.util.introspect_flag_value(flags_class, nick, fallback)[source]¶
Get the value of a flag from its class, given a value’s name (or nick)
Introspection technique (in particular __flags_values__ dict) inspired from pygtkcompat. This is needed because there is no typelib for libgstplayback.
- Parameters:
flags_class (a
typeinheriting fromGFlags) – the flags class to introspectnick (
str) – a name or nick of the flag value that should be returnedfallback (
int) – the documented flag value, if lookup fails
- pympress.util.list_icons()[source]¶
List the icons from pympress’ resources.
- Returns:
The paths to the icons in the pixmaps directory
- Return type:
listofstr
- pympress.util.load_style_provider(style_provider)[source]¶
Load the css and in a style provider
- Parameters:
style_provider (
CssProvider) – The style provider in which to load CSS- Returns:
The style provider with CSS loaded
- Return type:
CssProvider
- pympress.util.make_windows_dpi_aware()[source]¶
Set to avoid blurriness issues on High-DPI resolutions with scaling.
pympress.media_overlays.base – base widget to play videos with an unspecified backend¶
- class pympress.media_overlays.base.VideoOverlay(container, page_type, action_map, media)[source]¶
Bases:
BuilderSimple Video widget.
All do_X() functions are meant to be called from the main thread, through e.g.
idle_add(), for thread-safety in the handling of video backends.- Parameters:
container (
Overlay) – The container with the slide, at the top of which we add the movie areapage_type (
PdfPage) – the part of the page to displayaction_map (
ActionMap) – the action map that contains the actions for this mediamedia (
Media) – the object defining the properties of the video such as position etc.
- action_map = None¶
ActionMapcontaining the actios for this video overlay
- autoplay = False¶
boolthat tracks whether we should play automatically
- do_hide(*args)[source]¶
Remove widget from overlays. Needs to be called via
idle_add().- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- do_play()[source]¶
Start playing the media file.
Should run on the main thread to ensure we avoid reentrency problems.
- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- do_play_pause()[source]¶
Toggle pause mode of the media.
Should run on the main thread to ensure we avoid reentrency problems.
- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- do_set_time(t)[source]¶
Set the player at time t.
Should run on the main thread to ensure we avoid vlc plugins’ reentrency problems.
- Parameters:
t (
float) – the timestamp, in s- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- dragging_paused = False¶
boolthat tracks whether the playback was paused when the user started dragging the position
- dragging_position = False¶
boolthat tracks whether the user is dragging the position
- end_pos = None¶
floatgiving the end position for playback, if any
- format_millis(sc, prog)[source]¶
Callback to format the current timestamp (in milliseconds) as minutes:seconds.
- Parameters:
sc (
Scale) – The scale whose position we are formattingprog (
float) – The position of theScale, i.e. the number of seconds elapsed
- handle_embed(mapped_widget)[source]¶
Handler to embed the video player in the window, connected to the
mapsignal.
- is_playing()[source]¶
Returns whether the media is currently playing (and not paused).
- Returns:
Trueiff the media is playing.- Return type:
bool
- is_shown()[source]¶
Returns whether the media overlay is currently added to the overlays, or hidden.
- Returns:
Trueiff the overlay is currently displayed.- Return type:
bool
- last_timestamp = 0.0¶
floatrepresenting the last know timestamp at which the progress bar updated
- maxval = 1¶
floatholding the max time in s
- media_overlay = None¶
VBoxthat contains all the elements to be overlayed.
- media_type = ''¶
strrepresenting the mime type of the media file
- movie_zone = None¶
DrawingAreawhere the media is rendered.
- parent = None¶
Overlaythat is the parent of the VideoOverlay widget.
- progress = None¶
Scalethat is the progress bar in the controls toolbar - if we have one.
- progress_moved(rng, sc, val)[source]¶
Callback to update the position of the video when the user moved the progress bar.
- Parameters:
rng (
Range) – The range corresponding to the scale whose position we are formattingsc (
Scale) – The scale whose position we are updatingval (
float) – The position of theScale, which is the number of seconds elapsed in the video
- relative_margins = None¶
tuplecontaining the left/top/right/bottom space around the drawing area in the visible slide
- relative_page_margins = None¶
tuplecontaining the left/top/right/bottom space around the drawing area in the PDF page
- repeat = False¶
boolthat tracks whether we should play after we finished playing
- start_pos = 0.0¶
floatgiving the initial starting position for playback
- time_format = '{:01}:{:02}'¶
ss / m:ss when the max time is known
- Type:
Format of the video time, defaults to m
- Type:
ss, changed to m
- update_margins_for_page(page_type)[source]¶
Recalculate the margins around the media in the event of a page type change.
- Parameters:
page_type (
PdfPage) – the part of the page to display
pympress.media_overlays.gif – widget to play gif images as videos¶
- class pympress.media_overlays.gif_backend.GifOverlay(*args, **kwargs)[source]¶
Bases:
VideoOverlayA simple overlay mimicking the functionality of showing videos, but showing gifs instead.
- advance_gif()[source]¶
Advance the gif, queue redrawing if the frame changed, and schedule the next frame.
- anim = None¶
A
PixbufAnimationcontaining all the frames and their timing for the displayed gif
- base_size = None¶
A
tupleof (int,int) indicating the size of the bounding box of the gif
- do_play()[source]¶
Start playing the media file.
Should run on the main thread to ensure we avoid reentrency problems.
- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- do_play_pause()[source]¶
Toggle pause mode of the media.
Should run on the main thread to ensure we avoid reentrency problems.
- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- do_set_time(t)[source]¶
Set the player at time t.
Should run on the main thread to ensure we avoid reentrency problems.
- Parameters:
t (
int) – the timestamp, in ms- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- draw(widget, ctx)[source]¶
Simple resized drawing: get the pixbuf, set the transform, draw the image.
- is_playing()[source]¶
Returns whether the media is currently playing (and not paused).
- Returns:
Trueiff the media is playing.- Return type:
bool
- transform = None¶
The
Matrixdefining the zoom & shift to scale the gif
pympress.media_overlays.gst – widget to play videos using Gstreamer’s Gst¶
- class pympress.media_overlays.gst_backend.GstOverlay(*args, **kwargs)[source]¶
Bases:
VideoOverlaySimple Gstramer widget.
Wraps a simple gstreamer playbin.
- do_play()[source]¶
Start playing the media file.
- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- do_play_pause()[source]¶
Toggle pause mode of the media.
Should run on the main thread to ensure we avoid reentrency problems.
- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- do_set_time(time)[source]¶
Set the player at time
time.Should run on the main thread to ensure we avoid reentrency problems.
- Parameters:
time (
float) – the timestamp, in s- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- do_update_duration(*args)[source]¶
Transmit the change of file duration to the UI to adjust the scroll bar.
- do_update_time()[source]¶
Update the current position in the progress bar.
- Returns:
Trueiff this function should be run again (timeout_add()convention)- Return type:
bool
- is_playing()[source]¶
Returns whether the media is currently playing (and not paused).
- Returns:
Trueiff the media is playing.- Return type:
bool
- mute(value)[source]¶
Mutes or unmutes the player.
- Parameters:
value (
bool) –Trueiff this player should be muted
- on_state_changed(bus, msg)[source]¶
Callback triggered by playbin state changes.
- Parameters:
bus (
Bus) – the bus that we are connected tomsg (
Message) – the “state-changed” message
- playbin = None¶
A
Playbinto be play videos
- classmethod setup_backend(gst_opts=[])[source]¶
Prepare/check the Gst backend.
- Returns:
the version of Gst used by the backend
- Return type:
str
- sink = None¶
A
Sinkto display video content
- update_freq = 200¶
intnumber of milliseconds between updates
pympress.media_overlays.vlc – widget to play videos using VLC¶
- class pympress.media_overlays.vlc_backend.VlcOverlay(*args, **kwargs)[source]¶
Bases:
VideoOverlaySimple VLC widget.
Its player can be controlled through the ‘player’ attribute, which is a
MediaPlayerinstance.- do_play()[source]¶
Start playing the media file.
Should run on the main thread to ensure we avoid vlc plugins’ reentrency problems.
- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- do_play_pause()[source]¶
Toggle pause mode of the media.
Should run on the main thread to ensure we avoid vlc plugins’ reentrency problems.
- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- do_set_time(time)[source]¶
Set the player at time
time.Should run on the main thread to ensure we avoid vlc plugins’ reentrency problems.
- Parameters:
time (
float) – the timestamp, in s- Returns:
Trueiff this function should be run again (idle_add()convention)- Return type:
bool
- handle_embed(mapped_widget)[source]¶
Handler to embed the VLC player in the window, connected to the
mapsignal.
- handle_end()[source]¶
End of the stream reached: restart if looping, otherwise hide overlay
Overrided because, to implement looping, vlc plugin needs to be told to start on stream end, not to seek
- is_playing()[source]¶
Returns whether the media is currently playing (and not paused).
- Returns:
Trueiff the media is playing.- Return type:
bool
- mute(value)[source]¶
Mutes the player.
- Parameters:
value (
bool) –Trueiff this player should be muted
- paint_backdrop(widget, context)[source]¶
Draw behind/around the video, aka the black bars
- Parameters:
widget (
Widget) – the widget to updatecontext (
Context) – the Cairo context (orNoneif called directly)
- classmethod setup_backend(vlc_opts=['--no-video-title-show'])[source]¶
Prepare/check the VLC backend.
- Parameters:
vlc_opts (
list) – the arguments for starting vlc- Returns:
the version of VLC used by the backend
- Return type:
str
- pympress.media_overlays.vlc_backend.get_window_handle(window)[source]¶
Uses ctypes to call gdk_win32_window_get_handle which is not available in python gobject introspection porting.
Solution from http://stackoverflow.com/a/27236258/1387346
- Parameters:
window (
Window) – The window for which we want to get the handle- Returns:
The handle to the win32 window