mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-08-25 17:39:23 +00:00
Compare commits
134 Commits
snapshot9.
...
snapshot10
Author | SHA1 | Date | |
---|---|---|---|
c4478198b6 | |||
f468924b85 | |||
158b48e4d5 | |||
756a58e443 | |||
85ce5b0791 | |||
![]() |
e534d1cd20 | ||
2d35304ef0 | |||
4f0e6d758b | |||
bd4aa89c2b | |||
b046360293 | |||
6971fb3999 | |||
7b840f29c4 | |||
71fed7300b | |||
57315c3b6e | |||
3d3abc90e1 | |||
de7882e4cf | |||
![]() |
10190d61c0 | ||
bb6fa7cb46 | |||
80cb70c9a6 | |||
77d51aa51a | |||
![]() |
ebb4e22d02 | ||
4344a0df0c | |||
34ad0c5e47 | |||
704ade560a | |||
a4892cf847 | |||
e59661775a | |||
53a9f04155 | |||
100f483a86 | |||
bad468560a | |||
eb0cf62a54 | |||
a016932ac7 | |||
1706414171 | |||
5f963aa66b | |||
25578e4fc6 | |||
faec92ce6c | |||
313e725ff2 | |||
3f82a51ef9 | |||
d26ab9b910 | |||
aa42e056c0 | |||
fa6592ed1a | |||
11b06accbb | |||
![]() |
915eb5802f | ||
![]() |
4e943c7bee | ||
![]() |
692d75562e | ||
4cce6d4318 | |||
e55e15466d | |||
370340de0b | |||
10bc483887 | |||
f66b2ccbad | |||
6460c20a97 | |||
9f2c240fc1 | |||
a4cbbfcb9f | |||
0f49bfba2e | |||
bcd59899ac | |||
5952709ba8 | |||
c1e15fa1de | |||
74bcc36968 | |||
64fce8fb54 | |||
755e004d97 | |||
2296a03688 | |||
49c3eb37cb | |||
9cab1d2afc | |||
b7bc53bb92 | |||
5b49be315c | |||
37a82287ad | |||
9ec54277f3 | |||
a67124710a | |||
6d77c369b1 | |||
dab96346d2 | |||
cd0977798c | |||
a706ebf477 | |||
![]() |
c464af83c2 | ||
c79ab213cb | |||
![]() |
4b0f7c4cc8 | ||
![]() |
a3ed2ebef8 | ||
![]() |
f02fae7fa2 | ||
![]() |
afae109348 | ||
401029f462 | |||
acdc042c74 | |||
a674d046c1 | |||
33733eb2c4 | |||
![]() |
01eb2de162 | ||
![]() |
5e321e91b2 | ||
![]() |
45b07a727d | ||
70076aadb0 | |||
8b223008b4 | |||
8728c74aac | |||
95fc66dfba | |||
f70033bb27 | |||
67910e18a8 | |||
c73657c957 | |||
bb0227f3b8 | |||
920c1cf863 | |||
797f6a8432 | |||
![]() |
350ece93b8 | ||
81d3817b4c | |||
![]() |
0ee0348ed6 | ||
![]() |
db97d5f855 | ||
![]() |
258bcff53e | ||
![]() |
f7325a8f36 | ||
![]() |
54a3805626 | ||
![]() |
3f82dc387e | ||
2824eac406 | |||
7b8e6b9004 | |||
e3b3d2af82 | |||
![]() |
65e32fe10e | ||
![]() |
724c092c1c | ||
e2fc5ff80b | |||
3f264f436b | |||
cfccebc1bb | |||
c929b965fe | |||
![]() |
747d1c24b3 | ||
77f46d5f43 | |||
c77f717d26 | |||
![]() |
16c344e6ba | ||
![]() |
d8ac1bc74d | ||
76e9eae780 | |||
![]() |
36660588e7 | ||
c072ca2d48 | |||
40c92e854d | |||
![]() |
3c2702e8c3 | ||
![]() |
ddcbf9b586 | ||
63d6fa62c4 | |||
cbd9718e5f | |||
4896ebfffd | |||
f71506adf8 | |||
2279e14623 | |||
3546ff7909 | |||
5467655264 | |||
0c60377082 | |||
4fd57a71b9 | |||
7b07d43477 | |||
![]() |
191d42f8a5 | ||
![]() |
dc1092f9db |
36
README.md
36
README.md
@@ -32,13 +32,14 @@ Although most dependencies can be found in the windows-dependencies directory, w
|
|||||||
|
|
||||||
#### Dependencies packaged in windows installers
|
#### Dependencies packaged in windows installers
|
||||||
|
|
||||||
* [Python,](http://python.org) version 2.7.9
|
* [Python,](http://python.org) version 2.7.10
|
||||||
If you want to build both x86 and x64 binaries, you can install python x86 to C:\python27 and python x64 to C:\python27x64, for example.
|
If you want to build both x86 and x64 binaries, you can install python x86 to C:\python27 and python x64 to C:\python27x64, for example.
|
||||||
* [wxPython](http://www.wxpython.org) for Python 2.7, version 3.0.2
|
* [wxPython](http://www.wxpython.org) for Python 2.7, version 3.0.2.0
|
||||||
* [Python windows extensions (pywin32)](http://www.sourceforge.net/projects/pywin32/) for python 2.7, build 219
|
* [Python windows extensions (pywin32)](http://www.sourceforge.net/projects/pywin32/) for python 2.7, build 219
|
||||||
* [Pycurl](http://pycurl.sourceforge.net) 7.19.5 for Python 2.7: [32-bit downloads,](https://pypi.python.org/pypi/pycurl/7.19.3.1) [64-bit downloads](http://www.lfd.uci.edu/~gohlke/pythonlibs/)
|
* [Pycurl](http://pycurl.sourceforge.net) 7.19.5.1 for Python 2.7: [32-bit downloads,](https://pypi.python.org/pypi/pycurl/7.19.5.1) [64-bit downloads](http://www.lfd.uci.edu/~gohlke/pythonlibs/)
|
||||||
|
Note: the x64 version is in wheel format instead of executable installer, so you have to install it using pip. For example: C:\python27x64\scripts\pip install pycurl-7.19.5.1-cp27-none-win_amd64.whl
|
||||||
* [PyEnchant,](http://pythonhosted.org/pyenchant/) version 1.6.6.
|
* [PyEnchant,](http://pythonhosted.org/pyenchant/) version 1.6.6.
|
||||||
x64 version has been built by TW Blue developers, so you only will find it in windows-dependencies folder
|
x64 version has been built by TWBlue developers, so you only will find it in windows-dependencies folder
|
||||||
|
|
||||||
The windows installers are available only in the windows-dependencies folder
|
The windows installers are available only in the windows-dependencies folder
|
||||||
|
|
||||||
@@ -53,6 +54,7 @@ setuptools install a script, called easy_install. You can find it in the python
|
|||||||
cd C:\python27x64\scripts
|
cd C:\python27x64\scripts
|
||||||
|
|
||||||
You can also add the scripts folder to your path environment variable.
|
You can also add the scripts folder to your path environment variable.
|
||||||
|
Note: pip and setuptools are included in the Python installer since version 2.7.9.
|
||||||
|
|
||||||
After that, run the following command to install a package, replacing packagename with the names listed below:
|
After that, run the following command to install a package, replacing packagename with the names listed below:
|
||||||
|
|
||||||
@@ -61,7 +63,6 @@ setuptools install a script, called easy_install. You can find it in the python
|
|||||||
The -z switch unzips the package, instead of installing it compressed. If you add the --upgrade switch, you can upgrade a package to its latest version. The following packages need to be installed:
|
The -z switch unzips the package, instead of installing it compressed. If you add the --upgrade switch, you can upgrade a package to its latest version. The following packages need to be installed:
|
||||||
|
|
||||||
* pypubsub
|
* pypubsub
|
||||||
* dropbox
|
|
||||||
* configobj
|
* configobj
|
||||||
* requests-oauthlib
|
* requests-oauthlib
|
||||||
* future
|
* future
|
||||||
@@ -70,8 +71,11 @@ setuptools install a script, called easy_install. You can find it in the python
|
|||||||
* arrow
|
* arrow
|
||||||
* goslate
|
* goslate
|
||||||
* markdown
|
* markdown
|
||||||
|
* pocket
|
||||||
|
|
||||||
easy_install will automatically get the additional libraries that these packages need to work properly.
|
easy_install will automatically get the additional libraries that these packages need to work properly.
|
||||||
|
Run the following command to quickly install and upgrade all packages and their dependencies:
|
||||||
|
easy_install -Z --upgrade six configobj goslate markdown future pocket suds requests oauthlib requests-oauthlib pypubsub pygeocoder arrow
|
||||||
|
|
||||||
#### Other dependencies
|
#### Other dependencies
|
||||||
|
|
||||||
@@ -94,9 +98,16 @@ Now that you have installed all these packages, you can run TW Blue from source
|
|||||||
|
|
||||||
If necessary, change the first part of the command to reflect the location of your python executable. You can run TW Blue using python x86 and x64
|
If necessary, change the first part of the command to reflect the location of your python executable. You can run TW Blue using python x86 and x64
|
||||||
|
|
||||||
|
### Generating the documentation
|
||||||
|
|
||||||
|
To generate the documentation in html format, navigate to the doc folder inside this repo. After that, run this command:
|
||||||
|
python generator.py
|
||||||
|
The documentation will be generated, placing each language in a separate folder in the doc directory. Move these folders (for example de, en, es, fr, it, ...) to src/documentation, creating the directory if necesary.
|
||||||
|
Also, copy the license.txt located in the root of the repo to the documentation folder.
|
||||||
|
|
||||||
### Building a binary version
|
### Building a binary version
|
||||||
|
|
||||||
A binary version doesn't need python and the other dependencies to run, it's the same version that you will find on the TW Blue website if you download the zip files.
|
A binary version doesn't need python and the other dependencies to run, it's the same version that you will find on the TW Blue website if you download the zip files or the snapshot versions.
|
||||||
|
|
||||||
To build it, run the following command from the src folder:
|
To build it, run the following command from the src folder:
|
||||||
|
|
||||||
@@ -104,6 +115,17 @@ To build it, run the following command from the src folder:
|
|||||||
|
|
||||||
You will find the binaries in the dist directory.
|
You will find the binaries in the dist directory.
|
||||||
|
|
||||||
|
### Building an installer
|
||||||
|
|
||||||
|
If you want to install TWBlue in your computer, you must create the installer first. Follow these steps:
|
||||||
|
|
||||||
|
* Navigate to the src directory, and create a binary version for x86: C:\python27\python setup.py py2exe
|
||||||
|
* Move the dist directory to the scripts folder in this repo, and rename it to twblue
|
||||||
|
* Repeat these steps with Python for x64: C:\python27x64\python setup.py py2exe
|
||||||
|
* Move the new dist directory to the scripts folder, and rename it to twblue64
|
||||||
|
* Go to the scripts folder, right click on the twblue.nsi file, and choose compyle unicode NSIS script
|
||||||
|
* This may take a while. After the process, you will find the installer in the scripts folder
|
||||||
|
|
||||||
### How to generate a translation template
|
### How to generate a translation template
|
||||||
|
|
||||||
Run the gen_pot.bat file, located in the tools directory. Your python installation must be in your path environment variable. The pot file will appear in the tools directory.
|
Run the gen_pot.bat file, located in the tools directory. Your python installation must be in your path environment variable. The pot file will appear in the tools directory.
|
||||||
|
@@ -32,4 +32,6 @@ Paris-Apps
|
|||||||
Salvadora Melguizo
|
Salvadora Melguizo
|
||||||
Holly Scott-Gardner
|
Holly Scott-Gardner
|
||||||
Anibal Hernández
|
Anibal Hernández
|
||||||
Sussan Leiva
|
Sussan Leiva
|
||||||
|
Brian Hartgen
|
||||||
|
PEDRO REINA COLOBON
|
@@ -7,7 +7,7 @@ languageHandler.setLanguage("en")
|
|||||||
import strings
|
import strings
|
||||||
|
|
||||||
# the list of supported language codes of TW Blue
|
# the list of supported language codes of TW Blue
|
||||||
languages = ["en", "es", "fr", "gl"]
|
languages = ["en", "es", "fr", "de", "it"]
|
||||||
#"eu", "ar", "ca", "es", "fi", "fr", "gl", "hu", "it", "pl", "pt", "ru", "tr"]
|
#"eu", "ar", "ca", "es", "fi", "fr", "gl", "hu", "it", "pl", "pt", "ru", "tr"]
|
||||||
|
|
||||||
def generate_document(language):
|
def generate_document(language):
|
||||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,178 +0,0 @@
|
|||||||
% Lista de Cambios
|
|
||||||
|
|
||||||
#¡Peligro!
|
|
||||||
|
|
||||||
Antes de continuar con la prueba del programa, considera que es una versión en desarrollo. Específicamente la versión 0.42. Esto quiere decir que no solo es posible que encuentres errores, sino que los vas a encontrar. La idea es reportar lo más que salga, para que se puedan resolver para las próximas alphas.
|
|
||||||
|
|
||||||
Aquí la lista de cambios del programa. Si quieres leer como usarlo, [mira este documento.](manual.html) Si ves un enlace con un signo de número (#) y un código que empieza por varios números, estás viendo un error que se ha reportado en el Sistema de seguimiento de incidencias. Siéntete libre de publicar tus propios errores y peticiones de mejoras y nuevas características a través de esta herramienta, disponible desde el menú ayuda en TW Blue.
|
|
||||||
|
|
||||||
## Cambios introducidos en esta nueva versión
|
|
||||||
|
|
||||||
* Se arregla un error que no permitía mostrar en buffer listas con acentos o caracteres especiales.
|
|
||||||
* Ahora TW blue no debería dejar de actualizar los tuits repentinamente.
|
|
||||||
* Ahora TW blue soporta la opción "mute" de Twitter. Cuando silencias a un usuario, no podrás ver sus tuits ni sus menciones, pero no lo dejarás de seguir, con lo que podrás seguir teniendo contacto con él a través de mensaje directo. A diferencia del bloqueo o de dejar de seguirlo, con esta opción el usuario no se dará cuenta que lo tienes silenciado. Busca esto desde el diálogo de acciónes de usuario, o desde el menú de usuario.
|
|
||||||
* Se añade una nueva página de sonido en el diálogo de configuración que permite seleccionar los dispositivos de entrada y salida, ajustar el volumen y silenciar globalmente TW Blue. Algunas otras opciones se han movido desde la página "general" hacia "sonido".
|
|
||||||
* Se ha rediseñado el fichero de configuración. La mayoría de las opciones se deberán reconfigurar de nuevo.
|
|
||||||
* Es posible desactivar Sapi5 para que no intervenga si no hay ningún lector de pantalla soportado en ejecución.
|
|
||||||
* Dentro de la pestaña General, se puede cambiar manualmente de idioma. Tw Blue reqiere reiniciarse.
|
|
||||||
* Se incluye un diálogo nuevo que ayuda a entender los sonidos de TW Blue.
|
|
||||||
* es posible desactivar el sonido y notificaciones de un buffer. El resto del cliente funcionará correctamente. Pulsa Control+win+shift+m(interfaz no visible) o selecciónalo desde el menú buffer para conmutar entre esta característica.
|
|
||||||
*Ahora puedes realizar búsquedas por usuarios y tuits. Las búsquedas de tuits quedarán guardadas en la configuración mientras que las de usuarios se eliminarán al salir. Pulsa Ctrl+Shift+guion o selecciónalo desde el menú aplicación.
|
|
||||||
* puedes abrir buffer para ver los favoritos de un usuario desde el menú "usuario".
|
|
||||||
* Con control+win+shift arriba y abajo en la interfaz no visible, y control arriba y abajo en la interfaz gráfica, puedes ir hacia el anterior o siguiente tweet en la conversación. Para que esto funcione deben estar los tweets de la conversación en la línea principal.
|
|
||||||
* Durante la grabación de un audio para adjuntar, puedes pausar y reanudar la grabación para omitir partes que puedan generar un audio muy grande.
|
|
||||||
* Es posible subir audios a Dropbox. Para ello configura el servicio en la pestaña "servicios de audio" en el diálogo de configuración.
|
|
||||||
* ahora que se pueden subir audios a Dropbox, en el diálogo de adjuntar un audio podrás seleccionar al servicio que deseas subir.
|
|
||||||
* se incluye un diálogo de corrección ortográfica para los tuits o mensajes. Por ahora los idiomas disponibles son Español, inglés, portugués, ruso y polaco. El idioma será seleccionado automáticamente de acuerdo con la configuración de TW Blue.
|
|
||||||
* Se ha introducido la lectura automática de los tuits para un buffer. Activando esta característica se puede hacer que TW Blue lea automáticamente los tuits que lleguen a los buffers que tengan activada esta opción. Pulsando control+Win+e conmutarás esta característica.
|
|
||||||
* En el diálogo de configuración ahora puedes especificar si deseas que TW Blue inicie con la interfaz oculta.
|
|
||||||
* Las URL se muestran en su versión original. Únicamente las fotos de Twitter se siguen mostrando como acortadas, y las que hayan sido acortadas manualmente antes de enviarlas en un tuit.
|
|
||||||
|
|
||||||
## Cambios introducidos en la versión 0.40
|
|
||||||
|
|
||||||
* Se puede cambiar entre diferentes paquetes de sonidos y crear los propios. Cada paquete debe ir en un directorio por separado dentro de la carpeta sounds. Para cambiar el paquete de sonido se puede seleccionar desde el diálogo de configuración.
|
|
||||||
* Los archivos de sonido van en formato OGG.
|
|
||||||
* Ahora TW Blue debe ser capaz de cerrar correctamente.
|
|
||||||
* La hora está escrita teniendo en cuenta el formato de 12 horas.
|
|
||||||
* La hora se escribe de acuerdo con la zona horaria de Twitter establecida en tu cuenta.
|
|
||||||
* Añadidas nuevas traducciones al portugués, polaco y ruso. Gracias chicos!
|
|
||||||
* TW Blue elimina de la configuración líneas temporales de usuarios que han cambiado su nombre o borrado su cuenta.
|
|
||||||
* ahora se maneja la gran mayoría de los eventos en Twitter con el buffer de eventos.
|
|
||||||
* Ya se puede ver el texto de los eventos, con Control+shift+V (GUI) y control+win+V (interfaz no visible).
|
|
||||||
* Manejo de listas: Se puede crear, editar, borrar, ver una lista como buffer en TW Blue, añadir y borrar miembros de una lista.
|
|
||||||
* Ahora si durante el inicio TW Blue intenta cargar una línea temporal que no existe, automáticamente la elimina de la configuración y continúa la carga normalmente.
|
|
||||||
* Solo se cargará hasta los 400 amigos y seguidores para evitar problemas con la API. Se corregirá en próximas versiones.
|
|
||||||
* Para el modo no visible, Se incluyen atajos para escuchar nuevamente el tweet sobre el que se está situado (control+win+espacio) y para copiar el mensaje al portapapeles (control+win+c).
|
|
||||||
|
|
||||||
## Cambios introducidos en la versión 0.38
|
|
||||||
|
|
||||||
* Se ha corregido un fallo que impedía cerrarse al darle la orden.
|
|
||||||
* Ahora los tweets no terminan en un punto obligatoriamente. Si el programa detecta que el tweet termina en una letra o número, coloca un punto automáticamente. Si no es así, deja el texto tal y como está.
|
|
||||||
* Ya se pueden subir imágenes a los tweets y respuestas. Ten en cuenta que el tamaño de las imágenes es establecido por twitter.
|
|
||||||
* Al desplazarte hacia la izquierda y derecha usando el modo no visible, ahora solo se anuncia información de la posición en la lista de elementos.
|
|
||||||
* TW Blue ya debería funcionar para Windows XP al momento de autorizar la aplicación.
|
|
||||||
* Se ha añadido una nueva opción en el diálogo de configuración que permite revertir los buffers. Esto significa que puedes escojer si quieres ver los tweets como hasta ahora, o que los más nuevos se coloquen arriba y los viejos debajo.
|
|
||||||
* Se pueden subir fotos al perfil de Twitter, disponible desde el diálogo para actualizar tu perfil.
|
|
||||||
* Se ha añadido un buffer de eventos, donde se guardan por ahora algunos eventos que ocurren en twitter, como seguir o hacer que alguien te siga, marcar un favorito, que un tweet tuyo sea marcado como favorito, etc. Se puede activar y desactivar este buffer desde el diálogo de configuración.
|
|
||||||
* Ahora se pueden eliminar líneas temporales ya creadas que no contengan tweets, y no se permitirá crear líneas temporales de usuarios sin tweets.
|
|
||||||
* La interfaz de la aplicación es traducible. Ahora cualquier usuario puede hacer sus propias traducciones a diferentes idiomas.
|
|
||||||
|
|
||||||
## Cambios introducidos en la versión 0.36
|
|
||||||
|
|
||||||
* Los usuarios brasileños podrán ver algunos mensajes en portugués. (Usuários brasileiros poderão ver algumas mensagens em Português).
|
|
||||||
* Se ha arreglado un fallo que hacía que algunos sonidos se escucharan y otros no. Ahora deberían escucharse todos.
|
|
||||||
* La reconexión también ha recivido un arreglo, pues en ocasiones se efectuaba de forma incorrecta y había que volver a abrir la aplicación.
|
|
||||||
* Ahora TW Blue permite eliminar únicamente líneas temporales con el comando correspondiente. Antes se mostraba el diálogo sin importar en qué buffer se estaba.
|
|
||||||
* Se vuelve a poder ver los detalles de los usuarios con Enter estando en el buffer para amigos o seguidores.
|
|
||||||
* A partir de esta versión no hay soporte para bases de datos.
|
|
||||||
* Escucharás una notificación por voz cuando alguien marque como favorito uno de tus tweets.
|
|
||||||
* Los amigos y seguidores ya se actualizan.
|
|
||||||
* Cuando sigues a alguien, ya no arroja ningún error si no se muestran los amigos. Pasa lo mismo con los seguidores.
|
|
||||||
* Puedes limpiar un buffer pulsando Shift suprimir en la ventana visible, y Control+win+Shift+Suprimir en la ventana no visible. Esto vaciará todos los tweets en el buffer actual.
|
|
||||||
|
|
||||||
## cambios introducidos en la versión 0.35
|
|
||||||
|
|
||||||
* Existe un sitio web oficial para el programa, ve a [twblue.com.mx.](http://twblue.com.mx) Desde este espacio encontrarás el sistema de seguimiento de errores, el blog con las noticias recientes, y la última versión disponible.
|
|
||||||
* TW Blue anuncia cuando eres mencionado, y cuando te llega un mensaje directo.
|
|
||||||
* Jaws ya no habla el atajo de teclado que se presiona en el modo oculto. [#11](http://twblue.a12x.net/errores/view.php?id=11)
|
|
||||||
* En el modo no visible, los comandos Control+Win+inicio, control+Win+Fin, control+win+avance de página y control+win+retroceso de página van al principio de la lista, al final, 20 elementos hacia abajo y 20 elementos hacia arriba respectivamente. [#10,](http://twblue.a12x.net/errores/view.php?id=10) [#21,](http://twblue.a12x.net/errores/view.php?id=21) [#22](http://twblue.a12x.net/errores/view.php?id=22)
|
|
||||||
* Ahora se pueden reproducir audios de Audioboo.
|
|
||||||
* Ahora el Stream debería poder conectarse luego de que la máquina regresa de una suspensión.
|
|
||||||
* Es posible grabar audios o subir archivos a SndUp.net. Si estás registrado en esta página, podrás poner en la configuración tu API Key para que los archivos se suban a tu nombre. Puedes subir archivos Wav, OGG y MP3. Los archivos wav se recodificarán a OGG.
|
|
||||||
* Si no estás usando ningún lector de pantalla, algunas acciones de TW blue usarán la síntesis de voz Sapi 5.
|
|
||||||
* Hay disponible una versión para arquitecturas de 64 Bits. Gracias a [@jmdaweb](https://twitter.com/jmdaweb) por tomarse el trabajo de hacer funcionar la aplicación en esta arquitectura y prepararla para su distribución.
|
|
||||||
* Cambio en los sonidos del cliente. Gracias a [@guilevi_es](https://twitter.com/guilevi_es) por la colaboración con el pack de sonidos.
|
|
||||||
* Algunos mensajes del programa se pueden traducir. En futuras versiones será internacionalizada la totalidad de su interfaz.
|
|
||||||
* Y Corrección de algunos cuantos errores más ([#5,](http://twblue.com.mx/errores/view.php?id=5) [#7,](http://twblue.com.mx/errores/view.php?id=7) [#8,](http://twblue.com.mx/errores/view.php?id=8) [#9,](http://twblue.com.mx/errores/view.php?id=9) [#12,](http://twblue.com.mx/errores/view.php?id=12))
|
|
||||||
|
|
||||||
## Cambios introducidos en la versión 0.3
|
|
||||||
|
|
||||||
* Ya se puede actualizar tu perfil desde TW Blue. [#19](http://twblue.a12x.net/issues/view.php?id=19)
|
|
||||||
* Ahora se pueden crear nuevamente las líneas temporales y no dan problemas. [#24](http://twblue.a12x.net/issues/view.php?id=24)
|
|
||||||
* Ahora los archivos de errores se guardarán en el directorio "logs".
|
|
||||||
* Cuando crees una línea temporal, se actualizará en tiempo real desde el principio en lugar de actualizar cada 2 minutos.
|
|
||||||
* Ya puedes solicitar más llamadas a la API que funcionarán para obtener 200 tweets cada una. Una llamada equivale a 200 elementos de la lista principal, menciones, mensajes directos, favoritos y líneas temporales. En el archivo de configuración se puede editar la opción en [twitter]/max_api_calls. Es recomendable no pedirle a Twitter más de 2 llamadas a la API, o de lo contrario llegará al límite de llamadas permitidas muy pronto y la aplicación fallará.
|
|
||||||
* Cuando respondes a un Tweet, este se envía como respuesta al mismo y no como si fuera un tweet nuevo.
|
|
||||||
* El antiguo sistema de reporte de errores tuvo que ser cambiado. A partir de esta versión, podrás reportar los errores directamente desde la aplicación. La opción Reportar un Error abrirá un diálogo que te preguntará detalles sobre tu error y enviará el reporte automáticamente.
|
|
||||||
* Ya se borran los amigos cuando dejas de seguir a un usuario.
|
|
||||||
* También los favoritos, al momento de quitar un tweet como favorito, realizan el cambio.
|
|
||||||
* Se añade un diálogo de configuración que permite controlar el número de llamadas a la API a realizar, si usar o no bases de datos, y ocultar y mostrar las listas de amigos, seguidores y favoritos.
|
|
||||||
* Al citar tweets, las comillas que cierran el mensaje ahora están separadas por un espacio de la última letra. Esto es así porque antes, cuando había una URL, causaba que las comillas hicieran parte de la dirección enviando a sitios inexistentes.
|
|
||||||
* Mejoras con algunas líneas temporales. Ahora puede guardar sin problemas cualquier línea temporal. No debería dar errores.
|
|
||||||
* Ahora los audios se reproducirán únicamente con Control+Intro, mientras que las URL se abrirán con Intro.
|
|
||||||
* El stream se intentará reconectar al fallar la conexión a internet.
|
|
||||||
* Ahora desde los seguidores y amigos se puede mencionar a un usuario.
|
|
||||||
* Ahora se proporciona un modo "invisible". Bajo el menú aplicación, la opción "Esconder ventana" o pulsando Control+M. Para mostrar la ventana de nuevo se pulsa Control+Win+M.
|
|
||||||
|
|
||||||
## Cambios introducidos en la versión 0.025
|
|
||||||
|
|
||||||
Ten en cuenta que cuando un usuario te deja de seguir o tú dejas de seguir a alguien más, no se actualizará en la lista de amigos o seguidores por ahora. Al reiniciar el programa sí aparecerá la información correcta.
|
|
||||||
|
|
||||||
* Corregido un error que impedía cerrar la aplicación hasta que el programa anunciara que estaba listo. [#17](http://twblue.a12x.net/issues/view.php?id=17) y [#18](http://twblue.a12x.net/issues/view.php?id=18)
|
|
||||||
* Cambiado el modo de organizar las líneas temporales en la configuración. Es necesario volver a crearlas.
|
|
||||||
* Ahora puede enviarse un mensaje directo a los amigos y seguidores usando el botón. Esto no funcionaba en las versiones 0.02 y 0.021.
|
|
||||||
* Se puede subir y bajar el volumen desde la lista de seguidores y amigos.
|
|
||||||
* En el diálogo para escribir un tweet, se puede ahora traducir el mensaje usando Google Traductor. Aparecerá un diálogo para preguntar por los idiomas de origen y destino.
|
|
||||||
* El menú archivo tiene la opción salir.
|
|
||||||
* A partir de esta versión solo se reproducirán archivos de audio pulsando enter si estos llevan la etiqueta #audio.
|
|
||||||
* Puedes intentar reproducir una URL cualquiera sin que lleve la etiqueta #audio pulsando Control Enter. Este comando intentará reproducir la primer URL encontrada.
|
|
||||||
* Se ha mejorado el buscador de URLS, haciendo más rápida la función y ahora debería ser capaz de detectar todas las URLS. [#21](http://twblue.a12x.net/issues/view.php?id=21)
|
|
||||||
* Ahora el diálogo que se muestra para seleccionar el usuario del que se desea ver detalles permite además de seleccionarlo de una lista, escribir el nombre de usuario que desees.
|
|
||||||
|
|
||||||
## Cambios introducidos en versión 0.02 y 0.021
|
|
||||||
|
|
||||||
* El mensaje que se reproducía al seguir un usuario ahora dice "ahora sigues a x usuario" en lugar de "ahora no sigues a x usuario". [#5](http://twblue.a12x.net/issues/view.php?id=5)
|
|
||||||
* Al salir un diálogo te preguntará si deseas hacerlo. Ahora se sale de una forma mucho más limpia del programa, evitando varios errores durante el cierre.
|
|
||||||
* Cambio de los sonidos para los dm entrante y saliente. Gracias a [@marcedsosa](https://twitter.com/marcedsosa) por los nuevos sonidos.
|
|
||||||
* El nombre de usuario de twitter se lee en el título de la ventana.
|
|
||||||
* Los sonidos del programa también leen el volumen desde la configuración. El módulo de sonido debería tomar menos tiempo en reproducir varios de los sonidos de la aplicación.
|
|
||||||
* Las acciones de subir y bajar volumen reproducen un sonido que indica que tan fuerte suena.
|
|
||||||
* Ya no se muestran las menciones de personas que no te siguen en tu línea principal. [#1](http://twblue.a12x.net/issues/view.php?id=1)
|
|
||||||
* Ahora puedes eliminar tweets y mensajes directos. Solo podrás eliminar los tweets que tú hayas escrito.
|
|
||||||
* Arreglado un error que impedía cargar correctamente las diferentes listas si en alguna de ellas no había ningún tweet, usuario o mensaje directo. Esto afectaba especialmente a cuentas con 0 favoritos, 0 tweets, 0 enviados o 0 mensajes directos. [#2](http://twblue.a12x.net/issues/view.php?id=2)
|
|
||||||
* Ahora cada que se publique una nueva versión, se te notificará de ello. Si accedes a descargarla, el programa la descargará y copiará todo lo necesario.
|
|
||||||
* Ya se puede obtener la lista completa de amigos y seguidores.
|
|
||||||
* Se añade la fecha del último tweet de los seguidores y amigos.
|
|
||||||
* Se actualizan ahora los amigos y seguidores a tiempo real. (ToDo: Los amigos y seguidores no muestran la fecha de su último tweet cuando se actualizan a tiempo real. Lo hacen al recargarse una vez reiniciada la aplicación).
|
|
||||||
* El orden de las pestañas se ha cambiado. Ahora se ordenan comenzando por el principal, menciones, mensajes directos y enviados.
|
|
||||||
* Ahora se muestran los mensajes directos en la lista de tweets enviados cuando se carga el stream por primera vez. Esto no pasaba y si el usuario enviaba un DM desde otro cliente cuando Tw Blue no estaba abierto, al abrir la aplicación no mostraba dicho DM. [#8](http://twblue.a12x.net/issues/view.php?id=8)
|
|
||||||
* Con Control+A, se puede seleccionar todo el texto de un mensaje. Funciona con Jaws y NVDA.
|
|
||||||
* Hay atajos de teclado (detallados en la [Documentación)](leeme.html) para muchas de las acciones que puede hacer el programa.
|
|
||||||
* Ahora TW Blue detecta más audios en URLS que vienen en retweets, y audios compartidos desde Dropbox. [#3](http://twblue.a12x.net/issues/view.php?id=3)
|
|
||||||
* Se incluye documentación para la aplicación y créditos.
|
|
||||||
* Si la conexión a internet deja de funcionar, el stream intentará reconectarse por 30 minutos.
|
|
||||||
* Se ha escrito un documento que detalla como usar el programa.
|
|
||||||
* Se ha abierto el [Sistema de seguimiento de incidencias](http://twblue.a12x.net/issues/) donde los usuarios podrán reportar los errores y si lo desean, aportar nuevas ideas para el desarrollo de la aplicación. Hay disponible un acceso directo al formulario de reporte desde el menú ayuda.
|
|
||||||
* Ahora hay créditos de la versión actual.
|
|
||||||
* Se añade en el menú usuario la opción para ver los detalles. También funciona si se presiona intro sobre un amigo o seguidor.
|
|
||||||
|
|
||||||
## Cambios introducidos en la versión Prealpha1
|
|
||||||
|
|
||||||
Ten en cuenta que en esta versión los amigos y seguidores no se actualizan automáticamente. Esto será añadido en otra versión. Tampoco se puede borrar ningún tweet, o DM. Todos los tweets, mensajes directos, menciones, favoritos, seguidores y amigos se actualizarán descargando un máximo de 200. Pronto se podrán añadir más a la cantidad de actualizaciones. Aquí los cambios desde la primer versión.
|
|
||||||
|
|
||||||
* La fecha se ve bien, de acuerdo con la zona horaria del usuario.
|
|
||||||
* Ahora el cursor se pone al principio cuando se va a responder o hacer un retweet.
|
|
||||||
* Si se pulsa Control+E en los cuadros de texto, se seleccionará todo el mensaje.
|
|
||||||
* Algunas correcciones para el manejo de las líneas temporales (necesito hacer mejoras en la manera de administrar esto).
|
|
||||||
* Los favoritos se actualizan en tiempo real.
|
|
||||||
* Escucharás un sonido cuando pasas por un tweet que podría contener un audio reproducible.
|
|
||||||
* Se soporta reproducción de audio con la etiqueta #audio y una URL. Pulsa enter para escuchar la canción. Pulsa F5 para bajar el volumen un 5%, o f6 para subirlo un 5%. Si quieres detener la reproducción, ve hacia donde haya un audio, y pulsa intro. Si el programa es incapaz de reproducir algo, te avisará. El volumen de la música (no de los sonidos del programa por ahora) quedará guardado en la configuración, y el programa lo recordará la próxima vez que reproduzcas algo.
|
|
||||||
* Puedes ver los primeros 200 amigos y seguidores con sus nombres de usuario, nombre real y algo de información útil. En futuras versiones podrás ver todos si tienes más de 200. Ten en cuenta que hay acciones que no podrás hacer con estos usuarios en la lista (por ejemplo, responder o retwittear, porque no son tweets, son usuarios), pero sí podrás seguirlos, dejarlos de seguir, y hacer casi todo (menos enviar DM por ahora) lo que podrías hacer desde el menú de usuario.
|
|
||||||
|
|
||||||
Ahora hay que usar y probar, y cuando encuentres un error, por favor mira en la carpeta de la aplicación, pues se ha de generar un archivo con el nombre del ejecutable pero con un .log al final. Bien, ese es vital para que yo pueda saber dónde se ha roto el programa, y te agradecería me lo enviaras junto con una descripción de qué era más o menos lo que estabas haciendo, cuando la aplicación no hizo lo que tenía que hacer. Por ejemplo, "intenté enviarme un DM, pero el cuadro de diálogo de mensaje directo nunca se abrió". Si puedes subirlo a un servidor de almacenamiento (como [Dropbox,](https://www.dropbox.com) por ejemplo), y enviármelo ya sea mencionando a [@tw_blue2](https://twitter.com/tw_blue2) o a [@manuelcortez00,](https://twitter.com/manuelcortez00) sería genial.
|
|
||||||
|
|
||||||
¡Infinitas gracias por probar!
|
|
||||||
|
|
||||||
## Novedades de la versión prealpha 0
|
|
||||||
|
|
||||||
* Hacer tweets, responder a los tweets de los demás, mencionando a todos los usuarios cuando haya más de uno en el tweet, retwittear lo que te agrada, añadiendo o no un comentario al retweet y eliminarlos.
|
|
||||||
* Añadir y quitar de favoritos un tweet.
|
|
||||||
* Acortar y desacortar direcciones URL cuando escribes un tweet o dm (puedes seleccionar cual deseas acortar o desacortar desde una lista cuando sean más de una).
|
|
||||||
* Abrir un navegador web con la dirección URL que viene en el tweet, pulsando enter. Cuando haya más de una dirección, verás una lista donde te preguntará por la que desees.
|
|
||||||
* Usuarios: puedes seguir, dejar de seguir, reportar como spam, bloquear y enviar un mensaje directo a los usuarios.
|
|
||||||
* Puedes abrir y eliminar líneas temporales individuales para cada usuario.
|
|
||||||
* También verás tus favoritos.
|
|
||||||
* y por ahora, a menos que se me esté pasando algo, es todo.
|
|
||||||
|
|
||||||
---
|
|
||||||
Copyright © 2013-2014, Manuel Cortéz
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
doc/locales/de/lc_messages/twblue-documentation.mo
Normal file
BIN
doc/locales/de/lc_messages/twblue-documentation.mo
Normal file
Binary file not shown.
1843
doc/locales/de/lc_messages/twblue-documentation.po
Normal file
1843
doc/locales/de/lc_messages/twblue-documentation.po
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,178 +0,0 @@
|
|||||||
% Liste des Changements
|
|
||||||
|
|
||||||
#Attention !
|
|
||||||
|
|
||||||
Avant de poursuivre l'essai du programme, il est considéré que c'est une version de développement. Plus précisément, la version 0.42. Cela signifie qu'il n'est pas seulement possible de trouver des erreurs, mais que vous les trouverez. L'idée est de signaler le plus d'erreurs possibles afin qu'ils puisse être résolus pour les prochaines alphas.
|
|
||||||
|
|
||||||
Voici la liste des changements dans le programme. Si vous voulez lire comment l'utiliser, [voir ce document.](manual.html) Si vous voyez un lien avec un signe dièse (#) et un code qui commence par plusieurs numéro, vous voyez une erreur qui a été signalé dans le Système de suivi d'incidences. N'hésitez pas à publier vos propres erreurs et demandes d'améliorations et nouvelles fonctionnalités à travers de cet outils, disponible dans le menu Aide de TW Blue.
|
|
||||||
|
|
||||||
## Changements ajouter dans cette nouvelle version
|
|
||||||
|
|
||||||
* Correction d'une erreur qu'elle ne permettait pas d'afficher les listes avec des accents ou des caractères spéciaux dans un tampon.
|
|
||||||
* Maintenant TW blue ne devrait pas actualiser les Tweets soudainement.
|
|
||||||
* Maintenant TW blue supporte l'option "muet" de Twitter. Lorsque cette option est activée pour un utilisateur, vous ne pouvez pas voir ces tweets ni ces mentions, mais vous le suivez toujours, et vous serez en mesure de être en contact avec lui à travers de message direct. Ceci est différent de la fonction Bloquer ou Ne pas suivre, avec cette option l'utilisateur sera pas au courant que vous avez activée l'option muet. sette option se trouvent dans la boîte de dialogue des actions utilisateur de l'interface invisible, ou dans le menu Utilisateur de l'interface graphique.
|
|
||||||
* Un onglet "Audio" a été ajoutée dans la boîte de dialogue de configuration qui vous permet de sélectionner les périphériques d'entrée et de sortie, régler le volume et activer/ désactiver tous les sons pour TW Blue. D'autres options ont été déplacées depuis l'onglet "Général" vers l'onglet "Audio".
|
|
||||||
* Le fichier de configuration a été repensé. La plupart des options devront être reconfigurés à nouveau.
|
|
||||||
* Vous pouvez maintenant désactiver SAPI5 afin qu'il n'intervienne pas s'il n'y a aucun lecteur d'écran supporté en cours d'exécution.
|
|
||||||
* Dans l'onglet Général, Vous pouvez modifier manuellement la langue. Tw Blue reqiere redémarré.
|
|
||||||
* Maintenant il y a une nouvelle boîte de dialogue où vous pouvez apprendre les différents sons de TW Blue.
|
|
||||||
* Il est possible maintenant de désactiver le son et notification d'un tampon. Le reste du client fonctionnera correctement. Appuyez sur Contrôle+Windows+Maj+m (interface invisible) ou le sélectionnez depuis le menu "Tampon" (interface visible) pour basculer entre cette fonctionnalité.
|
|
||||||
* Vous pouvez maintenant rechercher par utilisateur et par tweets. Les recherches de tweets sont sauvegardées dans la configuration, tandis que ceux des utilisateurs seront supprimer lors de la fermeture. Appuyez sur Ctrl+Windows+- (tiret) (interface invisible) ou le sélectionnez depuis le menu "Application" (interface visible).
|
|
||||||
* Vous pouvez ouvrir le tampon pour voir les favoris d'un utilisateur dans le menu "Utilisateur".
|
|
||||||
* Maintenant avec Contrôle+Windows+Maj+Flèche Haut / Bas (dans l'interface graphique) et Contrôle+Windows+Flèche Haut / Bas (dans l'interface invisible), vous pouvez aller au tweet précédent ou suivant dans la conversation. Pour que cela fonctionne les tweets de la conversation doivent être dans la chronologie principale.
|
|
||||||
* Au cours d'un enregistrement audio pour ajouter, maintenant vous pouvez mettre en pause ou reprendre l'enregistrement pour sauter des parties qui peuvent générer un audio très long.
|
|
||||||
* Il est maintenant possible de charger de l'audio vers Dropbox. Pour configurer le service aller dans l'onglet "Services audio" dans la boîte de dialogue de Configuration.
|
|
||||||
* Maintenant que vous pouvez charger de l'audio vers Dropbox, dans la boîte de dialogue pour ajouter un audio vous pouvez sélectionner le service auquelle vous souhaitez charger.
|
|
||||||
* Maintenant il comprend une boîte de dialogue pour la correction orthographique pour les tweets ou messages. Les langues actuellement disponibles sont: Espagnol, Anglais, Portugais, Russe et Polonais. La langue sera sélectionnée automatiquement selon la configuration de TW Blue.
|
|
||||||
* Ajouter la lecture automatique des Tweets pour un tampon. L'activation de cette fonctionnalité peut faire que TW Blue lit automatiquement les tweets lors de l'arrivée dans les tampons qui ont cette option activée. Appuyez sur Contrôle+Windows+e pour basculer entre cette fonction.
|
|
||||||
* Dans la boîte de dialogue de Configuration maintenant vous pouvez spécifiez si vous voulez que TW Blue démarre avec l'interface invisible.
|
|
||||||
* Les URLs s'affiche dans leur version originale. Uniquement les photos de Twitter ils apparaissent toujours comme réduites, et celles qui ont été réduites manuellement avant de les envoyer dans un tweet.
|
|
||||||
|
|
||||||
## Changements ajouter dans la version 0.40
|
|
||||||
|
|
||||||
* Vous pouvez changer entre les différents paquets de sons utilisé par TW Blue et de créer vos propres sons. Chaque paquet doit être dans un répertoire par séparé dans le dossier sounds. Pour modifier le paquet de sons vous pouvez le sélectionner dans la boîte de dialogue de configuration.
|
|
||||||
* Les fichiers audio doivent être au format OGG.
|
|
||||||
* TW Blue doit être maintenant en mesure de fermer correctement.
|
|
||||||
* L'heure est écrit tenant en compte le format 12 heures (AM /P M).
|
|
||||||
* L'heure est écrit d'accord au fuseau horaire que vous avez défini dans votre compte Twitter.
|
|
||||||
* Ajout de nouvelles traductions en Portugais, Polonais et Russe. Merci les gars !
|
|
||||||
* TW Blue supprime de la configuration la chronologie de l'utilisateur qui ont changé leur noms ou supprimer leurs comptes Twitter.
|
|
||||||
* Maintenant est gérés la grande majorité des événements dans Twitter avec le tampon des événements.
|
|
||||||
* Il est maintenant possible de voir le texte des événements avec Contrôle+Maj+V (GUI) ou Contrôle+Windows+V (interface invisible).
|
|
||||||
* Gestionnaire de listes: Vous pouvez créer, modifier, supprimer, afficher une liste comme tampon dans TW Blue, ajouter et supprimer des membres d'une liste.
|
|
||||||
* Maintenant, si au démarrage de TW Blue il tente de charger une chronologie qui n'existe pas, automatiquement il la supprime de la configuration et il continue à charger normalement.
|
|
||||||
* Seuls seront chargées jusqu'à 400 following et followers pour éviter les problèmes avec l'API. Elle sera corrigée dans les versions futures.
|
|
||||||
* Pour le mode invisible, il inclus des raccourcis pour réentendre le tweet sur lequel vous êtes (Contrôle+Windows+espace) et pour copier le message dans le presse-papiers (Contrôle+Windows+c).
|
|
||||||
|
|
||||||
## Changements ajouter dans la version 0.38
|
|
||||||
|
|
||||||
* Correction d'une erreur qui empêchait en donnant l'ordre de fermer.
|
|
||||||
* Maintenant les tweets ne finissent pas par un point obligatoirement. Si le programme détecte que le tweet se termine par une lettre ou un chiffre, il va placez un point automatiquement. Si ce n'est pas le cas, il va laisser le texte tel qu'il est.
|
|
||||||
* Il est maintenant possible de charger des images aux tweets et réponses. Veuillez noter que la taille des images est mis en place par twitter.
|
|
||||||
* Pour se déplacer vers la gauche ou vers la droite en utilisant le mode invisible, maintenant il s'annonce uniquement des informations de la position dans la liste d'éléments.
|
|
||||||
* TW Blue devrait maintenant fonctionner pour Windows XP au moment de la demande d'autorisation pour l'application.
|
|
||||||
* Ajouté une nouvelle option dans la boîte de dialogue de configuration qui vous permet de revenir à vos tampons. Cela signifie que vous pouvez choisir si vous voulez voir les tweets comme jusqu'à maintenant, ou que les plus nouveaux soit placés vers le haut et les anciens vers le bas.
|
|
||||||
* Maintenant les photos peuvent être chargées aux profil de Twitter, disponible à partir de la boîte de dialogue Mettre à jour votre profil.
|
|
||||||
* Ajouté un tampon d'événements, où ils sont stockés pour le moment quelques événements qui se déroulent dans Twitter, comme suivre ou faire que quelqu'un vous suivent, marquer un favori, que un de vos tweet soit marqué comme favoris, Etc. Vous pouvez activer et désactiver ce tampon de la boîte de dialogue de configuration.
|
|
||||||
* Maintenant, vous pouvez supprimer des chronologies déjà créé qui ne contiennent pas des tweets, et il ne sera pas permit de créer des chronologies pour les utilisateurs sans tweets.
|
|
||||||
* L'interface de l'application est traduisible. Maintenant, n'importe quel utilisateur peut faire leurs propres traductions en différentes langues.
|
|
||||||
|
|
||||||
## Changements ajouter dans la version 0.36
|
|
||||||
|
|
||||||
* Les utilisateurs brésiliens pourront voir quelques messages en Portugais. (Usuários brasileiros poderão ver algumas mensagens em Português).
|
|
||||||
* Correction d'une erreur qui fait que quelques sons ils peuvent s'entendre et d'autres non. Maintenant, ils devraient s'entendre tous.
|
|
||||||
* La réconnexion aussi a reçu une correction, parce que parfois, il s'effectué de façon incorrecte et il devait s'ouvrir à nouveau l'application.
|
|
||||||
* Maintenant TW Blue permet de supprimer uniquement les chronologies avec la commande correspondante. Avant il s'affichées la boîte de dialogue peu importe dans quel tampon vous aviez été.
|
|
||||||
* Vous êtes en mesure à nouveau de voir les détails des utilisateurs avec la touche Entrée étant dans le tampon pour les following ou followers.
|
|
||||||
* À partir de cette version, il n'y a pas de support pour les bases de données.
|
|
||||||
* Vous entendrez une notification vocale lorsque quelqu'un marque comme favori un de vos tweets.
|
|
||||||
* Les following et followers sont déjà mis à jour.
|
|
||||||
* lorsque vous suivez quelqu'un, il ne se produit aucune erreur Si ne sont pas affichées les following. C'est la même chose avec les followers.
|
|
||||||
* Vous pouvez effacer un tampon en appuyant sur Maj+Supprimer dans la fenêtre visible, et Contrôle+Windows+Maj+Supprimer dans la fenêtre invisible. Ceci va vider tous les tweets dans le tampon courant.
|
|
||||||
|
|
||||||
## Changements ajouter dans la version 0.35
|
|
||||||
|
|
||||||
* Il existe un site Web officiel pour le programme, aller sur [twblue.com.mx.](http://twblue.com.mx) Dans cet espace, vous trouverez le système de suivi d'erreurs, le blog avec les dernières nouvelles, et la dernière version disponible.
|
|
||||||
* TW Blue il annonce lorsque vous êtes mentionné, et lorsque vous obtenez un message direct.
|
|
||||||
* Jaws il ne dit pas le raccourci clavier qui est appuyé dans le mode invisible. [#11](http://twblue.a12x.net/errores/view.php?id=11)
|
|
||||||
* Dans le mode invisible, les commandes Contrôle+Windows+Origine, Contrôle+Windows+Fin, Contrôle+Windows+Page Suivante et Contrôle+Windows+Page Précédente va aller vers le haut de la liste, vers la fin, 20 éléments vers le bas et 20 éléments vers le haut respectivement. [#10,](http://twblue.a12x.net/errores/view.php?id=10) [#21,](http://twblue.a12x.net/errores/view.php?id=21) [#22](http://twblue.a12x.net/errores/view.php?id=22)
|
|
||||||
* Maintenant vous pouvez lire l'audios d'Audiobook.
|
|
||||||
* Maintenant, le flux doit être connecté une fois que la machine revient d'une suspension.
|
|
||||||
* Il est possible d'enregistrer de l'audio ou charger fichiers sur SndUp.net. Si vous êtes inscrit dans cette page, vous pouvez mettre dans la configuration votre API Key pour que les fichiers se charge sur votre nom. Vous pouvez charger des fichiers Wav, OGG et MP3. Les fichiers wav ils seront récodifier en OGG.
|
|
||||||
* Si vous n'utilisez aucun lecteur d'écran, quelques actions de TW blue utilisent la synthèse vocale SAPI5.
|
|
||||||
* Il existe une version pour les architectures de 64 Bits. Merci à [@jmdaweb](https://twitter.com/jmdaweb) pour prendre le travail de faire fonctionner l'application dans cette architecture et la préparez pour sa distribution.
|
|
||||||
* Changement dans les sons du client. Merci à [@guilevi_es](https://twitter.com/guilevi_es) pour la collaboration avec le paquet de sons.
|
|
||||||
* Quelques messages du programme peuvent être traduits. Dans des futures versions la totalité de l'interface sera internationalisé.
|
|
||||||
* Et quelques correction d'erreur en plus ([#5,](http://twblue.com.mx/errores/view.php?id=5) [#7,](http://twblue.com.mx/errores/view.php?id=7) [#8,](http://twblue.com.mx/errores/view.php?id=8) [#9,](http://twblue.com.mx/errores/view.php?id=9) [#12,](http://twblue.com.mx/errores/view.php?id=12))
|
|
||||||
|
|
||||||
## Changements ajouter dans la version 0.3
|
|
||||||
|
|
||||||
* Maintenant vous pouvez mettre à jour votre profil à partir de TW Blue. [#19](http://twblue.a12x.net/issues/view.php?id=19)
|
|
||||||
* Maintenant vous pouvez créer les chronologies à nouveau et ils ne donne pas de problèmes. [#24](http://twblue.a12x.net/issues/view.php?id=24)
|
|
||||||
* Maintenant les fichiers d'erreur sont enregistrés dans le répertoire "logs".
|
|
||||||
* Lorsque vous créez une chronologie, il sera mis à jour en temps réel dès le début au lieu de le mettre à jour toutes les 2 minutes.
|
|
||||||
* Vous pouvez maintenant demander davantage d'appels à l'API qui fonctionnera pour obtenir 200 tweets chaqu'une. Un appel est équivalent à 200 éléments de la liste principal, mentions, messages directs, favoris et chronologies. Dans le fichier de configuration Vous pouvez modifier l'option dans [twitter]/max_api_calls. Il est recommandé de ne pas demander à Twitter plus de 2 appels à l'API, ou sinon vous arriverez bientôt à la limite des appels autorisés et l'application échouera.
|
|
||||||
* Lorsque vous répondez à un Tweet, c'est envoyé comme réponse au même et pas comme s'il s'agissait d'un nouveau tweet.
|
|
||||||
* L'ancien système de rapport d'erreurs il a dû être changée. À partir de cette version, vous pouvez signaler des erreurs, directement depuis l'application. L'option Signaler une erreur ouvrira une boîte de dialogue qui vous demande des détails sur votre erreur et il va envoyer le rapport automatiquement.
|
|
||||||
* Ils sont déjà supprimées les following lorsque ils ne suivent pas un utilisateur.
|
|
||||||
* Aussi les favoris, au moment de retirer un tweet comme favori, il exécutent le changement.
|
|
||||||
* Ajouté une boîte de dialogue de configuration qui permet de contrôler le nombre d'appels à l'API à exécuter, si oui ou non utiliser des bases de données, et masquer ou afficher les listes de following, followers et favoris.
|
|
||||||
* En mentionnant les tweets, les guillemets qui entourent le message maintenant sont séparés par un espace de la dernière lettre. Il en est ainsi parce qu'avant, lorsque il y avait une URL, il causé que les guillemets facent partie de l'URL en envoyant vers des sites inexistants.
|
|
||||||
* Améliorations avec quelques chronologies. Vous pouvez maintenant enregistrer une chronologie sans problèmes. Il ne devrait pas faire des erreurs.
|
|
||||||
* Maintenant, l'audio est joué seulement avec Contrôle+Entrée, tandis que l'URL s'ouvrira avec la touche Entrée.
|
|
||||||
* Le flux tentera de se reconnecter à l'échec de la connexion internet.
|
|
||||||
* Maintenant depuis les followers et following on peut mentionner un utilisateur.
|
|
||||||
* Maintenant il est fournit un mode "invisible". Sous le menu "Application", dans l'option "Masquer la fenêtre" ou en appuyant sur Contrôle+M. Pour afficher la fenêtre à nouveau appuyez sur Contrôle+Windows+M.
|
|
||||||
|
|
||||||
## Changements ajouter dans la version 0.025
|
|
||||||
|
|
||||||
Veuillez noter que lorsque un utilisateur vous ne sui pas ou vous ne suivez pas quelqu'un d'autre, la liste des following ou des followers il ne sera pas mis à jour pour le moment. Lorsque vous redémarrez le programme, si les informations son correctes ils seront afficher.
|
|
||||||
|
|
||||||
* Correction d'une erreur qui rendait impossible de fermer l'application jusqu'à ce que le programme a annoncé qu'elle était prête. [#17](http://twblue.a12x.net/issues/view.php?id=17) y [#18](http://twblue.a12x.net/issues/view.php?id=18)
|
|
||||||
* Changé la façon d'organiser les chronologies dans la configuration. Il est nécessaire de les recréer.
|
|
||||||
* Maintenant, vous pouvez envoyer un message direct aux following et followers en utilisant le bouton. Cela ne fonctionnait pas dans la version 0.02 et 0.021.
|
|
||||||
* Vous pouvez augmenter et diminuer le volume depuis la liste des followers et following.
|
|
||||||
* Dans la boîte de dialogue pour écrire un tweet peut être maintenant traduit le message à l'aide de Google Traductor. Une boîte de dialogue s'affiche pour demander les langues source et destination.
|
|
||||||
* Le menu fichier contient l'option Sortir.
|
|
||||||
* À partir de cette version ils se jouera uniquement les fichiers de'audio en appuyant sur Entrée s'ils contienne le hashtag #audio.
|
|
||||||
* Vous pouvez essayer de jouer une URL quelconque sans qui comporte le hashtag #audio en appuyant sur Contrôle+Entrée. Cette commande va tenter de reproduire la première URL trouvée.
|
|
||||||
* A été amélioré le moteur de recherche d'URLS, en rendant plus rapide la fonction et maintenant, devrait être capable de détecter toutes les URLS. [#21](http://twblue.a12x.net/issues/view.php?id=21)
|
|
||||||
* Maintenant, la boîte de dialogue qui s'affiche pour sélectionner l'utilisateur que vous souhaitez afficher les détails permet en plus de le sélectionner dans une liste, écrire le nom de l'utilisateur que vous souhaitez.
|
|
||||||
|
|
||||||
## Changements ajouter dans la version 0.02 et 0.021
|
|
||||||
|
|
||||||
* Le message qui se reproduicé lorsque vous suivez un utilisateur maintenant dit "maintenant vous suivez à x utilisateur" en lieu de "maintenant vous ne suivez pas à x utilisateur". [#5](http://twblue.a12x.net/issues/view.php?id=5)
|
|
||||||
* Lorsque vous sorter une boîte de dialogue vous demandera si vous voulez le faire. Maintenant vous sorter d'une façon beaucoup plus proprement du programme, empêchant plusieurs erreurs pendant la fermeture.
|
|
||||||
* Changement des sons pour les dm entrant et sortant. Merci à [@marcedsosa](https://twitter.com/marcedsosa) pour les nouveaux sons.
|
|
||||||
* Le Nom d'utilisateur de twitter il se lit dans le titre de la fenêtre.
|
|
||||||
* Les sons du programme aussi peuvent lire le volume depuis la configuration. Le module de sons devrait prendre moins de temps pour reproduire plusieurs des sons de l'application.
|
|
||||||
* Les actions d'augmenter et de diminuer le volume ils reproduisent un son indiquant que tant forts ça sonne.
|
|
||||||
* Il n'affichent plus les mentions de personnes qui ne vous suivent pas dans votre chronologie principal. [#1](http://twblue.a12x.net/issues/view.php?id=1)
|
|
||||||
* Vous pouvez maintenant supprimer les tweets et les messages directs. Vous ne pouvez supprimer que les tweets que vous avez écrit.
|
|
||||||
* Correction d'une erreur qui empêchait de charger correctement les différentes listes si dans quelques une d'elles ils n'y avait aucun tweet, utilisateur ou message direct. Ceci affectant surtout les comptes avec 0 favoris, 0 tweets, 0 envoyés ou 0 messages directes. [#2](http://twblue.a12x.net/issues/view.php?id=2)
|
|
||||||
* Maintenant à chaque fois qu'une nouvelle version est disponible, vous serez informé de cela. Si vous avez accès pour le télécharger, le programme va télécharger et copier tout ce dont vous avez besoin.
|
|
||||||
* Maintenant, vous pouvez obtenir la liste complète des following et followers.
|
|
||||||
* Ajouter la date du dernier tweet des followers et following.
|
|
||||||
* Les following et followers sont maintenant mis à jour en temps réel. (ToDo: Les following et followers ils ne montrent pas la date de ces dernier tweet lorsque une mise à jour est faite en temps réel. Ils le font lors du rechargement une fois redémarrée l'application).
|
|
||||||
* L'ordre des onglets il a changé. Maintenant ils sont classés en commençant par Principal, Mentions, Messages directs et Envoyés.
|
|
||||||
* Maintenant dans la liste de tweets envoyés les messages directs sont affichés lorsque le flux est chargé pour la première fois. Ceci ne était pas le cas et si l'utilisateur envoyés un DM à partir d'un autre client lorsque Tw Blue n'était pas ouvert, lors de l'ouverture de l'application il ne montré pas la dite DM. [#8](http://twblue.a12x.net/issues/view.php?id=8)
|
|
||||||
* Con Control+A, se puede seleccionar todo el texto de un mensaje. Funciona con Jaws y NVDA.
|
|
||||||
* Il y a des raccourcis clavier (détaillés dans la [Documentation)](leeme.html) pour un grand nombre d'actions qui peut faire le programme.
|
|
||||||
* Maintenant TW Blue détecte plus d'audio dans les URLS qui vienne dans les retweets, et des audio partagé à partir de Dropbox. [#3](http://twblue.a12x.net/issues/view.php?id=3)
|
|
||||||
* Inclut la documentation pour l'application et les crédits.
|
|
||||||
* Si la connexion internet s'arrête de fonctionner, le flux va essayer de se reconnecter pendant 30 minutes.
|
|
||||||
* On a écrit un document qui détaille comment utiliser le programme.
|
|
||||||
* Il a été ouvert le [Système de suivi d'incidents](http://twblue.a12x.net/issues/) où les utilisateurs peuvent signaler des erreurs et si vous le souhaitez, vous pouvez apporter de nouvelles idées pour le développement de l'application. Il existe un accès direct au formulaire réservée au rapport d'incidents dans le menu Aide.
|
|
||||||
* Il y a maintenant des crédits à partir de la version actuelle.
|
|
||||||
* Ajout d'une option dans menu Utilisateur pour afficher les détails. Cela fonctionne également si vous appuyez sur entrer sur un following ou follower.
|
|
||||||
|
|
||||||
## Changements ajouter dans la version Prealpha1
|
|
||||||
|
|
||||||
Veuillez noter que dans cette version les following et les followers ne sont pas mis à jour automatiquement. Cela s'ajoutera à une autre version. Vous ne pouvez pas également supprimer des tweet, ou DM. Tous les tweets, messages directs, mentions, favoris, followers et following lors de la mise à jour seront télécharger un maximum de 200. Bientôt ils s'ajouteront plus à la quantité lors des mises à jour. Ici les changements à partir de la première version.
|
|
||||||
|
|
||||||
* La date il s'affiche bien, selon le fuseau horaire de l'utilisateur.
|
|
||||||
* Maintenant, le curseur est placé au début lorsque vous allez à répondre ou faire un retweet.
|
|
||||||
* Si vous appuyez sur contrôle + E dans les zones d'édition, l'intégralité du message sera sélectionné.
|
|
||||||
* Quelques corrections pour la gestion des chronologies (j'ai besoin d'apporter des améliorations dans la façon de gérer cela).
|
|
||||||
* Les favoris sont mises à jour en temps réel.
|
|
||||||
* Vous entendrez un son lorsque vous passez par un tweet qui pourrait contenir un audio jouable.
|
|
||||||
* Supporte la lecture audio avec le hashtag #audio et une URL. Appuyez sur Entrée pour entendre la chanson. Appuyez sur F5 pour diminuer le volume de 5%, ou f6 pour augmenter d'un 5%. Si vous souhaitez arrêter la lecture, aller où il y a une audio, puis appuyez sur Entrée. Si le programme est incapable de reproduire quelque chose, il vous avertira. Le volume de la musique (pas pour les sons du programme pour l'instant) est enregistré dans la configuration, et le programme va le mémorisé pour la prochaine fois que vous jouez quelque chose.
|
|
||||||
* Vous pouvez voir les 200 premiers following et followers avec leurs noms d'utilisateur, nom réel et un peu d'informations utiles. Dans des futures versions vous pourrez tout voir si vous avez plus de 200. Veuillez noter que il y a des actions que vous ne pouvez pas faire avec ces utilisateurs dans la liste (par exemple, répondre ou retweet, parce qu'ils ne sont pas des tweets, sont utilisateurs), Mais oui, vous pouvez les suivre, ne pas les suivre, et faire presque tout (moins envoyer DM pour l'instant) ce que vous pourriez faire dans le menu Utilisateur.
|
|
||||||
|
|
||||||
Maintenant, il faut l'utiliser et le tester et lorsque vous trouvez une erreur, s'il vous plaît veuillez regarder dans le dossier de l'application, puis il doit générer un fichier avec le nom du fichier exécutable, mais avec une extension .log à la fin. Eh bien, c'est vital pour moi de savoir où le programme a été cassé, et vous devriez être reconnaissant si vous me l'envoyer ainsi qu'une description de ce qui était plus ou moins ce qu'ils faisaient quand l'application fait ce qu'il avait à faire. Par exemple, « j'ai essayé de m'envoyer un DM, mais la boîte de dialogue de message direct jamais elle a été ouverte". Si vous pouvez le charger vers un serveur de stockage (comme Dropbox,](https://www.dropbox.com) par exemple), et me l'envoyer soit en mentionnant à [@tw_blue2](https://twitter.com/tw_blue2) ou à [@manuelcortez00,](https://twitter.com/manuelcortez00) ce serait formidable.
|
|
||||||
|
|
||||||
Merci infiniment de l'essayer !
|
|
||||||
|
|
||||||
## Nouveautés dans la version prealpha 0
|
|
||||||
|
|
||||||
* Faire des tweets, répondre aux tweets des autres, mentionner tous les utilisateurs, lorsque il y a plus d'un dans le tweet, retweet ce qui vous plaît, ajouter ou non un commentaire au retweet et les supprimez.
|
|
||||||
* Ajouter ou supprimer des favoris un tweet.
|
|
||||||
* Réduire et élargir une URL lorsque vous écrivez un tweet ou dm (vous pouvez sélectionner quelle URL vous souhaitez réduire et élargir à partir d'une liste lorsque ils sont plus d'une).
|
|
||||||
* Ouvrir un navigateur Web avec l'URL venant dans le tweet, en appuyant sur Entrée. Lorsque il y a plusieurs URLs, vous verrez une liste où on vous demandera la quelles vous voulez.
|
|
||||||
* Utilisateurs: Vous pouvez Suivre, Ne pas suivre, Signaler comme spam, Bloquer et Envoyer un message direct aux utilisateurs.
|
|
||||||
* Vous pouvez ouvrir et supprimer des chronologies individuels pour chaque utilisateur.
|
|
||||||
* Vous pourrez aussi voir vos favoris.
|
|
||||||
* Et pour l'instant, à moins qu'il m'arrive d'oublier quelque chose, c'est tout.
|
|
||||||
|
|
||||||
---
|
|
||||||
Copyright © 2013-2014, Manuel Cortéz
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,287 +0,0 @@
|
|||||||
% Documentation pour TW Blue 0.42
|
|
||||||
|
|
||||||
# Version 0.42 (alpha)
|
|
||||||
|
|
||||||
# Attention !
|
|
||||||
|
|
||||||
Vous lisez un document généré pour une application qui est en cours de développement. Le but de ce manuel est de clarifier quelques détails sur le fonctionnement du programme. Veuillez noter que pour être activement développé, le logiciel peut modifier une partie de cette documentation dans un avenir relativement proche, il est donc conseillé de jeter un œil de temps à autre pour ne pas perdre toute nouvelle information.
|
|
||||||
|
|
||||||
Si vous voulez voir ce qui a changé par rapport à la version précédente, [lire la liste des nouveautés ici.](changes.html)
|
|
||||||
|
|
||||||
# TW Blue
|
|
||||||
|
|
||||||
TW Blue est une application pour utiliser Twitter de manière simple, rapide et éviter dans la mesure des possibilités, consommer trop de ressources de l'ordinateur en cours d'utilisation. Avec l'application TW Blue, vous pouvez effectuer des actions sur Twitter tels que:
|
|
||||||
|
|
||||||
* Écrire, répondre, retwitter et supprimer les tweets;
|
|
||||||
* Marquer comme favori, supprimer des favoris un tweet;
|
|
||||||
* Envoyer et supprimer des messages directs (DM);
|
|
||||||
* Voir ceux qui vous suivent et ceux que vous suivez;
|
|
||||||
* Suivre, ne pas suivre, signaler comme spam ou bloquer un utilisateur;
|
|
||||||
* Ouvrir une chronologie pour un utilisateur spécifique, ce qui permet de lire tous les tweets d'un utilisateur dans une seule liste;
|
|
||||||
* Ouvrir les URLs s'il sont présente dans un tweet ou dans un message direct;
|
|
||||||
* Lire plusieurs types de fichiers ou adresses qui contiennent de l'audio;
|
|
||||||
* Et plus encore!.
|
|
||||||
|
|
||||||
# Table des matières
|
|
||||||
|
|
||||||
Pour utiliser une application comme TW Blue qui permet de gérer un compte Twitter, vous devez d'abord être inscrit dans ce réseau social. Cette documentation n'est pas destinée à expliquer la procédure pour ce faire. Nous partirons du principe où vous avez déjà un compte avec son respectifs nom d'utilisateur et mot de passe. La documentation couvrira ces sections.
|
|
||||||
|
|
||||||
* [Autoriser l'application](#autoriser)
|
|
||||||
* [L'interface du programme](#interface)
|
|
||||||
* [Commandes](#commandes)
|
|
||||||
* [L'Interface Graphique (GUI)](#gui)
|
|
||||||
* [Boutons de l'application](#boutons)
|
|
||||||
* [La barre de Menus](#menus)
|
|
||||||
* [Menu Aplication](#app)
|
|
||||||
* [Menu Tweet](#tweet)
|
|
||||||
* [Menu Utilisateur](#utilisateur)
|
|
||||||
* [Menu Tampon](#tampon)
|
|
||||||
* [Menu Aide](#aide)
|
|
||||||
* [L'interface invisible](#interface_invisible)
|
|
||||||
* [Raccourcis Clavier pour l'interface graphique](#raccourcis)
|
|
||||||
* [Raccourcis Clavier pour l'interface invisible](#raccourcis_invisibles)
|
|
||||||
* [Listes](#listes)
|
|
||||||
* [Signaler une erreur depuis le Web](#signaler)
|
|
||||||
* [Contact](#contact)
|
|
||||||
|
|
||||||
## Autoriser l'application {#autoriser}
|
|
||||||
|
|
||||||
Tout d'abord, la première chose que vous devez faire est d'autoriser le programme afin que celui-ci puisse accéder à votre compte Twitter, et depuis il va réaliser se que vous lui demandez. Le processus d'autorisation est assez simple, et n'aura à aucun moment accès à vos données, telles que le nom d'utilisateur et mot de passe. Pour autoriser l'application, il suffit d'ouvrir le fichier principal du programme, appelé TW Blue.exe (dans certains PC, seulement se montre comme TW Blue).
|
|
||||||
|
|
||||||
Lors de l'exécution, Si vous n'avez pas déjà configuré le programme, il s'affichera une boîte de dialogue où il dit que vous serez amené à Twitter afin d'autoriser l'application dès que vous appuyez sur le bouton "OK". Pour commencer avec le processus d'autorisation il faut appuyez sur le seule bouton disponible de cette boîte de dialogue.
|
|
||||||
|
|
||||||
Ensuite, votre navigateur par défaut s'ouvre sur la page Twitter vous demandant d'autoriser l'application. Entrée votre nom d'utilisateur et mot de passe si vous n'êtes pas encore connecté, puis vous recherchez le bouton autoriser et appuyez sur celui-ci.
|
|
||||||
|
|
||||||
Lisez les instructions que vous obtiendrez si le processus est réussi. En résumé, vous recevrez un code numérique à plusieurs chiffres, que vous devez coller sur un champ d'édition ouvert par l'application sur une autre fenêtre.
|
|
||||||
|
|
||||||
Collez le code de vérification et appuyez sur la touche Entrée.
|
|
||||||
|
|
||||||
Si tout va bien, l'application commence à jouer un groupe de sons, pour vous signaler que vous mettez à jour vos données.
|
|
||||||
|
|
||||||
Lorsque le processus est terminé, le programme jouera un autre son, et le lecteur d'écran dira"prêt".
|
|
||||||
|
|
||||||
## L'interface du programme {#interface}
|
|
||||||
|
|
||||||
La meilleure façon de décrire l'interface graphique de l'application est la d'une fenêtre avec une barre de menus avec cinq menus (application, tweet, utilisateur, tampon et aide) ; une liste avec plusieurs éléments et, dans la plupart des cas, trois boutons: Tweet, Retweet et Répondre. Les actions disponibles pour chaque élément sont décrits ci-dessous.
|
|
||||||
|
|
||||||
Les éléments qui sont dans les listes peuvent être des tweets, des messages directs ou des utilisateurs. TW Blue crée différents onglets pour chaque liste, puis ces éléments peuvent être des Tweets envoyés, des Tweets reçus dans la chronologie principal, favoris ou les messages directs et chaque onglet contient un seul type de Tweet. Ces onglets sont appelés des listes ou des tampons.
|
|
||||||
|
|
||||||
Pour basculer entre les listes il faut Appuyez sur Contrôle+Tab pour aller en avant, et Contrôle+Maj+Tab pour revenir en arrière. A tout moment les lecteurs d'écran annoncera la liste vers la quelle se obtiendera le focus de l'application. Ici sont les listes de base de TW Blue, qui se présente si vous utiliser la configuration par défaut.
|
|
||||||
|
|
||||||
* Principal: Ici vont tous les tweets qui s'affichent dans la chronologie principal. Ceci sont les tweets provenant des utilisateurs que vous suivez.
|
|
||||||
* Mentions: Si un utilisateur (vous suit ou ne vous suit pas) vous mentionne sur Twitter, apparaîtra dans cette liste.
|
|
||||||
* Messages directs: Ici sont les messages directes (privés) que vous pouvez échanger uniquement avec les utilisateurs que vous suivez et qui vous suivent. Cette liste affiche uniquement les messages reçus.
|
|
||||||
* Envoyés: Dans cette liste il s'affiche tous les Tweets et les messages directs qui ont été envoyés depuis votre compte.
|
|
||||||
* Favoris: ici, vous pourrez voir tous les tweets que vous avez marqués comme favoris.
|
|
||||||
* Followers: Lorsque les utilisateurs suivent votre compte, vous les verrez dans cette liste, ainsi que quelques informations sur leur compte Twitter.
|
|
||||||
* Following: Même que pour la liste précédente, mais ce sont les utilisateurs que vous suivez.
|
|
||||||
* Événements: Un événement dans TW Blue est "quelque chose" qui se passe sur Twitter. Dans la chronologie des événements, vous pourrez voir enregistré les événements les plus courants (par exemple. Ont vous a commencé à suivre, ont vous a marqués ou supprimé un tweet des favoris, vous vous êtes abonné à une liste). Ils sont comme des petites notifications qui envoie Twitter et TW Blue l'organise dans une liste afin que vous ne manquez pas ce qui s'est passé avec votre compte.
|
|
||||||
* Chronologie d'un utilisateur: ce sont des listes, que vous pouvez créer. C'est une liste qui contient uniquement les tweets d'un utilisateur spécifique. Ils sont utilisés de sorte que vous pouvez voir les tweets réalisé par une seule personne et vous ne voulez pas regarder partout dans votre chronologie. Vous pouvez en créer autant que vous le souhaitez.
|
|
||||||
* Listes: Une liste ressemble à une chronologie, mais constitué des tweets de chaque utilisateur qui en fait partie. La liste est actuellement une fonctionnalité expérimentale de TW Blue. Si vous décidez de l'utiliser, veuillez S'il vous plaît nous contactez et nous signalez tout problème que vous rencontrez.
|
|
||||||
* Rechercher: Un tampon de recherche contient les résultats d'une recherche faites dans TW Blue. Les recherches peuvent être par tweets, au dans le cas que vous recherchez un terme dans le contenus des tweets pertinent de Twitter, ou par utilisateurs, où les résultats sont des noms d'utilisateurs de Twitter.
|
|
||||||
* Favoris d'un utilisateur: Il est possible de demander à TW Blue de vous afficher les tweets qu'un utilisateur a marqué comme favori.
|
|
||||||
|
|
||||||
Remarque: Uniquement pour cette version de TW Blue, la liste des following et followers peuvent mettre à jour jusq'à 400, ou autour de 400. Dans la prochaine version, nous proposons une méthode pour voir les following et followers pour éviter les erreurs causées par l'utilisation de l'API de Twitter, très fréquente entre les personnes avec plus de 600 following ou followers.
|
|
||||||
|
|
||||||
Veuillez noter que la configuration par défaut permet seulement d'afficher les 200 derniers tweets pour les listes principal, mentions, messages directs et chronologie d'un utilisateur. Vous pouvez le modifier dans la boîte de dialogue de configuration dans le menu Application sous Préférences. Pour la list envoyés il s'affichera les 200 derniers tweets et les 200 messages directs. Dans les versions futures ont vous permettra de modifier ce paramètre.
|
|
||||||
|
|
||||||
S'il y a une URL dans un tweet, TW Blue va essayer de l'ouvrir lorsque vous appuyez sur entrée sur celle-ci. S'il en existe plusieurs, il vous montrera une liste avec toutes les URLs afin que vous choisissez cellci que vous voulez ouvrir. Si vous êtes sur la boîte de dialogue de la liste des following ou followers, lorsque vous appuyez sur la touche entrée il s'affichera une fenêtre avec les détails de l'utilisateur sélectionné.
|
|
||||||
|
|
||||||
Si vous appuyez sur Contrôle+Entrée, TW Blue va lire un audio si disponible à partir du tweet ayants le focus système, tant qu'il existe une URL. Si le tweet a le hashtag #audio, vous entendrez un son lorsque vous passer sur lui en vous faisant alerter que se tweet contient un audio et vous pouvez essayer de le jouer. Toutefois, dans un tweet il peut manquer le hashtag mais TW Blue sera toujours capable de le jouer, tant qu'il comporte une URL avec l'audio.
|
|
||||||
|
|
||||||
## Commandes {#commandes}
|
|
||||||
|
|
||||||
À partir de la version 0.36, il existe un support pour une interface qui ne nécessite pas d'une fenêtre visible. Celle-ci peut être activé en appuyant sur Contrôle+m, ou en sélectionnant dans le menu Application l'option "Masquer la fenêtre". Cette interface est gérée complètement avec des raccourcis clavier. Ces raccourcis sont différentes de celles utilisées par l'interface graphique. chaqu'une d'entre elles peuvent utiliser uniquement les raccourcis qui lui corresponde, ce qui signifie que vous ne pourrai pas utiliser les raccourcis de l'interface invisible si vous avez activé l'interface graphique. Dans cette section il vous sera détailler tantôt l'interface graphique comme l'interface invisible.
|
|
||||||
|
|
||||||
### L'Interface Graphique (GUI) {#gui}
|
|
||||||
|
|
||||||
Voici ci-dessous une liste divisée en deux parties. D'une part, les boutons qui sont accessibles en appuyant sur Tab ou Maj + tab dans l'interface du programme et d'autre part, les différents éléments qui existent dans la barre de menus.
|
|
||||||
|
|
||||||
#### Boutons de l'application {#boutons}
|
|
||||||
|
|
||||||
* Tweet: Ce bouton ouvre la boîte de dialogue pour écrire un tweet. Le message ne doit pas dépasser au-delà de 140 caractères. Lorsque vous écrivez le caractère numéro 141, un son sera joués pour vous avertir que vous avez dépassé la limite permise par Twitter. Vous pouvez réduire ou élargir une URL si celle-ci est incluse dans votre tweet afin de gagner plus d'espace, afin que vous puissiez continuer à écrire. Pour cela, ils existes ces boutons avec ces noms. Appuyez sur entrée pour envoyer le tweet. Si tout s'est bien passé, le message sera envoyé et vous entendrez un son de confirmation. Dans le cas contraire, le lecteur d'écran indiquera un message d'erreur en anglais décrivant le problème.
|
|
||||||
* Retweet: Ce bouton s'occupe de retwitter le tweet que vous lisez. En appuyant sur ce bouton une fenêtre s'ouvre et ont vous demandera si Vous souhaitez ajouter un commentaire à ce tweet original (mentionner) ou simplement l'envoyer comme il a été écrit sans ajouter quoi que ce soit d'autre.
|
|
||||||
* Répondre: Lorsque vous visualiser un Tweet, vous pouvez répondre à l'utilisateur qui l'a écrit en cliquant sur ce bouton. Il s'ouvre la même boîte de dialogue que pour le bouton Tweet, mais avec le nom de l'utilisateur (par exemple: @utilisateur), donc il suffit d'écrire le message que vous souhaitez répondre. Si dans le tweet il y a plus d'un utilisateur mentionné, appuyez sur Maj+Tab et cliquez sur le bouton "Mentionner à tous". Lorsque vous êtes dans la liste des following ou followers, ce bouton s'appellera "Mention" à la place.
|
|
||||||
* Message direct: Exactement pareil que pour envoyer un tweet, mais c'es un message privé qui verra seulement l'utilisateur auquel vous l'envoyez. Appuyez sur Maj+Tab pour voir le destinataire de votre message. Si dans le tweet où vous étiez pour envoyer le message,il y a plus d'un utilisateur mentionné, vous pouvez naviguer avec les flèches haut et bas pour sélectionner un destinataire différent, ou écrivez manuellement le nom de l'utilisateur (sans le signe arobase).
|
|
||||||
|
|
||||||
Veuillez noter que les boutons s'affichent selon les actions qui peuvent être effectuées dans la liste où que vous soyez. Par exemple, dans la chronologie principal, mentions, envoyés, favoris et la chronologie de l'utilisateur vous verrez quatre boutons ; alors que dans la liste des messages directs seulement sera disponible le bouton "Message Direct" et "Tweet", et dans les listes following et followers, s'affichera le bouton "Tweet" et celle du "Message direct" à côté de "Mention".
|
|
||||||
|
|
||||||
#### La barre de Menus {#menus}
|
|
||||||
|
|
||||||
En haut de la fenêtre du programme, vous trouverez une barre de menus qui a les mêmes fonctions et un peu plus, d'où vous pouvez exécuter plusieurs actions dont celles mentionnées ci-dessus. La barre de menu est accessibles en appuyant sur la touche ALT, et actuellement compte avec quatre menus pour différentes actions: Application, Tweet, Utilisateur et Aide. Ci-dessous, nous décrivons les actions pour chaque menu.
|
|
||||||
|
|
||||||
##### Menu Application {#app}
|
|
||||||
|
|
||||||
* Mettre à jour le profil: Il ouvre une boîte de dialogue où vous pouvez mettre à jour une partie de vos informations sur Twitter. Nom, Localisation, URL et Description. Si vous avez déjà un de ces champs dans le profil ils sont automatiquement préremplis avec les informations existantes dans votre configuration personnelle sur Twitter. Vous pouvez également charger une photo à votre profil.
|
|
||||||
* Masquer la fenêtre: Il va désactiver l'interface graphique. Lire le paragraphe sur l'interface invisible pour plus de détails sur cette fonctionnalité.
|
|
||||||
* Rechercher: Affiche une boîte de dialogue où vous pouvez rechercher par tweets ou par utilisateurs sur Twitter.
|
|
||||||
* Gestionnaire de listes: Afin d'utiliser les listes de Twitter, vous devez d'abord les créer. Cette boîte de dialogue vous permet de voir vos listes, les modifiez, les créez, les supprimez. Éventuellement les listes seront afficher dans les tampons comme vous le feriez avec les chronologies.
|
|
||||||
* Tutoriel de sons: Ouvre une boîte de dialogue où vous verrez une liste avec les différents sons de TW blue, ainsi vous pouvez les apprendre afin de vous aider à vous familiariser avec eux et vous faciliter l'utilisation de TW Blue.
|
|
||||||
* Préférences: Ouvre une boîte de dialogue de configuration où vous pouvez contrôler certains aspects du programme. Les options ne nécessitent pas d'explication.
|
|
||||||
* Sortir: Ouvre une boîte de dialogue pour confirmer si vous souhaitez fermer le programme. Si la réponse est oui, l'application s'arrête.
|
|
||||||
|
|
||||||
##### Menu Tweet {#tweet}
|
|
||||||
|
|
||||||
* Les premiers éléments du menu sont tweet, répondre et retweet, qui correspondent aux boutons du même nom.
|
|
||||||
* Ajouter aux favoris: marque le tweet que vous visualisez comme favori.
|
|
||||||
* Supprimer des favoris: Supprime un tweet de vos favoris. Cela ne signifie pas qui sont supprimés à partir de Twitter, mais n'apparaîtra plus dans votre liste de favoris.
|
|
||||||
* Voirr tweet: Il ouvre une boîte de dialogue où vous pouvez voir le tweet, message direct, folowing ou follower sur le quelle se trouve le focus de l'application. Vous pouvez lire le texte avec les flèches. C'est la même boîte de dialogue utilisée pour écrire des tweets.
|
|
||||||
* Supprimer Tweet: Supprime le tweet ou message direct sur le quelle vous êtes, il va être supprimer définitivement de Twitter et il va être supprimer de vos listes. Veuillez noter que dans le cas des Tweets, Twitter permet uniquement de supprimer les tweets que vous avez écrit vous-même.
|
|
||||||
|
|
||||||
##### Menu Utilisateur {#utilisateur}
|
|
||||||
|
|
||||||
Veuillez noter que les six premier éléments de ce menu ouvrent la même boîte de dialogue. Cette boîte de dialogue comporte une zone d'édition où vous pouvez sélectionner l'utilisateur sur lequel vous voulez agir, bien en utilisant les flèches haut et bas ou en écrivant vous-même le nom. Puis ensuite, vous trouverez un groupe de boutons radio pour suivre, ne pas suivre, muet, désactiver muet, signaler comme spam et bloquer. Si vous choisissez l'élément Suivre dans le menu, le bouton radio Suivre dans la boîte de dialogue sera coché, et il en va de même pour les bboutons radio Ne pas suivre, Signaler comme spam et Bloquer. Appuyez sur le bouton OK pour que le programme essaye d'exécuter l'action. Si le programme ne réussit pas, vous entendrez le message d'erreur en anglais.
|
|
||||||
|
|
||||||
Les autres éléments du menu sont décrits ci-dessous:
|
|
||||||
|
|
||||||
* Message direct: La même action que le bouton.
|
|
||||||
* Ajouter à la liste: Afin de voir les tweets d'un utilisateur dans vos listes, vous devez les ajouter tout d'abord. Cette option ouvrira une boîte de dialogue où vous pouvez sélectionner l'utilisateur que vous souhaitez ajouter, ensuite il s'ouvre une autre fenêtre où vous pouvez sélectionner la liste à laquelle vous souhaitez ajouter cet utilisateur. Une fois cela fait, la liste contiendra un nouveau utilisateur et vous verrez ces tweets.
|
|
||||||
* Voir le profil de l'utilisateur: Il ouvre une boîte de dialogue qui vous permet de sélectionner l'utilisateur auquel vous souhaitez voir le profil.
|
|
||||||
* Chronologie: Il ouvre une boîte de dialogue où vous pouvez sélectionner l'utilisateur pour lequel la chronologie sera créée. En appuyant sur entrée, il sera créé. Si vous faite une chronologie pour un utilisateur qui n'a aucun Tweets, le programme échouera. Si vous créez une chronologie qui existe déjà le programme vous avertira et il ne vous permettra pas de la créer à nouveau.
|
|
||||||
* Voir les favoris: Il s'ouvre un tampon où vous pouvez voir quels tweets ont été marquer comme favori par un utilisateur spécifique.
|
|
||||||
|
|
||||||
##### Menu Tampon {#tampon}
|
|
||||||
|
|
||||||
* Muet: Rend complètement muet le tampon, afin que vous n'entendrez aucun son lorsque les nouveaux tweets arrivent.
|
|
||||||
* Lecture automatique des tweets pour ce tampon: Cette option active ou désactive la lecture automatique des Tweets. Si cell-ci est activé, le lecteur d'écran ou la voix Sapi5 (si celle-ci est activé) lit automatiquement les nouveau tweet quand ils arrivent au tampon sélectionné.
|
|
||||||
* Effacer le tampon: Il va vider tous Les éléments afficher dans ce tampon.
|
|
||||||
* Supprimer le tampon: Efface la liste sur laquelle vous êtes actuellement focalisé.
|
|
||||||
|
|
||||||
##### Menu Aide {#aide}
|
|
||||||
|
|
||||||
* Documentation: Ouvre ce fichier, où vous pouvez lire quelques concepts intéressants du programme.
|
|
||||||
* Quoi de neuf dans cette version ?: Ouvre un document avec la liste des changements de la version actuelle, jusqu'à la première version existante.
|
|
||||||
* Vérifier les mises à jour: Chaque fois que vous ouvrez le programme il recherche automatiquement les nouvelles versions. S'il y a une, il vous demandera si vous voulez la télécharger ; si vous acceptez, TW Blue va télécharger la nouvelle version puis va l'installer et il vous demandera de redémarrer le programme ; (c'est quelque chose qui fait automatiquement). Cette option vérifie les nouvelles mises à jour sans avoir à redémarrer l'application.
|
|
||||||
* Site Web de TW Blue: Accédez à notre [page d'accueil](http://twblue.com.mx) où vous pouvez trouver toutes les informations pertinentes et téléchargements pour TW Blue, et devenir une partie de la communauté.
|
|
||||||
* Signaler une erreur: Ouvre une boîte de dialogue pour signaler une erreur en remplissant deux champs d'édition. Le titre et une brève description de ce qui s'est passé. En appuyant sur le bouton "Envoyer le rapport" le rapport d'erreur sera envoyé. Si l'opération ne réussit pas, le programme affichera un message d'avertissement.
|
|
||||||
* A propos de TW Blue: Affiche les informations de version et les crédits du programme.
|
|
||||||
|
|
||||||
### Interface invisible {#interface_invisible}
|
|
||||||
|
|
||||||
Si vous appuyez sur Contrôle+M, ou si dans le menu Application vous sélectionnez "Masquer la fenêtre", vous êtes entrain d'activez une interface qui ne peut pas être utilisée de la manière habituelle, parce qu'il est invisible.
|
|
||||||
|
|
||||||
Chaque action sur l'interface invisible se fait grâce à des raccourcis clavier, même pour parcourir les listes. Finalement, on peut ouvrir les boîtes de dialogue et ceux-ci seront visibles, mais pas la fenêtre principale de l'application. Lire la section sur les raccourcis clavier de l'interface invisible pour savoir quels sont ceux que vous pouvez utiliser actuellement.
|
|
||||||
|
|
||||||
### Raccourcis clavier pour l'interface graphique {#raccourcis}
|
|
||||||
|
|
||||||
Au lieu d'utiliser les menus et les boutons, la plupart des actions peuvent être effectuées en appuyant sur une combinaison de touches. Ceux disponibles à l'heure actuelle sont décrits ci-dessous:
|
|
||||||
|
|
||||||
* Entrée: Ouvrir une URL. S'il y a plus d'une, vous obtiendrez une liste qui vous permettra de choisir celle que vous voulez. Si vous êtes sur la liste des following ou followers, il affichera les détails de l'utilisateur sélectionné.
|
|
||||||
* Contrôle+Entrée: Lire un audio si disponible si dans le Tweet il y a une URL contenant de l'audio.
|
|
||||||
* F5: Diminue de 5% le volume des sons. Ceci affecte les sons joués par le programme ainsi que l'audio que vous pouvez entendre à travers de lui.
|
|
||||||
* F6: Augmente de 5% le volume des sons de l'application.
|
|
||||||
* Contrôle+N: Ouvre la boîte de dialogue pour écrire un nouveau Tweet.
|
|
||||||
* Contrôle+M: Masque la fenêtre.
|
|
||||||
* Contrôle+Q: Ferme l'application.
|
|
||||||
* Contrôle+R: Ouvre la boîte de dialogue pour répondre un Tweet.
|
|
||||||
* Contrôle+Maj+R: Équivalent à l'action de Retweet.
|
|
||||||
* Contrôle+D: Envoyer un message direct.
|
|
||||||
* Contrôle+F: Marquer comme favori.
|
|
||||||
* Contrôle+Maj+F: Supprimer des favoris.
|
|
||||||
* Contrôle+Maj+V: Voir Tweet.
|
|
||||||
* Contrôle+S: Suivre un utilisateur.
|
|
||||||
* Contrôle+Maj+S: Ne pas suivre un utilisateur.
|
|
||||||
* Contrôle+K: Bloquer un utilisateur.
|
|
||||||
* Contrôle+Maj+K: Signaler comme spam.
|
|
||||||
* Contrôle+I: Ouvrir une chronologie d'un utilisateur.
|
|
||||||
* Contrôle+Maj+I: Supprimer une chronologie d'un utilisateur.
|
|
||||||
* Contrôle+p: Modifier le profil.
|
|
||||||
* Supprimer: Supprimer un tweet ou un message direct.
|
|
||||||
* Maj+supprimer: Vider le tampon en retirant tous les éléments. Cela ne les supprime pas de Twitter.
|
|
||||||
|
|
||||||
### Raccourcis clavier pour l'interface invisible {#raccourcis_invisibles}
|
|
||||||
|
|
||||||
Voici les raccourcis clavier que vous pouvez utiliser à partir de l'interface invisible. Veuillez noter que lorsque l'affichage de l'interface graphique est activé aucun d'entre eux peut être utilisé. Lorsque ont parle de "Windows", nous nous référons à la touche Windows de gauche.
|
|
||||||
|
|
||||||
* Contrôle+Windows+Flèche Haut: Parcourir la liste actuelle vers le haut.
|
|
||||||
* Contrôle+Windows+Flèche bas: Parcourir la liste actuelle vers le bas.
|
|
||||||
* Contrôle+Windows+Flèche Gauche: Aller à l'onglet précédent.
|
|
||||||
* Contrôle+Windows+Flèche Droite: Aller à l'onglet suivant.
|
|
||||||
* Contrôle+Windows+Origine: Aller au premier élément de la liste.
|
|
||||||
* Contrôle+Windows+Fin: Aller au dernier élément de la liste.
|
|
||||||
* Contrôle+Windows+Page Suivante: Sauter de 20 éléments vers le bas dans la liste actuelle.
|
|
||||||
* Contrôle+Windows+Page Précédente: Sauter de 20 éléments vers le haut dans la liste actuelle.
|
|
||||||
* Contrôle+Windows+Alt+Flèche Haut: Augmenter le volume de 5%.
|
|
||||||
* Contrôle+Windows+Alt+Flèche Bas: Diminuer le volume de 5%.
|
|
||||||
* Contrôle+Windows+Entrée: Ouvrir l'URL dans le tweet actuel, ou voir les détails d'un utilisateur si vous êtes dans la liste following ou follower.
|
|
||||||
* Contrôle+Windows+Alt+Entrée: Lire un audio si disponible.
|
|
||||||
* Contrôle+Windows+M: Affiche l'interface graphique, en désactivant l'interface invisible.
|
|
||||||
* Contrôle+Windows+N: Nouveau tweet.
|
|
||||||
* Contrôle+Windows+R: Répondre à un tweet.
|
|
||||||
* Contrôle+Windows+Maj+R: Retweet.
|
|
||||||
* Contrôle+Windows+D: Envoyer un message direct.
|
|
||||||
* Contrôle+Windows+Supprimer: Supprimer un tweet ou un message direct.
|
|
||||||
* Contrôle+Windows+Maj+Supprimer: Vider le tampon en retirant tous les éléments. Cela ne les supprime pas de Twitter.
|
|
||||||
* Windows+Alt+F: Marquer comme favori.
|
|
||||||
* Windows+Alt+Maj+F: Supprimer des favoris.
|
|
||||||
* Contrôle+Windows+S: Suivre un utilisateur.
|
|
||||||
* Contrôle+Windows+Maj+S: Ne pas suivre un utilisateur.
|
|
||||||
* Contrôle+Windows+Alt+N: Voir les détails d'un utilisateur.
|
|
||||||
* Contrôle+Windows+V: Voir le tweet dans une zone d'édition.
|
|
||||||
* Contrôle+Windows+I: Ouvrir une chronologie d'un utilisateur.
|
|
||||||
* Contrôle+Windows+Maj+I: Supprimer une chronologie d'un utilisateur.
|
|
||||||
* Alt+Windows+P: Modifier le profil.
|
|
||||||
* Contrôle+Windows+Espace: Voir le tweet actuel.
|
|
||||||
* Contrôle+Windows+c: Copier dans le Presse-papiers le tweet sélectionné.
|
|
||||||
* Contrôle+Windows+a: Ajouter un utilisateur à une liste.
|
|
||||||
* Contrôle+Maj+Windows+a: Supprimer l'utilisateur de la liste.
|
|
||||||
* Contrôle+Windows+Maj+M: Activer / désactiver les sons pour le tampon actuel.
|
|
||||||
* Contrôle+Windows+E: Activer ou désactiver la lecture automatique pour les tweets entrants dans le tampon actuel.
|
|
||||||
* Contrôle+Windows+Maj+Flèche Haut: Aller au tweet précédent dans la conversation.
|
|
||||||
* Contrôle+Windows+Maj+Flèche Bas: Aller au tweet suivant dans la conversation.
|
|
||||||
* Windows+Alt+M: Activer / désactiver tous les sons pour TW Blue.
|
|
||||||
* Contrôle+Windows+- (tiret): Rechercher sur Twitter.
|
|
||||||
* Contrôle+Windows+F4: Sortir du programme.
|
|
||||||
|
|
||||||
## Listes {#listes}
|
|
||||||
|
|
||||||
Une des caractéristiques plus intéressantes de Twitter sont les listes, car ils sont un moyen pour rester à jour sans avoir à lire les tweets de tous les utilisateurs que vous suivez. Avec une liste de Twitter seulement vous verrez les tweets de ces membres (ceux qui sont sur la liste). Il est similaire à une chronologie, mais pour beaucoup plus d'utilisateurs.
|
|
||||||
|
|
||||||
Dans TW blue Nous avons commencé à fournir un support pour cette fonctionnalité. Pour le moment nous allons lentement, mais il est possible d'utiliser cette fonction. Ont va vous expliquer étape par étape comment faire pour ouvrir une liste avec TW Blue.
|
|
||||||
|
|
||||||
* Tout d'abord, vous devrez aller dans le menu Application, sélectionnez "Gestionnaire de listes".
|
|
||||||
* Dans la boîte de dialogue "Gestionnaire de listes", vous verrez toutes les listes auxquelles vous êtes inscrit, à commencer par ceux que vous avez créée. Si vous ne voyez aucune liste dans cette boîte de dialogue, cela signifie que vous n'avez pas créé ou que vous n'êtes pas un membre d'une liste. C'est bien.
|
|
||||||
* Vous verrez un groupe de bouton: "Créer une nouvelle liste", "Modifier", "Effacer "et "Ouvrir dans un tampon". Le dernier d'entre eux est peut-être un peu moins explicite, c'est-à-dire il ouvrira la liste dans un nouveau tampon pour que TW Blue actualise la liste des Tweets de la même manière comme pour une chronologie.
|
|
||||||
|
|
||||||
Une fois que vous avez créé une nouvelle liste, la prochaine étape sera d'ajouter des utilisateurs à cette liste. Si vous deviez ouvrir dès maintenant une liste dans un tampon, elle sera vide et aucun tweets ne seraient présent dans cette liste. C'est pour cela que vous ne devez pas ouvrir celle-ci dans un tampon. En tout cas pas immédiatement, parce que vous n'avez pas aucun membre dans cette liste et cela signifie que lorsque les tweets sont chargés pour commencer à actualiser la liste vous ne verrez rien. Il est recommandé tout d'abord d'ajouter des utilisateurs à la liste, donc pour cela procédez comme suit:
|
|
||||||
|
|
||||||
* Lorsque vous avez fermé la boîte de dialogue "Gestionnaire de listes", et que vous naviguez entre les Tweets des utilisateurs, rechercher l'utilisateur auquel vous souhaitez ajouter à la liste.
|
|
||||||
* Une fois trouvé, cliquez sur le raccourci Windows+Contrôle+A ; ou allez dans le menu Utilisateur et sélectionnez l'option "Ajouter à la liste".
|
|
||||||
* La prochaine chose que vous verrez est une boîte de dialogue qui vous permet de sélectionner l'utilisateur, assurez-vous que c'est l'utilisateur qui est par défaut et si c'est celui-ci que vous voulez, ou changez si nécessaire. Le nom de l'utilisateur contenant le tweet que vous venez de sélectionner devrait déjà être dans la zone. Il suffit de confirmer qu'il est correcte et appuyez sur le bouton "OK".
|
|
||||||
* Une autre boîte de dialogue s'affiche, mais ici sont toutes vos listes. Sélectionner une liste. Flèche sur celle que vous voulez et appuyez sur le bouton "Ajouter".
|
|
||||||
* Pour supprimer un utilisateur d'une liste répètez la même procédure, mais appuyez sur Contrôle+Windows+Maj+A ; ou allez dans le menu Utilisateur et sélectionnez l'option "Supprimer de la liste", et, dans la boîte de dialogue qui apparaît, Choisissez la liste dont vous souhaitez supprimer l'utilisateur sélectionné et appuyez sur le bouton "Effacer".
|
|
||||||
|
|
||||||
## Signaler une erreur depuis le Web {#signaler}
|
|
||||||
|
|
||||||
Remarque: Si vous utilisez également le programme vous pouvez signaler une erreur depuis le même, en utilisant l'option dans le menu Aide. Cette procédure seulement vous demande de remplir les deux zones d'édition, et il gère le reste. Ces étapes sont rédigés pour ceux qui ne peut pas ouvrir le programme, ne l'ont pas en cours d'utilisation actuellement ou tout simplement il souhaite le signaler depuis le Web au lieu du système intégré de rapports d'erreurs.
|
|
||||||
|
|
||||||
Les choses de ce monde (oui, y compris le logiciel) sont loin de être parfait, si souvent, que vous rencontrerez des erreurs inattendues dans l'application. Mais l'intention est toujours d'améliorer, vous êtes libre (il serait formidable si vous le fassiez) de signaler les erreurs que vous vous allez y trouver dans le programme afin qu'ils puissent être réviser et éventuellement être corriger.
|
|
||||||
|
|
||||||
Pour accéder à la page Web qui est en espagnol réservée au rapport d'incidents, suivez [Ce lien.](http://twblue.com.mx/errores/bug_report_page.php) C'est une page Web qui est en espagnol avec un formulaire où vous devrez remplir plusieurs champs. Seulement trois d'entre eux sont vraiment obligatoires (ceux qui sont marqué d'un astérisque), mais entre plus de champs que vous pourriez remplir, ce sera mieux.
|
|
||||||
|
|
||||||
A titre d'information!: J'ai fait la traduction de la page en espagnol vers le français contenant les différents champs du formulaire et ce que vous devez entrer, vous le trouverez ci-dessous. Les champs marqués d'un * (astérisque) sont obligatoire!.
|
|
||||||
|
|
||||||
Voici les différents champs du formulaire et ce que vous devez entrer dans chaqu'un d'entre eux. N'oubliez pas que seulement les champs marqués d'un astérisque (*) sont obligatoires.
|
|
||||||
|
|
||||||
* Catégorie: Cette zone de liste déroulante permet de choisir à quelle catégorie est assigner l'erreur. Il peut être dans la catégorie Générale, si c'est une erreur du programme, ou de documentation, si vous avez trouvé une erreur dans ce fichier ou dans la liste des changements. Ce champ est obligatoire.
|
|
||||||
* Reproductibilité: Ici, vous devez indiquer combien il est facile ou il est difficile de reproduire l'erreur. Les options disponibles sont Inconnus, Non reproductibles, Pas essayé (par défaut), aléatoire, parfois ou toujours. Selon la question de savoir si vous pouvez reproduire l'erreur ou non, vous devez choisir le plus près à votre situation. Si vous faites une demande de fonctionnalité, ce champ n'est pas pertinent.
|
|
||||||
* Gravité: Ici vous choisissez combien elle affecte le programme. Les options disponibles sont fonctionnalités (choisissez cette option pour une demande de fonctionnalité), Trivial, Texte, Réglage, Mineur, Majeur, Incident ou Blocage. Remarquez que les options augmentent de niveau. Choisissez celui qui correspond le mieux a la situation. Si vous ne savez pas lequel choisir vous pouvez le laisser tel qu'il est.
|
|
||||||
* Priorité: Dans cette zone de liste déroulante il faut choisir en fonction de l'importance de l'erreur ou fonctionnalité demandée. Les options disponibles sont Aucun, Faible, Normale, Haute, Urgent et Immédiat.
|
|
||||||
* Sélectionner Profil: ici vous pouvez choisir la configuration d'architecture (32 ou 64 bits), et le système d'exploitation (Windows 7 pour l'instant). Si non, vous pouvez remplir les trois champs d'édition qui se trouvent dans le tableau ci-dessous avec vos informations spécifiques.
|
|
||||||
* Version du produit: Choisissez la version du programme que vous utilisez pour être en mesure de savoir où l'erreur a été générée. Dans cette zone de liste déroulante vous aurez la liste des versions dans l'ordre. Bien qu'il n'est pas obligatoire, cela aiderait beaucoup à résoudre plus rapidement l'erreur.
|
|
||||||
* Résumé: Un titre pour l'erreur, expliquant en quelques mots En quoi consiste le problème. C'est un champ d'édition obligatoire.
|
|
||||||
* Description: Ce champ est obligatoire Il vous demande de décrire plus en détail ce qui s'est passé avec le programme.
|
|
||||||
* Étapes pour reproduire: Ce champ est utilisé si vous savez comment l'application a pu générer l'erreur. Il n'est pas nécessaire, mais cela aiderait beaucoup de savoir comment le programme arrive à l'erreur afin de mieux le traquer.
|
|
||||||
* Information supplémentaire: Si vous avez un commentaire ou une remarque à ajouter, il peut aller ici. Il n'est pas obligatoire.
|
|
||||||
* Charger un fichier: Ici vous pouvez charger le fichier TW Blue.exe.log qui a été créé contenant l'erreur génèré par le programme. Il n'est pas obligatoire.
|
|
||||||
* Visibilité: Choisissez si vous voulez que l'erreur soit public ou soit privé. Par défaut il est public, et il est recommandé de le garder de cette façon.
|
|
||||||
* Envoyer le rapport: Appuyez sur le bouton figurant sur la page pour envoyer le rapport d'erreur et attendre que celui-ci soit pris en charge.
|
|
||||||
|
|
||||||
Merci beaucoup pour votre participation à signaler des erreurs et d'essayer de nouvelles fonctionnalités.
|
|
||||||
|
|
||||||
## Contact {#contact}
|
|
||||||
|
|
||||||
Si ce qui est exposé dans le présent document n'est pas suffisant, si vous voulez contribuer d'une autre manière, ou si vous voulez tout simplement entrer en contact avec le développeur de l'applications, suivez le compte Twitter, [@tw_blue2](https://twitter.com/tw_blue2) ou [@manuelcortez00.](https://twitter.com/manuelcortez00) Vous pouvez également visiter notre [Site Web à](http://twblue.com.mx)
|
|
||||||
|
|
||||||
---
|
|
||||||
Copyright © 2013-2014. Manuel Cortéz.
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,274 +0,0 @@
|
|||||||
% Guida utente TW Blue
|
|
||||||
|
|
||||||
# Versione 0.42 (alfa)
|
|
||||||
|
|
||||||
# Attenzione!
|
|
||||||
|
|
||||||
Questo manuale fa riferimento a una versione in sviluppo. L'intento del manuale è dare alcuni dettagli sul funzionamento del programma. Considerare che il programma è continuamente in sviluppo, alcune funzioni del software possono non corrispondere, è consigliabile seguire lo sviluppo per non perdere nuove informazioni.
|
|
||||||
|
|
||||||
Per leggere le novità rispetto alle precedenti versioni, [Leggi le novità quì.](changes.html)
|
|
||||||
|
|
||||||
# TW Blue
|
|
||||||
|
|
||||||
TW Blue è un'applicazione che consente di utilizzare Twitter in modo semplice, rapido, con l'utilizzo di poche risorse del computer in uso. Di seguito le azioni che puoi eseguire in Twitter attraverso TWBlue:
|
|
||||||
|
|
||||||
* Scrivere, rispondere, Ritwittare e eliminare Tweet;
|
|
||||||
* Segnare come favorito, eliminare dai favoriti un tweet;
|
|
||||||
* Inviare ed eliminare messaggi diretti (DM);
|
|
||||||
*Visualizzare i tuoi seguitori e chi stai seguendo;
|
|
||||||
* •Seguire, non seguire, riportare come spam o bloccare un utente;
|
|
||||||
* Aprire una linea temporale specifica per un utente, che permette di leggere i tweet dell'utente scelto in un unico elenco;
|
|
||||||
* Aprire collegamenti a pagine web se presenti in un tweet o nei messaggi;
|
|
||||||
* Riprodurre file o collegamenti che contengono audio;
|
|
||||||
* E ancora di più!.
|
|
||||||
|
|
||||||
# Tabella dei contenuti
|
|
||||||
|
|
||||||
Per utilizzare un client come TW Blue che permette di gestire un account Twitter, occorre esser registrati al social network. Questa documentazione non ha l'intento di spiegare la procedura per iscriversi a Twitter. Per iniziare ti occorre il tuo nome utente e password che usi per accedere al tuo account. La documentazione riguarderà queste sezioni.
|
|
||||||
|
|
||||||
* [Autorizzare l'applicazione](#autorizar)
|
|
||||||
* [L'interfaccia del programma](#interfaz)
|
|
||||||
* [Comandi](#controles)
|
|
||||||
* [Interfaccia grafica (GUI)](#gui)
|
|
||||||
* [Pulsanti dell'applicazione](#botones)
|
|
||||||
* [Menu](#menus)
|
|
||||||
* [Menu Applicazione](#app)
|
|
||||||
* [Menu Tuit](#tuit)
|
|
||||||
* [Menú Utente](#usuario)
|
|
||||||
* [Menú buffer](#buffer)
|
|
||||||
* [Menú Aiuto](#ayuda)
|
|
||||||
* [Interfaccia Invisibile](#interfaz_no_visible)
|
|
||||||
* [Shortcuts per l'interfaccia Grafica](#atajos)
|
|
||||||
* [Shortcuts per l'interfaccia invisibile](#atajos_invisibles)
|
|
||||||
* [Liste](#listas)
|
|
||||||
* [Riportare un errore](#reportar)
|
|
||||||
* [Contatti](#contacto)
|
|
||||||
|
|
||||||
## Autorizzare l'applicazione {#autorizar}
|
|
||||||
|
|
||||||
Prima di tutto, è necessario autorizzare il programma perché questo possa accedere al tuo account Twitter. Il processo di autorizzazione è abbastanza semplice, il programma non potrà in nessun momento aver accesso ai tuoi dati. Per autorizzare l'applicazione eseguire TW Blue.exe.
|
|
||||||
|
|
||||||
Al primo avvio del programma si aprirà una finestra di dialogo la quale informa che sarai collegato alla pagina di Twitter per autorizzare l'applicazione. Premere il pulsante "Accetto" per iniziare il processo di autorizzazione.
|
|
||||||
|
|
||||||
Una pagina si aprirà nel browser con la richiesta di autorizzazione. inserisci i tuoi dati di accesso, e premi il pulsante Autorizza.
|
|
||||||
|
|
||||||
Se il processo di login ha avuto esito positivo, si apre una pagina con le istruzioni proposte da Twitter. Viene visualizzato un codice alfa-numerico che si dovrà copiare e inserire nell'apposita finestra del programma.
|
|
||||||
|
|
||||||
Premi invio per accettare il codice di autorizzazione.
|
|
||||||
|
|
||||||
Se tutto è andato a buon fine, l'applicazione riproduce un set di suoni che confermano che si stanno aggiornando i tuoi dati.
|
|
||||||
|
|
||||||
Al termine, si udirà un altro suono di avvio e lo Screen Reader annuncerà "Pronto!".
|
|
||||||
|
|
||||||
|
|
||||||
## Interfaccia del programma {#interfaz}
|
|
||||||
|
|
||||||
Il modo più semplice per descrivere l'interfaccia grafica è quella di una finestra con una barra che contiene cinque menu (Applicazione, Tweet, Utente, Buffer ed Aiuto). Un elenco nel riquadro principale e, nella maggior parte dei casi, tre pulsanti; Tweet, retweet e Rispondi. Le azioni per ciascuno di questi elementi saranno descritti di seguito.
|
|
||||||
|
|
||||||
Gli elementi presenti nell'elenco possono esser Tweet, messaggi diretti o utenti. TW Blue visualizza diverse schede per vari elenchi, quindi questi elementi possono esser Tuits inviati, Tweet ricevuti nella linea temporale principale, favoriti, o messaggi diretti. Ogni scheda contiene un solo tipo di questi elementi, queste schede sono chiamate buffers.
|
|
||||||
|
|
||||||
Per selezionare i buffer premere Control+Tab o Control+Shift+Tab per retrocedere. Ogni qual volta si cambia buffer il lettore di schermo annuncia il riquadro focalizzato. Di seguito i buffer presenti in TW Blue.
|
|
||||||
|
|
||||||
* Linea Temporale: quì verranno visualizzati i Tweet nella linea temporale principale. Sono i Tweet degli utenti che stiamo seguendo attualmente.
|
|
||||||
* Menzioni: Se un utente (seguitore o meno) ti menziona in Twitter, verrà visualizzato in questo buffer il tweet.
|
|
||||||
* Messaggi Diretti: visualizza i messaggi diretti (DM privati) che puoi scambiare solo con gli utenti che segui e che ti seguono. Questo elenco visualizza solo i messaggi ricevuti.
|
|
||||||
* Inviati: visualizza i Tweet e i messaggi diretti inviati dal tuo account.
|
|
||||||
* •Favoriti: l'elenco dei tweet segnalati come favoriti.
|
|
||||||
* Followers: elenco degli utenti che ti stanno seguendo, con alcune informazioni riguardo il loro account Twitter.
|
|
||||||
* Following: elenco degli utenti che stai seguendo.
|
|
||||||
* Notifiche: alcuni eventi vengono registrati come notifiche in Twitter. In questo buffer verranno visualizzate le notifiche più comuni (per esempio qualcuno ha iniziato a seguirti, hanno segnalato o rimosso un tuo tweet come favorito, ti sei iscritto a una lista). Sono tutte le notifiche che invia twitter e TW Blue organizza in un elenco per non perderti ciò che accade al tuo account.
|
|
||||||
* Linea Temporale di un utente: è possibile creare linee temporali per specifici utenti. In questo elenco appariranno solo i tweet di uno specifico utente. Utile per cercare i tweet di una determinata persona, senza dover scorrere tutta la Linea Temporale principale. Si possono creare più linee temporali specifiche per ogni utente, a seconda delle necessità.
|
|
||||||
* Lista: Una lista È simile a una linea temporale, ma visualizza solo i tweets degli utenti che ne fanno parte. Attualmente questa caratteristica è sperimentale in TW Blue. In caso si verificano problemi con questa caratteristica, si prega di contattarci e segnalare l'errore.
|
|
||||||
* Ricerca: Un buffer contenente i risultati della ricerca con TW Blue. Le ricerche possono essere per tweets, nel caso si cerca un termine contenuto in tweet, o per utenti, dove i risultati sono i nomi utente di Twitter.
|
|
||||||
* Favoriti di un utente: è possibile visualizzare in TW Blue i tweet che un utente ha contrassegnato come preferito.
|
|
||||||
|
|
||||||
Nota: Solo per questa versione di TW Blue, l'elenco degli utenti che segui e che ti seguono si aggiorna a 400, o circa 400. Ci proponiamo per le prossime versioni un metodo per evitare gli errori della API di Twitter, segnalato da persone con più di 600 utenti che segue o che stanno seguendo.
|
|
||||||
|
|
||||||
Di default vengono visualizzati 200 tweet nel buffer principale, menzioni, messaggi diretti e linee temporali specifiche. Dal menu preferenze è possibile cambiare questa impostazione. Per gli elementi inviati verranno visualizzati gli ultimi 200 Tuits e 200 messaggi diretti. Le versioni future vi permetteranno di impostare anche questo parametro.
|
|
||||||
|
|
||||||
Se è presente un link nei tweet, TW Blue tenterà di aprirla premendo Invio. Se son presenti più collegamenti, si aprirà una finestra di dialogo per selezionare il link che si desidera aprire. Nell'elenco dei follower o following, premendo Invio verrà mostrata una finestra con i dettagli dell'utente.
|
|
||||||
|
|
||||||
Premendo Control+Invio, TW Blue riproduce l'audio inserito nel tweet selezionato, se è presente un collegamento audio. Se il tweet contiene l'etichetta #audio, verrai avisato da un suono che è possibile riprodurre l'audio. Può comunque accadere che non appare nessuna etichetta, ma TW Blue può riprodurre ugualmente l'audio, sempre che ci sia un collegamento.
|
|
||||||
|
|
||||||
## Comandi da tastiera {#controles}
|
|
||||||
|
|
||||||
Dalla versione 0.36, Vi è il supporto per un'interfaccia che non richiede una finestra visibile. Questa può esser attivata premendo Control+m, o dal menu Applicazione selezionando "Nascondi la finestra". Questa interfaccia è completamente gestita con le scorciatoie da tastiera. Queste scorciatoie sono diverse da quelle utilizzate per l'interfaccia grafica. Ogni interfaccia ha i suoi comandi specifici, ciò significa che non si possono usare i comandi dell'interfaccia grafica se è attiva l'interfaccia invisibile. Vediamo in dettaglio i comandi per l'interfaccia grafica e l'interfaccia invisibile.
|
|
||||||
|
|
||||||
### Interfaccia grafica (GUI) {#gui}
|
|
||||||
|
|
||||||
Di seguito un elenco diviso in due parti. Da una parte i pulsanti che si raggiungono premendo Tab o Shift+Tab nell'interfaccia del programma, e in secondo luogo, i diversi elementi della barra dei menu.
|
|
||||||
|
|
||||||
#### Pulsanti dell'applicazione {#botones}
|
|
||||||
|
|
||||||
* Twit: Questo pulsante apre una finestra di dialogo per digitare un tweet. Il limite è 140 caratteri, Quando si scrive il numero di carattere 141, verrà riprodotto un suono per avvisarti che hai superato il limite consentito da Twitter. È possibile accorciare o espandere un link, se vuoi includerlo,per guadagnare più spazio. Premere Invio per inviare il tweet. Se tutto è andato a buon fine, il messaggio viene inviato e si sente un suono di conferma. In caso contrario verrai avisato da un messaggio del mancato invio.
|
|
||||||
* Retweet: Reinvìa il tweet selezionato. È possibile aggiungere un commento al tweet originale (citandolo) o semplicemente inviarlo senza modifiche.
|
|
||||||
* Rispondi: È possibile rispondere al tweet selezionato premendo questo pulsante. Si apre una finestra di dialogo uguale a quella per i Tweet, con l'aggiunta del l'utente menzionato (per esempio @nomeutente). Se nel tweet ci son più utenti menzionati, premere Shift+Tab e premere il pulsante "Menziona a tutti". Nell'elenco follower e following, Questo pulsante è chiamato Menziona.
|
|
||||||
* Messaggio Diretto: come per la finestra per inviare Tweet, ma è un messaggio privato che può visualizzare solo l'utente a cui si invia. Premendo Shift+Tab si legge il destinatario del messaggio. Se nel tweet usato per richiamare il messaggio diretto sono presenti più utenti menzionati, si può navigare con le freccie per scegliere un destinatario diverso, o digitare manualmente il nome utente (senza il simbolo chiocciola).
|
|
||||||
|
|
||||||
Si noti che i pulsanti appariranno a seconda delle azioni che possono essere eseguite nel buffer focalizzato. Per esempio, nella linea temporale principale e specifica, menzioni, inviati, e preferiti verranno visualizzati i quattro pulsanti comuni. Invece nella scheda messaggi Diretti saranno presenti i pulsanti "Messaggio Diretto" e "tweet", mentre negli elenchi dei follower o following appare il pulsante "Twit" e "Messaggio Diretto" con quello "Menziona".
|
|
||||||
|
|
||||||
#### Barra del Menu {#menus}
|
|
||||||
|
|
||||||
Nella parte superiore della finestra del programma troverete una barra dei menu dal quale è possibile eseguire vari comandi compresi quegli sopra citati. Si accede al menu con il tasto Alt, attualmente sono presenti quattro menu per diverse azioni: Applicazione, Tweet, Utente e Aiuto. Di seguito si descrivono le azioni per ciascun menu.
|
|
||||||
|
|
||||||
##### Menú applicazione {#app}
|
|
||||||
|
|
||||||
* Aggiorna il profilo: apre una finestra dal quale è possibile modificare informazioni del tuo profilo in Twitter. Nome, localizzazione, indirizzo web e una descrizione. Inizialmente verranno visualizzati i dati attualmente inseriti nella tua configurazione personale di Twitter. È anche possibile inserire una foto al profilo.
|
|
||||||
* Nascondi la finestra: Disattiva l'interfaccia grafica. Leggere la sezione relativa all'interfaccia invisibile per maggiori dettagli su questa caratteristica.
|
|
||||||
* Ricerca: apre una finestra di dialogo per effettuare una ricerca per tweet o per utente in twitter.
|
|
||||||
* Gestione liste: Per utilizzare le liste di Twitter, è necessario prima crearle. Questa finestra di dialogo permette di visualizzare le tue liste, modificarle, crearne nuove, eliminarla. Le liste verranno visualizzate nell'area buffer così come sono le linee temporali.
|
|
||||||
* Tutorial dei suoni: Apre una finestra di dialogo con l'elenco dei suoni usati da TW blue, per aiutarti a famigliarizzare e facilitare l'utilizzo di TW Blue.
|
|
||||||
* Preferenze: Apre una finestra di configurazione dove è possibile controllare alcuni aspetti del programma.
|
|
||||||
* Esci: apre una finestra di dialogo per la conferma in caso si vuol uscire dal programma.
|
|
||||||
|
|
||||||
|
|
||||||
##### Menú Tweet {#tuit}
|
|
||||||
|
|
||||||
* I primi elementi del menu sono:Tweet, Rispondi e retweet, che corrispondono ai pulsanti con lo stesso nome.
|
|
||||||
* Aggiungi ai preferiti: segna il tweet selezionato come preferito.
|
|
||||||
* Rimuovi dai preferiti: Elimina un tweet dai preferiti. Questo non significa che vengono cancellati da Twitter, ma non verrà più visualizzato nell'elenco preferiti.
|
|
||||||
* Visualizza tweet: Apre una finestra per visualizzare un Tweet, un messaggio diretto selezionato . Permette di leggere il testo usando il cursore, molto simile alla finestra per scrivere Tweet.
|
|
||||||
* Elimina tweet: elimina il tweet o il messaggio diretto selezionato, rimuovendolo da Twitter e togliendolo dall'elenco. Si noti che nel caso di Tweets, Twitter consente di eliminare solo i tweet che hai scritto.
|
|
||||||
|
|
||||||
##### Menú Utente {#usuario}
|
|
||||||
|
|
||||||
Le prime sei opzioni di questo menu aprono la stessa finestra. Nel campo editazione è possibile indicare l'utente sulla quale si intende agire. Le varie azioni sono selezionabili con dei pulsanti radio. Se dal menu si sceglie Segui, nella finestra apparirà selezionato lo stesso pulsante radio, così per le altre azioni come unmute, non seguire, blocca ecc... Per accettare ed eseguire l'azione premere Invio. In caso l'azione scelta non può esser eseguita, verrai avvisato da un messaggio.
|
|
||||||
|
|
||||||
Di seguito le altre opzioni del menu Utente:
|
|
||||||
|
|
||||||
* Messaggio Diretto: la stessa azione del pulsante.
|
|
||||||
* Aggiungi alla lista: Per visualizzare i tweet di un utente nella tua lista, occorre prima aggiungerlo. Questa opzione apre una finestra di dialogo da cui è possibile selezionare l'utente che si desidera aggiungere, quindi apre un'altra finestra dove è possibile selezionare la lista a cui aggiungere l'utente. Una volta fatto, la lista conterrà un nuovo utente e visualizzerà i suoi tweet.
|
|
||||||
* Visualizza il profilo utente: Apre una finestra di dialogo in cui è possibile selezionare l'utente che si desidera vedere il profilo.
|
|
||||||
* Linea temporale: Apre una finestra da cui è possibile selezionare l'utente per il quale verrà creata una linea temporale specifica. Premendo Invio verrà creata. Se si tenta di creare una linea temporale di un utente che non ha nessun Tweet, il programma avrà esito negativo. Se una linea temporale per l'utente è già esistente verrai avvisato da un messaggio, non si possono creare linee temporali già esistenti.
|
|
||||||
* Visualizza preferiti: Apre un buffer per visualizzare i favoriti di un utente specifico
|
|
||||||
|
|
||||||
##### Menú Buffer {#buffer}
|
|
||||||
|
|
||||||
* Mute: silenzia il buffer, non verrà riprodotto nessun suono al verificarsi di nuovi eventi per questo buffer.
|
|
||||||
* Leggi automaticamente tweet per questo buffer: Questa opzione abilita o disabilita la lettura automatica di tweet. Se attivato, il lettore di schermo o SAPI5 vocale (se abilitato) leggerà i nuovi tweet quando arrivano al buffer selezionato.
|
|
||||||
* Ripulisci l'elenco: svuota gli elementi visualizzati nel buffer.
|
|
||||||
* Elimina elenco: elimina il buffer attualmente focalizzato.
|
|
||||||
|
|
||||||
##### Menú Aiuto {#ayuda}
|
|
||||||
|
|
||||||
* Documentazione: Apre questa guida per apprendere le caratteristiche e funzioni del programma.
|
|
||||||
* Cosa c'è di nuovo in questa versione?: apre un documento con l'elenco delle modifiche della versione attuale, rispetto alla prima versione.
|
|
||||||
* Ricerca di aggiornamenti: questa opzione controlla la disponibilità di aggiornamenti senza dover riavviare l'applicazione. Ogni volta che TW Blue si avvia, questo controlla automaticamente se ci sono nuove versioni. In caso di aggiornamenti verrai avisato ed apparirà una richiesta di conferma per scaricare; se si accetta, TW Blue scaricherà la nuova versione, quindi installa e riavvia il programma in automatico.
|
|
||||||
* Sito web di TW Blue: vai alla nostra Home page dove si possono trovare tutte le informazioni e download relative a TW Blue, e partecipare alla comunità.
|
|
||||||
* Riporta un errore: apre una finestra per segnalare eventuali errori compilando due campi editazione. Il titolo e una breve descrizione di ciò che è accaduto. Premendo il pulsante "Invia", il rapporto di errore verrà inviato. In caso di mancato invio, verrai avvisato da un messaggio.
|
|
||||||
* Informazioni su TW Blue: Mostra informazioni sulla versione e credits del programma.
|
|
||||||
|
|
||||||
### Interfaccia invisibile {#interfaz_no_visible}
|
|
||||||
|
|
||||||
Premendo Control+M, o dal menu Applicazione selezioni Nascondi Finestra, si attiva un'interfaccia per la quale non si usano i comandi convenzionali, è l'interfaccia invisibile.
|
|
||||||
|
|
||||||
Nell'interfaccia invisibile si possono eseguire solo comandi da tastiera, incluso quelli per scorrere gli elenchi. Potranno apparire messaggi di dialogo visibili, ma l'interfaccia principale sarà non visibile. Vai alla sezione scorciatoie da tastiera per l'interfaccia invisibile per conoscere i comandi attualmente disponibili.
|
|
||||||
|
|
||||||
### Scorciatoie da tastiera per l'interfaccia grafica {#atajos}
|
|
||||||
|
|
||||||
Oltre ai pulsanti e menu, La maggior parte delle azioni possono essere eseguite premendo una combinazione di tasti. Di seguito le shortcuts disponibili:
|
|
||||||
|
|
||||||
* Invio: Permette di aprire un link. Se in un tweet ci son più link, verrà visualizzato un elenco dei link che potrai aprire. Nell'elenco dei follower o following, visualizza dettagli dell'utente selezionato.
|
|
||||||
* Control+Invio: Riproduce l'audio contenuto nel tweet.
|
|
||||||
* F5: Diminuisce il volume (5%). Riguarda sia il volume dei suoni che dell'audio riprodotto con il programma.
|
|
||||||
* F6: aumenta il volume (5%) dei suoni dell'applicazione.
|
|
||||||
* Control+N: Apre una finestra per scrivere un nuovo Tweet.
|
|
||||||
* Control+M: Nasconde la finestra.
|
|
||||||
* Control+Q: esce dall'applicazione.
|
|
||||||
* Control+R: apre la finestra per rispondere a un tweet.
|
|
||||||
* Control+Shift+R: Equivalente all'azione Retweet.
|
|
||||||
* Control+D: Invia un messaggio diretto.
|
|
||||||
* Control+F: segna come preferito.
|
|
||||||
* Control+Shift+F: cancella dai preferiti.
|
|
||||||
* Control+Shift+V: visualizza tweet.
|
|
||||||
* Control+S: segui un utente.
|
|
||||||
* Control+Shift+S: non seguire più.
|
|
||||||
* Control+K: blocca utente.
|
|
||||||
* Control+Shift+K: riportare come Spam.
|
|
||||||
* Control+I: apre una linea temporale specifica.
|
|
||||||
* Control+Shift+I: elimina la linea temporale in uso.
|
|
||||||
* Control+p: modifica profilo.
|
|
||||||
* Delete: elimina il tweet o il messaggio diretto selezionato.
|
|
||||||
* Shift+Delete: svuota il buffer, rimuovendo tutti gli elementi ricevuti. Gli elementi non verranno rimossi da Twitter.
|
|
||||||
|
|
||||||
### Tasti di scelta rapida per l'interfaccia invisibile {#atajos_invisibles}
|
|
||||||
|
|
||||||
Queste sono le scorciatoie da tastiera che è possibile utilizzare nell'interfaccia invisibile. Si noti che quando l'interfaccia grafica è attivata nessuno di questi può essere utilizzato. Con il tasto "windows", ci riferiamo al tasto Windows di sinistra.
|
|
||||||
|
|
||||||
* Control+Windows+Freccia sù: Scorre l'elenco verso l'alto.
|
|
||||||
* Control+Windows+Freccia giù: Scorre l'elenco verso il basso.
|
|
||||||
* Control+Windows+Freccia sinistra: Passa alla scheda di sinistra.
|
|
||||||
* Control+Windows+Freccia destra: Passa alla scheda a destra.
|
|
||||||
* Control+Windows+Home: Vai alla prima voce dell'elenco.
|
|
||||||
* Control+Windows+Fine: Vai all'ultima voce dell'elenco.
|
|
||||||
* Control+Windows+pagina giù: salta 20 voci dell'elenco verso il basso.
|
|
||||||
* Control+Windows+Pagina sù: salta 20 voci dell'elenco verso l'alto.
|
|
||||||
* Control+Windows+Alt+Freccia sù: aumenta il volume del 5%.
|
|
||||||
* Control+Windows+Alt+Freccia giù: abbassa il volume del 5%.
|
|
||||||
* Control+Windows+Invio: apre un link nel tweet, apre i dettagli di un utente se ti trovi nell'elenco follower o following.
|
|
||||||
* Control+Windows+Alt+Invio: riproduce audio se disponibile.
|
|
||||||
* Control+Windows+M: visualizza l'interfaccia grafica, disattivando l'interfaccia invisibile.
|
|
||||||
* Control+Windows+N: nuovo tweet.
|
|
||||||
* Control+Windows+R: rispondi a un tweet.
|
|
||||||
* Control+Windows+Shift+R: retweet.
|
|
||||||
* Control+Windows+D: invia un messaggio diretto.
|
|
||||||
* Control+Windows+Delete: elimina un tweet o un messaggio diretto.
|
|
||||||
* Control+win+Shift+Delete: svuota buffer, rimuovendo tutte le voci fino a questo momento. Le voci non vengono eliminate da Twitter.
|
|
||||||
* Windows+Alt+F: segna come preferito.
|
|
||||||
* Windows+Alt+Shift+F: rimuovi dai preferiti.
|
|
||||||
* Control+Windows+S: segui.
|
|
||||||
* Control+Windows+Shift+S: non seguire più.
|
|
||||||
* Control+Windows+Alt+N: Visualizza i dettagli di un utente.
|
|
||||||
* Control+Windows+V: visualizza tweet.
|
|
||||||
* Control+Windows+I: Apri una linea temporale.
|
|
||||||
* Control+Windows+Shift+I: elimina una linea temporale specifica.
|
|
||||||
* Alt+Windows+P: Modifica il tuo profilo.
|
|
||||||
* Control+win+Spazio: visualizza il tweet attuale.
|
|
||||||
* Control+win+c: copia negli appunti il tweet selezionato.
|
|
||||||
* Control+windows+a: Aggiungere un utente ad una lista.
|
|
||||||
* Control+shift+windows+a: rimuovi dalla lista.
|
|
||||||
* Control+Windows+Shift+freccia sù: vai al tweet precedente nella conversazione.
|
|
||||||
* Control+Windows+freccia giù: vai al tweet successivo nella conversazione.
|
|
||||||
* Control+Windows+Shift+M: Attivare o disattivare i suoni per il buffer attuale.
|
|
||||||
* Windows+Alt+M: abilita o disabilita tutti i suoni per TW Blue.
|
|
||||||
* Control+Windows+E: attiva o disattiva la lettura automatica dei tweet nel buffer attuale.
|
|
||||||
* Control+windows+-(trattino): ricerca in Twitter.
|
|
||||||
* Control+Windows+F4: Chiude il programma.
|
|
||||||
|
|
||||||
## Le liste {#listas}
|
|
||||||
|
|
||||||
Una delle caratteristiche più interessanti di Twitter sono le liste, un modo comodo per rimanere aggiornati su alcuni argomenti specifici senza dover leggere tutti i tweet degli utenti che segui. Con una lista di Twitter vedrete soltanto i tweet dei suoi membri. Simile alla linea temporale specifica, ma può includere più utenti.
|
|
||||||
|
|
||||||
In TW blue Abbiamo cominciato a dare supporto per questa funzionalità. Lo sviluppo procede man mano, è però possibile sfruttare questa caratteristica. Spieghiamo passo passo come aprire una lista con TW Blue.
|
|
||||||
|
|
||||||
* Dal menù Aplicazione seleziona Gestione Liste.
|
|
||||||
* nel gestore Liste vengono visualizzate tutte le liste a cui sei iscritto, a partire da quelle che hai creato. Se non si vede alcun elenco in questa finestra di dialogo, significa che non ne hai creato, o non sei membro di nessuna lista.
|
|
||||||
* Vengono visualizzati alcuni pulsanti che non hanno bisogno di spiegazione: Crea nuova lista, Modifica, Elimina, apri in un buffer (apre un nuovo buffer in modo che TW Blue aggiorna l'elenco dei tweet allo stesso modo delle linee temporali).
|
|
||||||
|
|
||||||
Appena creata una nuova lista, non si dovrebbe aprire in un buffer. Non immediatamente, In quanto al principio non ci sono membri e quindi non verranno caricati tweet. Si consiglia di aggiungere persone alla lista, così come spiegato:
|
|
||||||
|
|
||||||
* Creata la lista e chiuso il Gestore Liste, cerca l'utente che desideri aggiungere alla tua lista.
|
|
||||||
* Una volta trovato, premi Control+Win+A, o dal menù Utente selezionare l'opzione "Aggiungi alla Lista".
|
|
||||||
* Appare una finestra che ti permette di selezionare l'utente da aggiungere, assicurati che quello selezionato sia quello che hai scelto, o modìficalo se necessario e premi Invio per accettare;
|
|
||||||
* Si apre un'altra finestra di dialogo dove son visualizzate tutte le tue liste. Seleziona quella al quale vuoi aggiungere l'utente e premi il pulsante Aggiungi;
|
|
||||||
* Per rimuovere un utente da una lista, si ripete lo stesso procedimento, premendo però Control+Win+Shift+A, o selezionando "Rimuovi dalla lista", e nella finestra delle liste premere "Rimuovi".
|
|
||||||
|
|
||||||
## Riportare un errore {#reportar}
|
|
||||||
|
|
||||||
Nota: Se si sta utilizzando il programma è anche possibile segnalare un errore attraverso l'apposito menu Aiuto. Questo processo richiede la semplice compilazione di due campi di editazione. Per chi vuole segnalare via Web oltre al sistema di segnalazione integrato a TW Blue, è disponibile una pagina dedicata.
|
|
||||||
|
|
||||||
Tutte le cose del mondo (sí sì, inclusi i software) son molto lontani dalla perfezione, è facile incontrare quindi imprevisti che causano errori. La buona intezione è sempre quella di migliorare, sentiti libero (o meglio, sarebbe ottimo se lo facessi) di riportare eventuali errori che incontri nel programma in modo da poterli correggere.
|
|
||||||
|
|
||||||
Per entrare nella pagina riservata alla segnalazione errori, vai a [questo link.](http://twblue.com.mx/errores/bug_report_page.php)
|
|
||||||
|
|
||||||
La pagina è in spagnolo e contiene un form da compilare. I campi contrassegnati da un * (asterisco) sono obbligatori, più campi vengono compilati meglio si può valutare l'errore.
|
|
||||||
|
|
||||||
Grazie per la partecipazione riportando errori e provando le nuove funzioni di TW Blue.
|
|
||||||
|
|
||||||
## Contatti: {#contacto}
|
|
||||||
|
|
||||||
Se ciò che viene presentato in questo documento non è sufficiente, se vuoi collaborare in altri modi, o se volete semplicemente tenervi in contatto con chi sviluppa questa applicazione segui [@tw_blue2](https://twitter.com/tw_blue2) oppure [@manuelcortez00.](https://twitter.com/manuelcortez00) Potete anche visitare il nostro [sito Web.](http://twblue.com.mx)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Copyright © 2013-2014. Manuel Cortéz.
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,285 +0,0 @@
|
|||||||
% Documentação do TW Blue 0.42
|
|
||||||
|
|
||||||
# Versão 0.42 (alpha)
|
|
||||||
|
|
||||||
# ¡Perigro!
|
|
||||||
|
|
||||||
Você está lendo um documento gerado para uma aplicação em fase de desenvolvimento. A intenção deste manual é esclarecer alguns detalhes sobre o funcionamento do programa. Note-se que sendo desenvolvido ativamente, o software pode mudar um pouco em relação a esta documentação num futuro próximo. Por isso é aconselhável dar uma olhada de vez em quando para não se perder muito.
|
|
||||||
|
|
||||||
Si quieres ver lo que ha cambiado con respecto a la versión anterior, [lee la lista de novedades aquí.](changes.html)
|
|
||||||
|
|
||||||
# TW Blue
|
|
||||||
|
|
||||||
TW Blue é um aplicativo para utilizar o Twitter de forma simples e rápida, além de evitar tanto quanto possível consumir demasiados recursos do computador. Com ele é possível realizar ações do Twitter, tais como:
|
|
||||||
|
|
||||||
* Crear, responder, reenviar y eliminar Tuits,
|
|
||||||
* Marcar como favorito, eliminar de tus favoritos un tuit,
|
|
||||||
* Enviar y eliminar mensajes directos,
|
|
||||||
* Ver tus amigos y seguidores,
|
|
||||||
* Seguir, dejar de seguir, reportar como spam y bloquear a un usuario,
|
|
||||||
* Abrir una línea temporal para un usuario, lo que permite obtener todos los Tuits de ese usuario únicamente,
|
|
||||||
* Abrir direcciones URL cuando vayan en un tuit o mensaje directo,
|
|
||||||
* Reproducir varios tipos de archivos o direcciones que contengan audio.
|
|
||||||
* Y más.
|
|
||||||
|
|
||||||
# Tabla de contenidos
|
|
||||||
|
|
||||||
Para poder utilizar una aplicación como TW Blue que te permita gestionar una cuenta de Twitter, primero tienes que estar registrado en esta red social. Esta documentación no tiene como objetivo explicar el procedimiento para hacerlo. Partiremos desde el punto que tienes una cuenta con su respectivo nombre de usuario y contraseña. La documentación cubrirá estas secciones.
|
|
||||||
|
|
||||||
* [Autorizar la aplicación](#autorizar)
|
|
||||||
* [La interfaz del programa](#interfaz)
|
|
||||||
* [Controles](#controles)
|
|
||||||
* [La interfaz gráfica (GUI)](#gui)
|
|
||||||
* [Botones de la aplicación](#botones)
|
|
||||||
* [Menús](#menus)
|
|
||||||
* [Menú aplicación](#app)
|
|
||||||
* [Menú Tuit](#tuit)
|
|
||||||
* [Menú Usuario](#usuario)
|
|
||||||
* [Menú buffer](#buffer)
|
|
||||||
* [Menú ayuda](#ayuda)
|
|
||||||
* [La interfaz No Visible](#interfaz_no_visible)
|
|
||||||
* [Atajos de Teclado para la Interfaz Gráfica](#atajos)
|
|
||||||
* [Atajos de Teclado para la Interfaz no Visible](#atajos_invisibles)
|
|
||||||
* [Listas](#listas)
|
|
||||||
* [Reportando Errores desde la web](#reportar)
|
|
||||||
* [Contacto](#contacto)
|
|
||||||
|
|
||||||
## Autorizando la aplicación {#autorizar}
|
|
||||||
|
|
||||||
Antes de nada, lo primero que se necesita es autorizar al programa para que este pueda acceder a tu cuenta de Twitter, y desde ella realizar lo que le pidas. El proceso de autorización es bastante sencillo, y en ningún momento el programa podrá tener acceso a tus datos como usuario y contraseña. Para autorizar la aplicación, solo tienes que abrir el archivo principal del programa, llamado TW Blue.exe (en algunos PC, solo se muestra como TW Blue).
|
|
||||||
|
|
||||||
Al hacerlo, si no has configurado ninguna vez el programa, se mostrará un cuadro de diálogo donde te informa que serás llevado a Twitter para autorizar la aplicación una vez pulses sobre "aceptar". Para empezar con el proceso de autorización presiona sobre el único botón de ese diálogo.
|
|
||||||
|
|
||||||
A continuación, tu navegador predeterminado se abrirá con la página de Twitter solicitándote autorizar la aplicación. Escribe, si no estás autenticado ya, tu nombre de usuario y contraseña, luego busca el botón autorizar, y presiónalo.
|
|
||||||
|
|
||||||
De la página a la que serás redirigido (si el proceso ha tenido éxito), busca las instrucciones que te proporciona Twitter. En resumen, te dará un código numérico de varios dígitos que deberás pegar en un cuadro de texto que la aplicación ha abierto en otra ventana.
|
|
||||||
|
|
||||||
Pega el código de verificación, y pulsa la tecla Intro.
|
|
||||||
|
|
||||||
Si todo ha salido bien, la aplicación empezará a reproducir un grupo de sonidos en señal que se están actualizando tus datos.
|
|
||||||
|
|
||||||
Cuando termine, el programa reproducirá otro sonido, y el lector de pantalla dirá "listo".
|
|
||||||
|
|
||||||
## La interfaz del programa {#interfaz}
|
|
||||||
|
|
||||||
La forma más simple de describir la interfaz gráfica de la aplicación es la de una ventana con una barra de menú con cinco menús (aplicación, tuit, usuario, buffer y ayuda); una lista de varios elementos y en la mayoría de los casos tres botones. Tuit, retuit y responder. Las acciones para cada uno de estos elementos serán descritas más adelante.
|
|
||||||
|
|
||||||
Los elementos que hay en las listas pueden ser Tuits, mensajes directos o usuarios. TW Blue crea diferentes pestañas para cada lista, pues estos elementos pueden ser Tuits enviados, Tuits recividos en la línea principal, favoritos, o mensajes directos, y cada pestaña tiene un solo tipo de Tuit. Estas pestañas se llaman listas o buffers.
|
|
||||||
|
|
||||||
Para cambiar entre las listas se hace presionando Control+Tab si se desea avanzar, y Control+Shift+Tab para retroceder. En todo momento los lectores de pantalla anunciarán la lista hacia la que se cambie el foco de la aplicación. Aquí están las listas básicas de TW Blue, que aparecen si se usa la configuración por defecto.
|
|
||||||
|
|
||||||
* Principal: Aquí van todos los Tuits que se muestran en la línea principal. Estos son los Tuits de los usuarios a los que sigues.
|
|
||||||
* Menciones: Si un usuario (lo sigas o no) te menciona en Twitter, lo verás en esta lista.
|
|
||||||
* Mensajes directos: Aquí están los mensajes directos (privados) que intercambias con los usuarios que sigues y te siguen. Esta lista solo muestra los mensajes recividos.
|
|
||||||
* Enviados: En esta lista se muestran todos los Tuits y mensajes directos que se han enviado desde tu cuenta.
|
|
||||||
* Favoritos: Aquí verás los Tuits que has marcado como favoritos.
|
|
||||||
* Seguidores: Cuando los usuarios sigan tu cuenta, podrás verlos en esta lista, junto con un poco de información de la cuenta.
|
|
||||||
* Amigos: Igual que la lista anterior, pero estos usuarios son a los que tú sigues.
|
|
||||||
* Eventos: Un evento en TW Blue es "algo" que pase en Twitter. En la línea de eventos, podrás ver registrados los eventos más comunes (p. Ej. Te han comenzado a seguir, han marcado o removido un tweet tuyo de los favoritos, te has suscrito a una lista). Son como pequeñas notificaciones que envía Twitter y TW Blue organiza para que no te pierdas lo que ha pasado con tu cuenta.
|
|
||||||
* Línea temporal de un usuario: Estas son listas que tú deberás crear. Es una lista que contiene únicamente los Tuits de un usuario. Se usan si algún día necesitas o quieres ver los Tuits que ha realizado solo una persona y no deseas buscar por todo tu timeline. Puedes crear tantas como usuarios necesites.
|
|
||||||
* Lista: Una lista es parecida a una línea temporal, pero compuesta por los tweets de cada usuario que forme parte de ella. De momento las listas son una característica experimental de TW Blue. Si experimentas problemas con ellas, por favor escríbenos para contárnoslo.
|
|
||||||
* Búsqueda: Un buffer de búsqueda contiene los resultados de una búsqueda hecha en TW Blue. Las búsquedas pueden ser por tuits, en cuyo caso buscas un término en los tuits relevantes de Twitter, o por usuarios, donde los resultados son nombres de usuario de Twitter.
|
|
||||||
* Favoritos de un usuario: Es posible pedirle a TW Blue que te muestre los tuits que un usuario ha marcado como favoritos.
|
|
||||||
|
|
||||||
Nota: Únicamente para esta versión de TW Blue, los amigos y seguidores actualizarán hasta 400, o cerca a los 400. En la próxima versión proporcionaremos un método para ver los amigos y seguidores sin exponerse tanto a los errores causados por el uso de la API de Twitter, muy frecuente entre personas con más de 600 amigos o seguidores.
|
|
||||||
|
|
||||||
Ten en cuenta que por defecto la configuración solo permite obtener los 200 últimos Tuits para las listas principal, menciones, mensajes directos y líneas temporales. Esto puedes cambiarlo desde el diálogo de configuración. Para los enviados se obtendrán los últimos 200 Tuits y 200 mensajes directos. En versiones futuras se permitirá ajustar este parámetro.
|
|
||||||
|
|
||||||
Si hay una dirección URL en algún tuit, TW Blue intentará abrirla cuando presiones Intro sobre ella. Si hay más de una, te mostrará una lista con todas para que selecciones la que quieras abrir. Si estás en el cuadro de diálogo de los amigos o seguidores, la tecla intro te mostrará detalles del mismo.
|
|
||||||
|
|
||||||
Si pulsas Control+Intro, TW Blue intentará reproducir el audio que tenga el tuit sobre el que está el foco del sistema, siempre que tenga una URL. Si el tuit lleva la etiqueta #audio, un sonido al pasar por él te alertará que es un audio y puedes intentar reproducirlo. No obstante, también puede que no esté etiquetado y que TW Blue pueda reproducirlo, siempre que lleve a una dirección URL donde exista audio.
|
|
||||||
|
|
||||||
## Controles {#controles}
|
|
||||||
|
|
||||||
A partir de la versión 0.36, existe soporte para una interfaz que no requiere de una ventana visible. Esta puede ser activada pulsando Control+m, o seleccionando desde el menú aplicación la opción "Esconder ventana". Esta interfaz se maneja completamente con atajos de teclado. Estos atajos son diferentes a los que se utilizan para la interfaz gráfica. Cada una de ellas podrá utilizar solo los atajos que le correspondan, lo que quiere decir que no se permitirá utilizar los atajos de la interfaz no visible si se tiene activada la interfaz gráfica. En esta sección se detallará tanto la interfaz gráfica como la no visible.
|
|
||||||
|
|
||||||
### Interfaz gráfica (GUI) {#gui}
|
|
||||||
|
|
||||||
Aquí una lista dividida en dos partes. Por un lado, los botones que encontrarás si presionas Tab o Shift+Tab en la interfaz del programa, y por otro, los diferentes elementos que hay en la barra de menú.
|
|
||||||
|
|
||||||
#### Botones de la aplicación {#botones}
|
|
||||||
|
|
||||||
* Twit: Este botón abre el diálogo para escribir un tuit. El mensaje solo debe tener 140 caracteres. Al escribir el caracter número 141, un sonido será reproducido para indicarte que te has pasado del límite permitido por Twitter. Puedes querer acortar o desacortar una URL si la incluye tu tuit a fin de ganar más espacio donde escribir, para eso están los botones con esos nombres. Pulsa Intro para enviar el tuit. Si todo sale bien, el mensaje se enviará y tú escucharás un sonido que te lo confirme, si no, el lector de pantalla te responderá con un error en inglés, que indica por qué no se ha podido enviar el mensaje.
|
|
||||||
* Retuit: Este botón se encarga de reenviar el tuit sobre el que estás leyendo. Al presionarlo se te preguntará si deseas añadirle un comentario al tuit original (citándolo) o simplemente enviarlo como se ha escrito sin añadir nada más.
|
|
||||||
* Responder: Cuando estés visualizando un Tuit, puedes responderle al usuario que lo escribió pulsando sobre este botón. Se abrirá el mismo diálogo de Tuit, pero con el nombre del usuario (por ejemplo @usuario) en el, para que solo escribas el mensaje que quieres responderle. Si en el tuit hay más de un usuario mencionado, pulsa Shift+Tab y pulsa el botón "Mencionar a todos los usuarios". Cuando estés en la lista de amigos o seguidores, este botón se llamará mencionar.
|
|
||||||
* mensaje directo: Exactamente igual que enviar un Tuit, pero es un mensaje privado que solo podrá ver el usuario al que se lo envías. Pulsa Shift+Tab para ver el destinatario de tu mensaje. Si en el Tuit donde estabas para enviar el mensaje había más de un usuario mencionado, puedes navegar con las flechas de arriba y abajo para seleccionar otro, o escribir tú mismo el usuario (sin el signo de arroba).
|
|
||||||
|
|
||||||
Ten en cuenta que los botones aparecerán según las acciones que se puedan hacer en la lista donde estés. Por ejemplo, en la línea principal, menciones, enviados, favoritos y las líneas temporales de los usuarios podrás ver los cuatro botones; mientras que en la lista de mensajes directos solo estará disponible el botón de "Mensaje Directo" y "tuit", y en las listas de amigos y seguidores, se verá el botón para "Twit" y el de "Mensaje directo" junto a "mencionar".
|
|
||||||
|
|
||||||
#### Menús {#menus}
|
|
||||||
|
|
||||||
En la parte superior de la ventana del programa podrás encontrar una barra de menú que hace las mismas cosas, y algunas cuantas más. A la barra de menú se accede presionando la tecla ALT, y cuenta en este momento con cuatro menús para diferentes acciones: Aplicación, Tuit, usuario y Ayuda. En esta sección se describen las acciones para cada uno de ellos.
|
|
||||||
|
|
||||||
##### Menú aplicación {#app}
|
|
||||||
|
|
||||||
* Actualizar Perfil: Abre un diálogo desde donde se podrá actualizar parte de tu información en Twitter. Nombre, ubicación, dirección URL y descripción. Si ya tienes alguno de estos campos actualmente en el perfil se llenarán automáticamente con lo que tiene tu configuración de Twitter. También podrás subir una foto a tu perfil.
|
|
||||||
* Esconder Ventana: Desactiva la interfaz gráfica. Lee el apartado sobre la interfaz no visible para más detalles sobre este comportamiento.
|
|
||||||
* Búsqueda: Muestra un cuadro de diálogo desde donde puedes buscar por tuits o por usuarios en twitter.
|
|
||||||
* Gestor de listas: Para poder utilizar las listas de Twitter, primero necesitarás crearlas. Este diálogo permite ver tus listas, editarlas, crearlas, borrarlas y, opcionalmente, verlas en buffers tal como lo harías con las líneas temporales.
|
|
||||||
* Tutorial de sonidos: Abre un diálogo donde verás una lista de los sonidos de TW blue, para que puedas aprenderlos y no te cueste trabajo familiarizarte con TW Blue.
|
|
||||||
* Preferencias: Abre un diálogo de configuración desde donde se pueden controlar algunos aspectos del programa. Las opciones no necesitan de explicación.
|
|
||||||
* Salir: pregunta si quieres salir o no del programa. Si la respuesta es que sí, cierra la aplicación.
|
|
||||||
|
|
||||||
##### Menú Tuit {#tuit}
|
|
||||||
|
|
||||||
* Las primeras opciones del menú son Twit, responder y retuit, que corresponden a los botones del mismo nombre.
|
|
||||||
* Marcar como favorito: Marca el tuit que estés viendo como favorito.
|
|
||||||
* Quitar tuit de favoritos: Elimina el tuit de tus favoritos. Esto no significa que se borra de Twitter, solo deja de estar en tu lista de favoritos.
|
|
||||||
* Ver Tuit: Abre un diálogo donde puedes ver el Tuit, mensaje directo, amigo o seguidor sobre el que esté el foco de la aplicación. Puedes leer el texto con los cursores. El diálogo es el mismo que el que se usa para escribir un Tuit.
|
|
||||||
* Eliminar: Elimina el Tuit o mensaje directo sobre el que estés, borrándolo definitivamente de Twitter y qitándolo de tus listas. Ten en cuenta que en el caso de los Tuits, Twitter solo permite borrar los que tú mismo has escrito.
|
|
||||||
|
|
||||||
##### Menú usuario {#usuario}
|
|
||||||
|
|
||||||
Ten en cuenta que las primeras seis opciones de este menú abren un mismo diálogo. Este diálogo tiene un cuadro de edición donde puedes seleccionar el usuario sobre el que deseas actuar, bien con los cursores arriba y abajo o escribiendo tú mismo el nombre. Después, hay un grupo de botones de radio para seguir, dejar de seguir, silenciar, des-silenciar, reportar como Spam y bloquear. Si seleccionas desde el menú la opción seguir, el botón del cuadro de diálogo estará marcado con esa opción, así como sucederá respectivamente con dejar de seguir, reportar como Spam y bloquear. Pulsa el botón Aceptar para que el programa trate de hacer lo que le pides. Si no se ha podido, escucharás el error en inglés.
|
|
||||||
|
|
||||||
A continuación se describen las opciones restantes para este menú:
|
|
||||||
|
|
||||||
* Mensaje Directo: La misma acción que el botón.
|
|
||||||
* Añadir a lista: Para que puedas ver los tweets de un usuario en tus listas, primero hay que añadirlo. Esta opción abrirá un diálogo desde donde puedes seleccionar al usuario que deseas añadir, para después abrir otra ventana donde puedes seleccionar la lista a la cual añadir a ese usuario. Una vez hecho esto, la lista contendrá un nuevo usuario y podrás ver sus tweets.
|
|
||||||
* Ver Perfil del usuario: Abre un diálogo desde donde te permite seleccionar el usuario al que quieres ver el perfil.
|
|
||||||
* Línea temporal: Abre un diálogo desde donde puedes seleccionar el usuario para el que se creará la línea temporal. Al presionar intro, se creará. Si se hace una línea temporal de un usuario que no tenga Tuits, el programa fallará. Si se crea una línea que ya existe el programa te avisará y no permitirá crearla de nuevo.
|
|
||||||
* Ver favoritos: Abre un buffer para seguir los favoritos que marca el usuario seleccionado.
|
|
||||||
|
|
||||||
##### Menú Buffer {#buffer}
|
|
||||||
|
|
||||||
* Silenciar: Silencia completamente el buffer, con lo que no escucharás sonido alguno cuando nuevos elementos aparezcan.
|
|
||||||
* Leer automáticamente tuits para este buffer: Esta opción activa o desactiva la lectura automática de tuits. Si está activada, el lector de pantalla o la voz Sapi5 (si está activada una) leerá automáticamente los nuevos tuits conforme estos vayan llegando al buffer.
|
|
||||||
* Limpiar Buffer: Vacía los elementos de este buffer.
|
|
||||||
* Eliminar buffer: Borra la lista sobre la que te encuentras actualmente.
|
|
||||||
|
|
||||||
##### Menú Ayuda {#ayuda}
|
|
||||||
|
|
||||||
* Documentación: Abre este archivo, donde puedes leer algunos conceptos interesantes del programa.
|
|
||||||
* ¿Qué hay de nuevo en esta versión?: Abre un documento con la lista de cambios desde la versión actual, hasta la primera en existencia.
|
|
||||||
* Buscar actualizaciones: Cada que se abre el programa él mismo busca automáticamente si hay una nueva versión. Si lo hay, te preguntará si quieres descargarla; si aceptas, TW Blue descargará la actualización, la instalará y te pedirá reiniciarla (algo que hace automáticamente). Esta opción comprueba si hay actualizaciones sin tener que reiniciar la aplicación.
|
|
||||||
* Sitio web de TW Blue. Ve a nuestra [página principal](http://twblue.com.mx) donde podrás encontrar toda la información y descargas relativas a TW Blue, así como participar de la comunidad.
|
|
||||||
* Reportar un error: Lanza un diálogo desde donde puedes reportar un error solo llenando un par de campos. El título y una pequeña descripción de lo que pasó. Al pulsar en "enviar" el error se reportará. Si no se ha podido el programa te mostrará un mensaje informándolo.
|
|
||||||
* Sobre TW Blue: Muestra información de créditos del programa.
|
|
||||||
|
|
||||||
### Interfaz no visible {#interfaz_no_visible}
|
|
||||||
|
|
||||||
Si presionas Control+M, o si desde el menú aplicación seleccionas esconder ventana, estarás activando una interfaz a la que no se podrá acceder por la manera convencional, porque no se ve.
|
|
||||||
|
|
||||||
En la interfaz no visible todo lo que hagas será mediante atajos de teclado, incluso para recorrer las listas. Eventualmente se abrirán diálogos y estos sí serán visibles, pero la ventana principal de la aplicación no. Ve a la sección de atajos de teclado de la interfaz no visible para saber cuales puedes usar de momento.
|
|
||||||
|
|
||||||
### Atajos de teclado para la Interfaz Gráfica {#atajos}
|
|
||||||
|
|
||||||
Además de los botones y menús, la mayoría de las acciones pueden hacerse presionando una combinación de teclado. Aquí están las existentes en este momento:
|
|
||||||
|
|
||||||
* Intro: Abrir una dirección URL. Si hay más de una podrás ver una lista que te permitirá seleccionar la que quieras. Si estás en la lista de amigos o seguidores, mostrará detalles del seleccionado.
|
|
||||||
* Control+Intro: Intenta reproducir un audio si en el Tuit hay una dirección URL.
|
|
||||||
* F5: Baja un 5% el volumen de los sonidos. Esto afecta a los sonidos que reproduce el programa y al audio que puedas escuchar a través de él.
|
|
||||||
* F6: Sube un 5% el volumen de los sonidos de la aplicación.
|
|
||||||
* Control+N: Abre el diálogo para escribir un nuevo Tuit.
|
|
||||||
* Control+M: Oculta la ventana.
|
|
||||||
* Control+Q: Sale de la aplicación.
|
|
||||||
* Control+R: Abre el diálogo para responder.
|
|
||||||
* Control+Shift+R: Equivalente a la acción Retuit.
|
|
||||||
* Control+D: Enviar mensaje directo.
|
|
||||||
* Control+F: Marcar como favorito.
|
|
||||||
* Control+Shift+F: Quitar de favoritos.
|
|
||||||
* Control+Shift+V: Ver Tuit.
|
|
||||||
* Control+S: Seguir a un usuario.
|
|
||||||
* Control+Shift+S: Dejar de seguir a un usuario.
|
|
||||||
* Control+K: Bloquear a un usuario.
|
|
||||||
* Control+Shift+K: Reportar como Spam.
|
|
||||||
* Control+I: Abrir línea temporal a un usuario.
|
|
||||||
* Control+Shift+I: Eliminar línea temporal.
|
|
||||||
* Control+p: Editar tu perfil.
|
|
||||||
* Suprimir: Eliminar tuit o mensaje directo.
|
|
||||||
* Shift+suprimir: vacía el buffer, quitando todos los elementos hasta ese entonces. Esto ocurre sin borrar nada de Twitter.
|
|
||||||
|
|
||||||
### Atajos de teclado para la Interfaz no Visible {#atajos_invisibles}
|
|
||||||
|
|
||||||
Estos son los atajos de teclado que puedes usar desde la interfaz no visible. Ten en cuenta que cuando la vista de la interfaz gráfica esté activada ninguno de ellos podrá usarse. Al decir "windows", nos estamos refiriendo a la tecla de Windows izquierda.
|
|
||||||
|
|
||||||
* Control+Windows+Flecha Arriba: Va arriba en la lista actual.
|
|
||||||
* Control+Windows+Flecha abajo: Va hacia abajo en la lista actual.
|
|
||||||
* Control+Windows+Izquierda: Se desplaza a la pestaña de la izquierda.
|
|
||||||
* Control+Windows+Derecha: Se desplaza hacia la pestaña de la derecha.
|
|
||||||
* Control+Windows+Inicio: Ir al primer elemento de la lista.
|
|
||||||
* Control+Windows+Fin: Ir al final de la lista.
|
|
||||||
* Control+Windows+Avance de página: Ir 20 elementos hacia abajo en la lista actual.
|
|
||||||
* Control+Windows+Retroceso de página: ir 20 elementos hacia arriba en la lista actual.
|
|
||||||
* Control+Windows+Alt+Flecha Arriba: Subir volumen un 5%.
|
|
||||||
* Control+Windows+Alt+Flecha Abajo: Bajar volumen un 5%.
|
|
||||||
* Control+Windows+Intro: Abrir URL en el tuit, o ver detalles del usuario si estás en la lista de amigos o seguidores.
|
|
||||||
* Control+Windows+Alt+Intro: Intentar reproducir un audio.
|
|
||||||
* Control+Windows+M: Muestra la interfaz gráfica, desactivando la no visible.
|
|
||||||
* Control+Windows+N: Hacer un nuevo Tuit.
|
|
||||||
* Control+Windows+R: Responder a un tuit.
|
|
||||||
* Control+Windows+Shift+R: Hacer un retuit.
|
|
||||||
* Control+Windows+D: Enviar un mensaje directo.
|
|
||||||
* Control+Windows+Suprimir: Eliminar un tuit o mensaje directo.
|
|
||||||
* control+win+Shift+suprimir: vacía el buffer, quitando todos los elementos hasta ese entonces. Esto ocurre sin borrar nada de Twitter.
|
|
||||||
* Windows+Alt+F: Marcar como favorito.
|
|
||||||
* Windows+Alt+Shift+F: Quitar de favoritos.
|
|
||||||
* Control+Windows+S: Seguir a un usuario.
|
|
||||||
* Control+Windows+Shift+S: Dejar de seguir a alguien.
|
|
||||||
* Control+Windows+Alt+N: Ver detalles de un usuario,
|
|
||||||
* Control+Windows+V: Ver tuit en un cuadro de texto.
|
|
||||||
* Control+Windows+I: Abrir línea temporal.
|
|
||||||
* Control+Windows+Shift+I: Eliminar línea temporal de un usuario.
|
|
||||||
* Alt+Windows+P: Editar tu perfil.
|
|
||||||
* Control+win+espacio: ver tweet actual.
|
|
||||||
* Control+win+c: Copiar tweet al portapapeles.
|
|
||||||
* Control+windows+a: Añadir a un usuario a la lista.
|
|
||||||
* Control+shift+windows+a: qitar de la lista.
|
|
||||||
* Control+Windows+Shift+Flecha arriba: Ir un tuit hacia arriba en la conversación.
|
|
||||||
* Control+Windows+Flecha Abajo: Ir un tuit hacia abajo en la conversación.
|
|
||||||
* Control+Windows+Shift+M: Activar o desactivar el sonido para el buffer actual.
|
|
||||||
* Windows+Alt+M: Activar o desactivar el silencio global de TW Blue.
|
|
||||||
* Control+Windows+E: Activar o desactivar la lectura automática de los tuits en el buffer actual.
|
|
||||||
* Control+windows+Guion: buscar en Twitter.
|
|
||||||
* Control+Windows+F4: Cerrar el programa.
|
|
||||||
|
|
||||||
## Listas {#listas}
|
|
||||||
|
|
||||||
Una de las características más interesantes de Twitter son las listas, ya que son una manera de mantenerse actualizado sin tener que leer los tweets de todos los usuarios a los que sigues. Con una lista de Twitter solo verás los tweets de sus miembros (la gente que está dentro de la lista). Es parecido a una línea temporal, pero para muchos más usuarios.
|
|
||||||
|
|
||||||
En TW blue hemos empezado a dar soporte para esta característica. De momento vamos poco a poco, pero ya es posible usar esta función. Te presentamos los pasos que hay que dar para poder tener una lista abierta en TW Blue.
|
|
||||||
|
|
||||||
* Primero necesitarás ir al gestor de listas, ubicado bajo el menú aplicación.
|
|
||||||
* en el gestor de listas podrás ver todas las listas a las que estás unido, empezando por las que tú has creado. Si no ves ninguna lista en este diálogo, significa que no has creado ni te has unido a ninguna lista. Está bien.
|
|
||||||
* Verás un grupo de botones que se explican por sí solos: Crear nueva lista, editar, eliminar, abrir en buffer (este quizá es el menos claro, se refiere a abrir un nuevo buffer para que TW Blue actualice los tweets de la lista, como cuando pasa con las líneas temporales).
|
|
||||||
|
|
||||||
Una vez que hayas creado una nueva lista, no deberías abrirla en buffer. Al menos no de inmediato, porque en este momento no tiene miembro alguno y eso significa que cuando se carguen los tweets para empezar a actualizarla no verás nada. Es recomendable primero añadir a gente a la lista, tal como sigue:
|
|
||||||
|
|
||||||
* Cuando hayas cerrado el gestor de listas y estés navegando por entre los tweets de los usuarios, busca el usuario al que quieres añadir a la lista.
|
|
||||||
* Una vez encontrado, presiona el atajo Ctrl+Win+A o ve al menú usuario y selecciona la opción "Añadir a lista".
|
|
||||||
* Lo siguiente que verás es un diálogo que te permitirá seleccionar el usuario, asegúrate que el que está como predeterminado es el que deseas, o cámbialo si es necesario, y presiona Aceptar.
|
|
||||||
* Ahora verás otro diálogo, pero aquí están todas tus listas. Selecciona una (simplemente lleva el cursor hacia ella), y presiona el botón añadir.
|
|
||||||
* Para qitar a un usuario de una lista repite el mismo proceso, pero presiona Control+Win+Shift+A o selecciona la opción "Quitar de lista", y en el diálogo de las listas presiona sobre el botón "remover".
|
|
||||||
|
|
||||||
## Reportando Errores Desde la Web {#reportar}
|
|
||||||
|
|
||||||
Nota: Si estás usando el programa también puedes reportar un error desde el mismo, usando para ello la opción del menú ayuda. Este proceso solo te pide llenar dos cuadros de edición, y se encarga del resto. Estos pasos están escritos para quienes no pueden abrir el programa, no lo tienen en uso en este momento o sencillamente quieran reportar desde la web en lugar del sistema integrado de reporte de errores.
|
|
||||||
|
|
||||||
Las cosas en este mundo (sí, incluidos los programas informáticos) están muy lejos de ser perfectas, con lo que a menudo te encontrarás con errores no previstos en la aplicación. Pero como la intención es siempre mejorar, eres libre (es más, sería genial que lo hicieras) de reportar los errores que vayas encontrando del programa para que se puedan revisar y eventualmente corregir.
|
|
||||||
|
|
||||||
Para entrar a la web de reporte de incidencias, sigue [Este enlace.](http://twblue.com.mx/errores/bug_report_page.php) Es una web con un formulario donde tienes que llenar varios campos. Solo tres de ellos son realmente obligatorios (los que tienen marcado un asterisco), pero entre más campos puedas llenar, será mejor.
|
|
||||||
|
|
||||||
Aquí están los diferentes campos del formulario y lo que deberías introducir en cada uno de ellos. Recuerda que son obligatorios solamente los campos marcados con un asterisco (*):
|
|
||||||
|
|
||||||
* Categoría: Este cuadro combinado permite seleccionar a qué categoría asignar el error. Puede ser a la categoría General, si es un error del programa, o a documentación, si has encontrado un error en este archivo o en la lista de cambios. Este campo es obligatorio.
|
|
||||||
* Reproducibilidad: Aquí deberías indicar qué tan fácil o no es de reproducir el error. Las opciones disponibles son Desconocido, No reproducible, No se ha intentado (por defecto), aleatorio, a veces o siempre. Dependiendo de si se puede reproducir el error o no, deberías indicar lo que se parezca más a tu caso. Si estás solicitando una nueva funcionalidad, no importa este cuadro combinado.
|
|
||||||
* Severidad: Aquí se selecciona que tanto afecta esto al programa. Las opciones disponibles son funcionalidad (selecciona esto para solicitar una nueva funcionalidad), Trivial, Texto, Ajuste, Menor, Mayor, fallo o bloqueo. Nota que las opciones aumentan de nivel. Selecciona lo que más creas. Si no estás seguro de que seleccionar puedes dejarlo como está.
|
|
||||||
* Prioridad: En este cuadro se selecciona la opción de acuerdo con la importancia del error o funcionalidad solicitada. Las opciones disponibles son Ninguna, baja, normal, alta, hurgente e inmediata.
|
|
||||||
* Seleccionar Perfil: Aquí puedes escojer entre la configuración de arquitectura (32 o 64 bits), y el sistema operativo (Windows siete de momento). Si no, puedes llenar los tres cuadros de edición que están en la siguiente tabla con tus datos en específico.
|
|
||||||
* Versión del producto: Selecciona la versión del programa que estás utilizando para poder averiguar donde se ha generado el error. Este cuadro combinado tendrá la lista de las versiones en orden. Si bien no es obligatorio, ayudaría mucho a resolver más rápidamente el error.
|
|
||||||
* Resumen: Un título para el error, que explique en pocas palabras qué ocurre. Es un cuadro de texto obligatorio.
|
|
||||||
* Descripción: Este campo también obligatorio, te pide que describas con más detalles qué fue lo que ha ocurrido con el programa.
|
|
||||||
* Pasos para reproducir: Este campo de texto te sirve si sabes como hacer que la aplicación genere el error. Esto no es obligatorio, pero ayudaría mucho conocer como hacer que el programa tenga este error para rastrearlo mejor.
|
|
||||||
* Información adicional: Si tienes un comentario o nota que añadir, aquí puede ir. No es obligatorio.
|
|
||||||
* Subir archivo: Puedes subir aquí el archivo TW Blue.exe.log que se creó con el error que el programa tuvo. No es obligatorio.
|
|
||||||
* Visibilidad: Selecciona si quieres que el error sea público o privado. Por defecto es público, y es recomendable que así continúe.
|
|
||||||
* Enviar reporte. Presiona aquí para publicar el error y que este sea atendido.
|
|
||||||
|
|
||||||
Muchas gracias por participar reportando errores y probando las funciones nuevas.
|
|
||||||
|
|
||||||
## Contacto {#contacto}
|
|
||||||
|
|
||||||
Si lo que se expone en este documento no es suficiente, si deseas colaborar de alguna otra forma o si simplemente deseas mantenerte en contacto con quien hace esta aplicación, sigue a la cuenta [@tw_blue2](https://twitter.com/tw_blue2) o a [@manuelcortez00.](https://twitter.com/manuelcortez00) También puedes visitar nuestro [Sitio web](http://twblue.com.mx)
|
|
||||||
|
|
||||||
---
|
|
||||||
Copyright © 2013-2014. Manuel Cortéz.
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
392
doc/strings.py
392
doc/strings.py
@@ -1,7 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import application
|
import application
|
||||||
documentation = []
|
documentation = []
|
||||||
documentation.append(_(u"""Documentation for {0} - {1}""").format(application.name, application.version))
|
documentation.append(_(u"""Documentation for TWBlue - {0}""").format(application.version))
|
||||||
# Translators: This is the new line character, don't change it in the translations.
|
# Translators: This is the new line character, don't change it in the translations.
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
@@ -13,7 +13,7 @@ documentation.append(_(u"""
|
|||||||
documentation.append(_(u"""## Warning!"""))
|
documentation.append(_(u"""## Warning!"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""You're reading documentation produced for a program still in development. The object of this manual is to explain some details of the operation of the program. Bear in mind that as the software is in the process of active development, parts of this document may change in the near future, so it is advisable to keep an eye on it from time to time to avoid missing too much out."""))
|
documentation.append(_(u"""You are reading documentation produced for a program still in development. The object of this manual is to explain some details of the operation of the program. Bear in mind that as the software is in the process of active development, parts of this user guide may change in the near future, so it is advisable to keep checking from time to time to avoid missing important information."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""If you want to see what has changed from the previous version, [read the list of updates here.](changes.html)"""))
|
documentation.append(_(u"""If you want to see what has changed from the previous version, [read the list of updates here.](changes.html)"""))
|
||||||
@@ -22,15 +22,15 @@ documentation.append(_(u"""
|
|||||||
documentation.append(_(u"""## Introduction"""))
|
documentation.append(_(u"""## Introduction"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""TW Blue is an application to make Twitter simple and fast, while using as few resources as possible. With it, you can do things like the following:"""))
|
documentation.append(_(u"""TWBlue is an application to make Twitter simple and fast, while using as few resources as possible. With TWBlue, you can do things like the following:"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""* Tweet, reply, retweet and delete tweets,"""))
|
documentation.append(_(u"""* Tweet, reply to, retweet and delete tweets,"""))
|
||||||
documentation.append(_(u"""* Mark and unmark a tweet as a favourite,"""))
|
documentation.append(_(u"""* Mark and unmark a tweet as favourite,"""))
|
||||||
documentation.append(_(u"""* Send and delete direct messages,"""))
|
documentation.append(_(u"""* Send and delete direct messages,"""))
|
||||||
documentation.append(_(u"""* See your friends and followers,"""))
|
documentation.append(_(u"""* See your friends and followers,"""))
|
||||||
documentation.append(_(u"""* Follow, unfollow, report as spam and block a user,"""))
|
documentation.append(_(u"""* Follow, unfollow, report and block a user,"""))
|
||||||
documentation.append(_(u"""* Open a user's timeline to see only their tweets,"""))
|
documentation.append(_(u"""* Open a user's timeline to see their tweets separately,"""))
|
||||||
documentation.append(_(u"""* Open URLs from a tweet or direct message,"""))
|
documentation.append(_(u"""* Open URLs from a tweet or direct message,"""))
|
||||||
documentation.append(_(u"""* Play several types of audio files from addresses,"""))
|
documentation.append(_(u"""* Play several types of audio files from addresses,"""))
|
||||||
documentation.append(_(u"""* And more."""))
|
documentation.append(_(u"""* And more."""))
|
||||||
@@ -39,172 +39,388 @@ documentation.append(_(u"""
|
|||||||
documentation.append(_(u"""## Usage"""))
|
documentation.append(_(u"""## Usage"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""In order to use an application like TW Blue which allows you to manage your Twitter account, you must first be registered on it. It's beyond the scope of this document to explain how to do so. We'll start from the premise that you have an account with its corresponding user name and password."""))
|
documentation.append(_(u"""Twitter is a social networking or micro-blogging tool which allows you to compose short status updates of your activities in 140 characters or less. Twitter is a way for friends, family and co-workers to communicate and stay connected through the exchange of quick, frequent messages. You can restrict delivery of updates to those in your circle of friends or, by default, allow anyone to access them."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""You can monitor the status of updates from your friends, family or co-workers (known as following), and they in turn can read any updates you create, (known as followers). The updates are referred to as Tweets. The Tweets are posted to your Twitter profile or Blog and are searchable using Twitter Search."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""In order to use TWBlue, you must first have created an account on the Twitter website. The process for signing up for a Twitter account is very accessible. During the account registration, you will need to choose a Twitter username. This serves two purposes. This is the method through which people will comunicate with you, but most importantly, your username and password will be required to connect TWBlue to your Twitter account. We suggest you choose a username which is memorable both to you and the people you hope will follow you."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""We'll start from the premise that you have a Twitter account with its corresponding username and password."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""### Authorising the application"""))
|
documentation.append(_(u"""### Authorising the application"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""First off, it's necessary to authorise the program so it can access your Twitter account and act on your behalf. The authorisation process is quite simple, and the program never gets data such as your username and password. In order to authorise the application, you just need to run the main executable file, called TWBlue.exe (on some computers it may appear simply as TWBlue)."""))
|
documentation.append(_(u"""First of all, it's necessary to authorise the program so it can access your Twitter account and act on your behalf. The authorisation process is quite simple, and the program never retains data such as your password. In order to authorise the application, you just need to run the main executable file, called TWBlue.exe (on some computers it may appear simply as TWBlue if Windows Explorer is not set to display file extensions). We suggest you may like to place a Windows shortcut on your Desktop pointing to this executable file for quick and easy location."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""Whether this is the first time you open TWBlue or you don't have any session, you will see the session manager. This dialog allows you to authorise as many accounts as you wish. If you press the "new account" button a dialog will tell you that your default browser will be opened in order to authorise the application. Press "yes" so the process may start."""))
|
documentation.append(_(u"""You can log into several Twitter accounts simultaneously. The program refers to each Twitter account you have configured as a "Session". If this is the first time you have launched TWBlue, and if no Twitter session exists, you will see the Session Manager. This dialogue box allows you to authorise as many accounts as you wish. If you press the Tab key to reach the "new account" button and activate it by pressing the Space Bar, a dialogue box will advise you that your default internet browser will be opened in order to authorise the application and you will be asked if you would like to continue. Activate the "yes" Button by pressing the letter "Y" so the process may start."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""Your default browser will open on the Twitter page to request authorisation. Enter your user name and password if you're not already logged in, look for the authorise button, and press it."""))
|
documentation.append(_(u"""Your default browser will open on the Twitter page to request authorisation. Enter your username and password into the appropriate edit fields if you're not already logged in, select the authorise button, and press it."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""Once you've authorised your twitter account, Twitter will redirect you to a web page which will notify you that TWBlue has been authorised successfully. Now you are able to close that window and come back to the session manager. You will see on the session list a new item temporally called "Authorised account x" -where x is a number. The session name will change once you open that session."""))
|
documentation.append(_(u"""Once you've authorised your twitter account, the website will redirect you to a page which will notify you that TWBlue has been authorised successfully. Now you are able to close the page by pressing ALT+F4 which will return you to the Session Manager. On the session list, you will see a new item temporarily called "Authorised account x" -where x is a number. The session name will change once you open that session."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""To start running TWBlue, press the Ok button in the session manager dialog. By default, TWBlue starts all the configured sessions, however, you can change this behavior."""))
|
documentation.append(_(u"""To start running TWBlue, press the Ok button in the Session Manager dialogue. By default, the program starts all the configured sessions automatically, however, you can change this behavior."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""If all went well, the application will start playing sounds, indicating your data are being updated."""))
|
documentation.append(_(u"""If all went well, the application will start playing sounds, indicating your data is being updated."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""When the process is finished, the program will play another sound, and the screen reader will say "ready"."""))
|
documentation.append(_(u"""When the process is finished, by default the program will play another sound, and the screen reader will say "ready" (this behaviour can be configured)."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""## The program's interface"""))
|
documentation.append(_(u"""## General concepts"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""The easiest way to describe the graphical user interface of TWBlue is saying that the application has a window which contains a menu bar with five menus (application, tweet, user, buffer and help); one tree view, one list of items and, mostly in every case, three buttons: Tweet, retweet and reply. The actions that are available for every item will be described later."""))
|
documentation.append(_(u"""Before starting to describe TWBlue's usage, we'll explain some concepts that will be used extensively throughout this manual."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""In the tree view are inserted buffers which are lists to manage the processed data. When you configure a new session on TWBlue and start it, your account is the root of the tree view. Inside of it many buffers are created. Each one of them may contain some of the items which TWBlue works with: Tweets, direct messages, users, trends or events. According to the buffer you were, you will be able to make different actions with these items."""))
|
documentation.append(_(u"""### Buffer"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""The following is a description for every kind of TWBlue's buffer and the kind of items they work with."""))
|
documentation.append(_(u"""A buffer is a list of items to manage the data which arrives from Twitter, after being processed by the application. When you configure a new session on TWBlue and start it, many buffers are created. Each of them may contain some of the items which this program works with: Tweets, direct messages, users, trends or events. According to the buffer you are focusing, you will be able to do different actions with these items."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""* Home: it shows all the tweets on the main timeline. These are the tweets by users you follow."""))
|
documentation.append(_(u"""The following is a description for every one of TWBlue's buffers and the kind of items they work with."""))
|
||||||
documentation.append(_(u"""* Mentions: if a user, whether you follow them or not, mentions you on Twitter, you will find it on this list."""))
|
documentation.append(_(u"""
|
||||||
documentation.append(_(u"""* Direct messages: here go the private direct messages you exchange with users you follow and who follow you back. This list only shows received messages."""))
|
"""))
|
||||||
documentation.append(_(u"""* Sent: it shows all the tweets and direct messages sent from your account."""))
|
documentation.append(_(u"""* Home: this shows all the tweets on the main timeline. These are the tweets by users you follow."""))
|
||||||
documentation.append(_(u"""* Favourites: here you will see all tweets you have favourited."""))
|
documentation.append(_(u"""* Mentions: if a user, whether you follow them or not, mentions you on Twitter, you will find it in this list."""))
|
||||||
documentation.append(_(u"""* Followers: when users follow you, you'll be able to see them on this list, with some of their account information."""))
|
documentation.append(_(u"""* Direct messages: here you will find the private direct messages you exchange with users who follow you , or with any user, if you allow direct messages from everyone (this setting is configurable from Twitter). This list only shows received messages."""))
|
||||||
documentation.append(_(u"""* Friends: the same as the previous list, but these are the users you follow."""))
|
documentation.append(_(u"""* Sent direct messages: this buffer shows all the direct messages sent from your account."""))
|
||||||
documentation.append(_(u"""* User timelines: these are lists you may create. They contain only the tweets by a specific user. They're used so you can see the tweets by a single person and you don't want to look all over your timeline. You may create as many as you like."""))
|
documentation.append(_(u"""* Sent tweets: this shows all the tweets sent from your account."""))
|
||||||
documentation.append(_(u"""* Events: An event is anything that happens on Twitter, such as when someone follows you, when someone adds or removes one of your tweets from their favorites list, or when you subscribe to a list. There are many more but TW Blue shows the most common ones in the events buffer so that you can easily keep track of what is happening on your account."""))
|
documentation.append(_(u"""* Favourites: here you will see all the tweets you have favourited."""))
|
||||||
documentation.append(_(u"""* Lists: A list is similar to a temporary timeline, except that you can configure it to contain tweets from multiple users."""))
|
documentation.append(_(u"""* Followers: when users follow you, you'll be able to see them on this buffer, with some of their account details."""))
|
||||||
|
documentation.append(_(u"""* Friends: the same as the previous buffer, but these are the users you follow."""))
|
||||||
|
documentation.append(_(u"""* User timelines: these are buffers you may create. They contain only the tweets by a specific user. They're used so you can see the tweets by a single person and you don't want to look all over your timeline. You may create as many as you like."""))
|
||||||
|
documentation.append(_(u"""* Events: An event is anything that happens on Twitter, such as when someone follows you, when someone adds or removes one of your tweets from their favourites list, or when you subscribe to a list. There are many more, but the program shows the most common ones in the events buffer so that you can easily keep track of what is happening on your account."""))
|
||||||
|
documentation.append(_(u"""* Lists: A list is similar to a user timeline, except that you can configure it to contain tweets from multiple users."""))
|
||||||
documentation.append(_(u"""* Search: A search buffer contains the results of a search operation."""))
|
documentation.append(_(u"""* Search: A search buffer contains the results of a search operation."""))
|
||||||
documentation.append(_(u"""* User favorites: You can have TW Blue create a buffer containing tweets favorited by a particular user."""))
|
documentation.append(_(u"""* User favourites: You can have the program create a buffer containing tweets favourited by a particular user."""))
|
||||||
documentation.append(_(u"""* Trending Topics: a trend buffer shows the top ten most used terms in a geographical region. This region may be a country or a city. Trends are updated every five minutes."""))
|
documentation.append(_(u"""* Trending Topics: a trend buffer shows the top ten most used terms in a geographical region. This region may be a country or a city. Trends are updated every five minutes."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""If there's a URL on a tweet, TW Blue will try to open it when you press enter on it. If there are several, it will show you a list with all of them so you choose the one you want. If you're on the followers or friends buffer, the enter key will show you additional information about them."""))
|
documentation.append(_(u"""If a tweet contains a URL, you can press enter in the GUI or Control + Windows + Enter in the invisible interface to open it. If it contains audio, you can press Control + Enter or Control + Windows + Alt + Enter to play it, respectively. TWBlue will play a sound if the tweet contains the #audio hashtag, but there may be tweets which contain audio without this. Finally, if a tweet contains geographical information, you can press Control + Windows + G in the invisible interface to retrieve it."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""If you press control-enter, TW Blue will try to play the audio from the focused tweet, as long as it has a URL. If it has the #audio hashtag, you will hear a sound when it is selected, letting you know you can try to play it. However, a tweet can be missing the hashtag and TW Blue will still be able to play it so long as it contains a URL with audio."""))
|
documentation.append(_(u"""### Username fields"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""You will also hear a sound when you see any tweet containing geographical information. You can see someone's location by selecting the option "view address" from the tweet menu on the menu bar."""))
|
documentation.append(_(u"""These fields accept a Twitter username (without the at sign) as the input. They are present in the send direct message and the user actions dialogue boxes. Those dialogues will be discussed later. The initial value of these fields depends on where they were opened from. They are prepopulated with the username of the sender of the focused tweet (if they were opened from the home and sent timelines, from users' timelines or from lists), the sender of the focused direct message (if from the received or sent direct message buffers) or in the focused user (if from the followers' or friends' buffer). If one of those dialogue boxes is opened from a tweet, and if there are more users mentioned in it, you can use the arrow keys to switch between them. Alternatively, you can also type a username."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""## The program's interfaces"""))
|
||||||
"""))
|
|
||||||
documentation.append(_(u"""## Controls"""))
|
|
||||||
documentation.append(_(u"""
|
|
||||||
"""))
|
|
||||||
documentation.append(_(u"""Beginning with the 0.36 version, there's support for an interface which does not require a visible window. It can be activated by pressing control-m, or choosing hide window from the application menu. This interface is entirely driven through shortcut keys. These shortcuts are different from those used to drive the graphical interface. By default, you can't use the invisible interface shortcuts on the GUI. It has been made this way to keep compatibility with applications like TheQube and Chicken nugget which may use the same shortcuts. If you wish to have available the invisible interface shortcuts even if you are using the GUI, activate this option on the General tab of the preferences dialogue. This section describes both the graphical and the invisible interface."""))
|
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""### The graphical user interface (GUI)"""))
|
documentation.append(_(u"""### The graphical user interface (GUI)"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""Here you have a list divided into two parts. On the one hand, the buttons you will find while tabbing around on the program's interface, and on the other, the different elements present on the menu bar."""))
|
documentation.append(_(u"""The graphical user interface of TWBlue consists of a window containing:"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""#### Buttons on the application"""))
|
documentation.append(_(u"""* a menu bar accomodating five menus (application, tweet, user, buffer and help);"""))
|
||||||
|
documentation.append(_(u"""* One tree view,"""))
|
||||||
|
documentation.append(_(u"""* One list of items"""))
|
||||||
|
documentation.append(_(u"""* Four buttons in most dialogs: Tweet, retweet , reply and direct message."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""* Tweet: this button opens up a dialogue box to write your tweet. The message must not exceed 140 characters. If you write past this limit, a sound will play to warn you. You may use the shorten and expand URL buttons to comply with the character limit. You can translate your message, upload a picture, check spelling or attach audio by selecting one of the available buttons in the dialogue. Press enter to send the tweet. If all goes well, you'll hear a sound confirming it. Otherwise, the screen reader will say an error message in English describing the problem."""))
|
documentation.append(_(u"""The actions that are available for every item will be described later."""))
|
||||||
documentation.append(_(u"""* Retweet: this button retweets the message you're reading. After you press it, you'll be asked if you want to add a comment or simply send it as written."""))
|
|
||||||
documentation.append(_(u"""* Reply: when you're viewing a tweet, you can reply to the user who sent it by pressing this button. A dialogue will open up like the one for tweeting, but with the name of the user already filled in (for example @user) so you only need to write your message. If there are more users mentioned on the tweet, you can press shift-tab and press the mention all users button. When you're on the friends or followers lists, the button will be called mention instead."""))
|
|
||||||
documentation.append(_(u"""* Direct message: exactly like sending a tweet, but it's a private message which can only be read by the user you send it to. Press shift-tab to see the recipient. If there were other users mentioned on the tweet you were reading, you can arrow up or down to choose which one to send it to, or write the username yourself without the at sign."""))
|
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""Bear in mind that buttons will appear according to which actions are possible on the list you are browsing. For example, on the home timeline, mentions, sent, favourites and user timelines you will see the four buttons, while on the direct messages list you'll only get the direct message and tweet buttons, and on friends and followers lists you will get the direct message, tweet, and mention buttons."""))
|
documentation.append(_(u"""In summary, the GUI contains two core components. These are the controls you will find while pressing the Tab key within the program's interface, and the different elements present on the menu bar."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""#### Buttons in the application"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""* Tweet: this button opens up a dialogue box to write your tweet. The message must not exceed 140 characters. If you write past this limit, a sound will play to warn you. Note that the character count is displayed in the title bar. You may use the shorten and expand URL buttons to comply with the character limit. You can upload a picture, check spelling, attach audio or translate your message by selecting one of the available buttons in the dialogue box. In addition, you can autocomplete the entering of users by pressing Alt + A or the button for that purpose if you have the database of users configured. Press enter to send the tweet. If all goes well, you'll hear a sound confirming it. Otherwise, the screen reader will speak an error message in English describing the problem."""))
|
||||||
|
documentation.append(_(u"""* Retweet: this button retweets the message you're reading. After you press it, if you haven't configured the application not to do so, you'll be asked if you want to add a comment or simply send it as written. If you choose to add a comment, and if the original tweet plus the comment exceeds 140 characters, you will be asked if you want to post it as a comment with a mention to the original user and a link to the originating tweet."""))
|
||||||
|
documentation.append(_(u"""* Reply: when you're viewing a tweet, you can reply to the user who sent it by pressing this button. A dialogue will open up similar to the one for tweeting, but with the name of the user already filled in (for example @user) so you only need to write your message. If there are more users referred to in the tweet, you can press shift-tab and activate the mention all users button. When you're on the friends or followers lists, the button will be called mention instead."""))
|
||||||
|
documentation.append(_(u"""* Direct message: exactly like sending a tweet, but it's a private message which can only be read by the user you send it to. Press shift-tab to see the recipient. If there were other users mentioned in the tweet you were reading, you can arrow up or down to choose which one to send it to, or write the username yourself without the at sign."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""Bear in mind that buttons will appear according to which actions are possible on the list you are browsing. For example, on the home timeline, mentions, sent, favourites and user timelines you will see the four buttons, while on the direct messages list you'll only get the direct message and tweet buttons, and on friends and followers lists the direct message, tweet, and mention buttons will be available."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""#### Menus"""))
|
documentation.append(_(u"""#### Menus"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""On top of the program window there's a menu bar which has the same functions, and some more. To access the menu bar, press alt. You will find five: application, tweet, user, buffer and help. This section describes the items on each one of them."""))
|
documentation.append(_(u"""Visually, Towards the top of the main application window, can be found a menu bar which contains many of the same functions as listed in the previous section, together with some additional items. To access the menu bar, press the alt key. You will find five menus listed: application, tweet, user, buffer and help. This section describes the items on each one of them."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""##### Application menu"""))
|
documentation.append(_(u"""##### Application menu"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""* Session manager: Opens a window with all the sessions configured in TWBlue, where you can add new sessions or delete the ones you've already created."""))
|
documentation.append(_(u"""* Manage accounts: Opens a window with all the sessions configured in TWBlue, where you can add new sessions or delete the ones you've already created."""))
|
||||||
documentation.append(_(u"""* Update profile: opens a dialogue box where you can update your information on Twitter: name, location, URL and bio. If you have already set this up the fields will be prefilled with the existing information. Also, you can upload a photo to your profile."""))
|
documentation.append(_(u"""* Update profile: opens a dialogue where you can update your information on Twitter: name, location, website and bio. If you have already set this up the fields will be prefilled with the existing information. Also, you can upload a photo to your profile."""))
|
||||||
documentation.append(_(u"""* Hide window: turns off the Graphical User Interface. Read the section on the invisible interface for further details."""))
|
documentation.append(_(u"""* Hide window: turns off the Graphical User Interface. Read the section on the invisible interface for further details."""))
|
||||||
documentation.append(_(u"""* Search: shows a dialog where you can search for tweets or users on Twitter."""))
|
documentation.append(_(u"""* Search: shows a dialogue box where you can search for tweets or users on Twitter."""))
|
||||||
documentation.append(_(u"""* View trending topics: It opens a buffer to get the trending topics of a country or a city. You'll be able to select from a dialog if you wish to get countries' trends or cities' trends and choose one from the selected list. The trending topics buffer will be created once pressing "ok" on this dialog. Remember this kind of buffer will be updated every five minutes."""))
|
documentation.append(_(u"""* Lists Manager: This dialogue box allows you to manage your Twitter lists. In order to use them, you must first create them. Here, you can view, edit, create, delete or, optionally, open them in buffers similar to user timelines."""))
|
||||||
documentation.append(_(u"""* Lists Manager: This dialog allows you to manage your Twitter lists. In order to use them, you must first create them. Here, you can view, edit, create, delete or, optionally, open them in buffers similar to temporary timelines."""))
|
documentation.append(_(u"""* Edit keystrokes: this opens a dialogue where you can see and edit the shortcuts used in the invisible interface."""))
|
||||||
documentation.append(_(u"""* Sounds tutorial: Opens a dialog where you can familiarize yourself with the different sounds of the program."""))
|
documentation.append(_(u"""* Account settings: Opens a dialogue box which lets you customize settings for the current account."""))
|
||||||
documentation.append(_(u"""* Edit keystrokes: It opens a dialog where you can see and re edit the invisible interface shortcuts."""))
|
documentation.append(_(u"""* Global settings: Opens a dialogue which lets you configure settings for the entire application."""))
|
||||||
### Add description for the global settings and accounts settings options.
|
documentation.append(_(u"""* Exit: asks whether you want to exit the program. If the answer is yes, it closes the application. If you do not want to be asked for confirmation before exiting, uncheck the checkbox from the global settings dialogue box."""))
|
||||||
documentation.append(_(u"""* Quit: asks whether you want to exit the program. If the answer is yes, it shuts the application down. If you wish TWBlue not to ask you for confirmation before exiting, uncheck the checkbox from the preferences dialogue."""))
|
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""##### Tweet menu"""))
|
documentation.append(_(u"""##### Tweet menu"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""* You will first find the items to tweet, reply and retweet, which are equivalent to the buttons with the same name."""))
|
documentation.append(_(u"""* You will first find the items to tweet, reply and retweet, which are equivalent to the buttons with the same name."""))
|
||||||
documentation.append(_(u"""* Mark as favourite: marks the tweet you're viewing as a favourite."""))
|
documentation.append(_(u"""* Add to favourites: marks the tweet you're viewing as a favourite."""))
|
||||||
documentation.append(_(u"""* Remove tweet from favourites: removes the tweet from your favourites, but not from Twitter."""))
|
documentation.append(_(u"""* Remove from favourites: removes the tweet from your favourites, but not from Twitter."""))
|
||||||
documentation.append(_(u"""* Show tweet: opens up a dialogue box where you can read the tweet, direct message, friend or follower under focus. You can read the text with the arrow keys. It's the same dialogue box used to write tweets on."""))
|
documentation.append(_(u"""* Show tweet: opens up a dialogue box where you can read the tweet, direct message, friend or follower which has focus. You can read the text with the arrow keys. It's a similar dialog box as used for composing tweets, without the ability to send the tweet, file attachment and autocompleting capabilities. It does however include a retweets and favourites count. If you are in the followers or the friends list, it will only contain a read-only edit box with the information in the focused item and a close button."""))
|
||||||
documentation.append(_(u"""* View address: If the selected tweet has geographical information, TWBlue may display a dialog where you can read the tweet address. This address is got by sending the geographical coordinates of the tweet to Google maps."""))
|
documentation.append(_(u"""* View address: If the selected tweet has geographical information, TWBlue may display a dialogue box where you can read the tweet address. This address is retrieved by sending the geographical coordinates of the tweet to Google maps."""))
|
||||||
### Add description for view conversation feature
|
documentation.append(_(u"""* View conversation: If you are focusing a tweet with a mention, it opens a buffer where you can view the whole conversation."""))
|
||||||
documentation.append(_(u"""* Delete: permanently removes the tweet or direct message you're on from Twitter and from your lists. Bear in mind that Twitter only allows you to delete tweets you have posted yourself."""))
|
documentation.append(_(u"""* Delete: permanently removes the tweet or direct message which has focus from Twitter and from your lists. Bear in mind that Twitter only allows you to delete tweets you have posted yourself."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""##### User menu"""))
|
documentation.append(_(u"""##### User menu"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""The available actions you can choose are described below:"""))
|
documentation.append(_(u"""* Actions: Opens a dialogue where you can interact with a user. This dialogue box will be populated with the user who sent the tweet or direct message in focus or the selected user in the friends or followers buffer. You can edit it or leave it as is and choose one of the following actions:"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u""" * Follow: Follows a user. This means you'll see his/her tweets on your home timeline, and if he/she also follows you, you'll be able to exchange direct messages. You may also send / receive direct messages from each other if you have configured the option to allow direct messages from anyone."""))
|
||||||
"""))
|
documentation.append(_(u""" * Unfollow: Stops following a user, which causes you not being able to see his/her tweets on your main timeline neither exchanging direct messages, unless they have enabled receiving direct messages from anyone."""))
|
||||||
documentation.append(_(u"""* Follow: Follows a user. This means you'll see his/her tweets on your main timeline, and if he/she also follows you, you'll be able to interchange direct messages."""))
|
documentation.append(_(u""" * Mute: While muting someone, TWBlue won't show you nor his/her tweets on your main timeline; neither will you see that person's mentions. But you both will be able to exchange direct messages. The muted user is not informed of this action."""))
|
||||||
documentation.append(_(u"""* Unfollow: Stops following a user, which causes you not being able to see his/her tweets on your main timeline neither interchanging direct messages."""))
|
documentation.append(_(u""" * Unmute: this option allows TWBlue to display the user's tweets and mentions again."""))
|
||||||
documentation.append(_(u"""* Mute: While muting someone, TWBlue won't show you nor his/her tweets on your main timeline; neither you'll see that person's mentions. But you both will be able to interchange direct messages. The muted user is not informed of this action."""))
|
documentation.append(_(u""" * Block: Blocks a user. This forces the user to unfollow you ."""))
|
||||||
documentation.append(_(u"""* Unmute: It turns the way TWBlue treats this user to its normal way. You will see his/her tweets and mentions again."""))
|
documentation.append(_(u""" * Unblock: Stops blocking a user."""))
|
||||||
documentation.append(_(u"""* Report as spam: It suggests twitter this user is performing prohibited practices on the social network."""))
|
documentation.append(_(u""" * Report as spam: this option sends a message to Twitter suggesting the user is performing prohibited practices on the social network."""))
|
||||||
documentation.append(_(u"""* Block: Blocks a user. This forces the user to unfollow you ."""))
|
documentation.append(_(u""" * Ignore tweets from this client: Adds the client from which the focused tweet was sent to the ignored clients list."""))
|
||||||
documentation.append(_(u"""* Unblock: Stops blocking a user.""")
|
documentation.append(_(u"""* View timeline: Lets you open a user's timeline by choosing the user in a dialog box. It is created when you press enter. If you invoke this option relative to a user that has no tweets, the operation will fail. If you try creating an existing timeline the program will warn you and will not create it again."""))
|
||||||
documentation.append(_(u"""* Direct message: same action as the button."""))
|
documentation.append(_(u"""* Direct message: same action as the button."""))
|
||||||
documentation.append(_(u"""* Add to List: In order to see someone's tweets in one or more of your lists, you must add them first. This option will open a dialog where you can select the user you wish to add. Next, you will be asked to select the list you wish to add them to. Afterwards, the list will contain a new member and their tweets will show up there."""))
|
documentation.append(_(u"""* Add to List: In order to see someone's tweets in one or more of your lists, you must add them first. In the dialogue box that opens after selecting the user, you will be asked to select the list you wish to add the user to. Thereafter, the list will contain a new member and their tweets will be displayed there."""))
|
||||||
### add description for remove from list and view lists.
|
documentation.append(_(u"""* Remove from list: lets you remove a user from a list."""))
|
||||||
documentation.append(_(u"""* View user profile: opens up a dialogue box to choose the user whose profile you want to browse."""))
|
documentation.append(_(u"""* View lists: Shows the lists created by a specified user."""))
|
||||||
documentation.append(_(u"""* Timeline: Lets you open a user's timeline by choosing the user in a dialog box. It is created when you press enter. If you try it with a user that has no tweets, the program will fail. If you try creating an already existing timeline the program will warn you and will not create it again."""))
|
documentation.append(_(u"""* Show user profile: opens a dialogue with the profile of the specified user."""))
|
||||||
documentation.append(_(u"""* View favourites: Opens a buffer where you can see what tweets have been favorited by a particular user."""))
|
documentation.append(_(u"""* View favourites: Opens a buffer where you can see the tweets which have been favourited by a particular user."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""##### Buffer menu"""))
|
documentation.append(_(u"""##### Buffer menu"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
### add description for load previous items.
|
documentation.append(_(u"""* New trending topics buffer: This opens a buffer to get the worlwide trending topics or those of a country or a city. You'll be able to select from a dialogue box if you wish to retrieve countries' trends, cities' trends or worldwide trends (this option is in the cities' list) and choose one from the selected list. The trending topics buffer will be created once the "OK" button has been activated within the dialogue box. Remember this kind of buffer will be updated every five minutes."""))
|
||||||
documentation.append(_(u"""* Mute buffer: Mutes notifications of a particular buffer so you will not hear when new tweets arrive."""))
|
documentation.append(_(u"""* Load previous items: This allows more items to be loaded for the specified buffer."""))
|
||||||
documentation.append(_(u"""* autoread tweets for this buffer: When enabled, the screen reader or SAPI 5 (if enabled) will read the text of incoming tweets. Please note that this could get rather chatty if there are a lot of incoming tweets."""))
|
documentation.append(_(u"""* Mute: Mutes notifications of a particular buffer so you will not hear when new tweets arrive."""))
|
||||||
|
documentation.append(_(u"""* autoread: When enabled, the screen reader or SAPI 5 Text to Speech voice (if enabled) will read the text of incoming tweets. Please note that this could get rather chatty if there are a lot of incoming tweets."""))
|
||||||
documentation.append(_(u"""* Clear buffer: Deletes all items from the buffer."""))
|
documentation.append(_(u"""* Clear buffer: Deletes all items from the buffer."""))
|
||||||
documentation.append(_(u"""* Remove buffer: dismiss the list you're on."""))
|
documentation.append(_(u"""* Destroy: dismisses the list you're on."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""##### Help menu"""))
|
documentation.append(_(u"""##### Help menu"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""* Documentation: opens up this file, where you can read some useful program concepts."""))
|
documentation.append(_(u"""* Documentation: opens up this file, where you can read some useful program concepts."""))
|
||||||
documentation.append(_(u"""* What's new in this version?: opens up a document with the list of changes from the current version down to the first."""))
|
documentation.append(_(u"""* Sounds tutorial: Opens a dialog box where you can familiarize yourself with the different sounds of the program."""))
|
||||||
documentation.append(_(u"""* Check for updates: every time you open the program it automatically checks for new versions. If there is any, it will ask you if you want to download it. If you accept, it will do so, after which it will install it and ask you to let it restart itself, which it does automatically. This item checks for new updates without having to restart the application."""))
|
documentation.append(_(u"""* What's new in this version?: opens up a document with the list of changes from the current version to the earliest."""))
|
||||||
documentation.append(_(u"""* Report a bug: opens up a dialogue box to report a bug by filling a couple of fields. Pressing enter will send the report. If the operation doesn't succeed the program will show a warning."""))
|
documentation.append(_(u"""* Check for updates: every time you open the program it automatically checks for new versions. If an update is available, it will ask you if you want to download the update. If you accept, the updating process will commence. When complete, TWBlue will be restarted. This item checks for new updates without having to restart the application."""))
|
||||||
documentation.append(_(u"""* TW Blue's website: visit our [home page](http://twblue.es) where you can find all relevant information and downloads for TW Blue and become a part of the community."""))
|
documentation.append(_(u"""* Report an error: opens up a dialogue box to report a bug by completing a small number of fields. Pressing enter will send the report. If the operation doesn't succeed the program will display a warning."""))
|
||||||
documentation.append(_(u"""* About TW Blue: shows the credits of the program."""))
|
documentation.append(_(u"""* TWBlue's website: visit our [home page](http://twblue.es) where you can find all relevant information and downloads for TWBlue and become a part of the community."""))
|
||||||
documentation.append(_(u"""...
|
documentation.append(_(u"""* About TWBlue: shows the credits of the program."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""### The invisible user interface"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""The invisible interface, as its name suggests, has no graphical window and works directly with screen readers such as JAWS for Windows, NVDA and System Access. This interface is disabled by default, but you can enable it by pressing Control + M. It works similarly to TheQube and Chicken Nugget. Its shortcuts are similar to those found in these two clients. In addition, the program has builtin support for the keymaps for these applications, configurable through the global settings dialogue. By default, you cannot use this interface's shortcuts in the GUI, but you can configure this in the global settings dialogue."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""The next section contains a list of keyboard shortcuts for both interfaces. Bear in mind that we will only describe the default keymap."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""## Keyboard shortcuts"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""### Shortcuts of the graphical user interface (GUI)"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""* Enter: Open URL."""))
|
||||||
|
documentation.append(_(u"""* Control + Enter: Play audio."""))
|
||||||
|
documentation.append(_(u"""* Control + M: Hide the GUI."""))
|
||||||
|
documentation.append(_(u"""* Control + N: Compose a new tweet."""))
|
||||||
|
documentation.append(_(u"""* Control + R: Reply / mention."""))
|
||||||
|
documentation.append(_(u"""* Control + Shift + R: Retweet."""))
|
||||||
|
documentation.append(_(u"""* Control + D: Send a direct message."""))
|
||||||
|
documentation.append(_(u"""* control + F: Add tweet to favourites."""))
|
||||||
|
documentation.append(_(u"""* Control + Shift + F: Remove a tweet from favourites."""))
|
||||||
|
documentation.append(_(u"""* Control + S: Open the user actions dialogue."""))
|
||||||
|
documentation.append(_(u"""* Control + Shift + V: Show tweet."""))
|
||||||
|
documentation.append(_(u"""* Control + Q: Quit this program."""))
|
||||||
|
documentation.append(_(u"""* Control + I: Open user timeline."""))
|
||||||
|
documentation.append(_(u"""* Control + Shift + i: Destroy buffer."""))
|
||||||
|
documentation.append(_(u"""* F5: Increase volume by 5%."""))
|
||||||
|
documentation.append(_(u"""* F6: Decrease volume by 5%."""))
|
||||||
|
documentation.append(_(u"""* Control + P: Edit your profile."""))
|
||||||
|
documentation.append(_(u"""* Control + Delete: Delete a tweet or direct message."""))
|
||||||
|
documentation.append(_(u"""* Control + Shift + Delete: Empty the current buffer."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""### Shortcuts of the invisible interface (default keymap)"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Up Arrow: moves to the previous item in the buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Down Arrow: moves to the next item in the buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Left Arrow: Move to the previous buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Right Arrow: Move to the next buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Shift + Left: Focus the previous session."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Shift + Right: Focus the next session."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + C: View conversation."""))
|
||||||
|
documentation.append(_(u"""* Control + Enter: Open URL."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Enter: Play audio."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + M: Show or hide the GUI."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + N: New tweet."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + R: Reply / Mention."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Shift + R: Retweet."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + D: Send direct message."""))
|
||||||
|
documentation.append(_(u"""* Windows+ Alt + F: Mark as favourite."""))
|
||||||
|
documentation.append(_(u"""* Alt + Windows + Shift + F: Remove from favourites."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + S: Open the user actions dialogue."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Alt + N: See user details."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + V: Show tweet."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + F4: Quit TWBlue."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + I: Open user timeline."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Shift + I: Destroy buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Alt + Up: Increase volume by 5%."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Alt + Down: Decrease volume by 5%."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Home: Jump to the first element of the current buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + End: Jump to the last element of the current buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + PageUp: Jump 20 elements up in the current buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + PageDown: Jump 20 elements down in the current buffer."""))
|
||||||
|
documentation.append(_(u"""* Windows + Alt + P: Edit profile."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Delete: Delete a tweet or direct message."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Shift + Delete: Empty the current buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Space: Repeat last item."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Shift + C: Copy to clipboard."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows+ A: Add user to list."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Shift + A: Remove user from list."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + M: Mute / unmute the current buffer."""))
|
||||||
|
documentation.append(_(u"""* Windows + Alt + M: Mute / unmute the current session."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + E: Toggle the automatic reading of incoming tweets in the current buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + -: Search on Twitter."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + K: Show the keystroke editor."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + L: Show lists for a specified user."""))
|
||||||
|
documentation.append(_(u"""* Windows + Alt + PageUp: Load previous items for the current buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + G: Get geolocation."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + Shift + G: Display the tweet's geolocation in a dialogue."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + T: Create a trending topics' buffer."""))
|
||||||
|
documentation.append(_(u"""* Control + Windows + {: Find a string in the current buffer."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""## Configuration"""))
|
||||||
|
documentation.append(_(u"""As described above, this application has two configuration dialogues, the global settings dialogue and the account settings dialogue."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""### The account settings dialogue"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""#### General tab"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""* Autocompletion settings: Allows you to configure the autocompletion database. You can add users manually or let TWBlue add your followers, friends or both."""))
|
||||||
|
documentation.append(_(u"""* Relative timestamps: Allows you to configure whether the application will calculate the time the tweet or direct message was sent or received based on the current time, or simply say the time it was received or sent."""))
|
||||||
|
documentation.append(_(u"""* API calls: Allows you to adjust the number of API calls to be made to Twitter by this program."""))
|
||||||
|
documentation.append(_(u"""* Items on each API call: Allows you to specify how many items should be retrieved from Twitter for each API call (default and maximum is 200)."""))
|
||||||
|
documentation.append(_(u"""* Inverted buffers: Allows you to specify whether the buffers should be inverted, which means that the oldest items will show at the end of them and the newest at the beginning."""))
|
||||||
|
documentation.append(_(u"""* Retweet mode: Allows you to specify the behaviour when posting a retweet: you can choose between retweeting with a comment, retweeting without comment or being asked."""))
|
||||||
|
documentation.append(_(u"""* Number of items per buffer to cache in database: This allows you to specify how many items TWBlue should cache in a database. You can type any number, 0 to cache all items, or leave blank to disable caching entirely."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""#### buffers tab"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""This tab displays a list for each buffer you have available in TWBlue, except for searches, timelines, favourites' timelines and lists. You can show, hide and move them."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""#### The ignored clients tab"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""In this tab, you can add and remove clients to be ignored by the program."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""#### Sound tab"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""In this tab, you can adjust the sound volume, select the input and output device and set the soundpack used by the program."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""#### Audio service tab"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""In this tab, you can enter your SndUp API key (if you have one) to upload audio to SndUp with your account. Note that if account credentials are not specified you will upload anonimously."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""### Global settings"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""This dialogue allows you to configure some settings which will affect the entire application."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""#### General tab"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""* Language: This allows you to change the language of this program. Currently supported languages are arabic, Catalan, German, English, Spanish, Basque, Finnish, French, Galician, Croatian, Hungarian, Italian, Polish, Portuguese, Russian and Turkish."""))
|
||||||
|
documentation.append(_(u"""* Ask before exiting TWBlue: This checkbox allows you to control whetherthe program will ask for confirmation before exiting."""))
|
||||||
|
documentation.append(_(u"""* Play a sound when TWBlue launches: This checkbox allows you to configure whether the application will play a sound when it has finished loading the buffers."""))
|
||||||
|
documentation.append(_(u"""* Speak a message when TWBlue launches: This is the same as the previous option, but this checkbox configures whether the screen reader will say \"ready\"."""))
|
||||||
|
documentation.append(_(u"""* Use the invisible interface's shortcuts in the GUI: As the invisible interface and the Graphical User Interface have their own shortcuts, you may want to use the invisible interface's keystrokes all the time. If this option is checked, the invisible interface's shortcuts will be usable in the GUI."""))
|
||||||
|
documentation.append(_(u"""* Activate SAPI5 when any other screen reader is not being run: This checkbox allows to activate SAPI 5 TTS when no other screen reader is being run."""))
|
||||||
|
documentation.append(_(u"""* Hide GUI on launch: This allows you to configure whether TWBlue will start with the GUI or the invisible interface."""))
|
||||||
|
documentation.append(_(u"""* Keymap: This option allows you to change the keymap used by the program in the invisible interface. The shipped keymaps are Default, Qwitter, Windows 10 and Chicken Nugget. The keymaps are in the \"keymaps\" folder, and you can create new ones. Just create a new \".keymap\" file and change the keystrokes associated with the actions, as it is done in the shipped keymaps."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""#### Proxi tab"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""In this tab you can configure TWBlue to use a Proxy server by completing the fields displayed (server, port, user and password)."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""## License, source code and donations"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""Tw Blue is free software, licensed under the GNU GPL license, either version 2 or, at your option, any later version. You can view the license in the file named license.txt, or online at <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""The source code of the program is available on GitHub at <https://www.github.com/manuelcortez/twblue>."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""If you want to donate to the project, you can do so at <http://twblue.es/?q=node/3&language=en>. Thank you for your support!"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""## Contact"""))
|
documentation.append(_(u"""## Contact"""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""If what's explained in this document is not enough, if you want to collaborate in some other way, or if you simply want to get in touch with the application developer, follow the Twitter account [@tw_blue2](https://twitter.com/tw_blue2) or [@manuelcortez00.](https://twitter.com/manuelcortez00) You can also visit [our website](http://twblue.com.mx)"""))
|
documentation.append(_(u"""If you still have questions after reading this document, if you wish to collaborate to the project in some other way, or if you simply want to get in touch with the application developer, follow the Twitter account [@tw_blue2](https://twitter.com/tw_blue2) or [@manuelcortez00.](https://twitter.com/manuelcortez00) You can also visit [our website](http://twblue.es)"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""## Credits"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""TWBlue is developed and mantained by [Manuel Cortéz](https://twitter.com/manuelcortez00), [José Manuel Delicado](https://twitter.com/jmdaweb), and [Bill Dengler](https://twitter.com/codeofdusk). It's supported and sponsored by [Technow S. L.](https://twitter.com/technow)"""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""We would also like to thank the translators of TWBlue, who have allowed the spreading of the application."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""* English: [Bryner Villalobos](https://twitter.com/Bry_StarkCR) and [Bill Dengler](https://twitter.com/codeofdusk)."""))
|
||||||
|
documentation.append(_(u"""* Arabic: Mohammed Al Shara."""))
|
||||||
|
documentation.append(_(u"""* Catalan: [Joan Rabat](https://twitter.com/joanrabat) and Juan Carlos Rivilla."""))
|
||||||
|
documentation.append(_(u"""* Spanish: [Manuel Cortéz](https://twitter.com/manuelcortez00)."""))
|
||||||
|
documentation.append(_(u"""* Basque: [Sukil Etxenike](https://twitter.com/sukil2011)."""))
|
||||||
|
documentation.append(_(u"""* Finnish: Jani Kinnunen."""))
|
||||||
|
documentation.append(_(u"""* French: Rémi Ruiz."""))
|
||||||
|
documentation.append(_(u"""* Galician: [Alba Kinteiro](https://twitter.com/albasmileforeve)."""))
|
||||||
|
documentation.append(_(u"""* German: Steffen Schultz."""))
|
||||||
|
documentation.append(_(u"""* Hungarian: Robert Osztolykan."""))
|
||||||
|
documentation.append(_(u"""* Polish: Pawel Masarczyk."""))
|
||||||
|
documentation.append(_(u"""* Portuguese: Odenilton Júnior Santos."""))
|
||||||
|
documentation.append(_(u"""* Russian: Alexander Jaszyn."""))
|
||||||
|
documentation.append(_(u"""* Turkish: Burak."""))
|
||||||
|
documentation.append(_(u"""
|
||||||
|
"""))
|
||||||
|
documentation.append(_(u"""Many thanks also to the people who worked on the documentation. Initially, [Manuel Cortez](https://twitter.com/manuelcortez00) did the documentation in Spanish, and translated to English by [Bryner Villalobos](https://twitter.com/Bry_StarkCR), [Robert Spangler](https://twitter.com/glasscity1837), [Sussan Rey](https://twitter.com/sussanrey17), [Anibal Hernandez](https://twitter.com/anibalmetal), and [Holly Scott-Gardner](https://twitter.com/holly1994). It was updated by [Sukil Etxenike](https://twitter.com/sukil2011), with some valuable corrections by [Brian Hartgen](https://twitter.com/brianhartgen) and [Bill Dengler](https://twitter.com/codeofdusk)."""))
|
||||||
documentation.append(_(u"""
|
documentation.append(_(u"""
|
||||||
"""))
|
"""))
|
||||||
documentation.append(_(u"""---"""))
|
documentation.append(_(u"""---"""))
|
||||||
|
@@ -36,7 +36,7 @@ autoread_buffers = list(default=list(mentions, direct_messages, events))
|
|||||||
spelling_language = string(default="")
|
spelling_language = string(default="")
|
||||||
save_followers_in_autocompletion_db = boolean(default=False)
|
save_followers_in_autocompletion_db = boolean(default=False)
|
||||||
save_friends_in_autocompletion_db = boolean(default=False)
|
save_friends_in_autocompletion_db = boolean(default=False)
|
||||||
|
twishort_enabled = boolean(default=False)
|
||||||
|
|
||||||
[services]
|
[services]
|
||||||
dropbox_token=string(default="")
|
pocket_access_token = string(default="")
|
||||||
|
|
@@ -8,11 +8,13 @@ language = string(default="system")
|
|||||||
hide_gui = boolean(default=False)
|
hide_gui = boolean(default=False)
|
||||||
voice_enabled = boolean(default=False)
|
voice_enabled = boolean(default=False)
|
||||||
ask_at_exit = boolean(default=True)
|
ask_at_exit = boolean(default=True)
|
||||||
|
handle_longtweets = boolean(default=False)
|
||||||
use_invisible_keyboard_shorcuts = boolean(default=True)
|
use_invisible_keyboard_shorcuts = boolean(default=True)
|
||||||
play_ready_sound = boolean(default=True)
|
play_ready_sound = boolean(default=True)
|
||||||
speak_ready_msg = boolean(default=True)
|
speak_ready_msg = boolean(default=True)
|
||||||
log_level = string(default="error")
|
log_level = string(default="error")
|
||||||
load_keymap = string(default="default.keymap")
|
load_keymap = string(default="default.keymap")
|
||||||
|
donation_dialog_displayed = boolean(default=False)
|
||||||
|
|
||||||
[proxy]
|
[proxy]
|
||||||
server = string(default="")
|
server = string(default="")
|
||||||
|
@@ -5,7 +5,7 @@ if snapshot == False:
|
|||||||
version = "0.80"
|
version = "0.80"
|
||||||
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
||||||
else:
|
else:
|
||||||
version = "9.4"
|
version = "10.6"
|
||||||
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
|
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
|
||||||
author = u"Manuel Cortéz, Bill Dengler"
|
author = u"Manuel Cortéz, Bill Dengler"
|
||||||
authorEmail = "manuel@manuelcortez.net"
|
authorEmail = "manuel@manuelcortez.net"
|
||||||
|
@@ -16,4 +16,4 @@ def setup ():
|
|||||||
app = config_utils.load_config(paths.config_path(MAINFILE), paths.app_path(MAINSPEC))
|
app = config_utils.load_config(paths.config_path(MAINFILE), paths.app_path(MAINSPEC))
|
||||||
log.debug("Loading keymap...")
|
log.debug("Loading keymap...")
|
||||||
global keymap
|
global keymap
|
||||||
keymap = config_utils.load_config(paths.app_path("keymaps/"+app['app-settings']['load_keymap']), paths.app_path('keymaps/base.template'))
|
keymap = config_utils.load_config(paths.config_path("keymap.keymap"), paths.app_path("keymaps/"+app['app-settings']['load_keymap']))
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
import platform
|
import platform
|
||||||
if platform.system() == "Windows":
|
if platform.system() == "Windows":
|
||||||
import wx
|
import wx
|
||||||
from wxUI import buffers, dialogs, commonMessageDialogs
|
from wxUI import buffers, dialogs, commonMessageDialogs, menus
|
||||||
import user
|
import user
|
||||||
elif platform.system() == "Linux":
|
elif platform.system() == "Linux":
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
@@ -47,8 +47,8 @@ class bufferController(object):
|
|||||||
|
|
||||||
|
|
||||||
def get_event(self, ev):
|
def get_event(self, ev):
|
||||||
if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "url"
|
if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "audio"
|
||||||
elif ev.GetKeyCode() == wx.WXK_RETURN: event = "interact"
|
elif ev.GetKeyCode() == wx.WXK_RETURN: event = "url"
|
||||||
elif ev.GetKeyCode() == wx.WXK_F5: event = "volume_down"
|
elif ev.GetKeyCode() == wx.WXK_F5: event = "volume_down"
|
||||||
elif ev.GetKeyCode() == wx.WXK_F6: event = "volume_up"
|
elif ev.GetKeyCode() == wx.WXK_F6: event = "volume_up"
|
||||||
elif ev.GetKeyCode() == wx.WXK_DELETE and ev.ShiftDown(): event = "clear_list"
|
elif ev.GetKeyCode() == wx.WXK_DELETE and ev.ShiftDown(): event = "clear_list"
|
||||||
@@ -82,28 +82,6 @@ class bufferController(object):
|
|||||||
sound.URLPlayer.stream.volume = self.session.settings["sound"]["volume"]
|
sound.URLPlayer.stream.volume = self.session.settings["sound"]["volume"]
|
||||||
self.session.sound.play("volume_changed.ogg")
|
self.session.sound.play("volume_changed.ogg")
|
||||||
|
|
||||||
def interact(self):
|
|
||||||
if hasattr(sound.URLPlayer,'stream'):
|
|
||||||
return sound.URLPlayer.stop_audio(delete=True)
|
|
||||||
tweet = self.get_tweet()
|
|
||||||
url=None
|
|
||||||
urls = utils.find_urls(tweet)
|
|
||||||
if len(urls) == 1:
|
|
||||||
url=urls[0]
|
|
||||||
elif len(urls) > 1:
|
|
||||||
urls_list = dialogs.urlList.urlList()
|
|
||||||
urls_list.populate_list(urls)
|
|
||||||
if urls_list.get_response() == widgetUtils.OK:
|
|
||||||
url=urls_list.get_string()
|
|
||||||
if hasattr(urls_list, "destroy"): urls_list.destroy()
|
|
||||||
if url != None:
|
|
||||||
output.speak(_(u"Opening media..."), True)
|
|
||||||
if sound.URLPlayer.is_playable(url=url, play=True, volume=self.session.settings["sound"]["volume"]) == False:
|
|
||||||
return webbrowser.open_new_tab(url)
|
|
||||||
# else:
|
|
||||||
# output.speak(_(u"Not actionable."), True)
|
|
||||||
# self.session.sound.play("error.ogg")
|
|
||||||
|
|
||||||
def start_stream(self):
|
def start_stream(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -149,15 +127,28 @@ class bufferController(object):
|
|||||||
def post_tweet(self, *args, **kwargs):
|
def post_tweet(self, *args, **kwargs):
|
||||||
title = _(u"Tweet")
|
title = _(u"Tweet")
|
||||||
caption = _(u"Write the tweet here")
|
caption = _(u"Write the tweet here")
|
||||||
tweet = messages.tweet(self.session, title, caption, "")
|
tweet = messages.tweet(self.session, title, caption, "", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
||||||
if tweet.message.get_response() == widgetUtils.OK:
|
if tweet.message.get_response() == widgetUtils.OK:
|
||||||
|
self.session.settings["mysc"]["twishort_enabled"] = tweet.message.long_tweet.GetValue()
|
||||||
text = tweet.message.get_text()
|
text = tweet.message.get_text()
|
||||||
|
if len(text) > 140 and tweet.message.get("long_tweet") == True:
|
||||||
|
if tweet.image == None:
|
||||||
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||||
|
else:
|
||||||
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||||
if tweet.image == None:
|
if tweet.image == None:
|
||||||
call_threaded(self.session.api_call, call_name="update_status", status=text)
|
call_threaded(self.session.api_call, call_name="update_status", status=text)
|
||||||
else:
|
else:
|
||||||
call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image)
|
call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image)
|
||||||
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
||||||
|
|
||||||
|
def save_positions(self):
|
||||||
|
try:
|
||||||
|
self.session.db[self.name+"_pos"]=self.buffer.list.get_selected()
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class accountPanel(bufferController):
|
class accountPanel(bufferController):
|
||||||
def __init__(self, parent, name, account, account_id):
|
def __init__(self, parent, name, account, account_id):
|
||||||
super(accountPanel, self).__init__(parent, None, name)
|
super(accountPanel, self).__init__(parent, None, name)
|
||||||
@@ -249,14 +240,30 @@ class baseBufferController(bufferController):
|
|||||||
uri = None
|
uri = None
|
||||||
if tweet.has_key("long_uri"):
|
if tweet.has_key("long_uri"):
|
||||||
uri = tweet["long_uri"]
|
uri = tweet["long_uri"]
|
||||||
tweet = self.session.twitter.twitter.show_status(id=tweet_id)
|
try:
|
||||||
|
tweet = self.session.twitter.twitter.show_status(id=tweet_id)
|
||||||
|
urls = utils.find_urls_in_text(tweet["text"])
|
||||||
|
for url in range(0, len(urls)):
|
||||||
|
try: tweet["text"] = tweet["text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
|
except IndexError: pass
|
||||||
|
except TwythonError as e:
|
||||||
|
utils.twitter_error(e)
|
||||||
|
return
|
||||||
if uri != None:
|
if uri != None:
|
||||||
tweet["text"] = twishort.get_full_text(uri)
|
tweet["text"] = twishort.get_full_text(uri)
|
||||||
l = tweets.is_long(tweet)
|
l = tweets.is_long(tweet)
|
||||||
while l != False:
|
while l != False:
|
||||||
tweetsList.append(tweet)
|
tweetsList.append(tweet)
|
||||||
id = tweets.get_id(l)
|
id = tweets.get_id(l)
|
||||||
tweet = self.session.twitter.twitter.show_status(id=id)
|
try:
|
||||||
|
tweet = self.session.twitter.twitter.show_status(id=id)
|
||||||
|
urls = utils.find_urls_in_text(tweet["text"])
|
||||||
|
for url in range(0, len(urls)):
|
||||||
|
try: tweet["text"] = tweet["text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
|
||||||
|
except IndexError: pass
|
||||||
|
except TwythonError as e:
|
||||||
|
utils.twitter_error(e)
|
||||||
|
return
|
||||||
l = tweets.is_long(tweet)
|
l = tweets.is_long(tweet)
|
||||||
if l == False:
|
if l == False:
|
||||||
tweetsList.append(tweet)
|
tweetsList.append(tweet)
|
||||||
@@ -365,6 +372,61 @@ class baseBufferController(bufferController):
|
|||||||
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet)
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet)
|
||||||
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm)
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm)
|
||||||
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply)
|
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply)
|
||||||
|
# Replace for the correct way in other platforms.
|
||||||
|
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu)
|
||||||
|
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key)
|
||||||
|
|
||||||
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||||
|
if self.buffer.list.get_count() == 0: return
|
||||||
|
if self.name == "sent_tweets" or self.name == "sent_direct_messages":
|
||||||
|
menu = menus.sentPanelMenu()
|
||||||
|
elif self.name == "direct_messages":
|
||||||
|
menu = menus.dmPanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.direct_message, menuitem=menu.reply)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions)
|
||||||
|
else:
|
||||||
|
menu = menus.basePanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.reply, menuitem=menu.reply)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.retweet, menuitem=menu.retweet)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.fav, menuitem=menu.fav)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.unfav, menuitem=menu.unfav)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.url_, menuitem=menu.openUrl)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.audio, menuitem=menu.play)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.destroy_status, menuitem=menu.remove)
|
||||||
|
if pos != 0:
|
||||||
|
self.buffer.PopupMenu(menu, pos)
|
||||||
|
else:
|
||||||
|
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||||
|
|
||||||
|
def view(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="view_item")
|
||||||
|
|
||||||
|
def copy(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="copy_to_clipboard")
|
||||||
|
|
||||||
|
def user_actions(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="follow")
|
||||||
|
|
||||||
|
def fav(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="add_to_favourites")
|
||||||
|
|
||||||
|
def unfav(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="remove_from_favourites")
|
||||||
|
|
||||||
|
def delete_item_(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="delete_item")
|
||||||
|
|
||||||
|
def url_(self, *args, **kwargs):
|
||||||
|
self.url()
|
||||||
|
|
||||||
|
def show_menu_by_key(self, ev):
|
||||||
|
if self.buffer.list.get_count() == 0:
|
||||||
|
return
|
||||||
|
if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU:
|
||||||
|
self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition())
|
||||||
|
|
||||||
def get_tweet(self):
|
def get_tweet(self):
|
||||||
if self.session.db[self.name][self.buffer.list.get_selected()].has_key("retweeted_status"):
|
if self.session.db[self.name][self.buffer.list.get_selected()].has_key("retweeted_status"):
|
||||||
@@ -383,12 +445,19 @@ class baseBufferController(bufferController):
|
|||||||
screen_name = tweet["user"]["screen_name"]
|
screen_name = tweet["user"]["screen_name"]
|
||||||
id = tweet["id"]
|
id = tweet["id"]
|
||||||
users = utils.get_all_mentioned(tweet, self.session.db)
|
users = utils.get_all_mentioned(tweet, self.session.db)
|
||||||
message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "@%s " % (screen_name,), users)
|
message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "@%s " % (screen_name,), twishort_enabled=self.session.settings["mysc"]["twishort_enabled"], users=users)
|
||||||
if message.message.get_response() == widgetUtils.OK:
|
if message.message.get_response() == widgetUtils.OK:
|
||||||
|
self.session.settings["mysc"]["twishort_enabled"] = message.message.long_tweet.GetValue()
|
||||||
|
text = message.message.get_text()
|
||||||
|
if len(text) > 140 and message.message.get("long_tweet") == True:
|
||||||
|
if message.image == None:
|
||||||
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||||
|
else:
|
||||||
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||||
if message.image == None:
|
if message.image == None:
|
||||||
call_threaded(self.session.api_call, call_name="update_status", _sound="reply_send.ogg", in_reply_to_status_id=id, status=message.message.get_text())
|
call_threaded(self.session.api_call, call_name="update_status", _sound="reply_send.ogg", in_reply_to_status_id=id, status=text)
|
||||||
else:
|
else:
|
||||||
call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", in_reply_to_status_id=id, status=message.message.get_text(), media=message.file)
|
call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", in_reply_to_status_id=id, status=text, media=message.file)
|
||||||
if hasattr(message.message, "destroy"): message.message.destroy()
|
if hasattr(message.message, "destroy"): message.message.destroy()
|
||||||
|
|
||||||
@_tweets_exist
|
@_tweets_exist
|
||||||
@@ -424,7 +493,7 @@ class baseBufferController(bufferController):
|
|||||||
self._retweet_with_comment(tweet, id)
|
self._retweet_with_comment(tweet, id)
|
||||||
|
|
||||||
def _retweet_with_comment(self, tweet, id, comment=''):
|
def _retweet_with_comment(self, tweet, id, comment=''):
|
||||||
retweet = messages.tweet(self.session, _(u"Retweet"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (tweet["user"]["screen_name"], tweet["text"]), max=116-len("@%s " % (tweet["user"]["screen_name"],)), messageType="retweet")
|
retweet = messages.tweet(self.session, _(u"Retweet"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (tweet["user"]["screen_name"], tweet["text"]), max=116, messageType="retweet", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
||||||
if comment != '':
|
if comment != '':
|
||||||
retweet.message.set_text(comment)
|
retweet.message.set_text(comment)
|
||||||
if retweet.message.get_response() == widgetUtils.OK:
|
if retweet.message.get_response() == widgetUtils.OK:
|
||||||
@@ -435,7 +504,7 @@ class baseBufferController(bufferController):
|
|||||||
else:
|
else:
|
||||||
answer = commonMessageDialogs.retweet_as_link(self.buffer)
|
answer = commonMessageDialogs.retweet_as_link(self.buffer)
|
||||||
if answer == widgetUtils.YES:
|
if answer == widgetUtils.YES:
|
||||||
text = text+" @{2} https://twitter.com/{0}/status/{1}".format(tweet["user"]["screen_name"], id, tweet["user"]["screen_name"])
|
text = text+" https://twitter.com/{0}/status/{1}".format(tweet["user"]["screen_name"], id)
|
||||||
else:
|
else:
|
||||||
return self._retweet_with_comment(tweet, id, comment=comments)
|
return self._retweet_with_comment(tweet, id, comment=comments)
|
||||||
if retweet.image == None:
|
if retweet.image == None:
|
||||||
@@ -458,10 +527,9 @@ class baseBufferController(bufferController):
|
|||||||
self.session.sound.play("audio.ogg")
|
self.session.sound.play("audio.ogg")
|
||||||
if utils.is_geocoded(tweet):
|
if utils.is_geocoded(tweet):
|
||||||
self.session.sound.play("geo.ogg")
|
self.session.sound.play("geo.ogg")
|
||||||
self.session.db[str(self.name+"_pos")]=self.buffer.list.get_selected()
|
|
||||||
|
|
||||||
@_tweets_exist
|
# @_tweets_exist
|
||||||
def audio(self,url=''):
|
def audio(self, url='', *args, **kwargs):
|
||||||
if hasattr(sound.URLPlayer,'stream'):
|
if hasattr(sound.URLPlayer,'stream'):
|
||||||
return sound.URLPlayer.stop_audio(delete=True)
|
return sound.URLPlayer.stop_audio(delete=True)
|
||||||
tweet = self.get_tweet()
|
tweet = self.get_tweet()
|
||||||
@@ -481,8 +549,8 @@ class baseBufferController(bufferController):
|
|||||||
except:
|
except:
|
||||||
log.error("Exception while executing audio method.")
|
log.error("Exception while executing audio method.")
|
||||||
|
|
||||||
@_tweets_exist
|
# @_tweets_exist
|
||||||
def url(self,url='',announce=True):
|
def url(self, url='', announce=True, *args, **kwargs):
|
||||||
if url == '':
|
if url == '':
|
||||||
tweet = self.get_tweet()
|
tweet = self.get_tweet()
|
||||||
urls = utils.find_urls(tweet)
|
urls = utils.find_urls(tweet)
|
||||||
@@ -600,6 +668,23 @@ class eventsBufferController(bufferController):
|
|||||||
if dlg == widgetUtils.YES:
|
if dlg == widgetUtils.YES:
|
||||||
self.buffer.list.clear()
|
self.buffer.list.clear()
|
||||||
|
|
||||||
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||||
|
if self.buffer.list.get_count() == 0: return
|
||||||
|
menu = menus.eventsPanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.destroy_status, menuitem=menu.remove)
|
||||||
|
if pos != 0:
|
||||||
|
self.buffer.PopupMenu(menu, pos)
|
||||||
|
else:
|
||||||
|
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||||
|
|
||||||
|
def view(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="view_item")
|
||||||
|
|
||||||
|
def copy(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="copy_to_clipboard")
|
||||||
|
|
||||||
class peopleBufferController(baseBufferController):
|
class peopleBufferController(baseBufferController):
|
||||||
def __init__(self, parent, function, name, sessionObject, account, bufferType=None, *args, **kwargs):
|
def __init__(self, parent, function, name, sessionObject, account, bufferType=None, *args, **kwargs):
|
||||||
super(peopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel")
|
super(peopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel")
|
||||||
@@ -710,6 +795,22 @@ class peopleBufferController(baseBufferController):
|
|||||||
def interact(self):
|
def interact(self):
|
||||||
user.profileController(self.session, user=self.get_right_tweet()["screen_name"])
|
user.profileController(self.session, user=self.get_right_tweet()["screen_name"])
|
||||||
|
|
||||||
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||||
|
menu = menus.peoplePanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.direct_message, menuitem=menu.reply)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.details, menuitem=menu.details)
|
||||||
|
# widgetUtils.connect_event(menu, widgetUtils.MENU, self.lists, menuitem=menu.lists)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||||
|
if pos != 0:
|
||||||
|
self.buffer.PopupMenu(menu, pos)
|
||||||
|
else:
|
||||||
|
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||||
|
|
||||||
|
def details(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="user_details")
|
||||||
|
|
||||||
class searchBufferController(baseBufferController):
|
class searchBufferController(baseBufferController):
|
||||||
def start_stream(self):
|
def start_stream(self):
|
||||||
log.debug("Starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
|
log.debug("Starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
|
||||||
@@ -816,6 +917,8 @@ class trendsBufferController(bufferController):
|
|||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet)
|
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet)
|
||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm)
|
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm)
|
||||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply)
|
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply)
|
||||||
|
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu)
|
||||||
|
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key)
|
||||||
|
|
||||||
def get_message(self):
|
def get_message(self):
|
||||||
return self.compose_function(self.trends[self.buffer.list.get_selected()])[0]
|
return self.compose_function(self.trends[self.buffer.list.get_selected()])[0]
|
||||||
@@ -833,6 +936,48 @@ class trendsBufferController(bufferController):
|
|||||||
def interact(self, *args, **kwargs):
|
def interact(self, *args, **kwargs):
|
||||||
self.searchfunction(value=self.get_message())
|
self.searchfunction(value=self.get_message())
|
||||||
|
|
||||||
|
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||||
|
menu = menus.trendsPanelMenu()
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.tweet_about_this_trend, menuitem=menu.tweetThisTrend)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||||
|
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||||
|
if pos != 0:
|
||||||
|
self.buffer.PopupMenu(menu, pos)
|
||||||
|
else:
|
||||||
|
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||||
|
|
||||||
|
def view(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="view_item")
|
||||||
|
|
||||||
|
def copy(self, *args, **kwargs):
|
||||||
|
pub.sendMessage("execute-action", action="copy_to_clipboard")
|
||||||
|
|
||||||
|
def tweet_about_this_trend(self, *args, **kwargs):
|
||||||
|
if self.buffer.list.get_count() == 0: return
|
||||||
|
title = _(u"Tweet")
|
||||||
|
caption = _(u"Write the tweet here")
|
||||||
|
tweet = messages.tweet(self.session, title, caption, self.get_message()+ " ", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
||||||
|
tweet.message.set_cursor_at_end()
|
||||||
|
if tweet.message.get_response() == widgetUtils.OK:
|
||||||
|
self.session.settings["mysc"]["twishort_enabled"] = tweet.message.long_tweet.GetValue()
|
||||||
|
text = tweet.message.get_text()
|
||||||
|
if len(text) > 140 and tweet.message.get("long_tweet") == True:
|
||||||
|
if tweet.image == None:
|
||||||
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||||
|
else:
|
||||||
|
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||||
|
if tweet.image == None:
|
||||||
|
call_threaded(self.session.api_call, call_name="update_status", status=text)
|
||||||
|
else:
|
||||||
|
call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image)
|
||||||
|
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
||||||
|
|
||||||
|
def show_menu_by_key(self, ev):
|
||||||
|
if self.buffer.list.get_count() == 0:
|
||||||
|
return
|
||||||
|
if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU:
|
||||||
|
self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition())
|
||||||
|
|
||||||
class conversationBufferController(searchBufferController):
|
class conversationBufferController(searchBufferController):
|
||||||
|
|
||||||
def start_stream(self, start=False):
|
def start_stream(self, start=False):
|
||||||
@@ -861,3 +1006,11 @@ class conversationBufferController(searchBufferController):
|
|||||||
if number_of_items > 0:
|
if number_of_items > 0:
|
||||||
self.session.sound.play("search_updated.ogg")
|
self.session.sound.play("search_updated.ogg")
|
||||||
|
|
||||||
|
class pocketBufferController(baseBufferController):
|
||||||
|
def __init__(self, parent, name, sessionObject, account, sound=None, function=None, bufferType=None, *args, **kwargs):
|
||||||
|
super(pocketBufferController, self).__init__(parent, name, sessionObject, account, sound, function, bufferType, *args, **kwargs)
|
||||||
|
self.type = "pocket"
|
||||||
|
|
||||||
|
def start_stream(self):
|
||||||
|
log.debug("Starting stream for buffer %s, account %s and type %s" % (self.name, self.account, self.type))
|
||||||
|
log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs))
|
||||||
|
@@ -27,7 +27,7 @@ class listsController(object):
|
|||||||
name = dialog.get("name")
|
name = dialog.get("name")
|
||||||
description = dialog.get("description")
|
description = dialog.get("description")
|
||||||
p = dialog.get("public")
|
p = dialog.get("public")
|
||||||
if public == True:
|
if p == True:
|
||||||
mode = "public"
|
mode = "public"
|
||||||
else:
|
else:
|
||||||
mode = "private"
|
mode = "private"
|
||||||
@@ -73,4 +73,4 @@ class listsController(object):
|
|||||||
def open_list_as_buffer(self, *args, **kwargs):
|
def open_list_as_buffer(self, *args, **kwargs):
|
||||||
if self.dialog.lista.get_count() == 0: return
|
if self.dialog.lista.get_count() == 0: return
|
||||||
list = self.session.db["lists"][self.dialog.get_item()]
|
list = self.session.db["lists"][self.dialog.get_item()]
|
||||||
pub.sendMessage("create-new-buffer", buffer="list", account=self.session.db["user_name"], create=list["slug"])
|
pub.sendMessage("create-new-buffer", buffer="list", account=self.session.db["user_name"], create=list["name"])
|
@@ -35,6 +35,8 @@ import pygeocoder
|
|||||||
from pygeolib import GeocoderError
|
from pygeolib import GeocoderError
|
||||||
import logging
|
import logging
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
from mysc import localization
|
||||||
|
import os
|
||||||
|
|
||||||
log = logging.getLogger("mainController")
|
log = logging.getLogger("mainController")
|
||||||
|
|
||||||
@@ -88,10 +90,16 @@ class Controller(object):
|
|||||||
""" Gets the last valid buffer for an account.
|
""" Gets the last valid buffer for an account.
|
||||||
account str: A twitter username.
|
account str: A twitter username.
|
||||||
The last valid buffer is the last buffer that contains a session object assigned."""
|
The last valid buffer is the last buffer that contains a session object assigned."""
|
||||||
results = []
|
# results = self.get_buffers_for_account(account)
|
||||||
[results.append(i) for i in self.buffers if i.account == account and i.invisible == True]
|
results = self.get_buffers_for_account(account)
|
||||||
return self.view.search(results[-1].name, results[-1].account)
|
return self.view.search(results[-1].name, results[-1].account)
|
||||||
|
|
||||||
|
def get_buffers_for_account(self, account):
|
||||||
|
results = []
|
||||||
|
buffers = self.view.get_buffers()
|
||||||
|
[results.append(self.search_buffer(i.name, i.account)) for i in buffers if i.account == account and (i.type != "account")]
|
||||||
|
return results
|
||||||
|
|
||||||
def bind_stream_events(self):
|
def bind_stream_events(self):
|
||||||
""" Binds all the streaming events with their functions."""
|
""" Binds all the streaming events with their functions."""
|
||||||
log.debug("Binding events for the Twitter stream API...")
|
log.debug("Binding events for the Twitter stream API...")
|
||||||
@@ -117,16 +125,17 @@ class Controller(object):
|
|||||||
log.debug("Binding other application events...")
|
log.debug("Binding other application events...")
|
||||||
pub.subscribe(self.logout_account, "logout")
|
pub.subscribe(self.logout_account, "logout")
|
||||||
pub.subscribe(self.login_account, "login")
|
pub.subscribe(self.login_account, "login")
|
||||||
pub.subscribe(self.manage_stream_errors, "stream-error")
|
pub.subscribe(self.manage_stream_errors, "streamError")
|
||||||
pub.subscribe(self.create_new_buffer, "create-new-buffer")
|
pub.subscribe(self.create_new_buffer, "create-new-buffer")
|
||||||
pub.subscribe(self.restart_streams, "restart-streams")
|
pub.subscribe(self.restart_streams, "restart-streams")
|
||||||
|
pub.subscribe(self.execute_action, "execute-action")
|
||||||
if system == "Windows":
|
if system == "Windows":
|
||||||
pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed")
|
pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed")
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.search, menuitem=self.view.menuitem_search)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.search, menuitem=self.view.menuitem_search)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.list_manager, menuitem=self.view.lists)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.list_manager, menuitem=self.view.lists)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_trending_topics, menuitem=self.view.trends)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_trending_topics, menuitem=self.view.trends)
|
||||||
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.find, menuitem=self.view.find)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.accountConfiguration, menuitem=self.view.account_settings)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.accountConfiguration, menuitem=self.view.account_settings)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.configuration, menuitem=self.view.prefs)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.configuration, menuitem=self.view.prefs)
|
||||||
|
|
||||||
@@ -164,6 +173,9 @@ class Controller(object):
|
|||||||
if widgetUtils.toolkit == "wx":
|
if widgetUtils.toolkit == "wx":
|
||||||
widgetUtils.connect_event(self.view.nb, widgetUtils.NOTEBOOK_PAGE_CHANGED, self.buffer_changed)
|
widgetUtils.connect_event(self.view.nb, widgetUtils.NOTEBOOK_PAGE_CHANGED, self.buffer_changed)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.report_error, self.view.reportError)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.report_error, self.view.reportError)
|
||||||
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_documentation, self.view.doc)
|
||||||
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.add_to_list, self.view.addToList)
|
||||||
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_from_list, self.view.removeFromList)
|
||||||
|
|
||||||
def set_systray_icon(self):
|
def set_systray_icon(self):
|
||||||
self.systrayIcon = sysTrayIcon.SysTrayIcon()
|
self.systrayIcon = sysTrayIcon.SysTrayIcon()
|
||||||
@@ -225,7 +237,6 @@ class Controller(object):
|
|||||||
self.create_ignored_session_buffer(session_.sessions[i])
|
self.create_ignored_session_buffer(session_.sessions[i])
|
||||||
continue
|
continue
|
||||||
self.create_buffers(session_.sessions[i])
|
self.create_buffers(session_.sessions[i])
|
||||||
self.set_buffer_positions(session_.sessions[i])
|
|
||||||
|
|
||||||
# Connection checker executed each minute.
|
# Connection checker executed each minute.
|
||||||
self.checker_function = RepeatingTimer(60, self.check_connection)
|
self.checker_function = RepeatingTimer(60, self.check_connection)
|
||||||
@@ -236,6 +247,7 @@ class Controller(object):
|
|||||||
for i in session_.sessions:
|
for i in session_.sessions:
|
||||||
if session_.sessions[i].is_logged == False: continue
|
if session_.sessions[i].is_logged == False: continue
|
||||||
self.start_buffers(session_.sessions[i])
|
self.start_buffers(session_.sessions[i])
|
||||||
|
self.set_buffer_positions(session_.sessions[i])
|
||||||
if config.app["app-settings"]["play_ready_sound"] == True:
|
if config.app["app-settings"]["play_ready_sound"] == True:
|
||||||
session_.sessions[session_.sessions.keys()[0]].sound.play("ready.ogg")
|
session_.sessions[session_.sessions.keys()[0]].sound.play("ready.ogg")
|
||||||
if config.app["app-settings"]["speak_ready_msg"] == True:
|
if config.app["app-settings"]["speak_ready_msg"] == True:
|
||||||
@@ -253,6 +265,7 @@ class Controller(object):
|
|||||||
for i in session_.sessions:
|
for i in session_.sessions:
|
||||||
if session_.sessions[i].session_id == session_id: session = session_.sessions[i]
|
if session_.sessions[i].session_id == session_id: session = session_.sessions[i]
|
||||||
session.login()
|
session.login()
|
||||||
|
session.db = dict()
|
||||||
self.create_buffers(session, False)
|
self.create_buffers(session, False)
|
||||||
self.start_buffers(session)
|
self.start_buffers(session)
|
||||||
|
|
||||||
@@ -276,11 +289,11 @@ class Controller(object):
|
|||||||
self.buffers.append(mentions)
|
self.buffers.append(mentions)
|
||||||
self.view.insert_buffer(mentions.buffer, name=_(u"Mentions"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
self.view.insert_buffer(mentions.buffer, name=_(u"Mentions"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
elif i == 'dm':
|
elif i == 'dm':
|
||||||
dm = buffersController.baseBufferController(self.view.nb, "get_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel", sound="dm_received.ogg")
|
dm = buffersController.baseBufferController(self.view.nb, "get_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel", sound="dm_received.ogg", full_text=True)
|
||||||
self.buffers.append(dm)
|
self.buffers.append(dm)
|
||||||
self.view.insert_buffer(dm.buffer, name=_(u"Direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
self.view.insert_buffer(dm.buffer, name=_(u"Direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
elif i == 'sent_dm':
|
elif i == 'sent_dm':
|
||||||
sent_dm = buffersController.baseBufferController(self.view.nb, "get_sent_messages", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel")
|
sent_dm = buffersController.baseBufferController(self.view.nb, "get_sent_messages", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel", full_text=True)
|
||||||
self.buffers.append(sent_dm)
|
self.buffers.append(sent_dm)
|
||||||
self.view.insert_buffer(sent_dm.buffer, name=_(u"Sent direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
self.view.insert_buffer(sent_dm.buffer, name=_(u"Sent direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
elif i == 'sent_tweets':
|
elif i == 'sent_tweets':
|
||||||
@@ -318,14 +331,14 @@ class Controller(object):
|
|||||||
for i in session.settings["other_buffers"]["timelines"]:
|
for i in session.settings["other_buffers"]["timelines"]:
|
||||||
tl = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "%s-timeline" % (i,), session, session.db["user_name"], bufferType=None, screen_name=i)
|
tl = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "%s-timeline" % (i,), session, session.db["user_name"], bufferType=None, screen_name=i)
|
||||||
self.buffers.append(tl)
|
self.buffers.append(tl)
|
||||||
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}".format(i)), pos=self.view.search("timelines", session.db["user_name"]))
|
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(i,), pos=self.view.search("timelines", session.db["user_name"]))
|
||||||
favs_timelines = buffersController.emptyPanel(self.view.nb, "favs_timelines", session.db["user_name"])
|
favs_timelines = buffersController.emptyPanel(self.view.nb, "favs_timelines", session.db["user_name"])
|
||||||
self.buffers.append(favs_timelines)
|
self.buffers.append(favs_timelines)
|
||||||
self.view.insert_buffer(favs_timelines.buffer , name=_(u"Favourites timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
self.view.insert_buffer(favs_timelines.buffer , name=_(u"Favourites timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
for i in session.settings["other_buffers"]["favourites_timelines"]:
|
for i in session.settings["other_buffers"]["favourites_timelines"]:
|
||||||
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (i,), session, session.db["user_name"], bufferType=None, screen_name=i)
|
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (i,), session, session.db["user_name"], bufferType=None, screen_name=i)
|
||||||
self.buffers.append(tl)
|
self.buffers.append(tl)
|
||||||
self.view.insert_buffer(tl.buffer, name=_(u"Favourites timeline for {}".format(i)), pos=self.view.search("favs_timelines", session.db["user_name"]))
|
self.view.insert_buffer(tl.buffer, name=_(u"Favourites timeline for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"]))
|
||||||
tl.timer = RepeatingTimer(300, tl.start_stream)
|
tl.timer = RepeatingTimer(300, tl.start_stream)
|
||||||
tl.timer.start()
|
tl.timer.start()
|
||||||
lists = buffersController.emptyPanel(self.view.nb, "lists", session.db["user_name"])
|
lists = buffersController.emptyPanel(self.view.nb, "lists", session.db["user_name"])
|
||||||
@@ -342,7 +355,7 @@ class Controller(object):
|
|||||||
for i in session.settings["other_buffers"]["tweet_searches"]:
|
for i in session.settings["other_buffers"]["tweet_searches"]:
|
||||||
tl = buffersController.searchBufferController(self.view.nb, "search", "%s-searchterm" % (i,), session, session.db["user_name"], bufferType="searchPanel", q=i, count=session.settings["general"]["max_tweets_per_call"])
|
tl = buffersController.searchBufferController(self.view.nb, "search", "%s-searchterm" % (i,), session, session.db["user_name"], bufferType="searchPanel", q=i, count=session.settings["general"]["max_tweets_per_call"])
|
||||||
self.buffers.append(tl)
|
self.buffers.append(tl)
|
||||||
self.view.insert_buffer(tl.buffer, name=_(u"Search for {}".format(i)), pos=self.view.search("searches", session.db["user_name"]))
|
self.view.insert_buffer(tl.buffer, name=_(u"Search for {}").format(i), pos=self.view.search("searches", session.db["user_name"]))
|
||||||
tl.timer = RepeatingTimer(180, tl.start_stream)
|
tl.timer = RepeatingTimer(180, tl.start_stream)
|
||||||
tl.timer.start()
|
tl.timer.start()
|
||||||
for i in session.settings["other_buffers"]["trending_topic_buffers"]:
|
for i in session.settings["other_buffers"]["trending_topic_buffers"]:
|
||||||
@@ -350,41 +363,28 @@ class Controller(object):
|
|||||||
buffer.start_stream()
|
buffer.start_stream()
|
||||||
buffer.searchfunction = self.search
|
buffer.searchfunction = self.search
|
||||||
self.buffers.append(buffer)
|
self.buffers.append(buffer)
|
||||||
self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (buffer.name_), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
|
||||||
buffer.timer = RepeatingTimer(300, buffer.start_stream)
|
buffer.timer = RepeatingTimer(300, buffer.start_stream)
|
||||||
buffer.timer.start()
|
buffer.timer.start()
|
||||||
|
self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (buffer.name_), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
|
|
||||||
def set_buffer_positions(self,session):
|
def set_buffer_positions(self,session):
|
||||||
"Sets positions for buffers if values exist in the database."
|
"Sets positions for buffers if values exist in the database."
|
||||||
for i in self.buffers:
|
for i in self.buffers:
|
||||||
if str(i.name+"_pos") in session.db and hasattr(i.buffer,'list'):
|
if i.account == session.db["user_name"] and session.db.has_key(i.name+"_pos") and hasattr(i.buffer,'list'):
|
||||||
i.buffer.list.select_item(session.db[str(i.name+"_pos")])
|
i.buffer.list.select_item(session.db[str(i.name+"_pos")])
|
||||||
|
|
||||||
def logout_account(self, session_id):
|
def logout_account(self, session_id):
|
||||||
for i in session_.sessions:
|
for i in session_.sessions:
|
||||||
if session_.sessions[i].session_id == session_id: session = session_.sessions[i]
|
if session_.sessions[i].session_id == session_id: session = session_.sessions[i]
|
||||||
user = session.db["user_name"]
|
user = session.db["user_name"]
|
||||||
self.destroy_buffer("home_timeline", user)
|
delete_buffers = []
|
||||||
self.destroy_buffer("mentions", user)
|
for i in self.buffers:
|
||||||
self.destroy_buffer("direct_messages", user)
|
if i.account == user and i.name != user:
|
||||||
self.destroy_buffer("sent_direct_messages", user)
|
delete_buffers.append(i.name)
|
||||||
self.destroy_buffer("sent_tweets", user)
|
for i in delete_buffers:
|
||||||
self.destroy_buffer("favourites", user)
|
self.destroy_buffer(i, user)
|
||||||
self.destroy_buffer("followers", user)
|
session.db = None
|
||||||
self.destroy_buffer("friends", user)
|
|
||||||
self.destroy_buffer("blocked", user)
|
|
||||||
self.destroy_buffer("muted", user)
|
|
||||||
self.destroy_buffer("events", user)
|
|
||||||
self.destroy_buffer("timelines", user)
|
|
||||||
for i in session.settings["other_buffers"]["timelines"]:
|
|
||||||
self.destroy_buffer("%s-timeline" % (i,), user)
|
|
||||||
self.destroy_buffer("favs_timelines", user)
|
|
||||||
self.destroy_buffer("searches", user)
|
|
||||||
for i in session.settings["other_buffers"]["tweet_searches"]:
|
|
||||||
self.destroy_buffer("%s-searchterm" % (i,), user)
|
|
||||||
for i in session.settings["other_buffers"]["trending_topic_buffers"]:
|
|
||||||
self.destroy_buffer("%s_tt" % (i,), user)
|
|
||||||
|
|
||||||
def destroy_buffer(self, buffer_name, account):
|
def destroy_buffer(self, buffer_name, account):
|
||||||
buffer = self.search_buffer(buffer_name, account)
|
buffer = self.search_buffer(buffer_name, account)
|
||||||
if buffer == None: return
|
if buffer == None: return
|
||||||
@@ -410,13 +410,42 @@ class Controller(object):
|
|||||||
return
|
return
|
||||||
elif dlg.get("users") == True:
|
elif dlg.get("users") == True:
|
||||||
search = buffersController.searchPeopleBufferController(self.view.nb, "search_users", "%s-searchUser" % (term,), buffer.session, buffer.session.db["user_name"], bufferType=None, q=term)
|
search = buffersController.searchPeopleBufferController(self.view.nb, "search_users", "%s-searchUser" % (term,), buffer.session, buffer.session.db["user_name"], bufferType=None, q=term)
|
||||||
self.buffers.append(search)
|
|
||||||
search.start_stream()
|
search.start_stream()
|
||||||
self.view.insert_buffer(search.buffer, name=_(u"Search for {}".format(term)), pos=self.view.search("searches", buffer.session.db["user_name"]))
|
pos=self.view.search("searches", buffer.session.db["user_name"])
|
||||||
|
self.insert_buffer(search, pos)
|
||||||
|
self.view.insert_buffer(search.buffer, name=_(u"Search for {}").format(term), pos=pos)
|
||||||
search.timer = RepeatingTimer(180, search.start_stream)
|
search.timer = RepeatingTimer(180, search.start_stream)
|
||||||
search.timer.start()
|
search.timer.start()
|
||||||
dlg.Destroy()
|
dlg.Destroy()
|
||||||
|
|
||||||
|
def find(self, *args, **kwargs):
|
||||||
|
if 'string' in kwargs:
|
||||||
|
string=kwargs['string']
|
||||||
|
else:
|
||||||
|
string=''
|
||||||
|
dlg = dialogs.find.findDialog(string)
|
||||||
|
if dlg.get_response() == widgetUtils.OK and dlg.get("string") != "":
|
||||||
|
string = dlg.get("string")
|
||||||
|
#If we still have an empty string for some reason (I.E. user clicked cancel, etc), return here.
|
||||||
|
if string == '':
|
||||||
|
log.debug("Find canceled.")
|
||||||
|
return
|
||||||
|
page = self.get_current_buffer()
|
||||||
|
if not hasattr(page.buffer, "list"):
|
||||||
|
output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True)
|
||||||
|
return
|
||||||
|
count = page.buffer.list.get_count()
|
||||||
|
if count < 1:
|
||||||
|
output.speak(_(u"Empty buffer."), True)
|
||||||
|
return
|
||||||
|
start = page.buffer.list.get_selected()
|
||||||
|
for i in xrange(start,count):
|
||||||
|
page.buffer.list.select_item(i)
|
||||||
|
if string.lower() in page.get_message().lower():
|
||||||
|
return output.speak(page.get_message(), True)
|
||||||
|
output.speak(_(u"{0} not found.").format(string,), True)
|
||||||
|
page.buffer.list.select_item(start)
|
||||||
|
|
||||||
def edit_keystrokes(self, *args, **kwargs):
|
def edit_keystrokes(self, *args, **kwargs):
|
||||||
editor = keystrokeEditor.KeystrokeEditor()
|
editor = keystrokeEditor.KeystrokeEditor()
|
||||||
if editor.changed == True:
|
if editor.changed == True:
|
||||||
@@ -461,16 +490,40 @@ class Controller(object):
|
|||||||
try:
|
try:
|
||||||
list = buff.session.twitter.twitter.add_list_member(list_id=buff.session.db["lists"][dlg.get_item()]["id"], screen_name=user)
|
list = buff.session.twitter.twitter.add_list_member(list_id=buff.session.db["lists"][dlg.get_item()]["id"], screen_name=user)
|
||||||
older_list = utils.find_item(buff.session.db["lists"][dlg.get_item()]["id"], buff.session.db["lists"])
|
older_list = utils.find_item(buff.session.db["lists"][dlg.get_item()]["id"], buff.session.db["lists"])
|
||||||
|
listBuffer = self.search_buffer("%s-list" % (buff.session.db["lists"][dlg.get_item()]["name"].lower()), buff.session.db["user_name"])
|
||||||
|
if listBuffer != None: listBuffer.get_user_ids()
|
||||||
buff.session.db["lists"].pop(older_list)
|
buff.session.db["lists"].pop(older_list)
|
||||||
buff.session.db["lists"].append(list)
|
buff.session.db["lists"].append(list)
|
||||||
listBuffer = self.search_buffer("%s-list" % (buff.session.db["lists"][dlg.get_item()]["name"]), buff.session.db["user_name"])
|
if listBuffer != None: pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buff.session)
|
||||||
listBuffer.get_user_ids()
|
|
||||||
pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buff.session)
|
|
||||||
except TwythonError as e:
|
except TwythonError as e:
|
||||||
output.speak("error %s: %s" % (e.error_code, e.msg))
|
output.speak("error %s: %s" % (e.error_code, e.msg))
|
||||||
|
|
||||||
def remove_from_list(self, user):
|
def remove_from_list(self, *args, **kwargs):
|
||||||
pass
|
buff = self.get_best_buffer()
|
||||||
|
if not hasattr(buff, "get_right_tweet"): return
|
||||||
|
tweet = buff.get_right_tweet()
|
||||||
|
if buff.type != "people":
|
||||||
|
users = utils.get_all_users(tweet, buff.session.db)
|
||||||
|
else:
|
||||||
|
users = [tweet["screen_name"]]
|
||||||
|
dlg = dialogs.utils.selectUserDialog(_(u"Select the user"), users)
|
||||||
|
if dlg.get_response() == widgetUtils.OK:
|
||||||
|
user = dlg.get_user()
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
dlg = dialogs.lists.removeUserListDialog()
|
||||||
|
dlg.populate_list([compose.compose_list(item) for item in buff.session.db["lists"]])
|
||||||
|
if dlg.get_response() == widgetUtils.OK:
|
||||||
|
try:
|
||||||
|
list = buff.session.twitter.twitter.delete_list_member(list_id=buff.session.db["lists"][dlg.get_item()]["id"], screen_name=user)
|
||||||
|
older_list = utils.find_item(buff.session.db["lists"][dlg.get_item()]["id"], buff.session.db["lists"])
|
||||||
|
listBuffer = self.search_buffer("%s-list" % (buff.session.db["lists"][dlg.get_item()]["name"].lower()), buff.session.db["user_name"])
|
||||||
|
if listBuffer != None: listBuffer.get_user_ids()
|
||||||
|
buff.session.db["lists"].pop(older_list)
|
||||||
|
buff.session.db["lists"].append(list)
|
||||||
|
if listBuffer != None: pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buff.session)
|
||||||
|
except TwythonError as e:
|
||||||
|
output.speak("error %s: %s" % (e.error_code, e.msg))
|
||||||
|
|
||||||
def list_manager(self, *args, **kwargs):
|
def list_manager(self, *args, **kwargs):
|
||||||
s = self.get_best_buffer().session
|
s = self.get_best_buffer().session
|
||||||
@@ -522,9 +575,11 @@ class Controller(object):
|
|||||||
self.exit_()
|
self.exit_()
|
||||||
|
|
||||||
def exit_(self, *args, **kwargs):
|
def exit_(self, *args, **kwargs):
|
||||||
|
for i in self.buffers: i.save_positions()
|
||||||
log.debug("Exiting...")
|
log.debug("Exiting...")
|
||||||
log.debug("Saving global configuration...")
|
log.debug("Saving global configuration...")
|
||||||
config.app.write()
|
config.app.write()
|
||||||
|
config.keymap.write()
|
||||||
for item in session_.sessions:
|
for item in session_.sessions:
|
||||||
if session_.sessions[item].logged == False: continue
|
if session_.sessions[item].logged == False: continue
|
||||||
log.debug("Saving config for %s session" % (session_.sessions[item].session_id,))
|
log.debug("Saving config for %s session" % (session_.sessions[item].session_id,))
|
||||||
@@ -658,6 +713,9 @@ class Controller(object):
|
|||||||
msg = messages.viewTweet(tweet, tweetsList)
|
msg = messages.viewTweet(tweet, tweetsList)
|
||||||
elif buffer.type == "account" or buffer.type == "empty":
|
elif buffer.type == "account" or buffer.type == "empty":
|
||||||
return
|
return
|
||||||
|
elif buffer.name == "sent_tweets":
|
||||||
|
tweet, tweetsList = buffer.get_full_tweet()
|
||||||
|
msg = messages.viewTweet(tweet, tweetsList)
|
||||||
else:
|
else:
|
||||||
non_tweet = buffer.get_formatted_message()
|
non_tweet = buffer.get_formatted_message()
|
||||||
msg = messages.viewTweet(non_tweet, [], False)
|
msg = messages.viewTweet(non_tweet, [], False)
|
||||||
@@ -675,8 +733,7 @@ class Controller(object):
|
|||||||
users = [tweet["screen_name"]]
|
users = [tweet["screen_name"]]
|
||||||
dlg = dialogs.userSelection.selectUserDialog(users=users, default=default)
|
dlg = dialogs.userSelection.selectUserDialog(users=users, default=default)
|
||||||
if dlg.get_response() == widgetUtils.OK:
|
if dlg.get_response() == widgetUtils.OK:
|
||||||
buffer = self.get_best_buffer()
|
usr = utils.if_user_exists(buff.session.twitter.twitter, dlg.get_user())
|
||||||
usr = utils.if_user_exists(buffer.session.twitter.twitter, dlg.get_user())
|
|
||||||
if usr != None:
|
if usr != None:
|
||||||
if usr["protected"] == True:
|
if usr["protected"] == True:
|
||||||
if usr["following"] == False:
|
if usr["following"] == False:
|
||||||
@@ -685,28 +742,38 @@ class Controller(object):
|
|||||||
answer = commonMessageDialogs.protected_user()
|
answer = commonMessageDialogs.protected_user()
|
||||||
if answer == widgetUtils.NO: return
|
if answer == widgetUtils.NO: return
|
||||||
if dlg.get_action() == "tweets":
|
if dlg.get_action() == "tweets":
|
||||||
if dlg.get_user() in buffer.session.settings["other_buffers"]["timelines"]:
|
if usr["statuses_count"] == 0:
|
||||||
|
commonMessageDialogs.no_tweets()
|
||||||
|
return
|
||||||
|
if dlg.get_user() in buff.session.settings["other_buffers"]["timelines"]:
|
||||||
commonMessageDialogs.timeline_exist()
|
commonMessageDialogs.timeline_exist()
|
||||||
return
|
return
|
||||||
tl = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "%s-timeline" % (dlg.get_user(),), buffer.session, buffer.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
tl = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "%s-timeline" % (dlg.get_user(),), buff.session, buff.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
||||||
tl.start_stream()
|
tl.start_stream()
|
||||||
self.buffers.append(tl)
|
pos=self.view.search("timelines", buff.session.db["user_name"])
|
||||||
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}".format(dlg.get_user())), pos=self.view.search("timelines", buffer.session.db["user_name"]))
|
self.insert_buffer(tl, pos+1)
|
||||||
buffer.session.settings["other_buffers"]["timelines"].append(dlg.get_user())
|
# self.buffers.insert(pos+1, tl)
|
||||||
pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buffer.session)
|
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(dlg.get_user()), pos=pos)
|
||||||
buffer.session.sound.play("create_timeline.ogg")
|
buff.session.settings["other_buffers"]["timelines"].append(dlg.get_user())
|
||||||
|
pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buff.session)
|
||||||
|
buff.session.sound.play("create_timeline.ogg")
|
||||||
else:
|
else:
|
||||||
|
if usr["favourites_count"] == 0:
|
||||||
|
commonMessageDialogs.no_favs()
|
||||||
|
return
|
||||||
if dlg.get_user() in buffer.session.settings["other_buffers"]["favourites_timelines"]:
|
if dlg.get_user() in buffer.session.settings["other_buffers"]["favourites_timelines"]:
|
||||||
commonMessageDialogs.timeline_exist()
|
commonMessageDialogs.timeline_exist()
|
||||||
return
|
return
|
||||||
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (dlg.get_user(),), buffer.session, buffer.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (dlg.get_user(),), buff.session, buff.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
||||||
self.buffers.append(tl)
|
pos=self.view.search("favs_timelines", buff.session.db["user_name"])
|
||||||
self.view.insert_buffer(buffer=tl.buffer, name=_(u"Favourites timeline for {}".format(dlg.get_user())), pos=self.view.search("favs_timelines", buffer.session.db["user_name"]))
|
self.insert_buffer(tl, pos+1)
|
||||||
|
# self.buffers.insert(pos+1, tl)
|
||||||
|
self.view.insert_buffer(buffer=tl.buffer, name=_(u"Favourites timeline for {}").format(dlg.get_user()), pos=pos)
|
||||||
tl.start_stream()
|
tl.start_stream()
|
||||||
tl.timer = RepeatingTimer(300, tl.start_stream)
|
tl.timer = RepeatingTimer(300, tl.start_stream)
|
||||||
tl.timer.start()
|
tl.timer.start()
|
||||||
buffer.session.settings["other_buffers"]["favourites_timelines"].append(dlg.get_user())
|
buff.session.settings["other_buffers"]["favourites_timelines"].append(dlg.get_user())
|
||||||
buffer.session.sound.play("create_timeline.ogg")
|
buff.session.sound.play("create_timeline.ogg")
|
||||||
else:
|
else:
|
||||||
commonMessageDialogs.user_not_exist()
|
commonMessageDialogs.user_not_exist()
|
||||||
|
|
||||||
@@ -717,8 +784,10 @@ class Controller(object):
|
|||||||
search = buffersController.conversationBufferController(self.view.nb, "search", "%s-searchterm" % (id,), buffer.session, buffer.session.db["user_name"], bufferType="searchPanel", since_id=id, q="@{0}".format(user,))
|
search = buffersController.conversationBufferController(self.view.nb, "search", "%s-searchterm" % (id,), buffer.session, buffer.session.db["user_name"], bufferType="searchPanel", since_id=id, q="@{0}".format(user,))
|
||||||
search.tweet = buffer.get_right_tweet()
|
search.tweet = buffer.get_right_tweet()
|
||||||
search.start_stream(start=True)
|
search.start_stream(start=True)
|
||||||
self.buffers.append(search)
|
pos=self.view.search("searches", buffer.session.db["user_name"])
|
||||||
self.view.insert_buffer(search.buffer, name=_(u"Conversation with {0}".format(user)), pos=self.view.search("searches", buffer.session.db["user_name"]))
|
# self.buffers.append(search)
|
||||||
|
self.insert_buffer(search, pos)
|
||||||
|
self.view.insert_buffer(search.buffer, name=_(u"Conversation with {0}").format(user), pos=pos)
|
||||||
search.timer = RepeatingTimer(300, search.start_stream)
|
search.timer = RepeatingTimer(300, search.start_stream)
|
||||||
search.timer.start()
|
search.timer.start()
|
||||||
|
|
||||||
@@ -744,8 +813,9 @@ class Controller(object):
|
|||||||
if woeid in buff.session.settings["other_buffers"]["trending_topic_buffers"]: return
|
if woeid in buff.session.settings["other_buffers"]["trending_topic_buffers"]: return
|
||||||
buffer = buffersController.trendsBufferController(self.view.nb, "%s_tt" % (woeid,), buff.session, buff.account, woeid)
|
buffer = buffersController.trendsBufferController(self.view.nb, "%s_tt" % (woeid,), buff.session, buff.account, woeid)
|
||||||
buffer.searchfunction = self.search
|
buffer.searchfunction = self.search
|
||||||
|
pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])
|
||||||
|
self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (trends.get_string()), pos=pos)
|
||||||
self.buffers.append(buffer)
|
self.buffers.append(buffer)
|
||||||
self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (trends.get_string()), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"]))
|
|
||||||
buffer.start_stream()
|
buffer.start_stream()
|
||||||
timer = RepeatingTimer(300, buffer.start_stream)
|
timer = RepeatingTimer(300, buffer.start_stream)
|
||||||
timer.start()
|
timer.start()
|
||||||
@@ -885,6 +955,7 @@ class Controller(object):
|
|||||||
self.view.change_buffer(buff-1)
|
self.view.change_buffer(buff-1)
|
||||||
while self.get_current_buffer().invisible == False: self.skip_buffer(False)
|
while self.get_current_buffer().invisible == False: self.skip_buffer(False)
|
||||||
buffer = self.get_current_buffer()
|
buffer = self.get_current_buffer()
|
||||||
|
if self.showing == True: buffer.buffer.set_focus_in_list()
|
||||||
try:
|
try:
|
||||||
msg = _(u"%s, %s of %s") % (self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count())
|
msg = _(u"%s, %s of %s") % (self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count())
|
||||||
except:
|
except:
|
||||||
@@ -903,6 +974,7 @@ class Controller(object):
|
|||||||
self.view.change_buffer(buff+1)
|
self.view.change_buffer(buff+1)
|
||||||
while self.get_current_buffer().invisible == False: self.skip_buffer(True)
|
while self.get_current_buffer().invisible == False: self.skip_buffer(True)
|
||||||
buffer = self.get_current_buffer()
|
buffer = self.get_current_buffer()
|
||||||
|
if self.showing == True: buffer.buffer.set_focus_in_list()
|
||||||
try:
|
try:
|
||||||
msg = _(u"%s, %s of %s") % (self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count())
|
msg = _(u"%s, %s of %s") % (self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count())
|
||||||
except:
|
except:
|
||||||
@@ -923,6 +995,7 @@ class Controller(object):
|
|||||||
return
|
return
|
||||||
self.view.change_buffer(buff)
|
self.view.change_buffer(buff)
|
||||||
buffer = self.get_current_buffer()
|
buffer = self.get_current_buffer()
|
||||||
|
if self.showing == True: buffer.buffer.set_focus_in_list()
|
||||||
try:
|
try:
|
||||||
msg = _(u"%s. %s, %s of %s") % (buffer.account, self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count())
|
msg = _(u"%s. %s, %s of %s") % (buffer.account, self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count())
|
||||||
except:
|
except:
|
||||||
@@ -943,6 +1016,7 @@ class Controller(object):
|
|||||||
return
|
return
|
||||||
self.view.change_buffer(buff)
|
self.view.change_buffer(buff)
|
||||||
buffer = self.get_current_buffer()
|
buffer = self.get_current_buffer()
|
||||||
|
if self.showing == True: buffer.buffer.set_focus_in_list()
|
||||||
try:
|
try:
|
||||||
msg = _(u"%s. %s, %s of %s") % (buffer.account, self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count())
|
msg = _(u"%s. %s, %s of %s") % (buffer.account, self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count())
|
||||||
except:
|
except:
|
||||||
@@ -989,11 +1063,6 @@ class Controller(object):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def interact(self):
|
|
||||||
"Select the best action for the currently focused tweet (audio, geocode, URL, etc)."
|
|
||||||
buffer = self.get_current_buffer()
|
|
||||||
buffer.interact()
|
|
||||||
|
|
||||||
def url(self, *args, **kwargs):
|
def url(self, *args, **kwargs):
|
||||||
buffer = self.get_current_buffer()
|
buffer = self.get_current_buffer()
|
||||||
buffer.url()
|
buffer.url()
|
||||||
@@ -1153,9 +1222,16 @@ class Controller(object):
|
|||||||
log.debug("Starting the streaming endpoint")
|
log.debug("Starting the streaming endpoint")
|
||||||
session.start_streaming()
|
session.start_streaming()
|
||||||
|
|
||||||
|
def set_positions(self):
|
||||||
|
for i in session_.sessions:
|
||||||
|
self.set_buffer_positions(i)
|
||||||
|
|
||||||
def manage_stream_errors(self, session):
|
def manage_stream_errors(self, session):
|
||||||
log.error("An error ocurred with the stream for the %s session. It will be destroyed" % (session,))
|
log.debug(" Restarting %s session streams. It will be destroyed" % (session,))
|
||||||
s = session_.sessions[session]
|
s = session_.sessions[session]
|
||||||
|
for i in self.buffers:
|
||||||
|
if i.invisible == True and i.session.session_id == s.session_id and i.type != "people":
|
||||||
|
i.start_stream()
|
||||||
s.listen_stream_error()
|
s.listen_stream_error()
|
||||||
|
|
||||||
def check_connection(self):
|
def check_connection(self):
|
||||||
@@ -1203,7 +1279,8 @@ class Controller(object):
|
|||||||
return
|
return
|
||||||
tl = buffersController.listBufferController(self.view.nb, "get_list_statuses", create+"-list", buff.session, buff.session.db["user_name"], bufferType=None, list_id=utils.find_list(create, buff.session.db["lists"]))
|
tl = buffersController.listBufferController(self.view.nb, "get_list_statuses", create+"-list", buff.session, buff.session.db["user_name"], bufferType=None, list_id=utils.find_list(create, buff.session.db["lists"]))
|
||||||
buff.session.lists.append(tl)
|
buff.session.lists.append(tl)
|
||||||
self.buffers.append(tl)
|
pos=self.view.search("lists", buff.session.db["user_name"])
|
||||||
|
self.insert_buffer(tl, pos)
|
||||||
self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(create), pos=self.view.search("lists", buff.session.db["user_name"]))
|
self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(create), pos=self.view.search("lists", buff.session.db["user_name"]))
|
||||||
tl.start_stream()
|
tl.start_stream()
|
||||||
buff.session.settings["other_buffers"]["lists"].append(create)
|
buff.session.settings["other_buffers"]["lists"].append(create)
|
||||||
@@ -1281,6 +1358,25 @@ class Controller(object):
|
|||||||
buffer.session.settings["other_buffers"]["muted_buffers"].remove(buffer.name)
|
buffer.session.settings["other_buffers"]["muted_buffers"].remove(buffer.name)
|
||||||
output.speak(_(u"Buffer mute off"), True)
|
output.speak(_(u"Buffer mute off"), True)
|
||||||
|
|
||||||
def __del__(self):
|
def view_documentation(self, *args, **kwargs):
|
||||||
config.app.write()
|
lang = localization.get("documentation")
|
||||||
|
os.chdir("documentation/%s" % (lang,))
|
||||||
|
webbrowser.open("manual.html")
|
||||||
|
os.chdir("../../")
|
||||||
|
|
||||||
|
def insert_buffer(self, buffer, position):
|
||||||
|
self.buffers.insert(position, buffer)
|
||||||
|
|
||||||
|
def copy_to_clipboard(self, *args, **kwargs):
|
||||||
|
output.copy(self.get_current_buffer().get_message())
|
||||||
|
output.speak(_(u"Copied"))
|
||||||
|
|
||||||
|
def repeat_item(self, *args, **kwargs):
|
||||||
|
output.speak(self.get_current_buffer().get_message())
|
||||||
|
|
||||||
|
def execute_action(self, action):
|
||||||
|
if hasattr(self, action):
|
||||||
|
getattr(self, action)()
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
config.app.write()
|
@@ -25,6 +25,7 @@ class basicTweet(object):
|
|||||||
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
||||||
widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach)
|
widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach)
|
||||||
# if system == "Windows":
|
# if system == "Windows":
|
||||||
|
# if messageType != "dm":
|
||||||
widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor)
|
widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor)
|
||||||
self.text_processor()
|
self.text_processor()
|
||||||
widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten)
|
widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten)
|
||||||
@@ -79,21 +80,25 @@ class basicTweet(object):
|
|||||||
self.message.text_focus()
|
self.message.text_focus()
|
||||||
|
|
||||||
def text_processor(self, *args, **kwargs):
|
def text_processor(self, *args, **kwargs):
|
||||||
self.message.set_title(_(u"%s - %s of %d characters") % (self.title, len(self.message.get_text()), self.max))
|
|
||||||
if len(self.message.get_text()) > 1:
|
if len(self.message.get_text()) > 1:
|
||||||
self.message.enable_button("shortenButton")
|
self.message.enable_button("shortenButton")
|
||||||
self.message.enable_button("unshortenButton")
|
self.message.enable_button("unshortenButton")
|
||||||
else:
|
else:
|
||||||
self.message.disable_button("shortenButton")
|
self.message.disable_button("shortenButton")
|
||||||
self.message.disable_button("unshortenButton")
|
self.message.disable_button("unshortenButton")
|
||||||
if len(self.message.get_text()) > self.max:
|
if self.message.get("long_tweet") == False:
|
||||||
self.session.sound.play("max_length.ogg")
|
self.message.set_title(_(u"%s - %s of %d characters") % (self.title, len(self.message.get_text()), self.max))
|
||||||
|
if len(self.message.get_text()) > self.max:
|
||||||
|
self.session.sound.play("max_length.ogg")
|
||||||
|
else:
|
||||||
|
self.message.set_title(_(u"%s - %s characters") % (self.title, len(self.message.get_text())))
|
||||||
|
|
||||||
def spellcheck(self, event=None):
|
def spellcheck(self, event=None):
|
||||||
text = self.message.get_text()
|
text = self.message.get_text()
|
||||||
checker = SpellChecker.spellchecker.spellChecker(text, "")
|
checker = SpellChecker.spellchecker.spellChecker(text, "")
|
||||||
if hasattr(checker, "fixed_text"):
|
if hasattr(checker, "fixed_text"):
|
||||||
self.message.set_text(checker.fixed_text)
|
self.message.set_text(checker.fixed_text)
|
||||||
|
self.message.text_focus()
|
||||||
|
|
||||||
def attach(self, *args, **kwargs):
|
def attach(self, *args, **kwargs):
|
||||||
def completed_callback():
|
def completed_callback():
|
||||||
@@ -106,13 +111,17 @@ class basicTweet(object):
|
|||||||
output.speak(_(u"Unable to upload the audio"))
|
output.speak(_(u"Unable to upload the audio"))
|
||||||
dlg.cleanup()
|
dlg.cleanup()
|
||||||
dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
|
dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
|
||||||
|
self.message.text_focus()
|
||||||
|
|
||||||
class tweet(basicTweet):
|
class tweet(basicTweet):
|
||||||
def __init__(self, session, title, caption, text, messageType="tweet", max=140):
|
def __init__(self, session, title, caption, text, twishort_enabled, messageType="tweet", max=140):
|
||||||
super(tweet, self).__init__(session, title, caption, text, messageType, max)
|
super(tweet, self).__init__(session, title, caption, text, messageType, max)
|
||||||
self.image = None
|
self.image = None
|
||||||
widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
||||||
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||||
|
if twishort_enabled == False:
|
||||||
|
try: self.message.long_tweet.SetValue(False)
|
||||||
|
except AttributeError: pass
|
||||||
|
|
||||||
def upload_image(self, *args, **kwargs):
|
def upload_image(self, *args, **kwargs):
|
||||||
if self.message.get("upload_image") == _(u"Discard image"):
|
if self.message.get("upload_image") == _(u"Discard image"):
|
||||||
@@ -124,14 +133,15 @@ class tweet(basicTweet):
|
|||||||
self.image = self.message.get_image()
|
self.image = self.message.get_image()
|
||||||
if self.image != None:
|
if self.image != None:
|
||||||
self.message.set("upload_image", _(u"Discard image"))
|
self.message.set("upload_image", _(u"Discard image"))
|
||||||
|
self.message.text_focus()
|
||||||
|
|
||||||
def autocomplete_users(self, *args, **kwargs):
|
def autocomplete_users(self, *args, **kwargs):
|
||||||
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
|
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
|
||||||
c.show_menu()
|
c.show_menu()
|
||||||
|
|
||||||
class reply(tweet):
|
class reply(tweet):
|
||||||
def __init__(self, session, title, caption, text, users=None):
|
def __init__(self, session, title, caption, text, twishort_enabled, users=None):
|
||||||
super(reply, self).__init__(session, title, caption, text, messageType="reply")
|
super(reply, self).__init__(session, title, caption, text, twishort_enabled, messageType="reply")
|
||||||
self.users = users
|
self.users = users
|
||||||
if self.users != None and len(self.users) > 1:
|
if self.users != None and len(self.users) > 1:
|
||||||
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.BUTTON_PRESSED, self.mention_all)
|
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.BUTTON_PRESSED, self.mention_all)
|
||||||
@@ -145,7 +155,7 @@ class reply(tweet):
|
|||||||
|
|
||||||
class dm(basicTweet):
|
class dm(basicTweet):
|
||||||
def __init__(self, session, title, caption, text):
|
def __init__(self, session, title, caption, text):
|
||||||
super(dm, self).__init__(session, title, caption, text, messageType="dm")
|
super(dm, self).__init__(session, title, caption, text, messageType="dm", max=10000)
|
||||||
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||||
|
|
||||||
def autocomplete_users(self, *args, **kwargs):
|
def autocomplete_users(self, *args, **kwargs):
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import os
|
import os
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
import pocket
|
||||||
import sound_lib
|
import sound_lib
|
||||||
import paths
|
import paths
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
@@ -11,11 +12,13 @@ import application
|
|||||||
from wxUI.dialogs import configuration
|
from wxUI.dialogs import configuration
|
||||||
from wxUI import commonMessageDialogs
|
from wxUI import commonMessageDialogs
|
||||||
from extra.autocompletionUsers import settings
|
from extra.autocompletionUsers import settings
|
||||||
from extra.AudioUploader import dropbox_transfer
|
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
import logging
|
import logging
|
||||||
import config_utils
|
import config_utils
|
||||||
|
from pocket_utils import authorisationHandler
|
||||||
|
import BaseHTTPServer
|
||||||
log = logging.getLogger("Settings")
|
log = logging.getLogger("Settings")
|
||||||
|
import keys
|
||||||
|
|
||||||
class globalSettingsController(object):
|
class globalSettingsController(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -31,7 +34,7 @@ class globalSettingsController(object):
|
|||||||
if ".keymap" not in i:
|
if ".keymap" not in i:
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
res[config_utils.load_config(paths.app_path('keymaps/'+i))['info']['name']]=i
|
res[i[:-7]] =i
|
||||||
except:
|
except:
|
||||||
log.exception("Exception while loading keymap " + i)
|
log.exception("Exception while loading keymap " + i)
|
||||||
return res
|
return res
|
||||||
@@ -57,6 +60,7 @@ class globalSettingsController(object):
|
|||||||
|
|
||||||
self.dialog.set_value("general", "play_ready_sound", config.app["app-settings"]["play_ready_sound"])
|
self.dialog.set_value("general", "play_ready_sound", config.app["app-settings"]["play_ready_sound"])
|
||||||
self.dialog.set_value("general", "speak_ready_msg", config.app["app-settings"]["speak_ready_msg"])
|
self.dialog.set_value("general", "speak_ready_msg", config.app["app-settings"]["speak_ready_msg"])
|
||||||
|
self.dialog.set_value("general", "handle_longtweets", config.app["app-settings"]["handle_longtweets"])
|
||||||
self.dialog.set_value("general", "use_invisible_shorcuts", config.app["app-settings"]["use_invisible_keyboard_shorcuts"])
|
self.dialog.set_value("general", "use_invisible_shorcuts", config.app["app-settings"]["use_invisible_keyboard_shorcuts"])
|
||||||
self.dialog.set_value("general", "disable_sapi5", config.app["app-settings"]["voice_enabled"])
|
self.dialog.set_value("general", "disable_sapi5", config.app["app-settings"]["voice_enabled"])
|
||||||
self.dialog.set_value("general", "hide_gui", config.app["app-settings"]["hide_gui"])
|
self.dialog.set_value("general", "hide_gui", config.app["app-settings"]["hide_gui"])
|
||||||
@@ -75,6 +79,8 @@ class globalSettingsController(object):
|
|||||||
self.needs_restart = True
|
self.needs_restart = True
|
||||||
if self.kmnames[self.dialog.general.km.GetSelection()] != config.app["app-settings"]["load_keymap"]:
|
if self.kmnames[self.dialog.general.km.GetSelection()] != config.app["app-settings"]["load_keymap"]:
|
||||||
config.app["app-settings"]["load_keymap"] =self.kmnames[self.dialog.general.km.GetSelection()]
|
config.app["app-settings"]["load_keymap"] =self.kmnames[self.dialog.general.km.GetSelection()]
|
||||||
|
kmFile = open(paths.config_path("keymap.keymap"), "w")
|
||||||
|
kmFile.close()
|
||||||
self.needs_restart = True
|
self.needs_restart = True
|
||||||
|
|
||||||
if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"):
|
if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"):
|
||||||
@@ -83,6 +89,7 @@ class globalSettingsController(object):
|
|||||||
config.app["app-settings"]["voice_enabled"] = self.dialog.get_value("general", "disable_sapi5")
|
config.app["app-settings"]["voice_enabled"] = self.dialog.get_value("general", "disable_sapi5")
|
||||||
config.app["app-settings"]["hide_gui"] = self.dialog.get_value("general", "hide_gui")
|
config.app["app-settings"]["hide_gui"] = self.dialog.get_value("general", "hide_gui")
|
||||||
config.app["app-settings"]["ask_at_exit"] = self.dialog.get_value("general", "ask_at_exit")
|
config.app["app-settings"]["ask_at_exit"] = self.dialog.get_value("general", "ask_at_exit")
|
||||||
|
config.app["app-settings"]["handle_longtweets"] = self.dialog.get_value("general", "handle_longtweets")
|
||||||
config.app["app-settings"]["play_ready_sound"] = self.dialog.get_value("general", "play_ready_sound")
|
config.app["app-settings"]["play_ready_sound"] = self.dialog.get_value("general", "play_ready_sound")
|
||||||
config.app["app-settings"]["speak_ready_msg"] = self.dialog.get_value("general", "speak_ready_msg")
|
config.app["app-settings"]["speak_ready_msg"] = self.dialog.get_value("general", "speak_ready_msg")
|
||||||
if config.app["proxy"]["server"] != self.dialog.get_value("proxy", "server") or config.app["proxy"]["port"] != self.dialog.get_value("proxy", "port") or config.app["proxy"]["user"] != self.dialog.get_value("proxy", "user") or config.app["proxy"]["password"] != self.dialog.get_value("proxy", "password"):
|
if config.app["proxy"]["server"] != self.dialog.get_value("proxy", "server") or config.app["proxy"]["port"] != self.dialog.get_value("proxy", "port") or config.app["proxy"]["user"] != self.dialog.get_value("proxy", "user") or config.app["proxy"]["password"] != self.dialog.get_value("proxy", "password"):
|
||||||
@@ -139,12 +146,12 @@ class accountSettingsController(globalSettingsController):
|
|||||||
self.dialog.set_value("sound", "output", self.config["sound"]["output_device"])
|
self.dialog.set_value("sound", "output", self.config["sound"]["output_device"])
|
||||||
self.dialog.set_value("sound", "session_mute", self.config["sound"]["session_mute"])
|
self.dialog.set_value("sound", "session_mute", self.config["sound"]["session_mute"])
|
||||||
self.dialog.set_value("sound", "soundpack", self.config["sound"]["current_soundpack"])
|
self.dialog.set_value("sound", "soundpack", self.config["sound"]["current_soundpack"])
|
||||||
self.dialog.create_audio_services()
|
self.dialog.create_services()
|
||||||
if self.config["services"]["dropbox_token"] == "":
|
if self.config["services"]["pocket_access_token"] == "":
|
||||||
self.dialog.services.set_dropbox(False)
|
self.dialog.services.set_pocket(False)
|
||||||
else:
|
else:
|
||||||
self.dialog.services.set_dropbox(True)
|
self.dialog.services.set_pocket(True)
|
||||||
widgetUtils.connect_event(self.dialog.services.dropbox, widgetUtils.BUTTON_PRESSED, self.manage_dropbox)
|
widgetUtils.connect_event(self.dialog.services.pocketBtn, widgetUtils.BUTTON_PRESSED, self.manage_pocket)
|
||||||
self.dialog.set_value("services", "apiKey", self.config["sound"]["sndup_api_key"])
|
self.dialog.set_value("services", "apiKey", self.config["sound"]["sndup_api_key"])
|
||||||
self.dialog.realize()
|
self.dialog.realize()
|
||||||
self.dialog.set_title(_(u"Account settings for %s") % (self.user,))
|
self.dialog.set_title(_(u"Account settings for %s") % (self.user,))
|
||||||
@@ -237,32 +244,6 @@ class accountSettingsController(globalSettingsController):
|
|||||||
self.config["twitter"]["ignored_clients"].pop(id)
|
self.config["twitter"]["ignored_clients"].pop(id)
|
||||||
self.dialog.ignored_clients.remove_(id)
|
self.dialog.ignored_clients.remove_(id)
|
||||||
|
|
||||||
def manage_dropbox(self, *args, **kwargs):
|
|
||||||
if self.dialog.services.get_dropbox() == _(u"Link your Dropbox account"):
|
|
||||||
self.connect_dropbox()
|
|
||||||
else:
|
|
||||||
self.disconnect_dropbox()
|
|
||||||
|
|
||||||
def connect_dropbox(self):
|
|
||||||
auth = dropbox_transfer.dropboxLogin(self.config)
|
|
||||||
url = auth.get_url()
|
|
||||||
self.dialog.services.show_dialog()
|
|
||||||
webbrowser.open(url)
|
|
||||||
resp = self.dialog.services.get_response()
|
|
||||||
if resp == "":
|
|
||||||
self.dialog.services.set_dropbox(False)
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
auth.authorise(resp)
|
|
||||||
self.dialog.services.set_dropbox()
|
|
||||||
except:
|
|
||||||
self.dialog.services.show_error()
|
|
||||||
self.dialog.services.set_dropbox(False)
|
|
||||||
|
|
||||||
def disconnect_dropbox(self):
|
|
||||||
self.config["services"]["dropbox_token"] = ""
|
|
||||||
self.dialog.services.set_dropbox(False)
|
|
||||||
|
|
||||||
def get_buffers_list(self):
|
def get_buffers_list(self):
|
||||||
all_buffers = ['home','mentions','dm','sent_dm','sent_tweets','favorites','followers','friends','blocks','muted','events']
|
all_buffers = ['home','mentions','dm','sent_dm','sent_tweets','favorites','followers','friends','blocks','muted','events']
|
||||||
list_buffers = []
|
list_buffers = []
|
||||||
@@ -279,3 +260,26 @@ class accountSettingsController(globalSettingsController):
|
|||||||
change = self.dialog.buffers.get_event(ev)
|
change = self.dialog.buffers.get_event(ev)
|
||||||
if change == True:
|
if change == True:
|
||||||
self.dialog.buffers.change_selected_item()
|
self.dialog.buffers.change_selected_item()
|
||||||
|
|
||||||
|
def manage_pocket(self, *args, **kwargs):
|
||||||
|
if self.dialog.services.get_pocket_status() == _(u"Connect your Pocket account"):
|
||||||
|
self.connect_pocket()
|
||||||
|
else:
|
||||||
|
self.disconnect_pocket()
|
||||||
|
|
||||||
|
def connect_pocket(self):
|
||||||
|
dlg = self.dialog.services.show_pocket_dialog()
|
||||||
|
if dlg == widgetUtils.YES:
|
||||||
|
request_token = pocket.Pocket.get_request_token(consumer_key=keys.keyring.get("pocket_consumer_key"), redirect_uri="http://127.0.0.1:8080")
|
||||||
|
auth_url = pocket.Pocket.get_auth_url(code=request_token, redirect_uri="http://127.0.0.1:8080")
|
||||||
|
webbrowser.open_new_tab(auth_url)
|
||||||
|
httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', 8080), authorisationHandler.handler)
|
||||||
|
while authorisationHandler.logged == False:
|
||||||
|
httpd.handle_request()
|
||||||
|
user_credentials = pocket.Pocket.get_credentials(consumer_key=keys.keyring.get("pocket_consumer_key"), code=request_token)
|
||||||
|
self.dialog.services.set_pocket(True)
|
||||||
|
self.config["services"]["pocket_access_token"] = user_credentials["access_token"]
|
||||||
|
|
||||||
|
def disconnect_dropbox(self):
|
||||||
|
self.config["services"]["pocket_access_token"] = ""
|
||||||
|
self.dialog.services.set_pocket(False)
|
||||||
|
@@ -1,10 +1,11 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from wxUI.dialogs import userActions
|
|
||||||
from pubsub import pub
|
|
||||||
import re
|
import re
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
import output
|
import output
|
||||||
|
from wxUI.dialogs import userActions
|
||||||
|
from pubsub import pub
|
||||||
from twython import TwythonError
|
from twython import TwythonError
|
||||||
|
from extra import autocompletionUsers
|
||||||
|
|
||||||
class userActionsController(object):
|
class userActionsController(object):
|
||||||
def __init__(self, buffer, users=[], default="follow"):
|
def __init__(self, buffer, users=[], default="follow"):
|
||||||
@@ -12,9 +13,14 @@ class userActionsController(object):
|
|||||||
self.buffer = buffer
|
self.buffer = buffer
|
||||||
self.session = buffer.session
|
self.session = buffer.session
|
||||||
self.dialog = userActions.UserActionsDialog(users, default)
|
self.dialog = userActions.UserActionsDialog(users, default)
|
||||||
|
widgetUtils.connect_event(self.dialog.autocompletion, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||||
if self.dialog.get_response() == widgetUtils.OK:
|
if self.dialog.get_response() == widgetUtils.OK:
|
||||||
self.process_action()
|
self.process_action()
|
||||||
|
|
||||||
|
def autocomplete_users(self, *args, **kwargs):
|
||||||
|
c = autocompletionUsers.completion.autocompletionUsers(self.dialog, self.session.session_id)
|
||||||
|
c.show_menu("dm")
|
||||||
|
|
||||||
def process_action(self):
|
def process_action(self):
|
||||||
action = self.dialog.get_action()
|
action = self.dialog.get_action()
|
||||||
user = self.dialog.get_user()
|
user = self.dialog.get_user()
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
import widgetUtils
|
import widgetUtils
|
||||||
import wx_ui
|
import wx_ui
|
||||||
import wx_transfer_dialogs
|
import wx_transfer_dialogs
|
||||||
import dropbox_transfer, transfer
|
import transfer
|
||||||
import output
|
import output
|
||||||
import tempfile
|
import tempfile
|
||||||
import sound
|
import sound
|
||||||
@@ -31,6 +31,7 @@ import sound_lib
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
log = logging.getLogger("extra.AudioUploader.audioUploader")
|
log = logging.getLogger("extra.AudioUploader.audioUploader")
|
||||||
|
|
||||||
class audioUploader(object):
|
class audioUploader(object):
|
||||||
def __init__(self, configFile, completed_callback):
|
def __init__(self, configFile, completed_callback):
|
||||||
self.config = configFile
|
self.config = configFile
|
||||||
@@ -50,9 +51,7 @@ class audioUploader(object):
|
|||||||
log.debug("Uploading file %s to %s..." % (self.file, self.dialog.get("services")))
|
log.debug("Uploading file %s to %s..." % (self.file, self.dialog.get("services")))
|
||||||
self.uploaderDialog = wx_transfer_dialogs.UploadDialog(self.file)
|
self.uploaderDialog = wx_transfer_dialogs.UploadDialog(self.file)
|
||||||
output.speak(_(u"Attaching..."))
|
output.speak(_(u"Attaching..."))
|
||||||
if self.dialog.get("services") == "Dropbox":
|
if self.dialog.get("services") == "SNDUp":
|
||||||
self.uploaderFunction = dropbox_transfer.dropboxUploader(filename=self.file, completed_callback=completed_callback, config=self.config)
|
|
||||||
elif self.dialog.get("services") == "SNDUp":
|
|
||||||
base_url = "http://sndup.net/post.php"
|
base_url = "http://sndup.net/post.php"
|
||||||
if len(self.config["sound"]["sndup_api_key"]) > 0:
|
if len(self.config["sound"]["sndup_api_key"]) > 0:
|
||||||
url = base_url + '?apikey=' + self.config['sound']['sndup_api_key']
|
url = base_url + '?apikey=' + self.config['sound']['sndup_api_key']
|
||||||
@@ -69,8 +68,6 @@ class audioUploader(object):
|
|||||||
def get_available_services(self):
|
def get_available_services(self):
|
||||||
services = []
|
services = []
|
||||||
services.append("TwUp")
|
services.append("TwUp")
|
||||||
if self.config["services"]["dropbox_token"] != "":
|
|
||||||
services.append("Dropbox")
|
|
||||||
services.append("SNDUp")
|
services.append("SNDUp")
|
||||||
return services
|
return services
|
||||||
|
|
||||||
|
@@ -1,121 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import threading
|
|
||||||
import time
|
|
||||||
import os
|
|
||||||
import exceptions
|
|
||||||
import dropbox
|
|
||||||
import logging
|
|
||||||
import application
|
|
||||||
from keys import keyring
|
|
||||||
from utils import *
|
|
||||||
from dropbox.rest import ErrorResponse
|
|
||||||
from StringIO import StringIO
|
|
||||||
from pubsub import pub
|
|
||||||
|
|
||||||
log = logging.getLogger("extra.AudioUploader.dropbox_transfer")
|
|
||||||
class UnauthorisedError(exceptions.Exception):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(UnauthorisedError, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
class newChunkedUploader(dropbox.client.ChunkedUploader):
|
|
||||||
def __init__(self, client, file_obj, length, callback):
|
|
||||||
super(newChunkedUploader, self).__init__(client, file_obj, length)
|
|
||||||
self.progress_callback = callback
|
|
||||||
|
|
||||||
def upload_chunked(self, chunk_size = 4 * 1024 * 1024):
|
|
||||||
while self.offset < self.target_length:
|
|
||||||
next_chunk_size = min(chunk_size, self.target_length - self.offset)
|
|
||||||
if self.last_block == None:
|
|
||||||
self.last_block = self.file_obj.read(next_chunk_size)
|
|
||||||
|
|
||||||
try:
|
|
||||||
(self.offset, self.upload_id) = self.client.upload_chunk(
|
|
||||||
StringIO(self.last_block), next_chunk_size, self.offset, self.upload_id)
|
|
||||||
self.last_block = None
|
|
||||||
if callable(self.progress_callback): self.progress_callback(self.offset)
|
|
||||||
except ErrorResponse as e:
|
|
||||||
reply = e.body
|
|
||||||
if "offset" in reply and reply['offset'] != 0:
|
|
||||||
if reply['offset'] > self.offset:
|
|
||||||
self.last_block = None
|
|
||||||
self.offset = reply['offset']
|
|
||||||
|
|
||||||
class dropboxLogin(object):
|
|
||||||
def __init__(self, config):
|
|
||||||
log.debug("Trying to login in Dropbox...")
|
|
||||||
self.logged = False
|
|
||||||
self.config = config
|
|
||||||
|
|
||||||
def get_url(self):
|
|
||||||
log.debug("Getting autorisation URL...")
|
|
||||||
self.flow = dropbox.client.DropboxOAuth2FlowNoRedirect(keyring.get("dropbox_api_key"), keyring.get("dropbox_api_secret"))
|
|
||||||
return self.flow.start()
|
|
||||||
|
|
||||||
def authorise(self, code):
|
|
||||||
log.debug("Authorising " + application.name + " to Dropbox...")
|
|
||||||
access_token, user_id = self.flow.finish(code)
|
|
||||||
log.debug("Saving tokens...")
|
|
||||||
self.config["services"]["dropbox_token"] = access_token
|
|
||||||
self.logged = True
|
|
||||||
|
|
||||||
class dropboxUploader(object):
|
|
||||||
def __init__(self, config, filename, completed_callback, short_url=False):
|
|
||||||
if config["services"]["dropbox_token"] != "":
|
|
||||||
log.debug("logging in Dropbox...")
|
|
||||||
self.client = dropbox.client.DropboxClient(config["services"]["dropbox_token"])
|
|
||||||
else:
|
|
||||||
log.error("Dropbox is not authorised for this session.")
|
|
||||||
raise UnauthorisedError("You need to authorise " + application.name)
|
|
||||||
self.filename = filename
|
|
||||||
self.short_url = short_url
|
|
||||||
self.file = open(self.filename, "rb")
|
|
||||||
self.file_size = os.path.getsize(self.filename)
|
|
||||||
self.uploader = newChunkedUploader(client=self.client, file_obj=self.file, length=self.file_size, callback=self.process)
|
|
||||||
self.start_time = None
|
|
||||||
self.completed_callback = completed_callback
|
|
||||||
self.background_thread = None
|
|
||||||
self.current = 0
|
|
||||||
self.transfer_rate = 0
|
|
||||||
log.debug("File Size: %d " % (self.file_size,))
|
|
||||||
|
|
||||||
def elapsed_time(self):
|
|
||||||
if not self.start_time:
|
|
||||||
return 0
|
|
||||||
return time.time() - self.start_time
|
|
||||||
|
|
||||||
def perform_transfer(self):
|
|
||||||
log.debug("Starting transfer...")
|
|
||||||
self.start_time = time.time()
|
|
||||||
while self.uploader.offset < self.file_size:
|
|
||||||
self.uploader.upload_chunked(self.file_size/100)
|
|
||||||
self.transfer_completed()
|
|
||||||
|
|
||||||
def process(self, offset):
|
|
||||||
progress = {}
|
|
||||||
self.current = offset
|
|
||||||
progress["total"] = self.file_size
|
|
||||||
progress["current"] = self.current
|
|
||||||
progress["percent"] = int((float(progress["current"]) / progress["total"]) * 100)
|
|
||||||
self.transfer_rate = progress["current"] / self.elapsed_time()
|
|
||||||
progress["speed"] = '%s/s' % convert_bytes(self.transfer_rate)
|
|
||||||
if self.transfer_rate:
|
|
||||||
progress["eta"] = (progress["total"] - progress["current"]) / self.transfer_rate
|
|
||||||
else:
|
|
||||||
progress["eta"] = 0
|
|
||||||
pub.sendMessage("uploading", data=progress)
|
|
||||||
|
|
||||||
def perform_threaded(self):
|
|
||||||
self.background_thread = threading.Thread(target=self.perform_transfer)
|
|
||||||
self.background_thread.daemon = True
|
|
||||||
self.background_thread.start()
|
|
||||||
|
|
||||||
def transfer_completed(self):
|
|
||||||
log.debug("Transfer completed")
|
|
||||||
self.uploader.finish(os.path.basename(self.filename))
|
|
||||||
if callable(self.completed_callback):
|
|
||||||
self.completed_callback()
|
|
||||||
|
|
||||||
def get_url(self):
|
|
||||||
original = "%s" % (self.client.media(os.path.basename(self.filename))["url"])
|
|
||||||
return original
|
|
||||||
# .replace("dl=0", "dl=1")
|
|
@@ -7,7 +7,7 @@ actions = reverse_sort.reverse_sort([ ("audio", _(u"Audio tweet.")),
|
|||||||
("dm_received", _(u"Direct message received.")),
|
("dm_received", _(u"Direct message received.")),
|
||||||
("dm_sent", _(u"Direct message sent.")),
|
("dm_sent", _(u"Direct message sent.")),
|
||||||
("error", _(u"Error.")),
|
("error", _(u"Error.")),
|
||||||
("favourite", _(u"Tweet favorited.")),
|
("favourite", _(u"Tweet favourited.")),
|
||||||
("favourites_timeline_updated", _(u"Favourites buffer updated.")),
|
("favourites_timeline_updated", _(u"Favourites buffer updated.")),
|
||||||
("geo", _(u"Geotweet.")),
|
("geo", _(u"Geotweet.")),
|
||||||
("limit", _(u"Boundary reached.")),
|
("limit", _(u"Boundary reached.")),
|
||||||
@@ -15,7 +15,7 @@ actions = reverse_sort.reverse_sort([ ("audio", _(u"Audio tweet.")),
|
|||||||
("max_length", _(u"Too many characters.")),
|
("max_length", _(u"Too many characters.")),
|
||||||
("mention_received", _(u"Mention received.")),
|
("mention_received", _(u"Mention received.")),
|
||||||
("new_event", _(u"New event.")),
|
("new_event", _(u"New event.")),
|
||||||
("ready", _(unicode(application.name+" is ready."))),
|
("ready", _(u"{0} is ready.").format(application.name,)),
|
||||||
("reply_send", _(u"Mention sent.")),
|
("reply_send", _(u"Mention sent.")),
|
||||||
("retweet_send", _(u"Tweet retweeted.")),
|
("retweet_send", _(u"Tweet retweeted.")),
|
||||||
("search_updated", _(u"Search buffer updated.")),
|
("search_updated", _(u"Search buffer updated.")),
|
||||||
|
@@ -73,7 +73,7 @@ class spellCheckerDialog(wx.Dialog):
|
|||||||
return self.suggestions.GetStringSelection()
|
return self.suggestions.GetStringSelection()
|
||||||
|
|
||||||
def dict_not_found_error():
|
def dict_not_found_error():
|
||||||
wx.MessageDialog(None, _(u"An error has occurred. There are no dictionaries available for the selected language in " + application.name), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
wx.MessageDialog(None, _(u"An error has occurred. There are no dictionaries available for the selected language in {0}").format(application.name,), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||||
|
|
||||||
def finished():
|
def finished():
|
||||||
wx.MessageDialog(None, _(u"Spell check complete."), _(application.name), style=wx.OK).ShowModal()
|
wx.MessageDialog(None, _(u"Spell check complete."), application.name, style=wx.OK).ShowModal()
|
||||||
|
@@ -8,7 +8,7 @@ class autocompletionManageDialog(widgetUtils.BaseDialog):
|
|||||||
super(autocompletionManageDialog, self).__init__(parent=None, id=-1, title=_(u"Manage Autocompletion database"))
|
super(autocompletionManageDialog, self).__init__(parent=None, id=-1, title=_(u"Manage Autocompletion database"))
|
||||||
panel = wx.Panel(self)
|
panel = wx.Panel(self)
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
label = wx.StaticText(panel, -1, _(u"Editing " + application.name + " users database"))
|
label = wx.StaticText(panel, -1, _(u"Editing {0} users database").format(application.name,))
|
||||||
self.users = widgets.list(panel, _(u"Username"), _(u"Name"), style=wx.LC_REPORT)
|
self.users = widgets.list(panel, _(u"Username"), _(u"Name"), style=wx.LC_REPORT)
|
||||||
sizer.Add(label, 0, wx.ALL, 5)
|
sizer.Add(label, 0, wx.ALL, 5)
|
||||||
sizer.Add(self.users.list, 0, wx.ALL, 5)
|
sizer.Add(self.users.list, 0, wx.ALL, 5)
|
||||||
|
@@ -5,7 +5,7 @@ import application
|
|||||||
|
|
||||||
class autocompletionSettingsDialog(widgetUtils.BaseDialog):
|
class autocompletionSettingsDialog(widgetUtils.BaseDialog):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(autocompletionSettingsDialog, self).__init__(parent=None, id=-1, title=_(u"Autocomplete users’ settings"))
|
super(autocompletionSettingsDialog, self).__init__(parent=None, id=-1, title=_(u"Autocomplete users' settings"))
|
||||||
panel = wx.Panel(self)
|
panel = wx.Panel(self)
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
self.followers_buffer = wx.CheckBox(panel, -1, _(u"Add users from followers buffer"))
|
self.followers_buffer = wx.CheckBox(panel, -1, _(u"Add users from followers buffer"))
|
||||||
@@ -24,4 +24,4 @@ class autocompletionSettingsDialog(widgetUtils.BaseDialog):
|
|||||||
self.SetClientSize(sizer.CalcMin())
|
self.SetClientSize(sizer.CalcMin())
|
||||||
|
|
||||||
def show_success_dialog():
|
def show_success_dialog():
|
||||||
wx.MessageDialog(None, _(uapplication.name+"'s database of users has been updated."), _(u"Done"), wx.OK).ShowModal()
|
wx.MessageDialog(None, _(u"{0}'s database of users has been updated.").format(application.name,), _(u"Done"), wx.OK).ShowModal()
|
@@ -1,6 +1,12 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
""" This module contains some bugfixes for packages used in TWBlue."""
|
""" This module contains some bugfixes for packages used in TWBlue."""
|
||||||
|
import sys
|
||||||
import fix_arrow # A few new locales for Three languages in arrow.
|
import fix_arrow # A few new locales for Three languages in arrow.
|
||||||
|
import fix_urllib3_warnings # Avoiding some SSL warnings related to Twython.
|
||||||
|
import fix_win32com
|
||||||
|
|
||||||
def setup():
|
def setup():
|
||||||
fix_arrow.fix()
|
fix_arrow.fix()
|
||||||
|
if hasattr(sys, "frozen"):
|
||||||
|
fix_win32com.fix()
|
||||||
|
fix_urllib3_warnings.fix()
|
@@ -67,11 +67,13 @@ class GalicianLocale(Locale):
|
|||||||
class BasqueLocale(Locale):
|
class BasqueLocale(Locale):
|
||||||
names = ['eu', 'eu_eu']
|
names = ['eu', 'eu_eu']
|
||||||
past = 'duela {0}'
|
past = 'duela {0}'
|
||||||
future = '{0}' # I don't know what's the right phrase in Basque for the future.
|
future = '{0} igarota'
|
||||||
|
|
||||||
timeframes = {
|
timeframes = {
|
||||||
'now': 'Orain',
|
'now': 'Orain',
|
||||||
'seconds': 'segundu',
|
# 'second': 'segundu bat',
|
||||||
|
'seconds': 'segundu batzuk', # without specifying a number.
|
||||||
|
#'seconds': '{0} segundu', # specifying a number
|
||||||
'minute': 'minutu bat',
|
'minute': 'minutu bat',
|
||||||
'minutes': '{0} minutu',
|
'minutes': '{0} minutu',
|
||||||
'hour': 'ordu bat',
|
'hour': 'ordu bat',
|
||||||
|
5
src/fixes/fix_urllib3_warnings.py
Normal file
5
src/fixes/fix_urllib3_warnings.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from requests.packages import urllib3
|
||||||
|
|
||||||
|
def fix():
|
||||||
|
urllib3.disable_warnings()
|
7
src/fixes/fix_win32com.py
Normal file
7
src/fixes/fix_win32com.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import win32com.client
|
||||||
|
|
||||||
|
|
||||||
|
def fix():
|
||||||
|
if win32com.client.gencache.is_readonly == True:
|
||||||
|
win32com.client.gencache.is_readonly = False
|
||||||
|
win32com.client.gencache.Rebuild()
|
@@ -1,11 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
""" This is the GTK view module for TWBlue.
|
|
||||||
As of April 3 2015, there are the things that have been implemented:
|
|
||||||
* the main view (partially implemented)
|
|
||||||
* All buffers.
|
|
||||||
* Three of the most common message dialogs.
|
|
||||||
* Dialogs for tweet, reply, retweet, send a direct message and view a tweet.
|
|
||||||
|
|
||||||
And we need to implement:
|
|
||||||
* All the other dialogs.
|
|
||||||
"""
|
|
@@ -1,11 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from base import basePanel
|
|
||||||
from dm import dmPanel
|
|
||||||
from events import eventsPanel
|
|
||||||
from favourites import favsPanel
|
|
||||||
from lists import listPanel
|
|
||||||
from panels import accountPanel, emptyPanel
|
|
||||||
from people import peoplePanel
|
|
||||||
from trends import trendsPanel
|
|
||||||
from tweet_searches import searchPanel
|
|
||||||
from user_searches import searchUsersPanel
|
|
@@ -1,35 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import widgetUtils
|
|
||||||
from gi.repository import Gtk
|
|
||||||
|
|
||||||
class basePanel(Gtk.VBox):
|
|
||||||
|
|
||||||
def create_list(self):
|
|
||||||
self.list = widgetUtils.list(_(u"User"), _(u"Text"), _(u"Date"), _(u"Client"))
|
|
||||||
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
super(basePanel, self).__init__(spacing=6)
|
|
||||||
self.name = name
|
|
||||||
self.type = "baseBuffer"
|
|
||||||
self.create_list()
|
|
||||||
self.tweet = Gtk.Button(_(u"Tweet"))
|
|
||||||
self.retweet = Gtk.Button(_(u"Retweet"))
|
|
||||||
self.reply = Gtk.Button(_(u"Reply"))
|
|
||||||
self.dm = Gtk.Button(_(u"Direct message"))
|
|
||||||
btnSizer = Gtk.Box(spacing=6)
|
|
||||||
btnSizer.add(self.tweet)
|
|
||||||
btnSizer.add(self.retweet)
|
|
||||||
btnSizer.add(self.reply)
|
|
||||||
btnSizer.add(self.dm)
|
|
||||||
self.add(self.list.list)
|
|
||||||
self.add(btnSizer)
|
|
||||||
|
|
||||||
def set_position(self, reversed=False):
|
|
||||||
if reversed == False:
|
|
||||||
self.list.select_item(self.list.get_count()-1)
|
|
||||||
else:
|
|
||||||
self.list.select_item(0)
|
|
||||||
|
|
||||||
def set_focus_function(self, f):
|
|
||||||
tree_selection = self.list.list.get_selection()
|
|
||||||
tree_selection.connect("changed", f)
|
|
@@ -1,14 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from gi.repository import Gtk
|
|
||||||
import widgetUtils
|
|
||||||
from base import basePanel
|
|
||||||
|
|
||||||
class dmPanel(basePanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
""" Class to DM'S. Reply and retweet buttons are not showed and they have your delete method for dm's."""
|
|
||||||
super(dmPanel, self).__init__(parent, name)
|
|
||||||
self.retweet.hide()
|
|
||||||
self.retweet.set_no_show_all(True)
|
|
||||||
self.reply.hide()
|
|
||||||
self.reply.set_no_show_all(True)
|
|
||||||
self.type = "dm"
|
|
@@ -1,25 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import widgetUtils
|
|
||||||
from gi.repository import Gtk
|
|
||||||
|
|
||||||
class eventsPanel(Gtk.VBox):
|
|
||||||
""" Buffer to show events. Different than tweets or people."""
|
|
||||||
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
self.type = "event"
|
|
||||||
super(eventsPanel, self).__init__(spacing=6)
|
|
||||||
self.name = name
|
|
||||||
self.list = widgetUtils.list(_(u"Date"), _(u"Event"))
|
|
||||||
self.add(self.list.list)
|
|
||||||
self.tweet = Gtk.Button(_(u"Tweet"))
|
|
||||||
self.delete_event = Gtk.Button(_(u"Remove event"))
|
|
||||||
btnBox = Gtk.Box(spacing=6)
|
|
||||||
btnBox.add(self.tweet)
|
|
||||||
btnBox.add(self.delete_event)
|
|
||||||
self.add(btnBox)
|
|
||||||
|
|
||||||
def set_position(self, reversed=False):
|
|
||||||
if reversed == False:
|
|
||||||
self.list.select_item(self.list.get_count()-1)
|
|
||||||
else:
|
|
||||||
self.list.select_item(0)
|
|
@@ -1,8 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from gi.repository import Gtk
|
|
||||||
from base import basePanel
|
|
||||||
|
|
||||||
class favsPanel(basePanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
super(favsPanel, self).__init__(parent, name)
|
|
||||||
self.type = "favourites_timeline"
|
|
@@ -1,9 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from gi.repository import Gtk
|
|
||||||
from base import basePanel
|
|
||||||
|
|
||||||
class listPanel(basePanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
super(listPanel, self).__init__(parent, name)
|
|
||||||
self.type = "list"
|
|
||||||
self.users = []
|
|
@@ -1,34 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from gi.repository import Gtk
|
|
||||||
import widgetUtils
|
|
||||||
|
|
||||||
class accountPanel(Gtk.VBox):
|
|
||||||
def __init__(self, parent, name=None):
|
|
||||||
super(accountPanel, self).__init__(spacing=5)
|
|
||||||
self.name = name
|
|
||||||
self.type = "account"
|
|
||||||
self.login = Gtk.Button(_(u"Login"))
|
|
||||||
self.add(self.login)
|
|
||||||
self.autostart_account = Gtk.ToggleButton(_(u"Log in automatically"))
|
|
||||||
self.add(self.autostart_account)
|
|
||||||
|
|
||||||
def change_login(self, login=True):
|
|
||||||
if login == True:
|
|
||||||
self.login.set_label(_(u"Login"))
|
|
||||||
else:
|
|
||||||
self.login.set_label(_(u"Logout"))
|
|
||||||
|
|
||||||
def change_autostart(self, autostart=True):
|
|
||||||
self.autostart_account.set_active(autostart)
|
|
||||||
|
|
||||||
def get_autostart(self):
|
|
||||||
print "actived"
|
|
||||||
print self.autostart_account.get_active()
|
|
||||||
return self.autostart_account.get_active()
|
|
||||||
|
|
||||||
class emptyPanel(Gtk.VBox):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
super(emptyPanel, self).__init__(spacing=6)
|
|
||||||
self.name = name
|
|
||||||
self.type = "account"
|
|
||||||
|
|
@@ -1,17 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from gi.repository import Gtk
|
|
||||||
import widgetUtils
|
|
||||||
from base import basePanel
|
|
||||||
|
|
||||||
class peoplePanel(basePanel):
|
|
||||||
""" Buffer used to show people."""
|
|
||||||
|
|
||||||
def create_list(self):
|
|
||||||
self.list = widgetUtils.list(_(u"User"))
|
|
||||||
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
super(peoplePanel, self).__init__(parent, name)
|
|
||||||
self.type = "people"
|
|
||||||
self.reply.set_label(_(u"Mention"))
|
|
||||||
self.retweet.hide()
|
|
||||||
self.retweet.set_no_show_all(True)
|
|
@@ -1,26 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from gi.repository import Gtk
|
|
||||||
import widgetUtils
|
|
||||||
|
|
||||||
class trendsPanel(Gtk.VBox):
|
|
||||||
def create_list(self):
|
|
||||||
""" Returns the list for put the tweets here."""
|
|
||||||
self.list = widgetUtils.list(_(u"Trending topic"))
|
|
||||||
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
super(trendsPanel, self).__init__(spacing=6)
|
|
||||||
self.type = "trends"
|
|
||||||
self.create_list()
|
|
||||||
self.tweet = Gtk.Button(_(u"Tweet"))
|
|
||||||
self.tweetTrendBtn = Gtk.Button(_(u"Tweet about this trend"))
|
|
||||||
btnSizer = Gtk.Box(spacing=3)
|
|
||||||
btnSizer.add(self.tweet)
|
|
||||||
btnSizer.add(self.tweetTrendBtn)
|
|
||||||
self.add(btnSizer)
|
|
||||||
self.Add(self.list.list)
|
|
||||||
|
|
||||||
def set_position(self, reversed=False):
|
|
||||||
if reversed == False:
|
|
||||||
self.list.select_item(self.list.get_count()-1)
|
|
||||||
else:
|
|
||||||
self.list.select_item(0)
|
|
@@ -1,8 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from gi.repository import Gtk
|
|
||||||
from base import basePanel
|
|
||||||
|
|
||||||
class searchPanel(basePanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
super(searchPanel, self).__init__(parent, name)
|
|
||||||
self.type = "search"
|
|
@@ -1,14 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from gi.repository import Gtk
|
|
||||||
from tweet_searches import searchPanel
|
|
||||||
import widgetUtils
|
|
||||||
|
|
||||||
class searchUsersPanel(searchPanel):
|
|
||||||
def create_list(self):
|
|
||||||
""" Returns the list for put the tweets here."""
|
|
||||||
self.list = widgetUtils.list(_(u"User"))
|
|
||||||
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
self.create_list()
|
|
||||||
super(searchUsersPanel, self).__init__(parent, name)
|
|
||||||
self.type = "user_searches"
|
|
@@ -1,64 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from gi.repository import Gtk
|
|
||||||
import application
|
|
||||||
def retweet_as_link(parent):
|
|
||||||
dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, unicode(application.name))
|
|
||||||
dialog.format_secondary_text(_(u"This retweet is over 140 characters. Would you like to post it as a mention to the poster with your comments and a link to the original tweet?"))
|
|
||||||
answer = dialog.run()
|
|
||||||
dialog.destroy()
|
|
||||||
return answer
|
|
||||||
|
|
||||||
def retweet_question(parent):
|
|
||||||
dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, _(u"Retweet"))
|
|
||||||
dialog.format_secondary_text(_(u"Would you like to add a comment to this tweet?"))
|
|
||||||
answer = dialog.run()
|
|
||||||
dialog.destroy()
|
|
||||||
return answer
|
|
||||||
|
|
||||||
def delete_tweet_dialog(parent):
|
|
||||||
dialog = Gtk.MessageDialog(None, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, _(u"Delete"))
|
|
||||||
dialog.format_secondary_text(_(u"Do you really want to delete this message? It will be deleted from Twitter as well."))
|
|
||||||
answer = dialog.run()
|
|
||||||
dialog.destroy()
|
|
||||||
return answer
|
|
||||||
|
|
||||||
def exit_dialog(parent):
|
|
||||||
dialog = Gtk.MessageDialog(parent, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, _(u"Exit"))
|
|
||||||
dialog.format_secondary_text(_(u"Do you really want to close " + application.name + "?"))
|
|
||||||
answer = dialog.run()
|
|
||||||
dialog.destroy()
|
|
||||||
return answer
|
|
||||||
|
|
||||||
def needs_restart():
|
|
||||||
wx.MessageDialog(None, _(unicode(application.name+" must be restarted to save these changes. Press OK to restart now.")), _("Restart " + application.name), wx.OK).ShowModal()
|
|
||||||
|
|
||||||
def delete_user_from_db():
|
|
||||||
return wx.MessageDialog(None, _(u"Are you sure you want to delete this user from the database? This user will not appear on the autocomplete results anymore."), _(u"Confirm"), wx.YES_NO|wx.ICON_QUESTION).ShowModal()
|
|
||||||
|
|
||||||
def get_ignored_client():
|
|
||||||
entry = wx.TextEntryDialog(None, _(u"Enter the name of the client here"), _(u"Add a new ignored client"))
|
|
||||||
if entry.ShowModal() == wx.ID_OK:
|
|
||||||
return entry.GetValue()
|
|
||||||
return None
|
|
||||||
|
|
||||||
def clear_list():
|
|
||||||
dlg = wx.MessageDialog(None, _(u"Do you really want to empty this buffer? It's items will be removed from the list but not from Twitter"), _(u"Empty buffer"), wx.ICON_QUESTION|wx.YES_NO)
|
|
||||||
return dlg.ShowModal()
|
|
||||||
|
|
||||||
def remove_buffer():
|
|
||||||
return wx.MessageDialog(None, _(u"Do you really want to delete this timeline?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO).ShowModal()
|
|
||||||
|
|
||||||
def user_not_exist():
|
|
||||||
return wx.MessageDialog(None, _(u"The user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
|
||||||
|
|
||||||
def timeline_exist():
|
|
||||||
return wx.MessageDialog(None, _(u"There's currently a timeline for this user. You are not able to open another"), _(u"Existing timeline"), wx.ICON_ERROR).ShowModal()
|
|
||||||
|
|
||||||
def no_tweets():
|
|
||||||
return wx.MessageDialog(None, _(u"This user has no tweets. You can't open a timeline for this user"), _(u"Error!"), wx.ICON_ERROR).ShowModal()
|
|
||||||
|
|
||||||
def protected_user():
|
|
||||||
return wx.MessageDialog(None, _(u"This is a protected Twitter user. It means you can not open a timeline using the Streaming API. The user's tweets will not update due to a twitter policy. Do you want to continue?"), _(u"Warning"), wx.ICON_WARNING|wx.YES_NO).ShowModal()
|
|
||||||
|
|
||||||
def no_following():
|
|
||||||
return wx.MessageDialog(None, _(u"This is a protected user account, you need follow to this user for viewing your tweets or favourites."), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
|
@@ -1 +0,0 @@
|
|||||||
#import trends, configuration, lists, message, search, show_user, update_profile, urlList, userSelection, utils
|
|
@@ -1,228 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import baseDialog
|
|
||||||
import wx
|
|
||||||
import logging as original_logger
|
|
||||||
import application
|
|
||||||
class general(wx.Panel, baseDialog.BaseWXDialog):
|
|
||||||
def __init__(self, parent, languages):
|
|
||||||
super(general, self).__init__(parent)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
language = wx.StaticText(self, -1, _(u"Language"))
|
|
||||||
self.language = wx.ListBox(self, -1, choices=languages)
|
|
||||||
self.language.SetSize(self.language.GetBestSize())
|
|
||||||
langBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
langBox.Add(language, 0, wx.ALL, 5)
|
|
||||||
langBox.Add(self.language, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(langBox, 0, wx.ALL, 5)
|
|
||||||
self.ask_at_exit = wx.CheckBox(self, -1, _(U"ask before exiting " + application.name))
|
|
||||||
sizer.Add(self.ask_at_exit, 0, wx.ALL, 5)
|
|
||||||
self.use_invisible_shorcuts = wx.CheckBox(self, -1, _(u"Use invisible interface's keyboard shortcuts while GUI is visible"))
|
|
||||||
sizer.Add(self.use_invisible_shorcuts, 0, wx.ALL, 5)
|
|
||||||
self.disable_sapi5 = wx.CheckBox(self, -1, _(u"Activate Sapi5 when any other screen reader is not being run"))
|
|
||||||
sizer.Add(self.disable_sapi5, 0, wx.ALL, 5)
|
|
||||||
self.hide_gui = wx.CheckBox(self, -1, _(u"Hide GUI on launch"))
|
|
||||||
sizer.Add(self.hide_gui, 0, wx.ALL, 5)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
|
|
||||||
class generalAccount(wx.Panel, baseDialog.BaseWXDialog):
|
|
||||||
def __init__(self, parent):
|
|
||||||
super(generalAccount, self).__init__(parent)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
self.au = wx.Button(self, wx.NewId(), _(u"Set the autocomplete function"))
|
|
||||||
sizer.Add(self.au, 0, wx.ALL, 5)
|
|
||||||
self.relative_time = wx.CheckBox(self, wx.NewId(), _(U"Relative times"))
|
|
||||||
sizer.Add(self.relative_time, 0, wx.ALL, 5)
|
|
||||||
apiCallsBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
apiCallsBox.Add(wx.StaticText(self, -1, _(u"API calls when the stream is started (One API call equals to 200 tweetts, two API calls equals 400 tweets, etc):")), 0, wx.ALL, 5)
|
|
||||||
self.apiCalls = wx.SpinCtrl(self, wx.NewId())
|
|
||||||
self.apiCalls.SetRange(1, 10)
|
|
||||||
self.apiCalls.SetSize(self.apiCalls.GetBestSize())
|
|
||||||
apiCallsBox.Add(self.apiCalls, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(apiCallsBox, 0, wx.ALL, 5)
|
|
||||||
tweetsPerCallBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
tweetsPerCallBox.Add(wx.StaticText(self, -1, _(u"Items on each API call")), 0, wx.ALL, 5)
|
|
||||||
self.itemsPerApiCall = wx.SpinCtrl(self, wx.NewId())
|
|
||||||
self.itemsPerApiCall.SetRange(0, 200)
|
|
||||||
self.itemsPerApiCall.SetSize(self.itemsPerApiCall.GetBestSize())
|
|
||||||
tweetsPerCallBox.Add(self.itemsPerApiCall, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(tweetsPerCallBox, 0, wx.ALL, 5)
|
|
||||||
self.reverse_timelines = wx.CheckBox(self, wx.NewId(), _(u"Inverted buffers: The newest tweets will be shown at the beginning of the lists while the oldest at the end"))
|
|
||||||
sizer.Add(self.reverse_timelines, 0, wx.ALL, 5)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
|
|
||||||
class other_buffers(wx.Panel):
|
|
||||||
def __init__(self, parent):
|
|
||||||
super(other_buffers, self).__init__(parent)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
|
|
||||||
class ignoredClients(wx.Panel):
|
|
||||||
def __init__(self, parent, choices):
|
|
||||||
super(ignoredClients, self).__init__(parent=parent)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
label = wx.StaticText(self, -1, _(u"Ignored clients"))
|
|
||||||
self.clients = wx.ListBox(self, -1, choices=choices)
|
|
||||||
self.clients.SetSize(self.clients.GetBestSize())
|
|
||||||
clientsBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
clientsBox.Add(label, 0, wx.ALL, 5)
|
|
||||||
clientsBox.Add(self.clients, 0, wx.ALL, 5)
|
|
||||||
self.add = wx.Button(self, -1, _(u"Add client"))
|
|
||||||
self.remove = wx.Button(self, -1, _(u"Remove client"))
|
|
||||||
btnBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
btnBox.Add(self.add, 0, wx.ALL, 5)
|
|
||||||
btnBox.Add(self.remove, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(clientsBox, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(btnBox, 0, wx.ALL, 5)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
|
|
||||||
def append(self, client):
|
|
||||||
self.clients.Append(client)
|
|
||||||
|
|
||||||
def get_clients(self):
|
|
||||||
return self.clients.GetCount()
|
|
||||||
|
|
||||||
def get_client_id(self):
|
|
||||||
return self.clients.GetSelection()
|
|
||||||
|
|
||||||
def remove_(self, id):
|
|
||||||
self.clients.Delete(id)
|
|
||||||
|
|
||||||
class sound(wx.Panel):
|
|
||||||
def __init__(self, parent, input_devices, output_devices, soundpacks):
|
|
||||||
wx.Panel.__init__(self, parent)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
volume = wx.StaticText(self, -1, _(u"Volume"))
|
|
||||||
self.volumeCtrl = wx.Slider(self)
|
|
||||||
self.volumeCtrl.SetRange(0, 100)
|
|
||||||
self.volumeCtrl.SetSize(self.volumeCtrl.GetBestSize())
|
|
||||||
volumeBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
volumeBox.Add(volume, 0, wx.ALL, 5)
|
|
||||||
volumeBox.Add(self.volumeCtrl, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(volumeBox, 0, wx.ALL, 5)
|
|
||||||
self.session_mute = wx.CheckBox(self, -1, _(u"Session mute"))
|
|
||||||
sizer.Add(self.session_mute, 0, wx.ALL, 5)
|
|
||||||
output_label = wx.StaticText(self, -1, _(u"Output device"))
|
|
||||||
self.output = wx.ComboBox(self, -1, choices=output_devices, style=wx.CB_READONLY)
|
|
||||||
self.output.SetSize(self.output.GetBestSize())
|
|
||||||
outputBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
outputBox.Add(output_label, 0, wx.ALL, 5)
|
|
||||||
outputBox.Add(self.output, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(outputBox, 0, wx.ALL, 5)
|
|
||||||
input_label = wx.StaticText(self, -1, _(u"Input device"))
|
|
||||||
self.input = wx.ComboBox(self, -1, choices=input_devices, style=wx.CB_READONLY)
|
|
||||||
self.input.SetSize(self.input.GetBestSize())
|
|
||||||
inputBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
inputBox.Add(input_label, 0, wx.ALL, 5)
|
|
||||||
inputBox.Add(self.input, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(inputBox, 0, wx.ALL, 5)
|
|
||||||
soundBox = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
soundpack_label = wx.StaticText(self, -1, _(u"Sound pack"))
|
|
||||||
self.soundpack = wx.ComboBox(self, -1, choices=soundpacks, style=wx.CB_READONLY)
|
|
||||||
self.soundpack.SetSize(self.soundpack.GetBestSize())
|
|
||||||
soundBox.Add(soundpack_label, 0, wx.ALL, 5)
|
|
||||||
soundBox.Add(self.soundpack, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(soundBox, 0, wx.ALL, 5)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
|
|
||||||
def get(self, control):
|
|
||||||
return getattr(self, control).GetStringSelection()
|
|
||||||
|
|
||||||
class audioServicesPanel(wx.Panel):
|
|
||||||
def __init__(self, parent):
|
|
||||||
super(audioServicesPanel, self).__init__(parent)
|
|
||||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
apiKeyLabel = wx.StaticText(self, -1, _(u"If you've got a SndUp account, enter your API Key here. Whether the API Key is wrong, the App will fail to upload anything to the server. Whether there's no API Key here, then the audio files will be uploaded anonimously"))
|
|
||||||
self.apiKey = wx.TextCtrl(self, -1)
|
|
||||||
dc = wx.WindowDC(self.apiKey)
|
|
||||||
dc.SetFont(self.apiKey.GetFont())
|
|
||||||
self.apiKey.SetSize(dc.GetTextExtent("0"*100))
|
|
||||||
apiKeyBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
apiKeyBox.Add(apiKeyLabel, 0, wx.ALL, 5)
|
|
||||||
apiKeyBox.Add(self.apiKey, 0, wx.ALL, 5)
|
|
||||||
mainSizer.Add(apiKeyBox, 0, wx.ALL, 5)
|
|
||||||
first_sizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
self.dropbox = wx.Button(self, -1)
|
|
||||||
first_sizer.Add(self.dropbox, 0, wx.ALL, 5)
|
|
||||||
mainSizer.Add(first_sizer, 0, wx.ALL, 5)
|
|
||||||
self.SetSizer(mainSizer)
|
|
||||||
|
|
||||||
def set_dropbox(self, active=True):
|
|
||||||
if active == True:
|
|
||||||
self.dropbox.SetLabel(_(u"Unlink your Dropbox account"))
|
|
||||||
else:
|
|
||||||
self.dropbox.SetLabel(_(u"Link your Dropbox account"))
|
|
||||||
|
|
||||||
def show_dialog(self):
|
|
||||||
wx.MessageDialog(self, _(u"The authorization request will be opened in your browser. Copy the code from Dropbox and paste it into the text box which will appear. You only need to do this once."), _(u"Authorization"), wx.OK).ShowModal()
|
|
||||||
|
|
||||||
def get_response(self):
|
|
||||||
dlg = wx.TextEntryDialog(self, _(u"Enter the code here."), _(u"Verification code"))
|
|
||||||
if dlg.ShowModal() == wx.ID_CANCEL:
|
|
||||||
return False
|
|
||||||
return dlg.GetValue()
|
|
||||||
|
|
||||||
def show_error(self):
|
|
||||||
wx.MessageDialog(self, _(u"Error during authorisation. Try again later."), _(u"Error!"), wx.ICON_ERROR).ShowModal()
|
|
||||||
|
|
||||||
def get_dropbox(self):
|
|
||||||
return self.dropbox.GetLabel()
|
|
||||||
|
|
||||||
class configurationDialog(baseDialog.BaseWXDialog):
|
|
||||||
|
|
||||||
def set_title(self, title):
|
|
||||||
self.SetTitle(title)
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(configurationDialog, self).__init__(None, -1)
|
|
||||||
self.panel = wx.Panel(self)
|
|
||||||
self.SetTitle(_(u"TW Blue preferences"))
|
|
||||||
self.sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
self.notebook = wx.Notebook(self.panel)
|
|
||||||
|
|
||||||
def create_general(self, languageList):
|
|
||||||
self.general = general(self.notebook, languageList)
|
|
||||||
self.notebook.AddPage(self.general, _(u"General"))
|
|
||||||
self.general.SetFocus()
|
|
||||||
|
|
||||||
def create_general_account(self):
|
|
||||||
self.general = generalAccount(self.notebook)
|
|
||||||
self.notebook.AddPage(self.general, _(u"General"))
|
|
||||||
self.general.SetFocus()
|
|
||||||
|
|
||||||
def create_other_buffers(self):
|
|
||||||
self.buffers = other_buffers(self.notebook)
|
|
||||||
self.notebook.AddPage(self.buffers, _(u"Show other buffers"))
|
|
||||||
|
|
||||||
def create_ignored_clients(self, ignored_clients_list):
|
|
||||||
self.ignored_clients = ignoredClients(self.notebook, ignored_clients_list)
|
|
||||||
self.notebook.AddPage(self.ignored_clients, _(u"Ignored clients"))
|
|
||||||
|
|
||||||
def create_sound(self, output_devices, input_devices, soundpacks):
|
|
||||||
self.sound = sound(self.notebook, output_devices, input_devices, soundpacks)
|
|
||||||
self.notebook.AddPage(self.sound, _(u"Sound"))
|
|
||||||
def create_audio_services(self):
|
|
||||||
self.services = audioServicesPanel(self.notebook)
|
|
||||||
self.notebook.AddPage(self.services, _(u"Audio Services"))
|
|
||||||
|
|
||||||
def realize(self):
|
|
||||||
self.sizer.Add(self.notebook, 0, wx.ALL, 5)
|
|
||||||
ok_cancel_box = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
ok = wx.Button(self.panel, wx.ID_OK, _(u"Save"))
|
|
||||||
ok.SetDefault()
|
|
||||||
cancel = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close"))
|
|
||||||
self.SetEscapeId(cancel.GetId())
|
|
||||||
ok_cancel_box.Add(ok, 0, wx.ALL, 5)
|
|
||||||
ok_cancel_box.Add(cancel, 0, wx.ALL, 5)
|
|
||||||
self.sizer.Add(ok_cancel_box, 0, wx.ALL, 5)
|
|
||||||
self.panel.SetSizer(self.sizer)
|
|
||||||
self.SetClientSize(self.sizer.CalcMin())
|
|
||||||
|
|
||||||
def get_value(self, panel, key):
|
|
||||||
p = getattr(self, panel)
|
|
||||||
return getattr(p, key).GetValue()
|
|
||||||
|
|
||||||
def set_value(self, panel, key, value):
|
|
||||||
p = getattr(self, panel)
|
|
||||||
control = getattr(p, key)
|
|
||||||
getattr(control, "SetValue")(value)
|
|
||||||
|
|
@@ -1,123 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import wx
|
|
||||||
from multiplatform_widgets import widgets
|
|
||||||
|
|
||||||
class listViewer(wx.Dialog):
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(listViewer, self).__init__(parent=None, *args, **kwargs)
|
|
||||||
self.SetTitle(_(u"Lists manager"))
|
|
||||||
panel = wx.Panel(self)
|
|
||||||
label = wx.StaticText(panel, -1, _(u"Lists"))
|
|
||||||
self.lista = widgets.list(panel, _(u"List"), _(u"Description"), _(u"Owner"), _(u"Members"), _(u"mode"), size=(800, 800), style=wx.LC_REPORT|wx.LC_SINGLE_SEL)
|
|
||||||
self.lista.list.SetFocus()
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
sizer.Add(label)
|
|
||||||
sizer.Add(self.lista.list)
|
|
||||||
self.createBtn = wx.Button(panel, wx.NewId(), _(u"Create a new list"))
|
|
||||||
self.editBtn = wx.Button(panel, -1, _(u"Edit"))
|
|
||||||
self.deleteBtn = wx.Button(panel, -1, _(u"Remove"))
|
|
||||||
self.view = wx.Button(panel, -1, _(u"Open in buffer"))
|
|
||||||
# self.members = wx.Button(panel, -1, _(u"View members"))
|
|
||||||
# self.members.Disable()
|
|
||||||
# self.subscriptors = wx.Button(panel, -1, _(u"View subscribers"))
|
|
||||||
# self.subscriptors.Disable()
|
|
||||||
# self.get_linkBtn = wx.Button(panel, -1, _(u"Get link for the list"))
|
|
||||||
# self.get_linkBtn.Bind(wx.EVT_BUTTON, self.onGetLink)
|
|
||||||
self.cancelBtn = wx.Button(panel, wx.ID_CANCEL)
|
|
||||||
btnSizer = wx.BoxSizer()
|
|
||||||
btnSizer.Add(self.createBtn)
|
|
||||||
btnSizer.Add(self.editBtn)
|
|
||||||
btnSizer.Add(self.cancelBtn)
|
|
||||||
panel.SetSizer(sizer)
|
|
||||||
|
|
||||||
def populate_list(self, lists):
|
|
||||||
for item in lists:
|
|
||||||
self.lista.insert_item(False, *item)
|
|
||||||
|
|
||||||
def get_item(self):
|
|
||||||
return self.lista.get_selected()
|
|
||||||
|
|
||||||
class userListViewer(listViewer):
|
|
||||||
def __init__(self, username, *args, **kwargs):
|
|
||||||
self.username = username
|
|
||||||
super(userListViewer, self).__init__(*args, **kwargs)
|
|
||||||
self.SetTitle(_(u"Viewing lists for %s") % (self.username))
|
|
||||||
self.createBtn.SetLabel(_(u"Subscribe"))
|
|
||||||
self.deleteBtn.SetLabel(_(u"Unsubscribe"))
|
|
||||||
self.editBtn.Disable()
|
|
||||||
self.view.Disable()
|
|
||||||
|
|
||||||
class createListDialog(wx.Dialog):
|
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(createListDialog, self).__init__(*args, **kwargs)
|
|
||||||
self.SetTitle(_(u"Create a new list"))
|
|
||||||
panel = wx.Panel(self)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
name = wx.StaticText(panel, -1, _(u"Name (20 characters maximun)"))
|
|
||||||
self.name = wx.TextCtrl(panel, -1)
|
|
||||||
nameSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
nameSizer.Add(name)
|
|
||||||
nameSizer.Add(self.name)
|
|
||||||
description = wx.StaticText(panel, -1, _(u"Description"))
|
|
||||||
self.description = wx.TextCtrl(panel, -1)
|
|
||||||
descriptionSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
descriptionSizer.Add(description)
|
|
||||||
descriptionSizer.Add(self.description)
|
|
||||||
mode = wx.StaticText(panel, -1, _(u"Mode"))
|
|
||||||
self.public = wx.RadioButton(panel, -1, _(u"Public"), style=wx.RB_GROUP)
|
|
||||||
self.private = wx.RadioButton(panel, -1, _(u"Private"))
|
|
||||||
modeBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
modeBox.Add(mode)
|
|
||||||
modeBox.Add(self.public)
|
|
||||||
modeBox.Add(self.private)
|
|
||||||
ok = wx.Button(panel, wx.ID_OK)
|
|
||||||
ok.SetDefault()
|
|
||||||
cancel = wx.Button(panel, wx.ID_CANCEL)
|
|
||||||
btnBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
btnBox.Add(ok)
|
|
||||||
btnBox.Add(cancel)
|
|
||||||
sizer.Add(nameSizer)
|
|
||||||
sizer.Add(descriptionSizer)
|
|
||||||
sizer.Add(modeBox)
|
|
||||||
sizer.Add(btnBox)
|
|
||||||
|
|
||||||
def get(self, field):
|
|
||||||
return getattr(self, field).GetValue()
|
|
||||||
|
|
||||||
class editListDialog(createListDialog):
|
|
||||||
|
|
||||||
def __init__(self, list, *args, **kwargs):
|
|
||||||
super(editListDialog, self).__init__(*args, **kwargs)
|
|
||||||
self.SetTitle(_(u"Editing the list %s") % (list["name"]))
|
|
||||||
self.name.ChangeValue(list["name"])
|
|
||||||
self.description.ChangeValue(list["description"])
|
|
||||||
if list["mode"] == "public":
|
|
||||||
self.public.SetValue(True)
|
|
||||||
else:
|
|
||||||
self.private.SetValue(True)
|
|
||||||
|
|
||||||
class addUserListDialog(listViewer):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(addUserListDialog, self).__init__(*args, **kwargs)
|
|
||||||
self.SetTitle(_(u"Select a list to add the user"))
|
|
||||||
self.createBtn.SetLabel(_(u"Add"))
|
|
||||||
self.createBtn.SetDefault()
|
|
||||||
self.editBtn.Disable()
|
|
||||||
self.view.Disable()
|
|
||||||
# self.subscriptors.Disable()
|
|
||||||
# self.members.Disable()
|
|
||||||
self.deleteBtn.Disable()
|
|
||||||
|
|
||||||
class removeUserListDialog(listViewer):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(removeUserListDialog, self).__init__(*args, **kwargs)
|
|
||||||
self.SetTitle(_(u"Select a list to remove the user"))
|
|
||||||
self.createBtn.SetLabel(_(u"Remove"))
|
|
||||||
self.createBtn.SetDefault()
|
|
||||||
self.editBtn.Disable()
|
|
||||||
self.view.Disable()
|
|
||||||
# self.subscriptors.Disable()
|
|
||||||
# self.members.Disable()
|
|
||||||
self.deleteBtn.Disable()
|
|
@@ -1,275 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from gi.repository import Gtk
|
|
||||||
import widgetUtils
|
|
||||||
|
|
||||||
class textLimited(widgetUtils.baseDialog):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(textLimited, self).__init__(buttons=(Gtk.STOCK_OK, widgetUtils.OK, Gtk.STOCK_CANCEL, widgetUtils.CANCEL), *args, **kwargs)
|
|
||||||
|
|
||||||
def createTextArea(self, message="", text=""):
|
|
||||||
self.label = Gtk.Label(message)
|
|
||||||
self.set_title(message, titleWindow=True)
|
|
||||||
self.text = Gtk.Entry()
|
|
||||||
self.text.set_max_length(140)
|
|
||||||
self.text.set_text(text)
|
|
||||||
self.text.set_placeholder_text(message)
|
|
||||||
self.set_title(str(len(text)))
|
|
||||||
self.textBox = Gtk.Box(spacing=10)
|
|
||||||
self.textBox.add(self.label)
|
|
||||||
self.textBox.add(self.text)
|
|
||||||
|
|
||||||
def get(self, control):
|
|
||||||
if control == "upload_image":
|
|
||||||
return self.upload_image.get_label()
|
|
||||||
elif control == "cb":
|
|
||||||
return self.cb.get_active_text()
|
|
||||||
|
|
||||||
def set(self, control, val):
|
|
||||||
if control == "upload_image":
|
|
||||||
self.upload_image.set_label(val)
|
|
||||||
elif control == "cb":
|
|
||||||
self.cb.set_active_text(val)
|
|
||||||
|
|
||||||
def text_focus(self):
|
|
||||||
self.text.grab_focus()
|
|
||||||
|
|
||||||
def get_text(self):
|
|
||||||
return self.text.get_text()
|
|
||||||
|
|
||||||
def set_text(self, text):
|
|
||||||
self.text.set_text(text)
|
|
||||||
|
|
||||||
def set_title(self, new_title, titleWindow=False):
|
|
||||||
if titleWindow == False:
|
|
||||||
self.text.set_placeholder_text(new_title)
|
|
||||||
else:
|
|
||||||
super(textLimited, self).set_title(new_title)
|
|
||||||
# self.set_title(new_title)
|
|
||||||
|
|
||||||
def enable_button(self, buttonName):
|
|
||||||
if getattr(self, buttonName):
|
|
||||||
return getattr(self, buttonName).show()
|
|
||||||
|
|
||||||
def disable_button(self, buttonName):
|
|
||||||
if getattr(self, buttonName):
|
|
||||||
return getattr(self, buttonName).hide()
|
|
||||||
|
|
||||||
def set_cursor_at_end(self):
|
|
||||||
self.text.set_position(-1)
|
|
||||||
|
|
||||||
def set_cursor_at_position(self, position):
|
|
||||||
self.text.set_position()
|
|
||||||
|
|
||||||
def get_position(self):
|
|
||||||
return self.text.get_position()
|
|
||||||
|
|
||||||
class tweet(textLimited):
|
|
||||||
def createControls(self, title, message, text):
|
|
||||||
self.createTextArea(message, text)
|
|
||||||
self.box.add(self.textBox)
|
|
||||||
self.upload_image = Gtk.Button(_(u"Upload image..."))
|
|
||||||
self.spellcheck = Gtk.Button(_("Check spelling..."))
|
|
||||||
self.attach = Gtk.Button(_(u"Attach audio..."))
|
|
||||||
self.shortenButton = Gtk.Button(_(u"Shorten URL"))
|
|
||||||
self.unshortenButton = Gtk.Button(_(u"Expand URL"))
|
|
||||||
self.shortenButton.hide()
|
|
||||||
self.shortenButton.set_no_show_all(True)
|
|
||||||
self.unshortenButton.hide()
|
|
||||||
self.unshortenButton.set_no_show_all(True)
|
|
||||||
self.translateButton = Gtk.Button(_(u"Translate..."))
|
|
||||||
self.autocompletionButton = Gtk.Button(_(u"&Autocomplete users"))
|
|
||||||
self.buttonsBox1 = Gtk.Box(spacing=6)
|
|
||||||
self.buttonsBox1.add(self.upload_image)
|
|
||||||
self.buttonsBox1.add(self.spellcheck)
|
|
||||||
self.buttonsBox1.add(self.attach)
|
|
||||||
self.box.add(self.buttonsBox1)
|
|
||||||
self.buttonsBox2 = Gtk.Box(spacing=6)
|
|
||||||
self.buttonsBox2.add(self.shortenButton)
|
|
||||||
self.buttonsBox2.add(self.unshortenButton)
|
|
||||||
self.buttonsBox2.add(self.translateButton)
|
|
||||||
self.box.add(self.buttonsBox2)
|
|
||||||
|
|
||||||
def __init__(self, title, message, text):
|
|
||||||
super(tweet, self).__init__()
|
|
||||||
self.createControls(message, title, text)
|
|
||||||
self.show_all()
|
|
||||||
|
|
||||||
def get_image(self):
|
|
||||||
dialog = Gtk.FileChooserDialog(_(u"Select the picture to be uploaded"), self, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
|
|
||||||
filter_jpg = Gtk.FileFilter()
|
|
||||||
filter_jpg.set_name(_(u"JPG images"))
|
|
||||||
filter_jpg.add_mime_type("image/jpeg")
|
|
||||||
dialog.add_filter(filter_jpg)
|
|
||||||
filter_gif = Gtk.FileFilter()
|
|
||||||
filter_gif.set_name(_(u"GIF images"))
|
|
||||||
filter_gif.add_mime_type("image/gif")
|
|
||||||
dialog.add_filter(filter_gif)
|
|
||||||
filter_png = Gtk.FileFilter()
|
|
||||||
filter_png.set_name(_(u"PNG Images"))
|
|
||||||
filter_png.add_mime_type("image/png")
|
|
||||||
dialog.add_filter(filter_png)
|
|
||||||
answer = dialog.run()
|
|
||||||
if answer == widgetUtils.OK:
|
|
||||||
image = dialog.get_filename()
|
|
||||||
dialog.destroy()
|
|
||||||
return open(image, "rb")
|
|
||||||
else:
|
|
||||||
dialog.destroy()
|
|
||||||
return None
|
|
||||||
|
|
||||||
class dm(textLimited):
|
|
||||||
def createControls(self, title, message, users):
|
|
||||||
label = Gtk.Label(_(u"Recipient"))
|
|
||||||
self.cb = Gtk.ComboBoxText.new_with_entry()
|
|
||||||
self.cb.set_entry_text_column(0)
|
|
||||||
for user in users:
|
|
||||||
self.cb.append_text(user)
|
|
||||||
self.cb.get_child().set_placeholder_text(_(u"Recipient"))
|
|
||||||
self.cb.get_child().set_text(users[0])
|
|
||||||
self.autocompletionButton = Gtk.Button(_(u"&Autocomplete users"))
|
|
||||||
self.createTextArea(message, text="")
|
|
||||||
userBox = Gtk.Box(spacing=8)
|
|
||||||
userBox.add(label)
|
|
||||||
userBox.add(self.cb)
|
|
||||||
userBox.add(self.autocompletionButton)
|
|
||||||
self.box.add(userBox)
|
|
||||||
# self.mainBox.Add(self.cb, 0, wx.ALL, 5)
|
|
||||||
self.box.add(self.textBox)
|
|
||||||
self.spellcheck = Gtk.Button(_("Spelling correction"))
|
|
||||||
self.attach = Gtk.Button(_(u"Attach audio"))
|
|
||||||
self.shortenButton = Gtk.Button(_(u"Shorten URL"))
|
|
||||||
self.unshortenButton = Gtk.Button(_(u"Expand URL"))
|
|
||||||
self.shortenButton.hide()
|
|
||||||
self.shortenButton.set_no_show_all(True)
|
|
||||||
self.unshortenButton.hide()
|
|
||||||
self.unshortenButton.set_no_show_all(True)
|
|
||||||
self.translateButton = Gtk.Button(_(u"Translate message"))
|
|
||||||
self.buttonsBox = Gtk.Box(spacing=6)
|
|
||||||
self.buttonsBox.add(self.spellcheck)
|
|
||||||
self.buttonsBox.add(self.attach)
|
|
||||||
self.box.add(self.buttonsBox)
|
|
||||||
self.buttonsBox1 = Gtk.Box(spacing=6)
|
|
||||||
self.buttonsBox1.add(self.shortenButton)
|
|
||||||
self.buttonsBox1.add(self.unshortenButton)
|
|
||||||
self.buttonsBox1.add(self.translateButton)
|
|
||||||
self.box.add(self.buttonsBox1)
|
|
||||||
self.text.grab_focus()
|
|
||||||
|
|
||||||
def __init__(self, title, message, users):
|
|
||||||
super(dm, self).__init__()
|
|
||||||
self.createControls(message, title, users)
|
|
||||||
# self.onTimer(wx.EVT_CHAR_HOOK)
|
|
||||||
self.show_all()
|
|
||||||
|
|
||||||
def get_user(self):
|
|
||||||
return self.cb.get_text()
|
|
||||||
|
|
||||||
def set_user(self, user):
|
|
||||||
return self.cb.set_value()
|
|
||||||
|
|
||||||
class reply(tweet):
|
|
||||||
def __init__(self, title, message, text):
|
|
||||||
super(reply, self).__init__(message, title, text)
|
|
||||||
self.text.set_position(-1)
|
|
||||||
self.mentionAll = Gtk.Button(_(u"Men&tion to all"))
|
|
||||||
self.mentionAll.set_no_show_all(True)
|
|
||||||
self.mentionAll.hide()
|
|
||||||
self.buttonsBox1.add(self.mentionAll)
|
|
||||||
|
|
||||||
class viewTweet(widgetUtils.baseDialog):
|
|
||||||
def set_title(self, lenght):
|
|
||||||
pass
|
|
||||||
self.set_title(_(u"Tweet - %i characters ") % (lenght,))
|
|
||||||
|
|
||||||
def __init__(self, text, rt_count, favs_count):
|
|
||||||
super(viewTweet, self).__init__(buttons=(Gtk.STOCK_OK, widgetUtils.OK, Gtk.STOCK_CANCEL, widgetUtils.CANCEL))
|
|
||||||
label = Gtk.Label(_(u"Tweet"))
|
|
||||||
self.text = Gtk.TextView()
|
|
||||||
self.textBuffer = self.text.get_buffer()
|
|
||||||
self.textBuffer.set_text(text)
|
|
||||||
self.text.set_editable(False)
|
|
||||||
# self.textBuffer.set_placeholder_text(message)
|
|
||||||
textBox = Gtk.Box(spacing=6)
|
|
||||||
textBox.add(label)
|
|
||||||
textBox.add(self.text)
|
|
||||||
self.box.add(textBox)
|
|
||||||
rtCountLabel = Gtk.Label(_(u"Retweets: "))
|
|
||||||
rtCount = Gtk.Entry()
|
|
||||||
rtCount.set_text(rt_count)
|
|
||||||
rtCount.set_editable(False)
|
|
||||||
rtBox = Gtk.Box(spacing=2)
|
|
||||||
rtBox.add(rtCountLabel)
|
|
||||||
rtBox.add(rtCount)
|
|
||||||
favsCountLabel = Gtk.Label(_(u"Favourites: "))
|
|
||||||
favsCount = Gtk.Entry()
|
|
||||||
favsCount.set_text(favs_count)
|
|
||||||
favsCount.set_editable(False)
|
|
||||||
favsBox = Gtk.Box(spacing=2)
|
|
||||||
favsBox.add(favsCountLabel)
|
|
||||||
favsBox.add(favsCount)
|
|
||||||
infoBox = Gtk.Box(spacing=4)
|
|
||||||
infoBox.add(rtBox)
|
|
||||||
infoBox.add(favsBox)
|
|
||||||
self.box.add(infoBox)
|
|
||||||
self.spellcheck = Gtk.Button(_("Spelling correction"))
|
|
||||||
self.unshortenButton = Gtk.Button(_(u"Expand URL"))
|
|
||||||
self.unshortenButton.hide()
|
|
||||||
self.unshortenButton.set_no_show_all(True)
|
|
||||||
self.translateButton = Gtk.Button(_(u"Translate message"))
|
|
||||||
buttonsBox = Gtk.Box(spacing=6)
|
|
||||||
buttonsBox.add(self.spellcheck)
|
|
||||||
buttonsBox.add(self.unshortenButton)
|
|
||||||
buttonsBox.add(self.translateButton)
|
|
||||||
self.box.add(buttonsBox)
|
|
||||||
self.show_all()
|
|
||||||
|
|
||||||
def set_text(self, text):
|
|
||||||
self.textBuffer.set_text(text)
|
|
||||||
|
|
||||||
def get_text(self):
|
|
||||||
return self.textBuffer.get_text(self.textBuffer.get_start_iter(), self.textBuffer.get_end_iter(), False)
|
|
||||||
|
|
||||||
def text_focus(self):
|
|
||||||
self.text.grab_focus()
|
|
||||||
|
|
||||||
def enable_button(self, buttonName):
|
|
||||||
if getattr(self, buttonName):
|
|
||||||
return getattr(self, buttonName).show()
|
|
||||||
|
|
||||||
class viewNonTweet(widgetUtils.baseDialog):
|
|
||||||
|
|
||||||
def __init__(self, text):
|
|
||||||
super(viewNonTweet, self).__init__(buttons=(Gtk.STOCK_OK, widgetUtils.OK, Gtk.STOCK_CANCEL, widgetUtils.CANCEL))
|
|
||||||
self.set_title(_(u"View"))
|
|
||||||
label = Gtk.Label(_(u"Item"))
|
|
||||||
self.text = Gtk.TextView()
|
|
||||||
self.text.set_editable(False)
|
|
||||||
self.text.get_buffer().set_text(text)
|
|
||||||
textBox = Gtk.Box(spacing=5)
|
|
||||||
textBox.add(label)
|
|
||||||
textBox.add(self.text)
|
|
||||||
self.box.Add(textBox)
|
|
||||||
self.spellcheck = Gtk.Button(_("Spelling correction"))
|
|
||||||
self.unshortenButton = Gtk.Button(_(u"Expand URL"))
|
|
||||||
self.unshortenButton.hide()
|
|
||||||
self.unshortenButton.set_no_show_all(True)
|
|
||||||
self.translateButton = Gtk.Button(_(u"Translate message"))
|
|
||||||
buttonsBox = Gtk.Box(spacing=6)
|
|
||||||
buttonsBox.add(self.spellcheck)
|
|
||||||
buttonsBox.add(self.unshortenButton)
|
|
||||||
buttonsBox.add(self.translateButton)
|
|
||||||
self.box.Add(buttonsBox)
|
|
||||||
self.show_all()
|
|
||||||
|
|
||||||
def set_text(self, text):
|
|
||||||
self.text.get_buffer().set_text()
|
|
||||||
|
|
||||||
def get_text(self):
|
|
||||||
return self.text.get_buffer().get_text()
|
|
||||||
|
|
||||||
def text_focus(self):
|
|
||||||
self.text.grab_focus()
|
|
||||||
|
|
||||||
def enable_button(self, buttonName):
|
|
||||||
if getattr(self, buttonName):
|
|
||||||
return getattr(self, buttonName).show()
|
|
@@ -1,32 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import baseDialog
|
|
||||||
import wx
|
|
||||||
|
|
||||||
class searchDialog(baseDialog.BaseWXDialog):
|
|
||||||
def __init__(self, value=""):
|
|
||||||
super(searchDialog, self).__init__(None, -1)
|
|
||||||
panel = wx.Panel(self)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
self.SetTitle(_(u"Search on Twitter"))
|
|
||||||
label = wx.StaticText(panel, -1, _(u"Search"))
|
|
||||||
self.term = wx.TextCtrl(panel, -1, value)
|
|
||||||
dc = wx.WindowDC(self.term)
|
|
||||||
dc.SetFont(self.term.GetFont())
|
|
||||||
self.term.SetSize(dc.GetTextExtent("0"*40))
|
|
||||||
sizer.Add(label, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(self.term, 0, wx.ALL, 5)
|
|
||||||
self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP)
|
|
||||||
self.users = wx.RadioButton(panel, -1, _(u"Users"))
|
|
||||||
radioSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
radioSizer.Add(self.tweets, 0, wx.ALL, 5)
|
|
||||||
radioSizer.Add(self.users, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(radioSizer, 0, wx.ALL, 5)
|
|
||||||
ok = wx.Button(panel, wx.ID_OK, _(u"OK"))
|
|
||||||
ok.SetDefault()
|
|
||||||
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
|
||||||
btnsizer = wx.BoxSizer()
|
|
||||||
btnsizer.Add(ok, 0, wx.ALL, 5)
|
|
||||||
btnsizer.Add(cancel, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(btnsizer, 0, wx.ALL, 5)
|
|
||||||
panel.SetSizer(sizer)
|
|
||||||
self.SetClientSize(sizer.CalcMin())
|
|
@@ -1,26 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import wx
|
|
||||||
import baseDialog
|
|
||||||
|
|
||||||
class showUserProfile(baseDialog.BaseWXDialog):
|
|
||||||
def __init__(self):
|
|
||||||
super(showUserProfile, self).__init__(parent=None, id=wx.NewId())
|
|
||||||
panel = wx.Panel(self)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
static = wx.StaticText(panel, -1, _(u"Details"))
|
|
||||||
sizer.Add(static, 0, wx.ALL, 5)
|
|
||||||
self.text = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE|wx.TE_READONLY, size=(350, 250))
|
|
||||||
self.text.SetFocus()
|
|
||||||
sizer.Add(self.text, 0, wx.ALL|wx.EXPAND, 5)
|
|
||||||
self.url = wx.Button(panel, -1, _(u"Go to URL"), size=wx.DefaultSize)
|
|
||||||
self.url.Disable()
|
|
||||||
close = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
|
||||||
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
btnSizer.Add(self.url, 0, wx.ALL, 5)
|
|
||||||
btnSizer.Add(close, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(btnSizer, 0, wx.ALL, 5)
|
|
||||||
panel.SetSizer(sizer)
|
|
||||||
self.SetClientSize(sizer.CalcMin())
|
|
||||||
|
|
||||||
def enable_url(self, enabled=True):
|
|
||||||
self.url.Enable(enabled)
|
|
@@ -1,46 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import baseDialog
|
|
||||||
import wx
|
|
||||||
|
|
||||||
class trendingTopicsDialog(baseDialog.BaseWXDialog):
|
|
||||||
def __init__(self):
|
|
||||||
super(trendingTopicsDialog, self).__init__(None, -1)
|
|
||||||
panel = wx.Panel(self)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
self.SetTitle(_(u"View trending topics"))
|
|
||||||
label = wx.StaticText(panel, -1, _(u"Trending topics by"))
|
|
||||||
sizer.Add(label, 0, wx.ALL, 5)
|
|
||||||
self.country = wx.RadioButton(panel, -1, _(u"Country"), style=wx.RB_GROUP)
|
|
||||||
self.city = wx.RadioButton(panel, -1, _(u"City"))
|
|
||||||
radioSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
radioSizer.Add(label, 0, wx.ALL, 5)
|
|
||||||
radioSizer.Add(self.country, 0, wx.ALL, 5)
|
|
||||||
radioSizer.Add(self.city, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(radioSizer, 0, wx.ALL, 5)
|
|
||||||
label = wx.StaticText(panel, -1, _(u"Location"))
|
|
||||||
self.location = wx.ListBox(panel, -1, choices=[], style=wx.CB_READONLY)
|
|
||||||
locationBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
locationBox.Add(label, 0, wx.ALL, 5)
|
|
||||||
locationBox.Add(self.location, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(locationBox, 0, wx.ALL, 5)
|
|
||||||
ok = wx.Button(panel, wx.ID_OK, _(u"OK"))
|
|
||||||
ok.SetDefault()
|
|
||||||
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
|
||||||
btnsizer = wx.BoxSizer()
|
|
||||||
btnsizer.Add(ok, 0, wx.ALL, 5)
|
|
||||||
btnsizer.Add(cancel, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(btnsizer, 0, wx.ALL, 5)
|
|
||||||
panel.SetSizer(sizer)
|
|
||||||
self.SetClientSize(sizer.CalcMin())
|
|
||||||
|
|
||||||
def get_active(self):
|
|
||||||
if self.country.GetValue() == True:
|
|
||||||
return "country"
|
|
||||||
else:
|
|
||||||
return "city"
|
|
||||||
|
|
||||||
def get_item(self):
|
|
||||||
return self.location.GetStringSelection()
|
|
||||||
|
|
||||||
def set(self, values):
|
|
||||||
self.location.Set(values)
|
|
@@ -1,98 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import wx
|
|
||||||
import baseDialog
|
|
||||||
|
|
||||||
class updateProfileDialog(baseDialog.BaseWXDialog):
|
|
||||||
def __init__(self):
|
|
||||||
super(updateProfileDialog, self).__init__(parent=None, id=-1)
|
|
||||||
self.SetTitle(_(u"Update your profile"))
|
|
||||||
panel = wx.Panel(self)
|
|
||||||
labelName = wx.StaticText(panel, -1, _(u"Name (20 characters maximum)"))
|
|
||||||
self.name = wx.TextCtrl(panel, -1)
|
|
||||||
self.name.SetFocus()
|
|
||||||
dc = wx.WindowDC(self.name)
|
|
||||||
dc.SetFont(self.name.GetFont())
|
|
||||||
self.name.SetSize(dc.GetTextExtent("0"*20))
|
|
||||||
labelLocation = wx.StaticText(panel, -1, _(u"Location"))
|
|
||||||
self.location = wx.TextCtrl(panel, -1)
|
|
||||||
dc = wx.WindowDC(self.location)
|
|
||||||
dc.SetFont(self.location.GetFont())
|
|
||||||
self.location.SetSize(dc.GetTextExtent("0"*35))
|
|
||||||
labelUrl = wx.StaticText(panel, -1, _(u"Website"))
|
|
||||||
self.url = wx.TextCtrl(panel, -1)
|
|
||||||
dc = wx.WindowDC(self.url)
|
|
||||||
dc.SetFont(self.url.GetFont())
|
|
||||||
self.url.SetSize(dc.GetTextExtent("0"*22))
|
|
||||||
labelDescription = wx.StaticText(panel, -1, _(u"Bio (160 characters maximum)"))
|
|
||||||
self.description = wx.TextCtrl(panel, -1, size=(400, 400))
|
|
||||||
dc = wx.WindowDC(self.description)
|
|
||||||
dc.SetFont(self.description.GetFont())
|
|
||||||
self.description.SetSize(dc.GetTextExtent("0"*160))
|
|
||||||
self.image = None
|
|
||||||
self.upload_image = wx.Button(panel, -1, _(u"Upload a picture"))
|
|
||||||
self.ok = wx.Button(panel, wx.ID_OK, _(u"Update profile"))
|
|
||||||
self.ok.SetDefault()
|
|
||||||
close = wx.Button(panel, wx.ID_CANCEL, _("Close"))
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
nameBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
nameBox.Add(labelName, 0, wx.ALL, 5)
|
|
||||||
nameBox.Add(self.name, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(nameBox, 0, wx.ALL, 5)
|
|
||||||
locationBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
locationBox.Add(labelLocation, 0, wx.ALL, 5)
|
|
||||||
locationBox.Add(self.location, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(locationBox, 0, wx.ALL, 5)
|
|
||||||
urlBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
urlBox.Add(labelUrl, 0, wx.ALL, 5)
|
|
||||||
urlBox.Add(self.url, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(urlBox, 0, wx.ALL, 5)
|
|
||||||
descriptionBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
descriptionBox.Add(labelDescription, 0, wx.ALL, 5)
|
|
||||||
descriptionBox.Add(self.description, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(descriptionBox, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(self.upload_image, 5, wx.CENTER, 5)
|
|
||||||
btnBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
btnBox.Add(self.ok, 0, wx.ALL, 5)
|
|
||||||
btnBox.Add(close, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(btnBox, 0, wx.ALL, 5)
|
|
||||||
panel.SetSizer(sizer)
|
|
||||||
self.SetClientSize(sizer.CalcMin())
|
|
||||||
|
|
||||||
def set_name(self, name):
|
|
||||||
self.set("name", name)
|
|
||||||
|
|
||||||
def set_description(self, description):
|
|
||||||
self.set("description", description)
|
|
||||||
|
|
||||||
def set_location(self, location):
|
|
||||||
self.set("location", location)
|
|
||||||
|
|
||||||
def set_url(self, url):
|
|
||||||
self.set("url", url)
|
|
||||||
|
|
||||||
def change_upload_button(self, uploaded=False):
|
|
||||||
if uploaded == False:
|
|
||||||
self.upload_image.SetLabel(_(u"Upload a picture"))
|
|
||||||
else:
|
|
||||||
self.upload_image.SetLabel(_(u"Discard image"))
|
|
||||||
|
|
||||||
def upload_picture(self):
|
|
||||||
openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
|
|
||||||
if openFileDialog.ShowModal() == wx.ID_CANCEL:
|
|
||||||
return None
|
|
||||||
return openFileDialog.GetPath()
|
|
||||||
|
|
||||||
def hide_upload_button(self, hide):
|
|
||||||
self.upload_image.Enable(hide)
|
|
||||||
|
|
||||||
def set_readonly(self):
|
|
||||||
self.name.style = wx.TE_READONLY
|
|
||||||
self.name.Refresh()
|
|
||||||
self.description.style = wx.TE_READONLY
|
|
||||||
self.description.Refresh()
|
|
||||||
self.location.style = wx.TE_READONLY
|
|
||||||
self.location.Refresh()
|
|
||||||
self.url.style = wx.TE_READONLY
|
|
||||||
self.url.Refresh()
|
|
||||||
self.hide_upload_button(False)
|
|
||||||
self.ok.Enable(False)
|
|
@@ -1,35 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import wx
|
|
||||||
|
|
||||||
class urlList(wx.Dialog):
|
|
||||||
def __init__(self):
|
|
||||||
super(urlList, self).__init__(parent=None, title=_(u"Select an URL"))
|
|
||||||
panel = wx.Panel(self)
|
|
||||||
self.lista = wx.ListBox(panel, -1)
|
|
||||||
self.lista.SetFocus()
|
|
||||||
self.lista.SetSize(self.lista.GetBestSize())
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
sizer.Add(self.lista, 0, wx.ALL, 5)
|
|
||||||
goBtn = wx.Button(panel, wx.ID_OK)
|
|
||||||
goBtn.SetDefault()
|
|
||||||
cancelBtn = wx.Button(panel, wx.ID_CANCEL)
|
|
||||||
btnSizer = wx.BoxSizer()
|
|
||||||
btnSizer.Add(goBtn, 0, wx.ALL, 5)
|
|
||||||
btnSizer.Add(cancelBtn, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(btnSizer, 0, wx.ALL, 5)
|
|
||||||
panel.SetSizer(sizer)
|
|
||||||
self.SetClientSize(sizer.CalcMin())
|
|
||||||
|
|
||||||
def populate_list(self, urls):
|
|
||||||
for i in urls:
|
|
||||||
self.lista.Append(i)
|
|
||||||
self.lista.SetSelection(0)
|
|
||||||
|
|
||||||
def get_string(self):
|
|
||||||
return self.lista.GetStringSelection()
|
|
||||||
|
|
||||||
def get_item(self):
|
|
||||||
return self.lista.GetSelection()
|
|
||||||
|
|
||||||
def get_response(self):
|
|
||||||
return self.ShowModal()
|
|
@@ -1,81 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import wx
|
|
||||||
|
|
||||||
class UserActionsDialog(wx.Dialog):
|
|
||||||
def __init__(self, users=[], default="follow", *args, **kwargs):
|
|
||||||
super(UserActionsDialog, self).__init__(parent=None, *args, **kwargs)
|
|
||||||
panel = wx.Panel(self)
|
|
||||||
userSizer = wx.BoxSizer()
|
|
||||||
self.SetTitle(_(u"Action"))
|
|
||||||
userLabel = wx.StaticText(panel, -1, _(u"User"))
|
|
||||||
self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0])
|
|
||||||
self.cb.SetFocus()
|
|
||||||
userSizer.Add(userLabel, 0, wx.ALL, 5)
|
|
||||||
userSizer.Add(self.cb, 0, wx.ALL, 5)
|
|
||||||
actionSizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
label2 = wx.StaticText(panel, -1, _(u"Action"))
|
|
||||||
self.follow = wx.RadioButton(panel, -1, _(u"Follow"), style=wx.RB_GROUP)
|
|
||||||
self.unfollow = wx.RadioButton(panel, -1, _(u"Unfollow"))
|
|
||||||
self.mute = wx.RadioButton(panel, -1, _(u"Mute"))
|
|
||||||
self.unmute = wx.RadioButton(panel, -1, _(u"Unmute"))
|
|
||||||
self.block = wx.RadioButton(panel, -1, _(u"Block"))
|
|
||||||
self.unblock = wx.RadioButton(panel, -1, _(u"Unblock"))
|
|
||||||
self.reportSpam = wx.RadioButton(panel, -1, _(u"Report as spam"))
|
|
||||||
self.ignore_client = wx.RadioButton(panel, -1, _(u"Ignore tweets from this client"))
|
|
||||||
self.setup_default(default)
|
|
||||||
hSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
hSizer.Add(label2, 0, wx.ALL, 5)
|
|
||||||
actionSizer.Add(self.follow, 0, wx.ALL, 5)
|
|
||||||
actionSizer.Add(self.unfollow, 0, wx.ALL, 5)
|
|
||||||
actionSizer.Add(self.mute, 0, wx.ALL, 5)
|
|
||||||
actionSizer.Add(self.unmute, 0, wx.ALL, 5)
|
|
||||||
actionSizer.Add(self.block, 0, wx.ALL, 5)
|
|
||||||
actionSizer.Add(self.unblock, 0, wx.ALL, 5)
|
|
||||||
actionSizer.Add(self.reportSpam, 0, wx.ALL, 5)
|
|
||||||
actionSizer.Add(self.ignore_client, 0, wx.ALL, 5)
|
|
||||||
hSizer.Add(actionSizer, 0, wx.ALL, 5)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
ok = wx.Button(panel, wx.ID_OK, _(u"OK"))
|
|
||||||
ok.SetDefault()
|
|
||||||
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
|
||||||
btnsizer = wx.BoxSizer()
|
|
||||||
btnsizer.Add(ok)
|
|
||||||
btnsizer.Add(cancel)
|
|
||||||
sizer.Add(userSizer)
|
|
||||||
sizer.Add(hSizer, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(btnsizer)
|
|
||||||
panel.SetSizer(sizer)
|
|
||||||
|
|
||||||
def get_action(self):
|
|
||||||
if self.follow.GetValue() == True: return "follow"
|
|
||||||
elif self.unfollow.GetValue() == True: return "unfollow"
|
|
||||||
elif self.mute.GetValue() == True: return "mute"
|
|
||||||
elif self.unmute.GetValue() == True: return "unmute"
|
|
||||||
elif self.reportSpam.GetValue() == True: return "report"
|
|
||||||
elif self.block.GetValue() == True: return "block"
|
|
||||||
elif self.unblock.GetValue() == True: return "unblock"
|
|
||||||
elif self.ignore_client.GetValue() == True: return "ignore_client"
|
|
||||||
|
|
||||||
def setup_default(self, default):
|
|
||||||
if default == "follow":
|
|
||||||
self.follow.SetValue(True)
|
|
||||||
elif default == "unfollow":
|
|
||||||
self.unfollow.SetValue(True)
|
|
||||||
elif default == "mute":
|
|
||||||
self.mute.SetValue(True)
|
|
||||||
elif default == "unmute":
|
|
||||||
self.unmute.SetValue(True)
|
|
||||||
elif default == "report":
|
|
||||||
self.reportSpam.SetValue(True)
|
|
||||||
elif default == "block":
|
|
||||||
self.block.SetValue(True)
|
|
||||||
elif default == "unblock":
|
|
||||||
self.unblock.SetValue(True)
|
|
||||||
elif default == "ignore_client":
|
|
||||||
self.ignore_client.SetValue(True)
|
|
||||||
|
|
||||||
def get_response(self):
|
|
||||||
return self.ShowModal()
|
|
||||||
|
|
||||||
def get_user(self):
|
|
||||||
return self.cb.GetValue()
|
|
@@ -1,51 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import wx
|
|
||||||
|
|
||||||
class selectUserDialog(wx.Dialog):
|
|
||||||
def __init__(self, users=[], default="tweets", *args, **kwargs):
|
|
||||||
super(selectUserDialog, self).__init__(parent=None, *args, **kwargs)
|
|
||||||
panel = wx.Panel(self)
|
|
||||||
userSizer = wx.BoxSizer()
|
|
||||||
self.SetTitle(_(u"Timeline for %s") % (users[0]))
|
|
||||||
userLabel = wx.StaticText(panel, -1, _(u"User"))
|
|
||||||
self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0])
|
|
||||||
self.cb.SetFocus()
|
|
||||||
userSizer.Add(userLabel, 0, wx.ALL, 5)
|
|
||||||
userSizer.Add(self.cb, 0, wx.ALL, 5)
|
|
||||||
actionSizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
label2 = wx.StaticText(panel, -1, _(u"Buffer type"))
|
|
||||||
self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP)
|
|
||||||
self.favourites = wx.RadioButton(panel, -1, _(u"Favourites"))
|
|
||||||
self.setup_default(default)
|
|
||||||
hSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
hSizer.Add(label2, 0, wx.ALL, 5)
|
|
||||||
actionSizer.Add(self.tweets, 0, wx.ALL, 5)
|
|
||||||
actionSizer.Add(self.favourites, 0, wx.ALL, 5)
|
|
||||||
hSizer.Add(actionSizer, 0, wx.ALL, 5)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
ok = wx.Button(panel, wx.ID_OK, _(u"OK"))
|
|
||||||
ok.SetDefault()
|
|
||||||
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
|
||||||
btnsizer = wx.BoxSizer()
|
|
||||||
btnsizer.Add(ok)
|
|
||||||
btnsizer.Add(cancel)
|
|
||||||
sizer.Add(userSizer)
|
|
||||||
sizer.Add(hSizer, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(btnsizer)
|
|
||||||
panel.SetSizer(sizer)
|
|
||||||
|
|
||||||
def get_action(self):
|
|
||||||
if self.tweets.GetValue() == True: return "tweets"
|
|
||||||
elif self.favourites.GetValue() == True: return "favourites"
|
|
||||||
|
|
||||||
def setup_default(self, default):
|
|
||||||
if default == "tweets":
|
|
||||||
self.tweets.SetValue(True)
|
|
||||||
elif default == "favourites":
|
|
||||||
self.favourites.SetValue(True)
|
|
||||||
|
|
||||||
def get_response(self):
|
|
||||||
return self.ShowModal()
|
|
||||||
|
|
||||||
def get_user(self):
|
|
||||||
return self.cb.GetValue()
|
|
@@ -1,46 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
############################################################
|
|
||||||
# Copyright (c) 2013, 2014 Manuel Eduardo Cortéz Vallejo <manuel@manuelcortez.net>
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
############################################################
|
|
||||||
import wx
|
|
||||||
import baseDialog
|
|
||||||
|
|
||||||
class selectUserDialog(baseDialog.BaseWXDialog):
|
|
||||||
def __init__(self, title, users):
|
|
||||||
super(selectUserDialog, self).__init__(parent=None, id=wx.NewId(), title=title)
|
|
||||||
panel = wx.Panel(self)
|
|
||||||
userSizer = wx.BoxSizer()
|
|
||||||
self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0], size=wx.DefaultSize)
|
|
||||||
self.cb.SetFocus()
|
|
||||||
userSizer.Add(wx.StaticText(panel, -1, _(u"User")), 0, wx.ALL, 5)
|
|
||||||
userSizer.Add(self.cb)
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
||||||
ok = wx.Button(panel, wx.ID_OK, _(u"OK"))
|
|
||||||
ok.SetDefault()
|
|
||||||
# ok.Bind(wx.EVT_BUTTON, self.onok)
|
|
||||||
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
|
||||||
btnsizer = wx.BoxSizer()
|
|
||||||
btnsizer.Add(ok, 0, wx.ALL, 5)
|
|
||||||
btnsizer.Add(cancel, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(userSizer, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(btnsizer, 0, wx.ALL, 5)
|
|
||||||
panel.SetSizer(sizer)
|
|
||||||
self.SetClientSize(sizer.CalcMin())
|
|
||||||
|
|
||||||
def get_user(self):
|
|
||||||
return self.cb.GetValue()
|
|
||||||
|
|
@@ -1,48 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
""" A systray for TW Blue """
|
|
||||||
############################################################
|
|
||||||
# Copyright (c) 2014 José Manuel Delicado Alcolea <jmdaweb@gmail.com>
|
|
||||||
#
|
|
||||||
# This program is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program 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 General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
############################################################
|
|
||||||
|
|
||||||
import wx
|
|
||||||
import application
|
|
||||||
import paths
|
|
||||||
import os
|
|
||||||
|
|
||||||
class SysTrayIcon(wx.TaskBarIcon):
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(SysTrayIcon, self).__init__()
|
|
||||||
icon=wx.Icon(os.path.join(paths.app_path(), "icon.ico"), wx.BITMAP_TYPE_ICO)
|
|
||||||
self.SetIcon(icon, application.name)
|
|
||||||
self.menu=wx.Menu()
|
|
||||||
self.tweet = self.menu.Append(wx.ID_ANY, _(u"Tweet"))
|
|
||||||
self.global_settings = self.menu.Append(wx.ID_ANY, _(u"&Global settings"))
|
|
||||||
self.account_settings = self.menu.Append(wx.ID_ANY, _(u"Account se&ttings"))
|
|
||||||
self.update_profile = self.menu.Append(wx.ID_ANY, _(u"Update &profile"))
|
|
||||||
self.show_hide = self.menu.Append(wx.ID_ANY, _(u"&Show / hide"))
|
|
||||||
self.doc = self.menu.Append(wx.ID_ANY, _(u"&Documentation"))
|
|
||||||
self.doc.Enable(False)
|
|
||||||
self.check_for_updates = self.menu.Append(wx.ID_ANY, _(u"Check for &updates"))
|
|
||||||
self.exit = self.menu.Append(wx.ID_ANY, _(u"&Exit"))
|
|
||||||
|
|
||||||
def show_menu(self):
|
|
||||||
self.PopupMenu(self.menu)
|
|
||||||
|
|
||||||
def Destroy(self):
|
|
||||||
self.menu.Destroy()
|
|
||||||
super(SysTrayIcon, self).Destroy()
|
|
@@ -1,206 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import application
|
|
||||||
import widgetUtils
|
|
||||||
from gi.repository import Gtk, Gdk
|
|
||||||
|
|
||||||
class mainFrame(Gtk.Window):
|
|
||||||
""" Main class of the Frame. This is the Main Window."""
|
|
||||||
|
|
||||||
def append_to_menu(self, menu, *elements):
|
|
||||||
for i in elements:
|
|
||||||
menu.append(i)
|
|
||||||
|
|
||||||
### MENU
|
|
||||||
def makeMenus(self):
|
|
||||||
""" Creates, bind and returns the menu bar for the application. Also in this function, the accel table is created."""
|
|
||||||
menuBar = Gtk.MenuBar()
|
|
||||||
|
|
||||||
# Application menu
|
|
||||||
app = Gtk.Menu()
|
|
||||||
|
|
||||||
self.manage_accounts = Gtk.MenuItem(label=_(u"Manage accounts"))
|
|
||||||
self.updateProfile = Gtk.MenuItem(label="Update profile")
|
|
||||||
self.updateProfile.add_accelerator("activate", self.accel_group, ord("U"), Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE)
|
|
||||||
# As in Gtk is not possible to bind keyboard shorcuts to the system, we don't have support for an invisible interface.
|
|
||||||
self.show_hide = None
|
|
||||||
self.menuitem_search = Gtk.MenuItem(label="Search")
|
|
||||||
self.lists = Gtk.MenuItem(label="Lists manager")
|
|
||||||
self.keystrokes_editor = None
|
|
||||||
self.account_settings = Gtk.MenuItem(label="Account settings")
|
|
||||||
self.prefs = Gtk.MenuItem(label="Global settings")
|
|
||||||
self.close = Gtk.MenuItem(label="Close")
|
|
||||||
self.close.add_accelerator("activate", self.accel_group, ord("Q"), Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE)
|
|
||||||
self.append_to_menu(app, self.manage_accounts, self.updateProfile, self.menuitem_search, self.lists, self.account_settings, self.prefs, self.close)
|
|
||||||
|
|
||||||
app_menu = Gtk.MenuItem(label="Application")
|
|
||||||
app_menu.add_accelerator("activate", self.accel_group, ord("a"), Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE)
|
|
||||||
app_menu.set_submenu(app)
|
|
||||||
menuBar.append(app_menu)
|
|
||||||
|
|
||||||
# Tweet menu
|
|
||||||
tweet = Gtk.Menu()
|
|
||||||
self.compose = Gtk.MenuItem(label="Tweet")
|
|
||||||
self.compose.add_accelerator("activate", self.accel_group, ord("N"), Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE)
|
|
||||||
self.reply = Gtk.MenuItem(label="Reply")
|
|
||||||
self.reply.add_accelerator("activate", self.accel_group, ord("R"), Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE)
|
|
||||||
self.retweet = Gtk.MenuItem(label="Retweet")
|
|
||||||
self.retweet.add_accelerator("activate", self.accel_group, ord("T"), Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE)
|
|
||||||
self.fav = Gtk.MenuItem(label="Add to favourites")
|
|
||||||
self.fav.add_accelerator("activate", self.accel_group, ord("F"), Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE)
|
|
||||||
self.unfav = Gtk.MenuItem(label="Remove from favourites")
|
|
||||||
self.view = Gtk.MenuItem(label="Show tweet")
|
|
||||||
self.view_coordinates = Gtk.MenuItem(label="View address")
|
|
||||||
self.view_conversation = Gtk.MenuItem(label="View conversation")
|
|
||||||
self.delete = Gtk.MenuItem(label="Delete")
|
|
||||||
self.append_to_menu(tweet, self.compose, self.reply, self.retweet, self.fav, self.unfav, self.view, self.view_coordinates, self.view_conversation, self.delete)
|
|
||||||
tweet_menu = Gtk.MenuItem(label="Tweet")
|
|
||||||
tweet_menu.set_submenu(tweet)
|
|
||||||
menuBar.append(tweet_menu)
|
|
||||||
|
|
||||||
# User menu
|
|
||||||
user = Gtk.Menu()
|
|
||||||
self.follow = Gtk.MenuItem(label="Follow")
|
|
||||||
self.unfollow = Gtk.MenuItem(label="Unfollow")
|
|
||||||
self.mute = Gtk.MenuItem(label="Mute")
|
|
||||||
self.unmute = Gtk.MenuItem(label="Unmute")
|
|
||||||
self.report = Gtk.MenuItem(label="Report as spam")
|
|
||||||
self.block = Gtk.MenuItem(label="Block")
|
|
||||||
self.unblock = Gtk.MenuItem(label="Unblock")
|
|
||||||
self.timeline = Gtk.MenuItem(label="View timeline...")
|
|
||||||
self.dm = Gtk.MenuItem(label="Direct message")
|
|
||||||
self.addToList = Gtk.MenuItem(label="Add to list")
|
|
||||||
self.removeFromList = Gtk.MenuItem(label="Remove from list")
|
|
||||||
self.viewLists = Gtk.MenuItem(label="View lists")
|
|
||||||
self.details = Gtk.MenuItem(label="Show user profile")
|
|
||||||
self.favs = Gtk.MenuItem(label="View favourites")
|
|
||||||
self.append_to_menu(user, self.follow, self.unfollow, self.mute, self.unmute, self.report, self.block, self.unblock, self.timeline, self.dm, self.addToList, self.removeFromList, self.viewLists, self.details, self.favs)
|
|
||||||
user_menu = Gtk.MenuItem(label="User")
|
|
||||||
user_menu.set_submenu(user)
|
|
||||||
menuBar.append(user_menu)
|
|
||||||
|
|
||||||
# buffer menu
|
|
||||||
buffer = Gtk.Menu()
|
|
||||||
self.trends = Gtk.MenuItem(label="New trending topics buffer...")
|
|
||||||
self.trends.add_accelerator("activate", self.accel_group, ord("T"), Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE)
|
|
||||||
self.load_previous_items = Gtk.MenuItem(label="Load previous items")
|
|
||||||
self.mute_buffer = Gtk.MenuItem(label="Mute")
|
|
||||||
self.autoread = Gtk.MenuItem(label="Autoread")
|
|
||||||
self.clear = Gtk.MenuItem(label="Clear buffer")
|
|
||||||
self.deleteTl = Gtk.MenuItem(label="Destroy")
|
|
||||||
self.append_to_menu(buffer, self.trends, self.load_previous_items, self.mute_buffer, self.autoread, self.clear, self.deleteTl)
|
|
||||||
buffer_menu = Gtk.MenuItem(label="Buffer")
|
|
||||||
buffer_menu.set_submenu(buffer)
|
|
||||||
menuBar.append(buffer_menu)
|
|
||||||
|
|
||||||
# Help Menu
|
|
||||||
help = Gtk.Menu()
|
|
||||||
self.doc = Gtk.MenuItem(label="Documentation")
|
|
||||||
self.sounds_tutorial = Gtk.MenuItem(label="Sounds tutorial")
|
|
||||||
self.changelog = Gtk.MenuItem(label="What's new in this version?")
|
|
||||||
self.check_for_updates = Gtk.MenuItem(label="Check for updates")
|
|
||||||
self.reportError = Gtk.MenuItem(label="Report an error")
|
|
||||||
self.visit_website = Gtk.MenuItem(label=application.name+"'s website")
|
|
||||||
self.about = Gtk.MenuItem(label="ABout "+application.name)
|
|
||||||
self.append_to_menu(help, self.doc, self.sounds_tutorial, self.changelog, self.check_for_updates, self.reportError, self.visit_website, self.about)
|
|
||||||
help_menu = Gtk.MenuItem(label="Help")
|
|
||||||
help_menu.set_submenu(help)
|
|
||||||
menuBar.append(help_menu)
|
|
||||||
self.box.pack_start(menuBar, False, False, 0)
|
|
||||||
|
|
||||||
### MAIN
|
|
||||||
def __init__(self):
|
|
||||||
""" Main function of this class."""
|
|
||||||
super(mainFrame, self).__init__(title=application.name)
|
|
||||||
self.accel_group = Gtk.AccelGroup()
|
|
||||||
self.add_accel_group(self.accel_group)
|
|
||||||
self.box = Gtk.VBox()
|
|
||||||
self.makeMenus()
|
|
||||||
self.nb = widgetUtils.notebook()
|
|
||||||
self.w = None
|
|
||||||
self.notebookBox = Gtk.Box(spacing=5)
|
|
||||||
self.notebookBox.add(self.nb.view)
|
|
||||||
self.box.add(self.notebookBox)
|
|
||||||
self.add(self.box)
|
|
||||||
select = self.nb.view.get_selection()
|
|
||||||
select.connect("changed", self.load)
|
|
||||||
|
|
||||||
def show(self):
|
|
||||||
self.show_all()
|
|
||||||
|
|
||||||
def get_buffer_count(self):
|
|
||||||
return self.nb.get_count()
|
|
||||||
|
|
||||||
def add_buffer(self, buffer, name):
|
|
||||||
buff = widgetUtils.buffer(buffer)
|
|
||||||
buff.name = name
|
|
||||||
self.nb.store.append(None, (buff,))
|
|
||||||
|
|
||||||
def insert_buffer(self, buffer, name, pos):
|
|
||||||
iter = self.nb.store.get_iter(pos)
|
|
||||||
buff = widgetUtils.buffer(buffer)
|
|
||||||
buff.name = name
|
|
||||||
self.nb.store.insert(iter, -1, (buff,))
|
|
||||||
|
|
||||||
def prepare(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def search(self, name_, account):
|
|
||||||
(path, iter) = self.nb.search(self.nb.store, name_, account)
|
|
||||||
if path != None:
|
|
||||||
return path
|
|
||||||
|
|
||||||
def get_current_buffer(self):
|
|
||||||
return self.nb.get_current_page()
|
|
||||||
|
|
||||||
def get_current_buffer_pos(self):
|
|
||||||
return self.nb.get_current_page_path()
|
|
||||||
|
|
||||||
def get_buffer(self, pos):
|
|
||||||
return self.get_page(pos)
|
|
||||||
|
|
||||||
def load(self, selection):
|
|
||||||
model, treeiter = selection.get_selected()
|
|
||||||
if treeiter != None:
|
|
||||||
if self.w != None:
|
|
||||||
self.notebookBox.remove(self.w)
|
|
||||||
self.w = self.nb.store[treeiter][0].buffer
|
|
||||||
self.notebookBox.add(self.w)
|
|
||||||
self.show_all()
|
|
||||||
|
|
||||||
def change_buffer(self, position):
|
|
||||||
self.nb.ChangeSelection(position)
|
|
||||||
|
|
||||||
def get_buffer_text(self):
|
|
||||||
return self.nb.GetPageText(self.nb.GetSelection())
|
|
||||||
|
|
||||||
def get_buffer_by_id(self, id):
|
|
||||||
return self.nb.FindWindowById(id)
|
|
||||||
def advance_selection(self, forward):
|
|
||||||
self.nb.AdvanceSelection(forward)
|
|
||||||
|
|
||||||
|
|
||||||
def show_address(self, address):
|
|
||||||
wx.MessageDialog(self, address, _(u"Address"), wx.OK).ShowModal()
|
|
||||||
|
|
||||||
def delete_buffer(self, pos):
|
|
||||||
self.nb.DeletePage(pos)
|
|
||||||
|
|
||||||
def about_dialog(self):
|
|
||||||
info = wx.AboutDialogInfo()
|
|
||||||
info.SetName(application.name)
|
|
||||||
info.SetVersion(application.version)
|
|
||||||
info.SetDescription(application.description)
|
|
||||||
info.SetCopyright(application.copyright)
|
|
||||||
info.SetTranslators(application.translators)
|
|
||||||
# info.SetLicence(application.licence)
|
|
||||||
info.AddDeveloper(application.author)
|
|
||||||
wx.AboutBox(info)
|
|
||||||
def set_focus(self):
|
|
||||||
self.SetFocus()
|
|
||||||
|
|
||||||
def check_menuitem(self, menuitem, check=True):
|
|
||||||
if hasattr(self, menuitem):
|
|
||||||
getattr(self, menuitem).Check(check)
|
|
||||||
|
|
||||||
def no_update_available():
|
|
||||||
wx.MessageDialog(None, _(u"Your " + application.name + " version is up to date"), _(u"Update"), style=wx.OK).ShowModal()
|
|
@@ -66,7 +66,7 @@ class reportBugDialog(widgetUtils.BaseDialog):
|
|||||||
severityB.Add(severityLabel, 0, wx.ALL, 5)
|
severityB.Add(severityLabel, 0, wx.ALL, 5)
|
||||||
severityB.Add(self.severity, 0, wx.ALL, 5)
|
severityB.Add(self.severity, 0, wx.ALL, 5)
|
||||||
sizer.Add(severityB, 0, wx.ALL, 5)
|
sizer.Add(severityB, 0, wx.ALL, 5)
|
||||||
self.agree = wx.CheckBox(panel, -1, _(u"I know that the " + application.name + " bug system will get my Twitter username to contact me and fix the bug quickly"))
|
self.agree = wx.CheckBox(panel, -1, _(u"I know that the {0} bug system will get my Twitter username to contact me and fix the bug quickly").format(application.name,))
|
||||||
self.agree.SetValue(False)
|
self.agree.SetValue(False)
|
||||||
sizer.Add(self.agree, 0, wx.ALL, 5)
|
sizer.Add(self.agree, 0, wx.ALL, 5)
|
||||||
self.ok = wx.Button(panel, wx.ID_OK, _(u"Send report"))
|
self.ok = wx.Button(panel, wx.ID_OK, _(u"Send report"))
|
||||||
|
30
src/keymaps/Chicken Nugget.keymap
Normal file
30
src/keymaps/Chicken Nugget.keymap
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
[info]
|
||||||
|
name = string(default="Chicken Nugget")
|
||||||
|
desc = string(default="Remaps TWBlue shortcuts to their equivalents in Christopher Toth's Chicken Nugget Twitter client.")
|
||||||
|
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||||
|
|
||||||
|
[keymap]
|
||||||
|
up = string(default="control+win+up")
|
||||||
|
down = string(default="control+win+down")
|
||||||
|
left = string(default="control+win+left")
|
||||||
|
right = string(default="control+win+right")
|
||||||
|
open_conversation = string(default="control+win+c")
|
||||||
|
show_hide = string(default="control+win+w")
|
||||||
|
post_tweet = string(default="control+win+t")
|
||||||
|
post_reply = string(default="control+win+r")
|
||||||
|
post_retweet = string(default="control+win+shift+t")
|
||||||
|
send_dm = string(default="control+win+d")
|
||||||
|
user_details = string(default="control+win+shift+u")
|
||||||
|
exit = string(default="control+win+q")
|
||||||
|
open_timeline = string(default="control+win+u")
|
||||||
|
remove_buffer = string(default="control+win+backspace")
|
||||||
|
audio = string(default="control+win+return")
|
||||||
|
url = string(default="control+win+b")
|
||||||
|
go_home = string(default="control+win+home")
|
||||||
|
go_end = string(default="control+win+end")
|
||||||
|
delete = string(default="control+win+delete")
|
||||||
|
clear_buffer = string(default="control+win+shift+delete")
|
||||||
|
repeat_item = string(default="control+win+space")
|
||||||
|
copy_to_clipboard = string(default="control+win+shift+c")
|
||||||
|
search = string(default="control+win+/")
|
||||||
|
find = string(default="control+win+shift+/")
|
@@ -1,29 +0,0 @@
|
|||||||
[info]
|
|
||||||
name = Chicken Nugget
|
|
||||||
desc = Remaps TWBlue shortcuts to their equivalents in Christopher Toth's Chicken Nugget Twitter client.
|
|
||||||
author = Bill Dengler <codeofdusk@gmail.com>
|
|
||||||
|
|
||||||
[keymap]
|
|
||||||
up = control+win+up
|
|
||||||
down = control+win+down
|
|
||||||
left = control+win+left
|
|
||||||
right = control+win+right
|
|
||||||
open_conversation = control+win+c
|
|
||||||
show_hide = control+win+w
|
|
||||||
post_tweet = control+win+t
|
|
||||||
post_reply = control+win+r
|
|
||||||
post_retweet = control+win+shift+t
|
|
||||||
send_dm = control+win+d
|
|
||||||
user_details = control+win+shift+u
|
|
||||||
exit = control+win+q
|
|
||||||
open_timeline = control+win+u
|
|
||||||
remove_buffer = control+win+backspace
|
|
||||||
interact = control+win+return
|
|
||||||
secondary_interact = control+win+b
|
|
||||||
go_home = control+win+home
|
|
||||||
go_end = control+win+end
|
|
||||||
delete = control+win+delete
|
|
||||||
clear_buffer = control+win+shift+delete
|
|
||||||
repeat_item = control+win+space
|
|
||||||
copy_to_clipboard = control+win+shift+c
|
|
||||||
search = control+win+/
|
|
@@ -1,47 +1,49 @@
|
|||||||
[info]
|
[info]
|
||||||
name = Qwitter
|
name = string(default="Qwitter")
|
||||||
desc = A keymap which emulates Qwitter as closely as possible.
|
desc = string(default="A keymap which emulates Qwitter as closely as possible.")
|
||||||
author = Bill Dengler <codeofdusk@gmail.com>
|
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||||
|
|
||||||
[keymap]
|
[keymap]
|
||||||
up = control+win+up
|
up = string(default="control+win+up")
|
||||||
down = control+win+down
|
down = string(default="control+win+down")
|
||||||
left = control+win+left
|
left = string(default="control+win+left")
|
||||||
right = control+win+right
|
right = string(default="control+win+right")
|
||||||
next_account = control+win+shift+right
|
next_account = string(default="control+win+shift+right")
|
||||||
previous_account = control+win+shift+left
|
previous_account = string(default="control+win+shift+left")
|
||||||
show_hide = control+win+w
|
show_hide = string(default="control+win+w")
|
||||||
post_tweet = control+win+n
|
post_tweet = string(default="control+win+n")
|
||||||
post_reply = control+win+r
|
post_reply = string(default="control+win+r")
|
||||||
post_retweet = control+win+shift+r
|
post_retweet = string(default="control+win+shift+r")
|
||||||
send_dm = control+win+d
|
send_dm = string(default="control+win+d")
|
||||||
add_to_favourites = alt+win+f
|
add_to_favourites = string(default="alt+win+f")
|
||||||
remove_from_favourites = alt+shift+win+f
|
remove_from_favourites = string(default="alt+shift+win+f")
|
||||||
follow = control+win+l
|
follow = string(default="control+win+l")
|
||||||
user_details = control+win+shift+;
|
user_details = string(default="control+win+shift+;")
|
||||||
view_item = control+win+v
|
view_item = string(default="control+win+v")
|
||||||
exit = control+win+f4
|
exit = string(default="control+win+f4")
|
||||||
open_timeline = control+win+i
|
open_timeline = string(default="control+win+i")
|
||||||
remove_buffer = "control+win+'"
|
remove_buffer = '''string(default="control+win+'")'''
|
||||||
interact = control+win+return
|
url = string(default="control+win+return")
|
||||||
volume_up = control+win+alt+up
|
audio = string(default="control+win+shift+return")
|
||||||
volume_down = control+win+alt+down
|
volume_up = string(default="control+win+alt+up")
|
||||||
go_home = control+win+home
|
volume_down = string(default="control+win+alt+down")
|
||||||
go_end = control+win+end
|
go_home = string(default="control+win+home")
|
||||||
go_page_up = control+win+pageup
|
go_end = string(default="control+win+end")
|
||||||
go_page_down = control+win+pagedown
|
go_page_up = string(default="control+win+pageup")
|
||||||
update_profile = control+win+shift+p
|
go_page_down = string(default="control+win+pagedown")
|
||||||
delete = control+win+delete
|
update_profile = string(default="control+win+shift+p")
|
||||||
clear_buffer = control+win+shift+delete
|
delete = string(default="control+win+delete")
|
||||||
repeat_item = control+win+space
|
clear_buffer = string(default="control+win+shift+delete")
|
||||||
copy_to_clipboard = control+win+shift+c
|
repeat_item = string(default="control+win+space")
|
||||||
add_to_list = control+win+alt+l
|
copy_to_clipboard = string(default="control+win+shift+c")
|
||||||
remove_from_list = control+win+alt+shift+l
|
add_to_list = string(default="control+win+alt+l")
|
||||||
toggle_buffer_mute = control+win+alt+m
|
remove_from_list = string(default="control+win+alt+shift+l")
|
||||||
toggle_session_mute = control+win+m
|
toggle_buffer_mute = string(default="control+win+alt+m")
|
||||||
search = control+win+/
|
toggle_session_mute = string(default="control+win+m")
|
||||||
edit_keystrokes = control+win+k
|
search = string(default="control+win+/")
|
||||||
view_user_lists = win+alt+shift+l
|
find = string(default="control+win+shift+/")
|
||||||
reverse_geocode = control+win+g
|
edit_keystrokes = string(default="control+win+k")
|
||||||
view_reverse_geocode = control+win+shift+g
|
view_user_lists = string(default="win+alt+shift+l")
|
||||||
get_trending_topics = control+win+shift+t
|
reverse_geocode = string(default="control+win+g")
|
||||||
|
view_reverse_geocode = string(default="control+win+shift+g")
|
||||||
|
get_trending_topics = string(default="control+win+shift+t")
|
||||||
|
51
src/keymaps/Windows 10.keymap
Normal file
51
src/keymaps/Windows 10.keymap
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
[info]
|
||||||
|
name = string(default="Windows 10")
|
||||||
|
desc = string(default="A keymap with remapped modifiers for Windows 10 compatibility.")
|
||||||
|
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||||
|
|
||||||
|
[keymap]
|
||||||
|
up = string(default="alt+win+up")
|
||||||
|
down = string(default="alt+win+down")
|
||||||
|
left = string(default="alt+win+left")
|
||||||
|
right = string(default="alt+win+right")
|
||||||
|
next_account = string(default="alt+win+shift+right")
|
||||||
|
previous_account = string(default="alt+win+shift+left")
|
||||||
|
open_conversation = string(default="alt+win+c")
|
||||||
|
show_hide = string(default="alt+win+w")
|
||||||
|
post_tweet = string(default="alt+win+n")
|
||||||
|
post_reply = string(default="control+win+r")
|
||||||
|
post_retweet = string(default="alt+win+shift+r")
|
||||||
|
send_dm = string(default="alt+win+d")
|
||||||
|
add_to_favourites = string(default="alt+win+f")
|
||||||
|
remove_from_favourites = string(default="alt+shift+win+f")
|
||||||
|
follow = string(default="alt+win+s")
|
||||||
|
user_details = string(default="alt+win+shift+n")
|
||||||
|
view_item = string(default="alt+win+v")
|
||||||
|
exit = string(default="alt+win+f4")
|
||||||
|
open_timeline = string(default="alt+win+i")
|
||||||
|
remove_buffer = string(default="alt+win+shift+i")
|
||||||
|
url = string(default="alt+win+return")
|
||||||
|
audio = string(default="alt+shift+win+return")
|
||||||
|
volume_up = string(default="alt+win+shift+up")
|
||||||
|
go_home = string(default="alt+win+home")
|
||||||
|
volume_down = string(default="alt+win+shift+down")
|
||||||
|
go_end = string(default="alt+win+end")
|
||||||
|
go_page_up = string(default="alt+win+pageup")
|
||||||
|
go_page_down = string(default="alt+win+pagedown")
|
||||||
|
update_profile = string(default="alt+win+p")
|
||||||
|
delete = string(default="alt+win+delete")
|
||||||
|
clear_buffer = string(default="alt+win+shift+delete")
|
||||||
|
repeat_item = string(default="alt+win+space")
|
||||||
|
copy_to_clipboard = string(default="alt+win+shift+c")
|
||||||
|
add_to_list = string(default="alt+win+a")
|
||||||
|
remove_from_list = string(default="alt+win+shift+a")
|
||||||
|
toggle_buffer_mute = string(default="alt+win+shift+m")
|
||||||
|
toggle_session_mute = string(default="alt+win+m")
|
||||||
|
toggle_autoread = string(default="alt+win+e")
|
||||||
|
search = string(default="alt+win+-")
|
||||||
|
edit_keystrokes = string(default="alt+win+k")
|
||||||
|
view_user_lists = string(default="alt+win+l")
|
||||||
|
get_more_items = string(default="alt+win+pageup")
|
||||||
|
reverse_geocode = string(default="alt+win+g")
|
||||||
|
view_reverse_geocode = string(default="alt+win+shift+g")
|
||||||
|
get_trending_topics = string(default="alt+win+t")
|
@@ -24,7 +24,7 @@ view_item = string(default="control+win+v")
|
|||||||
exit = string(default="control+win+f4")
|
exit = string(default="control+win+f4")
|
||||||
open_timeline = string(default="control+win+i")
|
open_timeline = string(default="control+win+i")
|
||||||
remove_buffer = string(default="control+win+shift+i")
|
remove_buffer = string(default="control+win+shift+i")
|
||||||
interact = string(default="control+win+return")
|
audio = string(default="control+win+return")
|
||||||
secondary_interact = string(default="control+win+alt+return")
|
secondary_interact = string(default="control+win+alt+return")
|
||||||
volume_up = string(default="control+win+alt+up")
|
volume_up = string(default="control+win+alt+up")
|
||||||
volume_down = string(default="control+win+alt+down")
|
volume_down = string(default="control+win+alt+down")
|
||||||
@@ -43,6 +43,7 @@ toggle_buffer_mute = string(default="control+win+shift+m")
|
|||||||
toggle_session_mute = string(default="alt+win+m")
|
toggle_session_mute = string(default="alt+win+m")
|
||||||
toggle_autoread = string(default="control+win+e")
|
toggle_autoread = string(default="control+win+e")
|
||||||
search = string(default="control+win+-")
|
search = string(default="control+win+-")
|
||||||
|
find = string(default="control+win+/")
|
||||||
edit_keystrokes = string(default="control+win+k")
|
edit_keystrokes = string(default="control+win+k")
|
||||||
view_user_lists = string(default="control+win+l")
|
view_user_lists = string(default="control+win+l")
|
||||||
get_more_items = string(default="alt+win+pageup")
|
get_more_items = string(default="alt+win+pageup")
|
||||||
|
@@ -1,52 +1,52 @@
|
|||||||
[info]
|
[info]
|
||||||
name = Default
|
name = string(default="Default")
|
||||||
desc = TWBlue's default keymap.
|
desc = string(default="TWBlue's default keymap.")
|
||||||
author = Bill Dengler <codeofdusk@gmail.com>
|
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||||
|
|
||||||
[keymap]
|
[keymap]
|
||||||
up = control+win+up
|
up = string(default="control+win+up")
|
||||||
down = control+win+down
|
down = string(default="control+win+down")
|
||||||
left = control+win+left
|
left = string(default="control+win+left")
|
||||||
right = control+win+right
|
right = string(default="control+win+right")
|
||||||
next_account = control+win+shift+right
|
next_account = string(default="control+win+shift+right")
|
||||||
previous_account = control+win+shift+left
|
previous_account = string(default="control+win+shift+left")
|
||||||
open_conversation = control+win+c
|
open_conversation = string(default="control+win+c")
|
||||||
show_hide = control+win+m
|
show_hide = string(default="control+win+m")
|
||||||
post_tweet = control+win+n
|
post_tweet = string(default="control+win+n")
|
||||||
post_reply = control+win+r
|
post_reply = string(default="control+win+r")
|
||||||
post_retweet = control+win+shift+r
|
post_retweet = string(default="control+win+shift+r")
|
||||||
send_dm = control+win+d
|
send_dm = string(default="control+win+d")
|
||||||
add_to_favourites = alt+win+f
|
add_to_favourites = string(default="alt+win+f")
|
||||||
remove_from_favourites = alt+shift+win+f
|
remove_from_favourites = string(default="alt+shift+win+f")
|
||||||
follow = control+win+s
|
follow = string(default="control+win+s")
|
||||||
user_details = control+win+alt+n
|
user_details = string(default="control+win+alt+n")
|
||||||
view_item = control+win+v
|
view_item = string(default="control+win+v")
|
||||||
exit = control+win+f4
|
exit = string(default="control+win+f4")
|
||||||
open_timeline = control+win+i
|
open_timeline = string(default="control+win+i")
|
||||||
remove_buffer = control+win+shift+i
|
remove_buffer = string(default="control+win+shift+i")
|
||||||
interact = control+alt+win+return
|
audio = string(default="control+alt+win+return")
|
||||||
url = control+win+return
|
url = string(default="control+win+return")
|
||||||
volume_up = control+win+alt+up
|
volume_up = string(default="control+win+alt+up")
|
||||||
volume_down = control+win+alt+down
|
volume_down = string(default="control+win+alt+down")
|
||||||
go_home = control+win+home
|
go_home = string(default="control+win+home")
|
||||||
go_end = control+win+end
|
go_end = string(default="control+win+end")
|
||||||
go_page_up = control+win+pageup
|
go_page_up = string(default="control+win+pageup")
|
||||||
go_page_down = control+win+pagedown
|
go_page_down = string(default="control+win+pagedown")
|
||||||
update_profile = alt+win+p
|
update_profile = string(default="alt+win+p")
|
||||||
delete = control+win+delete
|
delete = string(default="control+win+delete")
|
||||||
clear_buffer = control+win+shift+delete
|
clear_buffer = string(default="control+win+shift+delete")
|
||||||
repeat_item = control+win+space
|
repeat_item = string(default="control+win+space")
|
||||||
copy_to_clipboard = control+win+c
|
copy_to_clipboard = string(default="control+win+shift+c")
|
||||||
add_to_list = control+win+a
|
add_to_list = string(default="control+win+a")
|
||||||
remove_from_list = control+win+shift+a
|
remove_from_list = string(default="control+win+shift+a")
|
||||||
toggle_buffer_mute = control+win+shift+m
|
toggle_buffer_mute = string(default="control+win+shift+m")
|
||||||
toggle_session_mute = alt+win+m
|
toggle_session_mute = string(default="alt+win+m")
|
||||||
toggle_autoread = control+win+e
|
toggle_autoread = string(default="control+win+e")
|
||||||
search = control+win+-
|
search = string(default="control+win+-")
|
||||||
edit_keystrokes = control+win+k
|
edit_keystrokes = string(default="control+win+k")
|
||||||
view_user_lists = control+win+l
|
view_user_lists = string(default="control+win+l")
|
||||||
get_more_items = alt+win+pageup
|
get_more_items = string(default="alt+win+pageup")
|
||||||
reverse_geocode = control+win+g
|
reverse_geocode = string(default="control+win+g")
|
||||||
view_reverse_geocode = control+win+shift+g
|
view_reverse_geocode = string(default="control+win+shift+g")
|
||||||
get_trending_topics = control+win+t
|
get_trending_topics = string(default="control+win+t")
|
||||||
secondary_interact = control+win+alt+return
|
find = string(default="control+win+{")
|
||||||
|
Binary file not shown.
Binary file not shown.
@@ -20,7 +20,7 @@ actions = {
|
|||||||
"open_timeline": _(u"Open user timeline"),
|
"open_timeline": _(u"Open user timeline"),
|
||||||
"remove_buffer": _(u"Destroy buffer"),
|
"remove_buffer": _(u"Destroy buffer"),
|
||||||
"interact": _(u"Interact with the currently focused tweet."),
|
"interact": _(u"Interact with the currently focused tweet."),
|
||||||
"secondary_interact": _(u"Perform secondary interact action (open URL in browser if Codeofdusk's intelegent audio tweet handlers enabled, play audio if disabled."),
|
"url": _(u"Open URL"),
|
||||||
"volume_up": _(u"Increase volume by 5%"),
|
"volume_up": _(u"Increase volume by 5%"),
|
||||||
"volume_down": _(u"Decrease volume by 5%"),
|
"volume_down": _(u"Decrease volume by 5%"),
|
||||||
"go_home": _(u"Jump to the first element of a buffer"),
|
"go_home": _(u"Jump to the first element of a buffer"),
|
||||||
@@ -38,6 +38,7 @@ actions = {
|
|||||||
"toggle_session_mute": _(u"Mute/unmute the current session"),
|
"toggle_session_mute": _(u"Mute/unmute the current session"),
|
||||||
"toggle_autoread": _(u"toggle the automatic reading of incoming tweets in the active buffer"),
|
"toggle_autoread": _(u"toggle the automatic reading of incoming tweets in the active buffer"),
|
||||||
"search": _(u"Search on twitter"),
|
"search": _(u"Search on twitter"),
|
||||||
|
"find": _(u"Find a string in the currently focused buffer"),
|
||||||
"edit_keystrokes": _(u"Show the keystroke editor"),
|
"edit_keystrokes": _(u"Show the keystroke editor"),
|
||||||
"view_user_lists": _(u"Show lists for a specified user"),
|
"view_user_lists": _(u"Show lists for a specified user"),
|
||||||
"get_more_items": _(u"load previous items"),
|
"get_more_items": _(u"load previous items"),
|
||||||
|
@@ -3,6 +3,7 @@ import widgetUtils
|
|||||||
import config
|
import config
|
||||||
import wx_ui
|
import wx_ui
|
||||||
import constants
|
import constants
|
||||||
|
from pubsub import pub
|
||||||
|
|
||||||
class KeystrokeEditor(object):
|
class KeystrokeEditor(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -14,6 +15,7 @@ class KeystrokeEditor(object):
|
|||||||
self.hold_map = self.map.copy()
|
self.hold_map = self.map.copy()
|
||||||
self.dialog.put_keystrokes(constants.actions, self.map)
|
self.dialog.put_keystrokes(constants.actions, self.map)
|
||||||
widgetUtils.connect_event(self.dialog.edit, widgetUtils.BUTTON_PRESSED, self.edit_keystroke)
|
widgetUtils.connect_event(self.dialog.edit, widgetUtils.BUTTON_PRESSED, self.edit_keystroke)
|
||||||
|
widgetUtils.connect_event(self.dialog.execute, widgetUtils.BUTTON_PRESSED, self.execute_action)
|
||||||
self.dialog.get_response()
|
self.dialog.get_response()
|
||||||
|
|
||||||
def edit_keystroke(self, *args, **kwargs):
|
def edit_keystroke(self, *args, **kwargs):
|
||||||
@@ -23,10 +25,8 @@ class KeystrokeEditor(object):
|
|||||||
answer = edit_dialog.get_response()
|
answer = edit_dialog.get_response()
|
||||||
if answer == widgetUtils.OK:
|
if answer == widgetUtils.OK:
|
||||||
new_keystroke = self.get_edited_keystroke(edit_dialog)
|
new_keystroke = self.get_edited_keystroke(edit_dialog)
|
||||||
print new_keystroke
|
|
||||||
if new_keystroke != self.map[action]:
|
if new_keystroke != self.map[action]:
|
||||||
self.changed = True
|
self.changed = True
|
||||||
print "changed"
|
|
||||||
self.map[action] = new_keystroke
|
self.map[action] = new_keystroke
|
||||||
|
|
||||||
def set_keystroke(self, keystroke, dialog):
|
def set_keystroke(self, keystroke, dialog):
|
||||||
@@ -54,3 +54,7 @@ class KeystrokeEditor(object):
|
|||||||
wx_ui.no_key()
|
wx_ui.no_key()
|
||||||
return
|
return
|
||||||
return "+".join(keys)
|
return "+".join(keys)
|
||||||
|
|
||||||
|
def execute_action(self, *args, **kwargs):
|
||||||
|
action = self.dialog.actions[self.dialog.get_action()]
|
||||||
|
pub.sendMessage("execute-action", action=action)
|
@@ -13,18 +13,20 @@ class keystrokeEditorDialog(baseDialog.BaseWXDialog):
|
|||||||
self.keys = widgets.list(self, _(u"Action"), _(u"Keystroke"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(400, 450))
|
self.keys = widgets.list(self, _(u"Action"), _(u"Keystroke"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(400, 450))
|
||||||
self.keys.list.SetFocus()
|
self.keys.list.SetFocus()
|
||||||
firstSizer = wx.BoxSizer(wx.HORIZONTAL)
|
firstSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
firstSizer.Add(keysText)
|
firstSizer.Add(keysText, 0, wx.ALL, 5)
|
||||||
firstSizer.Add(self.keys.list)
|
firstSizer.Add(self.keys.list, 0, wx.ALL, 5)
|
||||||
self.edit = wx.Button(panel, -1, _(u"Edit"))
|
self.edit = wx.Button(panel, -1, _(u"Edit"))
|
||||||
self.edit.SetDefault()
|
self.edit.SetDefault()
|
||||||
|
self.execute = wx.Button(panel, -1, _(u"Execute action"))
|
||||||
close = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
close = wx.Button(panel, wx.ID_CANCEL, _(u"Close"))
|
||||||
secondSizer = wx.BoxSizer(wx.HORIZONTAL)
|
secondSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
secondSizer.Add(self.edit)
|
secondSizer.Add(self.edit, 0, wx.ALL, 5)
|
||||||
secondSizer.Add(close)
|
secondSizer.Add(self.execute, 0, wx.ALL, 5)
|
||||||
sizer.Add(firstSizer)
|
secondSizer.Add(close, 0, wx.ALL, 5)
|
||||||
sizer.Add(secondSizer)
|
sizer.Add(firstSizer, 0, wx.ALL, 5)
|
||||||
panel.SetSizerAndFit(sizer)
|
sizer.Add(secondSizer, 0, wx.ALL, 5)
|
||||||
|
panel.SetSizer(sizer)
|
||||||
|
self.SetClientSize(sizer.CalcMin())
|
||||||
|
|
||||||
def put_keystrokes(self, actions, keystrokes):
|
def put_keystrokes(self, actions, keystrokes):
|
||||||
for i in keystrokes:
|
for i in keystrokes:
|
||||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user