#include "db.h"
#include "state.pb.h"
+#include <deque>
#include <memory>
#include <mutex>
#include <QLabel>
#include <QMainWindow>
+#include <QNetworkAccessManager>
#include <stdbool.h>
#include <sys/types.h>
#include <string>
class MainWindow;
} // namespace Ui
+struct FrameOnDisk;
+class JPEGFrameView;
class Player;
+class QPushButton;
+class QTableView;
class MainWindow : public QMainWindow {
Q_OBJECT
// HTTP callback. TODO: Does perhaps not belong to MainWindow?
std::pair<std::string, std::string> get_queue_status() const;
-//private:
- Ui::MainWindow *ui;
+ void display_frame(unsigned stream_idx, const FrameOnDisk &frame);
private:
+ Ui::MainWindow *ui;
+
QLabel *disk_free_label;
std::unique_ptr<Player> preview_player, live_player;
DB db;
+ unsigned num_cameras;
// State when doing a scrub operation on a timestamp with the mouse.
bool scrubbing = false;
std::string deferred_change_id;
StateProto deferred_state;
+ // NOTE: The undo stack always has the current state on top.
+ std::deque<StateProto> undo_stack, redo_stack;
+
// Before a change that should be deferred (see above), currently_deferring_model_changes
// must be set to true, and current_change_id must be given contents describing what's
// changed to avoid accidental grouping.
mutable std::mutex queue_status_mu;
std::string queue_status; // Under queue_status_mu.
+ struct FrameAndDisplay {
+ QFrame *frame;
+ JPEGFrameView *display;
+ QPushButton *preview_btn;
+ };
+ std::vector<FrameAndDisplay> displays;
+
+ // Used to get tally information, if a tally URL is set.
+ QNetworkAccessManager http;
+ QNetworkReply *http_reply = nullptr;
+
+ void change_num_cameras();
void cue_in_clicked();
void cue_out_clicked();
void queue_clicked();
void preview_clicked();
void preview_angle_clicked(unsigned stream_idx);
void play_clicked();
+ void stop_clicked();
void live_player_clip_done();
std::pair<Clip, size_t> live_player_get_next_clip();
void live_player_clip_progress(const std::map<size_t, double> &progress);
void defer_timer_expired();
void content_changed(); // In clip_list or play_list.
void state_changed(const StateProto &state); // Called post-filtering.
+ void save_settings();
enum Rounding { FIRST_AT_OR_AFTER, LAST_BEFORE };
void preview_single_frame(int64_t pts, unsigned stream_idx, Rounding rounding);
void export_playlist_clip_interpolated_triggered();
void manual_triggered();
void about_triggered();
+ void undo_triggered();
+ void redo_triggered();
+ void quality_toggled(int quality, bool checked);
void highlight_camera_input(int stream_idx);
+ template <class Model>
+ void replace_model(QTableView *view, Model **model, Model *new_model);
+
+ void start_tally();
+ void tally_received();
+
private slots:
void relayout();
};