Skip to content

Commit

Permalink
VENOM-302: Refactoring
Browse files Browse the repository at this point in the history
* Refactor FiletransferEntry and ConferenceInfoWidget to mvvm
  • Loading branch information
naxuroqa committed Apr 8, 2018
1 parent d38f32b commit 241c23a
Show file tree
Hide file tree
Showing 11 changed files with 267 additions and 100 deletions.
21 changes: 21 additions & 0 deletions src/core/FileTransfer.vala
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@
*/

namespace Venom {
public enum FileTransferState {
INIT,
PAUSED,
RUNNING,
ABORTED,
FINISHED
}

public interface FileTransfer : GLib.Object {
public signal void status_changed();
public signal void progress_changed();
Expand All @@ -30,6 +38,8 @@ namespace Venom {
public abstract uint64 get_file_size();
public abstract unowned uint8[] get_file_data();
public abstract void set_file_data(uint64 offset, uint8[] data);
public abstract FileTransferState get_state();
public abstract void set_state(FileTransferState state);
}

public class FileTransferImpl : FileTransfer, GLib.Object {
Expand All @@ -38,12 +48,14 @@ namespace Venom {
private ILogger logger;
private string description;
//private bool _is_avatar;
private FileTransferState state;

public FileTransferImpl.File(ILogger logger, uint64 file_size, string filename) {
this.logger = logger;
this.description = filename;
file_data = new uint8[file_size];
transmitted_size = 0;
state = FileTransferState.INIT;
//_is_avatar = false;
}

Expand All @@ -52,6 +64,7 @@ namespace Venom {
this.description = description;
file_data = new uint8[file_size];
transmitted_size = 0;
state = FileTransferState.INIT;
//_is_avatar = true;
}

Expand Down Expand Up @@ -89,5 +102,13 @@ namespace Venom {
public virtual unowned uint8[] get_file_data() {
return file_data;
}

public virtual FileTransferState get_state() {
return state;
}

public virtual void set_state(FileTransferState state) {
this.state = state;
}
}
}
6 changes: 4 additions & 2 deletions src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,11 @@ venom_source = files(
'tox/ToxSessionThread.vala',
'ui/AboutDialog.vala',
'ui/ApplicationWindow.vala',
'ui/ConferenceInfoWidget.vala',
'ui/ConferenceWindow.vala',
'ui/ContactListRequestEntry.vala',
'ui/ContactListWidget.vala',
'ui/ConversationWindow.vala',
'ui/CreateGroupchatWidget.vala',
'ui/FileTransferEntry.vala',
'ui/FileTransferWidget.vala',
'ui/FriendInfoWidget.vala',
'ui/FriendRequestWidget.vala',
Expand All @@ -78,10 +76,14 @@ venom_source = files(
'ui/UITools.vala',
'ui/WelcomeWidget.vala',
'view/AddContactWidget.vala',
'view/ConferenceInfoWidget.vala',
'view/ContactListEntry.vala',
'view/FileTransferEntry.vala',
'view/MessageWidget.vala',
'viewmodel/AddContactViewModel.vala',
'viewmodel/ConferenceInfoViewModel.vala',
'viewmodel/ContactListEntryViewModel.vala',
'viewmodel/FileTransferEntryViewModel.vala',
'viewmodel/MessageViewModel.vala'
)

Expand Down
24 changes: 23 additions & 1 deletion src/ui/conference_info_widget.ui
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.2 -->
<!-- Generated with glade 3.20.4 -->
<interface domain="venom">
<requires lib="gtk+" version="3.20"/>
<template class="VenomConferenceInfoWidget" parent="GtkBox">
Expand Down Expand Up @@ -126,6 +126,28 @@
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkRevealer" id="title_error_content">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="title_error">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">title_error</property>
<property name="xalign">0</property>
<attributes>
<attribute name="style" value="italic"/>
</attributes>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
Expand Down
23 changes: 22 additions & 1 deletion src/ui/file_transfer_entry.ui
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.3 -->
<!-- Generated with glade 3.20.4 -->
<interface domain="venom">
<requires lib="gtk+" version="3.20"/>
<template class="VenomFileTransferEntry" parent="GtkListBoxRow">
Expand Down Expand Up @@ -160,6 +160,27 @@
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="stop_transfer">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Start transfer</property>
<property name="valign">center</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">media-playback-stop-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<style>
<class name="linked"/>
</style>
Expand Down
19 changes: 7 additions & 12 deletions src/view/AddContactWidget.vala
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,11 @@
namespace Venom {
[GtkTemplate(ui = "/im/tox/venom/ui/add_contact_widget.ui")]
public class AddContactWidget : Gtk.Box {
[GtkChild]
private Gtk.Entry contact_id;
[GtkChild]
private Gtk.TextView contact_message;
[GtkChild]
private Gtk.Button send;
[GtkChild]
private Gtk.Label contact_id_error;
[GtkChild]
private Gtk.Revealer contact_id_error_content;
[GtkChild] private Gtk.Entry contact_id;
[GtkChild] private Gtk.TextView contact_message;
[GtkChild] private Gtk.Button send;
[GtkChild] private Gtk.Label contact_id_error;
[GtkChild] private Gtk.Revealer contact_id_error_content;

private ILogger logger;
private AddContactWidgetListener listener;
Expand All @@ -44,8 +39,8 @@ namespace Venom {

contact_id.bind_property("text", view_model, "contact-id", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
contact_message.buffer.bind_property("text", view_model, "contact-message", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
contact_id_error.bind_property("label", view_model, "contact-id-error-message", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
contact_id_error_content.bind_property("reveal-child", view_model, "contact-id-error-visible", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
view_model.bind_property("contact-id-error-message", contact_id_error, "label" , BindingFlags.SYNC_CREATE);
view_model.bind_property("contact-id-error-visible", contact_id_error_content, "reveal-child", BindingFlags.SYNC_CREATE);

contact_id.icon_release.connect(view_model.on_paste_clipboard);
send.clicked.connect(view_model.on_send);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* ConferenceInfoWidget.vala
*
* Copyright (C) 2018 Venom authors and contributors
* Copyright (C) 2018 Venom authors and contributors
*
* This file is part of Venom.
*
Expand All @@ -23,72 +23,46 @@ namespace Venom {
[GtkTemplate(ui = "/im/tox/venom/ui/conference_info_widget.ui")]
public class ConferenceInfoWidget : Gtk.Box {

[GtkChild]
private Gtk.Entry title;
[GtkChild]
private Gtk.ListBox peers;
[GtkChild]
private Gtk.Button apply;
[GtkChild]
private Gtk.Button leave;
[GtkChild] private Gtk.Entry title;
[GtkChild] private Gtk.ListBox peers;
[GtkChild] private Gtk.Button apply;
[GtkChild] private Gtk.Button leave;
[GtkChild] private Gtk.Revealer title_error_content;
[GtkChild] private Gtk.Label title_error;

private ILogger logger;
private GroupchatContact contact;
private ConferenceInfoViewModel view_model;
private unowned ApplicationWindow app_window;
private ConferenceInfoWidgetListener listener;

public ConferenceInfoWidget(ILogger logger, ApplicationWindow app_window, ConferenceInfoWidgetListener listener, IContact contact) {
logger.d("ConferenceInfoWidget created.");
this.logger = logger;
this.contact = contact as GroupchatContact;
this.app_window = app_window;
this.listener = listener;
this.view_model = new ConferenceInfoViewModel(logger, listener, contact as GroupchatContact);

set_info();
view_model.bind_property("title", title, "text", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
view_model.bind_property("title-error", title_error, "label", BindingFlags.SYNC_CREATE);
view_model.bind_property("title-error-visible", title_error_content, "reveal-child", BindingFlags.SYNC_CREATE);

apply.clicked.connect(on_apply_clicked);
leave.clicked.connect(on_leave_clicked);
}

private void set_info() {
title.text = contact.title;

var peers_list = contact.get_peers().get_values().copy();
var listmodel = new GenericListModel<GroupchatPeer>(peers_list);
peers.bind_model(listmodel, on_create_peer_widget);
peers.bind_model(view_model.get_list_model(), on_create_peer_widget);
unmap.connect(() => { peers.bind_model(null, null); });
}

private Gtk.Widget on_create_peer_widget(Object o) {
return new PeerEntry(logger, o as GroupchatPeer);
}
apply.clicked.connect(view_model.on_apply_clicked);
leave.clicked.connect(view_model.on_leave_clicked);

private void on_apply_clicked() {
logger.d("on_apply_clicked");
try {
listener.on_change_conference_title(contact, title.text);
} catch (Error e) {
logger.e("Could not change title: " + e.message);
}
view_model.leave_view.connect(leave_view);
}

private void on_leave_clicked() {
try {
listener.on_remove_conference(contact);
} catch (Error e) {
logger.e("Could not remove conference: " + e.message);
return;
}
private void leave_view() {
app_window.show_welcome();
}

private Gtk.Widget on_create_peer_widget(Object o) {
return new PeerEntry(logger, o as GroupchatPeer);
}

~ConferenceInfoWidget() {
logger.d("ConferenceInfoWidget destroyed.");
}
}

public interface ConferenceInfoWidgetListener : GLib.Object {
public abstract void on_remove_conference(IContact contact) throws Error;
public abstract void on_change_conference_title(IContact contact, string title) throws Error;
}
}
12 changes: 4 additions & 8 deletions src/view/ContactListEntry.vala
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,10 @@ namespace Venom {
private ILogger logger;
private ContactListEntryViewModel view_model;

[GtkChild]
private Gtk.Label contact_name;
[GtkChild]
private Gtk.Label contact_status;
[GtkChild]
private Gtk.Image contact_image;
[GtkChild]
private Gtk.Image status_image;
[GtkChild] private Gtk.Label contact_name;
[GtkChild] private Gtk.Label contact_status;
[GtkChild] private Gtk.Image contact_image;
[GtkChild] private Gtk.Image status_image;

public ContactListEntry(ILogger logger, IContact contact) {
logger.d("ContactListEntry created.");
Expand Down
24 changes: 9 additions & 15 deletions src/ui/FileTransferEntry.vala → src/view/FileTransferEntry.vala
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* FileTransferEntry.vala
*
* Copyright (C) 2018 Venom authors and contributors
* Copyright (C) 2018 Venom authors and contributors
*
* This file is part of Venom.
*
Expand All @@ -23,7 +23,7 @@ namespace Venom {
[GtkTemplate(ui = "/im/tox/venom/ui/file_transfer_entry.ui")]
public class FileTransferEntry : Gtk.ListBoxRow {
private ILogger logger;
private FileTransfer file_transfer;
private FileTransferEntryViewModel view_model;

[GtkChild] private Gtk.Label description;
[GtkChild] private Gtk.ProgressBar progress;
Expand All @@ -34,21 +34,15 @@ namespace Venom {

public FileTransferEntry(ILogger logger, FileTransfer file_transfer) {
logger.d("FileTransferEntry created.");
this.logger = logger;
this.file_transfer = file_transfer;
description.label = file_transfer.get_description();

update_progress();
file_transfer.progress_changed.connect(update_progress);
}

private void update_progress() {
logger.d("update_progress");
progress.fraction = file_transfer.get_transmitted_size() / ((double) file_transfer.get_file_size());
}
this.logger = logger;
this.view_model = new FileTransferEntryViewModel(logger, file_transfer);

public FileTransfer get_file_transfer() {
return file_transfer;
view_model.bind_property("description", description, "label", GLib.BindingFlags.SYNC_CREATE);
view_model.bind_property("progress", progress, "fraction", GLib.BindingFlags.SYNC_CREATE);
view_model.bind_property("open-visible", open_file, "sensitive", GLib.BindingFlags.SYNC_CREATE);
view_model.bind_property("resume-visible", resume_transfer, "sensitive", GLib.BindingFlags.SYNC_CREATE);
view_model.bind_property("pause-visible", pause_transfer, "sensitive", GLib.BindingFlags.SYNC_CREATE);
}

~FileTransferEntry() {
Expand Down
22 changes: 8 additions & 14 deletions src/view/MessageWidget.vala
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,14 @@
namespace Venom {
[GtkTemplate(ui = "/im/tox/venom/ui/message_widget.ui")]
public class MessageWidget : Gtk.ListBoxRow {
[GtkChild]
private Gtk.Label sender;
[GtkChild]
private Gtk.Image sender_image;
[GtkChild]
private Gtk.Label timestamp;
[GtkChild]
private Gtk.Label message;
[GtkChild]
private Gtk.Image sent;
[GtkChild]
private Gtk.Image received;
[GtkChild]
private Gtk.Box additional_info;

[GtkChild] private Gtk.Label sender;
[GtkChild] private Gtk.Image sender_image;
[GtkChild] private Gtk.Label timestamp;
[GtkChild] private Gtk.Label message;
[GtkChild] private Gtk.Image sent;
[GtkChild] private Gtk.Image received;
[GtkChild] private Gtk.Box additional_info;

private ILogger logger;
private MessageViewModel view_model;
Expand Down

0 comments on commit 241c23a

Please sign in to comment.