This commit is contained in:
Piyush मिश्रः 2021-01-18 22:12:49 +05:30
parent 9873bb8957
commit a53c240e79
10 changed files with 804 additions and 23 deletions

28
Cargo.lock generated
View File

@ -891,6 +891,20 @@ dependencies = [
"version-compare", "version-compare",
] ]
[[package]]
name = "tarangam"
version = "0.1.0"
dependencies = [
"cairo-rs",
"gio",
"glib",
"gtk",
"libmath",
"png",
"rand 0.8.1",
"serialport",
]
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.20" version = "1.0.20"
@ -929,20 +943,6 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "trangam"
version = "0.1.0"
dependencies = [
"cairo-rs",
"gio",
"glib",
"gtk",
"libmath",
"png",
"rand 0.8.1",
"serialport",
]
[[package]] [[package]]
name = "unicode-segmentation" name = "unicode-segmentation"
version = "1.6.0" version = "1.6.0"

View File

@ -1,5 +1,5 @@
[package] [package]
name = "trangam" name = "tarangam"
version = "0.1.0" version = "0.1.0"
authors = ["PiyushXCoder <piyush.raj.kit@gmail.com>"] authors = ["PiyushXCoder <piyush.raj.kit@gmail.com>"]
edition = "2018" edition = "2018"

BIN
chitra.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

104
icon.svg Normal file
View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1000"
height="1000"
viewBox="0 0 1000 1000"
version="1.1"
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="icon.svg">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient947">
<stop
style="stop-color:#0055d4;stop-opacity:1"
offset="0"
id="stop943" />
<stop
style="stop-color:#00d4aa;stop-opacity:1"
offset="1"
id="stop945" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient947"
id="linearGradient928"
x1="797.20435"
y1="222.40904"
x2="781.76208"
y2="1176.1864"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="605.76766"
inkscape:cy="248.85918"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="1214"
inkscape:window-height="757"
inkscape:window-x="295"
inkscape:window-y="198"
inkscape:window-maximized="0"
units="px"
showguides="false">
<inkscape:grid
type="xygrid"
id="grid869" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:url(#linearGradient928);fill-opacity:1;stroke:#1c2224;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 80,560 V 920 H 920 V 120 C 376.51096,258.86595 557.80257,1188.2925 80,560 Z"
id="path918"
sodipodi:nodetypes="ccccc" />
<ellipse
style="fill:none;stroke:#1a1a1a;stroke-width:37.79527559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:113.38582677,113.38582677;stroke-dashoffset:0"
id="path894"
cx="567.29211"
cy="427.84738"
rx="149.01106"
ry="141.18758" />
<path
id="path908"
style="fill:#00aa88;stroke:#00aa88;stroke-width:37.7953;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 484.8434,424.93583 h 160 m -80,-80 v 160" />
<path
id="path908-9"
style="fill:#f9f9f9;stroke:#ffffff;stroke-width:18.8976378;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 504.25693,424.7161 h 120 m -60,-60 v 120" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1,3 +1,5 @@
/// Feel free to see through codes. Application is not written to be used as a library for other app. :)
mod graph; mod graph;
use gtk::prelude::*; use gtk::prelude::*;
@ -17,13 +19,13 @@ enum Status {
JAGRIT, SAYAN, AVRODTIH, PARIVARTIT JAGRIT, SAYAN, AVRODTIH, PARIVARTIT
} }
/// Configuration to read from Serial Port
pub struct Config { pub struct Config {
status: Status, status: Status,
bondrate: u32, bondrate: u32,
port: String port: String
} }
//
impl Config { impl Config {
pub fn new() -> Config { pub fn new() -> Config {
Config { Config {
@ -34,13 +36,15 @@ impl Config {
} }
} }
/// For communication between mpsc of graph and serial port
enum MessageSerialThread { enum MessageSerialThread {
Msg(String), Msg(String),
Status(String) Status(String)
} }
// Building and configuring GUI
pub fn build_ui(app: &gtk::Application, config: Arc::<Mutex::<Config>>) { pub fn build_ui(app: &gtk::Application, config: Arc::<Mutex::<Config>>) {
let builder = gtk::Builder::from_file("ui/main_window.glade"); let builder = gtk::Builder::from_file("ui.glade");
let win = builder.get_object::<gtk::ApplicationWindow>("win").expect("Resource file missing!"); let win = builder.get_object::<gtk::ApplicationWindow>("win").expect("Resource file missing!");
win.set_application(Some(app)); win.set_application(Some(app));
@ -63,6 +67,7 @@ pub fn build_ui(app: &gtk::Application, config: Arc::<Mutex::<Config>>) {
// exit_menu // exit_menu
let exit_menu = builder.get_object::<gtk::MenuItem>("exit_menu").expect("Resource file missing!"); let exit_menu = builder.get_object::<gtk::MenuItem>("exit_menu").expect("Resource file missing!");
let tmp_win = win.clone(); let tmp_win = win.clone();
exit_menu.connect_activate(move |_|{ exit_menu.connect_activate(move |_|{
unsafe { unsafe {
@ -364,6 +369,7 @@ pub fn build_ui(app: &gtk::Application, config: Arc::<Mutex::<Config>>) {
}); });
} }
// Controls the thread and read from serial port
fn serial_thread_work( fn serial_thread_work(
config: &Arc<Mutex<Config>>, config: &Arc<Mutex<Config>>,
bufread: &mut Option<BufReader<Box<dyn serialport::SerialPort>>>, bufread: &mut Option<BufReader<Box<dyn serialport::SerialPort>>>,
@ -414,6 +420,7 @@ fn serial_thread_work(
} }
} }
// Receives MessageSerialThread from Serial Port managing thread and add points to draw on graph
fn receiver_for_msg(text: String, graph: &Rc<RefCell<Graph>>, full_log: &gtk::CheckButton, log_area: &gtk::TextView) { fn receiver_for_msg(text: String, graph: &Rc<RefCell<Graph>>, full_log: &gtk::CheckButton, log_area: &gtk::TextView) {
for text in text.lines() { for text in text.lines() {
if text.len() == 0 { if text.len() == 0 {

View File

@ -3,14 +3,14 @@ use std::env::args;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
fn main() { fn main() {
let app = gtk::Application::new(Some("sng.trangm"), Default::default()) let app = gtk::Application::new(Some("sng.tarangm"), Default::default())
.expect("Failed to initiate gtk"); .expect("Failed to initiate gtk");
let config = Arc::new(Mutex::new(trangam::Config::new())); let config = Arc::new(Mutex::new(tarangam::Config::new()));
app.connect_activate(move |app| { app.connect_activate(move |app| {
let config = Arc::clone(&config); let config = Arc::clone(&config);
trangam::build_ui(app, config); tarangam::build_ui(app, config);
}); });
app.run(&args().collect::<Vec<_>>()); app.run(&args().collect::<Vec<_>>());

View File

@ -1 +0,0 @@
Bhai ka area hai

View File

@ -4,11 +4,13 @@
<requires lib="gtk+" version="3.22"/> <requires lib="gtk+" version="3.22"/>
<object class="GtkAboutDialog" id="about_window"> <object class="GtkAboutDialog" id="about_window">
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="title" translatable="yes">Tarangam</property>
<property name="icon">icon.svg</property>
<property name="type-hint">dialog</property> <property name="type-hint">dialog</property>
<property name="program-name">Tarangam (तरंगम्)</property> <property name="program-name">Tarangam (तरंगम्)</property>
<property name="comments" translatable="yes">A simple serial plotter. <property name="comments" translatable="yes">A simple serial plotter.
एक सरल सीरीय्ल पलौटर।</property> एक सरल सीरीय्ल पलौटर।</property>
<property name="logo-icon-name">image-missing</property> <property name="logo">chitra.png</property>
<child internal-child="vbox"> <child internal-child="vbox">
<object class="GtkBox"> <object class="GtkBox">
<property name="can-focus">False</property> <property name="can-focus">False</property>
@ -51,6 +53,7 @@
</object> </object>
<object class="GtkFileChooserDialog" id="save_window"> <object class="GtkFileChooserDialog" id="save_window">
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="icon">chitra.png</property>
<property name="type-hint">dialog</property> <property name="type-hint">dialog</property>
<property name="action">select-folder</property> <property name="action">select-folder</property>
<child internal-child="vbox"> <child internal-child="vbox">
@ -88,9 +91,10 @@
</object> </object>
<object class="GtkApplicationWindow" id="win"> <object class="GtkApplicationWindow" id="win">
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="title" translatable="yes">Trangam</property> <property name="title" translatable="yes">Tarangam</property>
<property name="default-width">850</property> <property name="default-width">850</property>
<property name="default-height">600</property> <property name="default-height">600</property>
<property name="icon">chitra.png</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>

667
ui.glade~ Normal file
View File

@ -0,0 +1,667 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.22"/>
<object class="GtkAboutDialog" id="about_window">
<property name="can-focus">False</property>
<property name="title" translatable="yes">Tarangam</property>
<property name="icon">icon.svg</property>
<property name="type-hint">dialog</property>
<property name="program-name">Tarangam (तरंगम्)</property>
<property name="comments" translatable="yes">A simple serial plotter.
एक सरल सीरीय्ल पलौटर।</property>
<property name="logo">chitra.png</property>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can-focus">False</property>
<property name="layout-style">end</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
<object class="GtkImage" id="document_save">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">document-save</property>
</object>
<object class="GtkAdjustment" id="pankti_adjustment">
<property name="lower">5</property>
<property name="upper">500</property>
<property name="value">100</property>
<property name="step-increment">0.5</property>
<property name="page-increment">10</property>
</object>
<object class="GtkFileChooserDialog" id="save_window">
<property name="can-focus">False</property>
<property name="icon">chitra.png</property>
<property name="type-hint">dialog</property>
<property name="action">select-folder</property>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can-focus">False</property>
<property name="layout-style">end</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
<object class="GtkImage" id="send_image">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">go-next</property>
</object>
<object class="GtkApplicationWindow" id="win">
<property name="can-focus">False</property>
<property name="title" translatable="yes">Tarangam</property>
<property name="default-width">850</property>
<property name="default-height">600</property>
<property name="icon">chitra.png</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkMenuBar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">_File</property>
<property name="use-underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkImageMenuItem" id="save_menu">
<property name="label">Save Log</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="image">document_save</property>
<property name="use-stock">False</property>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="exit_menu">
<property name="label">gtk-quit</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="use-underline">True</property>
<property name="use-stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">_Help</property>
<property name="use-underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkImageMenuItem" id="about_menu">
<property name="label">gtk-about</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="use-underline">True</property>
<property name="use-stock">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkToolbar">
<property name="height-request">30</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkToolButton" id="refresh_port">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">refresh</property>
<property name="use-underline">True</property>
<property name="icon-name">view-refresh</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkComboBoxText" id="port">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkComboBoxText" id="bondrate">
<property name="visible">True</property>
<property name="can-focus">False</property>
<items>
<item id="&lt;Enter ID&gt;" translatable="yes">9600</item>
</items>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolButton" id="jagrit_btn">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Connect</property>
<property name="use-underline">True</property>
<property name="icon-name">media-playback-start</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolButton" id="avrodith_btn">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Stop</property>
<property name="use-underline">True</property>
<property name="icon-name">media-playback-stop</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkPaned">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child>
<object class="GtkBox">
<property name="width-request">500</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkToolbar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkToolButton" id="clear_graph">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Clear</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkCheckButton" id="draw_patches">
<property name="label" translatable="yes">Patches</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkCheckButton" id="draw_box">
<property name="label" translatable="yes">box</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkCheckButton" id="draw_baarik_box">
<property name="label" translatable="yes">baarik box</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkSeparatorToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="xpad">4</property>
<property name="label" translatable="yes">Pankti</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkSpinButton" id="pankti">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="adjustment">pankti_adjustment</property>
<property name="digits">1</property>
<property name="numeric">True</property>
<property name="wrap">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkDrawingArea" id="draw_area">
<property name="width-request">500</property>
<property name="height-request">450</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkToolbar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkCheckButton" id="nimna_stambh">
<property name="label" translatable="yes">nimna</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="xpad">4</property>
<property name="label" translatable="yes">S tambh 1 </property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="is-important">True</property>
<child>
<object class="GtkEntry" id="stambh_1">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can-focus">True</property>
<property name="width-chars">8</property>
<property name="text" translatable="yes">0</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="xpad">4</property>
<property name="label" translatable="yes">Stambh 2 </property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="is-important">True</property>
<child>
<object class="GtkEntry" id="stambh_2">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can-focus">True</property>
<property name="width-chars">8</property>
<property name="text" translatable="yes">100</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="resize">True</property>
<property name="shrink">True</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkToolbar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkToolButton" id="clear_log">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Clear</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkCheckButton" id="full_log">
<property name="label" translatable="yes">Show full log</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow">
<property name="width-request">300</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkTextView" id="log_area">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="monospace">True</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkEntry" id="send_entry">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="send_btn">
<property name="label" translatable="yes">Send</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">send_image</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkStatusbar" id="status_bar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">6</property>
<property name="margin-bottom">6</property>
<property name="hexpand">True</property>
<property name="vexpand">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
</child>
</object>
</interface>