Skip to content

Commit 9c2ab7e

Browse files
authored
Merge pull request #3473 from Sigma1912/Gladevcp_calculatorwidget-respect-cursor-position
Some improvements to the Gladevcp/calculator widget
2 parents a14c842 + 78ae6b5 commit 9c2ab7e

2 files changed

Lines changed: 39 additions & 36 deletions

File tree

lib/python/gladevcp/calculator.glade

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,18 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<!-- Generated with glade 3.38.2 -->
2+
<!-- Generated with glade 3.40.0 -->
33
<interface>
44
<requires lib="gtk+" version="3.24"/>
5-
<object class="GtkImage" id="backspace">
6-
<property name="visible">True</property>
7-
<property name="can-focus">False</property>
8-
<property name="icon-name">go-previous</property>
9-
</object>
105
<object class="GtkImage" id="cancel">
116
<property name="visible">True</property>
127
<property name="can-focus">False</property>
138
<property name="icon-name">gtk-cancel</property>
14-
</object>
15-
<object class="GtkImage" id="clr">
16-
<property name="visible">True</property>
17-
<property name="can-focus">False</property>
18-
<property name="icon-name">gtk-clear</property>
9+
<property name="icon_size">3</property>
1910
</object>
2011
<object class="GtkImage" id="ok">
2112
<property name="visible">True</property>
2213
<property name="can-focus">False</property>
2314
<property name="icon-name">gtk-ok</property>
24-
</object>
25-
<object class="GtkImage" id="pi">
26-
<property name="height-request">48</property>
27-
<property name="visible">True</property>
28-
<property name="can-focus">False</property>
29-
<property name="pixbuf">pi.png</property>
15+
<property name="icon_size">3</property>
3016
</object>
3117
<object class="GtkWindow" id="window_calculator">
3218
<property name="can-focus">False</property>
@@ -85,7 +71,6 @@
8571
<property name="visible">True</property>
8672
<property name="can-focus">True</property>
8773
<property name="receives-default">True</property>
88-
<property name="image">clr</property>
8974
<signal name="clicked" handler="on_CLR_clicked" swapped="no"/>
9075
</object>
9176
<packing>
@@ -108,10 +93,10 @@
10893
</child>
10994
<child>
11095
<object class="GtkButton" id="Pi">
96+
<property name="label" translatable="yes">Pi</property>
11197
<property name="visible">True</property>
11298
<property name="can-focus">True</property>
11399
<property name="receives-default">True</property>
114-
<property name="image">pi</property>
115100
<signal name="clicked" handler="on_Pi_clicked" swapped="no"/>
116101
</object>
117102
<packing>
@@ -281,7 +266,6 @@
281266
<property name="visible">True</property>
282267
<property name="can-focus">True</property>
283268
<property name="receives-default">True</property>
284-
<property name="image">backspace</property>
285269
<signal name="clicked" handler="on_Backspace_clicked" swapped="no"/>
286270
</object>
287271
<packing>
@@ -317,7 +301,6 @@
317301
</child>
318302
<child>
319303
<object class="GtkButton" id="cancel_button">
320-
<property name="label" translatable="yes">_Cancel_</property>
321304
<property name="visible">True</property>
322305
<property name="can-focus">True</property>
323306
<property name="receives-default">True</property>
@@ -332,7 +315,6 @@
332315
</child>
333316
<child>
334317
<object class="GtkButton" id="ok_button">
335-
<property name="label" translatable="yes">_Ok</property>
336318
<property name="visible">True</property>
337319
<property name="can-focus">True</property>
338320
<property name="receives-default">True</property>

lib/python/gladevcp/calculatorwidget.py

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ def __init__( self, *a, **kw ):
8787
self.wTree.connect_signals( dic )
8888
self.entry = self.wTree.get_object( "displayText" )
8989
self.entry.modify_font( Pango.FontDescription( self.font ) )
90+
self.wTree.get_object( "Backspace" ).set_label("\u232B")
91+
self.wTree.get_object( "Pi" ).set_label("\u03c0")
92+
self.wTree.get_object( "Pi" ).set_name("pi-symbol")
9093
self.calc_box = self.wTree.get_object( "calc_box" )
9194
self.calc_box.set_vexpand(True)
9295
self.calc_box.set_hexpand(True)
@@ -98,9 +101,12 @@ def __init__( self, *a, **kw ):
98101
# Use CSS style for buttons
99102
screen = Gdk.Screen.get_default()
100103
provider = Gtk.CssProvider()
101-
style_context = Gtk.StyleContext()
104+
self.calc_box.set_name("calc_widget")
105+
style_context = self.calc_box.get_style_context()
102106
style_context.add_provider_for_screen(screen, provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
103-
css = b"button {padding: 0;}"
107+
css = b"""
108+
#calc_widget {font-size: 15px;}
109+
#pi-symbol {font-size: 18px; font-family: sans-serif;}"""
104110
provider.load_from_data(css)
105111

106112
def num_pad_only( self, value ):
@@ -152,7 +158,7 @@ def set_value( self, value ):
152158
def get_value( self ):
153159
self.compute()
154160
try:
155-
value = self.wTree.get_object( "displayText" ).get_text()
161+
value = self.entry.get_text()
156162
return locale.atof( value )
157163
except:
158164
return None
@@ -200,15 +206,15 @@ def compute( self ):
200206
b = b.rstrip( locale.localeconv()["decimal_point"] )
201207
except:
202208
b = "Error"
203-
self.wTree.get_object( "displayText" ).set_text( b )
204-
self.eval_string = b + " " # add space to indicate that calculation was last
209+
self.entry.set_text( b )
210+
self.entry.set_position(len(self.eval_string))
205211

206212
def delete( self ):
207213
self.eval_string = ''
208-
self.wTree.get_object( "displayText" ).set_text( "" )
214+
self.entry.set_text( "" )
209215

210216
def displayOperand( self, i ):
211-
if self.wTree.get_object( "displayText" ).get_selection_bounds():
217+
if self.entry.get_selection_bounds():
212218
self.delete()
213219
if "Error" in self.eval_string:
214220
self.eval_string = ""
@@ -217,9 +223,14 @@ def displayOperand( self, i ):
217223
if i not in "+-*/" and self.eval_string != "":
218224
if self.eval_string[-1] == " ":
219225
self.eval_string = ""
220-
221-
self.eval_string = self.eval_string + i
222-
self.wTree.get_object( "displayText" ).set_text( str( self.eval_string ) )
226+
cursor_pos = self.entry.get_position()
227+
self.eval_string = self.eval_string[:cursor_pos] + i + self.eval_string[cursor_pos:]
228+
self.entry.set_text( str( self.eval_string ) )
229+
if i == 'Pi':
230+
cursor_move = 2
231+
else:
232+
cursor_move = 1
233+
self.entry.set_position(cursor_pos + cursor_move)
223234

224235
def displayText_changed( self, widget ):
225236
self.eval_string = widget.get_text()
@@ -232,14 +243,24 @@ def displayClr( self, widget ):
232243
self.delete()
233244

234245
def displayBackspace( self, widget ):
235-
text = self.wTree.get_object( "displayText" ).get_text()
246+
text = self.entry.get_text()
236247
if(text == "Error"):
237248
self.delete()
238249
else:
239-
if text[-2:] == "Pi":
240-
self.wTree.get_object( "displayText" ).set_text(text[:-2])
250+
cursor_pos = self.entry.get_position()
251+
text_left = self.eval_string[:cursor_pos]
252+
text_right = self.eval_string[cursor_pos:]
253+
if text_left[-2:] == "Pi":
254+
self.entry.set_text(text_left[:-2] + text_right)
255+
cursor_move = -2
256+
elif text_left[-1:] == "P":
257+
self.entry.set_text(text_left[:-1] + text_right[1:])
258+
cursor_move = -1
241259
else:
242-
self.wTree.get_object( "displayText" ).set_text(text[:-1])
260+
self.entry.set_text(text_left[:-1] + text_right)
261+
cursor_move = -1
262+
if cursor_pos > 0:
263+
self.entry.set_position(cursor_pos + cursor_move)
243264

244265
def displayLeftBracket( self, widget ):
245266
self.displayOperand( "(" )

0 commit comments

Comments
 (0)