406 lines
14 KiB
Cython
406 lines
14 KiB
Cython
# Copyright (C) 2007-2013 various contributors (see AUTHORS)
|
|
#
|
|
# This file is part of Python-EFL.
|
|
#
|
|
# Python-EFL is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
#
|
|
# Python-EFL is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public License
|
|
# along with this Python-EFL. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
"""
|
|
|
|
.. rubric:: Widget description
|
|
|
|
.. image:: /images/fileselector-entry-preview.png
|
|
|
|
|
|
This is an entry made to be filled with or display a file
|
|
system path string.
|
|
|
|
Besides the entry itself, the widget has a :py:class:`FileselectorButton`
|
|
on its side, which will raise an internal :py:class:`Fileselector`,
|
|
when clicked, for path selection aided by file system navigation.
|
|
|
|
This file selector may appear in an Elementary window or in an
|
|
inner window. When a file is chosen from it, the (inner) window
|
|
is closed and the selected file's path string is exposed both as
|
|
a smart event and as the new text on the entry.
|
|
|
|
This widget encapsulates operations on its internal file
|
|
selector on its own API. There is less control over its file
|
|
selector than that one would have instantiating one directly.
|
|
|
|
Smart callbacks one can register to:
|
|
|
|
- ``"changed"`` - The text within the entry was changed
|
|
- ``"activated"`` - The entry has had editing finished and
|
|
changes are to be "committed"
|
|
- ``"press"`` - The entry has been clicked
|
|
- ``"longpressed"`` - The entry has been clicked (and held) for a
|
|
couple seconds
|
|
- ``"clicked"`` - The entry has been clicked
|
|
- ``"clicked,double"`` - The entry has been double clicked
|
|
- ``"focused"`` - The entry has received focus
|
|
- ``"unfocused"`` - The entry has lost focus
|
|
- ``"selection,paste"`` - A paste action has occurred on the
|
|
entry
|
|
- ``"selection,copy"`` - A copy action has occurred on the entry
|
|
- ``"selection,cut"`` - A cut action has occurred on the entry
|
|
- ``"unpressed"`` - The file selector entry's button was released
|
|
after being pressed.
|
|
- ``"file,chosen"`` - The user has selected a path via the file
|
|
selector entry's internal file selector, whose string
|
|
comes as the ``event_info`` data.
|
|
|
|
Default text parts of the fileselector_button widget that you can use for
|
|
are:
|
|
|
|
- "default" - Label of the fileselector_button
|
|
|
|
Default content parts of the fileselector_entry widget that you can use for
|
|
are:
|
|
|
|
- "button icon" - Button icon of the fileselector_entry
|
|
|
|
|
|
.. rubric:: Fileselector modes
|
|
|
|
.. data:: ELM_FILESELECTOR_LIST
|
|
|
|
Layout as a list
|
|
|
|
.. data:: ELM_FILESELECTOR_GRID
|
|
|
|
Layout as a grid
|
|
|
|
"""
|
|
|
|
include "widget_header.pxi"
|
|
include "callback_conversions.pxi"
|
|
|
|
from object cimport Object
|
|
|
|
cimport enums
|
|
|
|
ELM_FILESELECTOR_LIST = enums.ELM_FILESELECTOR_LIST
|
|
ELM_FILESELECTOR_GRID = enums.ELM_FILESELECTOR_GRID
|
|
|
|
cdef class FileselectorEntry(Object):
|
|
|
|
"""
|
|
|
|
This is the class that actually implement the widget.
|
|
|
|
"""
|
|
|
|
cdef object _cbs
|
|
|
|
def __init__(self, evasObject parent):
|
|
self._set_obj(elm_fileselector_entry_add(parent.obj))
|
|
|
|
|
|
self._cbs = {}
|
|
|
|
property window_title:
|
|
"""The title for a given file selector entry widget's window
|
|
|
|
This is the window's title, when the file selector pops
|
|
out after a click on the entry's button. Those windows have the
|
|
default (unlocalized) value of ``"Select a file"`` as titles.
|
|
|
|
.. note:: It will only take any effect if the file selector
|
|
entry widget is **not** under "inwin mode".
|
|
|
|
:type: string
|
|
|
|
"""
|
|
def __get__(self):
|
|
return self.window_title_get()
|
|
|
|
def __set__(self, title):
|
|
self.window_title_set(title)
|
|
|
|
cpdef window_title_set(self, title):
|
|
if isinstance(title, unicode): title = title.encode("UTF-8")
|
|
elm_fileselector_entry_window_title_set(self.obj,
|
|
<const_char *>title if title is not None else NULL)
|
|
cpdef window_title_get(self):
|
|
return _ctouni(elm_fileselector_entry_window_title_get(self.obj))
|
|
|
|
property window_size:
|
|
"""The size of a given file selector entry widget's window,
|
|
holding the file selector itself.
|
|
|
|
.. note:: it will only take any effect if the file selector entry
|
|
widget is **not** under "inwin mode". The default size for the
|
|
window (when applicable) is 400x400 pixels.
|
|
|
|
:type: tuple of Evas_Coords (int)
|
|
|
|
"""
|
|
def __get__(self):
|
|
cdef Evas_Coord w, h
|
|
elm_fileselector_entry_window_size_get(self.obj, &w, &h)
|
|
return (w, h)
|
|
|
|
def __set__(self, value):
|
|
cdef Evas_Coord w, h
|
|
w, h = value
|
|
elm_fileselector_entry_window_size_set(self.obj, w, h)
|
|
|
|
def window_size_set(self, width, height):
|
|
elm_fileselector_entry_window_size_set(self.obj, width, height)
|
|
def window_size_get(self):
|
|
cdef Evas_Coord w, h
|
|
elm_fileselector_entry_window_size_get(self.obj, &w, &h)
|
|
return (w, h)
|
|
|
|
property path:
|
|
"""The initial file system path and the entry's path string for
|
|
a given file selector entry widget
|
|
|
|
It must be a **directory** path, which will have the contents
|
|
displayed initially in the file selector's view. The default initial
|
|
path is the ``"HOME"`` environment variable's value.
|
|
|
|
:type: string
|
|
|
|
"""
|
|
def __get__(self):
|
|
return self.path_get()
|
|
|
|
def __set__(self, path):
|
|
self.path_set(path)
|
|
|
|
cpdef path_set(self, path):
|
|
if isinstance(path, unicode): path = path.encode("UTF-8")
|
|
elm_fileselector_entry_path_set(self.obj,
|
|
<const_char *>path if path is not None else NULL)
|
|
cpdef path_get(self):
|
|
return _ctouni(elm_fileselector_entry_path_get(self.obj))
|
|
|
|
property expandable:
|
|
"""Enable/disable a tree view in the given file selector entry
|
|
widget's internal file selector
|
|
|
|
This has the same effect as :py:attr:`Fileselector.expandable`,
|
|
but now applied to a file selector entry's internal file
|
|
selector.
|
|
|
|
.. note:: There's no way to put a file selector entry's internal
|
|
file selector in "grid mode", as one may do with "pure" file
|
|
selectors.
|
|
|
|
:type: bool
|
|
|
|
"""
|
|
def __get__(self):
|
|
return bool(elm_fileselector_entry_expandable_get(self.obj))
|
|
|
|
def __set__(self, expand):
|
|
elm_fileselector_entry_expandable_set(self.obj, expand)
|
|
|
|
def expandable_set(self, expand):
|
|
elm_fileselector_entry_expandable_set(self.obj, expand)
|
|
def expandable_get(self):
|
|
return bool(elm_fileselector_entry_expandable_get(self.obj))
|
|
|
|
property folder_only:
|
|
"""Whether a given file selector entry widget's internal file
|
|
selector is to display folders only or the directory contents,
|
|
as well.
|
|
|
|
This has the same effect as :py:attr:`Fileselector.folder_only`,
|
|
but now applied to a file selector entry's internal file
|
|
selector.
|
|
|
|
:type: bool
|
|
|
|
"""
|
|
def __get__(self):
|
|
return bool(elm_fileselector_entry_folder_only_get(self.obj))
|
|
|
|
def __set__(self, folder_only):
|
|
elm_fileselector_entry_folder_only_set(self.obj, folder_only)
|
|
|
|
def folder_only_set(self, folder_only):
|
|
elm_fileselector_entry_folder_only_set(self.obj, folder_only)
|
|
def folder_only_get(self):
|
|
return bool(elm_fileselector_entry_folder_only_get(self.obj))
|
|
|
|
property is_save:
|
|
"""Enable/disable the file name entry box where the user can type
|
|
in a name for a file, in a given file selector entry widget's
|
|
internal file selector.
|
|
|
|
This has the same effect as :py:attr:`Fileselector.is_save`,
|
|
but now applied to a file selector entry's internal file
|
|
selector.
|
|
|
|
:type: bool
|
|
|
|
"""
|
|
def __get__(self):
|
|
return bool(elm_fileselector_entry_is_save_get(self.obj))
|
|
|
|
def __set__(self, is_save):
|
|
elm_fileselector_entry_is_save_set(self.obj, is_save)
|
|
|
|
def is_save_set(self, is_save):
|
|
elm_fileselector_entry_is_save_set(self.obj, is_save)
|
|
def is_save_get(self):
|
|
return bool(elm_fileselector_entry_is_save_get(self.obj))
|
|
|
|
property inwin_mode:
|
|
"""Whether a given file selector entry widget's internal file
|
|
selector will raise an Elementary "inner window", instead of a
|
|
dedicated Elementary window. By default, it won't.
|
|
|
|
.. seealso:: :py:class:`InnerWindow` for more information on inner
|
|
windows
|
|
|
|
:type: bool
|
|
|
|
"""
|
|
def __get__(self):
|
|
return bool(elm_fileselector_entry_inwin_mode_get(self.obj))
|
|
|
|
def __set__(self, inwin_mode):
|
|
elm_fileselector_entry_inwin_mode_set(self.obj, inwin_mode)
|
|
|
|
def inwin_mode_set(self, inwin_mode):
|
|
elm_fileselector_entry_inwin_mode_set(self.obj, inwin_mode)
|
|
def inwin_mode_get(self):
|
|
return bool(elm_fileselector_entry_inwin_mode_get(self.obj))
|
|
|
|
property selected:
|
|
"""The initial file system path for a given file selector entry
|
|
widget
|
|
|
|
It must be a **directory** path, which will have the contents
|
|
displayed initially in the file selector's view. The default initial
|
|
path is the ``"HOME"`` environment variable's value.
|
|
|
|
:type: string
|
|
|
|
"""
|
|
def __get__(self):
|
|
return self.selected_get()
|
|
|
|
def __set__(self, path):
|
|
self.selected_set(path)
|
|
|
|
cpdef selected_set(self, path):
|
|
if isinstance(path, unicode): path = path.encode("UTF-8")
|
|
elm_fileselector_entry_selected_set(self.obj,
|
|
<const_char *>path if path is not None else NULL)
|
|
cpdef selected_get(self):
|
|
return _ctouni(elm_fileselector_entry_selected_get(self.obj))
|
|
|
|
def callback_changed_add(self, func, *args, **kwargs):
|
|
"""The text within the entry was changed."""
|
|
self._callback_add("changed", func, *args, **kwargs)
|
|
|
|
def callback_changed_del(self, func):
|
|
self._callback_del("changed", func)
|
|
|
|
def callback_activated_add(self, func, *args, **kwargs):
|
|
"""The entry has had editing finished and changes are to be committed."""
|
|
self._callback_add("activated", func, *args, **kwargs)
|
|
|
|
def callback_activated_del(self, func):
|
|
self._callback_del("activated", func)
|
|
|
|
def callback_press_add(self, func, *args, **kwargs):
|
|
"""The entry has been clicked."""
|
|
self._callback_add("press", func, *args, **kwargs)
|
|
|
|
def callback_press_del(self, func):
|
|
self._callback_del("press", func)
|
|
|
|
def callback_longpressed_add(self, func, *args, **kwargs):
|
|
"""The entry has been clicked (and held) for a couple seconds."""
|
|
self._callback_add("longpressed", func, *args, **kwargs)
|
|
|
|
def callback_longpressed_del(self, func):
|
|
self._callback_del("longpressed", func)
|
|
|
|
def callback_clicked_add(self, func, *args, **kwargs):
|
|
"""The entry has been clicked."""
|
|
self._callback_add("clicked", func, *args, **kwargs)
|
|
|
|
def callback_clicked_del(self, func):
|
|
self._callback_del("clicked", func)
|
|
|
|
def callback_clicked_double_add(self, func, *args, **kwargs):
|
|
"""The entry has been double clicked."""
|
|
self._callback_add("clicked,double", func, *args, **kwargs)
|
|
|
|
def callback_clicked_double_del(self, func):
|
|
self._callback_del("clicked,double", func)
|
|
|
|
def callback_focused_add(self, func, *args, **kwargs):
|
|
"""The entry has received focus."""
|
|
self._callback_add("focused", func, *args, **kwargs)
|
|
|
|
def callback_focused_del(self, func):
|
|
self._callback_del("focused", func)
|
|
|
|
def callback_unfocused_add(self, func, *args, **kwargs):
|
|
"""The entry has lost focus."""
|
|
self._callback_add("unfocused", func, *args, **kwargs)
|
|
|
|
def callback_unfocused_del(self, func):
|
|
self._callback_del("unfocused", func)
|
|
|
|
def callback_selection_paste_add(self, func, *args, **kwargs):
|
|
"""A paste action has occurred on the entry."""
|
|
self._callback_add("selection,paste", func, *args, **kwargs)
|
|
|
|
def callback_selection_paste_del(self, func):
|
|
self._callback_del("selection,paste", func)
|
|
|
|
def callback_selection_copy_add(self, func, *args, **kwargs):
|
|
"""A copy action has occurred on the entry."""
|
|
self._callback_add("selection,copy", func, *args, **kwargs)
|
|
|
|
def callback_selection_copy_del(self, func):
|
|
self._callback_del("selection,copy", func)
|
|
|
|
def callback_selection_cut_add(self, func, *args, **kwargs):
|
|
"""A cut action has occurred on the entry."""
|
|
self._callback_add("selection,cut", func, *args, **kwargs)
|
|
|
|
def callback_selection_cut_del(self, func):
|
|
self._callback_del("selection,cut", func)
|
|
|
|
def callback_unpressed_add(self, func, *args, **kwargs):
|
|
"""The file selector entry's button was released after being pressed."""
|
|
self._callback_add("unpressed", func, *args, **kwargs)
|
|
|
|
def callback_unpressed_del(self, func):
|
|
self._callback_del("unpressed", func)
|
|
|
|
def callback_file_chosen_add(self, func, *args, **kwargs):
|
|
"""The user has selected a path via the file selector entry's internal
|
|
file selector, whose string comes as the ``event_info`` data.
|
|
|
|
"""
|
|
self._callback_add_full("file,chosen", _cb_string_conv,
|
|
func, *args, **kwargs)
|
|
|
|
def callback_file_chosen_del(self, func):
|
|
self._callback_del_full("file,chosen", _cb_string_conv, func)
|
|
|
|
|
|
_object_mapping_register("elm_fileselector_entry", FileselectorEntry)
|