aboutsummaryrefslogtreecommitdiffstats
path: root/community/dino/mobile-ui.patch
diff options
context:
space:
mode:
Diffstat (limited to 'community/dino/mobile-ui.patch')
-rw-r--r--community/dino/mobile-ui.patch285
1 files changed, 285 insertions, 0 deletions
diff --git a/community/dino/mobile-ui.patch b/community/dino/mobile-ui.patch
new file mode 100644
index 00000000000..562142935e1
--- /dev/null
+++ b/community/dino/mobile-ui.patch
@@ -0,0 +1,285 @@
+diff --git a/cmake/FindHandy.cmake b/cmake/FindHandy.cmake
+new file mode 100644
+index 0000000..73206a2
+--- /dev/null
++++ b/cmake/FindHandy.cmake
+@@ -0,0 +1,11 @@
++include(PkgConfigWithFallback)
++find_pkg_config_with_fallback(Handy
++ PKG_CONFIG_NAME libhandy-0.0
++ LIB_NAMES libhandy-0.0
++ INCLUDE_NAMES handy.h
++ )
++
++include(FindPackageHandleStandardArgs)
++find_package_handle_standard_args(Handy
++ REQUIRED_VARS Handy_LIBRARY
++ VERSION_VAR Handy_VERSION)
+diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt
+index c70539f..8540610 100644
+--- a/main/CMakeLists.txt
++++ b/main/CMakeLists.txt
+@@ -10,6 +10,7 @@ find_packages(MAIN_PACKAGES REQUIRED
+ GObject
+ GTK3
+ ICU
++ Handy
+ )
+
+ set(RESOURCE_LIST
+@@ -186,7 +187,7 @@ OPTIONS
+ ${MAIN_EXTRA_OPTIONS}
+ )
+
+-add_definitions(${VALA_CFLAGS} -DGETTEXT_PACKAGE=\"${GETTEXT_PACKAGE}\" -DLOCALE_INSTALL_DIR=\"${LOCALE_INSTALL_DIR}\" -DDINO_VERSION=\"${PROJECT_VERSION}\")
++add_definitions(${VALA_CFLAGS} -DGETTEXT_PACKAGE=\"${GETTEXT_PACKAGE}\" -DLOCALE_INSTALL_DIR=\"${LOCALE_INSTALL_DIR}\" -DDINO_VERSION=\"${PROJECT_VERSION}\" -DHANDY_USE_UNSTABLE_API=yes)
+ add_executable(dino ${MAIN_VALA_C} ${MAIN_GRESOURCES_TARGET} src/emojichooser.c)
+ add_dependencies(dino ${GETTEXT_PACKAGE}-translations)
+ target_include_directories(dino PRIVATE src)
+diff --git a/main/data/unified_main_content.ui b/main/data/unified_main_content.ui
+index 03c206c..d96a7b1 100644
+--- a/main/data/unified_main_content.ui
++++ b/main/data/unified_main_content.ui
+@@ -1,12 +1,15 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <interface>
+- <object class="GtkPaned" id="paned">
+- <property name="position">300</property>
++ <object class="HdyLeaflet" id="paned">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
++ <property name="can_focus">False</property>
++ <property name="mode-transition-type">slide</property>
++ <property name="child-transition-type">slide</property>
+ <child>
+ <object class="GtkStack" id="left_stack">
+ <property name="visible">True</property>
++ <property name="hexpand">False</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolled">
+ <property name="expand">True</property>
+@@ -29,6 +32,7 @@
+ <property name="valign">start</property>
+ <property name="halign">start</property>
+ <property name="visible">True</property>
++ <property name="width_request">260</property>
+ <child>
+ <object class="GtkImage" id="conversation_list_placeholder_image">
+ <property name="visible">True</property>
+@@ -44,7 +48,9 @@
+ <property name="margin-top">70</property>
+ <property name="margin-right">50</property>
+ <property name="visible">True</property>
++ <property name="xalign">0</property>
+ <property name="valign">end</property>
++ <property name="max-width-chars">0</property>
+ <property name="label" translatable="yes">Click here to start a conversation or join a channel.</property>
+ <style>
+ <class name="dim-label"/>
+@@ -58,8 +64,7 @@
+ </child>
+ </object>
+ <packing>
+- <property name="resize">False</property>
+- <property name="shrink">False</property>
++ <property name="name">list-pane</property>
+ </packing>
+ </child>
+ <child>
+@@ -139,8 +144,7 @@
+ </child>
+ </object>
+ <packing>
+- <property name="resize">True</property>
+- <property name="shrink">False</property>
++ <property name="name">view-pane</property>
+ </packing>
+ </child>
+ </object>
+diff --git a/main/src/ui/conversation_titlebar/conversation_titlebar.vala b/main/src/ui/conversation_titlebar/conversation_titlebar.vala
+index 1302bdf..749ba10 100644
+--- a/main/src/ui/conversation_titlebar/conversation_titlebar.vala
++++ b/main/src/ui/conversation_titlebar/conversation_titlebar.vala
+@@ -65,11 +65,23 @@ public class ConversationTitlebarCsd : ConversationTitlebar, Gtk.HeaderBar {
+
+ public new string? title { get { return this.get_title(); } set { base.set_title(value); } }
+ public new string? subtitle { get { return this.get_subtitle(); } set { base.set_subtitle(value); } }
++ private Revealer back_revealer;
++ public bool back_button {
++ get { return back_revealer.reveal_child; }
++ set { back_revealer.reveal_child = value; }
++ }
++ public signal void back_pressed();
+
+ public ConversationTitlebarCsd() {
+ this.get_style_context().add_class("dino-right");
+ show_close_button = true;
+ hexpand = true;
++ back_revealer = new Revealer() { visible = true, transition_type = RevealerTransitionType.SLIDE_RIGHT, transition_duration = 200, can_focus = false, reveal_child = false };
++ Button back_button = new Button.from_icon_name("go-previous-symbolic") { visible = true, valign = Align.CENTER, use_underline = true };
++ back_button.get_style_context().add_class("image-button");
++ back_button.clicked.connect(() => back_pressed());
++ back_revealer.add(back_button);
++ this.pack_start(back_revealer);
+ }
+
+ public void insert_entry(Plugins.ConversationTitlebarEntry entry) {
+@@ -77,6 +89,16 @@ public class ConversationTitlebarCsd : ConversationTitlebar, Gtk.HeaderBar {
+ Button gtk_widget = (Gtk.Button)widget;
+ this.pack_end(gtk_widget);
+ }
++
++ /*
++ * HdyLeaflet collapses based on natural_width, but labels set natural_width to the width required to have the full
++ * text in a single line, thus if the label gets longer, HdyLeaflet would collapse. Work around is to just use the
++ * minimum_width as natural_width.
++ */
++ public override void get_preferred_width(out int minimum_width, out int natural_width) {
++ base.get_preferred_width(out minimum_width, out natural_width);
++ natural_width = minimum_width;
++ }
+ }
+
+ }
+diff --git a/main/src/ui/main_window.vala b/main/src/ui/main_window.vala
+index 28e2bbd..c33279d 100644
+--- a/main/src/ui/main_window.vala
++++ b/main/src/ui/main_window.vala
+@@ -22,8 +22,9 @@ public class MainWindow : Gtk.Window {
+ public ConversationListTitlebarCsd conversation_list_titlebar_csd;
+ public HeaderBar placeholder_headerbar = new HeaderBar() { title="Dino", show_close_button=true, visible=true };
+ public Box box = new Box(Orientation.VERTICAL, 0) { orientation=Orientation.VERTICAL, visible=true };
+- public Paned headerbar_paned = new Paned(Orientation.HORIZONTAL) { visible=true };
+- public Paned paned;
++ public Hdy.Leaflet headerbar_paned = new Hdy.Leaflet() { visible=true };
++ public Hdy.TitleBar titlebar = new Hdy.TitleBar() { visible=true };
++ public Hdy.Leaflet paned;
+ public Revealer search_revealer;
+ public SearchEntry search_entry;
+ public GlobalSearch search_box;
+@@ -44,23 +45,29 @@ public class MainWindow : Gtk.Window {
+ restore_window_size();
+
+ this.get_style_context().add_class("dino-main");
+- setup_headerbar();
+ Gtk.Settings.get_default().notify["gtk-decoration-layout"].connect(set_window_buttons);
+ this.realize.connect(set_window_buttons);
+ setup_unified();
++ setup_headerbar();
+ setup_stack();
+
+- paned.bind_property("position", headerbar_paned, "position", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
++ paned.bind_property("mode-transition-type", headerbar_paned, "mode-transition-type", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
++ paned.bind_property("mode-transition-duration", headerbar_paned, "mode-transition-duration", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
++ paned.bind_property("child-transition-type", headerbar_paned, "child-transition-type", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
++ paned.bind_property("child-transition-duration", headerbar_paned, "child-transition-duration", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
++ paned.bind_property("visible-child-name", headerbar_paned, "visible-child-name", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
+ }
+
+ private void setup_unified() {
+ Builder builder = new Builder.from_resource("/im/dino/Dino/unified_main_content.ui");
+- paned = (Paned) builder.get_object("paned");
++ paned = (Hdy.Leaflet) builder.get_object("paned");
++ paned.notify["fold"].connect_after(() => update_headerbar());
+ box.add(paned);
+ left_stack = (Stack) builder.get_object("left_stack");
+ right_stack = (Stack) builder.get_object("right_stack");
+ conversation_view = (ConversationView) builder.get_object("conversation_view");
+ conversation_selector = ((ConversationSelector) builder.get_object("conversation_list")).init(stream_interactor);
++ conversation_selector.conversation_selected.connect_after(() => show_view_pane());
+ search_box = ((GlobalSearch) builder.get_object("search_box")).init(stream_interactor);
+ search_revealer = (Revealer) builder.get_object("search_revealer");
+ search_entry = (SearchEntry) builder.get_object("search_entry");
+@@ -68,20 +75,52 @@ public class MainWindow : Gtk.Window {
+ conversation_list_placeholder_image.set_from_pixbuf(new Pixbuf.from_resource("/im/dino/Dino/icons/dino-conversation-list-placeholder-arrow.svg"));
+ }
+
++ private void update_headerbar() {
++ if (!Util.use_csd()) return;
++ conversation_titlebar_csd.back_button = headerbar_paned.fold == Hdy.Fold.FOLDED;
++ set_window_buttons();
++ }
++
++ private void show_list_pane() {
++ paned.visible_child_name = "list-pane";
++ if (headerbar_paned.fold == Hdy.Fold.FOLDED) {
++ conversation_selector.unselect_row(conversation_selector.get_selected_row());
++ }
++ }
++
++ private void show_view_pane() {
++ paned.visible_child_name = "view-pane";
++ }
++
+ private void setup_headerbar() {
++ SizeGroup conversation_list_group = new SizeGroup(SizeGroupMode.HORIZONTAL);
++ conversation_list_group.add_widget(left_stack);
++ SizeGroup conversation_view_group = new SizeGroup(SizeGroupMode.HORIZONTAL);
++ conversation_view_group.add_widget(right_stack);
+ if (Util.use_csd()) {
+ conversation_list_titlebar_csd = new ConversationListTitlebarCsd() { visible=true };
+- headerbar_paned.pack1(conversation_list_titlebar_csd, false, false);
++ headerbar_paned.add_with_properties(conversation_list_titlebar_csd, "name", "list-pane");
++ conversation_list_group.add_widget(conversation_list_titlebar_csd);
++
++ Separator sep = new Separator(Orientation.HORIZONTAL) { visible = true };
++ sep.get_style_context().add_class("sidebar");
++ headerbar_paned.add(sep);
+
+ conversation_titlebar_csd = new ConversationTitlebarCsd() { visible=true };
++ conversation_titlebar_csd.back_pressed.connect(() => show_list_pane());
+ conversation_titlebar = conversation_titlebar_csd;
+- headerbar_paned.pack2(conversation_titlebar_csd, true, false);
++ headerbar_paned.add_with_properties(conversation_titlebar_csd, "name", "view-pane");
++ conversation_view_group.add_widget(conversation_titlebar);
++
++ titlebar.add(headerbar_paned);
+ } else {
+ ConversationListTitlebar conversation_list_titlebar = new ConversationListTitlebar() { visible=true };
+- headerbar_paned.pack1(conversation_list_titlebar, false, false);
++ headerbar_paned.add_with_properties(conversation_list_titlebar, "name", "list-pane");
++ conversation_list_group.add_widget(conversation_list_titlebar);
+
+ conversation_titlebar = new ConversationTitlebarNoCsd() { visible=true };
+- headerbar_paned.pack2(conversation_titlebar, true, false);
++ headerbar_paned.add_with_properties(conversation_titlebar, "name", "view-pane");
++ conversation_view_group.add_widget(conversation_titlebar);
+
+ box.add(headerbar_paned);
+ }
+@@ -92,9 +131,14 @@ public class MainWindow : Gtk.Window {
+ Gtk.Settings? gtk_settings = Gtk.Settings.get_default();
+ if (gtk_settings == null) return;
+
+- string[] buttons = gtk_settings.gtk_decoration_layout.split(":");
+- this.conversation_list_titlebar_csd.decoration_layout = buttons[0] + ":";
+- this.conversation_titlebar_csd.decoration_layout = ((buttons.length == 2) ? ":" + buttons[1] : "");
++ if (headerbar_paned.fold == Hdy.Fold.FOLDED) {
++ conversation_list_titlebar_csd.decoration_layout = gtk_settings.gtk_decoration_layout;
++ conversation_titlebar_csd.decoration_layout = "";
++ } else {
++ string[] buttons = gtk_settings.gtk_decoration_layout.split(":");
++ conversation_list_titlebar_csd.decoration_layout = buttons[0] + ":";
++ conversation_titlebar_csd.decoration_layout = ((buttons.length == 2) ? ":" + buttons[1] : "");
++ }
+ }
+
+ private void setup_stack() {
+@@ -118,7 +162,7 @@ public class MainWindow : Gtk.Window {
+
+ stack.set_visible_child_name("main");
+ if (Util.use_csd()) {
+- set_titlebar(headerbar_paned);
++ set_titlebar(titlebar);
+ }
+ } else if (stack_state == StackState.CLEAN_START || stack_state == StackState.NO_ACTIVE_ACCOUNTS) {
+ if (stack_state == StackState.CLEAN_START) {
+@@ -134,7 +178,7 @@ public class MainWindow : Gtk.Window {
+ left_stack.set_visible_child_name("placeholder");
+ right_stack.set_visible_child_name("placeholder");
+ if (Util.use_csd()) {
+- set_titlebar(headerbar_paned);
++ set_titlebar(titlebar);
+ }
+ }
+ }