summaryrefslogtreecommitdiff
path: root/plugins/warp/ui/containers.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/warp/ui/containers.h')
-rw-r--r--plugins/warp/ui/containers.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/plugins/warp/ui/containers.h b/plugins/warp/ui/containers.h
new file mode 100644
index 00000000..80ffa12f
--- /dev/null
+++ b/plugins/warp/ui/containers.h
@@ -0,0 +1,175 @@
+#pragma once
+
+#include <QWidget>
+#include <optional>
+#include <QClipboard>
+#include <QDesktopServices>
+#include <QInputDialog>
+#include <QListWidget>
+#include "shared/search.h"
+
+#include "theme.h"
+#include "warp.h"
+#include "../../../../ui/mainwindow.h"
+
+class WarpSourcesModel final : public QAbstractTableModel
+{
+ Q_OBJECT
+
+public:
+ enum Columns : int
+ {
+ GuidCol = 0,
+ PathCol,
+ WritableCol,
+ UncommittedCol,
+ ColumnCount
+ };
+
+ explicit WarpSourcesModel(QObject *parent = nullptr)
+ : QAbstractTableModel(parent)
+ {
+ }
+
+ void setContainer(Warp::Ref<Warp::Container> container)
+ {
+ m_container = std::move(container);
+ reload();
+ }
+
+ void reload()
+ {
+ // Fetch synchronously (can be adapted to async if needed)
+ beginResetModel();
+ m_rows.clear();
+ for (const auto &src: m_container->GetSources())
+ {
+ QString guid = QString::fromStdString(src.ToString());
+ QString path = QString::fromStdString(m_container->SourcePath(src).value_or(std::string{}));
+ bool writable = m_container->IsSourceWritable(src);
+ bool uncommitted = m_container->IsSourceUncommitted(src);
+ m_rows.push_back({guid, path, writable, uncommitted});
+ }
+ endResetModel();
+ }
+
+ int rowCount(const QModelIndex &parent = QModelIndex()) const override
+ {
+ if (parent.isValid()) return 0;
+ return static_cast<int>(m_rows.size());
+ }
+
+ int columnCount(const QModelIndex &parent = QModelIndex()) const override
+ {
+ Q_UNUSED(parent);
+ return ColumnCount;
+ }
+
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
+
+ QVariant headerData(int section, Qt::Orientation orientation, int role) const override
+ {
+ if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
+ {
+ switch (section)
+ {
+ case GuidCol: return "Source GUID";
+ case PathCol: return "Path";
+ case WritableCol: return "Writable";
+ case UncommittedCol: return "Uncommitted";
+ default: return {};
+ }
+ }
+ return {};
+ }
+
+private:
+ struct Row
+ {
+ QString guid;
+ QString path;
+ bool writable;
+ bool uncommitted;
+ };
+
+ std::vector<Row> m_rows;
+ Warp::Ref<Warp::Container> m_container;
+};
+
+class WarpContainerWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit WarpContainerWidget(Warp::Ref<Warp::Container> container, QWidget *parent = nullptr);
+
+private:
+ Warp::Ref<Warp::Container> m_container;
+
+ QTabWidget *m_tabs = nullptr;
+
+ // Sources
+ QTableView *m_sourcesView = nullptr;
+ WarpSourcesModel *m_sourcesModel = nullptr;
+ QWidget* m_sourcesPage = nullptr;
+ QTimer* m_refreshTimer = nullptr;
+
+ // Search
+ WarpSearchWidget *m_searchTab = nullptr;
+};
+
+class WarpContainersPane : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit WarpContainersPane(QWidget *parent = nullptr);
+
+ void refresh()
+ {
+ // Clear and repopulate from current container list
+ m_list->clear();
+ while (m_stack->count() > 0)
+ {
+ QWidget *w = m_stack->widget(0);
+ m_stack->removeWidget(w);
+ delete w;
+ }
+ m_containers.clear();
+ populate();
+ if (m_list->count() > 0)
+ m_list->setCurrentRow(0);
+ }
+
+private:
+ void populate()
+ {
+ // Retrieve all available containers
+ const auto all = Warp::Container::All();
+ m_containers = all; // copy vector<Ref<Container>>
+
+ for (const auto &c: m_containers)
+ {
+ const QString name = QString::fromStdString(c->GetName());
+ auto *item = new QListWidgetItem(name, m_list);
+ item->setSizeHint(QSize(item->sizeHint().width(), itemHeightPx()));
+ auto *widget = new WarpContainerWidget(c, m_stack);
+ m_stack->addWidget(widget);
+ }
+
+ // Visual style: behave like a vertical tab bar
+ // m_list->setFrameShape(QFrame::NoFrame);
+ // m_list->setSpacing(0);
+ }
+
+ static int itemHeightPx()
+ {
+ // A reasonable, readable height per entry
+ return 28;
+ }
+
+private:
+ QListWidget *m_list = nullptr;
+ QStackedWidget *m_stack = nullptr;
+ std::vector<Warp::Ref<Warp::Container> > m_containers;
+};