
Add a setup.cfg and setup.py and fill in those files so that gertty can be installed easily. Adjust gertty.py to have a main function that can be referenced as a console entrypoint during installation. Also adjusted a bunch of imports that were failing after installation occurred (but now they should not fail since they correctly reference the gertty module namespace). Change-Id: I532ced51583b26300ba9a2efb97f8e41bc69ec8d
136 lines
5.0 KiB
Python
136 lines
5.0 KiB
Python
# Copyright 2014 OpenStack Foundation
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import urwid
|
|
|
|
from gertty import mywid
|
|
from gertty import sync
|
|
from gertty.view import change_list as view_change_list
|
|
|
|
class ProjectRow(urwid.Button):
|
|
project_focus_map = {None: 'reversed',
|
|
'unreviewed-project': 'reversed-unreviewed-project',
|
|
'subscribed-project': 'reversed-subscribed-project',
|
|
'unsubscribed-project': 'reversed-unsubscribed-project',
|
|
}
|
|
|
|
def selectable(self):
|
|
return True
|
|
|
|
def __init__(self, project, callback=None):
|
|
super(ProjectRow, self).__init__('', on_press=callback, user_data=project.key)
|
|
self.project_key = project.key
|
|
name = urwid.Text(u' '+project.name)
|
|
name.set_wrap_mode('clip')
|
|
self.unreviewed_changes = urwid.Text(u'')
|
|
self.reviewed_changes = urwid.Text(u'')
|
|
col = urwid.Columns([
|
|
name,
|
|
('fixed', 4, self.unreviewed_changes),
|
|
('fixed', 4, self.reviewed_changes),
|
|
])
|
|
self.row_style = urwid.AttrMap(col, '')
|
|
self._w = urwid.AttrMap(self.row_style, None, focus_map=self.project_focus_map)
|
|
self.update(project)
|
|
|
|
def update(self, project):
|
|
if project.subscribed:
|
|
if len(project.unreviewed_changes) > 0:
|
|
style = 'unreviewed-project'
|
|
else:
|
|
style = 'subscribed-project'
|
|
else:
|
|
style = 'unsubscribed-project'
|
|
self.row_style.set_attr_map({None: style})
|
|
self.unreviewed_changes.set_text(str(len(project.unreviewed_changes)))
|
|
self.reviewed_changes.set_text(str(len(project.reviewed_changes)))
|
|
|
|
class ProjectListView(urwid.WidgetWrap):
|
|
help = mywid.GLOBAL_HELP + """
|
|
This Screen
|
|
===========
|
|
<l> Toggle whether only subscribed projects or all projects are listed.
|
|
<s> Toggle the subscription flag for the currently selected project.
|
|
"""
|
|
|
|
def __init__(self, app):
|
|
super(ProjectListView, self).__init__(urwid.Pile([]))
|
|
self.app = app
|
|
self.subscribed = True
|
|
self.project_rows = {}
|
|
self.listbox = urwid.ListBox(urwid.SimpleFocusListWalker([]))
|
|
self.refresh()
|
|
self._w.contents.append((app.header, ('pack', 1)))
|
|
self._w.contents.append((urwid.Divider(),('pack', 1)))
|
|
self._w.contents.append((self.listbox, ('weight', 1)))
|
|
self._w.set_focus(2)
|
|
|
|
def isEmpty(self):
|
|
if self.project_rows:
|
|
return False
|
|
return True
|
|
|
|
def refresh(self):
|
|
if self.subscribed:
|
|
self.title = u'Subscribed Projects'
|
|
else:
|
|
self.title = u'All Projects'
|
|
self.app.status.update(title=self.title)
|
|
unseen_keys = set(self.project_rows.keys())
|
|
with self.app.db.getSession() as session:
|
|
i = 0
|
|
for project in session.getProjects(subscribed=self.subscribed):
|
|
row = self.project_rows.get(project.key)
|
|
if not row:
|
|
row = ProjectRow(project, self.onSelect)
|
|
self.listbox.body.insert(i, row)
|
|
self.project_rows[project.key] = row
|
|
else:
|
|
row.update(project)
|
|
unseen_keys.remove(project.key)
|
|
i += 1
|
|
for key in unseen_keys:
|
|
row = self.project_rows[key]
|
|
self.listbox.body.remove(row)
|
|
del self.project_rows[key]
|
|
|
|
def toggleSubscribed(self, project_key):
|
|
with self.app.db.getSession() as session:
|
|
project = session.getProject(project_key)
|
|
project.subscribed = not project.subscribed
|
|
ret = project.subscribed
|
|
return ret
|
|
|
|
def onSelect(self, button, project_key):
|
|
self.app.changeScreen(view_change_list.ChangeListView(self.app, project_key))
|
|
|
|
def keypress(self, size, key):
|
|
if key=='l':
|
|
self.subscribed = not self.subscribed
|
|
self.refresh()
|
|
return None
|
|
if key=='s':
|
|
if not len(self.listbox.body):
|
|
return None
|
|
pos = self.listbox.focus_position
|
|
project_key = self.listbox.body[pos].project_key
|
|
subscribed = self.toggleSubscribed(project_key)
|
|
self.refresh()
|
|
if subscribed:
|
|
self.app.sync.submitTask(sync.SyncProjectTask(project_key))
|
|
return None
|
|
return super(ProjectListView, self).keypress(size, key)
|
|
|
|
|