/
menu_gui.clj
76 lines (63 loc) · 2.11 KB
/
menu_gui.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
(ns snakejure.menu-gui
(:import (javax.swing JFrame JList JOptionPane)
(java.awt.event KeyAdapter KeyEvent)
(java.awt Dimension)
(org.apache.log4j Logger FileAppender SimpleLayout Level))
(:use [snakejure.level-loader :only (get-levels-map)]
[snakejure.game-gui :only (create-game-panel)]))
(def width 100)
(def height 400)
(def *log-file* "log.txt")
(def *log-level* (Level/TRACE))
(defn init-logging
"Inits logging to log all level changes to *log-file*"
[]
(doto (Logger/getRootLogger)
(.addAppender (FileAppender. (SimpleLayout.) *log-file* false))
(.setLevel *log-level*)))
(defn- create-poor-jlist []
"Creates Jlist without any listeners."
(let [level-names (apply sorted-set (keys (get-levels-map)))]
(doto (JList. (to-array level-names))
(.setSelectedIndex 0))))
(defn- switch-panel [frame panel]
(doto (.getContentPane frame)
(.removeAll)
(.add panel)
(.revalidate))
(doto frame
(.pack)
(.setLocationRelativeTo nil))
(.requestFocus panel))
(declare create-jlist)
(defn end-fn [frame name result]
(case result
:win (JOptionPane/showMessageDialog frame (str "You win level " name))
:lose (JOptionPane/showMessageDialog frame (str "You lose level " name))
nil)
(switch-panel frame (create-jlist frame)))
(defn- create-key-listener [frame]
(proxy [KeyAdapter] []
(keyPressed [e]
(when (= (.getKeyCode e) (KeyEvent/VK_ENTER))
(let [name (.getSelectedValue (.getSource e))
levels-map (get-levels-map)
game-panel (create-game-panel ((levels-map name))
(partial end-fn frame name))]
(switch-panel frame game-panel))))))
(defn- create-jlist [frame]
(let [jlist (create-poor-jlist)
key-listener (create-key-listener frame)]
(doto jlist
(.addKeyListener key-listener)
(.setPreferredSize (Dimension. width height)))))
(defn show-menu []
(let [frame (JFrame. "Snakejure")
list (create-jlist frame)]
(init-logging)
(doto frame
(.add list)
(.setDefaultCloseOperation (JFrame/EXIT_ON_CLOSE))
(.pack)
(.setLocationRelativeTo nil)
(.setVisible true))))