Skip to content

Commit 66bd52e

Browse files
committed
Put the "Bobby" label above widgets, not below.
Signed-off-by: Katharine Berry <[email protected]>
1 parent 796620b commit 66bd52e

File tree

8 files changed

+69
-19
lines changed

8 files changed

+69
-19
lines changed

app/src/c/alarms/manager.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ int alarm_manager_add_alarm(time_t when, bool is_timer, char* name, bool convers
9999
// For timers, instead of the standard action item, we add a countdown widget.
100100
ConversationWidget widget = {
101101
.type = ConversationWidgetTypeTimer,
102+
.locally_created = true,
102103
.widget = {
103104
.timer = {
104105
.target_time = alarm->scheduled_time,

app/src/c/converse/conversation.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,3 +359,33 @@ bool conversation_is_idle(Conversation* conversation) {
359359
}
360360
return false;
361361
}
362+
363+
static bool prv_entry_type_is_assistant(ConversationEntry* entry) {
364+
switch (entry->type) {
365+
case EntryTypePrompt:
366+
case EntryTypeError:
367+
case EntryTypeThought:
368+
case EntryTypeAction:
369+
return false;
370+
case EntryTypeResponse:
371+
return true;
372+
case EntryTypeWidget:
373+
return !entry->content.widget->locally_created;
374+
}
375+
return false;
376+
}
377+
378+
bool conversation_assistant_just_started(Conversation* conversation) {
379+
ConversationEntry *entry = conversation_peek(conversation);
380+
if (entry == NULL) {
381+
return false;
382+
}
383+
if (!prv_entry_type_is_assistant(entry)) {
384+
return false;
385+
}
386+
if (conversation->entry_count == 1) {
387+
return true;
388+
}
389+
ConversationEntry *previous = &conversation->entries[conversation->entry_count - 2];
390+
return !prv_entry_type_is_assistant(previous);
391+
}

app/src/c/converse/conversation.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ typedef struct {
132132

133133
typedef struct {
134134
ConversationWidgetType type;
135+
bool locally_created;
135136
union {
136137
ConversationWidgetWeatherSingleDay weather_single_day;
137138
ConversationWidgetWeatherCurrent weather_current;
@@ -165,6 +166,7 @@ void conversation_set_thread_id(Conversation* conversation, const char* thread_i
165166
const char* conversation_get_thread_id(Conversation* conversation);
166167
int conversation_length(Conversation* conversation);
167168
bool conversation_is_idle(Conversation* conversation);
169+
bool conversation_assistant_just_started(Conversation* conversation);
168170
ConversationEntry* conversation_entry_at_index(Conversation* conversation, int index);
169171
ConversationEntry* conversation_peek(Conversation* conversation);
170172
EntryType conversation_entry_get_type(ConversationEntry* entry);

app/src/c/converse/segments/message_layer.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,17 @@ MessageLayer* message_layer_create(GRect rect, ConversationEntry* entry) {
3838
MessageLayerData* data = layer_get_data(layer);
3939
data->entry = entry;
4040
data->speaker_layer = text_layer_create(GRect(5, 0, rect.size.w, NAME_HEIGHT));
41+
size_t content_origin_y = -5;
4142
EntryType type = conversation_entry_get_type(entry);
4243
if (type == EntryTypePrompt) {
4344
text_layer_set_text(data->speaker_layer, "You");
44-
} else if (type == EntryTypeResponse) {
45-
text_layer_set_text(data->speaker_layer, "Bobby");
45+
content_origin_y = NAME_HEIGHT;
4646
}
4747
layer_add_child(layer, (Layer *)data->speaker_layer);
4848
data->last_newline_offset = 0;
4949
data->content_height = 24;
5050
data->content_height = prv_get_content_height(layer);
51-
data->content_layer = text_layer_create(GRect(5, NAME_HEIGHT, rect.size.w - 10, data->content_height));
51+
data->content_layer = text_layer_create(GRect(5, content_origin_y, rect.size.w - 10, data->content_height));
5252
text_layer_set_text(data->content_layer, prv_get_content_text(layer));
5353
text_layer_set_font(data->content_layer, fonts_get_system_font(CONTENT_FONT));
5454
data->content_height = text_layer_get_content_size(data->content_layer).h;
@@ -73,7 +73,10 @@ void message_layer_update(MessageLayer* layer) {
7373
data->content_height = prv_get_content_height(layer);
7474
int width = layer_get_bounds(layer).size.w;
7575
GRect frame = layer_get_frame(layer);
76-
frame.size.h = data->content_height + NAME_HEIGHT + 5;
76+
frame.size.h = data->content_height + 5;
77+
if (conversation_entry_get_type(data->entry) == EntryTypePrompt) {
78+
frame.size.h += NAME_HEIGHT;
79+
}
7780
text_layer_set_size(data->content_layer, GSize(width - 10, data->content_height + 5));
7881
layer_set_frame(layer, frame);
7982
}

app/src/c/converse/segments/segment_layer.c

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929

3030
#define CONTENT_FONT FONT_KEY_GOTHIC_24_BOLD
31-
#define NAME_HEIGHT 15
31+
#define NAME_HEIGHT 20
3232

3333
typedef enum {
3434
SegmentTypeMessage,
@@ -42,6 +42,7 @@ typedef enum {
4242

4343
typedef struct {
4444
ConversationEntry* entry;
45+
TextLayer* assistant_label_layer;
4546
SegmentType type;
4647
union {
4748
// fun fact: every member of this union is actually a Layer*.
@@ -60,44 +61,50 @@ typedef struct {
6061

6162
static SegmentType prv_get_segment_type(ConversationEntry* entry);
6263

63-
SegmentLayer* segment_layer_create(GRect rect, ConversationEntry* entry) {
64+
SegmentLayer* segment_layer_create(GRect rect, ConversationEntry* entry, bool assistant_label) {
6465
Layer* layer = layer_create_with_data(rect, sizeof(SegmentLayerData));
6566
SegmentLayerData* data = layer_get_data(layer);
6667
data->entry = entry;
6768
data->type = prv_get_segment_type(entry);
6869
GRect child_frame = GRect(0, 0, rect.size.w, rect.size.h);
70+
if (assistant_label) {
71+
data->assistant_label_layer = text_layer_create(GRect(5, 0, rect.size.w, NAME_HEIGHT));
72+
layer_add_child(layer, text_layer_get_layer(data->assistant_label_layer));
73+
text_layer_set_text(data->assistant_label_layer, "Bobby");
74+
child_frame = GRect(0, NAME_HEIGHT, rect.size.w, rect.size.h - NAME_HEIGHT);
75+
} else {
76+
data->assistant_label_layer = NULL;
77+
}
6978
switch (data->type) {
7079
case SegmentTypeMessage:
7180
data->message_layer = message_layer_create(child_frame, entry);
72-
layer_add_child(layer, data->message_layer);
7381
break;
7482
case SegmentTypeInfo:
7583
data->info_layer = info_layer_create(child_frame, entry);
76-
layer_add_child(layer, data->info_layer);
7784
break;
7885
case SegmentTypeWeatherSingleDayWidget:
7986
data->weather_single_day_widget = weather_single_day_widget_create(child_frame, entry);
80-
layer_add_child(layer, data->weather_single_day_widget);
8187
break;
8288
case SegmentTypeWeatherCurrentWidget:
8389
data->weather_current_widget = weather_current_widget_create(child_frame, entry);
84-
layer_add_child(layer, data->weather_current_widget);
8590
break;
8691
case SegmentTypeWeatherMultiDayWidget:
8792
data->weather_multi_day_widget = weather_multi_day_widget_create(child_frame, entry);
88-
layer_add_child(layer, data->weather_multi_day_widget);
8993
break;
9094
case SegmentTypeTimerWidget:
9195
data->timer_widget = timer_widget_create(child_frame, entry);
92-
layer_add_child(layer, data->timer_widget);
9396
break;
9497
case SegmentTypeNumberWidget:
9598
data->number_widget = number_widget_create(child_frame, entry);
96-
layer_add_child(layer, data->number_widget);
9799
break;
98100
}
101+
layer_add_child(layer, data->layer);
99102
GSize child_size = layer_get_frame(data->layer).size;
100-
layer_set_frame(layer, GRect(rect.origin.x, rect.origin.y, child_size.w, child_size.h));
103+
GRect final_size = GRect(rect.origin.x, rect.origin.y, child_size.w, child_size.h);
104+
if (data->assistant_label_layer) {
105+
final_size.size.h += NAME_HEIGHT;
106+
}
107+
layer_set_frame(layer, final_size);
101108
return layer;
102109
}
103110

@@ -127,6 +134,9 @@ void segment_layer_destroy(SegmentLayer* layer) {
127134
number_widget_destroy(data->number_widget);
128135
break;
129136
}
137+
if (data->assistant_label_layer) {
138+
text_layer_destroy(data->assistant_label_layer);
139+
}
130140
layer_destroy(layer);
131141
}
132142

@@ -162,7 +172,11 @@ void segment_layer_update(SegmentLayer* layer) {
162172
}
163173
GSize child_size = layer_get_frame(data->layer).size;
164174
GPoint origin = layer_get_frame(layer).origin;
165-
layer_set_frame(layer, GRect(origin.x, origin.y, child_size.w, child_size.h));
175+
GRect final_frame = GRect(origin.x, origin.y, child_size.w, child_size.h);
176+
if (data->assistant_label_layer) {
177+
final_frame.size.h += NAME_HEIGHT;
178+
}
179+
layer_set_frame(layer, final_frame);
166180
}
167181

168182
static SegmentType prv_get_segment_type(ConversationEntry* entry) {

app/src/c/converse/segments/segment_layer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
typedef Layer SegmentLayer;
2525

26-
SegmentLayer* segment_layer_create(GRect rect, ConversationEntry* entry);
26+
SegmentLayer* segment_layer_create(GRect rect, ConversationEntry* entry, bool assistant_label);
2727
ConversationEntry* segment_layer_get_entry(SegmentLayer* layer);
2828
void segment_layer_destroy(SegmentLayer* layer);
2929
void segment_layer_update(SegmentLayer* layer);

app/src/c/converse/segments/widgets/number.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ static void prv_choose_font(Layer *layer);
2929
bool prv_is_sufficiently_numeric(const char* text);
3030

3131
NumberWidget* number_widget_create(GRect rect, ConversationEntry* entry) {
32-
char *number = conversation_entry_get_widget(entry)->widget.number.number;
3332
Layer *number_layer = layer_create_with_data(GRect(rect.origin.x, rect.origin.y, rect.size.w, 60), sizeof(NumberWidgetData));
3433
NumberWidgetData *data = layer_get_data(number_layer);
3534
data->entry = entry;

app/src/c/converse/session_window.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,8 @@ static void prv_conversation_manager_handler(bool entry_added, void* context) {
269269
sw->segment_layers[--sw->segment_count] = NULL;
270270
}
271271
}
272-
ConversationEntry* entry = conversation_peek(conversation_manager_get_conversation(sw->manager));
272+
Conversation *conversation = conversation_manager_get_conversation(sw->manager);
273+
ConversationEntry* entry = conversation_peek(conversation);
273274
if (entry == NULL) {
274275
// ??????
275276
APP_LOG(APP_LOG_LEVEL_ERROR, "We were told a new entry was added, but no entries actually exist????");
@@ -282,7 +283,7 @@ static void prv_conversation_manager_handler(bool entry_added, void* context) {
282283
free(sw->segment_layers);
283284
sw->segment_layers = new_block;
284285
}
285-
SegmentLayer* layer = segment_layer_create(GRect(0, prv_content_height(sw), holder_size.w, 10), entry);
286+
SegmentLayer* layer = segment_layer_create(GRect(0, prv_content_height(sw), holder_size.w, 10), entry, conversation_assistant_just_started(conversation));
286287
sw->segment_layers[sw->segment_count++] = layer;
287288
scroll_layer_add_child(sw->scroll_layer, layer);
288289
int layer_height = layer_get_frame(layer).size.h;

0 commit comments

Comments
 (0)