mittens_ui 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +2 -2
  4. data/README.md +65 -61
  5. data/examples/app.rb +9 -1
  6. data/examples/assets/mittens_ui_preview.gif +0 -0
  7. data/examples/contacts.rb +75 -0
  8. data/lib/mittens_ui.rb +21 -67
  9. data/lib/mittens_ui/alert.rb +32 -0
  10. data/lib/mittens_ui/assets/icon.png +0 -0
  11. data/lib/mittens_ui/assets/mittens_ui_preview.gif +0 -0
  12. data/lib/mittens_ui/button.rb +29 -0
  13. data/lib/mittens_ui/checkbox.rb +24 -0
  14. data/lib/mittens_ui/core.rb +34 -0
  15. data/lib/mittens_ui/file_picker.rb +29 -0
  16. data/lib/mittens_ui/grid.rb +29 -0
  17. data/lib/mittens_ui/hbox.rb +56 -0
  18. data/lib/mittens_ui/header_bar.rb +48 -0
  19. data/lib/mittens_ui/image.rb +46 -0
  20. data/lib/mittens_ui/label.rb +19 -0
  21. data/lib/mittens_ui/listbox.rb +47 -0
  22. data/lib/mittens_ui/loader.rb +35 -0
  23. data/lib/mittens_ui/slider.rb +32 -0
  24. data/lib/mittens_ui/switch.rb +36 -0
  25. data/lib/mittens_ui/table_view.rb +179 -0
  26. data/lib/mittens_ui/textbox.rb +31 -0
  27. data/lib/mittens_ui/version.rb +1 -1
  28. data/lib/mittens_ui/web_link.rb +22 -0
  29. data/notes/dev_setup.txt +14 -0
  30. metadata +28 -23
  31. data/examples/brightness_controller.rb +0 -64
  32. data/lib/mittens_ui/dialogs/file_dialog.rb +0 -29
  33. data/lib/mittens_ui/layouts/box.rb +0 -38
  34. data/lib/mittens_ui/layouts/grid.rb +0 -31
  35. data/lib/mittens_ui/widgets/alert.rb +0 -33
  36. data/lib/mittens_ui/widgets/button.rb +0 -25
  37. data/lib/mittens_ui/widgets/checkbox.rb +0 -28
  38. data/lib/mittens_ui/widgets/core.rb +0 -32
  39. data/lib/mittens_ui/widgets/image.rb +0 -36
  40. data/lib/mittens_ui/widgets/label.rb +0 -21
  41. data/lib/mittens_ui/widgets/listbox.rb +0 -45
  42. data/lib/mittens_ui/widgets/loader.rb +0 -34
  43. data/lib/mittens_ui/widgets/slider.rb +0 -31
  44. data/lib/mittens_ui/widgets/switch.rb +0 -37
  45. data/lib/mittens_ui/widgets/table_view.rb +0 -159
  46. data/lib/mittens_ui/widgets/textbox.rb +0 -28
  47. data/lib/mittens_ui/widgets/web_link.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9976f7810db4c1f9ed61a4a1f1f639617ee9c84bf117d37e174b14fd54b21dbc
4
- data.tar.gz: 0224ed85d93f9366f7f594e19ed74827c72b33c949ea7ce9efc78a230dc44121
3
+ metadata.gz: bb39340bda7c9c473ade8a1cfa92300cd87f6fdd29e96431507b0fc21133a6a7
4
+ data.tar.gz: 3ed7082dfca8a2475e6d86bae2bb36e5740464044bc6d67ce140b3de00eb4d8c
5
5
  SHA512:
6
- metadata.gz: 68fbe929734690f1a21377b914fc200c54307e5393a98da9324e017b6bc59b3270577e4e09843aad88f49d61f6fd732c25f5e635d0ad2b0536d518898750e40b
7
- data.tar.gz: edaecba0f03a65f2c79cab04345434cd8f8539c4a7930480eb6e792e89c90ee969416b7bcd36efba77be11f28210cf08e4a9c1c2d7cb3990cf5ca5940be3db67
6
+ metadata.gz: 5a47bf32490fb765cb9084bdb6aea8ca5fba19b572d81cc321c1cd56e13c45cc317f39f99bf63834a867f513817a02000e5819379501f0a3a36334f02d458aeb
7
+ data.tar.gz: 54149cd2b1f4d2d3d45ea434e244a746de45226bea12597d6166f31ae2b127208ad848d630d859297ecf70a32fac568fbfd356d8d1eb8776609550c96547dc32
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- ruby "3.0.1"
3
+ ruby "3.0.2"
4
4
 
5
5
  # Specify your gem's dependencies in mittens_ui.gemspec
6
6
  gemspec
data/Gemfile.lock CHANGED
@@ -68,7 +68,7 @@ DEPENDENCIES
68
68
  rspec (~> 3.0)
69
69
 
70
70
  RUBY VERSION
71
- ruby 3.0.1p64
71
+ ruby 3.0.2p107
72
72
 
73
73
  BUNDLED WITH
74
- 2.2.15
74
+ 2.2.22
data/README.md CHANGED
@@ -4,6 +4,8 @@ This is a small vertical stacking GUI toolkit inspired by Ruby Shoes and built o
4
4
  around GTK. The goal of this project is make creating GUIs in Ruby dead simple
5
5
  without the UI framework/library getting your way.
6
6
 
7
+ ![alt_text](https://github.com/tuttza/mittens_ui/blob/51e84d7c50282e3f2c856aa9e65fe3ed28b117ff/lib/mittens_ui/assets/mittens_ui_preview.gif "MittensUi Preview")
8
+
7
9
  ## Installation
8
10
 
9
11
  Add this line to your application's Gemfile:
@@ -23,84 +25,89 @@ Or install it yourself as:
23
25
  ## Usage
24
26
 
25
27
  ```ruby
26
- require "mittens_ui"
28
+ require 'mittens_ui'
27
29
 
28
30
  app_options = {
29
- name: "hello_world",
30
- title: "Hello World App!",
31
- height: 650,
32
- width: 550,
31
+ name: "contacts",
32
+ title: "Contacts",
33
+ height: 615,
34
+ width: 570,
33
35
  can_resize: true
34
36
  }.freeze
35
37
 
36
- MittensUi::Application.Window(app_options) do
37
- MittensUi::Label("Enter Name:", top: 30)
38
-
39
- text_box = MittensUi::Textbox(can_edit: true)
40
-
41
- listbox_options = {
42
- top: 10,
43
- items: ["item_1", "item_2", "item_3"]
44
- }.freeze
45
-
46
- listbox = MittensUi::ListBox(listbox_options)
47
38
 
48
- btn = MittensUi::Button(title: "Click Here")
49
- btn.click {|_b| MittensUi::Alert("Hello #{text_box.text} AND! #{listbox.selected_value} was selected.") }
39
+ require '../lib/mittens_ui'
50
40
 
51
- s = MittensUi::Slider({ start_value: 1, stop_value: 100, initial_value: 30 })
52
- s.slide { |s| puts s.value }
53
-
54
- img_opts = {
55
- tooltip_text: "The Gnome LOGO!",
56
- width: 200,
57
- height: 200,
58
- left: 50
59
- }.freeze
60
-
61
- img = MittensUi::Image("./assets/gnome_logo.png", img_opts)
41
+ app_options = {
42
+ name: "contacts",
43
+ title: "Contacts",
44
+ height: 615,
45
+ width: 570,
46
+ can_resize: true
47
+ }.freeze
62
48
 
63
- switch = MittensUi::Switch(left: 120 )
64
49
 
65
- img.click do
66
- unless switch.hidden?
67
- switch.show
68
- else
69
- switch.hide
70
- end
71
- end
50
+ MittensUi::Application.Window(app_options) do
51
+ add_contact_button = MittensUi::Button.new(title: "Add")
52
+ remove_contact_button = MittensUi::Button.new(title: "Remove")
72
53
 
73
- switch.on do
74
- unless img.hidden?
75
- img.show
76
- else
77
- img.hide
78
- end
79
- end
54
+ buttons = [ add_contact_button, remove_contact_button ]
80
55
 
81
- cb = MittensUi::CheckBox(label: "Enable")
82
- cb.value = "Some Value"
83
- cb.toggle { puts "checkbox was toggled! associated value: #{cb.value}" }
56
+ MittensUi::HeaderBar.new(buttons.map(&:render), title: "Contacts", position: :left).render
84
57
 
85
- link = MittensUi::WebLink("YouTube", "https://www.youtube.com", left: 200)
86
-
87
58
  table_view_options = {
88
59
  headers: ["Name", "Address", "Phone #"],
89
60
  data: [
90
61
  [ "John Appleseed", "123 abc st.", "111-555-3333"],
91
62
  [ "Jane Doe", "122 abc st.", "111-555-4444" ],
92
63
  [ "Bobby Jones", "434 bfef ave.", "442-333-1342"],
64
+ [ "Sara Akigawa", "777 tyo ave.", "932-333-1325"],
93
65
  ],
66
+ top: 20
94
67
  }
95
68
 
96
- table = MittensUi::TableView(table_view_options)
97
- table.add(["Sara Akigawa", "777 tyo ave.", "932-333-1325"], :prepend)
98
-
99
- remove_ct = MittensUi::Button(title: "Remove Contact")
100
- remove_ct.click { |btn| table.remove_selected }
101
-
102
- end
69
+ contacts_table = MittensUi::TableView.new(table_view_options).render
103
70
 
71
+ # FORM
72
+ MittensUi::Label.new("Add Contact", top: 30).render
73
+
74
+ name_tb = MittensUi::Textbox.new(can_edit: true, placeholder: "Name...")
75
+ addr_tb = MittensUi::Textbox.new(can_edit: true, placeholder: "Address...")
76
+ phne_tb = MittensUi::Textbox.new(can_edit: true, placeholder: "Phone #...")
77
+
78
+ tb_list = [name_tb, addr_tb, phne_tb].map(&:render).freeze
79
+
80
+ MittensUi::HBox.new(tb_list, spacing: 10).render
81
+
82
+ # ACTONS
83
+
84
+ add_contact_button.click do |_b|
85
+ if tb_list.map { |tb| tb.text.length > 0 }.all?
86
+ contacts_table.add(tb_list.map {|tb| tb.text })
87
+ tb_list.map {|tb| tb.clear }
88
+ end
89
+ end
90
+
91
+ remove_contact_button.click do |btn|
92
+ removed = contacts_table.remove_selected
93
+
94
+ if removed.size > 0
95
+ MittensUi::Alert.new("#{removed[0]} was removed.").render
96
+ end
97
+ end
98
+
99
+ contacts_table.row_clicked do |data|
100
+ msg = <<~MSG
101
+ Contact Info:
102
+
103
+ Name: #{data[0]}
104
+ Address: #{data[1]}
105
+ Phone #: #{data[2]}
106
+ MSG
107
+
108
+ MittensUi::Alert.new(msg).render
109
+ end
110
+ end
104
111
 
105
112
  ```
106
113
 
@@ -114,11 +121,8 @@ This does require GTK ruby gem which requires `gtk` native dependencies to be co
114
121
  Using dnf:
115
122
  * `$ sudo dnf install ruby ruby-devel cairo cairo-devel gtk3-devel`
116
123
 
117
- #### MacOS
118
-
119
- Using Brew:
120
- * `$ brew install gtk+3`
121
- * `$ brew install cairo`
124
+ #### Ubuntu
125
+ * `sudo apt install build-essential git sqlite3 libsqlite3-dev lib-gtk-3 libcairo2-dev`
122
126
 
123
127
  ## Contributing
124
128
 
data/examples/app.rb CHANGED
@@ -5,10 +5,16 @@ app_options = {
5
5
  title: "Hello World App!",
6
6
  height: 650,
7
7
  width: 550,
8
- can_resize: false
8
+ can_resize: true
9
9
  }.freeze
10
10
 
11
11
  MittensUi::Application.Window(app_options) do
12
+
13
+ MittensUi::HeaderBar([
14
+ MittensUi::Button(title: "headerbar button"),
15
+ MittensUi::CheckBox(label: "Checkbox")
16
+ ], title: "Demo App", position: :left) {}
17
+
12
18
  MittensUi::Label("Enter Name:", top: 30)
13
19
 
14
20
  text_box = MittensUi::Textbox(can_edit: true)
@@ -35,6 +41,8 @@ MittensUi::Application.Window(app_options) do
35
41
 
36
42
  img = MittensUi::Image("./assets/gnome_logo.png", img_opts)
37
43
 
44
+ img2 = MittensUi::Image("./assets/mittens_ui_preview.gif", img_opts)
45
+
38
46
  switch = MittensUi::Switch(left: 220 )
39
47
 
40
48
  img.click do
@@ -0,0 +1,75 @@
1
+ require '../lib/mittens_ui'
2
+
3
+ app_options = {
4
+ name: "contacts",
5
+ title: "Contacts",
6
+ height: 615,
7
+ width: 570,
8
+ can_resize: true
9
+ }.freeze
10
+
11
+
12
+ MittensUi::Application.Window(app_options) do
13
+ add_contact_button = MittensUi::Button.new(title: "Add")
14
+ remove_contact_button = MittensUi::Button.new(title: "Remove")
15
+
16
+ buttons = [ add_contact_button, remove_contact_button ]
17
+
18
+ MittensUi::HeaderBar.new(buttons.map(&:render), title: "Contacts", position: :left).render
19
+
20
+ table_view_options = {
21
+ headers: ["Name", "Address", "Phone #"],
22
+ data: [
23
+ [ "John Appleseed", "123 abc st.", "111-555-3333"],
24
+ [ "Jane Doe", "122 abc st.", "111-555-4444" ],
25
+ [ "Bobby Jones", "434 bfef ave.", "442-333-1342"],
26
+ [ "Sara Akigawa", "777 tyo ave.", "932-333-1325"],
27
+ ],
28
+ top: 20
29
+ }
30
+
31
+ contacts_table = MittensUi::TableView.new(table_view_options).render
32
+
33
+ # FORM
34
+ MittensUi::Label.new("Add Contact", top: 30).render
35
+
36
+ name_tb = MittensUi::Textbox.new(can_edit: true, placeholder: "Name...")
37
+ addr_tb = MittensUi::Textbox.new(can_edit: true, placeholder: "Address...")
38
+ phne_tb = MittensUi::Textbox.new(can_edit: true, placeholder: "Phone #...")
39
+
40
+ tb_list = [name_tb, addr_tb, phne_tb].map(&:render).freeze
41
+
42
+ MittensUi::HBox.new(tb_list, spacing: 10).render
43
+
44
+ fp = MittensUi::FilePicker.new
45
+
46
+ # ACTONS
47
+
48
+ add_contact_button.click do |_b|
49
+ if tb_list.map { |tb| tb.text.length > 0 }.all?
50
+ contacts_table.add(tb_list.map {|tb| tb.text })
51
+ tb_list.map {|tb| tb.clear }
52
+ puts "#{fp.render.path}"
53
+ end
54
+ end
55
+
56
+ remove_contact_button.click do |btn|
57
+ removed = contacts_table.remove_selected
58
+
59
+ if removed.size > 0
60
+ MittensUi::Alert.new("#{removed[0]} was removed.").render
61
+ end
62
+ end
63
+
64
+ contacts_table.row_clicked do |data|
65
+ msg = <<~MSG
66
+ Contact Info:
67
+
68
+ Name: #{data[0]}
69
+ Address: #{data[1]}
70
+ Phone #: #{data[2]}
71
+ MSG
72
+
73
+ MittensUi::Alert.new(msg).render
74
+ end
75
+ end
data/lib/mittens_ui.rb CHANGED
@@ -1,77 +1,25 @@
1
1
  require "mittens_ui/version"
2
- require "mittens_ui/widgets/alert"
3
- require "mittens_ui/widgets/label"
4
- require "mittens_ui/widgets/button"
5
- require "mittens_ui/widgets/textbox"
6
- require "mittens_ui/widgets/listbox"
7
- require "mittens_ui/widgets/slider"
8
- require "mittens_ui/widgets/switch"
9
- require "mittens_ui/widgets/image"
10
- require "mittens_ui/widgets/checkbox"
11
- require "mittens_ui/widgets/web_link"
12
- require "mittens_ui/widgets/table_view"
13
- require "mittens_ui/widgets/loader"
14
-
15
- require "mittens_ui/dialogs/file_dialog"
2
+ require "mittens_ui/alert"
3
+ require "mittens_ui/label"
4
+ require "mittens_ui/button"
5
+ require "mittens_ui/textbox"
6
+ require "mittens_ui/listbox"
7
+ require "mittens_ui/slider"
8
+ require "mittens_ui/switch"
9
+ require "mittens_ui/image"
10
+ require "mittens_ui/checkbox"
11
+ require "mittens_ui/web_link"
12
+ require "mittens_ui/table_view"
13
+ require "mittens_ui/loader"
14
+ require "mittens_ui/header_bar"
15
+ require "mittens_ui/file_picker"
16
+ require "mittens_ui/hbox"
16
17
 
17
18
  require "gtk3"
18
19
 
19
20
  module MittensUi
20
21
  class Error < StandardError; end
21
22
 
22
- def self.Loader(options={})
23
- MittensUi::Widgets::Loader.new(options)
24
- end
25
-
26
- def self.FilePicker
27
- fp = MittensUi::Dialogs::File.new
28
- return fp.path
29
- end
30
-
31
- def self.TableView(options={})
32
- MittensUi::Widgets::TableView.new(options)
33
- end
34
-
35
- def self.WebLink(url, name, options={})
36
- MittensUi::Widgets::WebLink.new(url, name, options)
37
- end
38
-
39
- def self.CheckBox(options={})
40
- MittensUi::Widgets::Checkbox.new(options)
41
- end
42
-
43
- def self.Image(path, options={})
44
- MittensUi::Widgets::Image.new(path, options)
45
- end
46
-
47
- def self.Switch(options = {})
48
- MittensUi::Widgets::Switch.new(options)
49
- end
50
-
51
- def self.Slider(options = {})
52
- MittensUi::Widgets::Slider.new(options)
53
- end
54
-
55
- def self.ListBox(options = {})
56
- MittensUi::Widgets::ListBox.new(options)
57
- end
58
-
59
- def self.Alert(message, options = {})
60
- MittensUi::Widgets::Alert.new(message, options)
61
- end
62
-
63
- def self.Label(text, options = {})
64
- MittensUi::Widgets::Label.new(text, options)
65
- end
66
-
67
- def self.Textbox(options = {})
68
- MittensUi::Widgets::Textbox.new(options)
69
- end
70
-
71
- def self.Button(options = {})
72
- MittensUi::Widgets::Button.new(options)
73
- end
74
-
75
23
  def self.Shutdown
76
24
  $app_window.signal_connect("delete-event") do |_widget|
77
25
  yield
@@ -99,6 +47,11 @@ module MittensUi
99
47
  title = options[:title].nil? ? "Mittens App" : options[:title]
100
48
  can_resize = options[:can_resize].nil? ? true : options[:can_resize]
101
49
 
50
+ app_assets_path = File.join(File.expand_path(File.dirname(__FILE__)), "mittens_ui", "assets") + "/"
51
+ default_icon = app_assets_path + "icon.png"
52
+
53
+ app_icon = options[:icon].nil? ? default_icon : options[:icon]
54
+
102
55
  set_process_name(app_name)
103
56
 
104
57
  gtk_app_name = "org.mittens_ui.#{app_name}"
@@ -115,6 +68,7 @@ module MittensUi
115
68
  $app_window.set_size_request(width, height)
116
69
  $app_window.set_title(title)
117
70
  $app_window.set_resizable(can_resize)
71
+ $app_window.set_icon_from_file(app_icon)
118
72
  $app_window.show_all
119
73
  end
120
74
 
@@ -0,0 +1,32 @@
1
+ module MittensUi
2
+ class Alert
3
+ def initialize(message, options={})
4
+ dialog_options = {
5
+ title: options[:title] || "Alert",
6
+ parent: $app_window,
7
+ flags: [:modal, :destroy_with_parent],
8
+ :buttons => [[Gtk::Stock::OK, :none]]
9
+ }.freeze
10
+
11
+ @alert_dialog = Gtk::Dialog.new(dialog_options)
12
+ @alert_dialog.set_transient_for($app_window)
13
+ @alert_dialog.set_default_width(420)
14
+ @alert_dialog.set_default_height(200)
15
+ @alert_dialog.set_modal(true)
16
+ @alert_dialog.set_resizable(false)
17
+
18
+ message_label = Gtk::Label.new(message)
19
+ message_label.set_margin_top(36)
20
+
21
+ dialog_box = @alert_dialog.content_area
22
+ dialog_box.add(message_label)
23
+ end
24
+
25
+ def render
26
+ @alert_dialog.show_all
27
+ response = @alert_dialog.run
28
+ response == :none ? @alert_dialog.destroy : @alert_dialog.destroy
29
+ end
30
+
31
+ end
32
+ end