#ifndef COURTROOM_H #define COURTROOM_H #include "aoapplication.h" #include "aoblipplayer.h" #include "aobutton.h" #include "aocharbutton.h" #include "aoclocklabel.h" #include "aoemotebutton.h" #include "aoevidencebutton.h" #include "aoevidencedisplay.h" #include "aoimage.h" #include "aolayer.h" #include "aomusicplayer.h" #include "widgets/aooptionsdialog.h" #include "aopacket.h" #include "aosfxplayer.h" #include "aotextarea.h" #include "chatlogpiece.h" #include "datatypes.h" #include "debug_functions.h" #include "file_functions.h" #include "hardware_functions.h" #include "lobby.h" #include "scrolltext.h" #include "eventfilters.h" #include "aoemotepreview.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) #include //added in Qt 5.10 #endif #include #include #include #include #include #include #include #include class AOApplication; class Courtroom : public QMainWindow { Q_OBJECT public: explicit Courtroom(AOApplication *p_ao_app); void update_audio_volume(); void append_char(char_type p_char) { char_list.append(p_char); } void append_evidence(evi_type p_evi) { evidence_list.append(p_evi); } void append_music(QString f_music) { music_list.append(f_music); } void append_area(QString f_area) { area_list.append(f_area); } void clear_chars() { char_list.clear(); } void clear_music() { music_list.clear(); } void clear_areas() { area_list.clear(); } void fix_last_area() { if (area_list.size() > 0) { QString malplaced = area_list.last(); area_list.removeLast(); append_music(malplaced); } } void arup_append(int players, QString status, QString cm, QString locked) { arup_players.append(players); arup_statuses.append(status); arup_cms.append(cm); arup_locks.append(locked); } void arup_clear() { arup_players.clear(); arup_statuses.clear(); arup_cms.clear(); arup_locks.clear(); } void arup_modify(int type, int place, QString value) { if (type == 0) { if (arup_players.size() > place) arup_players[place] = value.toInt(); } else if (type == 1) { if (arup_statuses.size() > place) arup_statuses[place] = value; } else if (type == 2) { if (arup_cms.size() > place) arup_cms[place] = value; } else if (type == 3) { if (arup_locks.size() > place) arup_locks[place] = value; } } void character_loading_finished(); // void set_courtroom_size(); // sets position of widgets based on theme ini files void set_widgets(); // sets font size based on theme ini files void set_font(QWidget *widget, QString class_name, QString p_identifier, QString p_char = "", QString font_name = "", int f_pointsize = 0); // Get the properly constructed font QFont get_qfont(QString font_name, int f_pointsize, bool antialias = true); // actual operation of setting the font on a widget void set_qfont(QWidget *widget, QString class_name, QFont font, QColor f_color = Qt::black, bool bold = false); // helper function that calls above function on the relevant widgets void set_fonts(QString p_char = ""); // sets dropdown menu stylesheet void set_stylesheet(QWidget *widget); // helper funciton that call above function on the relevant widgets void set_stylesheets(); void set_window_title(QString p_title); // reads theme and sets size and pos based on the identifier (using p_misc if provided) void set_size_and_pos(QWidget *p_widget, QString p_identifier, QString p_misc=""); // reads theme inis and returns the size and pos as defined by it QPoint get_theme_pos(QString p_identifier); // sets status as taken on character with cid n_char and places proper shading // on charselect void set_taken(int n_char, bool p_taken); // sets the current background to argument. also does some checks to see if // it's a legacy bg void set_background(QString p_background, bool display = false); // sets the local character pos/side to use. void set_side(QString p_side); // sets the pos dropdown void set_pos_dropdown(QStringList pos_dropdowns); // sets the evidence list member variable to argument void set_evidence_list(QVector &p_evi_list); // called when a DONE#% from the server was received void done_received(); // sets the local mute list based on characters available on the server void set_mute_list(); // Sets the local pair list based on the characters available on the server. void set_pair_list(); // sets desk and bg based on pos in chatmessage void set_scene(bool show_desk, QString f_side); // sets ui_vp_player_char according to SELF_OFFSET, only a function bc it's used with desk_mod 4 and 5 void set_self_offset(const QString& p_list); // takes in serverD-formatted IP list as prints a converted version to server // OOC admittedly poorly named void set_ip_list(QString p_list); // disables chat if current cid matches second argument // enables if p_muted is false void set_mute(bool p_muted, int p_cid); // send a message that the player is banned and quits the server void set_ban(int p_cid); // cid = character id, returns the cid of the currently selected character int get_cid() { return m_cid; } QString get_current_char() { return current_char; } QString get_current_background() { return current_background; } // updates character to p_cid and updates necessary ui elements // Optional "char_name" is the iniswap we're using void update_character(int p_cid, QString char_name = "", bool reset_emote = false); // properly sets up some varibles: resets user state void enter_courtroom(); // helper function that populates ui_music_list with the contents of // music_list void list_music(); void list_areas(); // Debug log (formerly master server chat log) void debug_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &msg); void append_debug_message(QString f_message); // OOC chat log void append_server_chatmessage(QString p_name, QString p_message, QString p_color); // Add the message packet to the stack void chatmessage_enqueue(QStringList p_contents); // Parse the chat message packet and unpack it into the m_chatmessage[ITEM] format void unpack_chatmessage(QStringList p_contents); // Skip the current queue, adding all the queue messages to the logs if desynchronized logs are disabled void skip_chatmessage_queue(); enum LogMode { IO_ONLY, DISPLAY_ONLY, DISPLAY_AND_IO, QUEUED, }; // Log the message contents and information such as evidence presenting etc. into the log file, the IC log, or both. void log_chatmessage(QString f_message, int f_char_id, QString f_showname = "", QString f_char = "", QString f_objection_mod = "", int f_evi_id = 0, int f_color = 0, LogMode f_log_mode=IO_ONLY, bool sender = false); // Log the message contents and information such as evidence presenting etc. into the IC logs void handle_callwords(); // Handle the objection logic, if it's interrupting the currently parsing message. // Returns true if this message has an objection, otherwise returns false. The result decides when to call handle_ic_message() bool handle_objection(); // Display the evidence image box when presenting evidence in IC void display_evidence_image(); // Handle the stuff that comes when the character appears on screen and starts animating (preanims etc.) void handle_ic_message(); // Display the character. void display_character(); // Display the character's pair if present. void display_pair_character(QString other_charid, QString other_offset); // Handle the emote modifier value and proceed through the logic accordingly. void handle_emote_mod(int emote_mod, bool p_immediate); // Initialize the chatbox image, showname shenanigans, custom chatboxes, etc. void initialize_chatbox(); // Finally start displaying the chatbox we initialized, display the evidence, and play the talking or idle emote for the character. // Callwords are also handled here. void handle_ic_speaking(); // This function filters out the common CC inline text trickery, for appending // to the IC chatlog. QString filter_ic_text(QString p_text, bool colorize = false, int pos = -1, int default_color = 0); void log_ic_text(QString p_name, QString p_showname, QString p_message, QString p_action = "", int p_color = 0, bool p_selfname = false); // adds text to the IC chatlog. p_name first as bold then p_text then a newlin // this function keeps the chatlog scrolled to the top unless there's text // selected // or the user isn't already scrolled to the top void append_ic_text(QString p_text, QString p_name = "", QString action = "", int color = 0, bool selfname = false, QDateTime timestamp = QDateTime::currentDateTime(), bool ghost = false); // clear sent messages that appear on the IC log but haven't been delivered // yet to other players void pop_ic_ghost(); // prints who played the song to IC chat and plays said song(if found on local // filesystem) takes in a list where the first element is the song name and // the second is the char id of who played it void handle_song(QStringList *p_contents); void play_preanim(bool immediate); // plays the witness testimony or cross examination animation based on // argument void handle_wtce(QString p_wtce, int variant); // sets the hp bar of defense(p_bar 1) or pro(p_bar 2) // state is an number between 0 and 10 inclusive void set_hp_bar(int p_bar, int p_state); // Toggles the judge buttons, whether they should appear or not. void show_judge_controls(bool visible); void check_connection_received(); void start_clock(int id); void start_clock(int id, qint64 msecs); void set_clock(int id, qint64 msecs); void pause_clock(int id); void stop_clock(int id); void set_clock_visibility(int id, bool visible); void skip_clocks(qint64 msecs); qint64 pong(); // Truncates text so it fits within theme-specified boundaries and sets the tooltip to the full string void truncate_label_text(QWidget* p_widget, QString p_identifier); void on_authentication_state_received(int p_state); enum JudgeState { POS_DEPENDENT = -1, HIDE_CONTROLS = 0, SHOW_CONTROLS = 1 }; JudgeState get_judge_state() { return judge_state; } void set_judge_state(JudgeState new_state) { judge_state = new_state; } void set_judge_buttons() { show_judge_controls(ao_app->get_pos_is_judge(current_side)); } ~Courtroom(); private: AOApplication *ao_app; // Percentage of audio that is suppressed when client is not in focus int suppress_audio = 0; int m_courtroom_width = 714; int m_courtroom_height = 668; int m_viewport_x = 0; int m_viewport_y = 0; int m_viewport_width = 256; int m_viewport_height = 192; int maximumMessages = 0; QParallelAnimationGroup *screenshake_animation_group = new QParallelAnimationGroup; bool next_character_is_not_special = false; // If true, write the // next character as it is. bool message_is_centered = false; int current_display_speed = 3; int text_crawl = 40; double message_display_mult[7] = {0, 0.25, 0.65, 1, 1.25, 1.75, 2.25}; // The character ID of the character this user wants to appear alongside with. int other_charid = -1; // The horizontal offset this user has given if they want to appear alongside someone. int char_offset = 0; // The vertical offset this user has given. int char_vert_offset = 0; // 0 = in front, 1 = behind int pair_order = 0; QVector char_list; QVector evidence_list; QVector music_list; QVector area_list; QVector arup_players; QVector arup_statuses; QVector arup_cms; QVector arup_locks; QVector ic_chatlog_history; QString last_ic_message = ""; QQueue chatmessage_queue; // triggers ping_server() every 45 seconds QTimer *keepalive_timer; // determines how fast messages tick onto screen QTimer *chat_tick_timer; // count up timer to check how long it took for us to get a response from ping_server() QElapsedTimer ping_timer; bool is_pinging = false; // int chat_tick_interval = 60; // which tick position(character in chat message) we are at int tick_pos = 0; // the actual document tick pos we gotta worry about for making the text // scroll better int real_tick_pos = 0; // used to determine how often blips sound int blip_ticker = 0; int blip_rate = 2; int rainbow_counter = 0; bool rainbow_appended = false; bool blank_blip = false; bool chatbox_always_show = false; // Used for getting the current maximum blocks allowed in the IC chatlog. int log_maximum_blocks = 0; // True, if the log should go downwards. bool log_goes_downwards = true; // True, if log should display colors. bool log_colors = true; // True, if the log should display the message like name
text instead of // name: text bool log_newline = false; // True, if the log should include RP actions like interjections, showing evidence, etc. bool log_ic_actions = true; // Margin in pixels between log entries for the IC log. int log_margin = 0; // True, if the log should have a timestamp. bool log_timestamp = false; // format string for aforementioned log timestamp QString log_timestamp_format; // How long in miliseconds should the objection wait before appearing. int objection_threshold = 1500; // delay before chat messages starts ticking QTimer *text_delay_timer; // delay before the next queue entry is going to be processed QTimer *text_queue_timer; // delay before sfx plays QTimer *sfx_delay_timer; // every time point in char.inis times this equals the final time const int time_mod = 40; // the amount of time non-animated objection/hold it/takethat images stay // onscreen for in ms, and the maximum amount of time any interjections are // allowed to play const int shout_static_time = 724; const int shout_max_time = 1500; // the amount of time non-animated guilty/not guilty images stay onscreen for // in ms, and the maximum amount of time g/ng images are allowed to play const int verdict_static_time = 3000; const int verdict_max_time = 4000; // the amount of time non-animated witness testimony/cross-examination images // stay onscreen for in ms, and the maximum time any wt/ce image is allowed to // play const int wtce_static_time = 1500; const int wtce_max_time = 4000; // characters we consider punctuation const QString punctuation_chars = ".,?!:;"; // amount by which we multiply the delay when we parse punctuation chars const int punctuation_modifier = 3; // amount of ghost blocks int ghost_blocks = 0; // Minumum and maximum number of parameters in the MS packet static const int MS_MINIMUM = 15; static const int MS_MAXIMUM = 30; QString m_chatmessage[MS_MAXIMUM]; QString previous_ic_message = ""; QString additive_previous = ""; // char id, muted or not QMap mute_map; // QVector muted_cids; bool is_muted = false; JudgeState judge_state = POS_DEPENDENT; // state of animation, 0 = objecting, 1 = preanim, 2 = talking, 3 = idle, 4 = // noniterrupting preanim, 5 = (c) animation int anim_state = 3; // whether or not current color is a talking one bool color_is_talking = true; // state of text ticking, 0 = not yet ticking, 1 = ticking in progress, 2 = // ticking done int text_state = 2; // character id, which index of the char_list the player is int m_cid = -1; // cid and this may differ in cases of ini-editing QString current_char = ""; int objection_state = 0; QString objection_custom = ""; struct CustomObjection { QString name; QString filename; }; QList custom_objections_list; int realization_state = 0; int screenshake_state = 0; int text_color = 0; // How many unique user colors are possible static const int max_colors = 12; // Text Color-related optimization: // Current color list indexes to real color references QVector color_row_to_number; // List of associated RGB colors for this color index QVector color_rgb_list; // Same as above but populated from misc/default's config QVector default_color_rgb_list; // Get a color index from an arbitrary misc config void gen_char_rgb_list(QString p_misc); QVector char_color_rgb_list; // Misc we used for the last message, and the one we're using now. Used to avoid loading assets when it's not needed QString current_misc; QString last_misc; // List of markdown start characters, their index is tied to the color index QStringList color_markdown_start_list; // List of markdown end characters, their index is tied to the color index QStringList color_markdown_end_list; // Whether or not we're supposed to remove this char during parsing QVector color_markdown_remove_list; // Whether or not this color allows us to play the talking animation QVector color_markdown_talking_list; // Text Color-related optimization END // List of all currently available pos QStringList pos_dropdown_list; // Current list file sorted line by line QStringList sound_list; // Current SFX the user put in for the sfx dropdown list QString custom_sfx = ""; // is the message we're about to send supposed to present evidence? bool is_presenting_evidence = false; bool c_played = false; // whether we've played a (c)-style postanimation yet // have we already presented evidence for this message? bool evidence_presented = false; QString effect = ""; // Music effect flags we want to send to server when we play music int music_flags = FADE_OUT; int defense_bar_state = 0; int prosecution_bar_state = 0; int current_char_page = 0; int char_columns = 10; int char_rows = 9; int max_chars_on_page = 90; const int button_width = 60; const int button_height = 60; int current_emote_page = 0; int current_emote = 0; int emote_columns = 5; int emote_rows = 2; int max_emotes_on_page = 10; QVector local_evidence_list; QVector private_evidence_list; QVector global_evidence_list; // false = use private_evidence_list bool current_evidence_global = true; int current_evidence_page = 0; int current_evidence = 0; int evidence_columns = 6; int evidence_rows = 3; int max_evidence_on_page = 18; // whether the ooc chat is server or master chat, true is server bool server_ooc = true; QString current_background = "default"; QString current_side = ""; QString last_music_search = ""; QString last_area_search = ""; QBrush free_brush; QBrush lfp_brush; QBrush casing_brush; QBrush recess_brush; QBrush rp_brush; QBrush gaming_brush; QBrush locked_brush; AOMusicPlayer *music_player; AOSfxPlayer *sfx_player; AOSfxPlayer *objection_player; AOBlipPlayer *blip_player; AOSfxPlayer *modcall_player; AOImage *ui_background; QWidget *ui_viewport; BackgroundLayer *ui_vp_background; SplashLayer *ui_vp_speedlines; CharLayer *ui_vp_player_char; CharLayer *ui_vp_sideplayer_char; BackgroundLayer *ui_vp_desk; AOEvidenceDisplay *ui_vp_evidence_display; AOImage *ui_vp_chatbox; QLabel *ui_vp_showname; InterfaceLayer *ui_vp_chat_arrow; QTextEdit *ui_vp_message; SplashLayer *ui_vp_testimony; SplashLayer *ui_vp_wtce; EffectLayer *ui_vp_effect; SplashLayer *ui_vp_objection; QTextEdit *ui_ic_chatlog; AOTextArea *ui_debug_log; AOTextArea *ui_server_chatlog; QListWidget *ui_mute_list; QTreeWidget *ui_area_list; QTreeWidget *ui_music_list; ScrollText *ui_music_name; InterfaceLayer *ui_music_display; StickerLayer *ui_vp_sticker; static const int max_clocks = 5; AOClockLabel *ui_clock[max_clocks]; AOButton *ui_pair_button; QListWidget *ui_pair_list; QSpinBox *ui_pair_offset_spinbox; QSpinBox *ui_pair_vert_offset_spinbox; QComboBox *ui_pair_order_dropdown; QLineEdit *ui_ic_chat_message; AOLineEditFilter *ui_ic_chat_message_filter; QLineEdit *ui_ic_chat_name; QLineEdit *ui_ooc_chat_message; QLineEdit *ui_ooc_chat_name; // QLineEdit *ui_area_password; QLineEdit *ui_music_search; QWidget *ui_emotes; QVector ui_emote_list; AOButton *ui_emote_left; AOButton *ui_emote_right; QMenu *emote_menu; AOEmotePreview *emote_preview; QComboBox *ui_emote_dropdown; QComboBox *ui_pos_dropdown; AOButton *ui_pos_remove; QComboBox *ui_iniswap_dropdown; AOButton *ui_iniswap_remove; QComboBox *ui_sfx_dropdown; AOButton *ui_sfx_remove; QComboBox *ui_effects_dropdown; AOImage *ui_defense_bar; AOImage *ui_prosecution_bar; QLabel *ui_music_label; QLabel *ui_sfx_label; QLabel *ui_blip_label; AOButton *ui_hold_it; AOButton *ui_objection; AOButton *ui_take_that; AOButton *ui_ooc_toggle; AOButton *ui_witness_testimony; AOButton *ui_cross_examination; AOButton *ui_guilty; AOButton *ui_not_guilty; AOButton *ui_change_character; AOButton *ui_reload_theme; AOButton *ui_call_mod; AOButton *ui_settings; AOButton *ui_switch_area_music; QCheckBox *ui_pre; QCheckBox *ui_flip; QCheckBox *ui_additive; QCheckBox *ui_guard; QCheckBox *ui_immediate; QCheckBox *ui_showname_enable; AOButton *ui_custom_objection; QMenu *custom_obj_menu; AOButton *ui_realization; AOButton *ui_screenshake; AOButton *ui_mute; AOButton *ui_defense_plus; AOButton *ui_defense_minus; AOButton *ui_prosecution_plus; AOButton *ui_prosecution_minus; QComboBox *ui_text_color; QSlider *ui_music_slider; QSlider *ui_sfx_slider; QSlider *ui_blip_slider; AOImage *ui_muted; AOButton *ui_evidence_button; AOImage *ui_evidence; QLineEdit *ui_evidence_name; AOLineEditFilter *ui_evidence_name_filter; QWidget *ui_evidence_buttons; QVector ui_evidence_list; AOButton *ui_evidence_left; AOButton *ui_evidence_right; AOButton *ui_evidence_present; AOImage *ui_evidence_overlay; AOButton *ui_evidence_delete; QLineEdit *ui_evidence_image_name; AOLineEditFilter *ui_evidence_image_name_filter; AOButton *ui_evidence_image_button; AOButton *ui_evidence_x; AOButton *ui_evidence_ok; AOButton *ui_evidence_switch; AOButton *ui_evidence_transfer; AOButton *ui_evidence_save; AOButton *ui_evidence_load; QPlainTextEdit *ui_evidence_description; AOImage *ui_char_select_background; // pretty list of characters QTreeWidget *ui_char_list; // abstract widget to hold char buttons QWidget *ui_char_buttons; QVector ui_char_button_list; QVector ui_char_button_list_filtered; AOButton *ui_back_to_lobby; QLineEdit *ui_char_password; AOButton *ui_char_select_left; AOButton *ui_char_select_right; AOButton *ui_spectator; QLineEdit *ui_char_search; QCheckBox *ui_char_passworded; QCheckBox *ui_char_taken; void construct_char_select(); void set_char_select(); void set_char_select_page(); void char_clicked(int n_char); void on_char_button_context_menu_requested(const QPoint &pos); void put_button_in_place(int starting, int chars_on_this_page); void filter_character_list(); void initialize_emotes(); void refresh_emotes(); void set_emote_page(); void set_emote_dropdown(); void initialize_evidence(); void refresh_evidence(); void show_evidence(int f_real_id); void set_evidence_page(); void reset_ui(); void regenerate_ic_chatlog(); public slots: void objection_done(); void preanim_done(); void do_screenshake(); void do_flash(); void do_effect(QString fx_path, QString fx_sound, QString p_char, QString p_folder); void play_char_sfx(QString sfx_name); void mod_called(QString p_ip); void on_reload_theme_clicked(); void update_ui_music_name(); private slots: void start_chat_ticking(); void play_sfx(); void chat_tick(); void on_mute_list_clicked(QModelIndex p_index); void on_pair_list_clicked(QModelIndex p_index); void on_chat_return_pressed(); void on_ooc_return_pressed(); void on_music_search_return_pressed(); void on_music_search_edited(QString p_text); void on_music_list_double_clicked(QTreeWidgetItem *p_item, int column); void on_music_list_context_menu_requested(const QPoint &pos); void music_fade_out(bool toggle); void music_fade_in(bool toggle); void music_synchronize(bool toggle); void music_random(); void music_list_expand_all(); void music_list_collapse_all(); void music_stop(bool no_effects = false); void on_area_list_double_clicked(QTreeWidgetItem *p_item, int column); void select_emote(int p_id); void on_emote_clicked(int p_id); void on_emote_left_clicked(); void on_emote_right_clicked(); void on_emote_dropdown_changed(int p_index); void on_pos_dropdown_changed(int p_index); void on_pos_dropdown_changed(QString p_text); void on_pos_dropdown_context_menu_requested(const QPoint &pos); void on_pos_remove_clicked(); void on_iniswap_dropdown_changed(int p_index); void set_iniswap_dropdown(); void on_iniswap_context_menu_requested(const QPoint &pos); void on_iniswap_edit_requested(); void on_iniswap_remove_clicked(); void on_sfx_dropdown_changed(int p_index); void on_sfx_dropdown_custom(QString p_sfx); void set_sfx_dropdown(); void on_sfx_context_menu_requested(const QPoint &pos); void on_sfx_play_clicked(); void on_sfx_edit_requested(); void on_sfx_remove_clicked(); void set_effects_dropdown(); void on_effects_context_menu_requested(const QPoint &pos); void on_effects_edit_requested(); void on_character_effects_edit_requested(); void on_effects_dropdown_changed(int p_index); bool effects_dropdown_find_and_set(QString effect); QString get_char_sfx(); int get_char_sfx_delay(); void on_evidence_name_edited(); void on_evidence_image_name_edited(); void on_evidence_image_button_clicked(); void on_evidence_clicked(int p_id); void on_evidence_double_clicked(int p_id); void on_evidence_hover(int p_id, bool p_state); void on_evidence_left_clicked(); void on_evidence_right_clicked(); void on_evidence_present_clicked(); void on_hold_it_clicked(); void on_objection_clicked(); void on_take_that_clicked(); void on_custom_objection_clicked(); void show_custom_objection_menu(const QPoint &pos); void show_emote_menu(const QPoint &pos); void on_realization_clicked(); void on_screenshake_clicked(); void on_mute_clicked(); void on_pair_clicked(); void on_pair_order_dropdown_changed(int p_index); void on_defense_minus_clicked(); void on_defense_plus_clicked(); void on_prosecution_minus_clicked(); void on_prosecution_plus_clicked(); void on_text_color_changed(int p_color); void on_text_color_context_menu_requested(const QPoint &pos); void set_text_color_dropdown(); void on_music_slider_moved(int p_value); void on_sfx_slider_moved(int p_value); void on_blip_slider_moved(int p_value); void on_log_limit_changed(int value); void on_pair_offset_changed(int value); void on_pair_vert_offset_changed(int value); void on_ooc_toggle_clicked(); void on_witness_testimony_clicked(); void on_cross_examination_clicked(); void on_not_guilty_clicked(); void on_guilty_clicked(); void on_change_character_clicked(); void on_call_mod_clicked(); void on_settings_clicked(); void on_pre_clicked(); void on_flip_clicked(); void on_additive_clicked(); void on_guard_clicked(); void on_showname_enable_clicked(); void on_evidence_button_clicked(); void on_evidence_context_menu_requested(const QPoint &pos); void on_evidence_delete_clicked(); bool on_evidence_x_clicked(); void on_evidence_ok_clicked(); void on_evidence_switch_clicked(); void on_evidence_transfer_clicked(); void on_evidence_edited(); void evidence_close(); void evidence_switch(bool global); void on_evidence_save_clicked(); void on_evidence_load_clicked(); void evidence_save(QString filename); void evidence_load(QString filename); bool compare_evidence_changed(evi_type evi_a, evi_type evi_b); void on_back_to_lobby_clicked(); void on_char_list_double_clicked(QTreeWidgetItem *p_item, int column); void on_char_select_left_clicked(); void on_char_select_right_clicked(); void on_char_search_changed(); void on_char_taken_clicked(); void on_char_passworded_clicked(); void on_spectator_clicked(); void on_switch_area_music_clicked(); void on_application_state_changed(Qt::ApplicationState state); void ping_server(); // Proceed to parse the oldest chatmessage and remove it from the stack void chatmessage_dequeue(); void preview_emote(QString emote); void update_emote_preview(); }; #endif // COURTROOM_H