Thursday, August 30, 2007

Conclusiones (2007-08-28)

Motivación

El día 2007-08-28 celebramos una reunión David, Óscar y yo Miguel Ángel, con el objetivo de definir con mayor precisión el ámbito de la aplicación. Así mismo se pretendía comenzar la construcción de la aplicación.

Este texto recoge la mayor parte de las conclusiones de dicha reunión.

Ámbito
  • ¿Hasta qué punto es bueno casarse con GTK? ¿Existirá la posibilidad de utilizar otra librería gráfica en el futuro (QT, ncurses, ...), de manera que reutilice la mayor parte de la aplicación? Si dependemos de GTK, la aplicación será más rápida, pero si no lo hacemos, será más dinámica.
    La conclusión final es que no nos importa demasiado depender de GTK, ya que, al fin y al cabo, realmente no vamos a implementar ninguna otra interfaz.
  • Se utilizará un patrón modelo-vista-controlador. Las vistas serán componentes GTK que pueden cambiarse (árbol, lista, iconos, ...).
  • Por definición, la aplicación contendrá en todo momento dos paneles. Cada panel, un notebook y una línea que indique la URI actual, que sea editable y permita también el cambio de URI. Un cambio de URI puede provocar la destrucción del backend asociado a la página del notebook para cargar otro (ejemplo: estábamos en "/home" y pasamos a "smb://192.0.0.1"). Además, contendrá un log ocultable (que será un objeto que admite escribir partes de un texto - bien un treestore, bien un textarea - con formato).
  • Existirá una línea de órdenes global a ambos paneles, aunque siempre actuará sobre el panel activo.
  • Siempre existirá un panel activo y uno no activo. Sin embargo, esto no se puede tratar mediante el foco, ya que es probable que el foco pertenezca a la línea de órdenes anteriormente citada.
  • Un plugin puede contener una vista, un backend o bien una vista y un backend.
Operaciones del backends

En principio, se pueden dividir las operaciones realizables por el usuario en tres tipos:
  • Unarias: Siempre tendrán como origen y destino un único panel.
  • Binarias: Se requiere un panel de origen y uno de destino.
  • Externas: Requieren de un elemento externo a TwinPanel.
Operaciones unarias
  • Obtener lista de elementos que se pueden crear para un vector de URI determinadas. Si se solicita sin URI, se devolverá una lista de todos los objetos que el backend es capaz de crear. Si se proporciona más de una URI, el resultado serán los objetos creables en todos ellos.
    El resultado se ofrecerá de la forma: id, cadena (nombre a mostrar), tipo (indefinido, folder, leaf), id del icono.
  • Obtener lista de elementos para una URI.
  • Obtener identificación y versión del backend.
  • Eliminar lista de URIs.
  • Mover lista de tupla de URIs.
  • Obtener lista de acciones soportadas para una lista de URIs. Si no se proporciona la lista, se devolverán todas las acciones soportadas por cualquier elemento del backend.
    Existirán dos métodos: uno para las acciones más comunes (Abrir, borrar, copiar, pegar, ...) y otro para las propias del backend. La existencia de estos dos métodos queda justificada, ya que las acciones comunes serán una Hash, mientras que las acciones propias se devolverán en forma de lista.
  • Obtener un descriptor de fichero. Éste puede ser de lectura o de escritura.
Operaciones binarias
  • Copy. Se descompone en leer origen, escribir destino. Los permisos dependen de estas operaciones unarias.
  • Move. Se descompone en leer origen y borrar origen, escribir destino. Los permisos dependen de estas operaciones unarias.
  1. Se obtiene el descriptor de fichero de origen de solo lectura.
  2. Se obtiene el descriptor de fichero de destino de solo escritura.
  3. Se van copiando los datos del origen al destino.
Esta opción siempre estará disponible para todos los backends.

Como bien me recuerda Oscar, existe la posibilidad de que un backend sea capaz de crear otro y cargarlo internamente para realizar distintas opciones (como las arriba citadas del archivo zip).

Operaciones externas

En principio no nos interesan. Se trabajará con el clipboard.

Glosario
  • Panel: Cada uno de los lados de nuestra aplicación.
  • URI: Cadena de texto que permite volver a generar un acceso a un punto
    determinado de una estructura jerárquica de forma unívoca.
  • Backend: Objeto que permite tratar en última instancia un contenedor de
    la estructura jerárquica.

Saturday, August 11, 2007

What is Twin Panel?

Usually navigators like MS IExplorer, Nautilus or Konqueror have not all the capabilities we want. And they have only one panel to operate.

There are a lot of programs with two panels: FreeCommander, TotalCommander, ... But all of them have any problem: or they are very limited, or they are non-free.

Now we want to forget everything we have found in these navigators, and we want to wonder "what in the hell I really need". We want to use it as a Computer Engineering practice, by using so many patterns as possible in design.

The result... Well. It must be the very best of the navigators, the last project in the bin or something in the middle. We will see it in the future.

How can you help us? Easy:
  1. By using the betas and reporting the bugs.
  2. By speaking about it to your friends.
  3. By adding any plugin.
And that's all. Here you will find our Twin Panel, free like "freedom", and not like "free beer".

Thank you.

Obviedades

Pues como dice el título, este post va sobre asunciones de perogrullo, o no tanto... El objetivo es que todos tengamos claros cuales son los elementos y objetivo básico de Twin Panel (TP). Aprovecho también para definir un poco de nomenclatura para que podamos discutir detalles sin volvernos locos.

Paneles

El panel es el componente esencial de TP. En principio la aplicación está pensada para facilitar las clásicas operaciones con ficheros que involucran un origen y un destino, idea más que explotada en aplicaciones como Midnight Commander, Total commander y otros tantos. Por esa razón, TP presentará por defecto 2 paneles (de ahí su nombre) aunque nuestra idea es que sea lo suficientemente flexible para soportar 2 bloques de n paneles cada uno.

Arquitectura

TP consta de tres elementos principales, que encajan perfectamente en el clásico modelo de tres capas.
  • Backends (persistencia). Son clases especializadas en filesystems, entendiendo filesystem de una manera un tanto peculiar como se verá después. TP sólo incluirá de serie un backend para gestión de ficheros y directorios. Los demás se distribuirán como plugins.
  • Frontends (presentación). Son clases especializadas en representación. Cada panel está ocupado por únicamente por un frontend. El frontend básico es una lista con columnas. Aunque están desacoplados, lo habitual será que los plugins traigan frontends específicos; por ejemplo una vista de mapa para ver la topología de una red ofrecida por el backend correspondiente. A parte de los frontends que representan listas de elementos, también existen otros que representan preferencias y opciones de usuario, como por ejemplo los datos de conexión de un FTP.
  • Core (modelo). El core de la aplicación es el encargado de cargar frontends y backends y asegurar la consistencia. Por ejemplo puede cargar un frontend "lista" y otro "árbol" para renderizar el contenido de un mismo backend "ftp". El core también se encarga de realizar operaciones sobre los backends y entre ellos. Por ejemplo, copia de ficheros desde un backend "samba" a uno "ftp". También provee los mecanismos para determinar qué operaciones tienen sentido sobre cada backend.

Ámbito

O sea, ¿qué cosas se van a poder navegar con TP? En general cualquier cosa que esté estructurada como un árbol (un grafo es un árbol con "enlaces").

Siendo más específicos podemos distinguir dos tipos de elementos "listables":
  • Hojas: elementos terminales no manejables con TP a menos que exista un backend para ellos, por ejemplo un fichero .zip. Cuando un backend cargue un elemento "hoja" usando un backend ha de abrirse un nuevo panel. Es decir, no se pueden mezclar en el mismo panel elementos gestionados por diferentes backends.
  • Compuestos: son elementos que pueden contener elementos hoja y también elementos compuestos. El ejemplo evidente es un directorio.
Tanto las "hojas" como los "compuestos" pueden contener cualquier número de propiedades, pero, para un mismo backend, todos los elementos deben tener las mismas propiedades, aunque para algunos de ellos estén vacías (como una tabla en un base de datos). Cada propiedad tiene un nombre (de tipo cadena) y un valor que ha de ser un escalar (cadena, entero, flotante, fecha, permisos)

Y esto es todo por ahora. ¿comentarios?