ComicReader X – Parte 2. A estrutura da solução

O ComicReader X é dividido em 3 assemblies:

 

  • ComicReaderX.Reader
  • ComicReaderX.Manager
  • ComicReaderX.Viewer

ComicReaderX.Reader

Este assembly contém as classes que representam resumidamente uma história em quadrinhos e também contém a engine de abertura dos arquivos CBR.

Nesse diagrama de classes vemos que um ComicBook (História em quadrinho) possui uma propriedade Cover (capa). Ele também é aberto a partir de um arquivo, por isso armazenamos também o do nome do arquivo de onde é oriundo, na propriedade Filename. Um ComicBook também possui páginas (Pages) que são extraídas e lidas em um diretório próprio (ReadingFolder).

A classe Page representa as páginas desse ComicBook. Cada Page possui um nome de arquivo, porque lembram que eu disse que cada página é digitalizada? Possui também um número e uma versão reduzida dessa página, uma miniatura (Thumb).

Observe que ambas as classes herdam de BindableObject. A classe BindableObject retirei do projeto Podder, seu criador o Josh Smith (esse é mestre em WPF), liberou seu uso.

Um dos recursos mais impressionantes no WPF, bem, não só no WPF mas no .NET em si é poder ligar, dar um “bind”, um controle a uma classe muito facilmente. Infelizmente quem trabalha com o Delphi e trabalha com OO sabe que isso poderia nos ajudar muito.

Porém para que esse Bind seja feito corretamente as classes que serão ligadas devem implementar a interface INotifyPropertyChanged. É ela que notifica o mecanismo de Binding sobre mudanças ocorridas nas propriedades das classes. Não entrar agora nos detalhes de binding, isso vai ficar mais pra frente, porém que entendam a importância dessa Interface. Ao utilizá-la estamos preparando nossas classes para serem apresentadas em uma interface de usuário.

Abaixo vemos a classe Page.

   1:  namespace ComicReaderX.Reader
   2:  {
   3:      public class Page: BindableObject
   4:      {
   5:          private string _fileName = string.Empty;
   6:          public string FileName
   7:          {
   8:              get { return _fileName; }
   9:              set
  10:              {
  11:                  if (_fileName == value)
  12:                      return;
  13:   
  14:                  _fileName = value;
  15:                  base.RaisePropertyChanged("FileName");
  16:              }
  17:          }
  18:   
  19:          private string _thumb = string.Empty;
  20:          public string Thumb
  21:          {
  22:              get { return _thumb; }
  23:              set
  24:              {
  25:                  if (_thumb == value)
  26:                      return;
  27:                  _thumb = value;
  28:                  base.RaisePropertyChanged("Thumb");
  29:              }
  30:          }
  31:   
  32:          private int _number = 0;
  33:          public int Number
  34:          {
  35:              get { return _number;}
  36:              set
  37:              {
  38:                  if (_number == value)
  39:                      return;
  40:   
  41:                  _number = value;
  42:                  base.RaisePropertyChanged("Number");
  43:              }
  44:          }
  45:   
  46:          public override string ToString()
  47:          {
  48:              return Number.ToString();
  49:          }
  50:      }
  51:  }

Veja que a cada Set ocorrido o método RaisePropertyChanged é disparado. O mesmo acontece na classe ComicBook

   1:  using System.Collections.ObjectModel;
   2:   
   3:  namespace ComicReaderX.Reader
   4:  {
   5:      public class ComicBook: BindableObject
   6:      {
   7:          
   8:          public ComicBook()
   9:          {
  10:              _filename = string.Empty;
  11:              _pages = new ObservableCollection<Page>();
  12:           }
  13:          private string _cover;
  14:   
  15:          public string Cover
  16:          {
  17:              get { return _cover; }
  18:              set
  19:              {
  20:                  if (_cover == value)
  21:                      return;
  22:                  _cover = value;
  23:                  base.RaisePropertyChanged("Cover");
  24:              }
  25:          }
  26:   
  27:          private string _filename;
  28:   
  29:          public string Filename
  30:          {
  31:              get { return _filename; }
  32:              set
  33:              {
  34:                  if (_filename == value)
  35:                      return;
  36:                  _filename = value;
  37:                  base.RaisePropertyChanged("Filename");
  38:              }
  39:          }
  40:   
  41:          private string _readingFolder;
  42:          
  43:          public string ReadingFolder
  44:          {
  45:              get { return _readingFolder; }
  46:              set
  47:              {
  48:                  if (_readingFolder == value)
  49:                      return;
  50:                  _readingFolder = value;
  51:                  base.RaisePropertyChanged("ReadingFolder");
  52:              }
  53:           
  54:          }
  55:              
  56:   
  57:          private ObservableCollection<Page> _pages;
  58:   
  59:          public ObservableCollection<Page> Pages
  60:          {
  61:              get { return _pages; }
  62:              set { _pages = value; }
  63:          }
  64:   
  65:      }
  66:  }

Na classe ComicBook temos um tipo especial que deve ser mencionado também aqui. Veja que a propriedade Pages é do tipo ObservableCollection. Em suma esse tipo já prepara uma coleção de objetos para ser exibida em um ListView, ListBox ou TreeView. Internamente ela implementa as interfaces INotifyCollectionChanged e INotifyPropertyChanged, que como já mencionado são utilizadas pelo mecanismo de Data Binding. No caso específico de ObservableCollection, qualquer inclusão, remoção ou atualização geral dos itens que ela possui é notificada.

Como vocês podem ver essa é só uma ponto do iceberg de recursos que o .NET nos oferece. Continue ligado.

Esse post foi publicado em ComicReader X. Bookmark o link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s