Implemented the setLineText helper function
[resumebuilder.git] / resumebuilder.go
1 package main
2
3 import (
4 "fmt"
5 "os"
6 "strconv"
7
8 "github.com/gotk3/gotk3/gtk"
9 )
10
11 type Applicant struct {
12 FirstName string
13 LastName string
14 DateOfBirth Date
15 Sex Sex
16 Address string
17 ContactNo string
18 Email string
19 Education []Education
20 }
21
22 type Date struct {
23 Year uint
24 Month uint
25 Day uint
26 }
27
28 type Education struct {
29 Qualification string
30 Institution string
31 YearOfPassing uint
32 GradeOrPercentage string
33 }
34
35 type Sex int
36
37 var ui *gtk.Builder
38 var selectedsex Sex
39 var selecteddate Date
40
41 const (
42 Male Sex = 1
43 Female = 2
44 Other = 3
45 )
46
47 /* func SaveToJson(a *Applicant) {
48 b, err := json.Marshal(a)
49
50 if err != nil {
51 fmt.Println(err.Error())
52 os.Exit(2)
53 }
54 err = ioutil.WriteFile("test.json", b, 0644)
55 if err != nil {
56 fmt.Println(err.Error())
57 os.Exit(3)
58 }
59 } */
60
61 func setLineText(fieldname string, buf string) {
62 obj, err := ui.GetObject(fieldname)
63 if err != nil {
64 return
65 }
66 field, ok := obj.(*gtk.Entry)
67 if !ok {
68 return
69 }
70 field.SetText(buf)
71 }
72
73 func getLineText(fieldname string) (string, error) {
74 obj, err := ui.GetObject(fieldname)
75 if err != nil {
76 return "", err
77 }
78 field, ok := obj.(*gtk.Entry)
79 if !ok {
80 return "", err
81 }
82 fieldstr, err := field.GetText()
83 if err != nil {
84 return "", err
85 }
86 return fieldstr, nil
87 }
88
89 func getMultilineText(fieldname string) (string, error) {
90 obj, err := ui.GetObject(fieldname)
91 if err != nil {
92 return "", err
93 }
94 fieldctl, ok := obj.(*gtk.TextView)
95 if !ok {
96 return "", err
97 }
98 textbuf, err := fieldctl.GetBuffer()
99 if err != nil {
100 return "", err
101 }
102 start, end := textbuf.GetBounds()
103 textstr, err := textbuf.GetText(start, end, true)
104 if err != nil {
105 return "", err
106 }
107 return textstr, nil
108 }
109
110 func getBasicDetails() (*Applicant, error) {
111 // Retrieve all the fields.
112
113 firstname, err := getLineText("FirstName")
114 if err != nil {
115 return nil, err
116 }
117 lastname, err := getLineText("LastName")
118 if err != nil {
119 return nil, err
120 }
121
122 address, err := getMultilineText("Address")
123 if err != nil {
124 return nil, err
125 }
126
127 contact, err := getLineText("ContactNumber")
128 if err != nil {
129 return nil, err
130 }
131 email, err := getLineText("Email")
132 if err != nil {
133 return nil, err
134 }
135
136 // Store the contents in Applicant object
137 var applicant = new(Applicant)
138
139 applicant.FirstName = firstname
140 applicant.LastName = lastname
141 applicant.DateOfBirth = selecteddate
142 applicant.Sex = selectedsex
143 applicant.Address = address
144 applicant.ContactNo = contact
145 applicant.Email = email
146
147 return applicant, nil
148 }
149
150 func getWindow() (*gtk.Window, error) {
151 obj, err := ui.GetObject("MainWindow")
152 if err != nil {
153 fmt.Println(err.Error())
154 return nil, err
155 }
156 wnd, ok := obj.(*gtk.Window)
157 if !ok {
158 return nil, err
159 }
160 return wnd, nil
161 }
162
163 func loadMain() {
164 gtk.Init(nil)
165 var err error
166 ui, err = gtk.BuilderNew()
167 if err != nil {
168 fmt.Println(err.Error())
169 os.Exit(1)
170 }
171 asset, err := Asset("resources/resumebuilder.glade")
172 if err != nil {
173 fmt.Println(err.Error())
174 os.Exit(1)
175 }
176 ui.AddFromString(string(asset))
177 ui.ConnectSignals(map[string]interface{}{"SexMaleSelected": sexMaleSelected,
178 "SexFemaleSelected": sexFemaleSelected, "SexOtherSelected": sexOtherSelected,
179 "SaveButtonClicked": saveButtonClicked, "DoBSelected": doBSelected,
180 "AddEducationClicked": addEducationClicked})
181
182 wnd, err := getWindow()
183 if err != nil {
184 os.Exit(1)
185 }
186
187 wnd.SetTitle("Resume Builder")
188 wnd.ShowAll()
189 selectedsex = Male
190
191 wnd.Connect("destroy", func() {
192 gtk.MainQuit()
193 })
194 gtk.Main()
195 }
196
197 func sexMaleSelected(male *gtk.RadioButton) {
198 if male.GetActive() {
199 selectedsex = Male
200 }
201 }
202
203 func sexFemaleSelected(female *gtk.RadioButton) {
204 if female.GetActive() {
205 selectedsex = Female
206 }
207 }
208
209 func sexOtherSelected(other *gtk.RadioButton) {
210 if other.GetActive() {
211 selectedsex = Other
212 }
213 }
214
215 func doBSelected(dob *gtk.Calendar) {
216 selecteddate.Year, selecteddate.Month, selecteddate.Day = dob.GetDate()
217 }
218
219 func getEducationFields() (*Education, error) {
220 ed := new(Education)
221 qual, err := getLineText("QualificationTitle")
222 if err != nil {
223 return nil, err
224 }
225 inst, err := getLineText("InstitutionName")
226 if err != nil {
227 return nil, err
228 }
229 yearp, err := getLineText("YearPassing")
230 if err != nil {
231 return nil, err
232 }
233 year, err := strconv.Atoi(yearp)
234 if err != nil {
235 return nil, err
236 }
237 gradep, err := getLineText("GradeOrPercentag")
238 if err != nil {
239 return nil, err
240 }
241 ed.Qualification = qual
242 ed.Institution = inst
243 ed.YearOfPassing = uint(year)
244 ed.GradeOrPercentage = gradep
245
246 return ed, nil
247 }
248
249 func addEducationClicked() {
250 ed, err := getEducationFields()
251 if err != nil {
252 return
253 }
254 lstore, err := ui.GetObject("EducationStore")
255 if err != nil {
256 return
257 }
258 edustore, ok := lstore.(*gtk.ListStore)
259 if !ok {
260 return
261 }
262 iter := edustore.Append()
263 edustore.SetValue(iter, 0, ed.Qualification)
264 edustore.SetValue(iter, 1, ed.Institution)
265 edustore.SetValue(iter, 2, ed.YearOfPassing)
266 edustore.SetValue(iter, 3, ed.GradeOrPercentage)
267
268 setLineText("QualificationTitle", "")
269 setLineText("InstitutionName", "")
270 setLineText("YearPassing", "")
271 setLineText("GradeOrPercentag", "")
272 }
273
274 func saveButtonClicked() {
275 a, err := getBasicDetails()
276 if err != nil {
277 fmt.Println(err.Error())
278 os.Exit(1)
279 }
280 fmt.Println(*a)
281 }
282
283 func main() {
284 loadMain()
285 }