Передача информации между классами в ориентированном на поведение дизайне

Я решил адаптировать свой небольшой текстовый редактор к шаблону дизайна поведения, предложенному в предыдущем вопросе. Вскоре стало ясно, как дизайн поведения может помочь масштабировать мой маленький проект, позволяя добавлять комбинации клавиш для вызова открытия, сохранять действия и так далее.

Однако этот дизайн в основном использует классы, и я не уверен, как заставить классы общаться. Был добавлен новый класс для обработки сохранения текущего файла (SaveFile), но я не могу захватить URI текущего файла (который был взят с классом DocumentFileSelector).

Я подозреваю, что способ сделать это - через свойства класса, но я не могу заставить переменную document_selector наследовать это свойство, поэтому я могу передать его в класс SaveDocument.

Вот соответствующая часть кода:

uses
    Gtk

init
    Intl.setlocale()
    Gtk.init (ref args)

    var document = new Text( "Lorem Ipsum" )

    var header = new Header ( "My text editor" )
    var body = new DocumentView( document )
    var editor = new EditorWindow (header,body )

    var document_selector = new DocumentFileSelector( editor )
    var load_new_content_command = new Load( document, document_selector )
    var create_new = new CreateNew( document )
    var save_file = new SaveFile( document )

    header.add_item( new OpenButton( load_new_content_command ) )
    header.add_item( new CreateNewButton ( create_new ) )
    header.add_item( new SaveFileButton( save_file ))

    editor.show_all ()
    Gtk.main ()

class EditorWindow:Window

    construct( header:Header, body:DocumentView )
        this.window_position = WindowPosition.CENTER
        this.set_default_size( 400, 400 )
        this.destroy.connect( Gtk.main_quit)
        this.set_titlebar(header)
        var box  = new Box (Gtk.Orientation.VERTICAL, 1)
        box.pack_start(body, true, true, 0)
        this.add(box)

class Header:HeaderBar
    construct( title:string = "" )
        this.show_close_button = true
        this.set_title( title )

    def add_item( item:Widget )
        this.pack_start( item )

class SaveFileButton:ToolButton
    construct( command:Command )
        this.icon_widget = new Image.from_icon_name(
                                                 "document-save",
                                                 IconSize.SMALL_TOOLBAR
                                                 )
        this.clicked.connect( command.execute )

class OpenButton:ToolButton
    construct( command:Command )
        this.icon_widget = new Image.from_icon_name(
                                                 "document-open",
                                                 IconSize.SMALL_TOOLBAR
                                                 )
        this.clicked.connect( command.execute )

class CreateNewButton:ToolButton
    construct( command:Command )
        this.icon_widget = new Image.from_icon_name(
                                                 "document-new",
                                                 IconSize.SMALL_TOOLBAR
                                                 )
        this.clicked.connect( command.execute )

class DocumentView:ScrolledWindow
    construct( document:TextBuffer )
        var view = new TextView.with_buffer( document )
        view.set_wrap_mode( Gtk.WrapMode.WORD )
        this.add( view )

interface Command:Object
    def abstract execute()

interface DocumentSelector:Object
    def abstract select():bool
    def abstract get_document():string

class Text:TextBuffer
    construct ( initial:string = "" )
        this.text = initial

class SaveFile:Object implements Command

    _receiver:TextBuffer

    construct( receiver:TextBuffer )
        _receiver = receiver

    def execute()
        start, end : Gtk.TextIter
        _receiver.get_start_iter(out start)
        _receiver.get_end_iter(out end)
        try
            FileUtils.set_contents (_filename, _receiver.get_text(start, end,
            false))
        except ex : FileError
            print "%s\n", ex.message


class DocumentFileSelector:Object implements DocumentSelector

    _parent:Window
    _uri:string = ""

    construct( parent:Window )
        _parent = parent

    def select():bool
        var dialog = new FileChooserDialog( "Open file",
                                            _parent,
                                            FileChooserAction.OPEN,
                                            dgettext( "gtk30", "_OK"),
                                            ResponseType.ACCEPT,
                                            dgettext( "gtk30", "_Cancel" ),
                                            ResponseType.CANCEL
                                           )

        selected:bool = false
        var response = dialog.run()
        case response
            when ResponseType.ACCEPT
                _uri = dialog.get_uri()
                selected = true

        dialog.destroy()
        return selected

    def get_document():string
        return "Reading the text from a URI is not implemented\n%s".printf(_uri)

class Load:Object implements Command

    _receiver:TextBuffer
    _document_selector:DocumentSelector

    construct( receiver:TextBuffer, document_selector:DocumentSelector )
        _receiver = receiver
        _document_selector = document_selector

    def execute()
        if _document_selector.select()
            _receiver.text = _document_selector.get_document()


class CreateNew:Object implements Command

    _receiver:TextBuffer

    construct( receiver:TextBuffer )
        _receiver = receiver

    def execute()
        var should_I_save=new MessageDialog (null, Gtk.DialogFlags.MODAL,
        Gtk.MessageType.INFO, Gtk.ButtonsType.YES_NO, "Hello world!")
        should_I_save.format_secondary_text (
        "This will delete the contets. Are you sure?")

        case should_I_save.run()
            when ResponseType.YES
                _receiver.set_text("")
                should_I_save.destroy ()
            when ResponseType.NO
                should_I_save.destroy ()

Вопрос

  • Как передать информацию URI из последнего открытого файла в класс SaveDocument?

    • В качестве дополнительного вопроса, что делает первая строка после конструкции каждого класса? Строки, которые читаются как:

      конструкция (родитель: окно)

          _parent = parent
      

редактировать

Я все еще не мог решить проблему, но недавно я попытался создать еще один метод внутри класса DocumentFileSelector с именем whichFile(). Этот метод будет возвращать только URI. Я получаю ошибку при исполнении: FileUtils.set_contents ( DocumentFileSelector.whichFile(), _receiver.get_text(start, end,false)),

И вот модификации кода:

class SaveFile:Object implements Command

    _receiver:TextBuffer

    construct( receiver:TextBuffer )
        _receiver = receiver

    def execute()
        start, end : Gtk.TextIter
        _receiver.get_start_iter(out start)
        _receiver.get_end_iter(out end)
        try
            FileUtils.set_contents ( DocumentFileSelector.whichFile(), _receiver.get_text(start, end,false))
        except ex : FileError
            print "%s\n", ex.message


class DocumentFileSelector:Object implements DocumentSelector

    _parent:Window
    _uri:string = ""

    construct( parent:Window )
        _parent = parent

    def select():bool
        var dialog = new FileChooserDialog( "Open file",
                                            _parent,
                                            FileChooserAction.OPEN,
                                            dgettext( "gtk30", "_OK"),
                                            ResponseType.ACCEPT,
                                            dgettext( "gtk30", "_Cancel" ),
                                            ResponseType.CANCEL
                                           )

        selected:bool = false
        var response = dialog.run()
        case response
            when ResponseType.ACCEPT
                _uri = dialog.get_uri()
                selected = true

        dialog.destroy()
        return selected

    def whichFile():string
        return _uri

    def get_document():string
        return "Reading the text from a URI is not implemented\n%s".printf(_uri)

1 ответ

Решение

Ты почти там...

Просто добавьте ссылку на DocumentSelector на ваш SaveFile команда, как вы сделали для LoadFile команда:

class SaveFile:Object implements Command
    _receiver:TextBuffer
    _document_selector:DocumentSelector

    construct( receiver:TextBuffer, document_selector:DocumentSelector)
        _receiver = receiver
        _document_selector = document_selector

Затем вы можете вызвать свой новый whichFile() метод на сохраненный DocumentSelector:

def execute()
    start, end : Gtk.TextIter
    _receiver.get_start_iter(out start)
    _receiver.get_end_iter(out end)
    try
        FileUtils.set_contents (_document_selector.whichFile(), _receiver.get_text(start, end,
        false))
    except ex : FileError
        print "%s\n", ex.message
Другие вопросы по тегам