diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..e2065df
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,702 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "anyhow"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b"
+
+[[package]]
+name = "atk"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "812b4911e210bd51b24596244523c856ca749e6223c50a7fbbba3f89ee37c426"
+dependencies = [
+ "atk-sys",
+ "bitflags",
+ "glib",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+]
+
+[[package]]
+name = "atk-sys"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f530e4af131d94cc4fa15c5c9d0348f0ef28bac64ba660b6b2a1cf2605dedfce"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+
+[[package]]
+name = "bitwarden-mob"
+version = "0.1.0"
+dependencies = [
+ "gio",
+ "gtk",
+ "libhandy",
+]
+
+[[package]]
+name = "cairo-rs"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5c0f2e047e8ca53d0ff249c54ae047931d7a6ebe05d00af73e0ffeb6e34bdb8"
+dependencies = [
+ "bitflags",
+ "cairo-sys-rs",
+ "glib",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "thiserror",
+]
+
+[[package]]
+name = "cairo-sys-rs"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ed2639b9ad5f1d6efa76de95558e11339e7318426d84ac4890b86c03e828ca7"
+dependencies = [
+ "glib-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"
+
+[[package]]
+name = "either"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+
+[[package]]
+name = "futures"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3"
+
+[[package]]
+name = "futures-task"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80"
+
+[[package]]
+name = "futures-util"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "proc-macro-hack",
+ "proc-macro-nested",
+ "slab",
+]
+
+[[package]]
+name = "gdk"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db00839b2a68a7a10af3fa28dfb3febaba3a20c3a9ac2425a33b7df1f84a6b7d"
+dependencies = [
+ "bitflags",
+ "cairo-rs",
+ "cairo-sys-rs",
+ "gdk-pixbuf",
+ "gdk-sys",
+ "gio",
+ "gio-sys",
+ "glib",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pango",
+]
+
+[[package]]
+name = "gdk-pixbuf"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f6dae3cb99dd49b758b88f0132f8d401108e63ae8edd45f432d42cdff99998a"
+dependencies = [
+ "gdk-pixbuf-sys",
+ "gio",
+ "gio-sys",
+ "glib",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+]
+
+[[package]]
+name = "gdk-pixbuf-sys"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bfe468a7f43e97b8d193a762b6c5cf67a7d36cacbc0b9291dbcae24bfea1e8f"
+dependencies = [
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "gdk-sys"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a9653cfc500fd268015b1ac055ddbc3df7a5c9ea3f4ccef147b3957bd140d69"
+dependencies = [
+ "cairo-sys-rs",
+ "gdk-pixbuf-sys",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pango-sys",
+ "pkg-config",
+ "system-deps",
+]
+
+[[package]]
+name = "gio"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fb60242bfff700772dae5d9e3a1f7aa2e4ebccf18b89662a16acb2822568561"
+dependencies = [
+ "bitflags",
+ "futures",
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-util",
+ "gio-sys",
+ "glib",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "once_cell",
+ "thiserror",
+]
+
+[[package]]
+name = "gio-sys"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e24fb752f8f5d2cf6bbc2c606fd2bc989c81c5e2fe321ab974d54f8b6344eac"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+ "winapi",
+]
+
+[[package]]
+name = "glib"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c685013b7515e668f1b57a165b009d4d28cb139a8a989bbd699c10dad29d0c5"
+dependencies = [
+ "bitflags",
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-task",
+ "futures-util",
+ "glib-macros",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
+name = "glib-macros"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41486a26d1366a8032b160b59065a59fb528530a46a49f627e7048fb8c064039"
+dependencies = [
+ "anyhow",
+ "heck",
+ "itertools",
+ "proc-macro-crate",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "glib-sys"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7e9b997a66e9a23d073f2b1abb4dbfc3925e0b8952f67efd8d9b6e168e4cdc1"
+dependencies = [
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "gobject-sys"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "952133b60c318a62bf82ee75b93acc7e84028a093e06b9e27981c2b6fe68218c"
+dependencies = [
+ "glib-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "gtk"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f022f2054072b3af07666341984562c8e626a79daa8be27b955d12d06a5ad6a"
+dependencies = [
+ "atk",
+ "bitflags",
+ "cairo-rs",
+ "cairo-sys-rs",
+ "cc",
+ "gdk",
+ "gdk-pixbuf",
+ "gdk-pixbuf-sys",
+ "gdk-sys",
+ "gio",
+ "gio-sys",
+ "glib",
+ "glib-sys",
+ "gobject-sys",
+ "gtk-sys",
+ "libc",
+ "once_cell",
+ "pango",
+ "pango-sys",
+ "pkg-config",
+]
+
+[[package]]
+name = "gtk-sys"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89acda6f084863307d948ba64a4b1ef674e8527dddab147ee4cdcc194c880457"
+dependencies = [
+ "atk-sys",
+ "cairo-sys-rs",
+ "gdk-pixbuf-sys",
+ "gdk-sys",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pango-sys",
+ "system-deps",
+]
+
+[[package]]
+name = "heck"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "itertools"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.92"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56d855069fafbb9b344c0f962150cd2c1187975cb1c22c1522c240d8c4986714"
+
+[[package]]
+name = "libhandy"
+version = "0.7.1"
+source = "git+https://gitlab.gnome.org/World/Rust/libhandy-rs#a869c46211c266b5c884ecfe882c1b304d978926"
+dependencies = [
+ "bitflags",
+ "gdk",
+ "gdk-pixbuf",
+ "gdk-pixbuf-sys",
+ "gdk-sys",
+ "gio",
+ "gio-sys",
+ "glib",
+ "glib-sys",
+ "gobject-sys",
+ "gtk",
+ "gtk-sys",
+ "lazy_static",
+ "libc",
+ "libhandy-sys",
+ "pango",
+]
+
+[[package]]
+name = "libhandy-sys"
+version = "0.7.0"
+source = "git+https://gitlab.gnome.org/World/Rust/libhandy-rs#a869c46211c266b5c884ecfe882c1b304d978926"
+dependencies = [
+ "gdk",
+ "gdk-pixbuf-sys",
+ "gdk-sys",
+ "gio",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "gtk-sys",
+ "libc",
+ "pango-sys",
+ "pkg-config",
+ "system-deps",
+]
+
+[[package]]
+name = "memchr"
+version = "2.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
+
+[[package]]
+name = "once_cell"
+version = "1.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"
+
+[[package]]
+name = "pango"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9937068580bebd8ced19975938573803273ccbcbd598c58d4906efd4ac87c438"
+dependencies = [
+ "bitflags",
+ "glib",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "once_cell",
+ "pango-sys",
+]
+
+[[package]]
+name = "pango-sys"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d2650c8b62d116c020abd0cea26a4ed96526afda89b1c4ea567131fdefc890"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
+
+[[package]]
+name = "proc-macro-crate"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+dependencies = [
+ "toml",
+]
+
+[[package]]
+name = "proc-macro-error"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+dependencies = [
+ "proc-macro-error-attr",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro-error-attr"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
+
+[[package]]
+name = "proc-macro-nested"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.125"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171"
+
+[[package]]
+name = "slab"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
+
+[[package]]
+name = "strum"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b"
+
+[[package]]
+name = "strum_macros"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ce15dd3ed8aa2f8eeac4716d6ef5ab58b6b9256db41d7e1a0224c2788e8fd87"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "system-deps"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b"
+dependencies = [
+ "heck",
+ "pkg-config",
+ "strum",
+ "strum_macros",
+ "thiserror",
+ "toml",
+ "version-compare",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
+
+[[package]]
+name = "version-compare"
+version = "0.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1"
+
+[[package]]
+name = "version_check"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..1c8c7ff
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "bitwarden-mob"
+version = "0.1.0"
+authors = ["mobian"]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+libhandy = { git = "https://gitlab.gnome.org/World/Rust/libhandy-rs" }
+
+[dependencies.gtk]
+version = "0.9.0"
+features = ["v3_16"]
+
+[dependencies.gio]
+version = ""
+features = ["v2_44"]
diff --git a/res/ui/main-window.ui b/res/ui/main-window.ui
new file mode 100644
index 0000000..79b50c1
--- /dev/null
+++ b/res/ui/main-window.ui
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
diff --git a/res/ui/main-window.ui~ b/res/ui/main-window.ui~
new file mode 100644
index 0000000..79b50c1
--- /dev/null
+++ b/res/ui/main-window.ui~
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+
+
+ True
+ False
+
+
+ True
+ False
+
+
+ True
+ False
+
+
+ True
+ False
+ vertical
+
+
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ True
+ False
+ vertical
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ page0
+ page0
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+
+
+
diff --git a/src/builder_basics.glade b/src/builder_basics.glade
new file mode 100644
index 0000000..fa40e95
--- /dev/null
+++ b/src/builder_basics.glade
@@ -0,0 +1,59 @@
+
+
+
+
+ Builder Basics
+ 320
+ 240
+
+
+ Big Useless Button
+
+
+
+
+ False
+ dialog
+
+
+ msgdialog
+ 300
+ False
+ Thank you for trying this example
+ immediate
+ vertical
+ 2
+
+
+ False
+ end
+
+
+
+
+
+ False
+ True
+ end
+ 0
+
+
+
+
+ True
+ False
+ You have pressed the button
+ end
+ 40
+ 1
+
+
+ False
+ True
+ 2
+
+
+
+
+
+
diff --git a/src/builder_basics.ui b/src/builder_basics.ui
new file mode 100644
index 0000000..1e64bb9
--- /dev/null
+++ b/src/builder_basics.ui
@@ -0,0 +1,60 @@
+
+
+
+
+ Builder Basics
+ 320
+ 240
+
+
+ Big Useless Button
+
+
+
+
+ False
+ dialog
+ window1
+
+
+ msgdialog
+ 300
+ False
+ Thank you for trying this example
+ immediate
+ vertical
+ 2
+
+
+ False
+ end
+
+
+
+
+
+ False
+ True
+ end
+ 0
+
+
+
+
+ True
+ False
+ You have pressed the button
+ end
+ 40
+ 1
+
+
+ False
+ True
+ 2
+
+
+
+
+
+
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..c831fa0
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,111 @@
+extern crate gio;
+extern crate gtk;
+
+use gio::prelude::*;
+use gtk::prelude::*;
+
+use gtk::{Application};
+
+fn main() {
+ let application =
+ Application::new(Some("com.github.gtk-rs.examples.basic"), Default::default())
+ .expect("failed to initialize GTK application");
+
+ application.connect_activate(|app| {
+ /* let window = ApplicationWindow::new(app);
+ window.set_title("First GTK+ Program");
+ window.set_default_size(350, 70);
+
+ let button = Button::with_label("Click me!");
+ button.connect_clicked(|_| {
+ println!("Clicked!");
+ });
+ window.add(&button);
+
+ window.show_all(); */
+
+ let glade_src = include_str!("../res/ui/main-window.ui");
+ // Then we call the Builder call.
+ let builder = gtk::Builder::from_string(glade_src);
+
+ let objects = builder.get_objects();
+ println!("{}", objects.len());
+
+ /* for (o, g) in objects {
+ println!("{}", o as fmt::Display);
+ }
+ */
+ // Our window id is "window1".
+ let window: libhandy::ApplicationWindow = builder.get_object("main_window").unwrap();
+ window.maximize();
+ window.show_all();
+
+ // We start the gtk main loop.
+ gtk::main();
+ });
+
+ application.run(&[]);
+
+ /* if gtk::init().is_err() {
+ println!("Failed to initialize GTK.");
+ return;
+ }
+ let glade_src = include_str!("builder_basics.glade");
+ let builder = gtk::Builder::from_string(glade_src);
+
+ let objects = builder.get_objects().len();
+ println!("{}", objects);
+
+ let window: gtk::Window = builder.get_object("window1").unwrap();
+ let button: gtk::Button = builder.get_object("button1").unwrap();
+ let dialog: gtk::MessageDialog = builder.get_object("messagedialog1").unwrap();
+
+ button.connect_clicked(move |_| {
+ dialog.run();
+ dialog.hide();
+ });
+
+ window.show_all();
+
+ gtk::main(); */
+}
+
+/*
+//use gtk::glib;
+use gtk::prelude::*;
+use gtk::{ApplicationWindow, Builder, Button, MessageDialog};
+
+fn build_ui(application: >k::Application) {
+ let glade_src = include_str!("builder_basics.ui");
+ let builder = Builder::from_string(glade_src);
+
+ //builder.
+ let objects = builder.get_objects();
+
+ let window: ApplicationWindow = builder.get_object("window1").expect("Couldn't get window1");
+ window.set_application(Some(application));
+ let bigbutton: Button = builder.get_object("button1").expect("Couldn't get button1");
+ let dialog: MessageDialog = builder
+ .get_object("messagedialog1")
+ .expect("Couldn't get messagedialog1");
+
+ dialog.connect_delete_event(|dialog, _| {
+ dialog.hide();
+ gtk::Inhibit(true)
+ });
+
+ //bigbutton.connect_clicked(glib::clone!(@weak dialog => move |_| dialog.show_all()));
+ window.show_all();
+}
+
+fn main() {
+ let application = gtk::Application::new(
+ Some("com.github.gtk-rs.examples.builder_basics"),
+ Default::default(),
+ )
+ .expect("Initialization failed...");
+
+ application.connect_activate(build_ui);
+
+ application.run();
+} */
diff --git a/src/main_window.ui b/src/main_window.ui
new file mode 100644
index 0000000..5609cbb
--- /dev/null
+++ b/src/main_window.ui
@@ -0,0 +1,636 @@
+
+
+
+
+
+ False
+ 860
+ 640
+ False
+
+
+ True
+
+
+ False
+ False
+
+
+ True
+ True
+ True
+ False
+
+
+ True
+ room_list
+ True
+
+
+ True
+ vertical
+
+
+
+
+
+
+
+
+ sidebar
+
+
+
+
+
+ False
+
+
+
+
+ True
+ vertical
+
+
+
+
+
+ True
+ False
+
+
+ True
+ False
+
+
+ False
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ vertical
+
+
+
+
+ True
+
+
+
+
+
+
+
+ room_view
+ room_view
+
+
+
+
+ True
+ False
+ True
+
+
+ loading
+ loading
+
+
+
+
+ True
+ False
+ True
+ True
+ chat-icon
+ No Room Selected
+ Join a room to start chatting.
+
+
+ noroom
+ No room
+
+
+
+
+ -1
+
+
+
+
+ True
+ False
+ start
+ center
+
+
+ True
+ False
+ center
+
+
+ True
+ False
+ 0
+ none
+
+
+ True
+ False
+ 10
+
+
+ True
+ True
+ False
+
+
+
+
+ True
+ False
+
+
+
+
+
+
+
+
+
+ True
+ -1
+
+
+
+
+
+
+
+
+ content
+
+
+
+
+ chat
+
+
+
+
+ False
+ False
+
+
+ True
+ False
+ vertical
+
+
+
+
+
+ True
+ False
+ vertical
+
+
+ True
+ True
+ never
+ True
+ fill
+ fill
+
+
+ False
+
+
+ True
+ False
+
+
+ True
+ False
+ True
+ True
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+ directory
+
+
+
+
+ subview
+
+
+
+
+ main_view
+
+
+
+
+ True
+ False
+ vertical
+
+
+
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ True
+ True
+ fill
+ fill
+
+
+
+
+
+
+ loading
+
+
+
+
+
+
+
+
+
+
diff --git a/temp/main_window.ui b/temp/main_window.ui
new file mode 100644
index 0000000..5609cbb
--- /dev/null
+++ b/temp/main_window.ui
@@ -0,0 +1,636 @@
+
+
+
+
+
+ False
+ 860
+ 640
+ False
+
+
+ True
+
+
+ False
+ False
+
+
+ True
+ True
+ True
+ False
+
+
+ True
+ room_list
+ True
+
+
+ True
+ vertical
+
+
+
+
+
+
+
+
+ sidebar
+
+
+
+
+
+ False
+
+
+
+
+ True
+ vertical
+
+
+
+
+
+ True
+ False
+
+
+ True
+ False
+
+
+ False
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ vertical
+
+
+
+
+ True
+
+
+
+
+
+
+
+ room_view
+ room_view
+
+
+
+
+ True
+ False
+ True
+
+
+ loading
+ loading
+
+
+
+
+ True
+ False
+ True
+ True
+ chat-icon
+ No Room Selected
+ Join a room to start chatting.
+
+
+ noroom
+ No room
+
+
+
+
+ -1
+
+
+
+
+ True
+ False
+ start
+ center
+
+
+ True
+ False
+ center
+
+
+ True
+ False
+ 0
+ none
+
+
+ True
+ False
+ 10
+
+
+ True
+ True
+ False
+
+
+
+
+ True
+ False
+
+
+
+
+
+
+
+
+
+ True
+ -1
+
+
+
+
+
+
+
+
+ content
+
+
+
+
+ chat
+
+
+
+
+ False
+ False
+
+
+ True
+ False
+ vertical
+
+
+
+
+
+ True
+ False
+ vertical
+
+
+ True
+ True
+ never
+ True
+ fill
+ fill
+
+
+ False
+
+
+ True
+ False
+
+
+ True
+ False
+ True
+ True
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+ directory
+
+
+
+
+ subview
+
+
+
+
+ main_view
+
+
+
+
+ True
+ False
+ vertical
+
+
+
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ True
+ True
+ fill
+ fill
+
+
+
+
+
+
+ loading
+
+
+
+
+
+
+
+
+
+