/
core.clj
111 lines (89 loc) · 3.22 KB
/
core.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
(ns tallyho.core
(:use seesaw.core
[clojure.string :only [join]])
(:import [javax.swing JOptionPane JTable]
javax.swing.table.DefaultTableModel
java.awt.event.MouseEvent)
(:gen-class))
(native!)
(def table-model
(proxy [DefaultTableModel] [(to-array-2d []) (object-array ["name" "score"])]
(isCellEditable [row column] false)))
(defn calculate-score [[calc & digits :as all] old]
(let [old (Integer/parseInt (str old))
digits (when digits (Integer/parseInt (join digits)))]
(cond
(= \+ calc) (+ old digits)
(= \- calc) (- old digits)
:else (+ old (Integer/parseInt (join all))))))
(defn validate [s]
(when-not (empty? s) s))
(defn calc-new-score [old]
(when-let [new-score
(validate
(JOptionPane/showInputDialog
"Enter -number to decrease score.\nEnter either +number or number to increase score."))]
(or
(try (calculate-score new-score old)
(catch NumberFormatException e))
(do (alert "Enter a real number, dude.")
(recur old)))))
(defn on-table-click
[e]
(when (and (= (.getButton e) MouseEvent/BUTTON1) (= 2 (.getClickCount e)))
(let [s-table (to-widget e)
row (.rowAtPoint s-table (.getPoint e))]
(when (>= row 0)
(when-let [new-score (calc-new-score (.getValueAt s-table row 1))]
(.setValueAt table-model new-score row 1))))))
(declare score-table)
(defn add-user [e]
(when-let [user (validate (JOptionPane/showInputDialog "Enter the player's name."))]
(.addRow
table-model
(object-array [user "0"]))))
(defn delete-user [e]
(when-let [row (selection score-table)]
(.removeRow table-model row)))
(defn confirm []
(= JOptionPane/YES_OPTION
(JOptionPane/showConfirmDialog
score-table
"Are you sure?" "Seriously?"
JOptionPane/YES_NO_OPTION)))
(defn reset-scores [e]
(when (confirm)
(doseq [row (range 0 (.getRowCount score-table))]
(.setValueAt table-model 0 row 1))))
(defn reset-game [e]
(when (confirm)
(.setRowCount table-model 0)))
(def add-user-action (action :handler add-user :name "Add Player"))
(def delete-user-action (action :handler delete-user :name "Delete Player"))
(def reset-scores-action (action :handler reset-scores :name "Reset Scores"))
(def reset-game-action (action :handler reset-game :name "Remove All Players"))
(def score-table
(doto
(table :model table-model
:listen [:mouse-clicked on-table-click]
:popup (fn [e] [add-user-action delete-user-action
reset-scores-action reset-game-action])
:font "ARIAL-PLAIN-14")
(.setFillsViewportHeight true)
(.setRowHeight 20)))
(def scroll-pane (scrollable score-table))
(def menus (menubar :items
[(menu :text "Tallyho"
:items [add-user-action delete-user-action
reset-scores-action reset-game-action])]))
(def main-panel
(mig-panel
:constraints ["fill, ins 0"]
:items [[scroll-pane "grow"]]))
(defn -main [& args]
(invoke-now
(frame
:title "TallyHOOOOOOO"
:content main-panel
:on-close :exit
:menubar menus)))