Update Start Menu

This commit is contained in:
daleclack 2022-01-16 15:40:15 +08:00
parent 36d43e601d
commit 4bcc68293a
15 changed files with 966 additions and 59 deletions

View File

@ -31,16 +31,21 @@ set(RESOURCE_LIST
dock.ui
start.ui
Yanni-Nightingale.mp3
dialog-error.png
folder.svg
gnome-fs-regular.svg
icons/16x16/actions/7zFM.png
icons/48x48/actions/My_GtkUI.png
icons/scalable/status/file-manager.svg
icons/scalable/status/file-manager_running.svg
icons/scalable/status/qemu-launcher.svg
icons/scalable/status/qq.svg
icons/scalable/status/qqmusic.svg
icons/scalable/status/utilities-system-monitor.svg
icons/scalable/status/baidunetdisk.svg
icons/scalable/status/visual-studio-code.svg
icons/scalable/status/glade.svg)
icons/scalable/status/glade.svg
icons/scalable/status/user-home.svg)
compile_gresources(RESOURCE_FILE
XML_OUT
@ -54,7 +59,8 @@ compile_gresources(RESOURCE_FILE
add_custom_target(resource ALL DEPENDS ${RESOURCE_FILE})
#SOURCE FILES LIST
set(SOURCES src/core/main.cpp src/core/MainWin.cpp src/core/MyDock.cpp src/core/Start.cpp)
set(SOURCES src/core/main.cpp src/core/MainWin.cpp src/core/MyDock.cpp src/core/Start.cpp
src/file_app/FileWindow.cpp)
#For win32 platform,use rc resource and .ico icon
if(WIN32)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -30,7 +30,7 @@
</object>
</child>
<child>
<object class="GtkButton">
<object class="GtkButton" id="btnfile">
<property name="focusable">1</property>
<property name="receives-default">1</property>
<property name="has-frame">0</property>

35
Flos_Gtk4/res/folder.svg Normal file
View File

@ -0,0 +1,35 @@
<svg width="64" height="64" version="1.1" viewBox="0 0 16.933 16.933" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="linearGradient1769" x1="445.28" x2="445.28" y1="179.28" y2="200.07" gradientTransform="matrix(.38956 0 0 .38184 -165.52 -63.44)" gradientUnits="userSpaceOnUse">
<stop stop-color="#60c0f0" offset="0"/>
<stop stop-color="#83d4fb" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient860" x1="8.4667" x2="8.4667" y1="293.3" y2="292.77" gradientTransform="translate(0,-280.07)" gradientUnits="userSpaceOnUse">
<stop stop-color="#008ea2" stop-opacity=".25" offset="0"/>
<stop stop-color="#fff" stop-opacity=".15" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient868" x1="8.4667" x2="8.4667" y1="294.62" y2="293.56" gradientTransform="matrix(.99998 0 0 .99998 0 -280.06)" gradientUnits="userSpaceOnUse">
<stop stop-color="#008ea2" stop-opacity=".25098" offset="0"/>
<stop stop-color="#008ea2" stop-opacity=".15" offset=".75678"/>
<stop stop-color="#fff" stop-opacity=".15" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient897" x1="6.8792" x2="6.8792" y1="285.36" y2="283.77" gradientTransform="matrix(.99998 0 0 .99998 0 -280.06)" gradientUnits="userSpaceOnUse">
<stop offset="0"/>
<stop stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient907" x1="1.0583" x2="15.875" y1="289.59" y2="289.59" gradientTransform="translate(0,-280.07)" gradientUnits="userSpaceOnUse">
<stop stop-color="#46a2d7" stop-opacity=".5" offset="0"/>
<stop stop-color="#46a2d7" stop-opacity="0" offset=".10783"/>
<stop stop-color="#46a2d7" stop-opacity=".095808" offset=".89398"/>
<stop stop-color="#46a2d7" stop-opacity=".5" offset="1"/>
</linearGradient>
</defs>
<image x=".52916" y="1.969" width="15.875" height="13.229" image-rendering="optimizeQuality" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAyCAYAAAAA9rgCAAAACXBIWXMAAA7XAAAO1wFxhj+8AAAA GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAbVJREFUaIHtml9TglAQRw9/jMrR 6a3v//2q0azMFOhhuXJLRgHv5G3dM8PgqHA57C68/BIOSbxtCLW3RUvy63MOFMAESOkvXQMlsAW+ gB2RiifevgDmwANwB2QDz7UD1sASWAEboApzmeHIaSs7Bx6Bmff9EGpgCtwjN2+B3ICSiKqdN/sC qewMaeehsjTH3CCd4UbjBXhHWv0S0gdrukpOkDYeU1kf1y3T5pwF0uJviHTVdREd5+izzilqZMxK vNFyglmznSPrkyKyGdLia2Sm+1T61BsiPXGsYwd8Ijd7TXOzc++PoWT9xSe07V0RpsJD3hwbpMOe kNEq86OHhMG1+SVm2D1TSuR1Wf2FsCN0B/Vd8xZ5GC+Ar2PzoIWMdrSSaxAG7xllwtoxYe2YsHZM WDsmrB0T1o4Ja8eEtWPC2jFh7ZiwdkxYOyasHRPWjglr52qFo48MnsneL6WNDfYJnPxHasStBGon vEWiPdFmJEfislofNJEpl82q+RkzukQAJTROdgU8I3mtKvd+WNJmm8aES2OjRLp2AbzSdG+o+HBs uLndIgXcj2qX0NiAeGx0Bta/AZSga/2YDpsuAAAAAElFTkSuQmCC "/>
<path d="m2.21 2.38h2.695c0.75074 0 0.78302 0.0285 1.5421 0.62962 0.78159 0.5904 0.94779 0.607 1.8636 0.607l6.4126-0.0524c0.638-5e-3 1.1517 0.51363 1.1517 1.1516v6.77c0 0.63802-0.51364 1.1517-1.1517 1.1517h-12.513c-0.63802 0-1.1517-0.51364-1.1517-1.1517v-7.9542c0-0.63802 0.51364-1.1517 1.1517-1.1517z" fill="#46a2d7"/>
<path d="m2.2102 2.3812c-0.63801 0-1.1518 0.51384-1.1518 1.1518v2.8167h14.816v-1.633c0-0.63801-0.51387-1.1563-1.1518-1.1513l-6.4124 0.052194c-0.91582 0-1.0818-0.016798-1.8634-0.60718-0.75908-0.6011-0.79128-0.62941-1.542-0.62941h-2.695z" fill="url(#linearGradient897)" opacity=".35" stroke-width=".26458"/>
<rect x="1.0583" y="4.49" width="14.817" height="10.054" rx="1.1517" ry="1.1288" fill="url(#linearGradient1769)"/>
<rect x="1.0583" y="12.7" width="14.817" height=".52915" fill="url(#linearGradient860)"/>
<path d="m1.0655 13.494c0.03752 0.59168 0.5312 1.0583 1.1446 1.0583h12.513c0.6134 0 1.1071-0.46664 1.1446-1.0583h-14.802z" fill="url(#linearGradient868)" stroke-width=".26458"/>
<rect x="1.0583" y="4.49" width="14.817" height="10.054" rx="1.1517" ry="1.1288" fill="url(#linearGradient907)"/>
<path d="m2.2102 4.4979c-0.63801 0-1.1518 0.50323-1.1518 1.1286v0.23512c0-0.6089 0.51384-1.0991 1.1518-1.0991h12.513c0.63801 0 1.1518 0.49024 1.1518 1.0991v-0.23512c0-0.62536-0.51384-1.1286-1.1518-1.1286z" fill="#fff" opacity=".1" stroke-width=".26458"/>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,16 @@
<svg width="64" height="64" version="1.1" viewBox="0 0 16.933 16.933" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="linearGradient984" x1="45.801" x2="9.8016" y1="9.9999" y2="61" gradientTransform="matrix(.26458 0 0 .26458 .052471 -.26458)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ededed" offset="0"/>
<stop stop-color="#fcfcfc" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient1082" x1="40" x2="46" y1="17" y2="11" gradientTransform="matrix(.26458 0 0 .26458 -.0055806 -.26458)" gradientUnits="userSpaceOnUse">
<stop stop-color="#fefefe" offset="0"/>
<stop stop-color="#e9e9e9" offset="1"/>
</linearGradient>
</defs>
<image x="1.7198" y="-.030818" width="13.493" height="17.096" image-rendering="optimizeQuality" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAABBCAYAAAB8S5zgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz AAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGiSURB VGiB7ZvRbsIwDACvEDZ42f9/6VbG2u7BMU0LCNE0nTP5pCgUEPHhIsXIaZjSzOaSDLM5mzT4BtjH UVpmiKMD+uQ6ixDnBjgAR+Ad2FFWqI/jO44LIpYlFBgzcgQ+4lw6O5qVC/AZxxn4IUNIM7NHMnIE TvG6ND0iFBi/vJYMIc1Mg9xa+pvZrRDsM3RNXV9ZLBSSx/MPLY2ud7iz7iKh8PwtxWmQOE6z518W siADKwlZkYEVhCzJQKaQNRnIELIoAwuFrMrAAiHLMvCikHUZeEGoBhl4LPRFstuuRQZuhQZks9rG eahJBqbliu66O6Qmqk4GZKcdEKELSR20xVa/BHrLvSG77h1sU7eUIP3PIhDrolpl4E5xV7OMci3s /oPMFZexistYxWWs4jJWcRmruIxVXMYqLmMVl7GKy1jFZaziMlZxGau4jFVcxiouYxWXsUoqs0rX 98ZMYg6MbRtdMmogjXfSbqKt7G283uI8QA7asd4icfcwZkZfAGnfKH0WIBe9m85I3B0w/NUpjTXQ JGiL1jAPesvzM7ncnL/5BYJedYBPZMN8AAAAAElFTkSuQmCC "/>
<path d="m9.525 0.26354-6.6145 0.001034c-0.29315 0-0.52916 0.23601-0.52916 0.52916v14.816c0 0.29315 0.23601 0.52916 0.52916 0.52916h11.112c0.29315 0 0.52916-0.23601 0.52916-0.52916v-10.319c0-0.14159-0.04797-0.32932-0.14728-0.52969h-3.8213c-0.29318 0-0.52916-0.236-0.52916-0.52916v-3.8554c-0.19958-0.087925-0.38906-0.11265-0.52916-0.11265z" fill="url(#linearGradient984)" stroke-width=".26458"/>
<image x="6.8216" y=".26458" width="7.7238" height="7.6744" image-rendering="optimizeQuality" opacity=".75" preserveAspectRatio="none" xlink:href="data:image/png;base64,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 "/>
<path d="m10.048 0.37541v3.8562c0 0.29315 0.23601 0.52918 0.52918 0.52918h3.8271c-0.086271-0.1743-0.21103-0.35779-0.3824-0.52918l-3.4395-3.4395c-0.16657-0.21078-0.35184-0.33837-0.52918-0.4165z" fill="url(#linearGradient1082)"/>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,36 @@
<svg width="64" height="64" version="1.1" viewBox="0 0 16.933 16.933" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="linearGradient897-3" x1="6.8792" x2="6.8792" y1="285.36" y2="283.77" gradientTransform="matrix(.99998 0 0 .99998 0 -280.06)" gradientUnits="userSpaceOnUse">
<stop offset="0"/>
<stop stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient1769-5" x1="445.28" x2="445.28" y1="179.28" y2="200.07" gradientTransform="matrix(.38956 0 0 .38184 -165.52 -63.44)" gradientUnits="userSpaceOnUse">
<stop stop-color="#60c0f0" offset="0"/>
<stop stop-color="#83d4fb" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient860-6" x1="8.4667" x2="8.4667" y1="293.3" y2="292.77" gradientTransform="translate(0,-280.07)" gradientUnits="userSpaceOnUse">
<stop stop-color="#008ea2" stop-opacity=".25" offset="0"/>
<stop stop-color="#fff" stop-opacity=".15" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient868-1" x1="8.4667" x2="8.4667" y1="294.62" y2="293.56" gradientTransform="matrix(.99998 0 0 .99998 0 -280.06)" gradientUnits="userSpaceOnUse">
<stop stop-color="#008ea2" stop-opacity=".25098" offset="0"/>
<stop stop-color="#008ea2" stop-opacity=".15" offset=".75678"/>
<stop stop-color="#fff" stop-opacity=".15" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient907-9" x1="1.0583" x2="15.875" y1="289.59" y2="289.59" gradientTransform="translate(0,-280.07)" gradientUnits="userSpaceOnUse">
<stop stop-color="#46a2d7" stop-opacity=".5" offset="0"/>
<stop stop-color="#46a2d7" stop-opacity="0" offset=".10783"/>
<stop stop-color="#46a2d7" stop-opacity=".095808" offset=".89398"/>
<stop stop-color="#46a2d7" stop-opacity=".5" offset="1"/>
</linearGradient>
</defs>
<image x=".52916" y="1.969" width="15.875" height="13.229" image-rendering="optimizeQuality" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAyCAYAAAAA9rgCAAAACXBIWXMAAA7XAAAO1wFxhj+8AAAA GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAbVJREFUaIHtml9TglAQRw9/jMrR 6a3v//2q0azMFOhhuXJLRgHv5G3dM8PgqHA57C68/BIOSbxtCLW3RUvy63MOFMAESOkvXQMlsAW+ gB2RiifevgDmwANwB2QDz7UD1sASWAEboApzmeHIaSs7Bx6Bmff9EGpgCtwjN2+B3ICSiKqdN/sC qewMaeehsjTH3CCd4UbjBXhHWv0S0gdrukpOkDYeU1kf1y3T5pwF0uJviHTVdREd5+izzilqZMxK vNFyglmznSPrkyKyGdLia2Sm+1T61BsiPXGsYwd8Ijd7TXOzc++PoWT9xSe07V0RpsJD3hwbpMOe kNEq86OHhMG1+SVm2D1TSuR1Wf2FsCN0B/Vd8xZ5GC+Ar2PzoIWMdrSSaxAG7xllwtoxYe2YsHZM WDsmrB0T1o4Ja8eEtWPC2jFh7ZiwdkxYOyasHRPWjglr52qFo48MnsneL6WNDfYJnPxHasStBGon vEWiPdFmJEfislofNJEpl82q+RkzukQAJTROdgU8I3mtKvd+WNJmm8aES2OjRLp2AbzSdG+o+HBs uLndIgXcj2qX0NiAeGx0Bta/AZSga/2YDpsuAAAAAElFTkSuQmCC "/>
<path d="m2.21 2.38h2.695c0.75074 0 0.78302 0.0285 1.5421 0.62962 0.78159 0.5904 0.94779 0.607 1.8636 0.607l6.4126-0.0524c0.638-5e-3 1.1517 0.51363 1.1517 1.1516v6.77c0 0.63802-0.51364 1.1517-1.1517 1.1517h-12.513c-0.63802 0-1.1517-0.51364-1.1517-1.1517v-7.9542c0-0.63802 0.51364-1.1517 1.1517-1.1517z" fill="#46a2d7"/>
<path d="m2.2102 2.3812c-0.63801 0-1.1518 0.51384-1.1518 1.1518v2.8167h14.816v-1.633c0-0.63801-0.51387-1.1563-1.1518-1.1513l-6.4124 0.052194c-0.91582 0-1.0818-0.016798-1.8634-0.60718-0.75908-0.6011-0.79128-0.62941-1.542-0.62941h-2.695z" fill="url(#linearGradient897-3)" opacity=".35" stroke-width=".26458"/>
<rect x="1.0583" y="4.49" width="14.817" height="10.054" rx="1.1517" ry="1.1288" fill="url(#linearGradient1769-5)"/>
<rect x="1.0583" y="12.7" width="14.817" height=".52915" fill="url(#linearGradient860-6)"/>
<path d="m1.0655 13.494c0.03752 0.59168 0.5312 1.0583 1.1446 1.0583h12.513c0.6134 0 1.1071-0.46664 1.1446-1.0583h-14.802z" fill="url(#linearGradient868-1)" stroke-width=".26458"/>
<rect x="1.0583" y="4.49" width="14.817" height="10.054" rx="1.1517" ry="1.1288" fill="url(#linearGradient907-9)"/>
<path d="m2.2102 4.4979c-0.63801 0-1.1518 0.50323-1.1518 1.1286v0.23512c0-0.6089 0.51384-1.0991 1.1518-1.0991h12.513c0.63801 0 1.1518 0.49024 1.1518 1.0991v-0.23512c0-0.62536-0.51384-1.1286-1.1518-1.1286z" fill="#ffffff" opacity=".1" stroke-width=".26458"/>
<path class="ColorScheme-Text" d="m8.4668 5.8371c-0.054128 0-0.10824 0.02056-0.14971 0.062032l-2.9942 2.995c-0.082949 0.082949-0.082949 0.21647 0 0.29942 0.082949 0.082949 0.21647 0.082949 0.29942 0l0.30356-0.30356v2.45c0 0.46922 0.37775 0.84698 0.84698 0.84698h3.3879c0.46922 0 0.84698-0.37775 0.84698-0.84698v-2.45l0.30356 0.30356c0.08294 0.082949 0.21647 0.082949 0.29942 0 0.08294-0.082949 0.08294-0.21647 0-0.29942l-2.9942-2.995c-0.041474-0.041474-0.095586-0.062033-0.14971-0.062033zm0 0.512 2.1174 2.1174v2.8735c0 0.23461-0.18888 0.42349-0.42349 0.42349h-0.84698v-1.2705c0-0.46923-0.37775-0.84698-0.84698-0.84698s-0.84698 0.37775-0.84698 0.84698v1.2705h-0.84698c-0.23461 0-0.42349-0.18888-0.42349-0.42349v-2.8735z" fill="currentColor" opacity=".15" stroke-width=".42349"/>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -50,7 +50,7 @@
</object>
</child>
<child>
<object class="GtkButton">
<object class="GtkButton" id="btnfile1">
<property name="visible">1</property>
<property name="focusable">1</property>
<property name="receives-default">1</property>
@ -217,7 +217,7 @@
<object class="GtkLabel">
<property name="halign">start</property>
<property name="visible">1</property>
<property name="label" translatable="1">All Programs</property>
<property name="label" translatable="1"> All Programs</property>
<property name="hexpand">1</property>
</object>
</child>
@ -294,7 +294,7 @@
</object>
</child>
<child>
<object class="GtkButton">
<object class="GtkButton" id="btnfile2">
<property name="visible">1</property>
<property name="focusable">1</property>
<property name="receives-default">1</property>
@ -483,7 +483,7 @@
<object class="GtkLabel">
<property name="halign">start</property>
<property name="visible">1</property>
<property name="label" translatable="1">Back</property>
<property name="label" translatable="1"> Back</property>
<property name="hexpand">1</property>
</object>
</child>
@ -561,7 +561,7 @@
</object>
</child>
<child>
<object class="GtkButton">
<object class="GtkButton" id="btn_computer">
<property name="visible">1</property>
<property name="focusable">1</property>
<property name="receives-default">1</property>
@ -594,7 +594,6 @@
<child>
<object class="GtkButton">
<property name="visible">1</property>
<property name="halign">center</property>
<property name="focusable">1</property>
<property name="receives-default">1</property>
<property name="has-frame">0</property>

View File

@ -18,3 +18,7 @@ box{
separator{
background-color:white;
}
button{
color:white;
}

View File

@ -8,6 +8,7 @@ struct _MainWin
GtkWidget *overlay;
GtkWidget *background;
GtkStyleProvider *provider;
GtkWidget *main_grid;
};
G_DEFINE_TYPE(MainWin, main_win, GTK_TYPE_APPLICATION_WINDOW)
@ -52,14 +53,42 @@ static void main_win_init(MainWin *win)
GMenuModel *model = G_MENU_MODEL(gtk_builder_get_object(builder, "model"));
GtkWidget *menubar = gtk_popover_menu_bar_new_from_model(model);
// gtk_button_set_child(GTK_BUTTON(back_button),menubar);
gtk_widget_set_valign(menubar, GTK_ALIGN_START);
gtk_widget_set_halign(menubar, GTK_ALIGN_FILL);
gtk_overlay_add_overlay(GTK_OVERLAY(win->overlay), menubar);
// Apply Style for menubar
// Add a grid
win->main_grid = gtk_grid_new();
// Create a "Home" Button
GtkWidget *home_button = gtk_button_new();
GtkWidget *home_image = gtk_image_new_from_icon_name("user-home");
GtkWidget *button_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
GtkWidget *button_label = gtk_label_new("dale");
gtk_image_set_pixel_size(GTK_IMAGE(home_image), 48);
gtk_box_append(GTK_BOX(button_box), home_image);
gtk_box_append(GTK_BOX(button_box), button_label);
gtk_button_set_child(GTK_BUTTON(home_button), button_box);
gtk_button_set_has_frame(GTK_BUTTON(home_button), FALSE);
gtk_widget_set_margin_top(home_button, 15);
gtk_widget_set_margin_start(home_button, 25);
g_signal_connect(home_button,"clicked",G_CALLBACK(btnhome_clicked),win);
// Attach the button to grid
gtk_grid_attach(GTK_GRID(win->main_grid), home_button, 1, 1, 1, 1);
// Add menubar and grid to the overlay
GtkWidget *desktop_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
gtk_box_append(GTK_BOX(desktop_box), menubar);
gtk_box_append(GTK_BOX(desktop_box), win->main_grid);
gtk_widget_set_valign(desktop_box, GTK_ALIGN_START);
gtk_widget_set_halign(desktop_box, GTK_ALIGN_FILL);
gtk_overlay_add_overlay(GTK_OVERLAY(win->overlay), desktop_box);
// Apply Style for menubar and the button
win->provider = GTK_STYLE_PROVIDER(gtk_css_provider_new());
gtk_css_provider_load_from_resource(GTK_CSS_PROVIDER(win->provider), "/org/gtk/daleclack/style.css");
gtk_style_context_add_provider(gtk_widget_get_style_context(menubar), win->provider, G_MAXINT);
gtk_style_context_add_provider(gtk_widget_get_style_context(home_button), win->provider, G_MAXINT);
// Add Label for time
GtkWidget *time_label = gtk_label_new("12:21 2022/1/9");
@ -75,7 +104,7 @@ static void main_win_init(MainWin *win)
gtk_widget_set_margin_top(time_label, 3);
gtk_overlay_add_overlay(GTK_OVERLAY(win->overlay), time_label);
//Add a dock
// Add a dock
add_dock(win);
// Add widgets
@ -90,13 +119,14 @@ MainWin *main_win_new(GtkApplication *app)
return (MainWin *)g_object_new(main_win_get_type(), "application", app, NULL);
}
GtkOverlay *main_win_get_overlay(MainWin * win){
//Get the Overlay of the window
GtkOverlay *main_win_get_overlay(MainWin *win)
{
// Get the Overlay of the window
return GTK_OVERLAY(win->overlay);
}
GtkStyleProvider *main_win_get_style(MainWin * win){
//Get Style Provider
GtkStyleProvider *main_win_get_style(MainWin *win)
{
// Get Style Provider
return win->provider;
}

View File

@ -1,5 +1,59 @@
#include "MyDock.h"
#include "Start.h"
#include "src/file_app/FileWindow.h"
static FileWindow * main_window = NULL;
static GtkWidget * btnfile;
static gboolean file_app_running = FALSE;
static gboolean file_window_closed(GtkWindow * self, GtkButton * dock_file){
GtkWidget * child = gtk_button_get_child(dock_file);
gtk_image_set_from_icon_name(GTK_IMAGE(child),"file-manager");
file_app_running = FALSE;
gtk_window_destroy(self);
}
static void file_window_ctrl(FileWindow * window, GtkWindow * parent){
GdkSurface * surface = gtk_native_get_surface(GTK_NATIVE(window));
if(surface){
GdkToplevelState state = gdk_toplevel_get_state(GDK_TOPLEVEL(surface));
switch(state){
case GDK_TOPLEVEL_STATE_MINIMIZED:
gtk_window_set_transient_for(GTK_WINDOW(window),parent);
gtk_window_unminimize(GTK_WINDOW(window));
break;
default:
gtk_window_set_transient_for(GTK_WINDOW(window),NULL);
gtk_window_minimize(GTK_WINDOW(window));
}
}
}
void btnfile_clicked(GtkButton * button, GtkWindow * parent){
//If the file app is not running, create a window
GtkWidget * child = gtk_button_get_child(GTK_BUTTON(btnfile));
const char * icon_name = gtk_image_get_icon_name(GTK_IMAGE(child));
if(!file_app_running){
//Create the window
main_window = file_window_new(parent);
gtk_image_set_from_icon_name(GTK_IMAGE(child),"file-manager_running");
//Link Signals
g_signal_connect(main_window,"close-request",G_CALLBACK(file_window_closed),btnfile);
//Show the window
file_app_running = TRUE;
gtk_window_present(GTK_WINDOW(main_window));
}else{
file_window_ctrl(main_window,parent);
}
}
void btnhome_clicked(GtkButton * button, GtkWindow * parent){
btnfile_clicked(button,parent);
home_clicked(NULL,main_window);
}
void add_dock(MainWin * win){
GtkWidget * dock_box, * main_box;
@ -24,6 +78,11 @@ void add_dock(MainWin * win){
GtkWidget * space = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_box_append(GTK_BOX(main_box),space);
//Get the file button
btnfile = (GtkWidget*)gtk_builder_get_object(builder,"btnfile");
g_signal_connect(btnfile,"clicked",G_CALLBACK(btnfile_clicked),win);
//Set Style
gtk_style_context_add_provider(gtk_widget_get_style_context(dock_box),
main_win_get_style(win), G_MAXINT);

View File

@ -3,4 +3,10 @@
#include <gtk/gtk.h>
#include "MainWin.h"
//Add the dock
void add_dock(MainWin * win);
void btnfile_clicked(GtkButton * button, GtkWindow * parent);
//For "Home" Button
void btnhome_clicked(GtkButton * button, GtkWindow * parent);

View File

@ -1,61 +1,87 @@
#include "Start.h"
#include "MyDock.h"
static void btnprogram_clicked(GtkWidget * widget, GtkStack * stack){
gtk_stack_set_visible_child_name(stack,"page1");
static void btnprogram_clicked(GtkWidget *widget, GtkStack *stack)
{
gtk_stack_set_visible_child_name(stack, "page1");
}
static void btnback_clicked(GtkWidget * widget, GtkStack * stack){
gtk_stack_set_visible_child_name(stack,"page0");
static void btnback_clicked(GtkWidget *widget, GtkStack *stack)
{
gtk_stack_set_visible_child_name(stack, "page0");
}
static void btnmusic_clicked(GtkWidget * widget, GtkWidget * music_box){
if(gtk_widget_get_visible(music_box)){
gtk_widget_set_visible(music_box,FALSE);
}else{
gtk_widget_set_visible(music_box,TRUE);
static void btnmusic_clicked(GtkWidget *widget, GtkWidget *music_box)
{
if (gtk_widget_get_visible(music_box))
{
gtk_widget_set_visible(music_box, FALSE);
}
else
{
gtk_widget_set_visible(music_box, TRUE);
}
}
void add_start(MainWin * win, GtkBox * box){
//Create a builder for menu
GtkBuilder * startbuilder = gtk_builder_new_from_resource("/org/gtk/daleclack/start.ui");
static void start_file_clicked(GtkWidget * widget, GtkWindow * parent){
}
//Get Widgets
GtkWidget * menu_btn = (GtkWidget*)gtk_builder_get_object(startbuilder,"menu_btn");
GtkWidget * label = gtk_label_new(" ");
void add_start(MainWin *win, GtkBox *box)
{
// Create a builder for menu
GtkBuilder *startbuilder = gtk_builder_new_from_resource("/org/gtk/daleclack/start.ui");
//Stack Change effect
GtkWidget * stack_program, * btn_program, * btn_back;
stack_program = (GtkWidget*)gtk_builder_get_object(startbuilder,"stack_program");
btn_program = (GtkWidget*)gtk_builder_get_object(startbuilder,"btn_program");
btn_back = (GtkWidget*)gtk_builder_get_object(startbuilder,"btn_back");
g_signal_connect(btn_program,"clicked",G_CALLBACK(btnprogram_clicked),stack_program);
g_signal_connect(btn_back,"clicked",G_CALLBACK(btnback_clicked),stack_program);
// Get Widgets
GtkWidget *menu_btn = (GtkWidget *)gtk_builder_get_object(startbuilder, "menu_btn");
GtkWidget *label = gtk_label_new(" ");
//Enable Shutdown(Close)
GtkWidget * btnshut = (GtkWidget*)gtk_builder_get_object(startbuilder,"btnshut");
g_signal_connect_swapped(btnshut,"clicked",G_CALLBACK(gtk_window_destroy),win);
// Stack Change effect
GtkWidget *stack_program, *btn_program, *btn_back;
stack_program = (GtkWidget *)gtk_builder_get_object(startbuilder, "stack_program");
btn_program = (GtkWidget *)gtk_builder_get_object(startbuilder, "btn_program");
btn_back = (GtkWidget *)gtk_builder_get_object(startbuilder, "btn_back");
g_signal_connect(btn_program, "clicked", G_CALLBACK(btnprogram_clicked), stack_program);
g_signal_connect(btn_back, "clicked", G_CALLBACK(btnback_clicked), stack_program);
//Add Style for separator
GtkWidget * prim_separator, * ext_separator;
prim_separator = (GtkWidget*)gtk_builder_get_object(startbuilder,"prim_separator");
ext_separator = (GtkWidget*)gtk_builder_get_object(startbuilder,"ext_separator");
// Enable Shutdown(Close)
GtkWidget *btnshut = (GtkWidget *)gtk_builder_get_object(startbuilder, "btnshut");
g_signal_connect_swapped(btnshut, "clicked", G_CALLBACK(gtk_window_destroy), win);
// Add Style for separator
GtkWidget *prim_separator, *ext_separator;
prim_separator = (GtkWidget *)gtk_builder_get_object(startbuilder, "prim_separator");
ext_separator = (GtkWidget *)gtk_builder_get_object(startbuilder, "ext_separator");
gtk_style_context_add_provider(gtk_widget_get_style_context(prim_separator),
main_win_get_style(win), G_MAXINT);
gtk_style_context_add_provider(gtk_widget_get_style_context(ext_separator),
main_win_get_style(win), G_MAXINT);
//Integrated Media Player
GtkWidget * music_box = (GtkWidget*)gtk_builder_get_object(startbuilder,"music_box");
GtkWidget * btn_music = (GtkWidget*)gtk_builder_get_object(startbuilder,"btnmusic");
GtkWidget * media_control = (GtkWidget*)gtk_builder_get_object(startbuilder,"media_ctrl");
g_signal_connect(btn_music,"clicked",G_CALLBACK(btnmusic_clicked),music_box);
// Integrated Media Player
GtkWidget *music_box = (GtkWidget *)gtk_builder_get_object(startbuilder, "music_box");
GtkWidget *btn_music = (GtkWidget *)gtk_builder_get_object(startbuilder, "btnmusic");
GtkWidget *media_control = (GtkWidget *)gtk_builder_get_object(startbuilder, "media_ctrl");
g_signal_connect(btn_music, "clicked", G_CALLBACK(btnmusic_clicked), music_box);
//Add music resource
GtkMediaStream * media = gtk_media_file_new_for_resource("/org/gtk/daleclack/Yanni-Nightingale.mp3");
gtk_media_controls_set_media_stream(GTK_MEDIA_CONTROLS(media_control),media);
// Add music resource
GtkMediaStream *media = gtk_media_file_new_for_resource("/org/gtk/daleclack/Yanni-Nightingale.mp3");
gtk_media_controls_set_media_stream(GTK_MEDIA_CONTROLS(media_control), media);
//Pack widgets
gtk_box_prepend(box,menu_btn);
gtk_box_prepend(box,label);
// Get Button for file manager
GtkWidget *btnfile1, *btnfile2;
btnfile1 = (GtkWidget *)gtk_builder_get_object(startbuilder, "btnfile1");
btnfile2 = (GtkWidget *)gtk_builder_get_object(startbuilder, "btnfile2");
g_signal_connect(btnfile1, "clicked", G_CALLBACK(btnfile_clicked), win);
g_signal_connect(btnfile2, "clicked", G_CALLBACK(btnfile_clicked), win);
//Buttons for control panel
GtkWidget * user_button, * btn_computer;
user_button = (GtkWidget*)gtk_builder_get_object(startbuilder,"user_button");
btn_computer = (GtkWidget*)gtk_builder_get_object(startbuilder,"btn_computer");
g_signal_connect(user_button, "clicked", G_CALLBACK(btnhome_clicked), win);
g_signal_connect(btn_computer, "clicked", G_CALLBACK(btnfile_clicked), win);
// Pack widgets
gtk_box_prepend(box, menu_btn);
gtk_box_prepend(box, label);
}

View File

@ -0,0 +1,547 @@
#include "FileWindow.h"
#define FOLDER_NAME "/org/gtk/daleclack/folder.svg"
#define FILE_NAME "/org/gtk/daleclack/gnome-fs-regular.svg"
#define ERROR_IMAGE "/org/gtk/daleclack/dialog-error.png"
//IconView and TreeView Model
enum{
COL_PATH,
COL_DISPLAY_NAME,
COL_PIXBUF,
COL_IS_DIRECTORY,
NUM_COLS
};
typedef enum _ViewMode{
MODE_ICON,
MODE_LIST
}ViewMode;
struct _FileWindow{
GtkWindow parent;
GdkPixbuf *file_pixbuf, *folder_pixbuf;
char *parent_dir;
GtkWidget *up_button;
GtkWidget *stack, *show_hidden, *view_button, *tree_view, *icon_view, *btn_image;
GtkListStore *store;
GtkTreeSelection *selection;
GList *selected_items;
ViewMode view_mode;
};
G_DEFINE_TYPE(FileWindow,file_window,GTK_TYPE_WINDOW)
static void file_window_load_pixbufs(int size,FileWindow *win){
GdkPixbuf *tmp1,*tmp2;
if(win->file_pixbuf){ //Already loaded
return ;
}
tmp1=gdk_pixbuf_new_from_resource(FILE_NAME,NULL);
win->file_pixbuf=gdk_pixbuf_scale_simple(tmp1,size,size,GDK_INTERP_BILINEAR);
//Check load state
g_assert(win->file_pixbuf);
g_object_unref(tmp1);
tmp2=gdk_pixbuf_new_from_resource(FOLDER_NAME,NULL);
win->folder_pixbuf=gdk_pixbuf_scale_simple(tmp2,size,size,GDK_INTERP_BILINEAR);
g_assert(win->folder_pixbuf);
g_object_unref(tmp2);
}
static void file_window_fill_store(FileWindow *win){
GDir * dir;
const gchar *name;
GtkTreeIter iter;
//Clear the store
gtk_list_store_clear(win->store);
//Go through the directory and get information
dir=g_dir_open(win->parent_dir,0,NULL);
if(!dir){
return;
}
/* Ignore the files start with '.' when the button is not toggled */
name=g_dir_read_name(dir);
while(name!=NULL){
gchar *path, *display_name;
gboolean is_dir;
if(name[0]=='.' && !gtk_check_button_get_active(GTK_CHECK_BUTTON(win->show_hidden))){
name=g_dir_read_name(dir);
continue;
}
path = g_build_filename(win->parent_dir, name, NULL);
is_dir = g_file_test(path, G_FILE_TEST_IS_DIR);
display_name = g_filename_to_utf8(name, -1, NULL, NULL, NULL);
gtk_list_store_append(win->store, &iter);
gtk_list_store_set(win->store, &iter,
COL_PATH, path,
COL_DISPLAY_NAME, display_name,
COL_IS_DIRECTORY, is_dir,
COL_PIXBUF, is_dir ? win->folder_pixbuf : win->file_pixbuf,
-1);
g_free (path);
g_free (display_name);
name=g_dir_read_name(dir);
}
g_dir_close(dir);
}
static int sort_func(GtkTreeModel *model,
GtkTreeIter *a,
GtkTreeIter *b,
gpointer user_data)
{
gboolean is_dir_a,is_dir_b;
gchar *name_a,*name_b;
int ret;
//Sort Folders before files,
//and sort files and folders starts with a '.' in front of other files and folders
gtk_tree_model_get(model,a,COL_IS_DIRECTORY,&is_dir_a,COL_DISPLAY_NAME,&name_a,-1);
gtk_tree_model_get(model,b,COL_IS_DIRECTORY,&is_dir_b,COL_DISPLAY_NAME,&name_b,-1);
if(!is_dir_a && is_dir_b){
ret = 1;
}else if(is_dir_a && !is_dir_b){
ret = -1;
}else if(name_a[0]!='.' && name_b[0]=='.'){
ret = 1;
}else if(name_a[0]=='.' && name_b[0]!='.'){
ret = -1;
}else{
ret = g_utf8_collate(name_a,name_b);
}
g_free(name_a);
g_free(name_b);
return ret;
}
static GtkListStore* create_store(void){
GtkListStore *store;
store=gtk_list_store_new(NUM_COLS,
G_TYPE_STRING,
G_TYPE_STRING,
GDK_TYPE_PIXBUF,
G_TYPE_BOOLEAN);
gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store),
sort_func,NULL,NULL);
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store),
GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
GTK_SORT_ASCENDING);
return store;
}
static void row_activated(GtkTreeView *view,GtkTreePath *tree_path,GtkTreeViewColumn *column,FileWindow *win){
gchar *path;
GtkTreeIter iter;
gboolean is_dir;
gtk_tree_model_get_iter(GTK_TREE_MODEL(win->store),&iter,tree_path);
gtk_tree_model_get(GTK_TREE_MODEL(win->store),&iter,COL_PATH,&path,COL_IS_DIRECTORY,&is_dir,-1);
if(!is_dir)
{
g_free(path);
return;
}
/* Replace parent with path and re-fill the model*/
g_free(win->parent_dir);
win->parent_dir = path;
file_window_fill_store(win);
/* Sensitize the up button */
gtk_widget_set_sensitive(GTK_WIDGET(win->up_button),TRUE);
}
static void item_activated(GtkIconView *view,GtkTreePath *tree_path,FileWindow *win){
gchar *path;
GtkTreeIter iter;
gboolean is_dir;
gtk_tree_model_get_iter(GTK_TREE_MODEL(win->store),&iter,tree_path);
gtk_tree_model_get(GTK_TREE_MODEL(win->store),&iter,COL_PATH,&path,COL_IS_DIRECTORY,&is_dir,-1);
if(!is_dir)
{
g_free(path);
return;
}
/* Replace parent with path and re-fill the model*/
g_free(win->parent_dir);
win->parent_dir = path;
file_window_fill_store(win);
/* Sensitize the up button */
gtk_widget_set_sensitive(GTK_WIDGET(win->up_button),TRUE);
}
static void up_clicked(GtkWidget *item,FileWindow *win){
gchar *dir_name;
dir_name = g_path_get_dirname(win->parent_dir);
g_free(win->parent_dir);
win->parent_dir = dir_name;
file_window_fill_store(win);
//Set Up button to sensitive
gtk_widget_set_sensitive(GTK_WIDGET(win->up_button),TRUE);
}
void home_clicked(GtkWidget *item,FileWindow *win){
g_free(win->parent_dir);
win->parent_dir = g_strdup(g_get_home_dir());
file_window_fill_store(win);
//Set Up button to sensitive
gtk_widget_set_sensitive(GTK_WIDGET(win->up_button),TRUE);
}
static void btnview_clicked(GtkButton *widget,FileWindow *win){
if(win->view_mode == MODE_ICON){
gtk_image_set_from_icon_name(GTK_IMAGE(win->btn_image),"view-list-symbolic");
gtk_stack_set_visible_child_name(GTK_STACK(win->stack),"List_view");
win->view_mode = MODE_LIST;
}else{
gtk_image_set_from_icon_name(GTK_IMAGE(win->btn_image),"view-grid-symbolic");
gtk_stack_set_visible_child_name(GTK_STACK(win->stack),"Icon_view");
win->view_mode = MODE_ICON;
}
}
static void make_directory(GtkWidget *widget,int response,GtkEntry *entry){
//Make a new directory
if(response == GTK_RESPONSE_OK){
FileWindow *win=FILE_WINDOW(gtk_window_get_transient_for(GTK_WINDOW(widget)));
const char *folder=gtk_editable_get_text(GTK_EDITABLE(entry));
char *path, *parent_path;
parent_path=win->parent_dir;
if(strlen(parent_path) == 1 && parent_path[0] == '/'){
path=g_strdup_printf("%s%s",parent_path,folder);
}else{
path=g_strdup_printf("%s/%s",parent_path,folder);
}
if(g_mkdir_with_parents(path,0755) == -1){
g_print("Error Occured!");
}else{
file_window_fill_store(win);
}
g_free(path);
}
gtk_window_destroy(GTK_WINDOW(widget));
}
static void btnnew_clicked(GtkWidget *item,GtkWindow *parent){
//Create Dialog
GtkWidget *dialog, *content_area, *entry;
dialog = gtk_dialog_new_with_buttons("Create a folder",parent,
GTK_DIALOG_USE_HEADER_BAR,"New",GTK_RESPONSE_OK,"Cancel",GTK_RESPONSE_CANCEL,NULL);
gtk_dialog_set_default_response(GTK_DIALOG(dialog),GTK_RESPONSE_OK);
//Add entry
content_area=gtk_dialog_get_content_area(GTK_DIALOG(dialog));
entry=gtk_entry_new();
gtk_entry_set_activates_default(GTK_ENTRY(entry),TRUE);
gtk_widget_set_valign(entry,GTK_ALIGN_CENTER);
gtk_widget_set_hexpand(entry,TRUE);
gtk_widget_set_vexpand(content_area,TRUE);
gtk_box_append(GTK_BOX(content_area),entry);
g_signal_connect(dialog,"response",G_CALLBACK(make_directory),entry);
gtk_widget_show(dialog);
}
static GtkWidget * create_list_view(FileWindow *win){
GtkWidget * tree_view;
GtkCellRenderer *icon_render,*text_render;
GtkTreeViewColumn *column;
tree_view=gtk_tree_view_new_with_model(GTK_TREE_MODEL(win->store));
//gtk_icon_view_set_selection_mode(GTK_ICON_VIEW(tree_view),GTK_SELECTION_MULTIPLE);
/* We now set which model columns that correspond to the text
* and pixbuf of each item
*/
icon_render=gtk_cell_renderer_pixbuf_new();
text_render=gtk_cell_renderer_text_new();
column=gtk_tree_view_column_new_with_attributes("",icon_render,"pixbuf",COL_PIXBUF,NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view),column);
column=gtk_tree_view_column_new_with_attributes("Name",text_render,"text",COL_DISPLAY_NAME,NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view),column);
/* Connect to the "item-activated" signal */
g_signal_connect(tree_view, "row-activated",
G_CALLBACK (row_activated), win);
return tree_view;
}
static GtkWidget * create_icon_view(FileWindow *win){
GtkWidget *icon_view;
icon_view=gtk_icon_view_new_with_model(GTK_TREE_MODEL(win->store));
gtk_icon_view_set_selection_mode(GTK_ICON_VIEW(icon_view),GTK_SELECTION_MULTIPLE);
/* We now set which model columns that correspond to the text
* and pixbuf of each item
*/
gtk_icon_view_set_text_column(GTK_ICON_VIEW(icon_view),COL_DISPLAY_NAME);
gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(icon_view),COL_PIXBUF);
/* Connect to the "item-activated" signal */
g_signal_connect(icon_view, "item-activated",
G_CALLBACK (item_activated), win);
return icon_view;
}
static void create_view_button(FileWindow * win){
win->view_button=gtk_button_new();
win->btn_image=gtk_image_new_from_icon_name("view-grid-symbolic");
gtk_button_set_has_frame(GTK_BUTTON(win->view_button),FALSE);
gtk_button_set_child(GTK_BUTTON(win->view_button),win->btn_image);
}
static GtkWidget * create_delete_dialog(FileWindow *win,const char *msg){
//Message Dialog
GtkWidget *dialog, *hbox, *content_area, *label, *error_image, *label1, *vbox;
char * msg_str=g_strdup_printf("Delete Failed:%s",msg);
if(!msg){
return NULL;
}
dialog = gtk_dialog_new_with_buttons("File",GTK_WINDOW(win),GTK_DIALOG_DESTROY_WITH_PARENT,
"OK",GTK_RESPONSE_OK,NULL);
gtk_window_set_default_size(GTK_WINDOW(dialog),300,150);
gtk_window_set_icon_name(GTK_WINDOW(dialog),"org.gtk.daleclack");
gtk_window_set_title(GTK_WINDOW(dialog),"Error");
//Child Widgets
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,5);
hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
label1 = gtk_label_new(" ");
gtk_box_append(GTK_BOX(vbox),label1);
error_image = gtk_image_new_from_resource(ERROR_IMAGE);
gtk_image_set_pixel_size(GTK_IMAGE(error_image),48);
gtk_widget_set_hexpand(error_image,TRUE);
gtk_box_append(GTK_BOX(hbox),error_image);
label = gtk_label_new(msg_str);
gtk_widget_set_hexpand(label,TRUE);
gtk_box_append(GTK_BOX(hbox),label);
gtk_widget_set_valign(hbox,GTK_ALIGN_CENTER);
gtk_widget_set_halign(hbox,GTK_ALIGN_CENTER);
gtk_box_append(GTK_BOX(vbox),hbox);
gtk_box_append(GTK_BOX(content_area),vbox);
gtk_widget_set_hexpand(content_area,TRUE);
gtk_widget_set_vexpand(content_area,TRUE);
g_signal_connect_swapped(dialog,"response",G_CALLBACK(gtk_window_destroy),dialog);
g_free(msg_str);
return dialog;
}
static GtkWidget * create_menubtn(FileWindow *win){
//Create Button and item for toolbar
GtkWidget *menubtn, *popover, *vbox, *btnexit, *label_exit;
menubtn = gtk_menu_button_new();
gtk_menu_button_set_has_frame(GTK_MENU_BUTTON(menubtn),FALSE);
//Create Menu
popover = gtk_popover_new();
gtk_popover_set_has_arrow(GTK_POPOVER(popover),FALSE);
gtk_menu_button_set_popover(GTK_MENU_BUTTON(menubtn),popover);
//CheckButton for show hidden dir and files
win->show_hidden = gtk_check_button_new_with_label("Show Hidden Files");
gtk_check_button_set_active(GTK_CHECK_BUTTON(win->show_hidden),FALSE);
//"Exit" Button
btnexit = gtk_button_new();
label_exit = gtk_label_new("Exit");
gtk_button_set_has_frame(GTK_BUTTON(btnexit),FALSE);
gtk_widget_set_halign(label_exit,GTK_ALIGN_START);
gtk_button_set_child(GTK_BUTTON(btnexit),label_exit);
g_signal_connect_swapped(btnexit,"clicked",G_CALLBACK(gtk_window_close),win);
//Add Widgets to popover
vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL,5);
gtk_box_append(GTK_BOX(vbox),win->show_hidden);
gtk_box_append(GTK_BOX(vbox),btnexit);
gtk_popover_set_child(GTK_POPOVER(popover),vbox);
gtk_popover_set_autohide(GTK_POPOVER(popover),TRUE);
return menubtn;
}
static void btndel_clicked(GtkWidget *item,FileWindow *win){
GtkTreeIter iter;
char * select_name = NULL;
GtkWidget *dialog=NULL;
switch(win->view_mode){
case MODE_ICON: //Iconfied Mode
GList *list,*header;
//Get Selected items
list = gtk_icon_view_get_selected_items(GTK_ICON_VIEW(win->icon_view));
header=list;
while(list!=NULL){
GtkTreePath *path = (GtkTreePath*)(list->data);
//Get Iter and show dialog
if(gtk_tree_model_get_iter(GTK_TREE_MODEL(win->store),&iter,path)){
gtk_tree_model_get(GTK_TREE_MODEL(win->store),&iter,COL_DISPLAY_NAME,&select_name,-1);
dialog = create_delete_dialog(win,select_name);
}
list=list->next;
}
g_list_free_full(header, (GDestroyNotify) gtk_tree_path_free);
break;
case MODE_LIST: //Listed Mode
GtkTreeModel * model = gtk_tree_view_get_model(GTK_TREE_VIEW(win->tree_view));
//Get Selected items
if(gtk_tree_selection_get_selected(win->selection,&model,&iter)){
gtk_tree_model_get(model,&iter,COL_DISPLAY_NAME,&select_name,-1);
}
//g_object_unref(model);
dialog = create_delete_dialog(win,select_name);
break;
}
if(dialog){
gtk_widget_show(dialog);
}
g_free(select_name);
}
static void file_window_init(FileWindow *window){
GtkWidget *sw,*vbox,*btnbox,*view_bar;
GtkWidget *home_button,*new_button,*delete_button,*view_item;
//Initalize window
gtk_window_set_default_size(GTK_WINDOW(window),650,400);
gtk_window_set_icon_name(GTK_WINDOW(window),"org.gtk.daleclack");
gtk_window_set_title(GTK_WINDOW(window),"File Manager");
file_window_load_pixbufs(48,window);
//Create child widgets
vbox=gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
btnbox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0);
gtk_box_append(GTK_BOX(vbox),btnbox);
gtk_window_set_child(GTK_WINDOW(window),vbox);
//"Up" Button
window->up_button=gtk_button_new();
gtk_button_set_icon_name(GTK_BUTTON(window->up_button),"go-up");
gtk_box_append(GTK_BOX(btnbox),window->up_button);
//"Home" Button
home_button = gtk_button_new();
gtk_button_set_icon_name(GTK_BUTTON(home_button),"go-home");
gtk_box_append(GTK_BOX(btnbox),home_button);
//"New Folder" Button
new_button = gtk_button_new();
gtk_button_set_icon_name(GTK_BUTTON(new_button),"folder-new");
gtk_box_append(GTK_BOX(btnbox),new_button);
//"Delete" Button
delete_button = gtk_button_new();
gtk_button_set_icon_name(GTK_BUTTON(delete_button),"edit-delete");
gtk_box_append(GTK_BOX(btnbox),delete_button);
//Separtor
GtkWidget * label = gtk_label_new(" ");
gtk_widget_set_hexpand(label,TRUE);
gtk_box_append(GTK_BOX(btnbox),label);
//"View Mode" Button
window->view_mode = MODE_ICON;
create_view_button(window);
gtk_box_append(GTK_BOX(btnbox),window->view_button);
//Menu Button
GtkWidget *menubtn = create_menubtn(window);
gtk_box_append(GTK_BOX(btnbox),menubtn);
//Folder Container
sw = gtk_scrolled_window_new();
gtk_scrolled_window_set_has_frame(GTK_SCROLLED_WINDOW(sw),TRUE);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (sw),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
gtk_box_append(GTK_BOX(vbox),sw);
window->stack=gtk_stack_new();
gtk_widget_set_vexpand(window->stack,TRUE);
//Create Store and fill it
window->parent_dir=g_strdup("/");
window->store=create_store();
file_window_fill_store(window);
window->tree_view=create_list_view(window);
window->icon_view=create_icon_view(window);
gtk_stack_add_named(GTK_STACK(window->stack),window->icon_view,"Icon_view");
gtk_stack_add_named(GTK_STACK(window->stack),window->tree_view,"List_view");
g_object_unref(window->store);
window->selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(window->tree_view));
/* Connect to the "clicked" signal of the "Up" tool button */
g_signal_connect(window->up_button, "clicked",
G_CALLBACK (up_clicked), window);
/* Connect to the "clicked" signal of the "Home" tool button */
g_signal_connect(home_button, "clicked",
G_CALLBACK (home_clicked), window);
/* Connect to the "changed" signal of the "View Mode" Button */
g_signal_connect(window->view_button, "clicked",
G_CALLBACK (btnview_clicked), window);
/* Connect to the "clicked" signal of the "Show hidden files" tool button */
g_signal_connect_swapped(window->show_hidden, "toggled",
G_CALLBACK (file_window_fill_store), window);
/* Connect to the "clicked" signal of the "New Directory" tool button */
g_signal_connect(new_button, "clicked",
G_CALLBACK (btnnew_clicked), window);
/* Connect to the "clicked" signal of the "Delete" tool button */
g_signal_connect(delete_button, "clicked",
G_CALLBACK (btndel_clicked), window);
gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw),window->stack);
}
static void file_window_class_init(FileWindowClass *win_class){
}
FileWindow * file_window_new(GtkWindow * parent){
return (FileWindow*)g_object_new(file_window_get_type(),"transient-for",parent,NULL);
}

View File

@ -0,0 +1,9 @@
#pragma once
#include <gtk/gtk.h>
G_DECLARE_FINAL_TYPE(FileWindow,file_window,FILE,WINDOW,GtkWindow)
FileWindow * file_window_new(GtkWindow * parent);
void home_clicked(GtkWidget * item,FileWindow * win);