grumblr 2.0.1 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog +7 -0
- data/VERSION +1 -1
- data/lib/grumblr/ui.rb +184 -113
- metadata +2 -2
data/Changelog
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
+
version 2.1.0 (2009-09-08)
|
2
|
+
|
3
|
+
* Removed labels for more efficient estate usage.
|
4
|
+
* Moved markdown checkbox to common place.
|
5
|
+
* Reduced minimum (default) window size.
|
6
|
+
|
1
7
|
version 2.0.1 (2009-08-26)
|
2
8
|
|
3
9
|
* Added Changelog file.
|
10
|
+
* Added external VERSION
|
4
11
|
* Tags support. Separated by either comma or space.
|
5
12
|
|
6
13
|
version 2.0.0 (2009-08-24)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0
|
1
|
+
2.1.0
|
data/lib/grumblr/ui.rb
CHANGED
@@ -14,19 +14,18 @@ module Grumblr
|
|
14
14
|
super Gtk::Window::TOPLEVEL
|
15
15
|
|
16
16
|
filename = File.join(Grumblr::DATA_ROOT, 'pixmaps', 'grumblr.svg')
|
17
|
-
self.logo = Gdk::Pixbuf.new
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
self.signal_connect(:check_resize) do |widget|
|
17
|
+
self.logo = Gdk::Pixbuf.new(filename, 128, 128)
|
18
|
+
|
19
|
+
set_size_request 440, 320
|
20
|
+
set_allow_shrink false
|
21
|
+
set_title 'Grumblr'
|
22
|
+
set_icon self.logo
|
23
|
+
set_default_width $cfg.get(:window_width).to_i
|
24
|
+
set_default_height $cfg.get(:window_height).to_i
|
25
|
+
move $cfg.get(:window_x_pos).to_i, $cfg.get(:window_y_pos).to_i
|
26
|
+
signal_connect(:destroy) { quit }
|
27
|
+
signal_connect(:delete_event) { minimize }
|
28
|
+
signal_connect(:check_resize) do |widget|
|
30
29
|
x, y = widget.position
|
31
30
|
w, h = widget.size
|
32
31
|
$cfg.set :window_x_pos, x
|
@@ -67,66 +66,59 @@ module Grumblr
|
|
67
66
|
#
|
68
67
|
# Text page
|
69
68
|
#
|
70
|
-
@text_title = Gtk::
|
71
|
-
|
72
|
-
@format = Gtk::CheckButton.new '_markdown'
|
73
|
-
@format.set_active $cfg.get(:format_markdown)
|
74
|
-
@format.signal_connect(:toggled) do |widget|
|
75
|
-
$cfg.set :format_markdown, widget.active?
|
76
|
-
end
|
77
|
-
|
78
|
-
label = Gtk::Label.new 'Body'
|
69
|
+
@text_title = Gtk::LabeledEntry.new 'Title (optional)'
|
79
70
|
|
80
|
-
|
81
|
-
box.pack_start label, false
|
82
|
-
box.pack_start @format, false
|
71
|
+
@text_body = Gtk::LabeledTextView.new 'Body'
|
83
72
|
|
84
73
|
page = Gtk::VBox.new false, 4
|
85
74
|
page.set_border_width 8
|
86
|
-
page.
|
87
|
-
page.pack_start
|
88
|
-
page.pack_start multiline_entry(:text_body), true
|
75
|
+
page.pack_start @text_title, false
|
76
|
+
page.pack_start scrollable(@text_body), true
|
89
77
|
|
90
78
|
@notebook.add_page_with_tab page, 'Text'
|
91
79
|
|
92
80
|
#
|
93
81
|
# Link page
|
94
82
|
#
|
95
|
-
@link_url = Gtk::
|
96
|
-
@link_name = Gtk::
|
97
|
-
link_description =
|
83
|
+
@link_url = Gtk::LabeledEntry.new 'URL'
|
84
|
+
@link_name = Gtk::LabeledEntry.new 'Name (optional)'
|
85
|
+
@link_description = Gtk::LabeledTextView.new 'Description (optional)'
|
86
|
+
scroll = Gtk::ScrolledWindow.new
|
87
|
+
scroll.set_shadow_type Gtk::SHADOW_IN
|
88
|
+
scroll.set_policy Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC
|
89
|
+
scroll.add @link_description
|
98
90
|
|
99
91
|
page = Gtk::VBox.new false, 4
|
100
92
|
page.set_border_width 8
|
101
|
-
page.
|
102
|
-
page.
|
103
|
-
page.
|
93
|
+
page.pack_start @link_url, false
|
94
|
+
page.pack_start @link_name, false
|
95
|
+
page.pack_start scroll, true
|
104
96
|
|
105
97
|
@notebook.add_page_with_tab page, 'Link'
|
106
98
|
|
107
99
|
#
|
108
100
|
# Chat page
|
109
101
|
#
|
110
|
-
@chat_title = Gtk::
|
111
|
-
chat_conversation =
|
102
|
+
@chat_title = Gtk::LabeledEntry.new 'Title (optional)'
|
103
|
+
@chat_conversation = Gtk::LabeledTextView.new 'Conversation'
|
112
104
|
|
113
105
|
page = Gtk::VBox.new false, 4
|
114
106
|
page.set_border_width 8
|
115
|
-
page.
|
116
|
-
page.
|
107
|
+
page.pack_start @chat_title, false
|
108
|
+
page.pack_start scrollable(@chat_conversation), true
|
117
109
|
|
118
110
|
@notebook.add_page_with_tab page, 'Chat'
|
119
111
|
|
120
112
|
#
|
121
113
|
# Quote page
|
122
114
|
#
|
123
|
-
@quote_source = Gtk::
|
124
|
-
quote_quote =
|
115
|
+
@quote_source = Gtk::LabeledEntry.new 'Source (optional)'
|
116
|
+
@quote_quote = Gtk::LabeledTextView.new 'Quote'
|
125
117
|
|
126
118
|
page = Gtk::VBox.new false, 4
|
127
119
|
page.set_border_width 8
|
128
|
-
page.
|
129
|
-
page.
|
120
|
+
page.pack_start scrollable(@quote_quote), true
|
121
|
+
page.pack_start @quote_source, false
|
130
122
|
|
131
123
|
@notebook.add_page_with_tab page, 'Quote'
|
132
124
|
|
@@ -137,17 +129,17 @@ module Grumblr
|
|
137
129
|
filter.set_name "Images"
|
138
130
|
filter.add_mime_type "image/*"
|
139
131
|
|
140
|
-
@photo_source = Gtk::Entry.new
|
141
|
-
@photo_click_through_url = Gtk::Entry.new
|
142
132
|
photo_data = file_chooser_button :photo_data, filter
|
143
|
-
|
133
|
+
@photo_source = Gtk::LabeledEntry.new 'Source'
|
134
|
+
@photo_click_through_url = Gtk::LabeledEntry.new 'Link (optional)'
|
135
|
+
@photo_caption = Gtk::LabeledTextView.new 'Caption'
|
144
136
|
|
145
137
|
page = Gtk::VBox.new false, 4
|
146
138
|
page.set_border_width 8
|
147
|
-
page.
|
148
|
-
page.
|
149
|
-
page.
|
150
|
-
page.
|
139
|
+
page.pack_start photo_data, false
|
140
|
+
page.pack_start @photo_source, false
|
141
|
+
page.pack_start scrollable(@photo_caption), true
|
142
|
+
page.pack_start @photo_click_through_url, false
|
151
143
|
|
152
144
|
@notebook.add_page_with_tab page, 'Photo'
|
153
145
|
|
@@ -160,12 +152,12 @@ module Grumblr
|
|
160
152
|
filter.add_mime_type "audio/*"
|
161
153
|
|
162
154
|
audio_data = file_chooser_button :audio_data, filter
|
163
|
-
audio_caption =
|
155
|
+
@audio_caption = Gtk::LabeledTextView.new 'Caption (optional)'
|
164
156
|
|
165
157
|
page = Gtk::VBox.new false, 4
|
166
158
|
page.set_border_width 8
|
167
|
-
page.
|
168
|
-
page.
|
159
|
+
page.pack_start audio_data, false
|
160
|
+
page.pack_start scrollable(@audio_caption), true
|
169
161
|
|
170
162
|
@notebook.add_page_with_tab page, 'Audio'
|
171
163
|
end
|
@@ -173,8 +165,8 @@ module Grumblr
|
|
173
165
|
#
|
174
166
|
# Video page
|
175
167
|
#
|
176
|
-
@video_embed = Gtk::
|
177
|
-
video_caption =
|
168
|
+
@video_embed = Gtk::LabeledEntry.new 'Embed code / YouTube link'
|
169
|
+
@video_caption = Gtk::LabeledTextView.new 'Caption (optional)'
|
178
170
|
|
179
171
|
page = Gtk::VBox.new false, 4
|
180
172
|
page.set_border_width 8
|
@@ -185,14 +177,14 @@ module Grumblr
|
|
185
177
|
filter.add_mime_type "video/*"
|
186
178
|
|
187
179
|
video_data = file_chooser_button :video_data, filter
|
188
|
-
@video_title = Gtk::
|
180
|
+
@video_title = Gtk::LabeledEntry.new 'Title (optional)'
|
189
181
|
|
190
|
-
page.
|
191
|
-
page.
|
182
|
+
page.pack_start video_data, false
|
183
|
+
page.pack_start @video_title, true
|
192
184
|
end
|
193
185
|
|
194
|
-
page.
|
195
|
-
page.
|
186
|
+
page.pack_start @video_embed, false
|
187
|
+
page.pack_start scrollable(@video_caption), true
|
196
188
|
|
197
189
|
@notebook.add_page_with_tab page, 'Video'
|
198
190
|
|
@@ -266,13 +258,21 @@ module Grumblr
|
|
266
258
|
post
|
267
259
|
end
|
268
260
|
|
269
|
-
@tags = Gtk::
|
270
|
-
|
261
|
+
@tags = Gtk::LabeledEntry.new 'space/comma separated tags'
|
262
|
+
|
263
|
+
@format = Gtk::CheckButton.new '_markdown'
|
264
|
+
@format.set_active $cfg.get(:format_markdown)
|
265
|
+
@format.signal_connect(:toggled) do |widget|
|
266
|
+
$cfg.set :format_markdown, widget.active?
|
267
|
+
end
|
268
|
+
format_box = Gtk::HBox.new false, 8
|
269
|
+
format_box.pack_start @format, false
|
270
|
+
|
271
271
|
button_box = Gtk::HBox.new false, 4
|
272
272
|
button_box.pack_start clear_button, false
|
273
273
|
button_box.pack_start @private_button, false
|
274
|
-
button_box.pack_start Gtk::Label.new('Tags'), false
|
275
274
|
button_box.pack_start @tags, true
|
275
|
+
button_box.pack_start format_box, false
|
276
276
|
button_box.pack_start submit_button, true
|
277
277
|
|
278
278
|
##
|
@@ -356,22 +356,6 @@ module Grumblr
|
|
356
356
|
instance_variable_set "@#{name}", button
|
357
357
|
end
|
358
358
|
|
359
|
-
def multiline_entry(name)
|
360
|
-
instance_variable_set "@#{name}", Gtk::TextBuffer.new
|
361
|
-
|
362
|
-
view = Gtk::TextView.new
|
363
|
-
view.set_buffer instance_variable_get("@#{name}")
|
364
|
-
view.set_wrap_mode Gtk::TextTag::WRAP_WORD
|
365
|
-
view.set_right_margin 5
|
366
|
-
view.set_left_margin 5
|
367
|
-
|
368
|
-
window = Gtk::ScrolledWindow.new
|
369
|
-
window.set_shadow_type Gtk::SHADOW_IN
|
370
|
-
window.set_policy Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC
|
371
|
-
window.add view
|
372
|
-
window.show_all
|
373
|
-
end
|
374
|
-
|
375
359
|
def reset_fields_for(fieldset, message_type)
|
376
360
|
for key in fieldset[message_type]
|
377
361
|
name = "@#{message_type}_#{key.gsub(/-/,'_')}"
|
@@ -388,6 +372,15 @@ module Grumblr
|
|
388
372
|
end
|
389
373
|
@tags.clear
|
390
374
|
end
|
375
|
+
|
376
|
+
def scrollable(widget)
|
377
|
+
scroll = Gtk::ScrolledWindow.new
|
378
|
+
scroll.set_shadow_type Gtk::SHADOW_IN
|
379
|
+
scroll.set_policy Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC
|
380
|
+
scroll.add widget
|
381
|
+
scroll.show_all
|
382
|
+
end
|
383
|
+
|
391
384
|
end
|
392
385
|
|
393
386
|
class MessageDialog < Gtk::Dialog
|
@@ -561,50 +554,128 @@ module Grumblr
|
|
561
554
|
end
|
562
555
|
end
|
563
556
|
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
557
|
+
|
558
|
+
module Gtk
|
559
|
+
|
560
|
+
DARK = Gdk::Color.parse("#000000")
|
561
|
+
PALE = Gdk::Color.parse("#999999")
|
562
|
+
|
563
|
+
class Box
|
564
|
+
def pack_with_label(text, widget, expand = false)
|
565
|
+
label = Gtk::Label.new text, true
|
566
|
+
label.set_alignment 0.0, 0.5
|
567
|
+
label.set_mnemonic_widget widget
|
568
|
+
self.pack_start label, false
|
569
|
+
self.pack_start widget, expand
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|
573
|
+
class CheckButton
|
574
|
+
def get_value
|
575
|
+
self.active?
|
576
|
+
end
|
571
577
|
end
|
572
|
-
end
|
573
578
|
|
574
|
-
class
|
575
|
-
|
576
|
-
def clear
|
577
|
-
self.set_text ''
|
579
|
+
class ComboBox
|
580
|
+
alias :get_value :active_text
|
578
581
|
end
|
579
|
-
end
|
580
582
|
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
583
|
+
class Entry
|
584
|
+
alias :get_value :text
|
585
|
+
def clear
|
586
|
+
self.set_text ''
|
587
|
+
end
|
588
|
+
end
|
589
|
+
|
590
|
+
module FileChooser
|
591
|
+
alias :get_value :filename
|
592
|
+
alias :clear :unselect_all
|
593
|
+
end
|
585
594
|
|
586
|
-
class
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
595
|
+
class Notebook
|
596
|
+
def add_page_with_tab(page, text)
|
597
|
+
filename = File.join(Grumblr::DATA_ROOT, 'pixmaps', '%s.bmp' % text.downcase)
|
598
|
+
icon = Gtk::Image.new filename
|
599
|
+
icon.set_padding 4, 0
|
591
600
|
|
592
|
-
|
593
|
-
|
594
|
-
|
601
|
+
label = Gtk::Label.new '_' + text, true
|
602
|
+
label.set_alignment 0.0, 0.5
|
603
|
+
label.set_padding 2, 2
|
595
604
|
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
605
|
+
box = Gtk::HBox.new false, 2
|
606
|
+
box.pack_start icon, false
|
607
|
+
box.pack_start label, true
|
608
|
+
box.show_all
|
600
609
|
|
601
|
-
|
610
|
+
self.append_page_menu page, box, label
|
611
|
+
end
|
602
612
|
end
|
603
|
-
end
|
604
613
|
|
605
|
-
class
|
606
|
-
|
607
|
-
|
608
|
-
|
614
|
+
class TextView
|
615
|
+
def get_value
|
616
|
+
self.buffer.get_text
|
617
|
+
end
|
618
|
+
def clear
|
619
|
+
self.buffer.set_text ''
|
620
|
+
end
|
609
621
|
end
|
622
|
+
|
623
|
+
class LabeledEntry < Entry
|
624
|
+
def initialize(label)
|
625
|
+
@label = label
|
626
|
+
super()
|
627
|
+
self.modify_text Gtk::STATE_NORMAL, PALE
|
628
|
+
self.set_text @label
|
629
|
+
self.signal_connect(:focus_in_event) do |widget, type|
|
630
|
+
if widget.text == @label
|
631
|
+
widget.modify_text Gtk::STATE_NORMAL, DARK
|
632
|
+
widget.set_text ''
|
633
|
+
end
|
634
|
+
false
|
635
|
+
end
|
636
|
+
self.signal_connect(:focus_out_event) do |widget, type|
|
637
|
+
if widget.text == ''
|
638
|
+
widget.modify_text Gtk::STATE_NORMAL, PALE
|
639
|
+
widget.set_text @label
|
640
|
+
end
|
641
|
+
false
|
642
|
+
end
|
643
|
+
self.show
|
644
|
+
end
|
645
|
+
def get_value
|
646
|
+
value = self.text
|
647
|
+
value == @label ? "" : value
|
648
|
+
end
|
649
|
+
end
|
650
|
+
|
651
|
+
class LabeledTextView < TextView
|
652
|
+
def initialize(label)
|
653
|
+
@label = label
|
654
|
+
super()
|
655
|
+
self.set_wrap_mode Gtk::TextTag::WRAP_WORD
|
656
|
+
self.set_right_margin 5
|
657
|
+
self.set_left_margin 5
|
658
|
+
self.modify_text Gtk::STATE_NORMAL, PALE
|
659
|
+
self.buffer.set_text @label
|
660
|
+
self.signal_connect(:focus_in_event) do |widget, type|
|
661
|
+
if widget.buffer.text == @label
|
662
|
+
widget.modify_text Gtk::STATE_NORMAL, DARK
|
663
|
+
widget.buffer.set_text ''
|
664
|
+
end
|
665
|
+
false
|
666
|
+
end
|
667
|
+
self.signal_connect(:focus_out_event) do |widget, type|
|
668
|
+
if widget.buffer.text == ''
|
669
|
+
widget.modify_text Gtk::STATE_NORMAL, PALE
|
670
|
+
widget.buffer.set_text @label
|
671
|
+
end
|
672
|
+
false
|
673
|
+
end
|
674
|
+
end
|
675
|
+
def get_value
|
676
|
+
value = self.buffer.get_text
|
677
|
+
value == @label ? "" : value
|
678
|
+
end
|
679
|
+
end
|
680
|
+
|
610
681
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grumblr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Philippov
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-08
|
12
|
+
date: 2009-09-08 00:00:00 +07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|