Warning: session_start(): open(/var/lib/php/sessions/sess_mjnrv95brmaqc534ijd0kg3pac, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
asclass DynConvo > DynModule {
delegate Post to JChatConvo.
L posts_raw = new L; // underlying list
transient L posts; // list with notify
S userInput;
switchable bool listen;
transient JChatConvo view;
transient L> onPostAdded = syncList();
start {
posts = dm_synchroList(this, posts_raw);
}
Pt minimumSize() { ret pt(300, 300); }
O[] menuItems() {
ret litarray("Clear", rEnter clearPosts);
}
visualize {
print("Have posts: " + posts);
view = swing(() -> new JChatConvo);
view.usePostsList(posts);
ret centerAndSouth(
jscroll_trackWidth(view),
withMargin(bottomPart()));
}
JComponent bottomPart() {
ret centerAndEastWithMargin(
dm_textFieldAndSubmit userInput('sendInput, buttonText := "Send"),
dm_boolFieldImageSwitch listen(#1102902, #1101635,
onToolTip := "Listening to voice input (if a speech recognition is active)",
offToolTip := "Not listening to voice input"));
}
void sendInput {
S s = trim(userInput);
if (nempty(s)) {
setField(userInput := "");
sendInput2(s);
}
}
void sendInput2(S s) {
if "clear"
ret with clearPosts();
addPost(htmlEncode2(s), false);
vmBus_send chatUserInput(module(), s);
}
// API
void addPost(S html, bool right) swing {
Post post = new(html, right);
posts.add(post);
programLog("New post: " + struct(post));
view?.updateAndScrollDown();
pcallFAll(onPostAdded, post);
}
void clearPosts swing {
posts.clear();
programLog("Cleared posts");
view?.updateAndScrollDown();
}
void reply(S s) {
if (empty(s = trim(s))) ret;
addPost(htmlEncode2(s), true);
}
S lastInput() {
for (Post p : lazyReversed(posts))
if (!p.right)
ret p.html;
null;
}
void openPopup {
print("openPopup. popped out: " + dm_moduleIsPoppedOut() + ", visible: " + dm_visible());
dm_showModule();
if (dm_moduleIsPoppedOut()) ret;
dm_placeInBottomRightCorner();
dm_popOutAndActivateModule_alwaysOnTop();
}
}