~mmach/netext73/mesa-ryzen

« back to all changes in this revision

Viewing changes to bin/pick/ui.py

  • Committer: mmach
  • Date: 2023-11-02 21:31:35 UTC
  • Revision ID: netbit73@gmail.com-20231102213135-18d4tzh7tj0uz752
2023-11-02 22:11:57

Show diffs side-by-side

added added

removed removed

Lines of Context:
47
47
        super().__init__(*args, **kwargs)
48
48
        self.ui = ui
49
49
 
 
50
 
 
51
class CommitList(urwid.ListBox):
 
52
 
 
53
    def __init__(self, *args, ui: 'UI', **kwargs):
 
54
        super().__init__(*args, **kwargs)
 
55
        self.ui = ui
 
56
 
50
57
    def keypress(self, size: int, key: str) -> typing.Optional[str]:
51
58
        if key == 'q':
52
59
            raise urwid.ExitMainLoop()
101
108
        return None
102
109
 
103
110
 
 
111
class FocusAwareEdit(urwid.Edit):
 
112
 
 
113
    """An Edit type that signals when it comes into and leaves focus."""
 
114
 
 
115
    signals = urwid.Edit.signals + ['focus_changed']
 
116
 
 
117
    def __init__(self, *args, **kwargs):
 
118
        super().__init__(*args, **kwargs)
 
119
        self.__is_focus = False
 
120
 
 
121
    def render(self, size: typing.Tuple[int], focus: bool = False) -> urwid.Canvas:
 
122
        if focus != self.__is_focus:
 
123
            self._emit("focus_changed", focus)
 
124
            self.__is_focus = focus
 
125
        return super().render(size, focus)
 
126
 
 
127
 
104
128
@attr.s(slots=True)
105
129
class UI:
106
130
 
112
136
 
113
137
    commit_list: typing.List['urwid.Button'] = attr.ib(factory=lambda: urwid.SimpleFocusListWalker([]), init=False)
114
138
    feedback_box: typing.List['urwid.Text'] = attr.ib(factory=lambda: urwid.SimpleFocusListWalker([]), init=False)
 
139
    notes: 'FocusAwareEdit' = attr.ib(factory=lambda: FocusAwareEdit('', multiline=True), init=False)
115
140
    header: 'urwid.Text' = attr.ib(factory=lambda: urwid.Text('Mesa Stable Picker', align='center'), init=False)
116
141
    body: 'urwid.Columns' = attr.ib(attr.Factory(lambda s: s._make_body(), True), init=False)
117
142
    footer: 'urwid.Columns' = attr.ib(attr.Factory(lambda s: s._make_footer(), True), init=False)
122
147
    new_commits: typing.List['core.Commit'] = attr.ib(factory=list, init=False)
123
148
    git_lock: asyncio.Lock = attr.ib(factory=asyncio.Lock, init=False)
124
149
 
 
150
    def _get_current_commit(self) -> typing.Optional['core.Commit']:
 
151
        entry = self.commit_list.get_focus()[0]
 
152
        return entry.original_widget.commit if entry is not None else None
 
153
 
 
154
    def _change_notes_cb(self) -> None:
 
155
        commit = self._get_current_commit()
 
156
        if commit and commit.notes:
 
157
            self.notes.set_edit_text(commit.notes)
 
158
        else:
 
159
            self.notes.set_edit_text('')
 
160
 
 
161
    def _change_notes_focus_cb(self, notes: 'FocusAwareEdit', focus: 'bool') -> 'None':
 
162
        # in the case of coming into focus we don't want to do anything
 
163
        if focus:
 
164
            return
 
165
        commit = self._get_current_commit()
 
166
        if commit is None:
 
167
            return
 
168
        text: str = notes.get_edit_text()
 
169
        if text != commit.notes:
 
170
            asyncio.ensure_future(commit.update_notes(self, text))
 
171
 
125
172
    def _make_body(self) -> 'urwid.Columns':
126
 
        commits = urwid.ListBox(self.commit_list)
 
173
        commits = CommitList(self.commit_list, ui=self)
127
174
        feedback = urwid.ListBox(self.feedback_box)
128
 
        return urwid.Columns([commits, feedback])
 
175
        urwid.connect_signal(self.commit_list, 'modified', self._change_notes_cb)
 
176
        notes = urwid.Filler(self.notes)
 
177
        urwid.connect_signal(self.notes, 'focus_changed', self._change_notes_focus_cb)
 
178
 
 
179
        return urwid.Columns([urwid.LineBox(commits), urwid.Pile([urwid.LineBox(notes), urwid.LineBox(feedback)])])
129
180
 
130
181
    def _make_footer(self) -> 'urwid.Columns':
131
182
        body = [
134
185
            urwid.Text('[C]herry Pick'),
135
186
            urwid.Text('[D]enominate'),
136
187
            urwid.Text('[B]ackport'),
137
 
            urwid.Text('[A]pply additional patch')
 
188
            urwid.Text('[A]pply additional patch'),
138
189
        ]
139
190
        return urwid.Columns(body)
140
191
 
141
192
    def _make_root(self) -> 'RootWidget':
142
 
        return RootWidget(self.body, self.header, self.footer, 'body', ui=self)
 
193
        return RootWidget(self.body, urwid.LineBox(self.header), urwid.LineBox(self.footer), 'body', ui=self)
143
194
 
144
195
    def render(self) -> 'WidgetType':
145
196
        asyncio.ensure_future(self.update())