"No accounts active, add?" stack in main view

This commit is contained in:
fiaxh 2017-03-17 23:21:23 +01:00
parent b65c71412b
commit 582cc78edd
6 changed files with 129 additions and 221 deletions

View file

@ -8,6 +8,7 @@ namespace Dino {
public class StreamInteractor { public class StreamInteractor {
public signal void account_added(Account account); public signal void account_added(Account account);
public signal void account_removed(Account account);
public signal void stream_negotiated(Account account); public signal void stream_negotiated(Account account);
public ModuleManager module_manager; public ModuleManager module_manager;
@ -29,6 +30,7 @@ public class StreamInteractor {
public void disconnect(Account account) { public void disconnect(Account account) {
connection_manager.disconnect(account); connection_manager.disconnect(account);
account_removed(account);
} }
public ArrayList<Account> get_accounts() { public ArrayList<Account> get_accounts() {

View file

@ -46,7 +46,7 @@ set(RESOURCE_LIST
occupant_list.ui occupant_list.ui
occupant_list_item.ui occupant_list_item.ui
settings_dialog.ui settings_dialog.ui
unified_window.ui unified_window_placeholder.ui
) )
compile_gresources( compile_gresources(

View file

@ -1,177 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="DinoUiWindow">
<property name="default-width">1200</property>
<property name="default-height">700</property>
<child type="titlebar">
<object class="GtkPaned">
<property name="position" bind-source="main_paned" bind-property="position" bind-flags="bidirectional|sync-create"/>
<property name="visible">True</property>
<style>
<class name="header_bar"/>
</style>
<child>
<object class="GtkHeaderBar" id="left_toolbar">
<property name="hexpand">False</property>
<property name="visible">True</property>
<style>
<class name="left_toolbar"/>
</style>
<child>
<object class="GtkMenuButton" id="add_button">
<property name="visible">True</property>
<style>
<class name="image-button"/>
</style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon-name">list-add-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">False</property>
</packing>
</child>
<child>
<object class="GtkHeaderBar" id="right_toolbar">
<property name="title"></property>
<property name="hexpand">True</property>
<property name="show_close_button">True</property>
<property name="visible">True</property>
<style>
<class name="right_toolbar"/>
</style>
<child>
<object class="GtkMenuButton" id="menu_button">
<property name="visible">True</property>
<style>
<class name="image-button"/>
</style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon-name">open-menu-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="pack_type">end</property>
</packing>
</child>
<child>
<object class="GtkMenuButton" id="encryption_button">
<property name="visible">True</property>
<style>
<class name="image-button"/>
</style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="pack_type">end</property>
</packing>
</child>
<child>
<object class="GtkMenuButton" id="groupchat_button">
<property name="visible">True</property>
<style>
<class name="image-button"/>
</style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon-name">system-users-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
<packing>
<property name="pack_type">end</property>
</packing>
</child>
</object>
<packing>
<property name="resize">True</property>
<property name="shrink">False</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkPaned" id="main_paned">
<property name="orientation">horizontal</property>
<property name="visible">True</property>
<child>
<object class="DinoUiRosterWrapper" id="roster_wrapper">
<style>
<class name="roster_wrapper"/>
</style>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">False</property>
</packing>
</child>
<child>
<object class="GtkFrame">
<property name="shadow-type">GTK_SHADOW_NONE</property>
<property name="visible">True</property>
<style>
<class name="some_frame"/>
</style>
<child>
<object class="GtkGrid">
<property name="orientation">vertical</property>
<property name="expand">True</property>
<property name="visible">True</property>
<style>
<class name="conversation_grid"/>
</style>
<child>
<object class="GtkScrolledWindow" id="conversation_frame_scrolled">
<property name="visible">True</property>
<style>
<class name="scrolled_window"/>
</style>
<child>
<object class="DinoUiConversationFrame" id="conversation_frame">
<property name="shadow-type">GTK_SHADOW_NONE</property>
<property name="expand">True</property>
<property name="visible">True</property>
<style>
<class name="conversation_frame"/>
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparator" />
</child>
<child>
<object class="DinoUiChatInput" id="chat_input">
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="resize">True</property>
<property name="shrink">False</property>
</packing>
</child>
</object>
</child>
</template>
</interface>

View file

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="DinoUiUnifiedWindowPlaceholder">
<property name="valign">center</property>
<property name="visible">True</property>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="spacing">10</property>
<property name="valign">center</property>
<property name="halign">center</property>
<property name="hexpand">True</property>
<property name="visible">True</property>
<child>
<object class="GtkImage">
<property name="icon-name">dino-symbolic</property>
<property name="pixel-size">144</property>
<property name="margin">30</property>
<property name="visible">True</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">No accounts active</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="visible">True</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
<child>
<object class="GtkButton" id="no_accounts_add">
<property name="label">Manage accounts</property>
<property name="halign">center</property>
<property name="visible">True</property>
<style>
<class name="text-button"/>
<class name="suggested-action"/>
</style>
</object>
</child>
</object>
</child>
</template>
</interface>

View file

@ -5,11 +5,7 @@ using Dino.Ui;
public class Dino.Ui.Application : Dino.Application { public class Dino.Ui.Application : Dino.Application {
private Notifications notifications; private Notifications notifications;
private UnifiedWindow? window; private UnifiedWindow window;
private ConversationSelector.View? filterable_conversation_list;
private ConversationSelector.List? conversation_list;
private ConversationSummary.View? conversation_frame;
private ChatInput? chat_input;
public Application() throws Error { public Application() throws Error {
Notify.init("dino"); Notify.init("dino");
@ -21,20 +17,11 @@ public class Dino.Ui.Application : Dino.Application {
public override void activate() { public override void activate() {
create_set_app_menu(); create_set_app_menu();
create_window(); window = new UnifiedWindow(this, stream_interaction);
window.show_all(); window.show_all();
restore(); restore();
} }
private void create_window() {
window = new UnifiedWindow(this, stream_interaction);
filterable_conversation_list = window.filterable_conversation_list;
conversation_list = window.filterable_conversation_list.conversation_list;
conversation_frame = window.conversation_frame;
chat_input = window.chat_input;
}
private void show_accounts_window() { private void show_accounts_window() {
ManageAccounts.Dialog dialog = new ManageAccounts.Dialog(stream_interaction, db); ManageAccounts.Dialog dialog = new ManageAccounts.Dialog(stream_interaction, db);
dialog.set_transient_for(window); dialog.set_transient_for(window);

View file

@ -1,3 +1,4 @@
using Gee;
using Gtk; using Gtk;
using Dino.Entities; using Dino.Entities;
@ -5,55 +6,95 @@ using Dino.Entities;
namespace Dino.Ui { namespace Dino.Ui {
public class UnifiedWindow : Window { public class UnifiedWindow : Window {
public ChatInput chat_input;
public ConversationListTitlebar conversation_list_titlebar; private UnifiedWindowPlaceholder main_placeholder = new UnifiedWindowPlaceholder();
public ConversationSelector.View filterable_conversation_list; private ChatInput chat_input;
public ConversationSummary.View conversation_frame; private ConversationListTitlebar conversation_list_titlebar;
public ConversationTitlebar conversation_titlebar; private ConversationSelector.View filterable_conversation_list;
public Paned paned; private ConversationSummary.View conversation_frame;
private ConversationTitlebar conversation_titlebar;
private Paned headerbar_paned = new Paned(Orientation.HORIZONTAL);
private Paned paned = new Paned(Orientation.HORIZONTAL);
private Stack headerbar_stack = new Stack();
private Stack stack = new Stack();
private StreamInteractor stream_interactor; private StreamInteractor stream_interactor;
private Conversation? conversation; private Conversation? conversation;
public UnifiedWindow(Application application, StreamInteractor stream_interactor) { public UnifiedWindow(Application application, StreamInteractor stream_interactor) {
Object(application : application); Object(application : application, default_width : 1200, default_height : 700);
this.stream_interactor = stream_interactor; this.stream_interactor = stream_interactor;
setup_headerbar();
setup_unified();
setup_stacks();
conversation_list_titlebar.search_button.bind_property("active", filterable_conversation_list.search_bar, "search-mode-enabled",
BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
paned.bind_property("position", headerbar_paned, "position", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
focus_in_event.connect(on_focus_in_event); focus_in_event.connect(on_focus_in_event);
focus_out_event.connect(on_focus_out_event); focus_out_event.connect(on_focus_out_event);
default_width = 1200; stream_interactor.account_added.connect((account) => { check_stack(true); });
default_height = 700; stream_interactor.account_removed.connect((account) => { check_stack(); });
main_placeholder.no_accounts_add.clicked.connect(() => { get_application().activate_action("accounts", null); });
filterable_conversation_list.conversation_list.conversation_selected.connect(on_conversation_selected);
conversation_list_titlebar.conversation_opened.connect(on_conversation_selected);
check_stack();
}
private void setup_unified() {
chat_input = new ChatInput(stream_interactor); chat_input = new ChatInput(stream_interactor);
conversation_frame = new ConversationSummary.View(stream_interactor); conversation_frame = new ConversationSummary.View(stream_interactor);
conversation_titlebar = new ConversationTitlebar(stream_interactor);
paned = new Paned(Orientation.HORIZONTAL);
paned.set_position(300);
filterable_conversation_list = new ConversationSelector.View(stream_interactor); filterable_conversation_list = new ConversationSelector.View(stream_interactor);
conversation_list_titlebar = new ConversationListTitlebar(this, stream_interactor);
conversation_list_titlebar.search_button.bind_property("active", filterable_conversation_list.search_bar, "search-mode-enabled",
BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
Grid grid = new Grid();
grid.orientation = Orientation.VERTICAL;
Paned toolbar_paned = new Paned(Orientation.HORIZONTAL);
add(paned);
paned.add1(filterable_conversation_list);
paned.add2(grid);
Grid grid = new Grid() { orientation=Orientation.VERTICAL };
grid.add(conversation_frame); grid.add(conversation_frame);
grid.add(new Separator(Orientation.HORIZONTAL)); grid.add(new Separator(Orientation.HORIZONTAL));
grid.add(chat_input); grid.add(chat_input);
paned.set_position(300);
paned.add1(filterable_conversation_list);
paned.add2(grid);
conversation_frame.show_all(); conversation_frame.show_all();
}
toolbar_paned.add1(conversation_list_titlebar); private void setup_headerbar() {
toolbar_paned.add2(conversation_titlebar); conversation_titlebar = new ConversationTitlebar(stream_interactor);
paned.bind_property("position", toolbar_paned, "position", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL); conversation_list_titlebar = new ConversationListTitlebar(this, stream_interactor);
set_titlebar(toolbar_paned); headerbar_paned.add1(conversation_list_titlebar);
headerbar_paned.add2(conversation_titlebar);
}
filterable_conversation_list.conversation_list.conversation_selected.connect(on_conversation_selected); private void setup_stacks() {
conversation_list_titlebar.conversation_opened.connect(on_conversation_selected); stack.add_named(paned, "main");
stack.add_named(main_placeholder, "placeholder");
add(stack);
headerbar_stack.add_named(headerbar_paned, "main");
headerbar_stack.add_named(new HeaderBar() { title="Dino", show_close_button=true, visible=true}, "placeholder");
set_titlebar(headerbar_stack);
}
private void check_stack(bool know_exists = false) {
ArrayList<Account> accounts = stream_interactor.get_accounts();
bool exists_active = know_exists;
foreach (Account account in accounts) {
if (account.enabled) {
exists_active = true;
break;
}
}
if (exists_active) {
stack.set_visible_child_name("main");
headerbar_stack.set_visible_child_name("main");
} else {
stack.set_visible_child_name("placeholder");
headerbar_stack.set_visible_child_name("placeholder");
}
} }
private void on_conversation_selected(Conversation conversation) { private void on_conversation_selected(Conversation conversation) {
@ -78,4 +119,9 @@ public class UnifiedWindow : Window {
} }
} }
[GtkTemplate (ui = "/org/dino-im/unified_window_placeholder.ui")]
public class UnifiedWindowPlaceholder : Box {
[GtkChild] public Button no_accounts_add;
}
} }