Passed
Branch master (994cf3)
by Marek
01:46
created

BookingDlg.onCreatePrivate()   A

Complexity

Conditions 2

Size

Total Lines 5
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
nop 4
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
1
#
2
#  Copyright 2001 - 2016 Ludek Smid [http://www.ospace.net/]
3
#
4
#  This file is part of Outer Space.
5
#
6
#  Outer Space is free software; you can redistribute it and/or modify
7
#  it under the terms of the GNU General Public License as published by
8
#  the Free Software Foundation; either version 2 of the License, or
9
#  (at your option) any later version.
10
#
11
#  Outer Space is distributed in the hope that it will be useful,
12
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
#  GNU General Public License for more details.
15
#
16
#  You should have received a copy of the GNU General Public License
17
#  along with Outer Space; if not, write to the Free Software
18
#  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
#
20
import time
21
22
import pygameui as ui
23
24
import ige
25
from osci import client
26
from osci import gdata
27
from PasswordDlg import PasswordDlg
28
29
30
class BookingDlg:
31
    """ There you subscribe to the new galaxy."""
32
33
    def __init__(self, app):
34
        self.app = app
35
        self.createUI()
36
        self.passwordDlg = PasswordDlg(app, hide = False)
37
        self.displayGoal = False
38
        self.displayPublic = True
39
        self.offering = client.cmdProxy.getBookingOffers()
40
        self.bookingInfo = client.cmdProxy.getBookingAnswers()
41
        self.selectionID = None
42
43
    def display(self, caller = None):
44
        self.selectionID = None
45
        self.caller = caller
46
        if self.show():
47
            self.win.show()
48
49
    def hide(self):
50
        self.win.hide()
51
52
    def show(self):
53
        self._setButtons()
54
        self._showMenu()
55
        self._showSelection()
56
        return True
57
58
    def _setButtons(self):
59
        self.win.vBookingPublic.visible = self.displayPublic
60
        self.win.vBookingPrivate.visible = not self.displayPublic
61
        self.win.vCreatePrivate.visible = self.displayPublic
62
        self.win.vDeletePrivate.visible = not self.displayPublic
63
        if self.displayPublic:
64
            self.win.vPublicToggle.text = _("Show private bookings")
65
        else:
66
            self.win.vPublicToggle.text = _("Show public bookings")
67
        if self.selectionID:
68
            book = self.bookingInfo[self.selectionID]
69
            scenario = self.offering[book.gal_type].scenario
70
            self.win.vCreatePrivate.enabled = scenario != ige.ospace.Const.SCENARIO_SINGLE
71
            self.win.vDeletePrivate.enabled = book.owner_nick == client.account.nick
72
            self.win.vToggle.enabled = book.owner_nick != client.account.nick
73
        else:
74
            self.win.vCreatePrivate.enabled = False
75
            self.win.vDeletePrivate.enabled = False
76
77
    def _showMenu(self):
78
        itemsPublic = []
79
        itemsPrivate = []
80
        for bookID in self.bookingInfo:
81
            if bookID < ige.Const.BID_FREESTART:
82
                continue
83
            book = self.bookingInfo[bookID]
84
            tPos = book.capacity
85
            tCur = book.bookings
86
            rawTime = book.last_creation
87
            tScenario = gdata.gameScenarios[self.offering[book.gal_type].scenario]
88
            isSelected = book.is_booked
89
            if rawTime:
90
                tTime = time.strftime(_("%m-%d-%y %H:%M"), time.localtime(rawTime))
91
            else:
92
                tTime = _('N/A')
93
            if isSelected:
94
                tChoice = '*'
95
            else:
96
                tChoice = ''
97
            item = ui.Item(book.gal_type, tPos = tPos, tCur = tCur, tTime = tTime,tChoice = tChoice, tScenario = tScenario, tOwner = book.owner_nick, tID = bookID)
98
            if book.owner_nick:
99
                itemsPrivate.append(item)
100
            else:
101
                itemsPublic.append(item)
102
        self.win.vBookingPublic.items = itemsPublic
103
        self.win.vBookingPublic.itemsChanged()
104
        self.win.vBookingPrivate.items = itemsPrivate
105
        self.win.vBookingPrivate.itemsChanged()
106
107
    def _showSelection(self):
108
        if self.selectionID:
109
            book = self.bookingInfo[self.selectionID]
110
            selection = self.offering[book.gal_type]
111
            self._displayText(book.gal_type, selection.scenario)
112
            self.win.vInfo.offsetRow = 0
113
            self.win.vInfo.vertScrollbar.slider.position = 0
114
115
            self.win.vPlanets.text = _('{0} - {1}'.format(selection.minPlanets, selection.maxPlanets))
116
            self.win.vRadius.text = selection.radius
117
            self.win.vPlayerGroup.text = selection.playerGroup
118
            self.win.vResources.text = [", ".join(map(lambda x: gdata.stratRes[x], selection.resources))]
119
            self.win.vResources.offsetRow = 0
120
            if selection.challenges:
121
                self.win.vChallenges.text = ", ".join(map(lambda x: gdata.gameChallenges[x], selection.challenges))
122
            else:
123
                self.win.vChallenges.text = ""
124
125
    def _displayText(self, gal_type, scenario):
126
        try:
127
            if self.displayGoal:
128
                self.win.vInfo.text = [gdata.gameScenarioDescriptions[scenario]]
129
            else:
130
                self.win.vInfo.text = [gdata.galaxyTypeDescriptions[gal_type]]
131
        except KeyError:
132
            # this shouldn't happen
133
            self.win.vInfo.text = [_("Description missing.")]
134
135
    def onSelect(self, widget, action, data):
136
        self.selectionID = data.tID
137
        self._setButtons()
138
        self._showSelection()
139
140
    def onToggleBooking(self, widget, action, data):
141
        if self.selectionID is None:
142
            self.win.setStatus(_('Select booking entry to toggle.'))
143
            return
144
        if self.displayPublic:
145
            self._onToggleBooking()
146
        else:
147
            self.passwordDlg.display(self._onToggleBooking)
148
149
    def _handleResult(self, result):
150
        triggerID = ige.Const.BID_TRIGGERED
151
        if not triggerID in result or not result[triggerID]:
152
            # booking change is logged, no galaxy creation triggered
153
            self.bookingInfo = result
154
            self.show()
155
        else:
156
            # galaxy creation has been triggered
157
            self.hide()
158
            self.caller.display()
159
            self.caller.win.setStatus(_('New galaxy creation has been triggered.'))
160
161
    def _onToggleBooking(self, password = None):
162
        if self.selectionID:
163
            try:
164
                result = client.cmdProxy.toggleBooking(self.selectionID, password)
165
                self._handleResult(result)
166
            except ige.BookingMngrException:
167
                self.win.setStatus(_('Wrong password.'))
168
169
    def onPublicToggle(self, widget, action, data):
170
        self.selectionID = None
171
        self.displayPublic = not self.displayPublic
172
        self.show()
173
174
    def onGoalToggle(self, widget, action, data):
175
        self.displayGoal = not self.displayGoal
176
        if self.displayGoal:
177
            self.win.vGoalToggle.text = _("Show galaxy info")
178
        else:
179
            self.win.vGoalToggle.text = _("Show goal info")
180
        self.show()
181
182
    def onCreatePrivate(self, widget, action, data):
183
        if self.selectionID is None:
184
            self.win.setStatus(_('Select galaxy type to create private booking.'))
185
            return
186
        self.passwordDlg.display(self.onCreatePrivateConfirmed)
187
188
    def onCreatePrivateConfirmed(self, password):
189
        result = client.cmdProxy.createPrivateBooking(self.selectionID, password)
190
        self._handleResult(result)
191
192
    def onDeletePrivate(self, widget, action, data):
193
        if self.selectionID is None:
194
            self.win.setStatus(_('Select galaxy type to create private booking.'))
195
            return
196
        result = client.cmdProxy.deletePrivateBooking(self.selectionID)
197
        self.selectionID = None
198
        self._handleResult(result)
199
200
    def onCancel(self, widget, action, data):
201
        self.win.hide()
202
        if self.caller:
203
            self.caller.display()
204
        else:
205
            self.app.exit()
206
207
    def createUI(self):
208
        w, h = gdata.scrnSize
209
        self.win = ui.Window(self.app,
210
            modal = 1,
211
            movable = 0,
212
            title = _('Select, which galaxy types do you want to play'),
213
            rect = ui.Rect((w - 564) / 2, (h - 404) / 2, 564, 404),
214
            layoutManager = ui.SimpleGridLM(),
215
            tabChange = True
216
        )
217
        ui.Listbox(self.win, layout = (0, 0, 28, 7), id = 'vBookingPublic',
218
                        sortedBy = ('text', 1),
219
                        columns = (
220
                                ('', 'tChoice', 1, ui.ALIGN_NONE),
221
                                (_('Galaxy type'), 'text', 6, ui.ALIGN_NONE),
222
                                (_('Scenario'), 'tScenario', 6, ui.ALIGN_NONE),
223
                                (_('Queue'), 'tCur', 3, ui.ALIGN_NONE),
224
                                (_('Capacity'), 'tPos', 3, ui.ALIGN_NONE),
225
                                (_('Last start'), 'tTime', 8, ui.ALIGN_E)
226
                                ),
227
                        columnLabels = 1,
228
                        action = 'onSelect',
229
                        )
230
        ui.Listbox(self.win, layout = (0, 0, 28, 7), id = 'vBookingPrivate',
231
                        sortedBy = ('tOwner', 1),
232
                        columns = (
233
                                ('', 'tChoice', 1, ui.ALIGN_NONE),
234
                                (_('Galaxy type'), 'text', 6, ui.ALIGN_NONE),
235
                                (_('Scenario'), 'tScenario', 6, ui.ALIGN_NONE),
236
                                (_('Queue'), 'tCur', 3, ui.ALIGN_NONE),
237
                                (_('Capacity'), 'tPos', 3, ui.ALIGN_NONE),
238
                                (_('Owner'), 'tOwner', 8, ui.ALIGN_E)
239
                                ),
240
                        columnLabels = 1,
241
                        action = 'onSelect',
242
                        )
243
        self.win.subscribeAction('*', self)
244
245
        ui.Button(self.win, layout = (0, 7, 8, 1), id = "vPublicToggle", text = _('Show personal bookings'), action = 'onPublicToggle',
246
            tooltipTitle = _("Booking types"),
247
            tooltip = _("Public Bookings\nPublic bookings are recommended way how to jump into new game.\nWhen queue is full, galaxy creation is triggered, and you can start adventure with group of strangers.\n\nPrivate Bookings\nPrivate bookings are the way to start game with group of your friends.\nEvery private booking requires password chosen by the owner.\nSingle player games cannot be privately booked (as they are private by definition).")
248
                )
249
        ui.Button(self.win, layout = (20, 7, 8, 1), id = "vCreatePrivate", text = _('Create private booking'), action = 'onCreatePrivate',
250
                tooltipTitle = _("Create Private Booking"),
251
                tooltip = _("Private bookings are way how to create games for group of friends.\n\
252
Every booking has to be created password protected, so you have to tell others\n\
253
what the password is.\n\n\
254
Account has limit of {0} private bookings at the time. Created galaxies\n\
255
no longers counts into the limit.".format(ige.ospace.Const.BOOKING_PRIVATE_LIMIT))
256
                )
257
258
        ui.Button(self.win, layout = (20, 7, 8, 1), id = "vDeletePrivate", text = _('Delete private booking'), action = 'onDeletePrivate',
259
                tooltipTitle = _("Delete Private Booking"),
260
                tooltip = _("As the author of the booking, you can delete it at any time. No further warning will be issued.")
261
                )
262
263
        ui.Button(self.win, layout = (7, 8.5, 14, 1.5), id = "vToggle", text = _('Toggle booking'), action = 'onToggleBooking')
264
        scrollBarInfo = ui.Scrollbar(self.win, layout = (27, 10.3, 1, 4.7))
265
        textBox = ui.Text(self.win, layout = (9, 10.3, 18, 4.7), id = "vInfo", editable = 0)
266
        textBox.attachVScrollbar(scrollBarInfo)
267
268
        ui.Button(self.win, layout = (0.5, 10.5, 8, 1), id = "vGoalToggle", text = _('Display Goals'), action = 'onGoalToggle')
269
        ui.Label(self.win, layout = (0, 12, 4, 1), text = _("Planets:"), align = ui.ALIGN_W,
270
                tooltipTitle = _("Planets"),
271
                tooltip = _("Range of number of planets. About half of them is not colonizable at the beginning.")
272
                )
273
        ui.Label(self.win, layout = (4, 12, 4.5, 1), id = "vPlanets", align = ui.ALIGN_E,
274
                tooltipTitle = _("Planets"),
275
                tooltip = _("Range of number of planets. About half of them is not colonizable at the beginning.")
276
                )
277
        ui.Label(self.win, layout = (0, 13, 4, 1), text = _("Radius:"), align = ui.ALIGN_W,
278
                tooltipTitle = _("Radius"),
279
                tooltip = _("Galaxy radius, implies speed of game.")
280
                )
281
        ui.Label(self.win, layout = (4, 13, 4.5, 1), id = "vRadius", align = ui.ALIGN_E,
282
                tooltipTitle = _("Radius"),
283
                tooltip = _("Galaxy radius, implies speed of game.")
284
                )
285
        ui.Label(self.win, layout = (0, 14, 4, 1), text = _("Grouping:"), align = ui.ALIGN_W,
286
                tooltipTitle = _("Grouping"),
287
                tooltip = _("How many starting positions are grouped together in vicinity.")
288
                )
289
        ui.Label(self.win, layout = (4, 14, 4.5, 1), id = "vPlayerGroup", align = ui.ALIGN_E,
290
                tooltipTitle = _("Grouping"),
291
                tooltip = _("How many starting positions are grouped together.")
292
                )
293
294
        ui.Label(self.win, layout = (0, 15.2, 4, 1), text = _("Resources:"), align = ui.ALIGN_W)
295
        ui.Text (self.win, layout = (4, 15.2, 23, 1.6), id = "vResources", editable = 0)
296
        ui.Label(self.win, layout = (0, 17, 4, 1), text = _("Challenges:"), align = ui.ALIGN_W)
297
        ui.Label(self.win, layout = (4, 17, 24, 1), id = "vChallenges", align = ui.ALIGN_W)
298
299
        ui.Title(self.win, layout = (0, 18, 24, 1), id = 'vStatusBar', align = ui.ALIGN_W)
300
        ui.TitleButton(self.win, layout = (24, 18, 4, 1), text = _('Exit'), action = 'onCancel')
301
        self.win.statusBar = self.win.vStatusBar
302